Merge "Update preset color option icon mapping" into main
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f89ff6e..8812bec 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -85,6 +85,7 @@
             android:name="com.android.wallpaper.picker.customization.ui.CustomizationPickerActivity2"
             android:label="@string/app_name"
             android:relinquishTaskIdentity="true"
+            android:screenOrientation="portrait"
             android:resizeableActivity="false"
             android:theme="@style/WallpaperTheme"
             android:configChanges="assetsPaths"
diff --git a/res/layout/customization_option_entry_themed_icons.xml b/res/layout/customization_option_entry_themed_icons.xml
index d10f9e9..cf46f7e 100644
--- a/res/layout/customization_option_entry_themed_icons.xml
+++ b/res/layout/customization_option_entry_themed_icons.xml
@@ -33,21 +33,8 @@
         android:layout_marginEnd="@dimen/customization_option_entry_text_margin_end"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toStartOf="@+id/option_entry_switch"
-        app:layout_constraintBottom_toTopOf="@+id/option_entry_description"
         app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_chainStyle="packed" />
-
-    <TextView
-        android:id="@+id/option_entry_description"
-        style="@style/CustomizationOptionEntrySubtitleTextStyle"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="@dimen/customization_option_entry_text_margin_end"
-        android:text="@string/beta_title"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toStartOf="@+id/option_entry_switch"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/option_entry_title" />
+        app:layout_constraintBottom_toBottomOf="parent" />
 
     <com.google.android.material.materialswitch.MaterialSwitch
         android:id="@+id/option_entry_switch"
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 1c01cda..03ad45c 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -17,7 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="1647136562008520313">"Tapeta a styl"</string>
+    <string name="app_name" msgid="1647136562008520313">"Tapety a styl"</string>
     <string name="theme_title" msgid="2144932106319405101">"Styl"</string>
     <string name="clock_title" msgid="2126046720254613991">"Hodiny"</string>
     <string name="clock_description" msgid="3563839327378948">"Výběr vlastních hodin"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index edfe4ab..91e6111 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -146,7 +146,7 @@
     <string name="show_notifications_on_lock_screen" msgid="4157744243084646720">"Benachrichtigungen auf dem Sperrbildschirm einblenden"</string>
     <string name="lock_screen_notifications_section_title" msgid="906673283764252102">"Benachr. auf Sperrbildschirm"</string>
     <string name="lock_screen_notifications_section_description" msgid="3321937285144466046">"Legt fest, welche Benachrichtigungen angezeigt werden und wie"</string>
-    <string name="more_settings_section_title" msgid="6854797937797818510">"Mehr Sperrbildschirm-Einst."</string>
+    <string name="more_settings_section_title" msgid="6854797937797818510">"Sperrbildschirm-Einstellungen"</string>
     <string name="more_settings_section_description" msgid="1860115709122398325">"Datenschutz, Now Playing und mehr"</string>
     <string name="more_colors" msgid="3191071655353004591">"Weitere Farben"</string>
     <string name="content_description_dynamic_color_option" msgid="2191721655642529886">"Primäres dynamisches Design"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 16de478..a71afa3 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -146,7 +146,7 @@
     <string name="show_notifications_on_lock_screen" msgid="4157744243084646720">"Mostrar las notificaciones en la pantalla de bloqueo"</string>
     <string name="lock_screen_notifications_section_title" msgid="906673283764252102">"Notific. en pantalla de bloqueo"</string>
     <string name="lock_screen_notifications_section_description" msgid="3321937285144466046">"Administra cómo aparecen las notificaciones y qué mostrar"</string>
-    <string name="more_settings_section_title" msgid="6854797937797818510">"Más opciones de pant. de bloqueo"</string>
+    <string name="more_settings_section_title" msgid="6854797937797818510">"Más opciones de pantalla de bloqueo"</string>
     <string name="more_settings_section_description" msgid="1860115709122398325">"Privacidad, Está sonando y más"</string>
     <string name="more_colors" msgid="3191071655353004591">"Más colores"</string>
     <string name="content_description_dynamic_color_option" msgid="2191721655642529886">"Tema dinámico principal"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 367e560..691bc2b 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -146,7 +146,7 @@
     <string name="show_notifications_on_lock_screen" msgid="4157744243084646720">"نمایش اعلان‌ها در صفحه قفل"</string>
     <string name="lock_screen_notifications_section_title" msgid="906673283764252102">"اعلان‌ها در صفحه قفل"</string>
     <string name="lock_screen_notifications_section_description" msgid="3321937285144466046">"مدیریت کردن نحوه نشان داده شدن اعلان‌ها و آنچه نشان داده می‌شود"</string>
