From ad8e8305eb5a9979bb70f4022f6fcfffa3e72512 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 29 Aug 2024 17:24:22 +0200 Subject: [PATCH 1/3] Add banner entry point to set up recovery --- .../android/appnav/LoggedInFlowNode.kt | 4 ++ .../roomlist/api/RoomListEntryPoint.kt | 1 + .../features/roomlist/impl/RoomListNode.kt | 5 ++ .../roomlist/impl/RoomListPresenter.kt | 11 ++++- .../features/roomlist/impl/RoomListState.kt | 1 + .../roomlist/impl/RoomListStateProvider.kt | 1 + .../features/roomlist/impl/RoomListView.kt | 5 ++ .../impl/components/RoomListContentView.kt | 38 +++++++++----- .../impl/components/SetUpRecoveryKeyBanner.kt | 49 +++++++++++++++++++ .../impl/src/main/res/values/localazy.xml | 2 + .../roomlist/impl/RoomListPresenterTest.kt | 2 +- .../roomlist/impl/RoomListViewTest.kt | 41 ++++++++++++++++ .../api/SecureBackupEntryPoint.kt | 3 ++ .../securebackup/impl/SecureBackupFlowNode.kt | 1 + .../android/samples/minimal/RoomListScreen.kt | 1 + tools/localazy/config.json | 1 + 16 files changed, 150 insertions(+), 16 deletions(-) create mode 100644 features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/SetUpRecoveryKeyBanner.kt diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index cc50e19895..a7101e4f21 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -259,6 +259,10 @@ class LoggedInFlowNode @AssistedInject constructor( backstack.push(NavTarget.CreateRoom) } + override fun onSetUpRecoveryClick() { + backstack.push(NavTarget.SecureBackup(initialElement = SecureBackupEntryPoint.InitialTarget.SetUpRecovery)) + } + override fun onSessionConfirmRecoveryKeyClick() { backstack.push(NavTarget.SecureBackup(initialElement = SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey)) } diff --git a/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt b/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt index 86d3e7cd1a..6242c6ec3e 100644 --- a/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt +++ b/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt @@ -33,6 +33,7 @@ interface RoomListEntryPoint : FeatureEntryPoint { fun onRoomClick(roomId: RoomId) fun onCreateRoomClick() fun onSettingsClick() + fun onSetUpRecoveryClick() fun onSessionConfirmRecoveryKeyClick() fun onRoomSettingsClick(roomId: RoomId) fun onReportBugClick() diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt index d77fd1f440..7e6bc019e9 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt @@ -66,6 +66,10 @@ class RoomListNode @AssistedInject constructor( plugins().forEach { it.onCreateRoomClick() } } + private fun onSetUpRecoveryClick() { + plugins().forEach { it.onSetUpRecoveryClick() } + } + private fun onSessionConfirmRecoveryKeyClick() { plugins().forEach { it.onSessionConfirmRecoveryKeyClick() } } @@ -98,6 +102,7 @@ class RoomListNode @AssistedInject constructor( onRoomClick = this::onRoomClick, onSettingsClick = this::onOpenSettings, onCreateRoomClick = this::onCreateRoomClick, + onSetUpRecoveryClick = this::onSetUpRecoveryClick, onConfirmRecoveryKeyClick = this::onSessionConfirmRecoveryKeyClick, onRoomSettingsClick = this::onRoomSettingsClick, onMenuActionClick = { onMenuActionClick(activity, it) }, 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 d5f9404eff..20fcb1fc0b 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 @@ -187,8 +187,15 @@ class RoomListPresenter @Inject constructor( derivedStateOf { when { currentSecurityBannerDismissed -> SecurityBannerState.None - recoveryState == RecoveryState.INCOMPLETE && - syncState == SyncState.Running -> SecurityBannerState.RecoveryKeyConfirmation + syncState == SyncState.Running -> { + when (recoveryState) { + RecoveryState.UNKNOWN, + RecoveryState.DISABLED -> SecurityBannerState.SetUpRecovery + RecoveryState.INCOMPLETE -> SecurityBannerState.RecoveryKeyConfirmation + RecoveryState.WAITING_FOR_SYNC, + RecoveryState.ENABLED -> SecurityBannerState.None + } + } else -> SecurityBannerState.None } } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt index f29c9d24d4..fe824aa158 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt @@ -66,6 +66,7 @@ enum class InvitesState { enum class SecurityBannerState { None, + SetUpRecovery, RecoveryKeyConfirmation, } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt index fe000c948e..8e1d0ac450 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt @@ -52,6 +52,7 @@ open class RoomListStateProvider : PreviewParameterProvider { aRoomListState(contentState = aSkeletonContentState()), aRoomListState(matrixUser = MatrixUser(userId = UserId("@id:domain")), contentState = aMigrationContentState()), aRoomListState(searchState = aRoomListSearchState(isSearchActive = true, query = "Test")), + aRoomListState(contentState = aRoomsContentState(securityBannerState = SecurityBannerState.SetUpRecovery)), ) } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt index 03fdfbdc3b..eba59e8124 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt @@ -53,6 +53,7 @@ fun RoomListView( state: RoomListState, onRoomClick: (RoomId) -> Unit, onSettingsClick: () -> Unit, + onSetUpRecoveryClick: () -> Unit, onConfirmRecoveryKeyClick: () -> Unit, onCreateRoomClick: () -> Unit, onRoomSettingsClick: (roomId: RoomId) -> Unit, @@ -78,6 +79,7 @@ fun RoomListView( RoomListScaffold( state = state, + onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, onRoomClick = onRoomClick, onOpenSettings = onSettingsClick, @@ -106,6 +108,7 @@ fun RoomListView( @Composable private fun RoomListScaffold( state: RoomListState, + onSetUpRecoveryClick: () -> Unit, onConfirmRecoveryKeyClick: () -> Unit, onRoomClick: (RoomId) -> Unit, onOpenSettings: () -> Unit, @@ -142,6 +145,7 @@ private fun RoomListScaffold( contentState = state.contentState, filtersState = state.filtersState, eventSink = state.eventSink, + onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, onRoomClick = ::onRoomClick, onCreateRoomClick = onCreateRoomClick, @@ -178,6 +182,7 @@ internal fun RoomListViewPreview(@PreviewParameter(RoomListStateProvider::class) state = state, onRoomClick = {}, onSettingsClick = {}, + onSetUpRecoveryClick = {}, onConfirmRecoveryKeyClick = {}, onCreateRoomClick = {}, onRoomSettingsClick = {}, diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt index 5bc85d3458..e60c132490 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt @@ -70,6 +70,7 @@ fun RoomListContentView( contentState: RoomListContentState, filtersState: RoomListFiltersState, eventSink: (RoomListEvents) -> Unit, + onSetUpRecoveryClick: () -> Unit, onConfirmRecoveryKeyClick: () -> Unit, onRoomClick: (RoomListRoomSummary) -> Unit, onCreateRoomClick: () -> Unit, @@ -95,6 +96,7 @@ fun RoomListContentView( state = contentState, filtersState = filtersState, eventSink = eventSink, + onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, onRoomClick = onRoomClick, ) @@ -141,6 +143,7 @@ private fun RoomsView( state: RoomListContentState.Rooms, filtersState: RoomListFiltersState, eventSink: (RoomListEvents) -> Unit, + onSetUpRecoveryClick: () -> Unit, onConfirmRecoveryKeyClick: () -> Unit, onRoomClick: (RoomListRoomSummary) -> Unit, modifier: Modifier = Modifier, @@ -154,6 +157,7 @@ private fun RoomsView( RoomsViewList( state = state, eventSink = eventSink, + onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, onRoomClick = onRoomClick, modifier = modifier.fillMaxSize(), @@ -165,6 +169,7 @@ private fun RoomsView( private fun RoomsViewList( state: RoomListContentState.Rooms, eventSink: (RoomListEvents) -> Unit, + onSetUpRecoveryClick: () -> Unit, onConfirmRecoveryKeyClick: () -> Unit, onRoomClick: (RoomListRoomSummary) -> Unit, modifier: Modifier = Modifier, @@ -188,21 +193,27 @@ private fun RoomsViewList( // FAB height is 56dp, bottom padding is 16dp, we add 8dp as extra margin -> 56+16+8 = 80 contentPadding = PaddingValues(bottom = 80.dp) ) { - if (state.securityBannerState != SecurityBannerState.None) { - when (state.securityBannerState) { - SecurityBannerState.RecoveryKeyConfirmation -> { - item { - ConfirmRecoveryKeyBanner( - onContinueClick = onConfirmRecoveryKeyClick, - onDismissClick = { updatedEventSink(RoomListEvents.DismissRecoveryKeyPrompt) } - ) - } + when (state.securityBannerState) { + SecurityBannerState.SetUpRecovery -> { + item { + SetUpRecoveryKeyBanner( + onContinueClick = onSetUpRecoveryClick, + onDismissClick = { updatedEventSink(RoomListEvents.DismissRecoveryKeyPrompt) } + ) } - else -> Unit } - } else if (state.fullScreenIntentPermissionsState.shouldDisplayBanner) { - item { - FullScreenIntentPermissionBanner(state = state.fullScreenIntentPermissionsState) + SecurityBannerState.RecoveryKeyConfirmation -> { + item { + ConfirmRecoveryKeyBanner( + onContinueClick = onConfirmRecoveryKeyClick, + onDismissClick = { updatedEventSink(RoomListEvents.DismissRecoveryKeyPrompt) } + ) + } + } + SecurityBannerState.None -> if (state.fullScreenIntentPermissionsState.shouldDisplayBanner) { + item { + FullScreenIntentPermissionBanner(state = state.fullScreenIntentPermissionsState) + } } } @@ -276,6 +287,7 @@ internal fun RoomListContentViewPreview(@PreviewParameter(RoomListContentStatePr filterSelectionStates = RoomListFilter.entries.map { FilterSelectionState(it, isSelected = true) } ), eventSink = {}, + onSetUpRecoveryClick = {}, onConfirmRecoveryKeyClick = {}, onRoomClick = {}, onCreateRoomClick = {}, diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/SetUpRecoveryKeyBanner.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/SetUpRecoveryKeyBanner.kt new file mode 100644 index 0000000000..56fd1b5312 --- /dev/null +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/SetUpRecoveryKeyBanner.kt @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2024 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 + * + * https://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.features.roomlist.impl.components + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import io.element.android.features.roomlist.impl.R +import io.element.android.libraries.designsystem.atomic.molecules.DialogLikeBannerMolecule +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight + +@Composable +internal fun SetUpRecoveryKeyBanner( + onContinueClick: () -> Unit, + onDismissClick: () -> Unit, + modifier: Modifier = Modifier, +) { + DialogLikeBannerMolecule( + modifier = modifier, + title = stringResource(R.string.banner_set_up_recovery_title), + content = stringResource(R.string.banner_set_up_recovery_content), + onSubmitClick = onContinueClick, + onDismissClick = onDismissClick, + ) +} + +@PreviewsDayNight +@Composable +internal fun SetUpRecoveryKeyBannerPreview() = ElementPreview { + SetUpRecoveryKeyBanner( + onContinueClick = {}, + onDismissClick = {}, + ) +} diff --git a/features/roomlist/impl/src/main/res/values/localazy.xml b/features/roomlist/impl/src/main/res/values/localazy.xml index f8aff41e8f..6affb2bb16 100644 --- a/features/roomlist/impl/src/main/res/values/localazy.xml +++ b/features/roomlist/impl/src/main/res/values/localazy.xml @@ -1,5 +1,7 @@ + "Generate a new recovery key that can be used to restore your encrypted message history in case you lose access to your devices." + "Set up recovery" "Your chat backup is currently out of sync. You need to enter your recovery key to maintain access to your chat backup." "Enter your recovery key" "To ensure you never miss an important call, please change your settings to allow full-screen notifications when your phone is locked." diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt index a381dc414d..bfa4e07656 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt @@ -264,7 +264,7 @@ class RoomListPresenterTest { val initialState = consumeItemsUntilPredicate { it.contentState is RoomListContentState.Rooms }.last() - assertThat(initialState.contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.None) + assertThat(initialState.contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.SetUpRecovery) encryptionService.emitRecoveryState(RecoveryState.INCOMPLETE) val nextState = awaitItem() assertThat(nextState.contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.RecoveryKeyConfirmation) diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt index 09cb6a8019..3e881fe294 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt @@ -80,6 +80,24 @@ class RoomListViewTest { eventsRecorder.assertSingle(RoomListEvents.DismissRecoveryKeyPrompt) } + @Test + fun `clicking on close setup key banner emits the expected Event`() { + val eventsRecorder = EventsRecorder() + rule.setRoomListView( + state = aRoomListState( + contentState = aRoomsContentState(securityBannerState = SecurityBannerState.SetUpRecovery), + eventSink = eventsRecorder, + ) + ) + + // Remove automatic initial events + eventsRecorder.clear() + + val close = rule.activity.getString(CommonStrings.action_close) + rule.onNodeWithContentDescription(close).performClick() + eventsRecorder.assertSingle(RoomListEvents.DismissRecoveryKeyPrompt) + } + @Test fun `clicking on continue recovery key banner invokes the expected callback`() { val eventsRecorder = EventsRecorder() @@ -101,6 +119,27 @@ class RoomListViewTest { } } + @Test + fun `clicking on continue setup key banner invokes the expected callback`() { + val eventsRecorder = EventsRecorder() + ensureCalledOnce { callback -> + rule.setRoomListView( + state = aRoomListState( + contentState = aRoomsContentState(securityBannerState = SecurityBannerState.SetUpRecovery), + eventSink = eventsRecorder, + ), + onSetUpRecoveryClick = callback, + ) + + // Remove automatic initial events + eventsRecorder.clear() + + rule.clickOn(CommonStrings.action_continue) + + eventsRecorder.assertEmpty() + } + } + @Test fun `clicking on start chat when the session has no room invokes the expected callback`() { val eventsRecorder = EventsRecorder(expectEvents = false) @@ -208,6 +247,7 @@ private fun AndroidComposeTestRule.setRoomL state: RoomListState, onRoomClick: (RoomId) -> Unit = EnsureNeverCalledWithParam(), onSettingsClick: () -> Unit = EnsureNeverCalled(), + onSetUpRecoveryClick: () -> Unit = EnsureNeverCalled(), onConfirmRecoveryKeyClick: () -> Unit = EnsureNeverCalled(), onCreateRoomClick: () -> Unit = EnsureNeverCalled(), onRoomSettingsClick: (RoomId) -> Unit = EnsureNeverCalledWithParam(), @@ -219,6 +259,7 @@ private fun AndroidComposeTestRule.setRoomL state = state, onRoomClick = onRoomClick, onSettingsClick = onSettingsClick, + onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, onCreateRoomClick = onCreateRoomClick, onRoomSettingsClick = onRoomSettingsClick, diff --git a/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt b/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt index ab0d980a6e..bf1b0249a2 100644 --- a/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt +++ b/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt @@ -29,6 +29,9 @@ interface SecureBackupEntryPoint : FeatureEntryPoint { @Parcelize data object Root : InitialTarget + @Parcelize + data object SetUpRecovery : InitialTarget + @Parcelize data object EnterRecoveryKey : InitialTarget diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt index 19a10aa47a..729c6c2b3e 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt @@ -50,6 +50,7 @@ class SecureBackupFlowNode @AssistedInject constructor( backstack = BackStack( initialElement = when (plugins.filterIsInstance().first().initialElement) { SecureBackupEntryPoint.InitialTarget.Root -> NavTarget.Root + SecureBackupEntryPoint.InitialTarget.SetUpRecovery -> NavTarget.Setup SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey -> NavTarget.EnterRecoveryKey is SecureBackupEntryPoint.InitialTarget.ResetIdentity -> NavTarget.ResetIdentity }, diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt index b91daeecfd..2a3dec60f3 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt @@ -178,6 +178,7 @@ class RoomListScreen( state = state, onRoomClick = ::onRoomClick, onSettingsClick = {}, + onSetUpRecoveryClick = {}, onConfirmRecoveryKeyClick = {}, onCreateRoomClick = {}, onRoomSettingsClick = {}, diff --git a/tools/localazy/config.json b/tools/localazy/config.json index 82fb4f2277..dbd1ae7233 100644 --- a/tools/localazy/config.json +++ b/tools/localazy/config.json @@ -137,6 +137,7 @@ "screen_roomlist_.*", "session_verification_banner_.*", "confirm_recovery_key_banner_.*", + "banner\\.set_up_recovery\\..*", "full_screen_intent_banner_.*", "screen_migration_.*", "screen_invites_.*" From 2dc28561d4cafba9127c04fa12e7574f9eb520f3 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Thu, 29 Aug 2024 16:48:33 +0000 Subject: [PATCH 2/3] Update screenshots --- ...oomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png | 3 +++ ...mlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png | 3 +++ .../images/features.roomlist.impl_RoomListView_Day_11_en.png | 3 +++ .../images/features.roomlist.impl_RoomListView_Night_11_en.png | 3 +++ 4 files changed, 12 insertions(+) create mode 100644 tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_11_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png new file mode 100644 index 0000000000..7bc734b404 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb59f6e1771481bec3e96b89cbc9255685e6ea154412d7bf7e1351130f42173a +size 28896 diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png new file mode 100644 index 0000000000..a2920c24ff --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:413e055704ff0c8dc82321b108c1fa90e7d58af1a781244fbde3daf45d638331 +size 27829 diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_11_en.png new file mode 100644 index 0000000000..804a3351dd --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_11_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5870fc3df4bb7330972727601016189e75c358f535f31fe6704837eb866866df +size 100363 diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_11_en.png new file mode 100644 index 0000000000..2b92b26cc0 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_11_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d236927f6c4cc81f1e9c9b6d405e27e8e96ceb89f9047493b9ab590165d484b2 +size 104246 From d93762bbd04c683bc7b347d06f632664ead736f9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 30 Aug 2024 09:15:53 +0200 Subject: [PATCH 3/3] Increase test coverage of `securityBannerState()` --- .../features/roomlist/impl/RoomListPresenterTest.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt index bfa4e07656..762128d0cd 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt @@ -268,6 +268,17 @@ class RoomListPresenterTest { encryptionService.emitRecoveryState(RecoveryState.INCOMPLETE) val nextState = awaitItem() assertThat(nextState.contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.RecoveryKeyConfirmation) + // Also check other states + encryptionService.emitRecoveryState(RecoveryState.DISABLED) + assertThat(awaitItem().contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.SetUpRecovery) + encryptionService.emitRecoveryState(RecoveryState.WAITING_FOR_SYNC) + assertThat(awaitItem().contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.None) + encryptionService.emitRecoveryState(RecoveryState.DISABLED) + assertThat(awaitItem().contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.SetUpRecovery) + encryptionService.emitRecoveryState(RecoveryState.ENABLED) + assertThat(awaitItem().contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.None) + encryptionService.emitRecoveryState(RecoveryState.DISABLED) + assertThat(awaitItem().contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.SetUpRecovery) nextState.eventSink(RoomListEvents.DismissRecoveryKeyPrompt) val finalState = awaitItem() assertThat(finalState.contentAsRooms().securityBannerState).isEqualTo(SecurityBannerState.None)