mirror of
https://github.com/bitwarden/android.git
synced 2026-03-11 20:54:58 -05:00
PM-17764 update the email verification to completely match new design. (#4655)
This commit is contained in:
@@ -20,7 +20,6 @@ import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.ColorFilter
|
||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||
import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.platform.testTag
|
||||
@@ -92,19 +91,11 @@ fun CheckEmailScreen(
|
||||
.fillMaxSize()
|
||||
.verticalScroll(rememberScrollState()),
|
||||
) {
|
||||
if (state.showNewOnboardingUi) {
|
||||
CheckEmailContent(
|
||||
email = state.email,
|
||||
onOpenEmailAppClick = handler.onOpenEmailAppClick,
|
||||
onChangeEmailClick = handler.onChangeEmailClick,
|
||||
)
|
||||
} else {
|
||||
CheckEmailLegacyContent(
|
||||
email = state.email,
|
||||
onOpenEmailAppClick = handler.onOpenEmailAppClick,
|
||||
onChangeEmailClick = handler.onChangeEmailClick,
|
||||
)
|
||||
}
|
||||
CheckEmailContent(
|
||||
email = state.email,
|
||||
onOpenEmailAppClick = handler.onOpenEmailAppClick,
|
||||
onChangeEmailClick = handler.onChangeEmailClick,
|
||||
)
|
||||
Spacer(modifier = Modifier.height(12.dp))
|
||||
Spacer(modifier = Modifier.navigationBarsPadding())
|
||||
}
|
||||
@@ -167,7 +158,9 @@ private fun CheckEmailContent(
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
@Suppress("MaxLineLength")
|
||||
Text(
|
||||
text = stringResource(R.string.select_the_link_in_the_email_to_verify_your_email_address_and_continue_creating_your_account),
|
||||
text = stringResource(
|
||||
R.string.select_the_link_in_the_email_to_verify_your_email_address_and_continue_creating_your_account,
|
||||
),
|
||||
style = BitwardenTheme.typography.bodyMedium,
|
||||
color = BitwardenTheme.colorScheme.text.primary,
|
||||
textAlign = TextAlign.Center,
|
||||
@@ -196,82 +189,6 @@ private fun CheckEmailContent(
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("LongMethod")
|
||||
@Composable
|
||||
private fun CheckEmailLegacyContent(
|
||||
email: String,
|
||||
onOpenEmailAppClick: () -> Unit,
|
||||
onChangeEmailClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
Column(
|
||||
modifier = modifier
|
||||
.fillMaxWidth(),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
) {
|
||||
Spacer(modifier = Modifier.height(32.dp))
|
||||
Image(
|
||||
painter = rememberVectorPainter(id = R.drawable.email_check),
|
||||
colorFilter = ColorFilter.tint(BitwardenTheme.colorScheme.icon.secondary),
|
||||
contentDescription = null,
|
||||
contentScale = ContentScale.FillHeight,
|
||||
modifier = Modifier
|
||||
.standardHorizontalMargin()
|
||||
.height(112.dp)
|
||||
.fillMaxWidth(),
|
||||
)
|
||||
Spacer(modifier = Modifier.height(32.dp))
|
||||
Text(
|
||||
text = stringResource(id = R.string.check_your_email),
|
||||
textAlign = TextAlign.Center,
|
||||
style = BitwardenTheme.typography.headlineSmall,
|
||||
color = BitwardenTheme.colorScheme.text.primary,
|
||||
modifier = Modifier
|
||||
.standardHorizontalMargin()
|
||||
.wrapContentHeight()
|
||||
.fillMaxWidth(),
|
||||
)
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
@Suppress("MaxLineLength")
|
||||
val descriptionAnnotatedString =
|
||||
R.string.follow_the_instructions_in_the_email_sent_to_x_to_continue_creating_your_account.toAnnotatedString(
|
||||
args = arrayOf(email),
|
||||
emphasisHighlightStyle = SpanStyle(
|
||||
color = BitwardenTheme.colorScheme.text.primary,
|
||||
fontSize = BitwardenTheme.typography.bodyMedium.fontSize,
|
||||
fontWeight = FontWeight.Bold,
|
||||
),
|
||||
)
|
||||
Text(
|
||||
text = descriptionAnnotatedString,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.standardHorizontalMargin()
|
||||
.wrapContentHeight(),
|
||||
)
|
||||
Spacer(modifier = Modifier.height(32.dp))
|
||||
BitwardenFilledButton(
|
||||
label = stringResource(id = R.string.open_email_app),
|
||||
onClick = onOpenEmailAppClick,
|
||||
modifier = Modifier
|
||||
.testTag("OpenEmailApp")
|
||||
.standardHorizontalMargin()
|
||||
.fillMaxWidth(),
|
||||
)
|
||||
Spacer(modifier = Modifier.height(12.dp))
|
||||
|
||||
BitwardenOutlinedButton(
|
||||
label = stringResource(R.string.change_email_address),
|
||||
onClick = onChangeEmailClick,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.standardHorizontalMargin(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
private fun CheckEmailScreenNewUi_preview() {
|
||||
@@ -283,15 +200,3 @@ private fun CheckEmailScreenNewUi_preview() {
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
private fun CheckEmailScreenLegacy_preview() {
|
||||
BitwardenTheme {
|
||||
CheckEmailLegacyContent(
|
||||
email = "email@fake.com",
|
||||
onOpenEmailAppClick = { },
|
||||
onChangeEmailClick = { },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,14 +3,10 @@ package com.x8bit.bitwarden.ui.auth.feature.checkemail
|
||||
import android.os.Parcelable
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.model.FlagKey
|
||||
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.update
|
||||
import kotlinx.parcelize.Parcelize
|
||||
import javax.inject.Inject
|
||||
|
||||
@@ -21,13 +17,11 @@ private const val KEY_STATE = "state"
|
||||
*/
|
||||
@HiltViewModel
|
||||
class CheckEmailViewModel @Inject constructor(
|
||||
featureFlagManager: FeatureFlagManager,
|
||||
savedStateHandle: SavedStateHandle,
|
||||
) : BaseViewModel<CheckEmailState, CheckEmailEvent, CheckEmailAction>(
|
||||
initialState = savedStateHandle[KEY_STATE]
|
||||
?: CheckEmailState(
|
||||
email = CheckEmailArgs(savedStateHandle).emailAddress,
|
||||
showNewOnboardingUi = featureFlagManager.getFeatureFlag(FlagKey.OnboardingFlow),
|
||||
),
|
||||
) {
|
||||
init {
|
||||
@@ -35,14 +29,6 @@ class CheckEmailViewModel @Inject constructor(
|
||||
stateFlow
|
||||
.onEach { savedStateHandle[KEY_STATE] = it }
|
||||
.launchIn(viewModelScope)
|
||||
// Listen for changes on the onboarding feature flag.
|
||||
featureFlagManager
|
||||
.getFeatureFlagFlow(FlagKey.OnboardingFlow)
|
||||
.map {
|
||||
CheckEmailAction.Internal.OnboardingFeatureFlagUpdated(it)
|
||||
}
|
||||
.onEach(::sendAction)
|
||||
.launchIn(viewModelScope)
|
||||
}
|
||||
|
||||
override fun handleAction(action: CheckEmailAction) {
|
||||
@@ -50,17 +36,6 @@ class CheckEmailViewModel @Inject constructor(
|
||||
CheckEmailAction.BackClick -> handleBackClick()
|
||||
CheckEmailAction.OpenEmailClick -> handleOpenEmailClick()
|
||||
CheckEmailAction.ChangeEmailClick -> handleChangeEmailClick()
|
||||
is CheckEmailAction.Internal.OnboardingFeatureFlagUpdated -> {
|
||||
handleOnboardingFeatureFlagUpdated(action)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleOnboardingFeatureFlagUpdated(
|
||||
action: CheckEmailAction.Internal.OnboardingFeatureFlagUpdated,
|
||||
) {
|
||||
mutableStateFlow.update {
|
||||
it.copy(showNewOnboardingUi = action.newValue)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,7 +52,6 @@ class CheckEmailViewModel @Inject constructor(
|
||||
@Parcelize
|
||||
data class CheckEmailState(
|
||||
val email: String,
|
||||
val showNewOnboardingUi: Boolean,
|
||||
) : Parcelable
|
||||
|
||||
/**
|
||||
@@ -114,14 +88,4 @@ sealed class CheckEmailAction {
|
||||
* User clicked open email.
|
||||
*/
|
||||
data object OpenEmailClick : CheckEmailAction()
|
||||
|
||||
/**
|
||||
* Denotes an internal action.
|
||||
*/
|
||||
sealed class Internal : CheckEmailAction() {
|
||||
/**
|
||||
* Indicates updated value for onboarding feature flag.
|
||||
*/
|
||||
data class OnboardingFeatureFlagUpdated(val newValue: Boolean) : Internal()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,7 +79,6 @@ class CheckEmailScreenTest : BaseComposeTest() {
|
||||
|
||||
@Test
|
||||
fun `change email button click should send ChangeEmailClick action`() {
|
||||
mutableStateFlow.value = DEFAULT_STATE.copy(showNewOnboardingUi = true)
|
||||
composeTestRule
|
||||
.onNodeWithText("Change email address")
|
||||
.performScrollTo()
|
||||
@@ -92,7 +91,6 @@ class CheckEmailScreenTest : BaseComposeTest() {
|
||||
private const val EMAIL = "test@gmail.com"
|
||||
private val DEFAULT_STATE = CheckEmailState(
|
||||
email = EMAIL,
|
||||
showNewOnboardingUi = false,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,19 +74,8 @@ class CheckEmailViewModelTest : BaseViewModelTest() {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `OnboardingFeatureFlagUpdated should update showNewOnboardingUi in state`() {
|
||||
val viewModel = createViewModel()
|
||||
mutableFeatureFlagFlow.value = true
|
||||
val expectedState = DEFAULT_STATE.copy(
|
||||
showNewOnboardingUi = true,
|
||||
)
|
||||
assertEquals(expectedState, viewModel.stateFlow.value)
|
||||
}
|
||||
|
||||
private fun createViewModel(state: CheckEmailState? = null): CheckEmailViewModel =
|
||||
CheckEmailViewModel(
|
||||
featureFlagManager = featureFlagManager,
|
||||
savedStateHandle = SavedStateHandle().also {
|
||||
it["email"] = EMAIL
|
||||
it["state"] = state
|
||||
@@ -97,7 +86,6 @@ class CheckEmailViewModelTest : BaseViewModelTest() {
|
||||
private const val EMAIL = "test@gmail.com"
|
||||
private val DEFAULT_STATE = CheckEmailState(
|
||||
email = EMAIL,
|
||||
showNewOnboardingUi = false,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user