From 636ad9d94753a7377ce5f9f3f885a8a8b2018ee0 Mon Sep 17 00:00:00 2001 From: cosmohsieh Date: Sun, 21 Apr 2019 20:11:39 +0800 Subject: [PATCH] Fix modification of WifiDialog doesn't take effect on details page When clicking modify menu option in detiails page, modification on metered or privacy preferences in the WifiDialog does not effect back to details page but only changing internal data of WifiDialog. Adding callback to update those two preferences. Bug: 130775713 Test: make RunSettingsRoboTests -j32 ROBOTEST_FILTER=com.android.settings.wifi.details.WifiDetailPreferenceControllerTest Change-Id: I74bfa5a9581dfae73894c3e9f73d1069a36fd16b --- .../WifiMeteredPreferenceController.java | 26 ++++++++++++- .../details/WifiNetworkDetailsFragment.java | 28 ++++++++++--- .../WifiPrivacyPreferenceController.java | 39 ++++++++++++++++--- 3 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/wifi/details/WifiMeteredPreferenceController.java b/src/com/android/settings/wifi/details/WifiMeteredPreferenceController.java index 341b2279994..5f4e9d0adb1 100644 --- a/src/com/android/settings/wifi/details/WifiMeteredPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiMeteredPreferenceController.java @@ -24,19 +24,22 @@ import android.net.wifi.WifiManager; import androidx.annotation.VisibleForTesting; import androidx.preference.DropDownPreference; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; +import com.android.settings.wifi.WifiDialog; import com.android.settingslib.core.AbstractPreferenceController; /** * {@link AbstractPreferenceController} that controls whether the wifi network is metered or not */ public class WifiMeteredPreferenceController extends BasePreferenceController implements - Preference.OnPreferenceChangeListener { + Preference.OnPreferenceChangeListener, WifiDialog.WifiDialogListener { private static final String KEY_WIFI_METERED = "metered"; private WifiConfiguration mWifiConfiguration; private WifiManager mWifiManager; + private Preference mPreference; public WifiMeteredPreferenceController(Context context, WifiConfiguration wifiConfiguration) { super(context, KEY_WIFI_METERED); @@ -81,4 +84,25 @@ public class WifiMeteredPreferenceController extends BasePreferenceController im private void updateSummary(DropDownPreference preference, int meteredOverride) { preference.setSummary(preference.getEntries()[meteredOverride]); } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public void onSubmit(WifiDialog dialog) { + if (dialog.getController() != null) { + final WifiConfiguration newConfig = dialog.getController().getConfig(); + if (newConfig == null || mWifiConfiguration == null) { + return; + } + + if (newConfig.meteredOverride != mWifiConfiguration.meteredOverride) { + mWifiConfiguration = newConfig; + onPreferenceChange(mPreference, String.valueOf(newConfig.meteredOverride)); + } + } + } } diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java index 10d1d48f4a2..b645d60bbd2 100644 --- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java +++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java @@ -47,12 +47,14 @@ import java.util.List; *