-    <string name="more_settings_section_title" msgid="6854797937797818510">"تنظیمات دیگر صفحه قفل"</string>
+    <string name="more_settings_section_title" msgid="6854797937797818510">"تنظیمات بیشتر صفحه قفل"</string>
     <string name="more_settings_section_description" msgid="1860115709122398325">"«حریم خصوصی»، «درحال پخش»، و موارد دیگر"</string>
     <string name="more_colors" msgid="3191071655353004591">"رنگ‌های بیشتر"</string>
     <string name="content_description_dynamic_color_option" msgid="2191721655642529886">"زمینه پویای اصلی"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index e9826d4..577eb55 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -119,7 +119,7 @@
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Schimbă grila de aplicații"</string>
     <string name="wallpaper_color_tab" msgid="1447926591721403840">"Culori de fundal"</string>
-    <string name="wallpaper_color_subheader" msgid="4044464573669965670">"Culori pictograme, text etc. asortate cu imaginea de fundal"</string>
+    <string name="wallpaper_color_subheader" msgid="4044464573669965670">"Pictograme, text etc. în culoarea imaginii de fundal"</string>
     <string name="wallpaper_color_title" msgid="5687965239180986458">"Culoarea imaginii de fundal"</string>
     <string name="preset_color_tab" msgid="3133391839341329314">"Culori de bază"</string>
     <string name="preset_color_tab_2" msgid="1444107326712562538">"Alte culori"</string>
diff --git a/src/com/android/customization/picker/clock/ui/binder/ClockCarouselViewBinder.kt b/src/com/android/customization/picker/clock/ui/binder/ClockCarouselViewBinder.kt
index 7fcfd9c..4f96f69 100644
--- a/src/com/android/customization/picker/clock/ui/binder/ClockCarouselViewBinder.kt
+++ b/src/com/android/customization/picker/clock/ui/binder/ClockCarouselViewBinder.kt
@@ -56,7 +56,7 @@
                 scrollBackwardCallback = {
                     // Callback code for scrolling backward
                     carouselView.transitionToPrevious()
-                }
+                },
             )
         lifecycleOwner.lifecycleScope.launch {
             lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
@@ -71,7 +71,13 @@
                             },
                             isTwoPaneAndSmallWidth = isTwoPaneAndSmallWidth,
                         )
