Merge "Replace ClockFontAxisSetting" 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/src/com/android/customization/model/color/ColorProvider.kt b/src/com/android/customization/model/color/ColorProvider.kt
index 5c2b891..173a7d1 100644
--- a/src/com/android/customization/model/color/ColorProvider.kt
+++ b/src/com/android/customization/model/color/ColorProvider.kt
@@ -307,23 +307,35 @@
}
/**
- * Returns the preview of a preset ColorScheme based on this order: top left, top right, bottom
- * left, bottom right
+ * Returns the light theme contrast-adjusted preview of a preset ColorScheme, based on this
+ * order: top left, top right, bottom left, bottom right
*/
- private fun getFixedPresetColorPreview(colorScheme: ColorScheme): IntArray {
+ private fun getDarkPresetColorPreview(colorScheme: ColorScheme): IntArray {
val colors =
when (colorScheme.style) {
Style.FRUIT_SALAD -> intArrayOf(colorScheme.accent3.s100, colorScheme.accent1.s200)
- Style.TONAL_SPOT -> intArrayOf(colorScheme.accentColor, colorScheme.accentColor)
- Style.RAINBOW -> intArrayOf(colorScheme.accent1.s200, colorScheme.accent1.s200)
- else -> intArrayOf(colorScheme.accent1.s100, colorScheme.accent1.s100)
+ else -> intArrayOf(colorScheme.accent1.s200, colorScheme.accent1.s200)
}
return intArrayOf(colors[0], colors[1], colors[0], colors[1])
}
/**
- * Returns the light theme contrast-adjusted preview of a preset ColorScheme, specifically for
- * Revamped UI, based on this order: top left, top right, bottom left, bottom right
+ * Returns the preview of a preset ColorScheme based on this order: top left, top right, bottom
+ * left, bottom right
+ */
+ private fun getFixedPresetColorPreview(colorScheme: ColorScheme, seed: Int): IntArray {
+ val colors =
+ when (colorScheme.style) {
+ Style.FRUIT_SALAD -> intArrayOf(colorScheme.accent3.s100, colorScheme.accent1.s200)
+ Style.RAINBOW -> intArrayOf(colorScheme.accent1.s200, colorScheme.accent1.s200)
+ else -> intArrayOf(seed, seed)
+ }
+ return intArrayOf(colors[0], colors[1], colors[0], colors[1])
+ }
+
+ /**
+ * Returns the light theme contrast-adjusted preview of a preset ColorScheme, based on this
+ * order: top left, top right, bottom left, bottom right
*/
private fun getLightPresetColorPreview(colorScheme: ColorScheme): IntArray {
val colors =
@@ -333,13 +345,11 @@
colorScheme.accent3.getAtTone(450f),
colorScheme.accent1.getAtTone(550f),
)
- Style.TONAL_SPOT -> intArrayOf(colorScheme.accentColor, colorScheme.accentColor)
- Style.RAINBOW ->
+ else ->
intArrayOf(
colorScheme.accent1.getAtTone(450f),
colorScheme.accent1.getAtTone(450f),
)
- else -> intArrayOf(colorScheme.accent1.s100, colorScheme.accent1.s100)
}
return intArrayOf(colors[0], colors[1], colors[0], colors[1])
}
@@ -447,10 +457,15 @@
lightColors = getLightMonochromePreview(lightColorScheme)
}
else -> {
- darkColors = getFixedPresetColorPreview(darkColorScheme)
+ darkColors =
+ if (isNewPickerUi) {
+ getFixedPresetColorPreview(darkColorScheme, colorFromStub)
+ } else {
+ getDarkPresetColorPreview(darkColorScheme)
+ }
lightColors =
if (isNewPickerUi) {
- getFixedPresetColorPreview(lightColorScheme)
+ getFixedPresetColorPreview(lightColorScheme, colorFromStub)
} else {
getLightPresetColorPreview(lightColorScheme)
}
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_override/com/android/wallpaper/modules/ThemePickerAppModule.kt b/src_override/com/android/wallpaper/modules/ThemePickerAppModule.kt
index 539f4f9..41b8099 100644
--- a/src_override/com/android/wallpaper/modules/ThemePickerAppModule.kt
+++ b/src_override/com/android/wallpaper/modules/ThemePickerAppModule.kt
@@ -44,7 +44,9 @@
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
@@ -203,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 7b7f600..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
@@ -200,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/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(