Merge "Fix race condition when accessing ClockChangeListener" into udc-dev

This commit is contained in:
Austin Wang
2023-05-30 20:15:31 +00:00
committed by Android (Google) Code Review

View File

@@ -45,6 +45,7 @@ import java.util.concurrent.atomic.AtomicBoolean
import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
private val KEY_TIMESTAMP = "appliedTimestamp" private val KEY_TIMESTAMP = "appliedTimestamp"
@@ -320,20 +321,20 @@ open class ClockRegistry(
} }
} }
public fun mutateSetting(mutator: (ClockSettings) -> ClockSettings) { public suspend fun mutateSetting(mutator: (ClockSettings) -> ClockSettings) {
scope.launch(bgDispatcher) { applySettings(mutator(settings ?: ClockSettings())) } withContext(bgDispatcher) { applySettings(mutator(settings ?: ClockSettings())) }
} }
var currentClockId: ClockId var currentClockId: ClockId
get() = settings?.clockId ?: fallbackClockId get() = settings?.clockId ?: fallbackClockId
set(value) { set(value) {
mutateSetting { it.copy(clockId = value) } scope.launch(bgDispatcher) { mutateSetting { it.copy(clockId = value) } }
} }
var seedColor: Int? var seedColor: Int?
get() = settings?.seedColor get() = settings?.seedColor
set(value) { set(value) {
mutateSetting { it.copy(seedColor = value) } scope.launch(bgDispatcher) { mutateSetting { it.copy(seedColor = value) } }
} }
init { init {
@@ -501,11 +502,25 @@ open class ClockRegistry(
fun createExampleClock(clockId: ClockId): ClockController? = createClock(clockId) fun createExampleClock(clockId: ClockId): ClockController? = createClock(clockId)
fun registerClockChangeListener(listener: ClockChangeListener) = /**
* Adds [listener] to receive future clock changes.
*
* Calling from main thread to make sure the access is thread safe.
*/
fun registerClockChangeListener(listener: ClockChangeListener) {
assertMainThread()
clockChangeListeners.add(listener) clockChangeListeners.add(listener)
}
fun unregisterClockChangeListener(listener: ClockChangeListener) = /**
* Removes [listener] from future clock changes.
*
* Calling from main thread to make sure the access is thread safe.
*/
fun unregisterClockChangeListener(listener: ClockChangeListener) {
assertMainThread()
clockChangeListeners.remove(listener) clockChangeListeners.remove(listener)
}
fun createCurrentClock(): ClockController { fun createCurrentClock(): ClockController {
val clockId = currentClockId val clockId = currentClockId