diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenter.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenter.kt index 5f43372e55..aa1fe59c32 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenter.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenter.kt @@ -85,11 +85,14 @@ class VerifySelfSessionPresenter @Inject constructor( StateMachineState.RequestingVerification, StateMachineState.StartingSasVerification, StateMachineState.SasVerificationStarted, - StateMachineState.VerificationRequestAccepted, StateMachineState.Canceling -> { VerifySelfSessionState.VerificationStep.AwaitingOtherDeviceResponse } + StateMachineState.VerificationRequestAccepted -> { + VerifySelfSessionState.VerificationStep.Ready + } + StateMachineState.Canceled -> { VerifySelfSessionState.VerificationStep.Canceled } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionState.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionState.kt index 6f24e238cc..752cf942c1 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionState.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionState.kt @@ -32,6 +32,7 @@ data class VerifySelfSessionState( object Initial : VerificationStep object Canceled : VerificationStep object AwaitingOtherDeviceResponse : VerificationStep + object Ready : VerificationStep data class Verifying(val emojiList: List, val state: Async) : VerificationStep object Completed : VerificationStep } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateMachine.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateMachine.kt index 466db2aa99..3c905334eb 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateMachine.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateMachine.kt @@ -81,6 +81,7 @@ class VerifySelfSessionStateMachine( // Observe the verification service state, translate it to state machine input events sessionVerificationService.verificationFlowState.onEach { verificationAttemptState -> when (verificationAttemptState) { + VerificationFlowState.Initial -> stateMachine.restart() VerificationFlowState.AcceptedVerificationRequest -> { stateMachine.process(Event.DidAcceptVerificationRequest) } @@ -102,7 +103,6 @@ class VerifySelfSessionStateMachine( VerificationFlowState.Failed -> { stateMachine.process(Event.DidFail) } - else -> Unit } }.launchIn(coroutineScope) } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateProvider.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateProvider.kt index 01b0e6bea6..54a59dee01 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateProvider.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateProvider.kt @@ -36,6 +36,9 @@ open class VerifySelfSessionStateProvider : PreviewParameterProvider R.drawable.ic_verification_devices FlowStep.Canceled -> R.drawable.ic_verification_warning FlowStep.AwaitingOtherDeviceResponse -> R.drawable.ic_verification_waiting - is FlowStep.Verifying, FlowStep.Completed -> R.drawable.ic_verification_emoji + FlowStep.Ready, is FlowStep.Verifying, FlowStep.Completed -> R.drawable.ic_verification_emoji } val titleTextId = when (verificationFlowStep) { FlowStep.Initial -> StringR.string.verification_title_initial FlowStep.Canceled -> StringR.string.verification_title_canceled FlowStep.AwaitingOtherDeviceResponse -> StringR.string.verification_title_waiting - is FlowStep.Verifying, FlowStep.Completed -> StringR.string.verification_title_verifying + FlowStep.Ready, is FlowStep.Verifying, FlowStep.Completed -> StringR.string.verification_title_verifying } val subtitleTextId = when (verificationFlowStep) { FlowStep.Initial -> StringR.string.verification_subtitle_initial FlowStep.Canceled -> StringR.string.verification_subtitle_canceled FlowStep.AwaitingOtherDeviceResponse -> StringR.string.verification_subtitle_waiting - is FlowStep.Verifying, FlowStep.Completed -> StringR.string.verification_subtitle_verifying + FlowStep.Ready, is FlowStep.Verifying, FlowStep.Completed -> StringR.string.verification_subtitle_verifying } Column(modifier) { Spacer(Modifier.height(68.dp)) @@ -167,7 +167,7 @@ internal fun Content(flowState: FlowStep, modifier: Modifier = Modifier) { Column(modifier) { Spacer(Modifier.height(56.dp)) when (flowState) { - FlowStep.Initial, FlowStep.Canceled, FlowStep.Completed -> Unit + FlowStep.Initial, FlowStep.Ready, FlowStep.Canceled, FlowStep.Completed -> Unit FlowStep.AwaitingOtherDeviceResponse -> ContentWaiting() is FlowStep.Verifying -> ContentVerifying(flowState) } @@ -219,6 +219,7 @@ internal fun BottomMenu(screenState: VerifySelfSessionState, goBack: () -> Unit) StringR.string.verification_positive_button_verifying_start } } + FlowStep.Ready -> StringR.string.verification_positive_button_ready else -> null } val negativeButtonTitle = when (verificationViewState) { @@ -231,6 +232,7 @@ internal fun BottomMenu(screenState: VerifySelfSessionState, goBack: () -> Unit) val positiveButtonEvent = when (verificationViewState) { FlowStep.Initial -> VerifySelfSessionViewEvents.RequestVerification + FlowStep.Ready -> VerifySelfSessionViewEvents.StartSasVerification is FlowStep.Verifying -> if (!isVerifying) VerifySelfSessionViewEvents.ConfirmVerification else null FlowStep.Canceled -> VerifySelfSessionViewEvents.Restart else -> null @@ -264,13 +266,15 @@ internal fun BottomMenu(screenState: VerifySelfSessionState, goBack: () -> Unit) positiveButtonTitle?.let { Text(stringResource(it)) } } } - Spacer(modifier = Modifier.height(16.dp)) - TextButton( - modifier = Modifier.fillMaxWidth(), - onClick = negativeButtonCallback, - enabled = negativeButtonEnabled, - ) { - negativeButtonTitle?.let { Text(stringResource(it)) } + if (negativeButtonTitle != null) { + Spacer(modifier = Modifier.height(16.dp)) + TextButton( + modifier = Modifier.fillMaxWidth(), + onClick = negativeButtonCallback, + enabled = negativeButtonEnabled, + ) { + Text(stringResource(negativeButtonTitle)) + } } Spacer(Modifier.height(40.dp)) } diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenterTests.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenterTests.kt index 9a25a60323..6c79c1b762 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenterTests.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionPresenterTests.kt @@ -56,6 +56,10 @@ class VerifySelfSessionPresenterTests { eventSink(VerifySelfSessionViewEvents.RequestVerification) // Await for other device response: assertThat(awaitItem().verificationFlowStep).isEqualTo(VerificationStep.AwaitingOtherDeviceResponse) + // Await for the state to be Ready + assertThat(awaitItem().verificationFlowStep).isEqualTo(VerificationStep.Ready) + // Await for other device response (again): + assertThat(awaitItem().verificationFlowStep).isEqualTo(VerificationStep.AwaitingOtherDeviceResponse) // Finally, ChallengeReceived: val verifyingState = awaitItem() assertThat(verifyingState.verificationFlowStep).isInstanceOf(VerificationStep.Verifying::class.java) @@ -233,8 +237,8 @@ class VerifySelfSessionPresenterTests { } private suspend fun ReceiveTurbine.awaitChallengeReceivedState(): VerifySelfSessionState { - // Skip 'waiting for response' state - skipItems(1) + // Skip 'waiting for response', 'ready' and 'starting verification' state + skipItems(3) // Received challenge return awaitItem() } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt index 04834da309..50fbf6f232 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt @@ -38,6 +38,7 @@ class RustSessionVerificationService @Inject constructor() : SessionVerification _isReady.value = value != null // If status was 'Unknown', move it to either 'Verified' or 'NotVerified' if (value != null) { + value.setDelegate(this) updateVerificationStatus(value.isVerified()) } } @@ -52,7 +53,6 @@ class RustSessionVerificationService @Inject constructor() : SessionVerification override val sessionVerifiedStatus: StateFlow = _sessionVerifiedStatus.asStateFlow() override fun requestVerification() = tryOrFail { - verificationController?.setDelegate(this) verificationController?.requestVerification() } @@ -63,7 +63,6 @@ class RustSessionVerificationService @Inject constructor() : SessionVerification override fun declineVerification() = tryOrFail { verificationController?.declineVerification() } override fun startVerification() = tryOrFail { - verificationController?.setDelegate(this) verificationController?.startSasVerification() } diff --git a/libraries/ui-strings/src/main/res/values/strings_eax.xml b/libraries/ui-strings/src/main/res/values/strings_eax.xml index 40563c0a3b..f0f4bc1be7 100644 --- a/libraries/ui-strings/src/main/res/values/strings_eax.xml +++ b/libraries/ui-strings/src/main/res/values/strings_eax.xml @@ -47,6 +47,7 @@ I am ready Retry verification + Start They match Waiting to match diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.verifysession.impl_null_DefaultGroup_VerifySelfSessionViewDarkPreview_0_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.verifysession.impl_null_DefaultGroup_VerifySelfSessionViewDarkPreview_0_null_5,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..23942ca47e --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.verifysession.impl_null_DefaultGroup_VerifySelfSessionViewDarkPreview_0_null_5,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:594ebca0307e0488bb6d22df074069181091a6310bb7fdb29a9109a10997319e +size 26874 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.verifysession.impl_null_DefaultGroup_VerifySelfSessionViewLightPreview_0_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.verifysession.impl_null_DefaultGroup_VerifySelfSessionViewLightPreview_0_null_5,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..c9eb5f41d2 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.verifysession.impl_null_DefaultGroup_VerifySelfSessionViewLightPreview_0_null_5,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25598da9a3d84cecb4204d140609f2de5b03facd547f7ef45c53ccead333ce05 +size 26343