Workarounds to avoid removing all prefs
Removing all prefs causes ugly animations, so avoid it at all cost and cache all the prefs (while still added) as long as possible. Bug: 26271353 Change-Id: I33b84d751938b460f4b66c0158057407dd45d974
This commit is contained in:
@@ -34,6 +34,7 @@ import android.support.v7.preference.PreferenceViewHolder;
|
|||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.ArrayMap;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
@@ -97,6 +98,7 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
|||||||
private View mEmptyView;
|
private View mEmptyView;
|
||||||
private LinearLayoutManager mLayoutManager;
|
private LinearLayoutManager mLayoutManager;
|
||||||
private HighlightablePreferenceGroupAdapter mAdapter;
|
private HighlightablePreferenceGroupAdapter mAdapter;
|
||||||
|
private ArrayMap<String, Preference> mPreferenceCache;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
@@ -367,6 +369,28 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
|||||||
return mAdapter;
|
return mAdapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void cacheRemoveAllPrefs(PreferenceGroup group) {
|
||||||
|
mPreferenceCache = new ArrayMap<String, Preference>();
|
||||||
|
final int N = group.getPreferenceCount();
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
Preference p = group.getPreference(i);
|
||||||
|
if (TextUtils.isEmpty(p.getKey())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
mPreferenceCache.put(p.getKey(), p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Preference getCachedPreference(String key) {
|
||||||
|
return mPreferenceCache != null ? mPreferenceCache.remove(key) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removeCachedPrefs(PreferenceGroup group) {
|
||||||
|
for (Preference p : mPreferenceCache.values()) {
|
||||||
|
group.removePreference(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void highlightPreference(String key) {
|
private void highlightPreference(String key) {
|
||||||
final int position = canUseListViewForHighLighting(key);
|
final int position = canUseListViewForHighLighting(key);
|
||||||
if (position >= 0) {
|
if (position >= 0) {
|
||||||
|
@@ -84,6 +84,10 @@ public final class BluetoothDevicePreference extends Preference implements
|
|||||||
onDeviceAttributesChanged();
|
onDeviceAttributesChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rebind() {
|
||||||
|
notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
CachedBluetoothDevice getCachedDevice() {
|
CachedBluetoothDevice getCachedDevice() {
|
||||||
return mCachedDevice;
|
return mCachedDevice;
|
||||||
}
|
}
|
||||||
|
@@ -39,7 +39,6 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.android.internal.logging.MetricsLogger;
|
import com.android.internal.logging.MetricsLogger;
|
||||||
import com.android.internal.logging.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.MetricsProto.MetricsEvent;
|
||||||
import com.android.settings.LinkifyUtils;
|
import com.android.settings.LinkifyUtils;
|
||||||
@@ -77,6 +76,8 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
|
|||||||
private static final String BTOPP_ACTION_OPEN_RECEIVED_FILES =
|
private static final String BTOPP_ACTION_OPEN_RECEIVED_FILES =
|
||||||
"android.btopp.intent.action.OPEN_RECEIVED_FILES";
|
"android.btopp.intent.action.OPEN_RECEIVED_FILES";
|
||||||
|
|
||||||
|
private static final String KEY_PAIRED_DEVICES = "paired_devices";
|
||||||
|
|
||||||
private static View mSettingsDialogView = null;
|
private static View mSettingsDialogView = null;
|
||||||
|
|
||||||
private BluetoothEnabler mBluetoothEnabler;
|
private BluetoothEnabler mBluetoothEnabler;
|
||||||
@@ -154,6 +155,21 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
|
|||||||
void addPreferencesForActivity() {
|
void addPreferencesForActivity() {
|
||||||
addPreferencesFromResource(R.xml.bluetooth_settings);
|
addPreferencesFromResource(R.xml.bluetooth_settings);
|
||||||
|
|
||||||
|
mPairedDevicesCategory = new PreferenceCategory(getPrefContext());
|
||||||
|
mPairedDevicesCategory.setKey(KEY_PAIRED_DEVICES);
|
||||||
|
mPairedDevicesCategory.setOrder(1);
|
||||||
|
getPreferenceScreen().addPreference(mPairedDevicesCategory);
|
||||||
|
|
||||||
|
mAvailableDevicesCategory = new BluetoothProgressCategory(getActivity());
|
||||||
|
mAvailableDevicesCategory.setSelectable(false);
|
||||||
|
mAvailableDevicesCategory.setOrder(2);
|
||||||
|
getPreferenceScreen().addPreference(mAvailableDevicesCategory);
|
||||||
|
|
||||||
|
mMyDevicePreference = new Preference(getPrefContext());
|
||||||
|
mMyDevicePreference.setSelectable(false);
|
||||||
|
mMyDevicePreference.setOrder(3);
|
||||||
|
getPreferenceScreen().addPreference(mMyDevicePreference);
|
||||||
|
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,14 +291,15 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
|
|||||||
|
|
||||||
private void addDeviceCategory(PreferenceGroup preferenceGroup, int titleId,
|
private void addDeviceCategory(PreferenceGroup preferenceGroup, int titleId,
|
||||||
BluetoothDeviceFilter.Filter filter, boolean addCachedDevices) {
|
BluetoothDeviceFilter.Filter filter, boolean addCachedDevices) {
|
||||||
|
cacheRemoveAllPrefs(preferenceGroup);
|
||||||
preferenceGroup.setTitle(titleId);
|
preferenceGroup.setTitle(titleId);
|
||||||
getPreferenceScreen().addPreference(preferenceGroup);
|
|
||||||
setFilter(filter);
|
setFilter(filter);
|
||||||
setDeviceListGroup(preferenceGroup);
|
setDeviceListGroup(preferenceGroup);
|
||||||
if (addCachedDevices) {
|
if (addCachedDevices) {
|
||||||
addCachedDevices();
|
addCachedDevices();
|
||||||
}
|
}
|
||||||
preferenceGroup.setEnabled(true);
|
preferenceGroup.setEnabled(true);
|
||||||
|
removeCachedPrefs(preferenceGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateContent(int bluetoothState) {
|
private void updateContent(int bluetoothState) {
|
||||||
@@ -291,8 +308,6 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
|
|||||||
|
|
||||||
switch (bluetoothState) {
|
switch (bluetoothState) {
|
||||||
case BluetoothAdapter.STATE_ON:
|
case BluetoothAdapter.STATE_ON:
|
||||||
preferenceScreen.removeAll();
|
|
||||||
preferenceScreen.setOrderingAsAdded(true);
|
|
||||||
mDevicePreferenceMap.clear();
|
mDevicePreferenceMap.clear();
|
||||||
|
|
||||||
if (isUiRestricted()) {
|
if (isUiRestricted()) {
|
||||||
@@ -301,44 +316,32 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Paired devices category
|
// Paired devices category
|
||||||
if (mPairedDevicesCategory == null) {
|
|
||||||
mPairedDevicesCategory = new PreferenceCategory(getPrefContext());
|
|
||||||
} else {
|
|
||||||
mPairedDevicesCategory.removeAll();
|
|
||||||
}
|
|
||||||
addDeviceCategory(mPairedDevicesCategory,
|
addDeviceCategory(mPairedDevicesCategory,
|
||||||
R.string.bluetooth_preference_paired_devices,
|
R.string.bluetooth_preference_paired_devices,
|
||||||
BluetoothDeviceFilter.BONDED_DEVICE_FILTER, true);
|
BluetoothDeviceFilter.BONDED_DEVICE_FILTER, true);
|
||||||
int numberOfPairedDevices = mPairedDevicesCategory.getPreferenceCount();
|
int numberOfPairedDevices = mPairedDevicesCategory.getPreferenceCount();
|
||||||
|
|
||||||
if (isUiRestricted() || numberOfPairedDevices <= 0) {
|
if (isUiRestricted() || numberOfPairedDevices <= 0) {
|
||||||
|
if (preferenceScreen.findPreference(KEY_PAIRED_DEVICES) != null) {
|
||||||
preferenceScreen.removePreference(mPairedDevicesCategory);
|
preferenceScreen.removePreference(mPairedDevicesCategory);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (preferenceScreen.findPreference(KEY_PAIRED_DEVICES) == null) {
|
||||||
|
preferenceScreen.addPreference(mPairedDevicesCategory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Available devices category
|
// Available devices category
|
||||||
if (mAvailableDevicesCategory == null) {
|
|
||||||
mAvailableDevicesCategory = new BluetoothProgressCategory(getActivity());
|
|
||||||
mAvailableDevicesCategory.setSelectable(false);
|
|
||||||
} else {
|
|
||||||
mAvailableDevicesCategory.removeAll();
|
|
||||||
}
|
|
||||||
addDeviceCategory(mAvailableDevicesCategory,
|
addDeviceCategory(mAvailableDevicesCategory,
|
||||||
R.string.bluetooth_preference_found_devices,
|
R.string.bluetooth_preference_found_devices,
|
||||||
BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER, mInitialScanStarted);
|
BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER, mInitialScanStarted);
|
||||||
int numberOfAvailableDevices = mAvailableDevicesCategory.getPreferenceCount();
|
|
||||||
|
|
||||||
if (!mInitialScanStarted) {
|
if (!mInitialScanStarted) {
|
||||||
startScanning();
|
startScanning();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mMyDevicePreference == null) {
|
|
||||||
mMyDevicePreference = new Preference(getPrefContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
mMyDevicePreference.setSummary(getResources().getString(
|
mMyDevicePreference.setSummary(getResources().getString(
|
||||||
R.string.bluetooth_is_visible_message, mLocalAdapter.getName()));
|
R.string.bluetooth_is_visible_message, mLocalAdapter.getName()));
|
||||||
mMyDevicePreference.setSelectable(false);
|
|
||||||
preferenceScreen.addPreference(mMyDevicePreference);
|
|
||||||
|
|
||||||
getActivity().invalidateOptionsMenu();
|
getActivity().invalidateOptionsMenu();
|
||||||
|
|
||||||
|
@@ -176,11 +176,19 @@ public abstract class DeviceListPreferenceFragment extends
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BluetoothDevicePreference preference = new BluetoothDevicePreference(
|
String key = cachedDevice.getDevice().getAddress();
|
||||||
getPrefContext(), cachedDevice);
|
BluetoothDevicePreference preference = (BluetoothDevicePreference) getCachedPreference(key);
|
||||||
|
|
||||||
|
if (preference == null) {
|
||||||
|
preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice);
|
||||||
|
mDeviceListGroup.addPreference(preference);
|
||||||
|
} else {
|
||||||
|
// Tell the preference it is being re-used in case there is new info in the
|
||||||
|
// cached device.
|
||||||
|
preference.rebind();
|
||||||
|
}
|
||||||
|
|
||||||
initDevicePreference(preference);
|
initDevicePreference(preference);
|
||||||
mDeviceListGroup.addPreference(preference);
|
|
||||||
mDevicePreferenceMap.put(cachedDevice, preference);
|
mDevicePreferenceMap.put(cachedDevice, preference);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -649,19 +649,22 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
|
|
||||||
boolean hasAvailableAccessPoints = false;
|
boolean hasAvailableAccessPoints = false;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
cacheRemoveAllPrefs(getPreferenceScreen());
|
||||||
for (AccessPoint accessPoint : accessPoints) {
|
for (AccessPoint accessPoint : accessPoints) {
|
||||||
// Ignore access points that are out of range.
|
// Ignore access points that are out of range.
|
||||||
if (accessPoint.getLevel() != -1) {
|
if (accessPoint.getLevel() != -1) {
|
||||||
|
String key = accessPoint.getBssid();
|
||||||
hasAvailableAccessPoints = true;
|
hasAvailableAccessPoints = true;
|
||||||
if (accessPoint.getTag() != null) {
|
LongPressAccessPointPreference pref = (LongPressAccessPointPreference)
|
||||||
final Preference pref = (Preference) accessPoint.getTag();
|
getCachedPreference(key);
|
||||||
|
if (pref != null) {
|
||||||
pref.setOrder(index++);
|
pref.setOrder(index++);
|
||||||
getPreferenceScreen().addPreference(pref);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
LongPressAccessPointPreference
|
LongPressAccessPointPreference
|
||||||
preference = new LongPressAccessPointPreference(accessPoint,
|
preference = new LongPressAccessPointPreference(accessPoint,
|
||||||
getPrefContext(), mUserBadgeCache, false, this);
|
getPrefContext(), mUserBadgeCache, false, this);
|
||||||
|
preference.setKey(key);
|
||||||
preference.setOrder(index++);
|
preference.setOrder(index++);
|
||||||
|
|
||||||
if (mOpenSsid != null && mOpenSsid.equals(accessPoint.getSsidStr())
|
if (mOpenSsid != null && mOpenSsid.equals(accessPoint.getSsidStr())
|
||||||
@@ -674,6 +677,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
accessPoint.setListener(this);
|
accessPoint.setListener(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
removeCachedPrefs(getPreferenceScreen());
|
||||||
if (!hasAvailableAccessPoints) {
|
if (!hasAvailableAccessPoints) {
|
||||||
setProgressBarVisible(true);
|
setProgressBarVisible(true);
|
||||||
Preference pref = new Preference(getContext()) {
|
Preference pref = new Preference(getContext()) {
|
||||||
|
Reference in New Issue
Block a user