[MatrixSDK] makes sure to release FFI objects from RustMatrixClient

This commit is contained in:
ganfra 2023-03-09 19:58:17 +01:00
parent 61e67b932d
commit 7504b0fdbd
4 changed files with 27 additions and 23 deletions

View file

@ -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())
}