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