-                        carouselView.accessibilityDelegate = carouselAccessibilityDelegate
+                        // Only show accessibility action when there is >1 clock to choose from
+                        carouselView.accessibilityDelegate =
+                            if (allClocks.size > 1) {
+                                carouselAccessibilityDelegate
+                            } else {
+                                null
+                            }
                         screenPreviewClickView.setOnSideClickedListener { isStart ->
                             if (isStart) carouselView.scrollToPrevious()
                             else carouselView.scrollToNext()
diff --git a/src/com/android/customization/picker/clock/ui/view/ThemePickerClockViewFactory.kt b/src/com/android/customization/picker/clock/ui/view/ThemePickerClockViewFactory.kt
index c48d810..cd298fe 100644
--- a/src/com/android/customization/picker/clock/ui/view/ThemePickerClockViewFactory.kt
+++ b/src/com/android/customization/picker/clock/ui/view/ThemePickerClockViewFactory.kt
@@ -193,7 +193,7 @@
     private fun initClockController(clockId: String): ClockController? {
         val isWallpaperDark = isLockscreenWallpaperDark()
         return registry.createExampleClock(clockId)?.also { controller ->
-            controller.initialize(isWallpaperDark, 0f, 0f)
+            controller.initialize(isWallpaperDark, 0f, 0f, null)
 
             // Initialize large clock
             controller.largeClock.events.onFontSettingChanged(
diff --git a/src/com/android/customization/picker/mode/data/repository/DarkModeRepository.kt b/src/com/android/customization/picker/mode/data/repository/DarkModeRepository.kt
index 28f5017..69b489a 100644
--- a/src/com/android/customization/picker/mode/data/repository/DarkModeRepository.kt
+++ b/src/com/android/customization/picker/mode/data/repository/DarkModeRepository.kt
@@ -18,11 +18,9 @@
 
 import com.android.customization.picker.mode.shared.util.DarkModeUtil
 import com.android.wallpaper.system.PowerManagerWrapper
-import com.android.wallpaper.system.UiModeManagerWrapper
 import javax.inject.Inject
 import javax.inject.Singleton
 import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 
@@ -31,7 +29,7 @@
 @Inject
 constructor(
     darkModeUtil: DarkModeUtil,
-    private val uiModeManager: UiModeManagerWrapper,
+    private val darkModeStateRepository: DarkModeStateRepository,
     private val powerManager: PowerManagerWrapper,
 ) {
     private val isPowerSaveMode = MutableStateFlow(powerManager.getIsPowerSaveMode() ?: false)
@@ -43,17 +41,11 @@
             isPowerSaveMode.map { !it }
         } else flowOf(false)
 
-    private val _isDarkMode = MutableStateFlow(uiModeManager.getIsNightModeActivated())
-    val isDarkMode = _isDarkMode.asStateFlow()
+    val isDarkMode = darkModeStateRepository.isDarkMode
 
-    fun setDarkModeActivated(isActive: Boolean) {
-        uiModeManager.setNightModeActivated(isActive)
-        refreshIsDarkModeActivated()
-    }
+    fun setIsDarkMode(isActive: Boolean) = darkModeStateRepository.setIsDarkMode(isActive)
 
-    fun refreshIsDarkModeActivated() {
-        _isDarkMode.value = uiModeManager.getIsNightModeActivated()
-    }
+    fun refreshIsDarkMode() = darkModeStateRepository.refreshIsDarkMode()
 
     fun refreshIsPowerSaveModeActivated() {
         powerManager.getIsPowerSaveMode()?.let { isPowerSaveMode.value = it }
diff --git a/src/com/android/customization/picker/mode/domain/interactor/DarkModeInteractor.kt b/src/com/android/customization/picker/mode/domain/interactor/DarkModeInteractor.kt
index 1b74e33..e805222 100644
--- a/src/com/android/customization/picker/mode/domain/interactor/DarkModeInteractor.kt
+++ b/src/com/android/customization/picker/mode/domain/interactor/DarkModeInteractor.kt
@@ -25,5 +25,5 @@
     val isEnabled = repository.isEnabled
     val isDarkMode = repository.isDarkMode
 
-    fun setDarkModeActivated(isActive: Boolean) = repository.setDarkModeActivated(isActive)
+    fun setIsDarkMode(isActive: Boolean) = repository.setIsDarkMode(isActive)
 }
diff --git a/src/com/android/customization/picker/mode/shared/util/DarkModeLifecycleUtil.kt b/src/com/android/customization/picker/mode/shared/util/DarkModeLifecycleUtil.kt
index 749ac2e..f7bbfd2 100644
--- a/src/com/android/customization/picker/mode/shared/util/DarkModeLifecycleUtil.kt
+++ b/src/com/android/customization/picker/mode/shared/util/DarkModeLifecycleUtil.kt
@@ -59,7 +59,6 @@
             @Synchronized
             override fun onStart(owner: LifecycleOwner) {
                 super.onStart(owner)
-                darkModeRepository.refreshIsDarkModeActivated()
                 darkModeRepository.refreshIsPowerSaveModeActivated()
                 if (lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
                     activityContext.registerReceiver(
diff --git a/src/com/android/customization/picker/mode/ui/binder/DarkModeBinder.kt b/src/com/android/customization/picker/mode/ui/binder/DarkModeBinder.kt
index 9e9db7a..3e46288 100644
--- a/src/com/android/customization/picker/mode/ui/binder/DarkModeBinder.kt
+++ b/src/com/android/customization/picker/mode/ui/binder/DarkModeBinder.kt
@@ -54,7 +54,11 @@
                 }
                 launch {
                     viewModel.toggleDarkMode.collect {
-                        darkModeToggle.setOnCheckedChangeListener { _, _ -> it.invoke() }
+                        // Use onClickListener instead of onCheckedChangeListener to avoid the
+                        // potential cycle of: system value changes->the toggle isChecked value is
+                        // updated->the onCheckedChangeListener is called->the overriding value is
+                        // set. The overriding value should not be set by the system, only by user.
+                        darkModeToggle.setOnClickListener { _ -> it.invoke() }
                     }
                 }
             }
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 f51d966..aacf001 100644
--- a/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModel.kt
+++ b/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModel.kt
@@ -44,14 +44,17 @@
     val toggleDarkMode =
         combine(overridingIsDarkMode, isDarkMode) { override, current ->
             // Only set override if its value is different from current, else set to null
-            { _overridingIsDarkMode.value = if (override == null) !current else null }
+            {
+                _overridingIsDarkMode.value =
+                    if (override == null || override == current) !current else null
+            }
         }
 
     val onApply: Flow<(suspend () -> Unit)?> =
         combine(overridingIsDarkMode, isDarkMode, isEnabled) { override, current, isEnabled ->
             if (override != null && override != current && isEnabled) {
                 {
-                    interactor.setDarkModeActivated(override)
+                    interactor.setIsDarkMode(override)
                     logger.logDarkThemeApplied(override)
                 }
             } else null
diff --git a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
index 9ce7b61..7b78e8c 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
@@ -52,6 +52,7 @@
 import com.android.wallpaper.picker.customization.ui.binder.CustomizationOptionsBinder
 import com.android.wallpaper.picker.customization.ui.binder.DefaultCustomizationOptionsBinder
 import com.android.wallpaper.picker.customization.ui.util.CustomizationOptionUtil.CustomizationOption
+import com.android.wallpaper.picker.customization.ui.util.ViewAlphaAnimator.animateToAlpha
 import com.android.wallpaper.picker.customization.ui.viewmodel.ColorUpdateViewModel
 import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationOptionsViewModel
 import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationPickerViewModel2
@@ -476,6 +477,10 @@
                             clockViewFactory.updateFontAxes(clock.clockId, axisList)
                         }
                 }
+
+                launch {
+                    viewModel.lockPreviewAnimateToAlpha.collect { clockHostView.animateToAlpha(it) }
+                }
             }
         }
     }
diff --git a/src_override/com/android/wallpaper/modules/ThemePickerAppModule.kt b/src_override/com/android/wallpaper/modules/ThemePickerAppModule.kt
index 5f4da33..41b8099 100644
--- a/src_override/com/android/wallpaper/modules/ThemePickerAppModule.kt
+++ b/src_override/com/android/wallpaper/modules/ThemePickerAppModule.kt
@@ -44,18 +44,22 @@
 import com.android.wallpaper.effects.DefaultEffectsController
 import com.android.wallpaper.effects.EffectsController
 import com.android.wallpaper.module.DefaultPartnerProvider
+import com.android.wallpaper.module.DefaultRecentWallpaperManager
 import com.android.wallpaper.module.PartnerProvider
+import com.android.wallpaper.module.RecentWallpaperManager
 import com.android.wallpaper.module.WallpaperPreferences
 import com.android.wallpaper.module.logging.UserEventLogger
 import com.android.wallpaper.picker.category.domain.interactor.CategoriesLoadingStatusInteractor
 import com.android.wallpaper.picker.category.domain.interactor.CategoryInteractor
 import com.android.wallpaper.picker.category.domain.interactor.CreativeCategoryInteractor
 import com.android.wallpaper.picker.category.domain.interactor.CuratedPhotosInteractor
+import com.android.wallpaper.picker.category.domain.interactor.OnDeviceWallpapersInteractor
 import com.android.wallpaper.picker.category.domain.interactor.ThirdPartyCategoryInteractor
 import com.android.wallpaper.picker.category.domain.interactor.implementations.CategoryInteractorImpl
 import com.android.wallpaper.picker.category.domain.interactor.implementations.CreativeCategoryInteractorImpl
 import com.android.wallpaper.picker.category.domain.interactor.implementations.DefaultCategoriesLoadingStatusInteractor
 import com.android.wallpaper.picker.category.domain.interactor.implementations.DefaultCuratedPhotosInteractorImpl
+import com.android.wallpaper.picker.category.domain.interactor.implementations.DefaultOnDeviceWallpapersInteractor
 import com.android.wallpaper.picker.category.domain.interactor.implementations.ThirdPartyCategoryInteractorImpl
 import com.android.wallpaper.picker.category.ui.view.providers.IndividualPickerFactory
 import com.android.wallpaper.picker.category.ui.view.providers.implementation.DefaultIndividualPickerFactory
@@ -141,6 +145,12 @@
 
     @Binds
     @Singleton
+    abstract fun bindOnDeviceWallpapersInteractor(
+        impl: DefaultOnDeviceWallpapersInteractor
+    ): OnDeviceWallpapersInteractor
+
+    @Binds
+    @Singleton
     abstract fun bindImageEffectDialogUtil(
         impl: DefaultImageEffectDialogUtil
     ): ImageEffectDialogUtil
@@ -195,6 +205,12 @@
         impl: ThemePickerWorkspaceCallbackBinder
     ): WorkspaceCallbackBinder
 
