From 82ee2567b7a3f4d5369ec6c59d78bb020aae9976 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 19 Apr 2021 10:54:54 +0200 Subject: [PATCH] Provide a session scope, to launch coroutines without using the ViewModelScope It could be used elsewhere, will change other location in another commit. --- .../matrix/android/sdk/api/session/Session.kt | 5 +++++ .../sdk/internal/session/DefaultSession.kt | 18 +++++++++++++++++- .../home/room/detail/RoomDetailViewModel.kt | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt index 5f442c33f9..1250c0d36b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt @@ -272,4 +272,9 @@ interface Session : * Maintenance API, allows to print outs info on DB size to logcat */ fun logDbUsageInfo() + + /** + * Launch a coroutine using the session scope + */ + fun launch(block: suspend () -> Unit ) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt index 6c574be826..078cac278d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt @@ -19,12 +19,16 @@ package org.matrix.android.sdk.internal.session import androidx.annotation.MainThread import dagger.Lazy import io.realm.RealmConfiguration +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancelChildren +import kotlinx.coroutines.launch import okhttp3.OkHttpClient import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.failure.GlobalError import org.matrix.android.sdk.api.federation.FederationService import org.matrix.android.sdk.api.pushrules.PushRuleService -import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.account.AccountService import org.matrix.android.sdk.api.session.accountdata.AccountDataService @@ -38,6 +42,7 @@ import org.matrix.android.sdk.api.session.file.ContentDownloadStateTracker import org.matrix.android.sdk.api.session.file.FileService import org.matrix.android.sdk.api.session.group.GroupService import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService +import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService import org.matrix.android.sdk.api.session.integrationmanager.IntegrationManagerService import org.matrix.android.sdk.api.session.media.MediaService import org.matrix.android.sdk.api.session.permalinks.PermalinkService @@ -155,10 +160,13 @@ internal class DefaultSession @Inject constructor( override val isOpenable: Boolean get() = sessionParamsStore.get(sessionId)?.isTokenValid ?: false + private var sessionScope: CoroutineScope? = null + @MainThread override fun open() { assert(!isOpen) isOpen = true + sessionScope = CoroutineScope(SupervisorJob()) cryptoService.get().ensureDevice() uiHandler.post { lifecycleObservers.forEach { it.onSessionStarted() } @@ -199,6 +207,8 @@ internal class DefaultSession @Inject constructor( override fun close() { assert(isOpen) + sessionScope?.coroutineContext?.cancelChildren(CancellationException("Closing session")) + sessionScope = null stopSync() // timelineEventDecryptor.destroy() uiHandler.post { @@ -301,4 +311,10 @@ internal class DefaultSession @Inject constructor( override fun logDbUsageInfo() { RealmDebugTools(realmConfiguration).logInfo("Session") } + + override fun launch(block: suspend () -> Unit) { + sessionScope?.launch { + block() + } + } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 49f3d280e2..5bc59c7afc 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -1318,7 +1318,7 @@ class RoomDetailViewModel @AssistedInject constructor( } } bufferedMostRecentDisplayedEvent.root.eventId?.let { eventId -> - viewModelScope.launch { + session.launch { tryOrNull { room.setReadReceipt(eventId) } } }