Fix clock is low in new picker customization UI

Bug: 387534445
Test: manual test on Cheetah and Felix that UDFPS/device entry icon
doesn't overlap with clock
Flag: com.android.systemui.shared.new_customization_picker_ui

Change-Id: I98ab7195a7332b66ac3d0ada633556e344addd29
diff --git a/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractor.kt b/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractor.kt
index 7996055..27b8b26 100644
--- a/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractor.kt
+++ b/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractor.kt
@@ -24,6 +24,7 @@
 import com.android.customization.picker.clock.shared.model.ClockMetadataModel
 import com.android.customization.picker.clock.shared.model.ClockSnapshotModel
 import com.android.systemui.plugins.clocks.ClockFontAxisSetting
+import com.android.wallpaper.picker.customization.data.repository.CustomizationRuntimeValuesRepository
 import javax.inject.Inject
 import javax.inject.Singleton
 import kotlinx.coroutines.flow.Flow
@@ -41,6 +42,7 @@
 constructor(
     private val repository: ClockPickerRepository,
     private val snapshotRestorer: ClockPickerSnapshotRestorer,
+    private val customizationRuntimeValuesRepository: CustomizationRuntimeValuesRepository,
 ) {
 
     val allClocks: Flow<List<ClockMetadataModel>> = repository.allClocks
@@ -114,6 +116,10 @@
         )
     }
 
+    suspend fun getIsShadeLayoutWide() = customizationRuntimeValuesRepository.getIsShadeLayoutWide()
+
+    suspend fun getUdfpsLocation() = customizationRuntimeValuesRepository.getUdfpsLocation()
+
     private suspend fun setClockOption(clockSnapshotModel: ClockSnapshotModel) {
         // [ClockCarouselViewModel] is monitoring the [ClockPickerInteractor.setSelectedClock] job,
         // so it needs to finish last.
diff --git a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
index 7dda5cc..a1d560c 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
@@ -413,23 +413,26 @@
                             if (Flags.newCustomizationPickerUi()) {
                                 clockViewFactory.getController(clock.clockId).let { clockController
                                     ->
-                                    addClockViews(clockController, clockHostView, size)
-                                    val cs = ConstraintSet()
-                                    // TODO(b/379348167): get correct isShadeLayoutWide from picker
-                                    clockController.largeClock.layout.applyPreviewConstraints(
+                                    val udfpsTop =
+                                        clockPickerViewModel.getUdfpsLocation()?.let {
+                                            it.centerY - it.radius
+                                        }
+                                    val previewConfig =
                                         ClockPreviewConfig(
                                             context = context,
-                                            isShadeLayoutWide = false,
+                                            isShadeLayoutWide =
+                                                clockPickerViewModel.getIsShadeLayoutWide(),
                                             isSceneContainerFlagEnabled = false,
-                                        ),
+                                            udfpsTop = udfpsTop,
+                                        )
+                                    addClockViews(clockController, clockHostView, size)
+                                    val cs = ConstraintSet()
+                                    clockController.largeClock.layout.applyPreviewConstraints(
+                                        previewConfig,
                                         cs,
                                     )
                                     clockController.smallClock.layout.applyPreviewConstraints(
-                                        ClockPreviewConfig(
-                                            context = context,
-                                            isShadeLayoutWide = false,
-                                            isSceneContainerFlagEnabled = false,
-                                        ),
+                                        previewConfig,
                                         cs,
                                     )
                                     cs.applyTo(clockHostView)
diff --git a/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt b/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
index 6de560e..f3be2eb 100644
--- a/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
+++ b/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
@@ -131,6 +131,10 @@
             }
             .shareIn(viewModelScope, SharingStarted.WhileSubscribed(), 1)
 
+    suspend fun getIsShadeLayoutWide() = clockPickerInteractor.getIsShadeLayoutWide()
+
+    suspend fun getUdfpsLocation() = clockPickerInteractor.getUdfpsLocation()
+
     data class ClockStyleModel(val thumbnail: Drawable, val showEditButton: StateFlow<Boolean>)
 
     @OptIn(ExperimentalCoroutinesApi::class)
diff --git a/tests/robotests/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractorTest.kt b/tests/robotests/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractorTest.kt
index 43910ff..4bb542c 100644
--- a/tests/robotests/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractorTest.kt
+++ b/tests/robotests/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractorTest.kt
@@ -3,6 +3,8 @@
 import androidx.test.filters.SmallTest
 import com.android.customization.picker.clock.data.repository.FakeClockPickerRepository
 import com.android.customization.picker.clock.shared.ClockSize
+import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient
+import com.android.wallpaper.picker.customization.data.repository.CustomizationRuntimeValuesRepository
 import com.android.wallpaper.testing.FakeSnapshotStore
 import com.android.wallpaper.testing.collectLastValue
 import com.google.common.truth.Truth
@@ -31,6 +33,7 @@
         val testDispatcher = StandardTestDispatcher()
         Dispatchers.setMain(testDispatcher)
         val repository = FakeClockPickerRepository()
+        val customizationProviderClient = FakeCustomizationProviderClient()
         underTest =
             ClockPickerInteractor(
                 repository = repository,
@@ -38,6 +41,7 @@
                     ClockPickerSnapshotRestorer(repository = repository).apply {
                         runBlocking { setUpSnapshotRestorer(store = FakeSnapshotStore()) }
                     },
+                CustomizationRuntimeValuesRepository(customizationProviderClient),
             )
     }
 
diff --git a/tests/robotests/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModelTest.kt b/tests/robotests/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModelTest.kt
index 64efed6..0386c85 100644
--- a/tests/robotests/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModelTest.kt
+++ b/tests/robotests/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModelTest.kt
@@ -26,6 +26,8 @@
 import com.android.customization.picker.clock.shared.model.ClockMetadataModel
 import com.android.customization.picker.clock.ui.FakeClockViewFactory
 import com.android.customization.picker.clock.ui.view.ClockViewFactory
+import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient
+import com.android.wallpaper.picker.customization.data.repository.CustomizationRuntimeValuesRepository
 import com.android.wallpaper.testing.FakeSnapshotStore
 import com.android.wallpaper.testing.collectLastValue
 import com.google.common.truth.Truth.assertThat
@@ -103,12 +105,15 @@
     }
 
     private fun getClockPickerInteractor(repository: ClockPickerRepository): ClockPickerInteractor {
+        val customizationProviderClient = FakeCustomizationProviderClient()
         return ClockPickerInteractor(
                 repository = repository,
                 snapshotRestorer =
                     ClockPickerSnapshotRestorer(repository = repository).apply {
                         runBlocking { setUpSnapshotRestorer(store = FakeSnapshotStore()) }
                     },
+                customizationRuntimeValuesRepository =
+                    CustomizationRuntimeValuesRepository(customizationProviderClient),
             )
             .also { interactor = it }
     }
