Fix Wi-Fi "Network usage" and "Privacy" drop down

Currently, these are implemented with DropDownPreference, which keeps
disappearing after opening. This is because this page is special, many
other preferences on this page auto refreshed every some seconds,
causing the container RecyclerView to re-render (and a scrollbar is
displayed when re-render happens). This re-renders cause the drop downs
to auto dismiss.

Use ListPreference instead can solve this issue, because
DropDownPreference is extended from ListPreference, this is simple
change.

Fix: 209799515
Test: manual
Change-Id: Ib098922c39d9d6c56d645f12f5884489ea6688be
This commit is contained in:
Chaohui Wang
2022-04-30 13:05:41 +08:00
parent af5a015198
commit e0ff6f8dd6
3 changed files with 19 additions and 20 deletions

View File

@@ -21,7 +21,7 @@ import android.content.Context;
import android.net.wifi.WifiConfiguration;
import androidx.annotation.VisibleForTesting;
import androidx.preference.DropDownPreference;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -30,13 +30,13 @@ import com.android.settings.wifi.WifiDialog2;
import com.android.wifitrackerlib.WifiEntry;
/**
* {@link AbstractPreferenceController} that controls whether the wifi network is metered or not
* A controller that controls whether the Wi-Fi network is metered or not.
*/
public class WifiMeteredPreferenceController2 extends BasePreferenceController implements
Preference.OnPreferenceChangeListener, WifiDialog2.WifiDialog2Listener {
private static final String KEY_WIFI_METERED = "metered";
private WifiEntry mWifiEntry;
private final WifiEntry mWifiEntry;
private Preference mPreference;
public WifiMeteredPreferenceController2(Context context, WifiEntry wifiEntry) {
@@ -46,11 +46,11 @@ public class WifiMeteredPreferenceController2 extends BasePreferenceController i
@Override
public void updateState(Preference preference) {
final DropDownPreference dropDownPreference = (DropDownPreference) preference;
final ListPreference listPreference = (ListPreference) preference;
final int meteredOverride = getMeteredOverride();
preference.setSelectable(mWifiEntry.canSetMeteredChoice());
dropDownPreference.setValue(Integer.toString(meteredOverride));
updateSummary(dropDownPreference, meteredOverride);
listPreference.setValue(Integer.toString(meteredOverride));
updateSummary(listPreference, meteredOverride);
}
@Override
@@ -66,7 +66,7 @@ public class WifiMeteredPreferenceController2 extends BasePreferenceController i
// Stage the backup of the SettingsProvider package which backs this up
BackupManager.dataChanged("com.android.providers.settings");
updateSummary((DropDownPreference) preference, getMeteredOverride());
updateSummary((ListPreference) preference, getMeteredOverride());
return true;
}
@@ -79,7 +79,7 @@ public class WifiMeteredPreferenceController2 extends BasePreferenceController i
return WifiEntry.METERED_CHOICE_AUTO;
}
private void updateSummary(DropDownPreference preference, int meteredOverride) {
private void updateSummary(ListPreference preference, int meteredOverride) {
preference.setSummary(preference.getEntries()[meteredOverride]);
}

View File

@@ -21,7 +21,7 @@ import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import androidx.annotation.VisibleForTesting;
import androidx.preference.DropDownPreference;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -31,14 +31,13 @@ import com.android.settings.wifi.WifiDialog2;
import com.android.wifitrackerlib.WifiEntry;
/**
* {@link AbstractPreferenceController} that controls whether the wifi network is mac randomized
* or not
* A controller that controls whether the Wi-Fi network is mac randomized or not.
*/
public class WifiPrivacyPreferenceController2 extends BasePreferenceController implements
Preference.OnPreferenceChangeListener, WifiDialog2.WifiDialog2Listener {
private static final String KEY_WIFI_PRIVACY = "privacy";
private WifiManager mWifiManager;
private final WifiManager mWifiManager;
private WifiEntry mWifiEntry;
private Preference mPreference;
@@ -66,16 +65,16 @@ public class WifiPrivacyPreferenceController2 extends BasePreferenceController i
@Override
public void updateState(Preference preference) {
final DropDownPreference dropDownPreference = (DropDownPreference) preference;
final ListPreference listPreference = (ListPreference) preference;
final int randomizationLevel = getRandomizationValue();
final boolean isSelectable = mWifiEntry.canSetPrivacy();
preference.setSelectable(isSelectable);
dropDownPreference.setValue(Integer.toString(randomizationLevel));
updateSummary(dropDownPreference, randomizationLevel);
listPreference.setValue(Integer.toString(randomizationLevel));
updateSummary(listPreference, randomizationLevel);
// If the preference cannot be selectable, display a temporary network in the summary.
if (!isSelectable) {
dropDownPreference.setSummary(R.string.wifi_privacy_settings_ephemeral_summary);
listPreference.setSummary(R.string.wifi_privacy_settings_ephemeral_summary);
}
}
@@ -90,7 +89,7 @@ public class WifiPrivacyPreferenceController2 extends BasePreferenceController i
mWifiEntry.disconnect(null /* callback */);
mWifiEntry.connect(null /* callback */);
}
updateSummary((DropDownPreference) preference, privacy);
updateSummary((ListPreference) preference, privacy);
return true;
}
@@ -124,7 +123,7 @@ public class WifiPrivacyPreferenceController2 extends BasePreferenceController i
? WifiEntry.PRIVACY_RANDOMIZED_MAC : WifiEntry.PRIVACY_DEVICE_MAC;
}
private void updateSummary(DropDownPreference preference, int macRandomized) {
private void updateSummary(ListPreference preference, int macRandomized) {
// Translates value here to set RANDOMIZATION_PERSISTENT as first item in UI for better UX.
final int prefMacRandomized = translateMacRandomizedValueToPrefValue(macRandomized);
preference.setSummary(preference.getEntries()[prefMacRandomized]);