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