From c8f42685458ad7194463a4a38755c0991675d39e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Feb 2025 20:50:08 +0100 Subject: [PATCH] Create extension SyncService.isOnline() --- .../appnav/loggedin/LoggedInPresenter.kt | 6 +-- .../android/appnav/room/RoomFlowNode.kt | 6 +-- .../appnav/room/joined/JoinedRoomFlowNode.kt | 6 +-- .../messages/impl/MessagesPresenter.kt | 6 +-- .../roomlist/impl/RoomListPresenter.kt | 6 +-- .../libraries/matrix/api/sync/SyncService.kt | 3 ++ .../libraries/matrix/api/sync/SyncState.kt | 8 ---- .../matrix/api/sync/SyncStateTest.kt | 37 ------------------- 8 files changed, 18 insertions(+), 60 deletions(-) delete mode 100644 libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/sync/SyncStateTest.kt diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt index b656532075..abddb2adac 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt @@ -28,7 +28,7 @@ import io.element.android.libraries.matrix.api.encryption.RecoveryState import io.element.android.libraries.matrix.api.roomlist.RoomListService import io.element.android.libraries.matrix.api.sync.SlidingSyncVersion import io.element.android.libraries.matrix.api.sync.SyncService -import io.element.android.libraries.matrix.api.sync.isConnected +import io.element.android.libraries.matrix.api.sync.isOnline import io.element.android.libraries.matrix.api.verification.SessionVerificationService import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus import io.element.android.libraries.preferences.api.store.EnableNativeSlidingSyncUseCase @@ -76,10 +76,10 @@ class LoggedInPresenter @Inject constructor( .launchIn(this) } val syncIndicator by matrixClient.roomListService.syncIndicator.collectAsState() - val syncState by syncService.syncState.collectAsState() + val isOnline by syncService.isOnline().collectAsState() val showSyncSpinner by remember { derivedStateOf { - syncState.isConnected() && syncIndicator == RoomListService.SyncIndicator.Show + isOnline && syncIndicator == RoomListService.SyncIndicator.Show } } var forceNativeSlidingSyncMigration by remember { mutableStateOf(false) } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt index 3358af877a..56f3716ca1 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt @@ -49,7 +49,7 @@ import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias import io.element.android.libraries.matrix.api.sync.SyncService -import io.element.android.libraries.matrix.api.sync.isConnected +import io.element.android.libraries.matrix.api.sync.isOnline import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first @@ -211,10 +211,10 @@ class RoomFlowNode @AssistedInject constructor( } private fun loadingNode(buildContext: BuildContext) = node(buildContext) { modifier -> - val syncState by syncService.syncState.collectAsState() + val isOnline by syncService.isOnline().collectAsState() LoadingRoomNodeView( state = LoadingRoomState.Loading, - hasNetworkConnection = syncState.isConnected(), + hasNetworkConnection = isOnline, onBackClick = { navigateUp() }, modifier = modifier, ) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt index 3ea2c8997e..49a05c9d36 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt @@ -36,7 +36,7 @@ import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.sync.SyncService -import io.element.android.libraries.matrix.api.sync.isConnected +import io.element.android.libraries.matrix.api.sync.isOnline import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map @@ -114,10 +114,10 @@ class JoinedRoomFlowNode @AssistedInject constructor( private fun loadingNode(buildContext: BuildContext, onBackClick: () -> Unit) = node(buildContext) { modifier -> val loadingRoomState by loadingRoomStateStateFlow.collectAsState() - val syncState by syncService.syncState.collectAsState() + val isOnline by syncService.isOnline().collectAsState() LoadingRoomNodeView( state = loadingRoomState, - hasNetworkConnection = syncState.isConnected(), + hasNetworkConnection = isOnline, modifier = modifier, onBackClick = onBackClick ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 92c6d82912..547f5f6161 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -71,7 +71,7 @@ import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOther import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOwn import io.element.android.libraries.matrix.api.room.powerlevels.canSendMessage import io.element.android.libraries.matrix.api.sync.SyncService -import io.element.android.libraries.matrix.api.sync.isConnected +import io.element.android.libraries.matrix.api.sync.isOnline import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.ui.messages.reply.map import io.element.android.libraries.matrix.ui.model.getAvatarData @@ -170,7 +170,7 @@ class MessagesPresenter @AssistedInject constructor( showReinvitePrompt = !hasDismissedInviteDialog && composerState.textEditorState.hasFocus() && room.isDm && room.activeMemberCount == 1L } } - val syncState by syncService.syncState.collectAsState() + val isOnline by syncService.isOnline().collectAsState() val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() @@ -220,7 +220,7 @@ class MessagesPresenter @AssistedInject constructor( customReactionState = customReactionState, reactionSummaryState = reactionSummaryState, readReceiptBottomSheetState = readReceiptBottomSheetState, - hasNetworkConnection = syncState.isConnected(), + hasNetworkConnection = isOnline, snackbarMessage = snackbarMessage, showReinvitePrompt = showReinvitePrompt, inviteProgress = inviteProgress.value, diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt index ed63b94ea1..ae111297d9 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt @@ -50,7 +50,7 @@ import io.element.android.libraries.matrix.api.encryption.RecoveryState import io.element.android.libraries.matrix.api.roomlist.RoomList import io.element.android.libraries.matrix.api.sync.SlidingSyncVersion import io.element.android.libraries.matrix.api.sync.SyncService -import io.element.android.libraries.matrix.api.sync.isConnected +import io.element.android.libraries.matrix.api.sync.isOnline import io.element.android.libraries.matrix.api.timeline.ReceiptType import io.element.android.libraries.preferences.api.store.SessionPreferencesStore import io.element.android.libraries.push.api.notifications.NotificationCleaner @@ -98,7 +98,7 @@ class RoomListPresenter @Inject constructor( val coroutineScope = rememberCoroutineScope() val leaveRoomState = leaveRoomPresenter.present() val matrixUser = client.userProfile.collectAsState() - val syncState by syncService.syncState.collectAsState() + val isOnline by syncService.isOnline().collectAsState() val filtersState = filtersPresenter.present() val searchState = searchPresenter.present() val acceptDeclineInviteState = acceptDeclineInvitePresenter.present() @@ -158,7 +158,7 @@ class RoomListPresenter @Inject constructor( matrixUser = matrixUser.value, showAvatarIndicator = showAvatarIndicator, snackbarMessage = snackbarMessage, - hasNetworkConnection = syncState.isConnected(), + hasNetworkConnection = isOnline, contextMenu = contextMenu.value, leaveRoomState = leaveRoomState, filtersState = filtersState, diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt index e7920be28c..21554dbbd6 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.matrix.api.sync +import io.element.android.libraries.core.coroutine.mapState import kotlinx.coroutines.flow.StateFlow interface SyncService { @@ -25,3 +26,5 @@ interface SyncService { */ val syncState: StateFlow } + +fun SyncService.isOnline(): StateFlow = syncState.mapState { it != SyncState.Offline } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncState.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncState.kt index 35c2dc6c04..6d253c8126 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncState.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncState.kt @@ -14,11 +14,3 @@ enum class SyncState { Terminated, Offline, } - -fun SyncState.isConnected() = when (this) { - SyncState.Idle, - SyncState.Running, - SyncState.Error, - SyncState.Terminated -> true - SyncState.Offline -> false -} diff --git a/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/sync/SyncStateTest.kt b/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/sync/SyncStateTest.kt deleted file mode 100644 index 303900b417..0000000000 --- a/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/sync/SyncStateTest.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.libraries.matrix.api.sync - -import org.junit.Test - -class SyncStateTest { - @Test - fun `isConnected should return true for Idle`() { - assert(SyncState.Idle.isConnected()) - } - - @Test - fun `isConnected should return true for Running`() { - assert(SyncState.Running.isConnected()) - } - - @Test - fun `isConnected should return true for Error`() { - assert(SyncState.Error.isConnected()) - } - - @Test - fun `isConnected should return true for Terminated`() { - assert(SyncState.Terminated.isConnected()) - } - - @Test - fun `isConnected should return false for Offline`() { - assert(!SyncState.Offline.isConnected()) - } -}