+    @Binds
+    @Singleton
+    abstract fun bindRecentWallpaperManager(
+        impl: DefaultRecentWallpaperManager
+    ): RecentWallpaperManager
+
     companion object {
 
         @Provides
diff --git a/tests/module/src/com/android/wallpaper/ThemePickerTestModule.kt b/tests/module/src/com/android/wallpaper/ThemePickerTestModule.kt
index 25a6d65..47ea474 100644
--- a/tests/module/src/com/android/wallpaper/ThemePickerTestModule.kt
+++ b/tests/module/src/com/android/wallpaper/ThemePickerTestModule.kt
@@ -42,8 +42,10 @@
 import com.android.wallpaper.customization.ui.binder.ThemePickerToolbarBinder
 import com.android.wallpaper.effects.EffectsController
 import com.android.wallpaper.effects.FakeEffectsController
+import com.android.wallpaper.module.DefaultRecentWallpaperManager
 import com.android.wallpaper.module.Injector
 import com.android.wallpaper.module.PartnerProvider
+import com.android.wallpaper.module.RecentWallpaperManager
 import com.android.wallpaper.module.WallpaperPreferences
 import com.android.wallpaper.module.logging.TestUserEventLogger
 import com.android.wallpaper.module.logging.UserEventLogger
@@ -51,6 +53,7 @@
 import com.android.wallpaper.network.Requester
 import com.android.wallpaper.picker.category.domain.interactor.CategoryInteractor
 import com.android.wallpaper.picker.category.domain.interactor.CuratedPhotosInteractor
+import com.android.wallpaper.picker.category.domain.interactor.OnDeviceWallpapersInteractor
 import com.android.wallpaper.picker.category.domain.interactor.ThirdPartyCategoryInteractor
 import com.android.wallpaper.picker.category.ui.view.providers.IndividualPickerFactory
 import com.android.wallpaper.picker.category.ui.view.providers.implementation.DefaultIndividualPickerFactory
@@ -67,6 +70,7 @@
 import com.android.wallpaper.testing.FakeCategoryInteractor
 import com.android.wallpaper.testing.FakeCuratedPhotosInteractorImpl
 import com.android.wallpaper.testing.FakeDefaultRequester
+import com.android.wallpaper.testing.FakeOnDeviceWallpapersInteractor
 import com.android.wallpaper.testing.FakeThirdPartyCategoryInteractor
 import com.android.wallpaper.testing.FakeWallpaperCategoryWrapper
 import com.android.wallpaper.testing.TestPartnerProvider
@@ -156,6 +160,12 @@
 
     @Binds
     @Singleton
+    abstract fun bindOnDeviceWallpapersInteractor(
+        impl: FakeOnDeviceWallpapersInteractor
+    ): OnDeviceWallpapersInteractor
+
+    @Binds
+    @Singleton
     abstract fun providePartnerProvider(impl: TestPartnerProvider): PartnerProvider
 
     @Binds @Singleton abstract fun bindRequester(impl: FakeDefaultRequester): Requester
@@ -192,6 +202,12 @@
         impl: ThemePickerWorkspaceCallbackBinder
     ): WorkspaceCallbackBinder
 
