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;
PreferenceScreen preferenceScreen = getPreferenceScreen();
final Context context = getPrefContext();
- final List<AccessPoint> accessPoints = WifiTracker.getCurrentAccessPoints(context, true,
- false, true);
+ final List<AccessPoint> accessPoints = getSavedConfigs(context, mWifiManager);
Collections.sort(accessPoints, SAVED_NETWORK_COMPARATOR);
preferenceScreen.removeAll();
}
}
+ /**
+ * 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<AccessPoint> getSavedConfigs(Context context, WifiManager wifiManager) {
+ List<AccessPoint> savedConfigs = new ArrayList<>();
+ List<WifiConfiguration> 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<PasspointConfiguration> 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);
@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();
}
result.add(data);
// Add available Wi-Fi access points
- final List<AccessPoint> accessPoints = WifiTracker.getCurrentAccessPoints(context,
- true, false, true);
+ final List<AccessPoint> accessPoints =
+ getSavedConfigs(context, context.getSystemService(WifiManager.class));
final int accessPointsSize = accessPoints.size();
for (int i = 0; i < accessPointsSize; ++i){
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);
}
}
- if ((!mAccessPoint.isSaved() && !mAccessPoint.isActive())
+ if ((!mAccessPoint.isSaved() && !mAccessPoint.isActive()
+ && !mAccessPoint.isPasspointConfig())
|| mMode != WifiConfigUiBase.MODE_VIEW) {
showSecurityFields();
showIpConfigFields();
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));
}
}