[MatrixSDK] makes sure to release FFI objects from RustMatrixClient
This commit is contained in:
parent
08f5f6edaa
commit
bdf754c26b
4 changed files with 27 additions and 23 deletions
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue