From ec04250a9be2cf2bdc73afe94f7d27bcc095add3 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 12 Jul 2023 16:05:51 +0200 Subject: [PATCH] Update rust sdk to 0.1.31: new app service --- .../libraries/matrix/impl/RustMatrixClient.kt | 9 +++-- .../matrix/impl/sync/AppExtension.kt | 36 +++++++++++++++++++ ...omListStateMapper.kt => AppStateMapper.kt} | 9 +++++ .../matrix/impl/sync/RustSyncService.kt | 26 +++++--------- 4 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/AppExtension.kt rename libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/{RoomListStateMapper.kt => AppStateMapper.kt} (80%) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index e72dbad47f..8798e01f98 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -47,6 +47,7 @@ import io.element.android.libraries.matrix.impl.room.RoomContentForwarder 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.roomOrNull +import io.element.android.libraries.matrix.impl.room.stateFlow import io.element.android.libraries.matrix.impl.sync.RustSyncService import io.element.android.libraries.matrix.impl.usersearch.UserProfileMapper import io.element.android.libraries.matrix.impl.usersearch.UserSearchResultMapper @@ -85,11 +86,14 @@ class RustMatrixClient constructor( ) : MatrixClient { override val sessionId: UserId = UserId(client.userId()) - private val roomListService = client.roomListServiceWithEncryption() + private val app = client.app().use { builder -> + builder.finish() + } + private val roomListService = app.roomListService() private val sessionDispatcher = dispatchers.io.limitedParallelism(64) private val sessionCoroutineScope = appCoroutineScope.childScope(dispatchers.main, "Session-${sessionId}") private val verificationService = RustSessionVerificationService() - private val syncService = RustSyncService(roomListService, sessionCoroutineScope) + private val syncService = RustSyncService(app, roomListService.stateFlow(), sessionCoroutineScope) private val pushersService = RustPushersService( client = client, dispatchers = dispatchers, @@ -252,6 +256,7 @@ class RustMatrixClient constructor( sessionCoroutineScope.cancel() client.setDelegate(null) verificationService.destroy() + app.destroy() roomListService.destroy() notificationClient.destroy() client.destroy() diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/AppExtension.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/AppExtension.kt new file mode 100644 index 0000000000..a987081f96 --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/AppExtension.kt @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.impl.sync + +import io.element.android.libraries.matrix.impl.util.mxCallbackFlow +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.channels.trySendBlocking +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.buffer +import org.matrix.rustcomponents.sdk.App +import org.matrix.rustcomponents.sdk.AppState +import org.matrix.rustcomponents.sdk.AppStateObserver + +fun App.stateFlow(): Flow = + mxCallbackFlow { + val listener = object : AppStateObserver { + override fun onUpdate(state: AppState) { + trySendBlocking(state) + } + } + state(listener) + }.buffer(Channel.UNLIMITED) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RoomListStateMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/AppStateMapper.kt similarity index 80% rename from libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RoomListStateMapper.kt rename to libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/AppStateMapper.kt index 939abf2816..7db05f1efd 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RoomListStateMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/AppStateMapper.kt @@ -17,6 +17,7 @@ package io.element.android.libraries.matrix.impl.sync import io.element.android.libraries.matrix.api.sync.SyncState +import org.matrix.rustcomponents.sdk.AppState import org.matrix.rustcomponents.sdk.RoomListServiceState internal fun RoomListServiceState.toSyncState(): SyncState { @@ -28,3 +29,11 @@ internal fun RoomListServiceState.toSyncState(): SyncState { RoomListServiceState.TERMINATED -> SyncState.Terminated } } + +internal fun AppState.toSyncState(): SyncState { + return when (this) { + AppState.RUNNING -> SyncState.Syncing + AppState.TERMINATED -> SyncState.Terminated + AppState.ERROR -> SyncState.InError + } +} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt index c89c50ab9b..08accdbe06 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt @@ -18,47 +18,39 @@ package io.element.android.libraries.matrix.impl.sync import io.element.android.libraries.matrix.api.sync.SyncService import io.element.android.libraries.matrix.api.sync.SyncState -import io.element.android.libraries.matrix.impl.room.stateFlow import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn -import org.matrix.rustcomponents.sdk.RoomListService +import org.matrix.rustcomponents.sdk.App import org.matrix.rustcomponents.sdk.RoomListServiceState import timber.log.Timber -import java.util.concurrent.atomic.AtomicBoolean class RustSyncService( - private val roomListService: RoomListService, + private val app: App, + roomListStateFlow: Flow, sessionCoroutineScope: CoroutineScope ) : SyncService { - private val isSyncing = AtomicBoolean(false) - override fun startSync() = runCatching { - if (isSyncing.compareAndSet(false, true)) { - Timber.v("Start sync") - roomListService.sync() - } + Timber.v("Start sync") + app.start() } override fun stopSync() = runCatching { - if (isSyncing.compareAndSet(true, false)) { - Timber.v("Stop sync") - roomListService.stopSync() - } + Timber.v("Stop sync") + app.pause() } override val syncState: StateFlow = - roomListService - .stateFlow() + roomListStateFlow .map(RoomListServiceState::toSyncState) .onEach { state -> Timber.v("Sync state=$state") - isSyncing.set(state == SyncState.Syncing) } .distinctUntilChanged() .stateIn(sessionCoroutineScope, SharingStarted.Eagerly, SyncState.Idle)