1package com.android.systemui.statusbar.policy;
2
3import android.content.Intent;
4import android.net.ConnectivityManager;
5import android.net.NetworkInfo;
6import android.net.wifi.WifiInfo;
7import android.net.wifi.WifiManager;
8
9import org.mockito.ArgumentCaptor;
10import org.mockito.Mockito;
11
12public 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