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

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

8
libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt

@ -32,7 +32,7 @@ class FakeMatrixClient( @@ -32,7 +32,7 @@ class FakeMatrixClient(
override val sessionId: SessionId = A_SESSION_ID,
private val userDisplayName: Result<String> = Result.success(A_USER_NAME),
private val userAvatarURLString: Result<String> = 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( @@ -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( @@ -77,6 +73,4 @@ class FakeMatrixClient(
override suspend fun loadMediaThumbnailForSource(source: MediaSource, width: Long, height: Long): Result<ByteArray> {
return Result.success(ByteArray(0))
}
override fun close() = Unit
}

Loading…
Cancel
Save