IncomingVerificationViewEvents -> IncomingVerificationViewEvent

This commit is contained in:
Benoit Marty
2026-08-25 10:29:30 +02:00
parent 650f20d6ba
commit 2dda3b807d
7 changed files with 52 additions and 52 deletions
@@ -108,18 +108,18 @@ class IncomingVerificationPresenter(
} }
} }
fun handleEvent(event: IncomingVerificationViewEvents) { fun handleEvent(event: IncomingVerificationViewEvent) {
Timber.d("Verification user action: ${event::class.simpleName}") Timber.d("Verification user action: ${event::class.simpleName}")
when (event) { when (event) {
IncomingVerificationViewEvents.StartVerification -> IncomingVerificationViewEvent.StartVerification ->
stateAndDispatch.dispatchAction(StateMachineEvent.AcceptIncomingRequest) stateAndDispatch.dispatchAction(StateMachineEvent.AcceptIncomingRequest)
IncomingVerificationViewEvents.IgnoreVerification -> IncomingVerificationViewEvent.IgnoreVerification ->
navigator.onFinish() navigator.onFinish()
IncomingVerificationViewEvents.ConfirmVerification -> IncomingVerificationViewEvent.ConfirmVerification ->
stateAndDispatch.dispatchAction(StateMachineEvent.AcceptChallenge) stateAndDispatch.dispatchAction(StateMachineEvent.AcceptChallenge)
IncomingVerificationViewEvents.DeclineVerification -> IncomingVerificationViewEvent.DeclineVerification ->
stateAndDispatch.dispatchAction(StateMachineEvent.DeclineChallenge) stateAndDispatch.dispatchAction(StateMachineEvent.DeclineChallenge)
IncomingVerificationViewEvents.GoBack -> { IncomingVerificationViewEvent.GoBack -> {
when (val verificationStep = step) { when (val verificationStep = step) {
is Step.Initial -> if (verificationStep.isWaiting) { is Step.Initial -> if (verificationStep.isWaiting) {
stateAndDispatch.dispatchAction(StateMachineEvent.Cancel) stateAndDispatch.dispatchAction(StateMachineEvent.Cancel)
@@ -16,7 +16,7 @@ import io.element.android.libraries.matrix.api.verification.VerificationRequest
data class IncomingVerificationState( data class IncomingVerificationState(
val step: Step, val step: Step,
val request: VerificationRequest.Incoming, val request: VerificationRequest.Incoming,
val eventSink: (IncomingVerificationViewEvents) -> Unit, val eventSink: (IncomingVerificationViewEvent) -> Unit,
) { ) {
@Stable @Stable
sealed interface Step { sealed interface Step {
@@ -87,7 +87,7 @@ internal fun anIncomingUserVerificationRequest() = VerificationRequest.Incoming.
internal fun anIncomingVerificationState( internal fun anIncomingVerificationState(
step: Step = aStepInitial(), step: Step = aStepInitial(),
verificationRequest: VerificationRequest.Incoming = anIncomingSessionVerificationRequest(), verificationRequest: VerificationRequest.Incoming = anIncomingSessionVerificationRequest(),
eventSink: (IncomingVerificationViewEvents) -> Unit = {}, eventSink: (IncomingVerificationViewEvent) -> Unit = {},
) = IncomingVerificationState( ) = IncomingVerificationState(
step = step, step = step,
request = verificationRequest, request = verificationRequest,
@@ -62,7 +62,7 @@ fun IncomingVerificationView(
val step = state.step val step = state.step
BackHandler { BackHandler {
state.eventSink(IncomingVerificationViewEvents.GoBack) state.eventSink(IncomingVerificationViewEvent.GoBack)
} }
HeaderFooterPage( HeaderFooterPage(
modifier = modifier, modifier = modifier,
@@ -70,7 +70,7 @@ fun IncomingVerificationView(
TopAppBar( TopAppBar(
title = {}, title = {},
navigationIcon = { navigationIcon = {
BackButton(onClick = { state.eventSink(IncomingVerificationViewEvents.GoBack) }) BackButton(onClick = { state.eventSink(IncomingVerificationViewEvent.GoBack) })
}, },
colors = topAppBarColors(containerColor = Color.Transparent), colors = topAppBarColors(containerColor = Color.Transparent),
) )
@@ -217,13 +217,13 @@ private fun IncomingVerificationBottomMenu(
text = stringResource(CommonStrings.action_start_verification), text = stringResource(CommonStrings.action_start_verification),
enabled = !step.isWaiting, enabled = !step.isWaiting,
showProgress = step.isWaiting, showProgress = step.isWaiting,
onClick = { eventSink(IncomingVerificationViewEvents.StartVerification) }, onClick = { eventSink(IncomingVerificationViewEvent.StartVerification) },
) )
TextButton( TextButton(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
text = stringResource(CommonStrings.action_ignore), text = stringResource(CommonStrings.action_ignore),
enabled = !step.isWaiting, enabled = !step.isWaiting,
onClick = { eventSink(IncomingVerificationViewEvents.IgnoreVerification) }, onClick = { eventSink(IncomingVerificationViewEvent.IgnoreVerification) },
) )
} }
} }
@@ -235,14 +235,14 @@ private fun IncomingVerificationBottomMenu(
enabled = !step.isWaiting, enabled = !step.isWaiting,
showProgress = step.isWaiting, showProgress = step.isWaiting,
onClick = { onClick = {
eventSink(IncomingVerificationViewEvents.ConfirmVerification) eventSink(IncomingVerificationViewEvent.ConfirmVerification)
}, },
) )
TextButton( TextButton(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
text = stringResource(R.string.screen_session_verification_they_dont_match), text = stringResource(R.string.screen_session_verification_they_dont_match),
enabled = !step.isWaiting, enabled = !step.isWaiting,
onClick = { eventSink(IncomingVerificationViewEvents.DeclineVerification) }, onClick = { eventSink(IncomingVerificationViewEvent.DeclineVerification) },
) )
} }
} }
@@ -254,7 +254,7 @@ private fun IncomingVerificationBottomMenu(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
text = stringResource(CommonStrings.action_done), text = stringResource(CommonStrings.action_done),
onClick = { onClick = {
eventSink(IncomingVerificationViewEvents.GoBack) eventSink(IncomingVerificationViewEvent.GoBack)
}, },
) )
} }
@@ -8,10 +8,10 @@
package io.element.android.features.verifysession.impl.incoming package io.element.android.features.verifysession.impl.incoming
sealed interface IncomingVerificationViewEvents { sealed interface IncomingVerificationViewEvent {
data object GoBack : IncomingVerificationViewEvents data object GoBack : IncomingVerificationViewEvent
data object StartVerification : IncomingVerificationViewEvents data object StartVerification : IncomingVerificationViewEvent
data object IgnoreVerification : IncomingVerificationViewEvents data object IgnoreVerification : IncomingVerificationViewEvent
data object ConfirmVerification : IncomingVerificationViewEvents data object ConfirmVerification : IncomingVerificationViewEvent
data object DeclineVerification : IncomingVerificationViewEvents data object DeclineVerification : IncomingVerificationViewEvent
} }
@@ -72,7 +72,7 @@ class IncomingVerificationPresenterTest {
acknowledgeVerificationRequestLambda.assertions().isCalledOnce().with(value(anIncomingSessionVerificationRequest)) acknowledgeVerificationRequestLambda.assertions().isCalledOnce().with(value(anIncomingSessionVerificationRequest))
acceptVerificationRequestLambda.assertions().isNeverCalled() acceptVerificationRequestLambda.assertions().isNeverCalled()
// User accept the incoming verification // User accept the incoming verification
initialState.eventSink(IncomingVerificationViewEvents.StartVerification) initialState.eventSink(IncomingVerificationViewEvent.StartVerification)
skipItems(1) skipItems(1)
val initialWaitingState = awaitItem() val initialWaitingState = awaitItem()
assertThat((initialWaitingState.step as IncomingVerificationState.Step.Initial).isWaiting).isTrue() assertThat((initialWaitingState.step as IncomingVerificationState.Step.Initial).isWaiting).isTrue()
@@ -96,7 +96,7 @@ class IncomingVerificationPresenterTest {
) )
) )
// User claims that the emoji matches // User claims that the emoji matches
emojiState.eventSink(IncomingVerificationViewEvents.ConfirmVerification) emojiState.eventSink(IncomingVerificationViewEvent.ConfirmVerification)
val emojiWaitingItem = awaitItem() val emojiWaitingItem = awaitItem()
assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue() assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue()
advanceUntilIdle() advanceUntilIdle()
@@ -141,7 +141,7 @@ class IncomingVerificationPresenterTest {
acknowledgeVerificationRequestLambda.assertions().isCalledOnce().with(value(anIncomingSessionVerificationRequest)) acknowledgeVerificationRequestLambda.assertions().isCalledOnce().with(value(anIncomingSessionVerificationRequest))
acceptVerificationRequestLambda.assertions().isNeverCalled() acceptVerificationRequestLambda.assertions().isNeverCalled()
// User accept the incoming verification // User accept the incoming verification
initialState.eventSink(IncomingVerificationViewEvents.StartVerification) initialState.eventSink(IncomingVerificationViewEvent.StartVerification)
skipItems(1) skipItems(1)
val initialWaitingState = awaitItem() val initialWaitingState = awaitItem()
assertThat((initialWaitingState.step as IncomingVerificationState.Step.Initial).isWaiting).isTrue() assertThat((initialWaitingState.step as IncomingVerificationState.Step.Initial).isWaiting).isTrue()
@@ -159,7 +159,7 @@ class IncomingVerificationPresenterTest {
) )
val emojiState = awaitItem() val emojiState = awaitItem()
// User claims that the emojis do not match // User claims that the emojis do not match
emojiState.eventSink(IncomingVerificationViewEvents.DeclineVerification) emojiState.eventSink(IncomingVerificationViewEvent.DeclineVerification)
val emojiWaitingItem = awaitItem() val emojiWaitingItem = awaitItem()
assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue() assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue()
advanceUntilIdle() advanceUntilIdle()
@@ -241,7 +241,7 @@ class IncomingVerificationPresenterTest {
acknowledgeVerificationRequestLambda.assertions().isCalledOnce().with(value(anIncomingSessionVerificationRequest)) acknowledgeVerificationRequestLambda.assertions().isCalledOnce().with(value(anIncomingSessionVerificationRequest))
acceptVerificationRequestLambda.assertions().isNeverCalled() acceptVerificationRequestLambda.assertions().isNeverCalled()
// User accept the incoming verification // User accept the incoming verification
initialState.eventSink(IncomingVerificationViewEvents.StartVerification) initialState.eventSink(IncomingVerificationViewEvent.StartVerification)
skipItems(1) skipItems(1)
val initialWaitingState = awaitItem() val initialWaitingState = awaitItem()
assertThat((initialWaitingState.step as IncomingVerificationState.Step.Initial).isWaiting).isTrue() assertThat((initialWaitingState.step as IncomingVerificationState.Step.Initial).isWaiting).isTrue()
@@ -259,7 +259,7 @@ class IncomingVerificationPresenterTest {
) )
val emojiState = awaitItem() val emojiState = awaitItem()
// User goes back // User goes back
emojiState.eventSink(IncomingVerificationViewEvents.GoBack) emojiState.eventSink(IncomingVerificationViewEvent.GoBack)
val emojiWaitingItem = awaitItem() val emojiWaitingItem = awaitItem()
assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue() assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue()
advanceUntilIdle() advanceUntilIdle()
@@ -289,7 +289,7 @@ class IncomingVerificationPresenterTest {
navigator = IncomingVerificationNavigator(navigatorLambda), navigator = IncomingVerificationNavigator(navigatorLambda),
).test { ).test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(IncomingVerificationViewEvents.IgnoreVerification) initialState.eventSink(IncomingVerificationViewEvent.IgnoreVerification)
skipItems(1) skipItems(1)
navigatorLambda.assertions().isCalledOnce() navigatorLambda.assertions().isCalledOnce()
} }
@@ -27,7 +27,7 @@ class IncomingVerificationViewTest : RobolectricTest() {
// region step Initial // region step Initial
@Test @Test
fun `back key pressed - ignore the verification`() = runAndroidComposeUiTest { fun `back key pressed - ignore the verification`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = aStepInitial(), step = aStepInitial(),
@@ -35,12 +35,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
pressBackKey() pressBackKey()
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack) eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
} }
@Test @Test
fun `ignore incoming verification emits the expected event`() = runAndroidComposeUiTest { fun `ignore incoming verification emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = aStepInitial(), step = aStepInitial(),
@@ -48,12 +48,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_ignore) clickOn(CommonStrings.action_ignore)
eventsRecorder.assertSingle(IncomingVerificationViewEvents.IgnoreVerification) eventsRecorder.assertSingle(IncomingVerificationViewEvent.IgnoreVerification)
} }
@Test @Test
fun `start incoming verification emits the expected event`() = runAndroidComposeUiTest { fun `start incoming verification emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = aStepInitial(), step = aStepInitial(),
@@ -61,12 +61,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_start_verification) clickOn(CommonStrings.action_start_verification)
eventsRecorder.assertSingle(IncomingVerificationViewEvents.StartVerification) eventsRecorder.assertSingle(IncomingVerificationViewEvent.StartVerification)
} }
@Test @Test
fun `back key pressed - when awaiting response cancels the verification`() = runAndroidComposeUiTest { fun `back key pressed - when awaiting response cancels the verification`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = aStepInitial( step = aStepInitial(
@@ -76,14 +76,14 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
pressBackKey() pressBackKey()
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack) eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
} }
// endregion step Initial // endregion step Initial
// region step Verifying // region step Verifying
@Test @Test
fun `back key pressed - when ready to verify cancels the verification`() = runAndroidComposeUiTest { fun `back key pressed - when ready to verify cancels the verification`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = IncomingVerificationState.Step.Verifying( step = IncomingVerificationState.Step.Verifying(
@@ -94,12 +94,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
pressBackKey() pressBackKey()
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack) eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
} }
@Test @Test
fun `back key pressed - when verifying and loading emits the expected event`() = runAndroidComposeUiTest { fun `back key pressed - when verifying and loading emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = IncomingVerificationState.Step.Verifying( step = IncomingVerificationState.Step.Verifying(
@@ -110,12 +110,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
pressBackKey() pressBackKey()
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack) eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
} }
@Test @Test
fun `clicking on they do not match emits the expected event`() = runAndroidComposeUiTest { fun `clicking on they do not match emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = IncomingVerificationState.Step.Verifying( step = IncomingVerificationState.Step.Verifying(
@@ -126,12 +126,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
clickOn(R.string.screen_session_verification_they_dont_match) clickOn(R.string.screen_session_verification_they_dont_match)
eventsRecorder.assertSingle(IncomingVerificationViewEvents.DeclineVerification) eventsRecorder.assertSingle(IncomingVerificationViewEvent.DeclineVerification)
} }
@Test @Test
fun `clicking on they match emits the expected event`() = runAndroidComposeUiTest { fun `clicking on they match emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = IncomingVerificationState.Step.Verifying( step = IncomingVerificationState.Step.Verifying(
@@ -142,14 +142,14 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
clickOn(R.string.screen_session_verification_they_match) clickOn(R.string.screen_session_verification_they_match)
eventsRecorder.assertSingle(IncomingVerificationViewEvents.ConfirmVerification) eventsRecorder.assertSingle(IncomingVerificationViewEvent.ConfirmVerification)
} }
// endregion // endregion
// region step Failure // region step Failure
@Test @Test
fun `back key pressed - when failure resets the flow`() = runAndroidComposeUiTest { fun `back key pressed - when failure resets the flow`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = IncomingVerificationState.Step.Failure, step = IncomingVerificationState.Step.Failure,
@@ -157,12 +157,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
pressBackKey() pressBackKey()
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack) eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
} }
@Test @Test
fun `click on done - when failure resets the flow`() = runAndroidComposeUiTest { fun `click on done - when failure resets the flow`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = IncomingVerificationState.Step.Failure, step = IncomingVerificationState.Step.Failure,
@@ -170,7 +170,7 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_done) clickOn(CommonStrings.action_done)
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack) eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
} }
// endregion // endregion
@@ -178,7 +178,7 @@ class IncomingVerificationViewTest : RobolectricTest() {
// region step Completed // region step Completed
@Test @Test
fun `back key pressed - on Completed step emits the expected event`() = runAndroidComposeUiTest { fun `back key pressed - on Completed step emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = IncomingVerificationState.Step.Completed, step = IncomingVerificationState.Step.Completed,
@@ -186,12 +186,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
pressBackKey() pressBackKey()
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack) eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
} }
@Test @Test
fun `when flow is completed and the user clicks on the done button, the expected event is emitted`() = runAndroidComposeUiTest { fun `when flow is completed and the user clicks on the done button, the expected event is emitted`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>() val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
setIncomingVerificationView( setIncomingVerificationView(
anIncomingVerificationState( anIncomingVerificationState(
step = IncomingVerificationState.Step.Completed, step = IncomingVerificationState.Step.Completed,
@@ -199,7 +199,7 @@ class IncomingVerificationViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_done) clickOn(CommonStrings.action_done)
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack) eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
} }
// endregion // endregion