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())); + } +}