From caa0c613a59b722f3143a44ba3dcdbec72c63a6d Mon Sep 17 00:00:00 2001 From: David Perez Date: Wed, 25 Sep 2024 13:16:22 -0500 Subject: [PATCH] PM-12631: Handle password re-prompt for accessibility autofill (#3965) --- .../itemlisting/VaultItemListingViewModel.kt | 13 ++++- .../VaultItemListingViewModelTest.kt | 52 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt index 2d9b3ad2a9..68cb80ce4f 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt @@ -1122,8 +1122,19 @@ class VaultItemListingViewModel @Inject constructor( when (data) { is MasterPasswordRepromptData.Autofill -> { // Complete the autofill selection flow + val autofillSelectionData = state.autofillSelectionData ?: return val cipherView = getCipherViewOrNull(cipherId = data.cipherId) ?: return - autofillSelectionManager.emitAutofillSelection(cipherView = cipherView) + when (autofillSelectionData.framework) { + AutofillSelectionData.Framework.ACCESSIBILITY -> { + accessibilitySelectionManager.emitAccessibilitySelection( + cipherView = cipherView, + ) + } + + AutofillSelectionData.Framework.AUTOFILL -> { + autofillSelectionManager.emitAutofillSelection(cipherView = cipherView) + } + } } is MasterPasswordRepromptData.OverflowItem -> { diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt index 973d47fd25..6f23ee6546 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt @@ -794,6 +794,15 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { sendViewList = emptyList(), ), ) + specialCircumstanceManager.specialCircumstance = + SpecialCircumstance.AutofillSelection( + autofillSelectionData = AutofillSelectionData( + type = AutofillSelectionData.Type.LOGIN, + framework = AutofillSelectionData.Framework.AUTOFILL, + uri = "https://www.test.com", + ), + shouldFinishWhenComplete = true, + ) val viewModel = createVaultItemListingViewModel() coEvery { authRepository.validatePassword(password = password) @@ -815,6 +824,49 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { } } + @Suppress("MaxLineLength") + @Test + fun `MasterPasswordRepromptSubmit for a request Success with a valid password for accessibility autofill should post to the AccessibilitySelectionManager`() = + runTest { + setupMockUri() + val cipherView = createMockCipherView(number = 1) + val cipherId = "mockId-1" + val password = "password" + mutableVaultDataStateFlow.value = DataState.Loaded( + data = VaultData( + cipherViewList = listOf(cipherView), + folderViewList = emptyList(), + collectionViewList = emptyList(), + sendViewList = emptyList(), + ), + ) + specialCircumstanceManager.specialCircumstance = + SpecialCircumstance.AutofillSelection( + autofillSelectionData = AutofillSelectionData( + type = AutofillSelectionData.Type.LOGIN, + framework = AutofillSelectionData.Framework.ACCESSIBILITY, + uri = "https://www.test.com", + ), + shouldFinishWhenComplete = true, + ) + val viewModel = createVaultItemListingViewModel() + coEvery { + authRepository.validatePassword(password = password) + } returns ValidatePasswordResult.Success(isValid = true) + + accessibilitySelectionManager.accessibilitySelectionFlow.test { + viewModel.trySendAction( + VaultItemListingsAction.MasterPasswordRepromptSubmit( + password = password, + masterPasswordRepromptData = MasterPasswordRepromptData.Autofill( + cipherId = cipherId, + ), + ), + ) + assertEquals(cipherView, awaitItem()) + } + } + @Suppress("MaxLineLength") @Test fun `MasterPasswordRepromptSubmit for a request Success with a valid password for overflow actions should process the action`() =