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