From 6f5cb0df9688274f6166763269e0447c3556b776 Mon Sep 17 00:00:00 2001 From: Dave Severns <149429124+dseverns-livefront@users.noreply.github.com> Date: Thu, 30 Jan 2025 16:04:11 -0500 Subject: [PATCH] PM-17764 update the email verification to completely match new design. (#4655) --- .../feature/checkemail/CheckEmailScreen.kt | 111 ++---------------- .../feature/checkemail/CheckEmailViewModel.kt | 36 ------ .../checkemail/CheckEmailScreenTest.kt | 2 - .../checkemail/CheckEmailViewModelTest.kt | 12 -- 4 files changed, 8 insertions(+), 153 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreen.kt index 3bc9efb1df..94fc8b6426 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreen.kt @@ -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 = { }, - ) - } -} diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailViewModel.kt index 85340f73cf..14d3372d17 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailViewModel.kt @@ -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( 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() - } } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreenTest.kt index 34ce7197e1..ed735099ed 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreenTest.kt @@ -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, ) } } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailViewModelTest.kt index e269c6b54c..1aa890f7bb 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailViewModelTest.kt @@ -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, ) } }