From 568c1ae90d720b8254c5478257db564d3626869b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Fri, 28 Nov 2025 08:22:36 +0100 Subject: [PATCH] Reuse coroutine in `DefaultAnalyticsRoomListStateWatcher` instead of creating and cancelling the same one --- .../DefaultAnalyticsRoomListStateWatcher.kt | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcher.kt b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcher.kt index cd1af657b2..97e438fcee 100644 --- a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcher.kt +++ b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcher.kt @@ -20,7 +20,7 @@ import io.element.android.services.analytics.api.finishLongRunningTransaction import io.element.android.services.analytics.api.watchers.AnalyticsRoomListStateWatcher import io.element.android.services.appnavstate.api.AppNavigationStateService import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.cancel +import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map @@ -33,19 +33,19 @@ class DefaultAnalyticsRoomListStateWatcher( private val appNavigationStateService: AppNavigationStateService, private val roomListService: RoomListService, private val analyticsService: AnalyticsService, - @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, - private val dispatchers: CoroutineDispatchers, + @SessionCoroutineScope sessionCoroutineScope: CoroutineScope, + dispatchers: CoroutineDispatchers, ) : AnalyticsRoomListStateWatcher { - private var currentCoroutineScope: CoroutineScope? = null + private val coroutineScope: CoroutineScope = sessionCoroutineScope.childScope(dispatchers.computation, "AnalyticsRoomListStateWatcher") + private val isStarted = AtomicBoolean(false) private val isWarmState = AtomicBoolean(false) override fun start() { - if (currentCoroutineScope != null) { + if (isStarted.getAndSet(true)) { Timber.w("Can't start RoomListStateWatcher, it's already running.") return } - val coroutineScope = sessionCoroutineScope.childScope(dispatchers.computation, "AnalyticsRoomListStateWatcher") appNavigationStateService.appNavigationState .map { it.isInForeground } .distinctUntilChanged() @@ -68,12 +68,11 @@ class DefaultAnalyticsRoomListStateWatcher( } } .launchIn(coroutineScope) - - currentCoroutineScope = coroutineScope } override fun stop() { - currentCoroutineScope?.cancel() - currentCoroutineScope = null + if (isStarted.getAndSet(false)) { + coroutineScope.coroutineContext.cancelChildren() + } } }