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
This commit is contained in:
cosmohsieh
2019-04-21 20:11:39 +08:00
parent dd310fa892
commit 636ad9d947
3 changed files with 81 additions and 12 deletions

View File

@@ -24,19 +24,22 @@ import android.net.wifi.WifiManager;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.preference.DropDownPreference; import androidx.preference.DropDownPreference;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.wifi.WifiDialog;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
/** /**
* {@link AbstractPreferenceController} that controls whether the wifi network is metered or not * {@link AbstractPreferenceController} that controls whether the wifi network is metered or not
*/ */
public class WifiMeteredPreferenceController extends BasePreferenceController implements public class WifiMeteredPreferenceController extends BasePreferenceController implements
Preference.OnPreferenceChangeListener { Preference.OnPreferenceChangeListener, WifiDialog.WifiDialogListener {
private static final String KEY_WIFI_METERED = "metered"; private static final String KEY_WIFI_METERED = "metered";
private WifiConfiguration mWifiConfiguration; private WifiConfiguration mWifiConfiguration;
private WifiManager mWifiManager; private WifiManager mWifiManager;
private Preference mPreference;
public WifiMeteredPreferenceController(Context context, WifiConfiguration wifiConfiguration) { public WifiMeteredPreferenceController(Context context, WifiConfiguration wifiConfiguration) {
super(context, KEY_WIFI_METERED); super(context, KEY_WIFI_METERED);
@@ -81,4 +84,25 @@ public class WifiMeteredPreferenceController extends BasePreferenceController im
private void updateSummary(DropDownPreference preference, int meteredOverride) { private void updateSummary(DropDownPreference preference, int meteredOverride) {
preference.setSummary(preference.getEntries()[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));
}
}
}
} }

View File

@@ -47,12 +47,14 @@ import java.util.List;
* <p>The AccessPoint should be saved to the intent Extras when launching this class via * <p>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. * {@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 static final String TAG = "WifiNetworkDetailsFrg";
private AccessPoint mAccessPoint; private AccessPoint mAccessPoint;
private WifiDetailPreferenceController mWifiDetailPreferenceController; private WifiDetailPreferenceController mWifiDetailPreferenceController;
private List<WifiDialog.WifiDialogListener> mWifiDialogListeners = new ArrayList<>();
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
@@ -89,7 +91,7 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
|| mAccessPoint == null) { || mAccessPoint == null) {
return null; return null;
} }
return WifiDialog.createModal(getActivity(), mWifiDetailPreferenceController, mAccessPoint, return WifiDialog.createModal(getActivity(), this, mAccessPoint,
WifiConfigUiBase.MODE_MODIFY); WifiConfigUiBase.MODE_MODIFY);
} }
@@ -135,15 +137,31 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
controllers.add(mWifiDetailPreferenceController); controllers.add(mWifiDetailPreferenceController);
controllers.add(new AddDevicePreferenceController(context).init(mAccessPoint)); controllers.add(new AddDevicePreferenceController(context).init(mAccessPoint));
controllers.add(new WifiMeteredPreferenceController(context, mAccessPoint.getConfig()));
WifiPrivacyPreferenceController privacyController = new WifiPrivacyPreferenceController( final WifiMeteredPreferenceController meteredPreferenceController =
context); new WifiMeteredPreferenceController(context, mAccessPoint.getConfig());
controllers.add(meteredPreferenceController);
final WifiPrivacyPreferenceController privacyController =
new WifiPrivacyPreferenceController(context);
privacyController.setWifiConfiguration(mAccessPoint.getConfig()); privacyController.setWifiConfiguration(mAccessPoint.getConfig());
privacyController.setIsEphemeral(mAccessPoint.isEphemeral()); privacyController.setIsEphemeral(mAccessPoint.isEphemeral());
privacyController.setIsPasspoint( privacyController.setIsPasspoint(
mAccessPoint.isPasspoint() || mAccessPoint.isPasspointConfig()); mAccessPoint.isPasspoint() || mAccessPoint.isPasspointConfig());
controllers.add(privacyController); controllers.add(privacyController);
// Sets callback listener for wifi dialog.
mWifiDialogListeners.add(mWifiDetailPreferenceController);
mWifiDialogListeners.add(privacyController);
mWifiDialogListeners.add(meteredPreferenceController);
return controllers; return controllers;
} }
@Override
public void onSubmit(WifiDialog dialog) {
for (WifiDialog.WifiDialogListener listener : mWifiDialogListeners) {
listener.onSubmit(dialog);
}
}
} }

View File

@@ -18,16 +18,17 @@ package com.android.settings.wifi.details;
import android.content.Context; import android.content.Context;
import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.util.FeatureFlagUtils;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.preference.DropDownPreference; import androidx.preference.DropDownPreference;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.FeatureFlags; import com.android.settings.wifi.WifiDialog;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
/** /**
@@ -35,13 +36,14 @@ import com.android.settingslib.core.AbstractPreferenceController;
* or not * or not
*/ */
public class WifiPrivacyPreferenceController extends BasePreferenceController implements public class WifiPrivacyPreferenceController extends BasePreferenceController implements
Preference.OnPreferenceChangeListener { Preference.OnPreferenceChangeListener, WifiDialog.WifiDialogListener {
private static final String KEY_WIFI_PRIVACY = "privacy"; private static final String KEY_WIFI_PRIVACY = "privacy";
private WifiConfiguration mWifiConfiguration; private WifiConfiguration mWifiConfiguration;
private WifiManager mWifiManager; private WifiManager mWifiManager;
private boolean mIsEphemeral = false; private boolean mIsEphemeral = false;
private boolean mIsPasspoint = false; private boolean mIsPasspoint = false;
private Preference mPreference;
public WifiPrivacyPreferenceController(Context context) { public WifiPrivacyPreferenceController(Context context) {
super(context, KEY_WIFI_PRIVACY); super(context, KEY_WIFI_PRIVACY);
@@ -68,6 +70,12 @@ public class WifiPrivacyPreferenceController extends BasePreferenceController im
AVAILABLE : CONDITIONALLY_UNAVAILABLE; AVAILABLE : CONDITIONALLY_UNAVAILABLE;
} }
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
}
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
final DropDownPreference dropDownPreference = (DropDownPreference) preference; final DropDownPreference dropDownPreference = (DropDownPreference) preference;
@@ -87,10 +95,14 @@ public class WifiPrivacyPreferenceController extends BasePreferenceController im
if (mWifiConfiguration != null) { if (mWifiConfiguration != null) {
mWifiConfiguration.macRandomizationSetting = Integer.parseInt((String) newValue); mWifiConfiguration.macRandomizationSetting = Integer.parseInt((String) newValue);
mWifiManager.updateNetwork(mWifiConfiguration); mWifiManager.updateNetwork(mWifiConfiguration);
// To activate changing, we need reconnect network. WiFi will auto connect to current
// network after 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(); mWifiManager.disconnect();
} }
}
updateSummary((DropDownPreference) preference, Integer.parseInt((String) newValue)); updateSummary((DropDownPreference) preference, Integer.parseInt((String) newValue));
return true; return true;
} }
@@ -133,4 +145,19 @@ public class WifiPrivacyPreferenceController extends BasePreferenceController im
final int prefMacRandomized = translateMacRandomizedValueToPrefValue(macRandomized); final int prefMacRandomized = translateMacRandomizedValueToPrefValue(macRandomized);
preference.setSummary(preference.getEntries()[prefMacRandomized]); 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));
}
}
}
} }