From dc1add0c6142861d2b702e36cfb576e3ff52a3d0 Mon Sep 17 00:00:00 2001 From: Stephen Chen Date: Fri, 11 Aug 2017 13:09:35 -0700 Subject: [PATCH] Add a "Add Network" button to SavedAccessPointsWifiSettings Bug: 36719359 Test: runtest --path packages/apps/Settings/tests/unit/src/com/android/settings/wifi/SavedNetworkSettingsTest.java Test: Open saved networks from WifiSettings. Ensure that exiting and resuming the activity keeps the "Add Network" button on the bottom of the network list. This is tested through the cases where networks are forgotten/saved before resuming, and that pausing/resuming when the dialog is open or closed does not affect the result. Change-Id: Ib719a1f6b9468c0f8f44470eeed9144904672cf1 --- .../wifi/SavedAccessPointsWifiSettings.java | 53 +++++++++---- .../wifi/SavedNetworkSettingsTest.java | 76 +++++++++++++++++++ 2 files changed, 116 insertions(+), 13 deletions(-) create mode 100644 tests/unit/src/com/android/settings/wifi/SavedNetworkSettingsTest.java diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java index 33fdf2d68f5..1a95525fe24 100644 --- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java +++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java @@ -16,13 +16,12 @@ package com.android.settings.wifi; +import android.annotation.Nullable; import android.app.Dialog; import android.content.Context; import android.content.res.Resources; import android.icu.text.Collator; -import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; -import android.net.wifi.hotspot2.PasspointConfiguration; import android.os.Bundle; import android.provider.SearchIndexableResource; import android.support.v7.preference.Preference; @@ -48,6 +47,7 @@ import java.util.List; /** * UI to manage saved networks/access points. + * TODO(b/64806699): convert to {@link DashboardFragment} with {@link PreferenceController}s */ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment implements Indexable, WifiDialog.WifiDialogListener { @@ -83,6 +83,7 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment private AccessPoint mDlgAccessPoint; private Bundle mAccessPointSavedState; private AccessPoint mSelectedAccessPoint; + private Preference mAddNetworkPreference; private AccessPointPreference.UserBadgeCache mUserBadgeCache; @@ -142,23 +143,38 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment preference.setIcon(null); preferenceScreen.addPreference(preference); } + preference.setOrder(i); } removeCachedPrefs(preferenceScreen); + if (mAddNetworkPreference == null) { + mAddNetworkPreference = new Preference(getPrefContext()); + mAddNetworkPreference.setIcon(R.drawable.ic_menu_add_inset); + mAddNetworkPreference.setTitle(R.string.wifi_add_network); + } + mAddNetworkPreference.setOrder(accessPointsSize); + preferenceScreen.addPreference(mAddNetworkPreference); + if(getPreferenceScreen().getPreferenceCount() < 1) { Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!"); } } - private void showDialog(LongPressAccessPointPreference accessPoint, boolean edit) { + private void showWifiDialog(@Nullable LongPressAccessPointPreference accessPoint) { if (mDialog != null) { removeDialog(WifiSettings.WIFI_DIALOG_ID); mDialog = null; } - // Save the access point and edit mode - mDlgAccessPoint = accessPoint.getAccessPoint(); + if (accessPoint != null) { + // Save the access point and edit mode + mDlgAccessPoint = accessPoint.getAccessPoint(); + } else { + // No access point is selected. Clear saved state. + mDlgAccessPoint = null; + mAccessPointSavedState = null; + } showDialog(WifiSettings.WIFI_DIALOG_ID); } @@ -167,15 +183,23 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment public Dialog onCreateDialog(int dialogId) { switch (dialogId) { case WifiSettings.WIFI_DIALOG_ID: - if (mDlgAccessPoint == null) { // For re-launch from saved state - mDlgAccessPoint = new AccessPoint(getActivity(), mAccessPointSavedState); - // Reset the saved access point data - mAccessPointSavedState = null; + if (mDlgAccessPoint == null && mAccessPointSavedState == null) { + // Add new network + mDialog = WifiDialog.createFullscreen(getActivity(), this, null, + WifiConfigUiBase.MODE_CONNECT); + } else { + // Modify network + if (mDlgAccessPoint == null) { + // Restore AP from save state + mDlgAccessPoint = new AccessPoint(getActivity(), mAccessPointSavedState); + // Reset the saved access point data + mAccessPointSavedState = null; + } + mDialog = WifiDialog.createModal(getActivity(), this, mDlgAccessPoint, + WifiConfigUiBase.MODE_VIEW); } mSelectedAccessPoint = mDlgAccessPoint; - mDialog = WifiDialog.createModal(getActivity(), this, mDlgAccessPoint, - WifiConfigUiBase.MODE_VIEW); return mDialog; } return super.onCreateDialog(dialogId); @@ -233,9 +257,12 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment @Override public boolean onPreferenceTreeClick(Preference preference) { if (preference instanceof LongPressAccessPointPreference) { - showDialog((LongPressAccessPointPreference) preference, false); + showWifiDialog((LongPressAccessPointPreference) preference); return true; - } else{ + } else if (preference == mAddNetworkPreference) { + showWifiDialog(null); + return true; + } else { return super.onPreferenceTreeClick(preference); } } diff --git a/tests/unit/src/com/android/settings/wifi/SavedNetworkSettingsTest.java b/tests/unit/src/com/android/settings/wifi/SavedNetworkSettingsTest.java new file mode 100644 index 00000000000..79eccc4a87a --- /dev/null +++ b/tests/unit/src/com/android/settings/wifi/SavedNetworkSettingsTest.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.wifi; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; + +import android.content.Context; +import android.content.Intent; +import android.support.test.InstrumentationRegistry; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import com.android.settings.Settings; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + + +@RunWith(AndroidJUnit4.class) +public class SavedNetworkSettingsTest { + + // Keys used to lookup resources by name (see the resourceId helper method). + private static final String STRING = "string"; + private static final String WIFI_ADD_NETWORK = "wifi_add_network"; + private static final String WIFI_NETWORK_LABEL = "wifi_ssid"; + + private Context mContext; + + @Rule + public ActivityTestRule mActivityRule = + new ActivityTestRule<>(Settings.SavedAccessPointsSettingsActivity.class, true); + + private int resourceId(String type, String name) { + return mContext.getResources().getIdentifier(name, type, mContext.getPackageName()); + } + + @Before + public void setUp() { + mContext = InstrumentationRegistry.getTargetContext(); + } + + private void launchSavedNetworksSettings() { + Intent intent = new Intent() + .setClassName(mContext.getPackageName(), + Settings.SavedAccessPointsSettingsActivity.class.getName()) + .setPackage(mContext.getPackageName()); + mActivityRule.launchActivity(intent); + } + + @Test + public void launchSavedNetworkSettings_shouldHaveAddNetworkField() { + launchSavedNetworksSettings(); + onView(withText(resourceId(STRING, WIFI_ADD_NETWORK))).check(matches(isDisplayed())) + .perform(click()); + onView(withText(resourceId(STRING, WIFI_NETWORK_LABEL))).check(matches(isDisplayed())); + } +}