From 058c4f0dfc134540ffdafe6479ff0fe28bee95ae Mon Sep 17 00:00:00 2001 From: David Perez Date: Thu, 14 Mar 2024 15:44:33 -0500 Subject: [PATCH] Add email navigation param and environment repo to the TrustedDeviceViewModel (#1146) --- .../trusteddevice/TrustedDeviceNavigation.kt | 28 +++++++++++++++++-- .../trusteddevice/TrustedDeviceViewModel.kt | 6 ++-- .../TrustedDeviceViewModelTest.kt | 15 ++++++++-- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceNavigation.kt index 2df59ea7c3..e9fd829ec1 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceNavigation.kt @@ -1,11 +1,27 @@ package com.x8bit.bitwarden.ui.auth.feature.trusteddevice +import androidx.lifecycle.SavedStateHandle import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions +import androidx.navigation.NavType +import androidx.navigation.navArgument +import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage import com.x8bit.bitwarden.ui.platform.base.util.composableWithSlideTransitions -private const val TRUSTED_DEVICE_ROUTE: String = "trusted_device" +private const val EMAIL_ADDRESS: String = "email_address" +private const val TRUSTED_DEVICE_PREFIX: String = "trusted_device" +private const val TRUSTED_DEVICE_ROUTE: String = "$TRUSTED_DEVICE_PREFIX/{${EMAIL_ADDRESS}}" + +/** + * Class to retrieve trusted device arguments from the [SavedStateHandle]. + */ +@OmitFromCoverage +data class TrustedDeviceArgs(val emailAddress: String) { + constructor(savedStateHandle: SavedStateHandle) : this( + emailAddress = checkNotNull(savedStateHandle.get(EMAIL_ADDRESS)), + ) +} /** * Add the Trusted Device Screen to the nav graph. @@ -15,6 +31,9 @@ fun NavGraphBuilder.trustedDeviceDestination( ) { composableWithSlideTransitions( route = TRUSTED_DEVICE_ROUTE, + arguments = listOf( + navArgument(EMAIL_ADDRESS) { type = NavType.StringType }, + ), ) { TrustedDeviceScreen( onNavigateBack = onNavigateBack, @@ -25,6 +44,9 @@ fun NavGraphBuilder.trustedDeviceDestination( /** * Navigate to the Trusted Device Screen. */ -fun NavController.navigateToTrustedDevice(navOptions: NavOptions? = null) { - this.navigate(TRUSTED_DEVICE_ROUTE, navOptions) +fun NavController.navigateToTrustedDevice( + emailAddress: String, + navOptions: NavOptions? = null, +) { + this.navigate("$TRUSTED_DEVICE_PREFIX/$emailAddress", navOptions) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt index 838a16472a..b5c1cc3ade 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt @@ -2,6 +2,7 @@ package com.x8bit.bitwarden.ui.auth.feature.trusteddevice import android.os.Parcelable import androidx.lifecycle.SavedStateHandle +import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.ui.platform.base.BaseViewModel import com.x8bit.bitwarden.ui.platform.base.util.Text import com.x8bit.bitwarden.ui.platform.base.util.asText @@ -18,11 +19,12 @@ private const val KEY_STATE = "state" @HiltViewModel class TrustedDeviceViewModel @Inject constructor( savedStateHandle: SavedStateHandle, + environmentRepository: EnvironmentRepository, ) : BaseViewModel( initialState = savedStateHandle[KEY_STATE] ?: TrustedDeviceState( - emailAddress = "", - environmentLabel = "", + emailAddress = TrustedDeviceArgs(savedStateHandle).emailAddress, + environmentLabel = environmentRepository.environment.label, isRemembered = false, ), ) { diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt index eb58eb26df..67be5fc0c9 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt @@ -2,6 +2,8 @@ package com.x8bit.bitwarden.ui.auth.feature.trusteddevice import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test +import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository +import com.x8bit.bitwarden.data.platform.repository.util.FakeEnvironmentRepository import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest import com.x8bit.bitwarden.ui.platform.base.util.asText import kotlinx.coroutines.test.runTest @@ -10,6 +12,8 @@ import org.junit.jupiter.api.Test class TrustedDeviceViewModelTest : BaseViewModelTest() { + private val environmentRepo: FakeEnvironmentRepository = FakeEnvironmentRepository() + @Test fun `on BackClick emits NavigateBack`() = runTest { val viewModel = createViewModel() @@ -75,14 +79,19 @@ class TrustedDeviceViewModelTest : BaseViewModelTest() { private fun createViewModel( state: TrustedDeviceState? = null, + environmentRepository: EnvironmentRepository = environmentRepo, ): TrustedDeviceViewModel = TrustedDeviceViewModel( - savedStateHandle = SavedStateHandle().apply { set("state", state) }, + savedStateHandle = SavedStateHandle().apply { + set("state", state) + set("email_address", "email@bitwarden.com") + }, + environmentRepository = environmentRepository, ) } private val DEFAULT_STATE: TrustedDeviceState = TrustedDeviceState( - emailAddress = "", - environmentLabel = "", + emailAddress = "email@bitwarden.com", + environmentLabel = "bitwarden.com", isRemembered = false, )