Do not show verification banner for the last device, show the enter recovery key banner.

This commit is contained in:
Benoit Marty 2024-02-20 10:51:35 +01:00 committed by Benoit Marty
parent 663c7ceefe
commit e959ca0186
2 changed files with 36 additions and 11 deletions

View file

@ -109,22 +109,23 @@ class RoomListPresenter @Inject constructor(
val isMigrating = migrationScreenPresenter.present().isMigrating
var securityBannerDismissed by rememberSaveable { mutableStateOf(false) }
val displayVerificationPrompt by sessionVerificationService.canVerifySessionFlow.collectAsState(initial = false)
val recoveryState by encryptionService.recoveryStateStateFlow.collectAsState()
val secureStorageFlag by featureFlagService.isFeatureEnabledFlow(FeatureFlags.SecureStorage)
.collectAsState(initial = null)
val displayRecoveryKeyPrompt by remember {
derivedStateOf {
secureStorageFlag == true &&
recoveryState == RecoveryState.INCOMPLETE
}
val canVerifySession by sessionVerificationService.canVerifySessionFlow.collectAsState(initial = false)
var isLastDevice by remember { mutableStateOf(false) }
LaunchedEffect(Unit) {
isLastDevice = encryptionService.isLastDevice().getOrNull() ?: false
}
val recoveryState by encryptionService.recoveryStateStateFlow.collectAsState()
val secureStorageFlag by featureFlagService.isFeatureEnabledFlow(FeatureFlags.SecureStorage).collectAsState(initial = null)
val securityBannerState by remember {
derivedStateOf {
when {
securityBannerDismissed -> SecurityBannerState.None
displayVerificationPrompt -> SecurityBannerState.SessionVerification
displayRecoveryKeyPrompt -> SecurityBannerState.RecoveryKeyConfirmation
canVerifySession -> if (isLastDevice) {
SecurityBannerState.RecoveryKeyConfirmation
} else {
SecurityBannerState.SessionVerification
}
secureStorageFlag == true && recoveryState == RecoveryState.INCOMPLETE -> SecurityBannerState.RecoveryKeyConfirmation
else -> SecurityBannerState.None
}
}

View file

@ -235,6 +235,30 @@ class RoomListPresenterTests {
}
}
@Test
fun `present - handle RecoveryKeyConfirmation last session`() = runTest {
val scope = CoroutineScope(context = coroutineContext + SupervisorJob())
val presenter = createRoomListPresenter(
coroutineScope = scope,
client = FakeMatrixClient(
encryptionService = FakeEncryptionService().apply {
givenIsLastDevice(true)
}
),
)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
skipItems(2)
val eventSink = awaitItem().eventSink
// For the last session, the state is not SessionVerification, but RecoveryKeyConfirmation
assertThat(awaitItem().securityBannerState).isEqualTo(SecurityBannerState.RecoveryKeyConfirmation)
eventSink(RoomListEvents.DismissRequestVerificationPrompt)
assertThat(awaitItem().securityBannerState).isEqualTo(SecurityBannerState.None)
scope.cancel()
}
}
@Test
fun `present - handle DismissRequestVerificationPrompt`() = runTest {
val scope = CoroutineScope(context = coroutineContext + SupervisorJob())