Merge "Fixes instant crash in WPP." into tm-qpr-dev
diff --git a/src/com/android/customization/module/ThemePickerInjector.kt b/src/com/android/customization/module/ThemePickerInjector.kt
index 581c233..c958123 100644
--- a/src/com/android/customization/module/ThemePickerInjector.kt
+++ b/src/com/android/customization/module/ThemePickerInjector.kt
@@ -235,9 +235,14 @@
clockRegistry: ClockRegistry,
): ClockPickerInteractor {
return clockPickerInteractor
- ?: ClockPickerInteractor(ClockPickerRepositoryImpl(clockRegistry)).also {
- clockPickerInteractor = it
- }
+ ?: ClockPickerInteractor(
+ ClockPickerRepositoryImpl(
+ registry = clockRegistry,
+ scope = GlobalScope,
+ backgroundDispatcher = Dispatchers.IO,
+ )
+ )
+ .also { clockPickerInteractor = it }
}
override fun getClockSectionViewModel(
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 d5830e2..f6b0514 100644
--- a/src/com/android/customization/picker/clock/data/repository/ClockPickerRepositoryImpl.kt
+++ b/src/com/android/customization/picker/clock/data/repository/ClockPickerRepositoryImpl.kt
@@ -16,18 +16,28 @@
*/
package com.android.customization.picker.clock.data.repository
+import android.util.Log
import com.android.customization.picker.clock.shared.ClockSize
import com.android.customization.picker.clock.shared.model.ClockMetadataModel
import com.android.systemui.plugins.ClockMetadata
import com.android.systemui.shared.clocks.ClockRegistry
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.mapNotNull
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
/** Implementation of [ClockPickerRepository], using [ClockRegistry]. */
-class ClockPickerRepositoryImpl(private val registry: ClockRegistry) : ClockPickerRepository {
+class ClockPickerRepositoryImpl(
+ private val registry: ClockRegistry,
+ private val scope: CoroutineScope,
+ private val backgroundDispatcher: CoroutineDispatcher,
+) : ClockPickerRepository {
override val allClocks: Array<ClockMetadataModel> =
registry
@@ -37,22 +47,31 @@
.toTypedArray()
/** The currently-selected clock. */
- override val selectedClock: Flow<ClockMetadataModel> = callbackFlow {
- fun send() {
- val model =
- registry
- .getClocks()
- .find { clockMetadata -> clockMetadata.clockId == registry.currentClockId }
- ?.toModel()
- checkNotNull(model)
- trySend(model)
- }
+ override val selectedClock: Flow<ClockMetadataModel> =
+ callbackFlow {
+ suspend fun send() {
+ val currentClockId =
+ withContext(backgroundDispatcher) { registry.currentClockId }
+ val model =
+ registry
+ .getClocks()
+ .find { clockMetadata -> clockMetadata.clockId == currentClockId }
+ ?.toModel()
+ if (model == null) {
+ Log.w(
+ TAG,
+ "Clock with ID \"$currentClockId\" not found!",
+ )
+ }
+ trySend(model)
+ }
- val listener = ClockRegistry.ClockChangeListener { send() }
- registry.registerClockChangeListener(listener)
- send()
- awaitClose { registry.unregisterClockChangeListener(listener) }
- }
+ val listener = ClockRegistry.ClockChangeListener { scope.launch { send() } }
+ registry.registerClockChangeListener(listener)
+ send()
+ awaitClose { registry.unregisterClockChangeListener(listener) }
+ }
+ .mapNotNull { it }
override fun setSelectedClock(clockId: String) {
registry.currentClockId = clockId
@@ -69,4 +88,8 @@
private fun ClockMetadata.toModel(): ClockMetadataModel {
return ClockMetadataModel(clockId = clockId, name = name)
}
+
+ companion object {
+ private const val TAG = "ClockPickerRepositoryImpl"
+ }
}