|
|
|
@ -44,7 +44,9 @@ import io.element.android.libraries.matrix.impl.verification.RustSessionVerifica
@@ -44,7 +44,9 @@ import io.element.android.libraries.matrix.impl.verification.RustSessionVerifica
|
|
|
|
|
import io.element.android.libraries.sessionstorage.api.SessionStore |
|
|
|
|
import kotlinx.coroutines.CoroutineScope |
|
|
|
|
import kotlinx.coroutines.Dispatchers |
|
|
|
|
import kotlinx.coroutines.ExperimentalCoroutinesApi |
|
|
|
|
import kotlinx.coroutines.Job |
|
|
|
|
import kotlinx.coroutines.flow.MutableSharedFlow |
|
|
|
|
import kotlinx.coroutines.flow.filter |
|
|
|
|
import kotlinx.coroutines.flow.first |
|
|
|
|
import kotlinx.coroutines.flow.launchIn |
|
|
|
@ -54,7 +56,9 @@ import kotlinx.coroutines.withTimeout
@@ -54,7 +56,9 @@ import kotlinx.coroutines.withTimeout
|
|
|
|
|
import org.matrix.rustcomponents.sdk.Client |
|
|
|
|
import org.matrix.rustcomponents.sdk.ClientDelegate |
|
|
|
|
import org.matrix.rustcomponents.sdk.RequiredState |
|
|
|
|
import org.matrix.rustcomponents.sdk.SlidingSyncList |
|
|
|
|
import org.matrix.rustcomponents.sdk.SlidingSyncListBuilder |
|
|
|
|
import org.matrix.rustcomponents.sdk.SlidingSyncListOnceBuilt |
|
|
|
|
import org.matrix.rustcomponents.sdk.SlidingSyncMode |
|
|
|
|
import org.matrix.rustcomponents.sdk.SlidingSyncRequestListFilters |
|
|
|
|
import org.matrix.rustcomponents.sdk.TaskHandle |
|
|
|
@ -82,7 +86,7 @@ class RustMatrixClient constructor(
@@ -82,7 +86,7 @@ class RustMatrixClient constructor(
|
|
|
|
|
client = client, |
|
|
|
|
dispatchers = dispatchers, |
|
|
|
|
) |
|
|
|
|
private val notificationService = RustNotificationService(baseDirectory, dispatchers) |
|
|
|
|
private val notificationService = RustNotificationService(client) |
|
|
|
|
private var slidingSyncUpdateJob: Job? = null |
|
|
|
|
|
|
|
|
|
private val clientDelegate = object : ClientDelegate { |
|
|
|
@ -105,7 +109,8 @@ class RustMatrixClient constructor(
@@ -105,7 +109,8 @@ class RustMatrixClient constructor(
|
|
|
|
|
notTags = emptyList() |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
private val visibleRoomsSlidingSyncList = SlidingSyncListBuilder() |
|
|
|
|
private val visibleRoomsSlidingSyncList = MutableSharedFlow<SlidingSyncList>(replay = 1) |
|
|
|
|
private val visibleRoomsSlidingSyncListBuilder = SlidingSyncListBuilder("CurrentlyVisibleRooms") |
|
|
|
|
.timelineLimit(limit = 1u) |
|
|
|
|
.requiredState( |
|
|
|
|
requiredState = listOf( |
|
|
|
@ -115,16 +120,19 @@ class RustMatrixClient constructor(
@@ -115,16 +120,19 @@ class RustMatrixClient constructor(
|
|
|
|
|
) |
|
|
|
|
) |
|
|
|
|
.filters(visibleRoomsSlidingSyncFilters) |
|
|
|
|
.name(name = "CurrentlyVisibleRooms") |
|
|
|
|
.syncMode(mode = SlidingSyncMode.SELECTIVE) |
|
|
|
|
.addRange(0u, 20u) |
|
|
|
|
.use { |
|
|
|
|
it.build() |
|
|
|
|
} |
|
|
|
|
.onceBuilt(object : SlidingSyncListOnceBuilt { |
|
|
|
|
override fun updateList(list: SlidingSyncList): SlidingSyncList { |
|
|
|
|
visibleRoomsSlidingSyncList.tryEmit(list) |
|
|
|
|
return list |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
.requiredState( |
|
|
|
|
requiredState = listOf( |
|
|
|
@ -134,20 +142,22 @@ class RustMatrixClient constructor(
@@ -134,20 +142,22 @@ class RustMatrixClient constructor(
|
|
|
|
|
) |
|
|
|
|
) |
|
|
|
|
.filters(invitesSlidingSyncFilters) |
|
|
|
|
.name(name = "CurrentInvites") |
|
|
|
|
.syncMode(mode = SlidingSyncMode.SELECTIVE) |
|
|
|
|
.addRange(0u, 20u) |
|
|
|
|
.use { |
|
|
|
|
it.build() |
|
|
|
|
} |
|
|
|
|
.onceBuilt(object : SlidingSyncListOnceBuilt { |
|
|
|
|
override fun updateList(list: SlidingSyncList): SlidingSyncList { |
|
|
|
|
invitesSlidingSyncList.tryEmit(list) |
|
|
|
|
return list |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
private val slidingSync = client |
|
|
|
|
.slidingSync() |
|
|
|
|
.homeserver("https://slidingsync.lab.matrix.org") |
|
|
|
|
.withCommonExtensions() |
|
|
|
|
.storageKey("ElementX") |
|
|
|
|
.addList(visibleRoomsSlidingSyncList) |
|
|
|
|
.addList(invitesSlidingSyncList) |
|
|
|
|
.addList(visibleRoomsSlidingSyncListBuilder) |
|
|
|
|
.addList(invitesSlidingSyncListBuilder) |
|
|
|
|
.use { |
|
|
|
|
it.build() |
|
|
|
|
} |
|
|
|
@ -159,7 +169,6 @@ class RustMatrixClient constructor(
@@ -159,7 +169,6 @@ class RustMatrixClient constructor(
|
|
|
|
|
slidingSync, |
|
|
|
|
visibleRoomsSlidingSyncList, |
|
|
|
|
dispatchers, |
|
|
|
|
::onRestartSync |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
override val roomSummaryDataSource: RoomSummaryDataSource |
|
|
|
@ -171,7 +180,6 @@ class RustMatrixClient constructor(
@@ -171,7 +180,6 @@ class RustMatrixClient constructor(
|
|
|
|
|
slidingSync, |
|
|
|
|
invitesSlidingSyncList, |
|
|
|
|
dispatchers, |
|
|
|
|
::onRestartSync |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
override val invitesDataSource: RoomSummaryDataSource |
|
|
|
@ -194,11 +202,6 @@ class RustMatrixClient constructor(
@@ -194,11 +202,6 @@ class RustMatrixClient constructor(
|
|
|
|
|
.launchIn(coroutineScope) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private fun onRestartSync() { |
|
|
|
|
stopSync() |
|
|
|
|
startSync() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun getRoom(roomId: RoomId): MatrixRoom? { |
|
|
|
|
val slidingSyncRoom = slidingSync.getRoom(roomId.value) ?: return null |
|
|
|
|
val fullRoom = slidingSyncRoom.fullRoom() ?: return null |
|
|
|
@ -297,6 +300,7 @@ class RustMatrixClient constructor(
@@ -297,6 +300,7 @@ class RustMatrixClient constructor(
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ExperimentalCoroutinesApi |
|
|
|
|
override fun close() { |
|
|
|
|
slidingSyncUpdateJob?.cancel() |
|
|
|
|
stopSync() |
|
|
|
@ -304,7 +308,10 @@ class RustMatrixClient constructor(
@@ -304,7 +308,10 @@ class RustMatrixClient constructor(
|
|
|
|
|
rustRoomSummaryDataSource.close() |
|
|
|
|
rustInvitesDataSource.close() |
|
|
|
|
client.setDelegate(null) |
|
|
|
|
visibleRoomsSlidingSyncList.destroy() |
|
|
|
|
visibleRoomsSlidingSyncListBuilder.destroy() |
|
|
|
|
invitesSlidingSyncListBuilder.destroy() |
|
|
|
|
visibleRoomsSlidingSyncList.resetReplayCache() |
|
|
|
|
invitesSlidingSyncList.resetReplayCache() |
|
|
|
|
slidingSync.destroy() |
|
|
|
|
verificationService.destroy() |
|
|
|
|
client.destroy() |
|
|
|
|