The AccessPoint should be saved to the intent Extras when launching this class via * {@link AccessPoint#saveWifiState(Bundle)} in order to properly render this page. */ -public class WifiNetworkDetailsFragment extends DashboardFragment { +public class WifiNetworkDetailsFragment extends DashboardFragment implements + WifiDialog.WifiDialogListener { private static final String TAG = "WifiNetworkDetailsFrg"; private AccessPoint mAccessPoint; private WifiDetailPreferenceController mWifiDetailPreferenceController; + private List mWifiDialogListeners = new ArrayList<>(); @Override public void onAttach(Context context) { @@ -89,7 +91,7 @@ public class WifiNetworkDetailsFragment extends DashboardFragment { || mAccessPoint == null) { return null; } - return WifiDialog.createModal(getActivity(), mWifiDetailPreferenceController, mAccessPoint, + return WifiDialog.createModal(getActivity(), this, mAccessPoint, WifiConfigUiBase.MODE_MODIFY); } @@ -135,15 +137,31 @@ public class WifiNetworkDetailsFragment extends DashboardFragment { controllers.add(mWifiDetailPreferenceController); controllers.add(new AddDevicePreferenceController(context).init(mAccessPoint)); - controllers.add(new WifiMeteredPreferenceController(context, mAccessPoint.getConfig())); - WifiPrivacyPreferenceController privacyController = new WifiPrivacyPreferenceController( - context); + + final WifiMeteredPreferenceController meteredPreferenceController = + new WifiMeteredPreferenceController(context, mAccessPoint.getConfig()); + controllers.add(meteredPreferenceController); + + final WifiPrivacyPreferenceController privacyController = + new WifiPrivacyPreferenceController(context); privacyController.setWifiConfiguration(mAccessPoint.getConfig()); privacyController.setIsEphemeral(mAccessPoint.isEphemeral()); privacyController.setIsPasspoint( mAccessPoint.isPasspoint() || mAccessPoint.isPasspointConfig()); controllers.add(privacyController); + // Sets callback listener for wifi dialog. + mWifiDialogListeners.add(mWifiDetailPreferenceController); + mWifiDialogListeners.add(privacyController); + mWifiDialogListeners.add(meteredPreferenceController); + return controllers; } + + @Override + public void onSubmit(WifiDialog dialog) { + for (WifiDialog.WifiDialogListener listener : mWifiDialogListeners) { + listener.onSubmit(dialog); + } + } } diff --git a/src/com/android/settings/wifi/details/WifiPrivacyPreferenceController.java b/src/com/android/settings/wifi/details/WifiPrivacyPreferenceController.java index 7bec4119f8d..950cc131f4a 100644 --- a/src/com/android/settings/wifi/details/WifiPrivacyPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiPrivacyPreferenceController.java @@ -18,16 +18,17 @@ package com.android.settings.wifi.details; import android.content.Context; import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; -import android.util.FeatureFlagUtils; import androidx.annotation.VisibleForTesting; import androidx.preference.DropDownPreference; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; -import com.android.settings.core.FeatureFlags; +import com.android.settings.wifi.WifiDialog; import com.android.settingslib.core.AbstractPreferenceController; /** @@ -35,13 +36,14 @@ import com.android.settingslib.core.AbstractPreferenceController; * or not */ public class WifiPrivacyPreferenceController extends BasePreferenceController implements - Preference.OnPreferenceChangeListener { + Preference.OnPreferenceChangeListener, WifiDialog.WifiDialogListener { private static final String KEY_WIFI_PRIVACY = "privacy"; private WifiConfiguration mWifiConfiguration; private WifiManager mWifiManager; private boolean mIsEphemeral = false; private boolean mIsPasspoint = false; + private Preference mPreference; public WifiPrivacyPreferenceController(Context context) { super(context, KEY_WIFI_PRIVACY); @@ -68,6 +70,12 @@ public class WifiPrivacyPreferenceController extends BasePreferenceController im AVAILABLE : CONDITIONALLY_UNAVAILABLE; } + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + @Override public void updateState(Preference preference) { final DropDownPreference dropDownPreference = (DropDownPreference) preference; @@ -87,9 +95,13 @@ public class WifiPrivacyPreferenceController extends BasePreferenceController im if (mWifiConfiguration != null) { mWifiConfiguration.macRandomizationSetting = Integer.parseInt((String) newValue); mWifiManager.updateNetwork(mWifiConfiguration); - // To activate changing, we need reconnect network. WiFi will auto connect to current - // network after disconnect(). - mWifiManager.disconnect(); + + // To activate changing, we need to reconnect network. WiFi will auto connect to + // current network after disconnect(). Only needed when this is connected network. + final WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); + if (wifiInfo != null && wifiInfo.getNetworkId() == mWifiConfiguration.networkId) { + mWifiManager.disconnect(); + } } updateSummary((DropDownPreference) preference, Integer.parseInt((String) newValue)); return true; @@ -133,4 +145,19 @@ public class WifiPrivacyPreferenceController extends BasePreferenceController im final int prefMacRandomized = translateMacRandomizedValueToPrefValue(macRandomized); preference.setSummary(preference.getEntries()[prefMacRandomized]); } + + @Override + public void onSubmit(WifiDialog dialog) { + if (dialog.getController() != null) { + final WifiConfiguration newConfig = dialog.getController().getConfig(); + if (newConfig == null || mWifiConfiguration == null) { + return; + } + + if (newConfig.macRandomizationSetting != mWifiConfiguration.macRandomizationSetting) { + mWifiConfiguration = newConfig; + onPreferenceChange(mPreference, String.valueOf(newConfig.macRandomizationSetting)); + } + } + } }