Add email navigation param and environment repo to the TrustedDeviceViewModel (#1146)

This commit is contained in:
David Perez 2024-03-14 15:44:33 -05:00 committed by Álison Fernandes
parent 888e079f09
commit 058c4f0dfc
3 changed files with 41 additions and 8 deletions

View File

@ -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<String>(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)
}

View File

@ -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<TrustedDeviceState, TrustedDeviceEvent, TrustedDeviceAction>(
initialState = savedStateHandle[KEY_STATE]
?: TrustedDeviceState(
emailAddress = "",
environmentLabel = "",
emailAddress = TrustedDeviceArgs(savedStateHandle).emailAddress,
environmentLabel = environmentRepository.environment.label,
isRemembered = false,
),
) {

View File

@ -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,
)