From 7504b0fdbd21586786f274c73133a9df7b9e5089 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 9 Mar 2023 19:58:17 +0100 Subject: [PATCH] [MatrixSDK] makes sure to release FFI objects from RustMatrixClient --- .../roomlist/impl/RoomListPresenter.kt | 4 +-- .../libraries/matrix/api/MatrixClient.kt | 4 +-- .../libraries/matrix/impl/RustMatrixClient.kt | 34 ++++++++++++------- .../libraries/matrix/test/FakeMatrixClient.kt | 8 +---- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt index 1ec5dc6bd2..73520e08fb 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt @@ -58,7 +58,7 @@ class RoomListPresenter @Inject constructor( } var filter by rememberSaveable { mutableStateOf("") } val roomSummaries by client - .roomSummaryDataSource() + .roomSummaryDataSource .roomSummaries() .collectAsState() @@ -125,7 +125,7 @@ class RoomListPresenter @Inject constructor( // Safe to give bigger size than room list val extendedRangeEnd = range.last + midExtendedRangeSize val extendedRange = IntRange(extendedRangeStart, extendedRangeEnd) - client.roomSummaryDataSource().setSlidingSyncRange(extendedRange) + client.roomSummaryDataSource.setSlidingSyncRange(extendedRange) } private suspend fun mapRoomSummaries( diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt index 71d9e2a60c..52ea513ff2 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt @@ -24,12 +24,12 @@ import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource import org.matrix.rustcomponents.sdk.MediaSource import java.io.Closeable -interface MatrixClient : Closeable { +interface MatrixClient { val sessionId: SessionId + val roomSummaryDataSource: RoomSummaryDataSource fun getRoom(roomId: RoomId): MatrixRoom? fun startSync() fun stopSync() - fun roomSummaryDataSource(): RoomSummaryDataSource fun mediaResolver(): MediaResolver suspend fun logout() suspend fun loadUserDisplayName(): Result diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index e75dd756a2..2539df41e4 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -20,14 +20,14 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.media.MediaResolver +import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource import io.element.android.libraries.matrix.impl.media.RustMediaResolver import io.element.android.libraries.matrix.impl.room.RustMatrixRoom import io.element.android.libraries.matrix.impl.room.RustRoomSummaryDataSource import io.element.android.libraries.matrix.impl.sync.SlidingSyncObserverProxy import io.element.android.libraries.sessionstorage.api.SessionStore -import io.element.android.libraries.matrix.api.media.MediaResolver -import io.element.android.libraries.matrix.api.room.MatrixRoom -import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.withContext import org.matrix.rustcomponents.sdk.Client @@ -38,6 +38,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncMode import org.matrix.rustcomponents.sdk.SlidingSyncRequestListFilters import org.matrix.rustcomponents.sdk.SlidingSyncViewBuilder import org.matrix.rustcomponents.sdk.TaskHandle +import org.matrix.rustcomponents.sdk.use import timber.log.Timber import java.io.File import java.util.concurrent.atomic.AtomicBoolean @@ -94,7 +95,9 @@ class RustMatrixClient constructor( .sendUpdatesForItems(true) .syncMode(mode = SlidingSyncMode.SELECTIVE) .addRange(0u, 20u) - .build() + .use { + it.build() + } private val slidingSync = client .slidingSync() @@ -102,10 +105,12 @@ class RustMatrixClient constructor( .withCommonExtensions() .coldCache("ElementX") .addView(visibleRoomsView) - .build() + .use { + it.build() + } private val slidingSyncObserverProxy = SlidingSyncObserverProxy(coroutineScope) - private val roomSummaryDataSource: RustRoomSummaryDataSource = + private val rustRoomSummaryDataSource: RustRoomSummaryDataSource = RustRoomSummaryDataSource( slidingSyncObserverProxy.updateSummaryFlow, slidingSync, @@ -113,6 +118,10 @@ class RustMatrixClient constructor( dispatchers, ::onRestartSync ) + + override val roomSummaryDataSource: RoomSummaryDataSource + get() = rustRoomSummaryDataSource + private var slidingSyncObserverToken: TaskHandle? = null private val mediaResolver = RustMediaResolver(this) @@ -120,7 +129,7 @@ class RustMatrixClient constructor( init { client.setDelegate(clientDelegate) - roomSummaryDataSource.init() + rustRoomSummaryDataSource.init() slidingSync.setObserver(slidingSyncObserverProxy) } @@ -141,8 +150,6 @@ class RustMatrixClient constructor( ) } - override fun roomSummaryDataSource(): RoomSummaryDataSource = roomSummaryDataSource - override fun mediaResolver(): MediaResolver = mediaResolver override fun startSync() { @@ -154,15 +161,17 @@ class RustMatrixClient constructor( override fun stopSync() { if (isSyncing.compareAndSet(true, false)) { - slidingSyncObserverToken?.cancel() + slidingSyncObserverToken?.use { it.cancel() } } } - override fun close() { + private fun close() { stopSync() slidingSync.setObserver(null) - roomSummaryDataSource.close() + rustRoomSummaryDataSource.close() client.setDelegate(null) + visibleRoomsView.destroy() + slidingSync.destroy() } override suspend fun logout() = withContext(dispatchers.io) { @@ -172,6 +181,7 @@ class RustMatrixClient constructor( } catch (failure: Throwable) { Timber.e(failure, "Fail to call logout on HS. Still delete local files.") } + client.destroy() baseDirectory.deleteSessionDirectory(userID = client.userId()) sessionStore.removeSession(client.userId()) } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt index d5326fc725..7bdaec6c0b 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt @@ -32,7 +32,7 @@ class FakeMatrixClient( override val sessionId: SessionId = A_SESSION_ID, private val userDisplayName: Result = Result.success(A_USER_NAME), private val userAvatarURLString: Result = Result.success(AN_AVATAR_URL), - val roomSummaryDataSource: RoomSummaryDataSource = FakeRoomSummaryDataSource() + override val roomSummaryDataSource: RoomSummaryDataSource = FakeRoomSummaryDataSource() ) : MatrixClient { private var logoutFailure: Throwable? = null @@ -45,10 +45,6 @@ class FakeMatrixClient( override fun stopSync() = Unit - override fun roomSummaryDataSource(): RoomSummaryDataSource { - return roomSummaryDataSource - } - override fun mediaResolver(): MediaResolver { return FakeMediaResolver() } @@ -77,6 +73,4 @@ class FakeMatrixClient( override suspend fun loadMediaThumbnailForSource(source: MediaSource, width: Long, height: Long): Result { return Result.success(ByteArray(0)) } - - override fun close() = Unit }