Compare commits

...

1 Commits

Author SHA1 Message Date
Dave Severns
635eb10511 worx on mi machin3 2025-03-18 10:54:51 -04:00
4 changed files with 32 additions and 9 deletions

View File

@@ -11,11 +11,13 @@ import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage
import com.x8bit.bitwarden.ui.auth.feature.vaultunlock.model.UnlockType
private const val VAULT_UNLOCK_TYPE: String = "unlock_type"
private const val PROMPT_FOR_BIO: String = "prompt_for_bio"
private const val TDE_VAULT_UNLOCK_ROUTE_PREFIX: String = "tde_vault_unlock"
private const val TDE_VAULT_UNLOCK_ROUTE: String =
"$TDE_VAULT_UNLOCK_ROUTE_PREFIX/{$VAULT_UNLOCK_TYPE}"
private const val VAULT_UNLOCK_ROUTE_PREFIX: String = "vault_unlock"
const val VAULT_UNLOCK_ROUTE: String = "$VAULT_UNLOCK_ROUTE_PREFIX/{$VAULT_UNLOCK_TYPE}"
const val VAULT_UNLOCK_ROUTE: String =
"$VAULT_UNLOCK_ROUTE_PREFIX/{$VAULT_UNLOCK_TYPE}/{$PROMPT_FOR_BIO}"
/**
* Class to retrieve vault unlock arguments from the [SavedStateHandle].
@@ -23,9 +25,11 @@ const val VAULT_UNLOCK_ROUTE: String = "$VAULT_UNLOCK_ROUTE_PREFIX/{$VAULT_UNLOC
@OmitFromCoverage
data class VaultUnlockArgs(
val unlockType: UnlockType,
val shouldPromptForBio: Boolean,
) {
constructor(savedStateHandle: SavedStateHandle) : this(
unlockType = checkNotNull(savedStateHandle.get<UnlockType>(VAULT_UNLOCK_TYPE)),
shouldPromptForBio = checkNotNull(savedStateHandle.get<Boolean>(PROMPT_FOR_BIO)),
)
}
@@ -34,9 +38,10 @@ data class VaultUnlockArgs(
*/
fun NavController.navigateToVaultUnlock(
navOptions: NavOptions? = null,
shouldPromptForBio: Boolean = false,
) {
navigate(
route = "$VAULT_UNLOCK_ROUTE_PREFIX/${UnlockType.STANDARD}",
route = "$VAULT_UNLOCK_ROUTE_PREFIX/${UnlockType.STANDARD}/$shouldPromptForBio",
navOptions = navOptions,
)
}
@@ -49,6 +54,7 @@ fun NavGraphBuilder.vaultUnlockDestination() {
route = VAULT_UNLOCK_ROUTE,
arguments = listOf(
navArgument(VAULT_UNLOCK_TYPE) { type = NavType.EnumType(UnlockType::class.java) },
navArgument(PROMPT_FOR_BIO) { type = NavType.BoolType },
),
) {
VaultUnlockScreen()

View File

@@ -75,11 +75,12 @@ class VaultUnlockViewModel @Inject constructor(
}
val specialCircumstance = specialCircumstanceManager.specialCircumstance
val args = VaultUnlockArgs(savedStateHandle)
val showAccountMenu =
VaultUnlockArgs(savedStateHandle).unlockType == UnlockType.STANDARD &&
args.unlockType == UnlockType.STANDARD &&
(specialCircumstance !is SpecialCircumstance.Fido2GetCredentials &&
specialCircumstance !is SpecialCircumstance.Fido2Assertion)
val shouldPromptBiometrics = args.shouldPromptForBio
VaultUnlockState(
accountSummaries = accountSummaries,
avatarColorString = activeAccountSummary.avatarColorHex,
@@ -100,6 +101,7 @@ class VaultUnlockViewModel @Inject constructor(
// TODO: [PM-13076] Handle Fido2CredentialAssertionRequest special circumstance
fido2CredentialAssertionRequest = null,
hasMasterPassword = activeAccount.hasMasterPassword,
shouldPromptForBiometrics = shouldPromptBiometrics,
)
},
) {
@@ -425,7 +427,7 @@ class VaultUnlockViewModel @Inject constructor(
private fun promptForBiometricsIfAvailable() {
val cipher = biometricsEncryptionManager.getOrCreateCipher(state.userId)
if (state.showBiometricLogin && cipher != null) {
if (state.showBiometricLogin && cipher != null && state.shouldPromptForBiometrics) {
sendEvent(
VaultUnlockEvent.PromptForBiometrics(
cipher = cipher,
@@ -458,6 +460,7 @@ data class VaultUnlockState(
val fido2GetCredentialsRequest: Fido2GetCredentialsRequest? = null,
val fido2CredentialAssertionRequest: Fido2CredentialAssertionRequest? = null,
private val hasMasterPassword: Boolean,
val shouldPromptForBiometrics: Boolean,
) : Parcelable {
/**

View File

@@ -120,7 +120,7 @@ fun RootNavScreen(
RootNavState.RemovePassword -> REMOVE_PASSWORD_ROUTE
RootNavState.Splash -> SPLASH_ROUTE
RootNavState.TrustedDevice -> TRUSTED_DEVICE_GRAPH_ROUTE
RootNavState.VaultLocked -> VAULT_UNLOCK_ROUTE
is RootNavState.VaultLocked -> VAULT_UNLOCK_ROUTE
is RootNavState.VaultUnlocked,
is RootNavState.VaultUnlockedForAutofillSave,
is RootNavState.VaultUnlockedForAutofillSelection,
@@ -193,7 +193,12 @@ fun RootNavScreen(
RootNavState.SetPassword -> navController.navigateToSetPassword(rootNavOptions)
RootNavState.Splash -> navController.navigateToSplash(rootNavOptions)
RootNavState.TrustedDevice -> navController.navigateToTrustedDeviceGraph(rootNavOptions)
RootNavState.VaultLocked -> navController.navigateToVaultUnlock(rootNavOptions)
is RootNavState.VaultLocked -> {
navController.navigateToVaultUnlock(
navOptions = rootNavOptions,
shouldPromptForBio = currentState.promptForBiometrics,
)
}
is RootNavState.VaultUnlocked -> navController.navigateToVaultUnlockedGraph(
navOptions = rootNavOptions,
)

View File

@@ -173,7 +173,16 @@ class RootNavViewModel @Inject constructor(
}
}
else -> RootNavState.VaultLocked
else -> {
val promptForBiometrics = when (val previousState = state) {
is RootNavState.VaultUnlocked -> {
previousState.activeUserId != userState.activeUserId
}
else -> true
}
RootNavState.VaultLocked(promptForBiometrics = promptForBiometrics)
}
}
mutableStateFlow.update { updatedRootNavState }
}
@@ -260,7 +269,7 @@ sealed class RootNavState : Parcelable {
* App should show vault locked nav graph.
*/
@Parcelize
data object VaultLocked : RootNavState()
data class VaultLocked(val promptForBiometrics: Boolean) : RootNavState()
/**
* App should show vault unlocked nav graph for the given [activeUserId].