1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.systemui.statusbar.phone; 16 17 import static junit.framework.Assert.assertEquals; 18 import static junit.framework.Assert.assertTrue; 19 20 import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_ICON; 21 import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_MOBILE; 22 import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI; 23 import static org.mockito.ArgumentMatchers.eq; 24 import static org.mockito.Mockito.mock; 25 import static org.mockito.Mockito.verify; 26 27 import android.graphics.Rect; 28 import android.support.test.filters.SmallTest; 29 import android.testing.AndroidTestingRunner; 30 import android.testing.TestableLooper.RunWithLooper; 31 import android.view.ViewGroup; 32 import android.widget.LinearLayout; 33 34 import com.android.internal.statusbar.StatusBarIcon; 35 import com.android.systemui.statusbar.StatusIconDisplayable; 36 import com.android.systemui.statusbar.StatusBarIconView; 37 import com.android.systemui.statusbar.StatusBarMobileView; 38 import com.android.systemui.statusbar.StatusBarWifiView; 39 import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager; 40 import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager; 41 import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState; 42 import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState; 43 import com.android.systemui.statusbar.policy.DarkIconDispatcher; 44 import com.android.systemui.utils.leaks.LeakCheckedTest; 45 46 import org.junit.Before; 47 import org.junit.Test; 48 import org.junit.runner.RunWith; 49 50 @RunWith(AndroidTestingRunner.class) 51 @RunWithLooper 52 @SmallTest 53 public class StatusBarIconControllerTest extends LeakCheckedTest { 54 55 @Before 56 public void setup() { 57 injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES); 58 mDependency.injectMockDependency(DarkIconDispatcher.class); 59 } 60 61 @Test 62 public void testSetCalledOnAdd_IconManager() { 63 LinearLayout layout = new LinearLayout(mContext); 64 TestIconManager manager = new TestIconManager(layout); 65 testCallOnAdd_forManager(manager); 66 } 67 68 @Test 69 public void testSetCalledOnAdd_DarkIconManager() { 70 LinearLayout layout = new LinearLayout(mContext); 71 TestDarkIconManager manager = new TestDarkIconManager(layout); 72 testCallOnAdd_forManager(manager); 73 } 74 75 76 private <T extends IconManager & TestableIconManager> void testCallOnAdd_forManager(T manager) { 77 StatusBarIconHolder holder = holderForType(TYPE_ICON); 78 manager.onIconAdded(0, "test_slot", false, holder); 79 assertTrue("Expected StatusBarIconView", 80 (manager.getViewAt(0) instanceof StatusBarIconView)); 81 82 holder = holderForType(TYPE_WIFI); 83 manager.onIconAdded(1, "test_wifi", false, holder); 84 assertTrue(manager.getViewAt(1) instanceof StatusBarWifiView); 85 86 holder = holderForType(TYPE_MOBILE); 87 manager.onIconAdded(2, "test_mobile", false, holder); 88 assertTrue(manager.getViewAt(2) instanceof StatusBarMobileView); 89 } 90 91 private StatusBarIconHolder holderForType(int type) { 92 switch (type) { 93 case TYPE_MOBILE: 94 return StatusBarIconHolder.fromMobileIconState(mock(MobileIconState.class)); 95 96 case TYPE_WIFI: 97 return StatusBarIconHolder.fromWifiIconState(mock(WifiIconState.class)); 98 99 case TYPE_ICON: 100 default: 101 return StatusBarIconHolder.fromIcon(mock(StatusBarIcon.class)); 102 } 103 } 104 105 private static class TestDarkIconManager extends DarkIconManager 106 implements TestableIconManager { 107 108 public TestDarkIconManager(LinearLayout group) { 109 super(group); 110 } 111 112 @Override 113 public StatusIconDisplayable getViewAt(int index) { 114 return (StatusIconDisplayable) mGroup.getChildAt(index); 115 } 116 117 @Override 118 protected StatusBarIconView addIcon(int index, String slot, boolean blocked, 119 StatusBarIcon icon) { 120 StatusBarIconView mock = mock(StatusBarIconView.class); 121 mGroup.addView(mock, index); 122 123 return mock; 124 } 125 126 @Override 127 protected StatusBarWifiView addSignalIcon(int index, String slot, WifiIconState state) { 128 StatusBarWifiView mock = mock(StatusBarWifiView.class); 129 mGroup.addView(mock, index); 130 return mock; 131 } 132 133 @Override 134 protected StatusBarMobileView addMobileIcon(int index, String slot, MobileIconState state) { 135 StatusBarMobileView mock = mock(StatusBarMobileView.class); 136 mGroup.addView(mock, index); 137 138 return mock; 139 } 140 } 141 142 private static class TestIconManager extends IconManager implements TestableIconManager { 143 public TestIconManager(ViewGroup group) { 144 super(group); 145 } 146 147 @Override 148 public StatusIconDisplayable getViewAt(int index) { 149 return (StatusIconDisplayable) mGroup.getChildAt(index); 150 } 151 152 @Override 153 protected StatusBarIconView addIcon(int index, String slot, boolean blocked, 154 StatusBarIcon icon) { 155 StatusBarIconView mock = mock(StatusBarIconView.class); 156 mGroup.addView(mock, index); 157 158 return mock; 159 } 160 161 @Override 162 protected StatusBarWifiView addSignalIcon(int index, String slot, WifiIconState state) { 163 StatusBarWifiView mock = mock(StatusBarWifiView.class); 164 mGroup.addView(mock, index); 165 return mock; 166 } 167 168 @Override 169 protected StatusBarMobileView addMobileIcon(int index, String slot, MobileIconState state) { 170 StatusBarMobileView mock = mock(StatusBarMobileView.class); 171 mGroup.addView(mock, index); 172 173 return mock; 174 } 175 } 176 177 private interface TestableIconManager { 178 StatusIconDisplayable getViewAt(int index); 179 } 180 } 181