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