1package com.android.systemui.statusbar.policy; 2 3import android.content.Intent; 4import android.net.NetworkCapabilities; 5import android.net.NetworkInfo; 6import android.net.wifi.WifiInfo; 7import android.net.wifi.WifiManager; 8import android.test.suitebuilder.annotation.SmallTest; 9 10import com.android.systemui.statusbar.policy.NetworkController.IconState; 11 12import org.mockito.ArgumentCaptor; 13import org.mockito.Mockito; 14 15@SmallTest 16public class NetworkControllerWifiTest extends NetworkControllerBaseTest { 17 // These match the constants in WifiManager and need to be kept up to date. 18 private static final int MIN_RSSI = -100; 19 private static final int MAX_RSSI = -55; 20 21 public void testWifiIcon() { 22 String testSsid = "Test SSID"; 23 setWifiEnabled(true); 24 verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK); 25 26 setWifiState(true, testSsid); 27 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][0]); 28 29 for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) { 30 setWifiLevel(testLevel); 31 32 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true); 33 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]); 34 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, false, true); 35 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][testLevel]); 36 } 37 } 38 39 public void testQsWifiIcon() { 40 String testSsid = "Test SSID"; 41 42 setWifiEnabled(false); 43 verifyLastQsWifiIcon(false, false, WifiIcons.QS_WIFI_NO_NETWORK, null); 44 45 setWifiEnabled(true); 46 verifyLastQsWifiIcon(true, false, WifiIcons.QS_WIFI_NO_NETWORK, null); 47 48 setWifiState(true, testSsid); 49 for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) { 50 setWifiLevel(testLevel); 51 52 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true); 53 verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel], 54 testSsid); 55 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, false, true); 56 verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[0][testLevel], 57 testSsid); 58 } 59 } 60 61 public void testQsDataDirection() { 62 // Setup normal connection 63 String testSsid = "Test SSID"; 64 int testLevel = 2; 65 setWifiEnabled(true); 66 setWifiState(true, testSsid); 67 setWifiLevel(testLevel); 68 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true); 69 verifyLastQsWifiIcon(true, true, 70 WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel], testSsid); 71 72 setWifiActivity(WifiManager.DATA_ACTIVITY_NONE); 73 verifyLastQsDataDirection(false, false); 74 setWifiActivity(WifiManager.DATA_ACTIVITY_IN); 75 verifyLastQsDataDirection(true, false); 76 setWifiActivity(WifiManager.DATA_ACTIVITY_OUT); 77 verifyLastQsDataDirection(false, true); 78 setWifiActivity(WifiManager.DATA_ACTIVITY_INOUT); 79 verifyLastQsDataDirection(true, true); 80 } 81 82 public void testRoamingIconDuringWifi() { 83 // Setup normal connection 84 String testSsid = "Test SSID"; 85 int testLevel = 2; 86 setWifiEnabled(true); 87 setWifiState(true, testSsid); 88 setWifiLevel(testLevel); 89 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true); 90 verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]); 91 92 setupDefaultSignal(); 93 setGsmRoaming(true); 94 // Still be on wifi though. 95 setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true); 96 verifyLastMobileDataIndicators(true, 97 TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[1][DEFAULT_LEVEL], 98 TelephonyIcons.ROAMING_ICON); 99 } 100 101 protected void setWifiActivity(int activity) { 102 // TODO: Not this, because this variable probably isn't sticking around. 103 mNetworkController.mWifiSignalController.setActivity(activity); 104 } 105 106 protected void setWifiLevel(int level) { 107 float amountPerLevel = (MAX_RSSI - MIN_RSSI) / (WifiIcons.WIFI_LEVEL_COUNT - 1); 108 int rssi = (int)(MIN_RSSI + level * amountPerLevel); 109 // Put RSSI in the middle of the range. 110 rssi += amountPerLevel / 2; 111 Intent i = new Intent(WifiManager.RSSI_CHANGED_ACTION); 112 i.putExtra(WifiManager.EXTRA_NEW_RSSI, rssi); 113 mNetworkController.onReceive(mContext, i); 114 } 115 116 protected void setWifiEnabled(boolean enabled) { 117 Intent i = new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION); 118 i.putExtra(WifiManager.EXTRA_WIFI_STATE, 119 enabled ? WifiManager.WIFI_STATE_ENABLED : WifiManager.WIFI_STATE_DISABLED); 120 mNetworkController.onReceive(mContext, i); 121 } 122 123 protected void setWifiState(boolean connected, String ssid) { 124 Intent i = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION); 125 NetworkInfo networkInfo = Mockito.mock(NetworkInfo.class); 126 Mockito.when(networkInfo.isConnected()).thenReturn(connected); 127 128 WifiInfo wifiInfo = Mockito.mock(WifiInfo.class); 129 Mockito.when(wifiInfo.getSSID()).thenReturn(ssid); 130 131 i.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo); 132 i.putExtra(WifiManager.EXTRA_WIFI_INFO, wifiInfo); 133 mNetworkController.onReceive(mContext, i); 134 } 135 136 protected void verifyLastQsDataDirection(boolean in, boolean out) { 137 ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class); 138 ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class); 139 140 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( 141 Mockito.anyBoolean(), Mockito.any(IconState.class), Mockito.any(IconState.class), 142 inArg.capture(), outArg.capture(), Mockito.anyString()); 143 assertEquals("WiFi data in, in quick settings", in, (boolean) inArg.getValue()); 144 assertEquals("WiFi data out, in quick settings", out, (boolean) outArg.getValue()); 145 } 146 147 protected void verifyLastQsWifiIcon(boolean enabled, boolean connected, int icon, 148 String description) { 149 ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); 150 ArgumentCaptor<Boolean> enabledArg = ArgumentCaptor.forClass(Boolean.class); 151 ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class); 152 153 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( 154 enabledArg.capture(), Mockito.any(IconState.class), 155 iconArg.capture(), Mockito.anyBoolean(), 156 Mockito.anyBoolean(), 157 descArg.capture()); 158 IconState iconState = iconArg.getValue(); 159 assertEquals("WiFi enabled, in quick settings", enabled, (boolean) enabledArg.getValue()); 160 assertEquals("WiFi connected, in quick settings", connected, iconState.visible); 161 assertEquals("WiFi signal, in quick settings", icon, iconState.icon); 162 assertEquals("WiFI desc (ssid), in quick settings", description, descArg.getValue()); 163 } 164 165 protected void verifyLastWifiIcon(boolean visible, int icon) { 166 ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); 167 168 Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( 169 Mockito.anyBoolean(), iconArg.capture(), Mockito.any(IconState.class), 170 Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.anyString()); 171 IconState iconState = iconArg.getValue(); 172 assertEquals("WiFi visible, in status bar", visible, iconState.visible); 173 assertEquals("WiFi signal, in status bar", icon, iconState.icon); 174 } 175} 176