Add placeholder autofill URI matching (#838)

This commit is contained in:
Brian Yencho 2024-01-28 20:06:53 -06:00 committed by Álison Fernandes
parent e19ba9df51
commit 7c4092a539
2 changed files with 42 additions and 2 deletions

View file

@ -7,6 +7,7 @@ import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.autofill.manager.AutofillSelectionManager
import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData
import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage
import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager
import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager
import com.x8bit.bitwarden.data.platform.manager.model.SpecialCircumstance
@ -15,6 +16,7 @@ import com.x8bit.bitwarden.data.platform.repository.SettingsRepository
import com.x8bit.bitwarden.data.platform.repository.model.DataState
import com.x8bit.bitwarden.data.platform.repository.util.baseIconUrl
import com.x8bit.bitwarden.data.platform.repository.util.baseWebSendUrl
import com.x8bit.bitwarden.data.platform.repository.util.map
import com.x8bit.bitwarden.data.vault.repository.VaultRepository
import com.x8bit.bitwarden.data.vault.repository.model.DeleteSendResult
import com.x8bit.bitwarden.data.vault.repository.model.RemovePasswordSendResult
@ -104,7 +106,13 @@ class VaultItemListingViewModel @Inject constructor(
vaultRepository
.vaultDataStateFlow
.onEach { sendAction(VaultItemListingsAction.Internal.VaultDataReceive(it)) }
.onEach {
sendAction(
VaultItemListingsAction.Internal.VaultDataReceive(
it.filterForAutofillIfNecessary(),
),
)
}
.launchIn(viewModelScope)
}
@ -566,6 +574,34 @@ class VaultItemListingViewModel @Inject constructor(
.data
?.cipherViewList
?.firstOrNull { it.id == cipherId }
// TODO: Update to use correct logic (BIT-1641)
/**
* Takes the given vault data and filters it for autofill if necessary.
*/
@OmitFromCoverage
private suspend fun DataState<VaultData>.filterForAutofillIfNecessary(): DataState<VaultData> {
val matchingUri = state
.autofillSelectionData
?.uri
?.toHostOrPathOrNull()
?: return this
return this.map { vaultData ->
vaultData.copy(
cipherViewList = vaultData
.cipherViewList
.filter { cipherView ->
cipherView
.login
?.uris
.orEmpty()
.any {
matchingUri in it.uri?.toHostOrPathOrNull().orEmpty()
}
},
)
}
}
}
/**

View file

@ -9,6 +9,7 @@ import com.x8bit.bitwarden.data.auth.repository.model.SwitchAccountResult
import com.x8bit.bitwarden.data.auth.repository.model.UserState
import com.x8bit.bitwarden.data.autofill.manager.AutofillSelectionManager
import com.x8bit.bitwarden.data.autofill.manager.AutofillSelectionManagerImpl
import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData
import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManagerImpl
import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager
import com.x8bit.bitwarden.data.platform.manager.model.SpecialCircumstance
@ -217,7 +218,10 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
val cipherView = createMockCipherView(number = 1)
specialCircumstanceManager.specialCircumstance =
SpecialCircumstance.AutofillSelection(
autofillSelectionData = mockk(),
autofillSelectionData = AutofillSelectionData(
type = AutofillSelectionData.Type.LOGIN,
uri = "https://www.test.com",
),
shouldFinishWhenComplete = true,
)
mutableVaultDataStateFlow.value = DataState.Loaded(