+    @Binds
+    @Singleton
+    abstract fun bindRecentWallpaperManager(
+        impl: DefaultRecentWallpaperManager
+    ): RecentWallpaperManager
+
     companion object {
 
         @Provides
diff --git a/tests/robotests/src/com/android/customization/picker/clock/ui/FakeClockViewFactory.kt b/tests/robotests/src/com/android/customization/picker/clock/ui/FakeClockViewFactory.kt
index d6286a4..1c02756 100644
--- a/tests/robotests/src/com/android/customization/picker/clock/ui/FakeClockViewFactory.kt
+++ b/tests/robotests/src/com/android/customization/picker/clock/ui/FakeClockViewFactory.kt
@@ -6,6 +6,7 @@
 import com.android.customization.picker.clock.ui.view.ClockViewFactory
 import com.android.systemui.plugins.clocks.ClockConfig
 import com.android.systemui.plugins.clocks.ClockController
+import com.android.systemui.plugins.clocks.ClockEventListener
 import com.android.systemui.plugins.clocks.ClockEvents
 import com.android.systemui.plugins.clocks.ClockFaceController
 import com.android.systemui.plugins.clocks.ClockFontAxisSetting
@@ -29,8 +30,12 @@
         override val events: ClockEvents
             get() = TODO("Not yet implemented")
 
-        override fun initialize(isDarkTheme: Boolean, dozeFraction: Float, foldFraction: Float) =
-            TODO("Not yet implemented")
+        override fun initialize(
+            isDarkTheme: Boolean,
+            dozeFraction: Float,
+            foldFraction: Float,
+            clockListener: ClockEventListener?,
+        ) = TODO("Not yet implemented")
 
         override fun dump(pw: PrintWriter) = TODO("Not yet implemented")
     }
