Merge "Controls UI - Correctly persist seeding state" into rvc-dev
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
index ebdcdcc..40c8c6b 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
@@ -200,9 +200,9 @@
                     GlobalActionsDialog.PREFS_CONTROLS_FILE, Context.MODE_PRIVATE)
                 val completedSeedingPackageSet = prefs.getStringSet(
                     GlobalActionsDialog.PREFS_CONTROLS_SEEDING_COMPLETED, mutableSetOf<String>())
-                val favoritePackageSet = favoriteComponentSet.map { it.packageName }
+                val servicePackageSet = serviceInfoSet.map { it.packageName }
                 prefs.edit().putStringSet(GlobalActionsDialog.PREFS_CONTROLS_SEEDING_COMPLETED,
-                    completedSeedingPackageSet.intersect(favoritePackageSet)).apply()
+                    completedSeedingPackageSet.intersect(servicePackageSet)).apply()
 
                 var changed = false
                 favoriteComponentSet.subtract(serviceInfoSet).forEach {
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index bc95a25..9150921 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -247,7 +247,6 @@
     private final Executor mBackgroundExecutor;
     private List<ControlsServiceInfo> mControlsServiceInfos = new ArrayList<>();
     private Optional<ControlsController> mControlsControllerOptional;
-    private SharedPreferences mControlsPreferences;
     private final RingerModeTracker mRingerModeTracker;
     private int mDialogPressDelay = DIALOG_PRESS_DELAY; // ms
     private Handler mMainHandler;
@@ -405,12 +404,6 @@
                     });
         }
 
-        // Need to be user-specific with the context to make sure we read the correct prefs
-        Context userContext = context.createContextAsUser(
-                new UserHandle(mUserManager.getUserHandle()), 0);
-        mControlsPreferences = userContext.getSharedPreferences(PREFS_CONTROLS_FILE,
-            Context.MODE_PRIVATE);
-
         // Listen for changes to show controls on the power menu while locked
         onPowerMenuLockScreenSettingsChanged();
         mContext.getContentResolver().registerContentObserver(
@@ -444,19 +437,22 @@
                 Collections.emptySet());
 
         List<ComponentName> componentsToSeed = new ArrayList<>();
-        for (ControlsServiceInfo info : mControlsServiceInfos) {
-            String pkg = info.componentName.getPackageName();
-            if (seededPackages.contains(pkg)
-                    || mControlsControllerOptional.get().countFavoritesForComponent(
-                            info.componentName) > 0) {
-                continue;
-            }
-
-            for (int i = 0; i < Math.min(SEEDING_MAX, preferredControlsPackages.length); i++) {
-                if (pkg.equals(preferredControlsPackages[i])) {
-                    componentsToSeed.add(info.componentName);
+        for (int i = 0; i < Math.min(SEEDING_MAX, preferredControlsPackages.length); i++) {
+            String pkg = preferredControlsPackages[i];
+            for (ControlsServiceInfo info : mControlsServiceInfos) {
+                if (!pkg.equals(info.componentName.getPackageName())) continue;
+                if (seededPackages.contains(pkg)) {
+                    break;
+                } else if (mControlsControllerOptional.get()
+                        .countFavoritesForComponent(info.componentName) > 0) {
+                    // When there are existing controls but no saved preference, assume it
+                    // is out of sync, perhaps through a device restore, and update the
+                    // preference
+                    addPackageToSeededSet(prefs, pkg);
                     break;
                 }
+                componentsToSeed.add(info.componentName);
+                break;
             }
         }
 
@@ -466,16 +462,20 @@
                 componentsToSeed,
                 (response) -> {
                     Log.d(TAG, "Controls seeded: " + response);
-                    Set<String> completedPkgs = prefs.getStringSet(PREFS_CONTROLS_SEEDING_COMPLETED,
-                                                                   new HashSet<String>());
                     if (response.getAccepted()) {
-                        completedPkgs.add(response.getPackageName());
-                        prefs.edit().putStringSet(PREFS_CONTROLS_SEEDING_COMPLETED,
-                                                  completedPkgs).apply();
+                        addPackageToSeededSet(prefs, response.getPackageName());
                     }
                 });
     }
 
+    private void addPackageToSeededSet(SharedPreferences prefs, String pkg) {
+        Set<String> seededPackages = prefs.getStringSet(PREFS_CONTROLS_SEEDING_COMPLETED,
+                Collections.emptySet());
+        Set<String> updatedPkgs = new HashSet<>(seededPackages);
+        updatedPkgs.add(pkg);
+        prefs.edit().putStringSet(PREFS_CONTROLS_SEEDING_COMPLETED, updatedPkgs).apply();
+    }
+
     /**
      * Show the global actions dialog (creating if necessary)
      *