diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 0ec6098a5b7..b645f9f4186 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -205,6 +205,22 @@ android:resource="@id/wifi_settings" /> + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 611801c052b..071d656e0e4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1539,7 +1539,9 @@ The phone was unable to connect to this Wi\u2011Fi network. - + + Saved networks + Advanced Wi\u2011Fi Wi\u2011Fi frequency band @@ -1553,7 +1555,9 @@ IP address - + + Saved networks + IP settings Save diff --git a/res/xml/wifi_advanced_settings.xml b/res/xml/wifi_advanced_settings.xml index efa94b25aa5..118f6913515 100644 --- a/res/xml/wifi_advanced_settings.xml +++ b/res/xml/wifi_advanced_settings.xml @@ -68,20 +68,25 @@ android:title="@string/wifi_menu_wps_pbc" android:persistent="false" /> + + - - - - + + + + diff --git a/res/xml/wifi_display_saved_access_points.xml b/res/xml/wifi_display_saved_access_points.xml new file mode 100644 index 00000000000..2be31d2f7a5 --- /dev/null +++ b/res/xml/wifi_display_saved_access_points.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/res/xml/wifi_display_settings.xml b/res/xml/wifi_display_settings.xml index 2b32106fa87..81fb7012591 100644 --- a/res/xml/wifi_display_settings.xml +++ b/res/xml/wifi_display_settings.xml @@ -1,5 +1,5 @@ - - + diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 33bdedfbe31..ada1b0daf3d 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -73,6 +73,7 @@ public class Settings extends SettingsActivity { public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ } public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ } public static class AdvancedWifiSettingsActivity extends SettingsActivity { /* empty */ } + public static class SavedAccessPointsSettingsActivity extends SettingsActivity { /* empty */ } public static class TextToSpeechSettingsActivity extends SettingsActivity { /* empty */ } public static class AndroidBeamSettingsActivity extends SettingsActivity { /* empty */ } public static class WifiDisplaySettingsActivity extends SettingsActivity { /* empty */ } diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 1b2a48c4817..b0d3241098b 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -107,6 +107,7 @@ import com.android.settings.vpn2.VpnSettings; import com.android.settings.wfd.WifiDisplaySettings; import com.android.settings.widget.SwitchBar; import com.android.settings.wifi.AdvancedWifiSettings; +import com.android.settings.wifi.SavedAccessPointsWifiSettings; import com.android.settings.wifi.WifiSettings; import com.android.settings.wifi.p2p.WifiP2pSettings; @@ -234,6 +235,7 @@ public class SettingsActivity extends Activity WirelessSettings.class.getName(), WifiSettings.class.getName(), AdvancedWifiSettings.class.getName(), + SavedAccessPointsWifiSettings.class.getName(), BluetoothSettings.class.getName(), TetherSettings.class.getName(), WifiP2pSettings.class.getName(), diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java index 8115cb51ab6..0d53d85c2b3 100644 --- a/src/com/android/settings/search/Ranking.java +++ b/src/com/android/settings/search/Ranking.java @@ -42,6 +42,7 @@ import com.android.settings.notification.ZenModeSettings; import com.android.settings.print.PrintSettingsFragment; import com.android.settings.users.UserSettings; import com.android.settings.wifi.AdvancedWifiSettings; +import com.android.settings.wifi.SavedAccessPointsWifiSettings; import com.android.settings.wifi.WifiSettings; import java.util.HashMap; @@ -85,6 +86,7 @@ public final class Ranking { // Wi-Fi sRankMap.put(WifiSettings.class.getName(), RANK_WIFI); sRankMap.put(AdvancedWifiSettings.class.getName(), RANK_WIFI); + sRankMap.put(SavedAccessPointsWifiSettings.class.getName(), RANK_WIFI); // BT sRankMap.put(BluetoothSettings.class.getName(), RANK_BT); diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java index e78d9b80b94..287d78f59e1 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/search/SearchIndexableResources.java @@ -45,6 +45,7 @@ import com.android.settings.notification.ZenModeSettings; import com.android.settings.print.PrintSettingsFragment; import com.android.settings.users.UserSettings; import com.android.settings.wifi.AdvancedWifiSettings; +import com.android.settings.wifi.SavedAccessPointsWifiSettings; import com.android.settings.wifi.WifiSettings; import java.util.Collection; @@ -72,6 +73,13 @@ public final class SearchIndexableResources { AdvancedWifiSettings.class.getName(), R.drawable.ic_settings_wireless)); + sResMap.put(SavedAccessPointsWifiSettings.class.getName(), + new SearchIndexableResource( + Ranking.getRankForClassName(SavedAccessPointsWifiSettings.class.getName()), + R.xml.wifi_display_saved_access_points, + SavedAccessPointsWifiSettings.class.getName(), + R.drawable.ic_settings_wireless)); + sResMap.put(BluetoothSettings.class.getName(), new SearchIndexableResource( Ranking.getRankForClassName(BluetoothSettings.class.getName()), diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java index 0fe5f818f64..93f8b7b889d 100644 --- a/src/com/android/settings/wifi/AccessPoint.java +++ b/src/com/android/settings/wifi/AccessPoint.java @@ -32,6 +32,7 @@ import android.util.Log; import android.util.LruCache; import android.view.View; import android.widget.ImageView; +import android.widget.TextView; import java.util.Map; @@ -59,7 +60,8 @@ class AccessPoint extends Preference { */ public static final int HIGHER_FREQ_5GHZ = 5900; - /** Experimental: we should be able to show the user the list of BSSIDs and bands + /** + * Experimental: we should be able to show the user the list of BSSIDs and bands * for that SSID. * For now this data is used only with Verbose Logging so as to show the band and number * of BSSIDs on which that network is seen. @@ -79,7 +81,9 @@ class AccessPoint extends Preference { private static int[] wifi_signal_attributes = { R.attr.wifi_signal }; - /** These values are matched in string arrays -- changes must be kept in sync */ + /** + * These values are matched in string arrays -- changes must be kept in sync + */ static final int SECURITY_NONE = 0; static final int SECURITY_WEP = 1; static final int SECURITY_PSK = 2; @@ -97,6 +101,7 @@ class AccessPoint extends Preference { int security; int networkId = -1; boolean wpsAvailable = false; + boolean showSummary = true; PskType pskType = PskType.UNKNOWN; @@ -246,6 +251,11 @@ class AccessPoint extends Preference { protected void onBindView(View view) { super.onBindView(view); updateIcon(getLevel(), getContext()); + + final TextView summaryView = (TextView) view.findViewById( + com.android.internal.R.id.summary); + summaryView.setVisibility(showSummary ? View.VISIBLE : View.GONE); + notifyChanged(); } @@ -396,7 +406,18 @@ class AccessPoint extends Preference { return "\"" + string + "\""; } - /** visibility status of the WifiConfiguration + /** + * Shows or Hides the Summary of an AccessPoint. + * + * @param showSummary true will show the summary, false will hide the summary + */ + public void setShowSummary(boolean showSummary){ + this.showSummary = showSummary; + } + + /** + * Returns the visibility status of the WifiConfiguration. + * * @return autojoin debugging information * TODO: use a string formatter * ["rssi 5Ghz", "num results on 5GHz" / "rssi 5Ghz", "num results on 5GHz"] @@ -489,7 +510,9 @@ class AccessPoint extends Preference { return visibility.toString(); } - /** Updates the title and summary; may indirectly call notifyChanged() */ + /** + * Updates the title and summary; may indirectly call notifyChanged(). + */ private void refresh() { setTitle(ssid); diff --git a/src/com/android/settings/wifi/AdvancedWifiSettings.java b/src/com/android/settings/wifi/AdvancedWifiSettings.java index aa4c185a639..b7316d02f2a 100644 --- a/src/com/android/settings/wifi/AdvancedWifiSettings.java +++ b/src/com/android/settings/wifi/AdvancedWifiSettings.java @@ -54,6 +54,7 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment private static final String KEY_INSTALL_CREDENTIALS = "install_credentials"; private static final String KEY_WIFI_DIRECT = "wifi_direct"; private static final String KEY_WPS_PUSH = "wps_push_button"; + private static final String KEY_WPS_PIN = "wps_pin_entry"; private static final String KEY_SUSPEND_OPTIMIZATIONS = "suspend_optimizations"; private WifiManager mWifiManager; @@ -147,6 +148,16 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment } }); + // WpsDialog: Create the dialog like WifiSettings does. + Preference wpsPinPref = findPreference(KEY_WPS_PIN); + wpsPinPref.setOnPreferenceClickListener(new OnPreferenceClickListener(){ + public boolean onPreferenceClick(Preference arg0) { + WpsDialog wpsDialog = new WpsDialog(getActivity(), WpsInfo.DISPLAY); + wpsDialog.show(); + return true; + } + }); + CheckBoxPreference suspendOptimizations = (CheckBoxPreference) findPreference(KEY_SUSPEND_OPTIMIZATIONS); suspendOptimizations.setChecked(Global.getInt(getContentResolver(), @@ -275,11 +286,13 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress(); wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress : getActivity().getString(R.string.status_unavailable)); + wifiMacAddressPref.setSelectable(false); Preference wifiIpAddressPref = findPreference(KEY_CURRENT_IP_ADDRESS); String ipAddress = Utils.getWifiIpAddresses(getActivity()); wifiIpAddressPref.setSummary(ipAddress == null ? getActivity().getString(R.string.status_unavailable) : ipAddress); + wifiIpAddressPref.setSelectable(false); } } diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java new file mode 100644 index 00000000000..6e82c6607cd --- /dev/null +++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2014 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 android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceScreen; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; +import com.android.settings.search.SearchIndexableRaw; +import android.util.Log; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * UI to manage saved networks/access points. + */ +public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment + implements DialogInterface.OnClickListener, Indexable { + private static final String TAG = "SavedAccessPointsWifiSettings"; + + private WifiDialog mDialog; + private WifiManager mWifiManager; + private AccessPoint mDlgAccessPoint; + private Bundle mAccessPointSavedState; + private AccessPoint mSelectedAccessPoint; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.wifi_display_saved_access_points); + } + + @Override + public void onResume() { + super.onResume(); + initPreferences(); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); + } + + private void initPreferences() { + PreferenceScreen preferenceScreen = getPreferenceScreen(); + final Context context = getActivity(); + + mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + final List accessPoints = constructSavedAccessPoints(context, mWifiManager); + + preferenceScreen.removeAll(); + + final int accessPointsSize = accessPoints.size(); + for (int i = 0; i < accessPointsSize; ++i){ + preferenceScreen.addPreference(accessPoints.get(i)); + } + + if(getPreferenceScreen().getPreferenceCount() < 1) { + Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!"); + } + } + + private static List constructSavedAccessPoints(Context context, + WifiManager wifiManager){ + List accessPoints = new ArrayList(); + Map> resultsMap = new HashMap>(); + + final List configs = wifiManager.getConfiguredNetworks(); + final List scanResults = wifiManager.getScanResults(); + + if (configs != null) { + //Construct a Map for quick searching of a wifi network via ssid. + final int scanResultsSize = scanResults.size(); + for (int i = 0; i < scanResultsSize; ++i){ + final ScanResult result = scanResults.get(i); + List res = resultsMap.get(result.SSID); + + if(res == null){ + res = new ArrayList(); + resultsMap.put(result.SSID, res); + } + + res.add(result); + } + + final int configsSize = configs.size(); + for (int i = 0; i < configsSize; ++i){ + AccessPoint accessPoint = new AccessPoint(context, configs.get(i)); + final List results = resultsMap.get(accessPoint.ssid); + + accessPoint.setShowSummary(false); + if(results != null){ + final int resultsSize = results.size(); + for (int j = 0; j < resultsSize; ++j){ + accessPoint.update(results.get(j)); + } + } + + accessPoints.add(accessPoint); + } + } + + return accessPoints; + } + + private void showDialog(AccessPoint accessPoint, boolean edit) { + if (mDialog != null) { + removeDialog(WifiSettings.WIFI_DIALOG_ID); + mDialog = null; + } + + // Save the access point and edit mode + mDlgAccessPoint = accessPoint; + + showDialog(WifiSettings.WIFI_DIALOG_ID); + } + + @Override + public Dialog onCreateDialog(int dialogId) { + switch (dialogId) { + case WifiSettings.WIFI_DIALOG_ID: + mSelectedAccessPoint = mDlgAccessPoint; + mDialog = new WifiDialog(getActivity(), this, mDlgAccessPoint, false); + return mDialog; + + } + return super.onCreateDialog(dialogId); + } + + @Override + public void onClick(DialogInterface dialogInterface, int button) { + if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { + mWifiManager.forget(mSelectedAccessPoint.networkId, null); + getPreferenceScreen().removePreference(mSelectedAccessPoint); + mSelectedAccessPoint = null; + } + } + + @Override + public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { + if (preference instanceof AccessPoint) { + showDialog((AccessPoint) preference, false); + return true; + } else{ + return super.onPreferenceTreeClick(screen, preference); + } + } + + /** + * For search. + */ + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getRawDataToIndex(Context context, boolean enabled) { + final List result = new ArrayList(); + final Resources res = context.getResources(); + final String title = res.getString(R.string.wifi_saved_access_points_titlebar); + + // Add fragment title + SearchIndexableRaw data = new SearchIndexableRaw(context); + data.title = title; + data.screenTitle = title; + data.enabled = enabled; + result.add(data); + + // Add available Wi-Fi access points + WifiManager wifiManager = + (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + final List accessPoints = + constructSavedAccessPoints(context, wifiManager); + + final int accessPointsSize = accessPoints.size(); + for (int i = 0; i < accessPointsSize; ++i){ + data = new SearchIndexableRaw(context); + data.title = accessPoints.get(i).getTitle().toString(); + data.screenTitle = title; + data.enabled = enabled; + result.add(data); + } + + return result; + } + }; +} diff --git a/src/com/android/settings/wifi/WifiPickerActivity.java b/src/com/android/settings/wifi/WifiPickerActivity.java index eec9963c97f..b3064663d2e 100644 --- a/src/com/android/settings/wifi/WifiPickerActivity.java +++ b/src/com/android/settings/wifi/WifiPickerActivity.java @@ -39,6 +39,7 @@ public class WifiPickerActivity extends SettingsActivity implements ButtonBarHan protected boolean isValidFragment(String fragmentName) { if (WifiSettings.class.getName().equals(fragmentName) || WifiP2pSettings.class.getName().equals(fragmentName) + || SavedAccessPointsWifiSettings.class.getName().equals(fragmentName) || AdvancedWifiSettings.class.getName().equals(fragmentName)) return true; return false; } @@ -46,4 +47,4 @@ public class WifiPickerActivity extends SettingsActivity implements ButtonBarHan /* package */ Class getWifiSettingsClass() { return WifiSettings.class; } -} \ No newline at end of file +} diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index a7f291db6f1..0cb25c386b7 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -84,7 +84,7 @@ public class WifiSettings extends RestrictedSettingsFragment private static final String TAG = "WifiSettings"; /* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST; private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1; - private static final int MENU_ID_P2P = Menu.FIRST + 2; + private static final int MENU_ID_SAVED_NETWORK = Menu.FIRST + 2; /* package */ static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3; private static final int MENU_ID_ADVANCED = Menu.FIRST + 4; private static final int MENU_ID_SCAN = Menu.FIRST + 5; @@ -93,7 +93,7 @@ public class WifiSettings extends RestrictedSettingsFragment private static final int MENU_ID_MODIFY = Menu.FIRST + 8; private static final int MENU_ID_WRITE_NFC = Menu.FIRST + 9; - private static final int WIFI_DIALOG_ID = 1; + public static final int WIFI_DIALOG_ID = 1; /* package */ static final int WPS_PBC_DIALOG_ID = 2; private static final int WPS_PIN_DIALOG_ID = 3; private static final int WRITE_NFC_DIALOG_ID = 6; @@ -105,6 +105,8 @@ public class WifiSettings extends RestrictedSettingsFragment private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode"; private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state"; + private static boolean savedNetworksExist; + private final IntentFilter mFilter; private final BroadcastReceiver mReceiver; private final Scanner mScanner; @@ -320,15 +322,16 @@ public class WifiSettings extends RestrictedSettingsFragment .setIcon(ta.getDrawable(0)) .setEnabled(wifiIsEnabled) .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan) - //.setIcon(R.drawable.ic_menu_scan_network) - .setEnabled(wifiIsEnabled) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin) - .setEnabled(wifiIsEnabled) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + if (savedNetworksExist){ + menu.add(Menu.NONE, MENU_ID_SAVED_NETWORK, 0, R.string.wifi_saved_access_points_label) + .setIcon(ta.getDrawable(0)) + .setEnabled(wifiIsEnabled) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + } + menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.menu_stats_refresh) + .setEnabled(wifiIsEnabled) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced) - //.setIcon(android.R.drawable.ic_menu_manage) .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); ta.recycle(); } @@ -357,6 +360,7 @@ public class WifiSettings extends RestrictedSettingsFragment case MENU_ID_WPS_PBC: showDialog(WPS_PBC_DIALOG_ID); return true; + /* case MENU_ID_P2P: if (getActivity() instanceof SettingsActivity) { ((SettingsActivity) getActivity()).startPreferencePanel( @@ -369,6 +373,7 @@ public class WifiSettings extends RestrictedSettingsFragment R.string.wifi_p2p_settings_title, -1, null); } return true; + */ case MENU_ID_WPS_PIN: showDialog(WPS_PIN_DIALOG_ID); return true; @@ -382,16 +387,26 @@ public class WifiSettings extends RestrictedSettingsFragment onAddNetworkPressed(); } return true; + case MENU_ID_SAVED_NETWORK: + if (getActivity() instanceof SettingsActivity) { + ((SettingsActivity) getActivity()).startPreferencePanel( + SavedAccessPointsWifiSettings.class.getCanonicalName(), null, + R.string.wifi_saved_access_points_titlebar, null, this, 0); + } else { + startFragment(this, SavedAccessPointsWifiSettings.class.getCanonicalName(), + R.string.wifi_saved_access_points_titlebar, + -1 /* Do not request a result */, null); + } + return true; case MENU_ID_ADVANCED: if (getActivity() instanceof SettingsActivity) { ((SettingsActivity) getActivity()).startPreferencePanel( - AdvancedWifiSettings.class.getCanonicalName(), - null, - R.string.wifi_advanced_titlebar, null, - this, 0); + AdvancedWifiSettings.class.getCanonicalName(), null, + R.string.wifi_advanced_titlebar, null, this, 0); } else { startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), - R.string.wifi_advanced_titlebar, -1, null); + R.string.wifi_advanced_titlebar, -1 /* Do not request a results */, + null); } return true; } @@ -468,6 +483,10 @@ public class WifiSettings extends RestrictedSettingsFragment if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE && mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) { mSelectedAccessPoint.generateOpenNetworkConfig(); + if (!savedNetworksExist){ + savedNetworksExist = true; + getActivity().invalidateOptionsMenu(); + } mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener); } else { showDialog(mSelectedAccessPoint, false); @@ -606,6 +625,7 @@ public class WifiSettings extends RestrictedSettingsFragment final List configs = wifiManager.getConfiguredNetworks(); if (configs != null) { + savedNetworksExist = (configs.size() > 0); for (WifiConfiguration config : configs) { AccessPoint accessPoint = new AccessPoint(context, config); if (lastInfo != null && lastState != null) {