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