From 0f009943b50410cbe8e8890e9e5dc05208d23ad7 Mon Sep 17 00:00:00 2001 From: Dave Severns <149429124+dseverns-livefront@users.noreply.github.com> Date: Wed, 25 Sep 2024 10:49:48 -0400 Subject: [PATCH] [PM-12604] Fix showing the biometric prompt when not needed adding account (#3962) --- .../vaultunlock/VaultUnlockViewModel.kt | 2 ++ .../vaultunlock/VaultUnlockViewModelTest.kt | 30 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt index 9e9a5f9e7b3..f2e6f76e752 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt @@ -310,6 +310,8 @@ class VaultUnlockViewModel @Inject constructor( // If the Vault is already unlocked, do nothing. if (userState.activeAccount.isVaultUnlocked) return + // If the user state has changed to add a new account, do nothing. + if (userState.hasPendingAccountAddition) return mutableStateFlow.update { val accountSummaries = userState.toAccountSummaries() diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt index fe21ed0bd85..a67a6dd11fa 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt @@ -460,7 +460,35 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals(VaultUnlockEvent.PromptForBiometrics(CIPHER), awaitItem()) expectNoEvents() } - verify { + // The initial state causes this to be called as well as the change. + verify(exactly = 2) { + encryptionManager.getOrCreateCipher(USER_ID) + } + } + + @Suppress("MaxLineLength") + @Test + fun `switching accounts should not prompt for biometrics if new account has biometrics enabled`() = + runTest { + val account = DEFAULT_ACCOUNT.copy( + isVaultUnlocked = false, + isBiometricsEnabled = true, + ) + val initialState = DEFAULT_STATE.copy(isBiometricsValid = true) + val viewModel = createViewModel(state = initialState) + mutableUserStateFlow.update { + it?.copy( + activeUserId = account.userId, + accounts = listOf(account), + hasPendingAccountAddition = true, + ) + } + + viewModel.eventFlow.test { + expectNoEvents() + } + // Only the call for the initial state should be called. + verify(exactly = 1) { encryptionManager.getOrCreateCipher(USER_ID) } }