From 661b9d8653cb0b4f119f70bf97a2e24a2b9ecb4a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 21 Feb 2024 11:24:35 +0100 Subject: [PATCH] Keep references on TaskHandle, to avoid it to be garbage collected, and so the listeners are stopped. --- .../matrix/impl/encryption/RustEncryptionService.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt index 282e5814ef..84e9fb2f14 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt @@ -25,6 +25,7 @@ import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.api.encryption.RecoveryState import io.element.android.libraries.matrix.api.sync.SyncState import io.element.android.libraries.matrix.impl.sync.RustSyncService +import io.element.android.libraries.matrix.impl.util.cancelAndDestroy import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.currentCoroutineContext @@ -45,6 +46,7 @@ import org.matrix.rustcomponents.sdk.Client import org.matrix.rustcomponents.sdk.EnableRecoveryProgressListener import org.matrix.rustcomponents.sdk.Encryption import org.matrix.rustcomponents.sdk.RecoveryStateListener +import org.matrix.rustcomponents.sdk.TaskHandle import org.matrix.rustcomponents.sdk.BackupState as RustBackupState import org.matrix.rustcomponents.sdk.BackupUploadState as RustBackupUploadState import org.matrix.rustcomponents.sdk.EnableRecoveryProgress as RustEnableRecoveryProgress @@ -64,6 +66,8 @@ internal class RustEncryptionService( private val enableRecoveryProgressMapper = EnableRecoveryProgressMapper() private val backupUploadStateMapper = BackupUploadStateMapper() private val steadyStateExceptionMapper = SteadyStateExceptionMapper() + private var backupStateListenerTaskHandle: TaskHandle? = null + private var recoveryStateListenerTaskHandle: TaskHandle? = null private val backupStateFlow = MutableStateFlow(service.backupState().let(backupStateMapper::map)) @@ -108,13 +112,13 @@ internal class RustEncryptionService( .stateIn(sessionCoroutineScope, SharingStarted.Eagerly, false) fun start() { - service.backupStateListener(object : BackupStateListener { + backupStateListenerTaskHandle = service.backupStateListener(object : BackupStateListener { override fun onUpdate(status: RustBackupState) { backupStateFlow.value = backupStateMapper.map(status) } }) - service.recoveryStateListener(object : RecoveryStateListener { + recoveryStateListenerTaskHandle = service.recoveryStateListener(object : RecoveryStateListener { override fun onUpdate(status: RustRecoveryState) { recoveryStateFlow.value = recoveryStateMapper.map(status) } @@ -122,7 +126,8 @@ internal class RustEncryptionService( } fun destroy() { - // No way to remove the listeners... + backupStateListenerTaskHandle?.cancelAndDestroy() + recoveryStateListenerTaskHandle?.cancelAndDestroy() service.destroy() }