Update dependency org.matrix.rustcomponents:sdk-android to v0.1.12 (#407)
* Update dependency org.matrix.rustcomponents:sdk-android to v0.1.12 * Fix Rust SDK update issues. * Try to handle Rust memory more gracefully. --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jorge Martín <jorgem@element.io>
This commit is contained in:
parent
cd298b9359
commit
081c86e8db
7 changed files with 68 additions and 61 deletions
|
|
@ -129,7 +129,7 @@ jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" }
|
||||||
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
|
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
|
||||||
molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule" }
|
molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule" }
|
||||||
timber = "com.jakewharton.timber:timber:5.0.1"
|
timber = "com.jakewharton.timber:timber:5.0.1"
|
||||||
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.11"
|
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.12"
|
||||||
sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" }
|
sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" }
|
||||||
sqldelight-driver-jvm = { module = "com.squareup.sqldelight:sqlite-driver", version.ref = "sqldelight" }
|
sqldelight-driver-jvm = { module = "com.squareup.sqldelight:sqlite-driver", version.ref = "sqldelight" }
|
||||||
sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
|
sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
|
||||||
|
|
|
||||||
|
|
@ -21,5 +21,5 @@ import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
|
|
||||||
interface NotificationService {
|
interface NotificationService {
|
||||||
suspend fun getNotification(userId: SessionId, roomId: RoomId, eventId: EventId): Result<NotificationData?>
|
fun getNotification(userId: SessionId, roomId: RoomId, eventId: EventId): Result<NotificationData?>
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,9 @@ import io.element.android.libraries.matrix.impl.verification.RustSessionVerifica
|
||||||
import io.element.android.libraries.sessionstorage.api.SessionStore
|
import io.element.android.libraries.sessionstorage.api.SessionStore
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
import kotlinx.coroutines.flow.filter
|
import kotlinx.coroutines.flow.filter
|
||||||
import kotlinx.coroutines.flow.first
|
import kotlinx.coroutines.flow.first
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
|
|
@ -54,7 +56,9 @@ import kotlinx.coroutines.withTimeout
|
||||||
import org.matrix.rustcomponents.sdk.Client
|
import org.matrix.rustcomponents.sdk.Client
|
||||||
import org.matrix.rustcomponents.sdk.ClientDelegate
|
import org.matrix.rustcomponents.sdk.ClientDelegate
|
||||||
import org.matrix.rustcomponents.sdk.RequiredState
|
import org.matrix.rustcomponents.sdk.RequiredState
|
||||||
|
import org.matrix.rustcomponents.sdk.SlidingSyncList
|
||||||
import org.matrix.rustcomponents.sdk.SlidingSyncListBuilder
|
import org.matrix.rustcomponents.sdk.SlidingSyncListBuilder
|
||||||
|
import org.matrix.rustcomponents.sdk.SlidingSyncListOnceBuilt
|
||||||
import org.matrix.rustcomponents.sdk.SlidingSyncMode
|
import org.matrix.rustcomponents.sdk.SlidingSyncMode
|
||||||
import org.matrix.rustcomponents.sdk.SlidingSyncRequestListFilters
|
import org.matrix.rustcomponents.sdk.SlidingSyncRequestListFilters
|
||||||
import org.matrix.rustcomponents.sdk.TaskHandle
|
import org.matrix.rustcomponents.sdk.TaskHandle
|
||||||
|
|
@ -82,7 +86,7 @@ class RustMatrixClient constructor(
|
||||||
client = client,
|
client = client,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
)
|
)
|
||||||
private val notificationService = RustNotificationService(baseDirectory, dispatchers)
|
private val notificationService = RustNotificationService(client)
|
||||||
private var slidingSyncUpdateJob: Job? = null
|
private var slidingSyncUpdateJob: Job? = null
|
||||||
|
|
||||||
private val clientDelegate = object : ClientDelegate {
|
private val clientDelegate = object : ClientDelegate {
|
||||||
|
|
@ -105,7 +109,8 @@ class RustMatrixClient constructor(
|
||||||
notTags = emptyList()
|
notTags = emptyList()
|
||||||
)
|
)
|
||||||
|
|
||||||
private val visibleRoomsSlidingSyncList = SlidingSyncListBuilder()
|
private val visibleRoomsSlidingSyncList = MutableSharedFlow<SlidingSyncList>(replay = 1)
|
||||||
|
private val visibleRoomsSlidingSyncListBuilder = SlidingSyncListBuilder("CurrentlyVisibleRooms")
|
||||||
.timelineLimit(limit = 1u)
|
.timelineLimit(limit = 1u)
|
||||||
.requiredState(
|
.requiredState(
|
||||||
requiredState = listOf(
|
requiredState = listOf(
|
||||||
|
|
@ -115,16 +120,19 @@ class RustMatrixClient constructor(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.filters(visibleRoomsSlidingSyncFilters)
|
.filters(visibleRoomsSlidingSyncFilters)
|
||||||
.name(name = "CurrentlyVisibleRooms")
|
|
||||||
.syncMode(mode = SlidingSyncMode.SELECTIVE)
|
.syncMode(mode = SlidingSyncMode.SELECTIVE)
|
||||||
.addRange(0u, 20u)
|
.addRange(0u, 20u)
|
||||||
.use {
|
.onceBuilt(object : SlidingSyncListOnceBuilt {
|
||||||
it.build()
|
override fun updateList(list: SlidingSyncList): SlidingSyncList {
|
||||||
}
|
visibleRoomsSlidingSyncList.tryEmit(list)
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
private val invitesSlidingSyncFilters = visibleRoomsSlidingSyncFilters.copy(isInvite = true)
|
private val invitesSlidingSyncFilters = visibleRoomsSlidingSyncFilters.copy(isInvite = true)
|
||||||
|
|
||||||
private val invitesSlidingSyncList = SlidingSyncListBuilder()
|
private val invitesSlidingSyncList = MutableSharedFlow<SlidingSyncList>(replay = 1)
|
||||||
|
private val invitesSlidingSyncListBuilder = SlidingSyncListBuilder("CurrentInvites")
|
||||||
.timelineLimit(limit = 1u)
|
.timelineLimit(limit = 1u)
|
||||||
.requiredState(
|
.requiredState(
|
||||||
requiredState = listOf(
|
requiredState = listOf(
|
||||||
|
|
@ -134,20 +142,22 @@ class RustMatrixClient constructor(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.filters(invitesSlidingSyncFilters)
|
.filters(invitesSlidingSyncFilters)
|
||||||
.name(name = "CurrentInvites")
|
|
||||||
.syncMode(mode = SlidingSyncMode.SELECTIVE)
|
.syncMode(mode = SlidingSyncMode.SELECTIVE)
|
||||||
.addRange(0u, 20u)
|
.addRange(0u, 20u)
|
||||||
.use {
|
.onceBuilt(object : SlidingSyncListOnceBuilt {
|
||||||
it.build()
|
override fun updateList(list: SlidingSyncList): SlidingSyncList {
|
||||||
}
|
invitesSlidingSyncList.tryEmit(list)
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
private val slidingSync = client
|
private val slidingSync = client
|
||||||
.slidingSync()
|
.slidingSync()
|
||||||
.homeserver("https://slidingsync.lab.matrix.org")
|
.homeserver("https://slidingsync.lab.matrix.org")
|
||||||
.withCommonExtensions()
|
.withCommonExtensions()
|
||||||
.storageKey("ElementX")
|
.storageKey("ElementX")
|
||||||
.addList(visibleRoomsSlidingSyncList)
|
.addList(visibleRoomsSlidingSyncListBuilder)
|
||||||
.addList(invitesSlidingSyncList)
|
.addList(invitesSlidingSyncListBuilder)
|
||||||
.use {
|
.use {
|
||||||
it.build()
|
it.build()
|
||||||
}
|
}
|
||||||
|
|
@ -159,7 +169,6 @@ class RustMatrixClient constructor(
|
||||||
slidingSync,
|
slidingSync,
|
||||||
visibleRoomsSlidingSyncList,
|
visibleRoomsSlidingSyncList,
|
||||||
dispatchers,
|
dispatchers,
|
||||||
::onRestartSync
|
|
||||||
)
|
)
|
||||||
|
|
||||||
override val roomSummaryDataSource: RoomSummaryDataSource
|
override val roomSummaryDataSource: RoomSummaryDataSource
|
||||||
|
|
@ -171,7 +180,6 @@ class RustMatrixClient constructor(
|
||||||
slidingSync,
|
slidingSync,
|
||||||
invitesSlidingSyncList,
|
invitesSlidingSyncList,
|
||||||
dispatchers,
|
dispatchers,
|
||||||
::onRestartSync
|
|
||||||
)
|
)
|
||||||
|
|
||||||
override val invitesDataSource: RoomSummaryDataSource
|
override val invitesDataSource: RoomSummaryDataSource
|
||||||
|
|
@ -194,11 +202,6 @@ class RustMatrixClient constructor(
|
||||||
.launchIn(coroutineScope)
|
.launchIn(coroutineScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onRestartSync() {
|
|
||||||
stopSync()
|
|
||||||
startSync()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getRoom(roomId: RoomId): MatrixRoom? {
|
override fun getRoom(roomId: RoomId): MatrixRoom? {
|
||||||
val slidingSyncRoom = slidingSync.getRoom(roomId.value) ?: return null
|
val slidingSyncRoom = slidingSync.getRoom(roomId.value) ?: return null
|
||||||
val fullRoom = slidingSyncRoom.fullRoom() ?: return null
|
val fullRoom = slidingSyncRoom.fullRoom() ?: return null
|
||||||
|
|
@ -297,6 +300,7 @@ class RustMatrixClient constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ExperimentalCoroutinesApi
|
||||||
override fun close() {
|
override fun close() {
|
||||||
slidingSyncUpdateJob?.cancel()
|
slidingSyncUpdateJob?.cancel()
|
||||||
stopSync()
|
stopSync()
|
||||||
|
|
@ -304,7 +308,10 @@ class RustMatrixClient constructor(
|
||||||
rustRoomSummaryDataSource.close()
|
rustRoomSummaryDataSource.close()
|
||||||
rustInvitesDataSource.close()
|
rustInvitesDataSource.close()
|
||||||
client.setDelegate(null)
|
client.setDelegate(null)
|
||||||
visibleRoomsSlidingSyncList.destroy()
|
visibleRoomsSlidingSyncListBuilder.destroy()
|
||||||
|
invitesSlidingSyncListBuilder.destroy()
|
||||||
|
visibleRoomsSlidingSyncList.resetReplayCache()
|
||||||
|
invitesSlidingSyncList.resetReplayCache()
|
||||||
slidingSync.destroy()
|
slidingSync.destroy()
|
||||||
verificationService.destroy()
|
verificationService.destroy()
|
||||||
client.destroy()
|
client.destroy()
|
||||||
|
|
|
||||||
|
|
@ -17,33 +17,30 @@
|
||||||
package io.element.android.libraries.matrix.impl.notification
|
package io.element.android.libraries.matrix.impl.notification
|
||||||
|
|
||||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||||
|
import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
import io.element.android.libraries.matrix.api.core.EventId
|
import io.element.android.libraries.matrix.api.core.EventId
|
||||||
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.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.matrix.api.notification.NotificationData
|
import io.element.android.libraries.matrix.api.notification.NotificationData
|
||||||
import io.element.android.libraries.matrix.api.notification.NotificationService
|
import io.element.android.libraries.matrix.api.notification.NotificationService
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
import org.matrix.rustcomponents.sdk.Client
|
||||||
|
import org.matrix.rustcomponents.sdk.use
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class RustNotificationService(
|
class RustNotificationService(
|
||||||
private val baseDirectory: File,
|
private val client: Client,
|
||||||
private val dispatchers: CoroutineDispatchers,
|
|
||||||
) : NotificationService {
|
) : NotificationService {
|
||||||
private val notificationMapper: NotificationMapper = NotificationMapper()
|
private val notificationMapper: NotificationMapper = NotificationMapper()
|
||||||
|
|
||||||
override suspend fun getNotification(userId: SessionId, roomId: RoomId, eventId: EventId): Result<NotificationData?> {
|
override fun getNotification(
|
||||||
return withContext(dispatchers.io) {
|
userId: SessionId,
|
||||||
runCatching {
|
roomId: RoomId,
|
||||||
org.matrix.rustcomponents.sdk.NotificationService(
|
eventId: EventId
|
||||||
basePath = File(baseDirectory, "sessions").absolutePath,
|
): Result<NotificationData?> {
|
||||||
userId = userId.value
|
return runCatching {
|
||||||
).use {
|
client.getNotificationItem(roomId.value, eventId.value).use(notificationMapper::map)
|
||||||
// TODO Not implemented yet, see https://github.com/matrix-org/matrix-rust-sdk/issues/1628
|
|
||||||
it.getNotificationItem(roomId.value, eventId.value)?.let { notificationItem ->
|
|
||||||
notificationMapper.map(notificationItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,6 @@ import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.flow.filter
|
import kotlinx.coroutines.flow.filter
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.onStart
|
import kotlinx.coroutines.flow.onStart
|
||||||
import kotlinx.coroutines.flow.onSubscription
|
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.matrix.rustcomponents.sdk.Room
|
import org.matrix.rustcomponents.sdk.Room
|
||||||
import org.matrix.rustcomponents.sdk.SlidingSyncRoom
|
import org.matrix.rustcomponents.sdk.SlidingSyncRoom
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,12 @@ import kotlinx.coroutines.cancel
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.first
|
||||||
|
import kotlinx.coroutines.flow.firstOrNull
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.matrix.rustcomponents.sdk.RoomListEntry
|
import org.matrix.rustcomponents.sdk.RoomListEntry
|
||||||
import org.matrix.rustcomponents.sdk.SlidingSync
|
import org.matrix.rustcomponents.sdk.SlidingSync
|
||||||
|
|
@ -44,9 +47,8 @@ import java.util.UUID
|
||||||
internal class RustRoomSummaryDataSource(
|
internal class RustRoomSummaryDataSource(
|
||||||
private val slidingSyncUpdateFlow: Flow<UpdateSummary>,
|
private val slidingSyncUpdateFlow: Flow<UpdateSummary>,
|
||||||
private val slidingSync: SlidingSync,
|
private val slidingSync: SlidingSync,
|
||||||
private val slidingSyncList: SlidingSyncList,
|
private val slidingSyncListFlow: Flow<SlidingSyncList>,
|
||||||
private val coroutineDispatchers: CoroutineDispatchers,
|
private val coroutineDispatchers: CoroutineDispatchers,
|
||||||
private val onRestartSync: () -> Unit,
|
|
||||||
private val roomSummaryDetailsFactory: RoomSummaryDetailsFactory = RoomSummaryDetailsFactory(),
|
private val roomSummaryDetailsFactory: RoomSummaryDetailsFactory = RoomSummaryDetailsFactory(),
|
||||||
) : RoomSummaryDataSource, Closeable {
|
) : RoomSummaryDataSource, Closeable {
|
||||||
|
|
||||||
|
|
@ -57,34 +59,35 @@ internal class RustRoomSummaryDataSource(
|
||||||
|
|
||||||
fun init() {
|
fun init() {
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
|
val slidingSyncList = slidingSyncListFlow.first()
|
||||||
|
val summaries = slidingSyncList.currentRoomList().map(::buildSummaryForRoomListEntry)
|
||||||
updateRoomSummaries {
|
updateRoomSummaries {
|
||||||
addAll(
|
addAll(summaries)
|
||||||
slidingSyncList.currentRoomList().map(::buildSummaryForRoomListEntry)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
slidingSyncList.roomListDiff(this)
|
||||||
|
.onEach { diffs ->
|
||||||
|
updateRoomSummaries {
|
||||||
|
applyDiff(diffs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.launchIn(this)
|
||||||
|
|
||||||
|
slidingSyncList.state(this)
|
||||||
|
.onEach { slidingSyncState ->
|
||||||
|
Timber.v("New sliding sync state: $slidingSyncState")
|
||||||
|
state.value = slidingSyncState
|
||||||
|
}.launchIn(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
slidingSyncUpdateFlow
|
slidingSyncUpdateFlow
|
||||||
.onEach {
|
.onEach {
|
||||||
didReceiveSyncUpdate(it)
|
didReceiveSyncUpdate(it)
|
||||||
}.launchIn(coroutineScope)
|
}.launchIn(coroutineScope)
|
||||||
|
|
||||||
slidingSyncList.roomListDiff(coroutineScope)
|
|
||||||
.onEach { diffs ->
|
|
||||||
updateRoomSummaries {
|
|
||||||
applyDiff(diffs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.launchIn(coroutineScope)
|
|
||||||
|
|
||||||
slidingSyncList.state(coroutineScope)
|
|
||||||
.onEach { slidingSyncState ->
|
|
||||||
Timber.v("New sliding sync state: $slidingSyncState")
|
|
||||||
state.value = slidingSyncState
|
|
||||||
}.launchIn(coroutineScope)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close() {
|
override fun close() {
|
||||||
|
runBlocking { slidingSyncListFlow.firstOrNull() }?.close()
|
||||||
coroutineScope.cancel()
|
coroutineScope.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -95,8 +98,9 @@ internal class RustRoomSummaryDataSource(
|
||||||
|
|
||||||
override fun setSlidingSyncRange(range: IntRange) {
|
override fun setSlidingSyncRange(range: IntRange) {
|
||||||
Timber.v("setVisibleRange=$range")
|
Timber.v("setVisibleRange=$range")
|
||||||
slidingSyncList.setRange(range.first.toUInt(), range.last.toUInt())
|
coroutineScope.launch {
|
||||||
onRestartSync()
|
slidingSyncListFlow.first().setRange(range.first.toUInt(), range.last.toUInt())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun didReceiveSyncUpdate(summary: UpdateSummary) {
|
private suspend fun didReceiveSyncUpdate(summary: UpdateSummary) {
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ import io.element.android.libraries.matrix.api.notification.NotificationData
|
||||||
import io.element.android.libraries.matrix.api.notification.NotificationService
|
import io.element.android.libraries.matrix.api.notification.NotificationService
|
||||||
|
|
||||||
class FakeNotificationService : NotificationService {
|
class FakeNotificationService : NotificationService {
|
||||||
override suspend fun getNotification(userId: SessionId, roomId: RoomId, eventId: EventId): Result<NotificationData?> {
|
override fun getNotification(userId: SessionId, roomId: RoomId, eventId: EventId): Result<NotificationData?> {
|
||||||
return Result.success(null)
|
return Result.success(null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue