From ae727fbb73e5fd47bc7302af101fd1b7672971e4 Mon Sep 17 00:00:00 2001 From: Peter Qiu Date: Tue, 14 Mar 2017 15:53:20 -0700 Subject: [PATCH] wifi: managed Passpoint configurations in "Saved Networks" page Instead of going through WifiTracker to retrieve saved network configurations (including both WiFi networks and Passpoint provider configurations), use the WifiManager's APIs to retrieve the configurations directly, to avoid any unnecessary complexities. Also update to use the appropriate APIs for configuration removal based on the configuration type. Bug: 34207710 Test: manual test by removing a Passpoint configuration from "Saved Networks" page. Change-Id: I549cc484d8825b6c38895428c1b7941390bb5f1f --- .../wifi/SavedAccessPointsWifiSettings.java | 54 +++++++++++++++++-- .../settings/wifi/WifiConfigController.java | 12 +++-- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java index b9ffcaf8166..07495ee55df 100644 --- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java +++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java @@ -20,7 +20,9 @@ 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; @@ -110,8 +112,7 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment PreferenceScreen preferenceScreen = getPreferenceScreen(); final Context context = getPrefContext(); - final List accessPoints = WifiTracker.getCurrentAccessPoints(context, true, - false, true); + final List accessPoints = getSavedConfigs(context, mWifiManager); Collections.sort(accessPoints, SAVED_NETWORK_COMPARATOR); preferenceScreen.removeAll(); @@ -129,6 +130,39 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment } } + /** + * Retrieved the list of saved network configurations from {@link WifiManager}. + * Each configuration is represented by {@link AccessPoint}. + * + * @param context The application context + * @param wifiManager An instance of {@link WifiManager} + * @return List of {@link AccessPoint} + */ + private static List getSavedConfigs(Context context, WifiManager wifiManager) { + List savedConfigs = new ArrayList<>(); + List savedNetworks = wifiManager.getConfiguredNetworks(); + for (WifiConfiguration network : savedNetworks) { + // Configuration for Passpoint network is configured temporary by WifiService for + // connection attempt only. The underlying configuration is saved as Passpoint + // configuration, which will be retrieved with WifiManager#getPasspointConfiguration + // call below. + if (network.isPasspoint()) { + continue; + } + savedConfigs.add(new AccessPoint(context, network)); + } + try { + List savedPasspointConfigs = + wifiManager.getPasspointConfigurations(); + for (PasspointConfiguration config : savedPasspointConfigs) { + savedConfigs.add(new AccessPoint(context, config)); + } + } catch (UnsupportedOperationException e) { + // Passpoint not supported. + } + return savedConfigs; + } + private void showDialog(LongPressAccessPointPreference accessPoint, boolean edit) { if (mDialog != null) { removeDialog(WifiSettings.WIFI_DIALOG_ID); @@ -187,7 +221,17 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment @Override public void onForget(WifiDialog dialog) { if (mSelectedAccessPoint != null) { - mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, null); + if (mSelectedAccessPoint.isPasspointConfig()) { + try { + mWifiManager.removePasspointConfiguration( + mSelectedAccessPoint.getPasspointFqdn()); + } catch (RuntimeException e) { + Log.e(TAG, "Failed to remove Passpoint configuration for " + + mSelectedAccessPoint.getConfigName()); + } + } else { + mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, null); + } mSelectedAccessPoint = null; initPreferences(); } @@ -235,8 +279,8 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment result.add(data); // Add available Wi-Fi access points - final List accessPoints = WifiTracker.getCurrentAccessPoints(context, - true, false, true); + final List accessPoints = + getSavedConfigs(context, context.getSystemService(WifiManager.class)); final int accessPointsSize = accessPoints.size(); for (int i = 0; i < accessPointsSize; ++i){ diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java index 460d2102d2a..4380cbe1fae 100644 --- a/src/com/android/settings/wifi/WifiConfigController.java +++ b/src/com/android/settings/wifi/WifiConfigController.java @@ -217,7 +217,11 @@ public class WifiConfigController implements TextWatcher, mConfigUi.setSubmitButton(res.getString(R.string.wifi_save)); } else { - mConfigUi.setTitle(mAccessPoint.getSsid()); + if (!mAccessPoint.isPasspointConfig()) { + mConfigUi.setTitle(mAccessPoint.getSsid()); + } else { + mConfigUi.setTitle(mAccessPoint.getConfigName()); + } ViewGroup group = (ViewGroup) mView.findViewById(R.id.info); @@ -258,7 +262,8 @@ public class WifiConfigController implements TextWatcher, } } - if ((!mAccessPoint.isSaved() && !mAccessPoint.isActive()) + if ((!mAccessPoint.isSaved() && !mAccessPoint.isActive() + && !mAccessPoint.isPasspointConfig()) || mMode != WifiConfigUiBase.MODE_VIEW) { showSecurityFields(); showIpConfigFields(); @@ -326,7 +331,8 @@ public class WifiConfigController implements TextWatcher, addRow(group, R.string.wifi_security, mAccessPoint.getSecurityString(false)); mView.findViewById(R.id.ip_fields).setVisibility(View.GONE); } - if (mAccessPoint.isSaved() || mAccessPoint.isActive()) { + if (mAccessPoint.isSaved() || mAccessPoint.isActive() + || mAccessPoint.isPasspointConfig()) { mConfigUi.setForgetButton(res.getString(R.string.wifi_forget)); } }