diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java index 493e1db3e87..f8094740b53 100644 --- a/src/com/android/settings/accounts/AccountSyncSettings.java +++ b/src/com/android/settings/accounts/AccountSyncSettings.java @@ -154,6 +154,7 @@ public class AccountSyncSettings extends AccountPreferenceBase { super.onCreate(icicle); setPreferenceScreen(null); addPreferencesFromResource(R.xml.account_sync_settings); + getPreferenceScreen().setOrderingAsAdded(false); setAccessibilityTitle(); setHasOptionsMenu(true); @@ -234,8 +235,13 @@ public class AccountSyncSettings extends AccountPreferenceBase { } 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 @@ public class AccountSyncSettings extends AccountPreferenceBase { String title = getString(R.string.sync_item_title, providerLabel); item.setTitle(title); item.setKey(authority); - mSwitches.add(item); } @Override @@ -529,14 +534,10 @@ public class AccountSyncSettings extends AccountPreferenceBase { } } - 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 @@ public class AccountSyncSettings extends AccountPreferenceBase { 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 @@ public class AccountSyncSettings extends AccountPreferenceBase { @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 34663e64995..c6632d0ed62 100644 --- a/src/com/android/settings/accounts/SyncStateSwitchPreference.java +++ b/src/com/android/settings/accounts/SyncStateSwitchPreference.java @@ -51,8 +51,13 @@ public class SyncStateSwitchPreference extends SwitchPreference { 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