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