Merge "Update previews on color config change (2/2)" into main
diff --git a/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModel.kt b/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModel.kt
index 2bcb644..f51d966 100644
--- a/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModel.kt
+++ b/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModel.kt
@@ -22,6 +22,7 @@
 import javax.inject.Inject
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.combine
 
 @ViewModelScoped
@@ -31,7 +32,8 @@
     private val isDarkMode = interactor.isDarkMode
     val isEnabled = interactor.isEnabled
 
-    private val overridingIsDarkMode = MutableStateFlow<Boolean?>(null)
+    private val _overridingIsDarkMode = MutableStateFlow<Boolean?>(null)
+    val overridingIsDarkMode = _overridingIsDarkMode.asStateFlow()
     val previewingIsDarkMode =
         combine(overridingIsDarkMode, isDarkMode, isEnabled) { override, current, isEnabled ->
             if (isEnabled) {
@@ -41,7 +43,8 @@
 
     val toggleDarkMode =
         combine(overridingIsDarkMode, isDarkMode) { override, current ->
-            { overridingIsDarkMode.value = override?.not() ?: !current }
+            // Only set override if its value is different from current, else set to null
+            { _overridingIsDarkMode.value = if (override == null) !current else null }
         }
 
     val onApply: Flow<(suspend () -> Unit)?> =
@@ -55,6 +58,6 @@
         }
 
     fun resetPreview() {
-        overridingIsDarkMode.value = null
+        _overridingIsDarkMode.value = null
     }
 }
diff --git a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
index 469db6d..6bdd6ce 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
@@ -238,6 +238,7 @@
         context: Context,
         clockHostView: View,
         viewModel: CustomizationPickerViewModel2,
+        colorUpdateViewModel: ColorUpdateViewModel,
         lifecycleOwner: LifecycleOwner,
         clockViewFactory: ClockViewFactory,
     ) {
@@ -295,12 +296,12 @@
                             clockPickerViewModel.previewingSeedColor,
                             clockPickerViewModel.previewingClock,
                             clockPickerViewModel.previewingFontAxisMap,
-                            ::Triple,
+                            colorUpdateViewModel.systemColorsUpdated,
+                            ::Quadruple,
                         )
-                        .collect { triple ->
-                            val (color, clock, axisMap) = triple
+                        .collect { quadruple ->
+                            val (color, clock, axisMap, _) = quadruple
                             clockViewFactory.updateColor(clock.clockId, color)
-
                             val axisList = axisMap.map { ClockFontAxisSetting(it.key, it.value) }
                             clockViewFactory.updateFontAxes(clock.clockId, axisList)
                         }
@@ -308,4 +309,6 @@
             }
         }
     }
+
+    data class Quadruple<A, B, C, D>(val first: A, val second: B, val third: C, val fourth: D)
 }
diff --git a/src/com/android/wallpaper/picker/common/preview/ui/binder/ThemePickerWorkspaceCallbackBinder.kt b/src/com/android/wallpaper/picker/common/preview/ui/binder/ThemePickerWorkspaceCallbackBinder.kt
index 0656696..6952d91 100644
--- a/src/com/android/wallpaper/picker/common/preview/ui/binder/ThemePickerWorkspaceCallbackBinder.kt
+++ b/src/com/android/wallpaper/picker/common/preview/ui/binder/ThemePickerWorkspaceCallbackBinder.kt
@@ -39,6 +39,7 @@
 import com.android.wallpaper.customization.ui.viewmodel.ThemePickerCustomizationOptionsViewModel
 import com.android.wallpaper.model.Screen
 import com.android.wallpaper.picker.common.preview.ui.binder.WorkspaceCallbackBinder.Companion.sendMessage
+import com.android.wallpaper.picker.customization.ui.viewmodel.ColorUpdateViewModel
 import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationOptionsViewModel
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -56,12 +57,14 @@
     override fun bind(
         workspaceCallback: Message,
         viewModel: CustomizationOptionsViewModel,
+        colorUpdateViewModel: ColorUpdateViewModel,
         screen: Screen,
         lifecycleOwner: LifecycleOwner,
     ) {
         defaultWorkspaceCallbackBinder.bind(
             workspaceCallback = workspaceCallback,
             viewModel = viewModel,
+            colorUpdateViewModel = colorUpdateViewModel,
             screen = screen,
             lifecycleOwner = lifecycleOwner,
         )
@@ -158,10 +161,11 @@
                         launch {
                             combine(
                                     viewModel.colorPickerViewModel2.previewingColorOption,
-                                    viewModel.darkModeViewModel.previewingIsDarkMode,
-                                    ::Pair,
+                                    viewModel.darkModeViewModel.overridingIsDarkMode,
+                                    colorUpdateViewModel.systemColorsUpdated,
+                                    ::Triple,
                                 )
-                                .collect { (colorModel, darkMode) ->
+                                .collect { (colorModel, darkMode, _) ->
                                     val bundle =
                                         Bundle().apply {
                                             if (colorModel != null) {
@@ -174,7 +178,9 @@
                                                 putIntArray(KEY_COLOR_VALUES, colors)
                                             }
 
-                                            putBoolean(KEY_DARK_MODE, darkMode)
+                                            if (darkMode != null) {
+                                                putBoolean(KEY_DARK_MODE, darkMode)
+                                            }
                                         }
                                     workspaceCallback.sendMessage(MESSAGE_ID_UPDATE_COLOR, bundle)
                                 }