diff --git a/tests/robotests/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModelTest.kt b/tests/robotests/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModelTest.kt
index fbd56bc..3bdbb9d 100644
--- a/tests/robotests/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModelTest.kt
+++ b/tests/robotests/src/com/android/customization/picker/mode/ui/viewmodel/DarkModeViewModelTest.kt
@@ -49,7 +49,7 @@
     @Inject lateinit var darkModeRepository: DarkModeRepository
     @Inject lateinit var darkModeInteractor: DarkModeInteractor
     @Inject lateinit var logger: TestThemesUserEventLogger
-    lateinit var darkModeViewModel: DarkModeViewModel
+    private lateinit var darkModeViewModel: DarkModeViewModel
 
     @Inject lateinit var testDispatcher: TestDispatcher
     @Inject lateinit var testScope: TestScope
@@ -90,10 +90,11 @@
     fun toggleDarkMode() {
         testScope.runTest {
             uiModeManager.setNightModeActivated(false)
-            darkModeRepository.refreshIsDarkModeActivated()
+            darkModeRepository.refreshIsDarkMode()
             val getOverridingIsDarkMode = collectLastValue(darkModeViewModel.overridingIsDarkMode)
             val getPreviewingIsDarkMode = collectLastValue(darkModeViewModel.previewingIsDarkMode)
             val getToggleDarkMode = collectLastValue(darkModeViewModel.toggleDarkMode)
+            assertThat(getOverridingIsDarkMode()).isNull()
             assertThat(getPreviewingIsDarkMode()).isFalse()
 
             getToggleDarkMode()?.invoke()
@@ -109,10 +110,36 @@
     }
 
     @Test
+    fun previewingIsDarkMode_systemChanges() {
+        testScope.runTest {
+            uiModeManager.setNightModeActivated(false)
+            darkModeRepository.refreshIsDarkMode()
+            val getOverridingIsDarkMode = collectLastValue(darkModeViewModel.overridingIsDarkMode)
+            val getPreviewingIsDarkMode = collectLastValue(darkModeViewModel.previewingIsDarkMode)
+            assertThat(getOverridingIsDarkMode()).isNull()
+            assertThat(getPreviewingIsDarkMode()).isFalse()
+
+            // Turn on dark mode
+            uiModeManager.setNightModeActivated(true)
+            darkModeRepository.refreshIsDarkMode()
+
+            assertThat(getOverridingIsDarkMode()).isNull()
+            assertThat(getPreviewingIsDarkMode()).isTrue()
+
+            // Turn off dark mode
+            uiModeManager.setNightModeActivated(false)
+            darkModeRepository.refreshIsDarkMode()
+
+            assertThat(getOverridingIsDarkMode()).isNull()
+            assertThat(getPreviewingIsDarkMode()).isFalse()
+        }
+    }
+
+    @Test
     fun onApply_shouldLogDarkTheme() {
         testScope.runTest {
             uiModeManager.setNightModeActivated(false)
-            darkModeRepository.refreshIsDarkModeActivated()
+            darkModeRepository.refreshIsDarkMode()
             val getToggleDarkMode = collectLastValue(darkModeViewModel.toggleDarkMode)
             val onApply = collectLastValue(darkModeViewModel.onApply)
 
@@ -127,7 +154,7 @@
     fun onApply_shouldApplyDarkTheme() {
         testScope.runTest {
             uiModeManager.setNightModeActivated(false)
-            darkModeRepository.refreshIsDarkModeActivated()
+            darkModeRepository.refreshIsDarkMode()
             val getToggleDarkMode = collectLastValue(darkModeViewModel.toggleDarkMode)
             val onApply = collectLastValue(darkModeViewModel.onApply)
 
diff --git a/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ColorPickerViewModel2Test.kt b/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ColorPickerViewModel2Test.kt
index 649c298..a8edc4d 100644
--- a/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ColorPickerViewModel2Test.kt
+++ b/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ColorPickerViewModel2Test.kt
@@ -26,15 +26,18 @@
 import com.android.customization.picker.color.domain.interactor.ColorPickerInteractor2
 import com.android.customization.picker.color.shared.model.ColorType
 import com.android.customization.picker.color.ui.viewmodel.ColorOptionIconViewModel
+import com.android.customization.picker.mode.data.repository.DarkModeStateRepository
 import com.android.systemui.monet.Style
 import com.android.wallpaper.picker.customization.ui.viewmodel.ColorUpdateViewModel
 import com.android.wallpaper.picker.customization.ui.viewmodel.FloatingToolbarTabViewModel
 import com.android.wallpaper.picker.option.ui.viewmodel.OptionItemViewModel2
-import com.android.wallpaper.testing.FakeSnapshotStore
 import com.android.wallpaper.testing.collectLastValue
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import dagger.hilt.android.internal.lifecycle.RetainedLifecycleImpl
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.launch
@@ -45,36 +48,40 @@
 import kotlinx.coroutines.test.setMain
 import org.junit.After
 import org.junit.Before
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
 
+@HiltAndroidTest
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(RobolectricTestRunner::class)
 class ColorPickerViewModel2Test {
+    @get:Rule var hiltRule = HiltAndroidRule(this)
+
     private val logger = TestThemesUserEventLogger()
     private lateinit var underTest: ColorPickerViewModel2
-    private lateinit var repository: FakeColorPickerRepository2
-    private lateinit var interactor: ColorPickerInteractor2
-    private lateinit var store: FakeSnapshotStore
     private lateinit var colorUpdateViewModel: ColorUpdateViewModel
 
     private lateinit var context: Context
     private lateinit var testScope: TestScope
 
+    @Inject lateinit var repository: FakeColorPickerRepository2
+    @Inject lateinit var interactor: ColorPickerInteractor2
+    @Inject lateinit var darkModeStateRepository: DarkModeStateRepository
+
     @Before
     fun setUp() {
+        hiltRule.inject()
+
         context = InstrumentationRegistry.getInstrumentation().targetContext
         val testDispatcher = UnconfinedTestDispatcher()
         Dispatchers.setMain(testDispatcher)
         testScope = TestScope(testDispatcher)
-        repository = FakeColorPickerRepository2()
-        store = FakeSnapshotStore()
 
-        interactor = ColorPickerInteractor2(repository = repository)
-
-        colorUpdateViewModel = ColorUpdateViewModel(context, RetainedLifecycleImpl())
+        colorUpdateViewModel =
+            ColorUpdateViewModel(context, RetainedLifecycleImpl(), darkModeStateRepository)
 
         underTest =
             ColorPickerViewModel2(