|
|
@ -19,11 +19,13 @@ package io.element.android.features.verifysession.impl |
|
|
|
import androidx.activity.compose.BackHandler |
|
|
|
import androidx.activity.compose.BackHandler |
|
|
|
import androidx.compose.foundation.Image |
|
|
|
import androidx.compose.foundation.Image |
|
|
|
import androidx.compose.foundation.layout.Arrangement |
|
|
|
import androidx.compose.foundation.layout.Arrangement |
|
|
|
|
|
|
|
import androidx.compose.foundation.layout.Box |
|
|
|
import androidx.compose.foundation.layout.Column |
|
|
|
import androidx.compose.foundation.layout.Column |
|
|
|
import androidx.compose.foundation.layout.ColumnScope |
|
|
|
import androidx.compose.foundation.layout.ColumnScope |
|
|
|
import androidx.compose.foundation.layout.Row |
|
|
|
import androidx.compose.foundation.layout.Row |
|
|
|
import androidx.compose.foundation.layout.Spacer |
|
|
|
import androidx.compose.foundation.layout.Spacer |
|
|
|
import androidx.compose.foundation.layout.fillMaxHeight |
|
|
|
import androidx.compose.foundation.layout.fillMaxHeight |
|
|
|
|
|
|
|
import androidx.compose.foundation.layout.fillMaxSize |
|
|
|
import androidx.compose.foundation.layout.fillMaxWidth |
|
|
|
import androidx.compose.foundation.layout.fillMaxWidth |
|
|
|
import androidx.compose.foundation.layout.height |
|
|
|
import androidx.compose.foundation.layout.height |
|
|
|
import androidx.compose.foundation.layout.padding |
|
|
|
import androidx.compose.foundation.layout.padding |
|
|
@ -57,6 +59,7 @@ import io.element.android.libraries.designsystem.components.ProgressDialog |
|
|
|
import io.element.android.libraries.designsystem.preview.ElementPreview |
|
|
|
import io.element.android.libraries.designsystem.preview.ElementPreview |
|
|
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight |
|
|
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight |
|
|
|
import io.element.android.libraries.designsystem.theme.components.Button |
|
|
|
import io.element.android.libraries.designsystem.theme.components.Button |
|
|
|
|
|
|
|
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator |
|
|
|
import io.element.android.libraries.designsystem.theme.components.OutlinedButton |
|
|
|
import io.element.android.libraries.designsystem.theme.components.OutlinedButton |
|
|
|
import io.element.android.libraries.designsystem.theme.components.Text |
|
|
|
import io.element.android.libraries.designsystem.theme.components.Text |
|
|
|
import io.element.android.libraries.designsystem.theme.components.TextButton |
|
|
|
import io.element.android.libraries.designsystem.theme.components.TextButton |
|
|
@ -99,13 +102,24 @@ fun VerifySelfSessionView( |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
val verificationFlowStep = state.verificationFlowStep |
|
|
|
val verificationFlowStep = state.verificationFlowStep |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (state.verificationFlowStep is FlowStep.Loading || |
|
|
|
|
|
|
|
state.verificationFlowStep is FlowStep.Skipped) { |
|
|
|
|
|
|
|
// Just display a loader in this case, to avoid UI glitch. |
|
|
|
|
|
|
|
Box( |
|
|
|
|
|
|
|
modifier = Modifier.fillMaxSize(), |
|
|
|
|
|
|
|
contentAlignment = Alignment.Center, |
|
|
|
|
|
|
|
) { |
|
|
|
|
|
|
|
CircularProgressIndicator() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
HeaderFooterPage( |
|
|
|
HeaderFooterPage( |
|
|
|
modifier = modifier, |
|
|
|
modifier = modifier, |
|
|
|
topBar = { |
|
|
|
topBar = { |
|
|
|
TopAppBar( |
|
|
|
TopAppBar( |
|
|
|
title = {}, |
|
|
|
title = {}, |
|
|
|
actions = { |
|
|
|
actions = { |
|
|
|
if (state.verificationFlowStep != FlowStep.Completed && |
|
|
|
if (state.verificationFlowStep !is FlowStep.Completed && |
|
|
|
state.displaySkipButton && |
|
|
|
state.displaySkipButton && |
|
|
|
LocalInspectionMode.current.not()) { |
|
|
|
LocalInspectionMode.current.not()) { |
|
|
|
TextButton( |
|
|
|
TextButton( |
|
|
@ -137,6 +151,7 @@ fun VerifySelfSessionView( |
|
|
|
) { |
|
|
|
) { |
|
|
|
Content(flowState = verificationFlowStep) |
|
|
|
Content(flowState = verificationFlowStep) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
when (state.signOutAction) { |
|
|
|
when (state.signOutAction) { |
|
|
|
AsyncAction.Loading -> { |
|
|
|
AsyncAction.Loading -> { |
|
|
@ -157,6 +172,7 @@ fun VerifySelfSessionView( |
|
|
|
@Composable |
|
|
|
@Composable |
|
|
|
private fun HeaderContent(verificationFlowStep: FlowStep) { |
|
|
|
private fun HeaderContent(verificationFlowStep: FlowStep) { |
|
|
|
val iconStyle = when (verificationFlowStep) { |
|
|
|
val iconStyle = when (verificationFlowStep) { |
|
|
|
|
|
|
|
VerifySelfSessionState.VerificationStep.Loading -> error("Should not happen") |
|
|
|
is FlowStep.Initial, FlowStep.AwaitingOtherDeviceResponse -> BigIcon.Style.Default(CompoundIcons.LockSolid()) |
|
|
|
is FlowStep.Initial, FlowStep.AwaitingOtherDeviceResponse -> BigIcon.Style.Default(CompoundIcons.LockSolid()) |
|
|
|
FlowStep.Canceled -> BigIcon.Style.AlertSolid |
|
|
|
FlowStep.Canceled -> BigIcon.Style.AlertSolid |
|
|
|
FlowStep.Ready, is FlowStep.Verifying -> BigIcon.Style.Default(CompoundIcons.Reaction()) |
|
|
|
FlowStep.Ready, is FlowStep.Verifying -> BigIcon.Style.Default(CompoundIcons.Reaction()) |
|
|
@ -164,6 +180,7 @@ private fun HeaderContent(verificationFlowStep: FlowStep) { |
|
|
|
is FlowStep.Skipped -> return |
|
|
|
is FlowStep.Skipped -> return |
|
|
|
} |
|
|
|
} |
|
|
|
val titleTextId = when (verificationFlowStep) { |
|
|
|
val titleTextId = when (verificationFlowStep) { |
|
|
|
|
|
|
|
VerifySelfSessionState.VerificationStep.Loading -> error("Should not happen") |
|
|
|
is FlowStep.Initial, FlowStep.AwaitingOtherDeviceResponse -> R.string.screen_identity_confirmation_title |
|
|
|
is FlowStep.Initial, FlowStep.AwaitingOtherDeviceResponse -> R.string.screen_identity_confirmation_title |
|
|
|
FlowStep.Canceled -> CommonStrings.common_verification_cancelled |
|
|
|
FlowStep.Canceled -> CommonStrings.common_verification_cancelled |
|
|
|
FlowStep.Ready -> R.string.screen_session_verification_compare_emojis_title |
|
|
|
FlowStep.Ready -> R.string.screen_session_verification_compare_emojis_title |
|
|
@ -175,6 +192,7 @@ private fun HeaderContent(verificationFlowStep: FlowStep) { |
|
|
|
is FlowStep.Skipped -> return |
|
|
|
is FlowStep.Skipped -> return |
|
|
|
} |
|
|
|
} |
|
|
|
val subtitleTextId = when (verificationFlowStep) { |
|
|
|
val subtitleTextId = when (verificationFlowStep) { |
|
|
|
|
|
|
|
VerifySelfSessionState.VerificationStep.Loading -> error("Should not happen") |
|
|
|
is FlowStep.Initial, FlowStep.AwaitingOtherDeviceResponse -> R.string.screen_identity_confirmation_subtitle |
|
|
|
is FlowStep.Initial, FlowStep.AwaitingOtherDeviceResponse -> R.string.screen_identity_confirmation_subtitle |
|
|
|
FlowStep.Canceled -> R.string.screen_session_verification_cancelled_subtitle |
|
|
|
FlowStep.Canceled -> R.string.screen_session_verification_cancelled_subtitle |
|
|
|
FlowStep.Ready -> R.string.screen_session_verification_ready_subtitle |
|
|
|
FlowStep.Ready -> R.string.screen_session_verification_ready_subtitle |
|
|
@ -268,6 +286,7 @@ private fun BottomMenu( |
|
|
|
val isVerifying = (verificationViewState as? FlowStep.Verifying)?.state is AsyncData.Loading<Unit> |
|
|
|
val isVerifying = (verificationViewState as? FlowStep.Verifying)?.state is AsyncData.Loading<Unit> |
|
|
|
|
|
|
|
|
|
|
|
when (verificationViewState) { |
|
|
|
when (verificationViewState) { |
|
|
|
|
|
|
|
VerifySelfSessionState.VerificationStep.Loading -> error("Should not happen") |
|
|
|
is FlowStep.Initial -> { |
|
|
|
is FlowStep.Initial -> { |
|
|
|
BottomMenu { |
|
|
|
BottomMenu { |
|
|
|
if (verificationViewState.isLastDevice) { |
|
|
|
if (verificationViewState.isLastDevice) { |
|
|
|