Cache account prefs so we don't lose a11y focus
Fixes: 28767151
Change-Id: I876712c42b02bb2efaaa492ad951ad42935ecb32
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index 493e1db..f809474 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -154,6 +154,7 @@
super.onCreate(icicle);
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.account_sync_settings);
+ getPreferenceScreen().setOrderingAsAdded(false);
setAccessibilityTitle();
setHasOptionsMenu(true);
@@ -234,8 +235,13 @@
}
private void addSyncStateSwitch(Account account, String authority) {
- SyncStateSwitchPreference item =
- new SyncStateSwitchPreference(getPrefContext(), account, authority);
+ SyncStateSwitchPreference item = (SyncStateSwitchPreference) getCachedPreference(authority);
+ if (item == null) {
+ item = new SyncStateSwitchPreference(getPrefContext(), account, authority);
+ getPreferenceScreen().addPreference(item);
+ } else {
+ item.setup(account, authority);
+ }
item.setPersistent(false);
final ProviderInfo providerInfo = getPackageManager().resolveContentProviderAsUser(
authority, 0, mUserHandle.getIdentifier());
@@ -250,7 +256,6 @@
String title = getString(R.string.sync_item_title, providerLabel);
item.setTitle(title);
item.setKey(authority);
- mSwitches.add(item);
}
@Override
@@ -529,14 +534,10 @@
}
}
- for (int i = 0, n = mSwitches.size(); i < n; i++) {
- getPreferenceScreen().removePreference(mSwitches.get(i));
- }
- mSwitches.clear();
-
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "looking for sync adapters that match account " + mAccount);
}
+ cacheRemoveAllPrefs(getPreferenceScreen());
for (int j = 0, m = authorities.size(); j < m; j++) {
final String authority = authorities.get(j);
// We could check services here....
@@ -549,11 +550,7 @@
addSyncStateSwitch(mAccount, authority);
}
}
-
- Collections.sort(mSwitches);
- for (int i = 0, n = mSwitches.size(); i < n; i++) {
- getPreferenceScreen().addPreference(mSwitches.get(i));
- }
+ removeCachedPrefs(getPreferenceScreen());
}
/**
@@ -562,7 +559,6 @@
@Override
protected void onAuthDescriptionsUpdated() {
super.onAuthDescriptionsUpdated();
- getPreferenceScreen().removeAll();
if (mAccount != null) {
mProviderIcon.setImageDrawable(getDrawableForType(mAccount.type));
mProviderId.setText(getLabelForType(mAccount.type));
diff --git a/src/com/android/settings/accounts/SyncStateSwitchPreference.java b/src/com/android/settings/accounts/SyncStateSwitchPreference.java
index 34663e6..c6632d0 100644
--- a/src/com/android/settings/accounts/SyncStateSwitchPreference.java
+++ b/src/com/android/settings/accounts/SyncStateSwitchPreference.java
@@ -51,8 +51,13 @@
public SyncStateSwitchPreference(Context context, Account account, String authority) {
super(context, null, 0, R.style.SyncSwitchPreference);
+ setup(account, authority);
+ }
+
+ public void setup(Account account, String authority) {
mAccount = account;
mAuthority = authority;
+ notifyChanged();
}
@Override