Update clock color option views
Update views to be in line with new color option views.
Flag: com.android.systemui.shared.new_customization_picker_ui
Bug: 350718184
Test: manually verified, see bug
Change-Id: If5ace20d05d88599479c6c254ac878481ccca424
diff --git a/res/layout/floating_sheet_clock_color_content.xml b/res/layout/floating_sheet_clock_color_content.xml
index fd218c6..3711b92 100644
--- a/res/layout/floating_sheet_clock_color_content.xml
+++ b/res/layout/floating_sheet_clock_color_content.xml
@@ -40,15 +40,14 @@
It's critical for any TextViews inside the included layout to have text.
-->
<include
- layout="@layout/color_option"
- android:layout_width="@dimen/option_item_size"
- android:layout_height="@dimen/option_item_size"
+ layout="@layout/color_option2"
android:visibility="invisible" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/clock_color_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:paddingHorizontal="@dimen/floating_sheet_content_horizontal_padding"
android:clipChildren="false"
android:clipToPadding="false" />
</FrameLayout>
diff --git a/src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt
index 943729b..a7f1c67 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt
@@ -20,7 +20,8 @@
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.content.Context
-import android.content.res.Configuration
+import android.content.res.Configuration.UI_MODE_NIGHT_MASK
+import android.content.res.Configuration.UI_MODE_NIGHT_YES
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver.OnGlobalLayoutListener
@@ -36,8 +37,8 @@
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.customization.picker.clock.shared.ClockSize
-import com.android.customization.picker.color.ui.binder.ColorOptionIconBinder
-import com.android.customization.picker.color.ui.view.ColorOptionIconView
+import com.android.customization.picker.color.ui.binder.ColorOptionIconBinder2
+import com.android.customization.picker.color.ui.view.ColorOptionIconView2
import com.android.customization.picker.color.ui.viewmodel.ColorOptionIconViewModel
import com.android.customization.picker.common.ui.view.SingleRowListItemSpacing
import com.android.systemui.plugins.clocks.AxisType
@@ -54,7 +55,6 @@
import com.android.wallpaper.picker.customization.ui.view.FloatingToolbar
import com.android.wallpaper.picker.customization.ui.view.adapter.FloatingToolbarTabAdapter
import com.android.wallpaper.picker.customization.ui.viewmodel.ColorUpdateViewModel
-import com.android.wallpaper.picker.option.ui.adapter.OptionItemAdapter
import com.android.wallpaper.picker.option.ui.adapter.OptionItemAdapter2
import java.lang.ref.WeakReference
import kotlinx.coroutines.DisposableHandle
@@ -144,10 +144,17 @@
// Clock color
val clockColorContent = view.requireViewById<View>(R.id.clock_floating_sheet_color_content)
val clockColorAdapter =
- createClockColorOptionItemAdapter(view.resources.configuration.uiMode, lifecycleOwner)
+ createClockColorOptionItemAdapter(
+ uiMode = view.resources.configuration.uiMode,
+ colorUpdateViewModel = colorUpdateViewModel,
+ shouldAnimateColor = isFloatingSheetActive,
+ lifecycleOwner = lifecycleOwner,
+ )
val clockColorList =
view.requireViewById<RecyclerView>(R.id.clock_color_list).apply {
- initColorList(appContext, clockColorAdapter)
+ adapter = clockColorAdapter
+ layoutManager =
+ LinearLayoutManager(appContext, LinearLayoutManager.HORIZONTAL, false)
}
val clockColorSlider: SeekBar = view.requireViewById(R.id.clock_color_slider)
clockColorSlider.setOnSeekBarChangeListener(
@@ -468,39 +475,28 @@
private fun createClockColorOptionItemAdapter(
uiMode: Int,
+ colorUpdateViewModel: ColorUpdateViewModel,
+ shouldAnimateColor: () -> Boolean,
lifecycleOwner: LifecycleOwner,
- ): OptionItemAdapter<ColorOptionIconViewModel> =
- OptionItemAdapter(
- layoutResourceId = R.layout.color_option,
+ ): OptionItemAdapter2<ColorOptionIconViewModel> =
+ OptionItemAdapter2(
+ layoutResourceId = R.layout.color_option2,
lifecycleOwner = lifecycleOwner,
- bindIcon = { foregroundView: View, colorIcon: ColorOptionIconViewModel ->
- val colorOptionIconView = foregroundView as? ColorOptionIconView
- val night =
- uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
- colorOptionIconView?.let { ColorOptionIconBinder.bind(it, colorIcon, night) }
+ bindPayload = { itemView: View, colorIcon: ColorOptionIconViewModel ->
+ val colorOptionIconView =
+ itemView.requireViewById<ColorOptionIconView2>(
+ com.android.wallpaper.R.id.background
+ )
+ val night = uiMode and UI_MODE_NIGHT_MASK == UI_MODE_NIGHT_YES
+ ColorOptionIconBinder2.bind(colorOptionIconView, colorIcon, night)
+ // Return null since it does not need the lifecycleOwner to launch any job for later
+ // disposal when rebind.
+ return@OptionItemAdapter2 null
},
+ colorUpdateViewModel = WeakReference(colorUpdateViewModel),
+ shouldAnimateColor = shouldAnimateColor,
)
- private fun RecyclerView.initColorList(
- context: Context,
- adapter: OptionItemAdapter<ColorOptionIconViewModel>,
- ) {
- apply {
- this.adapter = adapter
- layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
- addItemDecoration(
- SingleRowListItemSpacing(
- context.resources.getDimensionPixelSize(
- R.dimen.floating_sheet_content_horizontal_padding
- ),
- context.resources.getDimensionPixelSize(
- R.dimen.floating_sheet_list_item_horizontal_space
- ),
- )
- )
- }
- }
-
// Alpha is 1 when current height is from height, and 0 when current height is to height.
private fun getAlpha(fromHeight: Int, toHeight: Int, currentHeight: Int): Float =
(1 - (currentHeight - fromHeight).toFloat() / (toHeight - fromHeight).toFloat())
diff --git a/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt b/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
index e055d48..a5f5d22 100644
--- a/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
+++ b/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
@@ -34,7 +34,6 @@
import com.android.wallpaper.picker.common.text.ui.viewmodel.Text
import com.android.wallpaper.picker.customization.ui.viewmodel.FloatingToolbarTabViewModel
import com.android.wallpaper.picker.di.modules.BackgroundDispatcher
-import com.android.wallpaper.picker.option.ui.viewmodel.OptionItemViewModel
import com.android.wallpaper.picker.option.ui.viewmodel.OptionItemViewModel2
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
@@ -290,7 +289,7 @@
}
}
- val clockColorOptions: Flow<List<OptionItemViewModel<ColorOptionIconViewModel>>> =
+ val clockColorOptions: Flow<List<OptionItemViewModel2<ColorOptionIconViewModel>>> =
colorPickerInteractor.selectedColorOption.map { selectedColorOption ->
// Use mapLatest and delay(100) here to prevent too many selectedClockColor update
// events from ClockRegistry upstream, caused by sliding the saturation level bar.
@@ -304,7 +303,7 @@
.map { colorMap.keys.indexOf(it) == index }
.stateIn(viewModelScope)
add(
- OptionItemViewModel<ColorOptionIconViewModel>(
+ OptionItemViewModel2<ColorOptionIconViewModel>(
key = MutableStateFlow(colorModel.colorId) as StateFlow<String>,
payload =
ColorOptionIconViewModel(
@@ -346,7 +345,7 @@
private suspend fun ColorOption.toOptionItemViewModel(
context: Context
- ): OptionItemViewModel<ColorOptionIconViewModel> {
+ ): OptionItemViewModel2<ColorOptionIconViewModel> {
val lightThemeColors =
(this as ColorOptionImpl)
.previewInfo
@@ -362,7 +361,7 @@
val isSelectedFlow =
previewingClockColorId.map { it == DEFAULT_CLOCK_COLOR_ID }.stateIn(viewModelScope)
val key = "${this.type}::${this.style}::${this.serializedPackages}"
- return OptionItemViewModel<ColorOptionIconViewModel>(
+ return OptionItemViewModel2<ColorOptionIconViewModel>(
key = MutableStateFlow(key) as StateFlow<String>,
payload =
ColorOptionIconViewModel(