1d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman/*
2d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman * Copyright (C) 2017 The Android Open Source Project
3d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman *
4d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman * Licensed under the Apache License, Version 2.0 (the "License");
5d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman * you may not use this file except in compliance with the License.
6d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman * You may obtain a copy of the License at
7d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman *
8d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman *      http://www.apache.org/licenses/LICENSE-2.0
9d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman *
10d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman * Unless required by applicable law or agreed to in writing, software
11d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman * distributed under the License is distributed on an "AS IS" BASIS,
12d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman * See the License for the specific language governing permissions and
14d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman * limitations under the License.
15d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman */
16d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanpackage com.android.settings.wifi;
17d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman
1822080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static android.support.test.InstrumentationRegistry.getInstrumentation;
1922080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static android.support.test.espresso.Espresso.onView;
2022080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
2122080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static android.support.test.espresso.assertion.ViewAssertions.matches;
2222080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static android.support.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE;
2322080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
2422080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
25c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargentimport static android.support.test.espresso.matcher.ViewMatchers.withId;
2622080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static android.support.test.espresso.matcher.ViewMatchers.withText;
2722080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
2822080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static com.google.common.truth.Truth.assertThat;
2922080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
3022080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static org.hamcrest.Matchers.allOf;
3122080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static org.hamcrest.Matchers.not;
3222080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static org.hamcrest.Matchers.startsWith;
3322080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static org.mockito.Mockito.atMost;
3422080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static org.mockito.Mockito.verify;
3522080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport static org.mockito.Mockito.when;
3622080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
374ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghumanimport android.app.Activity;
38db332d4aa725f5b15117be5fc137e43093ed987dStephen Chenimport android.app.Fragment;
39d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport android.content.Context;
40d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport android.content.Intent;
41db332d4aa725f5b15117be5fc137e43093ed987dStephen Chenimport android.net.ConnectivityManager;
42db332d4aa725f5b15117be5fc137e43093ed987dStephen Chenimport android.net.NetworkInfo;
43db332d4aa725f5b15117be5fc137e43093ed987dStephen Chenimport android.net.wifi.WifiConfiguration;
44db332d4aa725f5b15117be5fc137e43093ed987dStephen Chenimport android.net.wifi.WifiInfo;
4587bf49a43689dae7673f1aeb3a6498939b1117acSundeep Ghumanimport android.net.wifi.WifiManager;
46db332d4aa725f5b15117be5fc137e43093ed987dStephen Chenimport android.net.wifi.WifiSsid;
47c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargentimport android.provider.Settings;
48d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport android.support.test.InstrumentationRegistry;
49d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport android.support.test.rule.ActivityTestRule;
50d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport android.support.test.runner.AndroidJUnit4;
51015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang
52d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport com.android.settings.Settings.WifiSettingsActivity;
5387bf49a43689dae7673f1aeb3a6498939b1117acSundeep Ghumanimport com.android.settingslib.wifi.AccessPoint;
5422080a1df54027d42f87f3004d79dc42c5337fa5Shunta Satoimport com.android.settingslib.wifi.TestAccessPointBuilder;
55d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport com.android.settingslib.wifi.WifiTracker;
56db332d4aa725f5b15117be5fc137e43093ed987dStephen Chenimport com.android.settingslib.wifi.WifiTracker.WifiListener;
57d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport com.android.settingslib.wifi.WifiTrackerFactory;
58015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang
5987bf49a43689dae7673f1aeb3a6498939b1117acSundeep Ghumanimport com.google.common.collect.Lists;
60015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang
61d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport org.junit.Before;
62d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport org.junit.Rule;
63d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport org.junit.Test;
64d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport org.junit.runner.RunWith;
65d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport org.mockito.Mock;
66d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanimport org.mockito.MockitoAnnotations;
67d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman
68db332d4aa725f5b15117be5fc137e43093ed987dStephen Chenimport java.util.List;
69db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
70d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman@RunWith(AndroidJUnit4.class)
71d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghumanpublic class WifiSettingsUiTest {
72db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    private static final String TEST_SSID = "\"Test Ssid\"";
73db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    private static final String TEST_UNQUOTED_SSID = "Test Ssid";
74db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    private static final String TEST_BSSID = "0a:08:5c:67:89:00";
75db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    private static final int TEST_RSSI = 123;
76db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    private static final int TEST_NETWORK_ID = 1;
77db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
78c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    // Keys used to lookup resources by name (see the resourceId/resourceString helper methods).
79c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String ID = "id";
80c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String STRING = "string";
81c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String WIFI_CONFIGURE_SETTINGS_PREFERENCE_TITLE =
82c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent            "wifi_configure_settings_preference_title";
83c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String WIFI_SAVED_ACCESS_POINTS_LABEL = "wifi_saved_access_points_label";
84c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String WIFI_EMPTY_LIST_WIFI_OFF = "wifi_empty_list_wifi_off";
85c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String WIFI_DISPLAY_STATUS_CONNECTED = "wifi_display_status_connected";
86c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String WIFI_PASSWORD = "wifi_password";
87c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String WIFI_SHOW_PASSWORD = "wifi_show_password";
88c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String PASSWORD_LAYOUT = "password_layout";
89c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private static final String PASSWORD = "password";
90c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
91015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang    @Mock
92015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang    private WifiTracker mWifiTracker;
93015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang    @Mock
94015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang    private WifiManager mWifiManager;
9587bf49a43689dae7673f1aeb3a6498939b1117acSundeep Ghuman    private Context mContext;
96db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    private WifiListener mWifiListener;
97d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman
98d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    @Rule
99d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    public ActivityTestRule<WifiSettingsActivity> mActivityRule =
100d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman            new ActivityTestRule<>(WifiSettingsActivity.class, true);
101d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman
102d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    @Before
103d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    public void setUp() {
104d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman        MockitoAnnotations.initMocks(this);
10587bf49a43689dae7673f1aeb3a6498939b1117acSundeep Ghuman        mContext = InstrumentationRegistry.getTargetContext();
106db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        WifiTrackerFactory.setTestingWifiTracker(mWifiTracker);
107db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        when(mWifiTracker.getManager()).thenReturn(mWifiManager);
108db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    }
10987bf49a43689dae7673f1aeb3a6498939b1117acSundeep Ghuman
110c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    /**
111c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent     * Helper to get around the problem that directly accessing settings resource id's from
112c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent     * com.android.settings.R via R.(type).(name) (eg R.id.password or
113c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent     * R.string.wifi_configure_settings_preference_title) may not work due to mismatched resource
114c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent     * ids. See b/37714546 and b/63546650.
115c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent     */
116c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private int resourceId(String type, String name) {
117c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        return mContext.getResources().getIdentifier(name, type, mContext.getPackageName());
118c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    }
119c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
120c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    /** Similar to {@link #resourceId}, but for accessing R.string.<name> values. */
121c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private String resourceString(String name) {
122c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        return mContext.getResources().getString(resourceId(STRING, name));
123c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    }
124c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
125db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    private void setupConnectedAccessPoint() {
126db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        WifiConfiguration config = new WifiConfiguration();
127db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        config.SSID = TEST_SSID;
128db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        config.BSSID = TEST_BSSID;
129db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        config.networkId = TEST_NETWORK_ID;
130db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        WifiInfo wifiInfo = new WifiInfo();
131db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(TEST_UNQUOTED_SSID));
132db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        wifiInfo.setBSSID(TEST_BSSID);
133db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        wifiInfo.setRssi(TEST_RSSI);
134db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        wifiInfo.setNetworkId(TEST_NETWORK_ID);
135db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        NetworkInfo networkInfo = new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0, null, null);
136db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null);
137db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        AccessPoint accessPoint = new AccessPoint(mContext, config);
138db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        accessPoint.update(config, wifiInfo, networkInfo);
139db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
140db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        assertThat(accessPoint.getSsidStr()).isEqualTo(TEST_UNQUOTED_SSID);
141db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        assertThat(accessPoint.getBssid()).isEqualTo(TEST_BSSID);
142db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        assertThat(accessPoint.getNetworkInfo()).isNotNull();
143db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        assertThat(accessPoint.isActive()).isTrue();
144c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        assertThat(accessPoint.getSettingsSummary()).isEqualTo(
145c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                resourceString(WIFI_DISPLAY_STATUS_CONNECTED));
146db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
147db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        when(mWifiTracker.getAccessPoints()).thenReturn(
148db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen                Lists.asList(accessPoint, new AccessPoint[]{}));
149d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    }
150d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman
151c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    /** Launch the activity via an Intent with a String extra. */
152c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private void launchActivity(String extraName, String extraValue) {
153c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
154c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        if (extraName != null && extraValue != null) {
155c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent            intent.putExtra(extraName, extraValue);
156c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        }
157c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        mActivityRule.launchActivity(intent);
158db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
159db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        verify(mWifiTracker).getManager();
160db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
161db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        List<Fragment> fragments = mActivityRule.getActivity().getFragmentManager().getFragments();
162db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        assertThat(fragments.size()).isEqualTo(1);
163db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        mWifiListener = (WifiSettings) fragments.get(0);
164db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        assertThat(mWifiListener).isNotNull();
165db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    }
166db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
167c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    /** Helper to launch the activity with no extra. */
168c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    private void launchActivity() {
169c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        launchActivity(null, null);
170c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    }
171c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
172db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    private void setWifiState(int wifiState) {
173db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        when(mWifiManager.getWifiState()).thenReturn(wifiState);
174db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        when(mWifiManager.isWifiEnabled()).thenReturn(wifiState == WifiManager.WIFI_STATE_ENABLED);
175db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    }
176db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
177db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    private void callOnWifiStateChanged(int state) {
178db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        mActivityRule.getActivity().getMainThreadHandler()
179015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang                .post(() -> mWifiListener.onWifiStateChanged(state));
180d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    }
181d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman
182d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    @Test
183d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    public void launchActivityShouldSucceed() {
184d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman        launchActivity();
185d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    }
186d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman
187d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    @Test
188d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    public void shouldShowWifiPreferences() {
189d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman        launchActivity();
190db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
191c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withText(resourceId(STRING, WIFI_CONFIGURE_SETTINGS_PREFERENCE_TITLE))).check(
192c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                matches(isDisplayed()));
193db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    }
194db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
195db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    @Test
196015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang    public void noSavedNetworks_wifiEnabled_shouldNotShowSavedNetworksButton() {
197db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        setWifiState(WifiManager.WIFI_STATE_ENABLED);
198db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        when(mWifiTracker.getNumSavedNetworks()).thenReturn(0);
199db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
200db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        launchActivity();
201db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
202c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withText(resourceId(STRING, WIFI_SAVED_ACCESS_POINTS_LABEL))).check(
203c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                matches(not(isDisplayed())));
204db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    }
205db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
206db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    @Test
207015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang    public void noSavedNetworks_wifiDisabled_shouldNotShowSavedNetworksButton() {
208015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang        setWifiState(WifiManager.WIFI_STATE_DISABLED);
209015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang        when(mWifiTracker.getNumSavedNetworks()).thenReturn(0);
210015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang
211015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang        launchActivity();
212015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang
213c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withText(resourceId(STRING, WIFI_SAVED_ACCESS_POINTS_LABEL))).check(
214c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                doesNotExist());
215015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang    }
216015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang
217015c7706e49100870ab0f3786e4e2e0de9e641abFan Zhang    @Test
218db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    public void savedNetworksExist_shouldShowSavedNetworksButton() {
219db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        setWifiState(WifiManager.WIFI_STATE_ENABLED);
220db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        when(mWifiTracker.getNumSavedNetworks()).thenReturn(1);
221db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
222db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        launchActivity();
223db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
224c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(allOf(withText(resourceId(STRING, WIFI_SAVED_ACCESS_POINTS_LABEL)),
225db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen                withEffectiveVisibility(VISIBLE))).check(matches(isDisplayed()));
226db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    }
227db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
228db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    @Test
229db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    public void onDisableWifi_seeOffMessage() {
230db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        setWifiState(WifiManager.WIFI_STATE_DISABLED);
231db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
232db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        launchActivity();
233db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        callOnWifiStateChanged(WifiManager.WIFI_STATE_DISABLED);
234db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
235c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withText(startsWith(resourceString(WIFI_EMPTY_LIST_WIFI_OFF)))).check(
236c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                matches(isDisplayed()));
237db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    }
238db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
239db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    @Test
240db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    public void onEnableWifi_shouldNotSeeOffMessage() {
241db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        setWifiState(WifiManager.WIFI_STATE_ENABLED);
242db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
243db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        launchActivity();
244db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        callOnWifiStateChanged(WifiManager.WIFI_STATE_ENABLED);
245db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
246c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withText(startsWith(resourceString(WIFI_EMPTY_LIST_WIFI_OFF)))).check(
247c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                doesNotExist());
248db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    }
249db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
250db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    @Test
251db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen    public void onConnected_shouldSeeConnectedMessage() {
252db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        setWifiState(WifiManager.WIFI_STATE_ENABLED);
253db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        setupConnectedAccessPoint();
254db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        when(mWifiTracker.isConnected()).thenReturn(true);
255db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
256db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen        launchActivity();
257db332d4aa725f5b15117be5fc137e43093ed987dStephen Chen
258c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withText(resourceString(WIFI_DISPLAY_STATUS_CONNECTED))).check(
259c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                matches(isDisplayed()));
260d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman    }
2614ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman
2624ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman    @Test
2634ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman    public void resumingAp_shouldNotForceUpdateWhenExistingAPsAreListed() {
2644ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        setWifiState(WifiManager.WIFI_STATE_ENABLED);
2654ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        setupConnectedAccessPoint();
2664ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        when(mWifiTracker.isConnected()).thenReturn(true);
2674ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman
2684ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        launchActivity();
2694ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman
270c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withText(resourceString(WIFI_DISPLAY_STATUS_CONNECTED))).check(
271c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                matches(isDisplayed()));
2724ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        verify(mWifiTracker).forceUpdate();
2734ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman
2744ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        Activity activity = mActivityRule.getActivity();
2754ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        activity.finish();
2764ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        getInstrumentation().waitForIdleSync();
2774ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman
2784ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        getInstrumentation().callActivityOnStart(activity);
2794ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman        verify(mWifiTracker, atMost(1)).forceUpdate();
2804ae59dde433751666d8bb10f509a6e13f5eed28fSundeep Ghuman    }
28122080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
28222080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato    @Test
28322080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato    public void changingSecurityStateOnApShouldNotCauseMultipleListItems() {
28422080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        setWifiState(WifiManager.WIFI_STATE_ENABLED);
28522080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        TestAccessPointBuilder builder = new TestAccessPointBuilder(mContext)
286c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                .setSsid(TEST_SSID)
287c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                .setSecurity(AccessPoint.SECURITY_NONE)
288c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                .setRssi(TEST_RSSI);
28922080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        AccessPoint open = builder.build();
29022080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
29122080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        builder.setSecurity(AccessPoint.SECURITY_EAP);
29222080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        AccessPoint eap = builder.build();
29322080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
29422080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        builder.setSecurity(AccessPoint.SECURITY_WEP);
29522080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        AccessPoint wep = builder.build();
29622080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
29722080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        // Return a different security state each time getAccessPoints is invoked
29822080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        when(mWifiTracker.getAccessPoints())
299c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                .thenReturn(Lists.newArrayList(open))
30022080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato                .thenReturn(Lists.newArrayList(eap))
30122080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato                .thenReturn(Lists.newArrayList(wep));
30222080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
30322080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        launchActivity();
30422080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
30522080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        onView(withText(TEST_SSID)).check(matches(isDisplayed()));
30622080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
30722080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        mWifiListener.onAccessPointsChanged();
30822080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        onView(withText(TEST_SSID)).check(matches(isDisplayed()));
30922080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato
31022080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        mWifiListener.onAccessPointsChanged();
31122080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato        onView(withText(TEST_SSID)).check(matches(isDisplayed()));
31222080a1df54027d42f87f3004d79dc42c5337fa5Shunta Sato    }
313c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
314c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    @Test
315c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    public void wrongPasswordSavedNetwork() {
316c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        setWifiState(WifiManager.WIFI_STATE_ENABLED);
317c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
318c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        // Set up an AccessPoint that is disabled due to incorrect password.
319c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        WifiConfiguration config = new WifiConfiguration();
320c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        config.SSID = TEST_SSID;
321c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        config.BSSID = TEST_BSSID;
322c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        config.networkId = TEST_NETWORK_ID;
323c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
324c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
325c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        WifiConfiguration.NetworkSelectionStatus selectionStatus =
326c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                new WifiConfiguration.NetworkSelectionStatus();
327c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        selectionStatus.setNetworkSelectionDisableReason(
328c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD);
329c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        selectionStatus.setNetworkSelectionStatus(
330c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
331c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        config.setNetworkSelectionStatus(selectionStatus);
332c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
333c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        WifiInfo wifiInfo = new WifiInfo();
334c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(TEST_UNQUOTED_SSID));
335c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        wifiInfo.setBSSID(TEST_BSSID);
336c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        wifiInfo.setRssi(TEST_RSSI);
337c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        wifiInfo.setNetworkId(TEST_NETWORK_ID);
338c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        AccessPoint accessPoint = new AccessPoint(mContext, config);
339c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        accessPoint.update(config, wifiInfo, null);
340c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
341c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        // Make sure we've set up our access point correctly.
342c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        assertThat(accessPoint.getSsidStr()).isEqualTo(TEST_UNQUOTED_SSID);
343c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        assertThat(accessPoint.getBssid()).isEqualTo(TEST_BSSID);
344c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        assertThat(accessPoint.isActive()).isFalse();
345c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        assertThat(accessPoint.getConfig()).isNotNull();
346c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        WifiConfiguration.NetworkSelectionStatus networkStatus =
347c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                accessPoint.getConfig().getNetworkSelectionStatus();
348c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        assertThat(networkStatus).isNotNull();
349c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        assertThat(networkStatus.isNetworkEnabled()).isFalse();
350c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        assertThat(networkStatus.getNetworkSelectionDisableReason()).isEqualTo(
351c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent                WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD);
352c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
353c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        when(mWifiTracker.getAccessPoints()).thenReturn(Lists.newArrayList(accessPoint));
354c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        launchActivity(WifiSettings.EXTRA_START_CONNECT_SSID, accessPoint.getSsidStr());
355c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent
356c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        // Make sure that the password dialog is visible.
357c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withText(resourceId(STRING, WIFI_PASSWORD))).check(matches(isDisplayed()));
358c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withText(resourceId(STRING, WIFI_SHOW_PASSWORD))).check(matches(isDisplayed()));
359c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withId(resourceId(ID, PASSWORD_LAYOUT))).check(matches(isDisplayed()));
360c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent        onView(withId(resourceId(ID, PASSWORD))).check(matches(isDisplayed()));
361c00fedc6395dfe852b389df1e5ad87f015e43360Antony Sargent    }
362d2831c31c19dd7143e54c37728a105470907e39dSundeep Ghuman}
363