From e38960ff845bddbd463c43801ad01834f77474f2 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 17 Jan 2022 02:06:41 -0600 Subject: Implemented timer that fetches units every 10 seconds, and updated map to work with timer --- .../TrackerMap/controllers/UnitsController.kt | 45 +++++++++++++++------- .../mx/trackermap/TrackerMap/utils/Coroutines.kt | 20 ++++++++++ 2 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/Coroutines.kt (limited to 'shared') diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt index 584f656..21692e7 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt @@ -1,17 +1,23 @@ package mx.trackermap.TrackerMap.controllers +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import mx.trackermap.TrackerMap.client.apis.DevicesApi import mx.trackermap.TrackerMap.client.apis.PositionsApi import mx.trackermap.TrackerMap.client.models.Position import mx.trackermap.TrackerMap.client.models.UnitInformation +import mx.trackermap.TrackerMap.utils.Coroutines +import kotlin.time.Duration.Companion.seconds +import kotlin.time.ExperimentalTime @DelicateCoroutinesApi +@ExperimentalTime class UnitsController( private val devicesApi: DevicesApi, private val positionsApi: PositionsApi @@ -23,28 +29,39 @@ class UnitsController( init { GlobalScope.launch { - fetchUnits() + fetchUnits(this) } GlobalScope.launch { setupFlows() } } - private suspend fun fetchUnits() { - val devices = devicesApi.devicesGet() - val positions = positionsApi.positionsGet() - val positionsMap: MutableMap = mutableMapOf() - - positions.forEach { position -> - position.deviceId?.let { - positionsMap[it] = position + private suspend fun fetchUnits(scope: CoroutineScope) { + Coroutines.tickerFlow(10.seconds) + .map { + print("Fetching new positions...\n") + positionsApi.positionsGet() } - } + .distinctUntilChanged { old, new -> + old.contentEquals(new) + } + .onEach { positions -> + print("Position(s) changed! Reloading data...\n") + val devices = devicesApi.devicesGet() + val positionsMap: MutableMap = mutableMapOf() - val units = devices.map { - UnitInformation(it, positionsMap[it.id]) - } - unitsFlow.value = units + positions.forEach { position -> + position.deviceId?.let { + positionsMap[it] = position + } + } + + val units = devices.map { + UnitInformation(it, positionsMap[it.id]) + } + unitsFlow.value = units + } + .launchIn(scope) } fun search(query: String) { diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/Coroutines.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/Coroutines.kt new file mode 100644 index 0000000..c953887 --- /dev/null +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/Coroutines.kt @@ -0,0 +1,20 @@ +package mx.trackermap.TrackerMap.utils + +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flow +import kotlin.time.Duration +import kotlin.time.ExperimentalTime + +class Coroutines { + companion object { + // Source: https://stackoverflow.com/questions/54827455/how-to-implement-timer-with-kotlin-coroutines/54828055#54828055 + @ExperimentalTime + fun tickerFlow(period: Duration, initialDelay: Duration = Duration.ZERO) = flow { + delay(initialDelay) + while (true) { + emit(Unit) + delay(period) + } + } + } +} \ No newline at end of file -- cgit v1.2.3