Browse Source

[MatrixSDK] makes sure to release FFI objects from RustMatrixClient

misc/jme/add-logging-to-state-machine
ganfra 2 years ago
parent
commit
7504b0fdbd
  1. 4
      features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt
  2. 4
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt
  3. 34
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt
  4. 8
      libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt

4
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("") } var filter by rememberSaveable { mutableStateOf("") }
val roomSummaries by client val roomSummaries by client
.roomSummaryDataSource() .roomSummaryDataSource
.roomSummaries() .roomSummaries()
.collectAsState() .collectAsState()
@ -125,7 +125,7 @@ class RoomListPresenter @Inject constructor(
// Safe to give bigger size than room list // Safe to give bigger size than room list
val extendedRangeEnd = range.last + midExtendedRangeSize val extendedRangeEnd = range.last + midExtendedRangeSize
val extendedRange = IntRange(extendedRangeStart, extendedRangeEnd) val extendedRange = IntRange(extendedRangeStart, extendedRangeEnd)
client.roomSummaryDataSource().setSlidingSyncRange(extendedRange) client.roomSummaryDataSource.setSlidingSyncRange(extendedRange)
} }
private suspend fun mapRoomSummaries( private suspend fun mapRoomSummaries(

4
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 org.matrix.rustcomponents.sdk.MediaSource
import java.io.Closeable import java.io.Closeable
interface MatrixClient : Closeable { interface MatrixClient {
val sessionId: SessionId val sessionId: SessionId
val roomSummaryDataSource: RoomSummaryDataSource
fun getRoom(roomId: RoomId): MatrixRoom? fun getRoom(roomId: RoomId): MatrixRoom?
fun startSync() fun startSync()
fun stopSync() fun stopSync()
fun roomSummaryDataSource(): RoomSummaryDataSource
fun mediaResolver(): MediaResolver fun mediaResolver(): MediaResolver
suspend fun logout() suspend fun logout()
suspend fun loadUserDisplayName(): Result<String> suspend fun loadUserDisplayName(): Result<String>

34
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.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId 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.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.media.RustMediaResolver
import io.element.android.libraries.matrix.impl.room.RustMatrixRoom 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.room.RustRoomSummaryDataSource
import io.element.android.libraries.matrix.impl.sync.SlidingSyncObserverProxy import io.element.android.libraries.matrix.impl.sync.SlidingSyncObserverProxy
import io.element.android.libraries.sessionstorage.api.SessionStore 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.CoroutineScope
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.matrix.rustcomponents.sdk.Client 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.SlidingSyncRequestListFilters
import org.matrix.rustcomponents.sdk.SlidingSyncViewBuilder import org.matrix.rustcomponents.sdk.SlidingSyncViewBuilder
import org.matrix.rustcomponents.sdk.TaskHandle import org.matrix.rustcomponents.sdk.TaskHandle
import org.matrix.rustcomponents.sdk.use
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
@ -94,7 +95,9 @@ class RustMatrixClient constructor(
.sendUpdatesForItems(true) .sendUpdatesForItems(true)
.syncMode(mode = SlidingSyncMode.SELECTIVE) .syncMode(mode = SlidingSyncMode.SELECTIVE)
.addRange(0u, 20u) .addRange(0u, 20u)
.build() .use {
it.build()
}
private val slidingSync = client private val slidingSync = client
.slidingSync() .slidingSync()
@ -102,10 +105,12 @@ class RustMatrixClient constructor(
.withCommonExtensions() .withCommonExtensions()
.coldCache("ElementX") .coldCache("ElementX")
.addView(visibleRoomsView) .addView(visibleRoomsView)
.build() .use {
it.build()
}
private val slidingSyncObserverProxy = SlidingSyncObserverProxy(coroutineScope) private val slidingSyncObserverProxy = SlidingSyncObserverProxy(coroutineScope)
private val roomSummaryDataSource: RustRoomSummaryDataSource = private val rustRoomSummaryDataSource: RustRoomSummaryDataSource =
RustRoomSummaryDataSource( RustRoomSummaryDataSource(
slidingSyncObserverProxy.updateSummaryFlow, slidingSyncObserverProxy.updateSummaryFlow,
slidingSync, slidingSync,
@ -113,6 +118,10 @@ class RustMatrixClient constructor(
dispatchers, dispatchers,
::onRestartSync ::onRestartSync
) )
override val roomSummaryDataSource: RoomSummaryDataSource
get() = rustRoomSummaryDataSource
private var slidingSyncObserverToken: TaskHandle? = null private var slidingSyncObserverToken: TaskHandle? = null
private val mediaResolver = RustMediaResolver(this) private val mediaResolver = RustMediaResolver(this)
@ -120,7 +129,7 @@ class RustMatrixClient constructor(
init { init {
client.setDelegate(clientDelegate) client.setDelegate(clientDelegate)
roomSummaryDataSource.init() rustRoomSummaryDataSource.init()
slidingSync.setObserver(slidingSyncObserverProxy) slidingSync.setObserver(slidingSyncObserverProxy)
} }
@ -141,8 +150,6 @@ class RustMatrixClient constructor(
) )
} }
override fun roomSummaryDataSource(): RoomSummaryDataSource = roomSummaryDataSource
override fun mediaResolver(): MediaResolver = mediaResolver override fun mediaResolver(): MediaResolver = mediaResolver
override fun startSync() { override fun startSync() {
@ -154,15 +161,17 @@ class RustMatrixClient constructor(
override fun stopSync() { override fun stopSync() {
if (isSyncing.compareAndSet(true, false)) { if (isSyncing.compareAndSet(true, false)) {
slidingSyncObserverToken?.cancel() slidingSyncObserverToken?.use { it.cancel() }
} }
} }
override fun close() { private fun close() {
stopSync() stopSync()
slidingSync.setObserver(null) slidingSync.setObserver(null)
roomSummaryDataSource.close() rustRoomSummaryDataSource.close()
client.setDelegate(null) client.setDelegate(null)
visibleRoomsView.destroy()
slidingSync.destroy()
} }
override suspend fun logout() = withContext(dispatchers.io) { override suspend fun logout() = withContext(dispatchers.io) {
@ -172,6 +181,7 @@ class RustMatrixClient constructor(
} catch (failure: Throwable) { } catch (failure: Throwable) {
Timber.e(failure, "Fail to call logout on HS. Still delete local files.") Timber.e(failure, "Fail to call logout on HS. Still delete local files.")
} }
client.destroy()
baseDirectory.deleteSessionDirectory(userID = client.userId()) baseDirectory.deleteSessionDirectory(userID = client.userId())
sessionStore.removeSession(client.userId()) sessionStore.removeSession(client.userId())
} }

8
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, override val sessionId: SessionId = A_SESSION_ID,
private val userDisplayName: Result<String> = Result.success(A_USER_NAME), private val userDisplayName: Result<String> = Result.success(A_USER_NAME),
private val userAvatarURLString: Result<String> = Result.success(AN_AVATAR_URL), private val userAvatarURLString: Result<String> = Result.success(AN_AVATAR_URL),
val roomSummaryDataSource: RoomSummaryDataSource = FakeRoomSummaryDataSource() override val roomSummaryDataSource: RoomSummaryDataSource = FakeRoomSummaryDataSource()
) : MatrixClient { ) : MatrixClient {
private var logoutFailure: Throwable? = null private var logoutFailure: Throwable? = null
@ -45,10 +45,6 @@ class FakeMatrixClient(
override fun stopSync() = Unit override fun stopSync() = Unit
override fun roomSummaryDataSource(): RoomSummaryDataSource {
return roomSummaryDataSource
}
override fun mediaResolver(): MediaResolver { override fun mediaResolver(): MediaResolver {
return FakeMediaResolver() return FakeMediaResolver()
} }
@ -77,6 +73,4 @@ class FakeMatrixClient(
override suspend fun loadMediaThumbnailForSource(source: MediaSource, width: Long, height: Long): Result<ByteArray> { override suspend fun loadMediaThumbnailForSource(source: MediaSource, width: Long, height: Long): Result<ByteArray> {
return Result.success(ByteArray(0)) return Result.success(ByteArray(0))
} }
override fun close() = Unit
} }

Loading…
Cancel
Save