Fix discard dialog showing when applying clock font
Test: Manually tested the issue is gone
Bug: 391856369
Flag: com.android.systemui.shared.new_customization_picker_ui
Change-Id: I0368b54dfb3f8e8c01e26b1b33ee6765b88ef8ff
diff --git a/src/com/android/customization/picker/clock/data/repository/ClockPickerRepositoryImpl.kt b/src/com/android/customization/picker/clock/data/repository/ClockPickerRepositoryImpl.kt
index 9508fa1..db38342 100644
--- a/src/com/android/customization/picker/clock/data/repository/ClockPickerRepositoryImpl.kt
+++ b/src/com/android/customization/picker/clock/data/repository/ClockPickerRepositoryImpl.kt
@@ -104,7 +104,7 @@
/** The currently-selected clock. This also emits the clock color information. */
override val selectedClock: Flow<ClockMetadataModel> =
- callbackFlow {
+ callbackFlow<ClockMetadataModel?> {
fun send() {
val activeClockId = registry.activeClockId
val metadata = registry.settings?.metadata
@@ -146,6 +146,9 @@
}
.flowOn(mainDispatcher)
.mapNotNull { it }
+ // Make this a shared flow to prevent ClockRegistry.registerClockChangeListener from
+ // being called every time this flow is collected, since ClockRegistry is a singleton.
+ .shareIn(mainScope, SharingStarted.WhileSubscribed(), 1)
override suspend fun setSelectedClock(clockId: String) {
registry.mutateSetting { oldSettings ->
diff --git a/src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt
index 1c8f824..9dca30c 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt
@@ -401,7 +401,7 @@
lifecycleOwner.lifecycleScope.launch {
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
- viewModel.selectedClockFontAxes.filterNotNull().collect { fontAxes ->
+ viewModel.previewingClockFontAxes.filterNotNull().collect { fontAxes ->
// This data flow updates only when a new clock style is selected. We
// initiate the clock font content with regard to that clock style.
sliderViewMap.clear()
diff --git a/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt b/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
index f3be2eb..7fe81ed 100644
--- a/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
+++ b/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
@@ -187,14 +187,13 @@
// Clock font axis
private val overrideClockFontAxisMap = MutableStateFlow<Map<String, Float>>(emptyMap())
- val selectedClockFontAxes =
+ val previewingClockFontAxes =
previewingClock
.map { clock -> clock.fontAxes }
- .stateIn(viewModelScope, SharingStarted.Eagerly, null)
+ .shareIn(viewModelScope, SharingStarted.WhileSubscribed(), 1)
private val selectedClockFontAxisMap =
- selectedClockFontAxes
- .filterNotNull()
- .map { fontAxes -> fontAxes.associate { it.key to it.currentValue } }
+ selectedClock
+ .map { clock -> clock.fontAxes.associate { it.key to it.currentValue } }
.shareIn(viewModelScope, SharingStarted.WhileSubscribed(), 1)
private val isFontAxisMapEdited =
combine(overrideClockFontAxisMap, selectedClockFontAxisMap) {
@@ -432,9 +431,10 @@
isClockColorEdited ||
isSliderProgressEdited
}
-
+ private val onApplyClicked: MutableStateFlow<Boolean> = MutableStateFlow(false)
val onApply: Flow<(suspend () -> Unit)?> =
combine(
+ onApplyClicked,
isEdited,
previewingClock,
previewingClockSize,
@@ -442,14 +442,16 @@
previewingSliderProgress,
previewingClockFontAxisMap,
) { array ->
- val isEdited: Boolean = array[0] as Boolean
- val clock: ClockMetadataModel = array[1] as ClockMetadataModel
- val size: ClockSize = array[2] as ClockSize
- val previewingColorId: String = array[3] as String
- val previewProgress: Int = array[4] as Int
- val axisMap: Map<String, Float> = array[5] as Map<String, Float>
- if (isEdited) {
+ val onApplyClicked: Boolean = array[0] as Boolean
+ val isEdited: Boolean = array[1] as Boolean
+ val clock: ClockMetadataModel = array[2] as ClockMetadataModel
+ val size: ClockSize = array[3] as ClockSize
+ val previewingColorId: String = array[4] as String
+ val previewProgress: Int = array[5] as Int
+ val axisMap: Map<String, Float> = array[6] as Map<String, Float>
+ if (isEdited && !onApplyClicked) {
{
+ this.onApplyClicked.value = true
clockPickerInteractor.applyClock(
clockId = clock.clockId,
size = size,
@@ -477,6 +479,7 @@
overridingSliderProgress.value = null
overrideClockFontAxisMap.value = emptyMap()
_selectedTab.value = Tab.STYLE
+ onApplyClicked.value = false
}
companion object {