diff --git a/tests/robotests/src/com/android/customization/picker/clock/ui/viewmodel/ClockSettingsViewModelTest.kt b/tests/robotests/src/com/android/customization/picker/clock/ui/viewmodel/ClockSettingsViewModelTest.kt
index dd68589..8c067b5 100644
--- a/tests/robotests/src/com/android/customization/picker/clock/ui/viewmodel/ClockSettingsViewModelTest.kt
+++ b/tests/robotests/src/com/android/customization/picker/clock/ui/viewmodel/ClockSettingsViewModelTest.kt
@@ -13,6 +13,8 @@
 import com.android.customization.picker.color.data.repository.FakeColorPickerRepository
 import com.android.customization.picker.color.domain.interactor.ColorPickerInteractor
 import com.android.customization.picker.color.domain.interactor.ColorPickerSnapshotRestorer
+import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient
+import com.android.wallpaper.picker.customization.data.repository.CustomizationRuntimeValuesRepository
 import com.android.wallpaper.testing.FakeSnapshotStore
 import com.android.wallpaper.testing.collectLastValue
 import com.google.common.truth.Truth.assertThat
@@ -62,6 +64,7 @@
         context = InstrumentationRegistry.getInstrumentation().targetContext
         testScope = TestScope(testDispatcher)
         val repository = FakeClockPickerRepository()
+        val customizationProviderClient = FakeCustomizationProviderClient()
         clockPickerInteractor =
             ClockPickerInteractor(
                 repository = repository,
@@ -69,6 +72,7 @@
                     ClockPickerSnapshotRestorer(repository = repository).apply {
                         runBlocking { setUpSnapshotRestorer(store = FakeSnapshotStore()) }
                     },
+                CustomizationRuntimeValuesRepository(customizationProviderClient),
             )
         val colorPickerRepository = FakeColorPickerRepository(context = context)
         colorPickerInteractor =
diff --git a/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModelTest.kt b/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModelTest.kt
index 50da94f..482af7e 100644
--- a/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModelTest.kt
+++ b/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModelTest.kt
@@ -28,10 +28,12 @@
 import com.android.customization.picker.clock.ui.viewmodel.ClockSettingsViewModel
 import com.android.customization.picker.color.data.repository.FakeColorPickerRepository2
 import com.android.customization.picker.color.domain.interactor.ColorPickerInteractor2
+import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient
 import com.android.themepicker.R
 import com.android.wallpaper.customization.ui.viewmodel.ClockPickerViewModel.Tab
 import com.android.wallpaper.picker.common.icon.ui.viewmodel.Icon
 import com.android.wallpaper.picker.common.text.ui.viewmodel.Text
+import com.android.wallpaper.picker.customization.data.repository.CustomizationRuntimeValuesRepository
 import com.android.wallpaper.picker.customization.ui.viewmodel.FloatingToolbarTabViewModel
 import com.android.wallpaper.testing.FakeSnapshotStore
 import com.android.wallpaper.testing.collectLastValue
@@ -78,6 +80,7 @@
         hiltRule.inject()
         Dispatchers.setMain(testDispatcher)
         val repository = FakeClockPickerRepository()
+        val customizationProviderClient = FakeCustomizationProviderClient()
         val clockPickerInteractor =
             ClockPickerInteractor(
                 repository = repository,
@@ -85,6 +88,7 @@
                     ClockPickerSnapshotRestorer(repository = repository).apply {
                         runBlocking { setUpSnapshotRestorer(store = FakeSnapshotStore()) }
                     },
+                CustomizationRuntimeValuesRepository(customizationProviderClient),
             )
         val colorPickerRepository = FakeColorPickerRepository2()
         val colorPickerInteractor = ColorPickerInteractor2(repository = colorPickerRepository)