Merge "Adjust Color Provider to handle consecutive calls" into main
diff --git a/src/com/android/customization/model/color/ColorProvider.kt b/src/com/android/customization/model/color/ColorProvider.kt
index 79925d8..eb8d8df 100644
--- a/src/com/android/customization/model/color/ColorProvider.kt
+++ b/src/com/android/customization/model/color/ColorProvider.kt
@@ -79,7 +79,8 @@
         }
 
     private var colorsAvailable = true
-    private var colorBundles: List<ColorOption>? = null
+    private var presetColorBundles: List<ColorOption>? = null
+    private var wallpaperColorBundles: List<ColorOption>? = null
     private var homeWallpaperColors: WallpaperColors? = null
     private var lockWallpaperColors: WallpaperColors? = null
 
@@ -96,31 +97,27 @@
         val wallpaperColorsChanged =
             this.homeWallpaperColors != homeWallpaperColors ||
                 this.lockWallpaperColors != lockWallpaperColors
-        if (wallpaperColorsChanged) {
+        if (wallpaperColorsChanged || reload) {
+            loadSeedColors(
+                homeWallpaperColors,
+                lockWallpaperColors,
+            )
             this.homeWallpaperColors = homeWallpaperColors
             this.lockWallpaperColors = lockWallpaperColors
         }
-        if (colorBundles == null || reload || wallpaperColorsChanged) {
+        if (presetColorBundles == null || reload) {
             scope.launch {
                 try {
-                    if (colorBundles == null || reload) {
-                        loadPreset()
-                    }
-                    if (wallpaperColorsChanged || reload) {
-                        loadSeedColors(
-                            homeWallpaperColors,
-                            lockWallpaperColors,
-                        )
-                    }
+                    loadPreset()
                 } catch (e: Throwable) {
                     colorsAvailable = false
                     callback?.onError(e)
                     return@launch
                 }
-                callback?.onOptionsLoaded(colorBundles)
+                callback?.onOptionsLoaded(buildFinalList())
             }
         } else {
-            callback?.onOptionsLoaded(colorBundles)
+            callback?.onOptionsLoaded(buildFinalList())
         }
     }
 
@@ -173,19 +170,7 @@
                 bundles,
             )
         }
-
-        // Insert monochrome in the second position if it is enabled and included in preset
-        // colors
-        if (InjectorProvider.getInjector().getFlags().isMonochromaticThemeEnabled(mContext)) {
-            monochromeBundleName?.let {
-                bundles.add(1, buildPreset(it, -1, Style.MONOCHROMATIC, ColorType.WALLPAPER_COLOR))
-            }
-        }
-        bundles.addAll(
-            colorBundles?.filterNot { (it as ColorOptionImpl).type == ColorType.WALLPAPER_COLOR }
-                ?: emptyList()
-        )
-        colorBundles = bundles
+        wallpaperColorBundles = bundles
     }
 
     private fun buildColorSeeds(
@@ -381,7 +366,7 @@
                 monochromeBundleName = null
             }
 
-            colorBundles = bundles
+            presetColorBundles = bundles
         }
 
     private fun buildPreset(
@@ -425,4 +410,22 @@
         builder.darkColors = darkColors
         return builder.build()
     }
+
+    private fun buildFinalList(): List<ColorOption> {
+        val presetColors = presetColorBundles ?: emptyList()
+        val wallpaperColors = wallpaperColorBundles?.toMutableList() ?: mutableListOf()
+        // Insert monochrome in the second position if it is enabled and included in preset
+        // colors
+        if (InjectorProvider.getInjector().getFlags().isMonochromaticThemeEnabled(mContext)) {
+            monochromeBundleName?.let {
+                if (wallpaperColors.isNotEmpty()) {
+                    wallpaperColors.add(
+                        1,
+                        buildPreset(it, -1, Style.MONOCHROMATIC, ColorType.WALLPAPER_COLOR)
+                    )
+                }
+            }
+        }
+        return wallpaperColors + presetColors
+    }
 }