From 456adf315893c8b955a034abd8023933a62aaa4a Mon Sep 17 00:00:00 2001 From: David Perez Date: Wed, 14 May 2025 08:57:29 -0500 Subject: [PATCH] PM-21610: Update SearchScreen and VaultItemListingScreen for better Sends support (#5188) --- .../platform/feature/search/SearchContent.kt | 7 +-- .../feature/search/SearchViewModel.kt | 36 +++++++++--- .../feature/search/handlers/SearchHandlers.kt | 13 ++--- .../search/util/SearchTypeDataExtensions.kt | 6 +- .../itemlisting/VaultItemListingContent.kt | 5 +- .../itemlisting/VaultItemListingViewModel.kt | 34 ++++++++--- .../handlers/VaultItemListingHandlers.kt | 8 +-- .../util/VaultItemListingDataExtensions.kt | 4 +- .../feature/search/SearchScreenTest.kt | 9 ++- .../feature/search/SearchViewModelTest.kt | 15 ++++- .../feature/search/util/SearchUtil.kt | 14 ++--- .../itemlisting/VaultItemListingScreenTest.kt | 7 ++- .../VaultItemListingViewModelTest.kt | 57 +++++++++++++------ .../util/VaultItemListingDataUtil.kt | 14 ++--- 14 files changed, 147 insertions(+), 82 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchContent.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchContent.kt index 2892ab5dfe..564d8cf6a8 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchContent.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchContent.kt @@ -15,7 +15,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.bitwarden.vault.CipherType import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.x8bit.bitwarden.ui.platform.base.util.toListItemCardStyle @@ -126,7 +125,7 @@ fun SearchContent( } else if (it.autofillSelectionOptions.isNotEmpty()) { autofillSelectionOptionsItem = it } else { - searchHandlers.onItemClick(it.id, it.cipherType) + searchHandlers.onItemClick(it.id, it.itemType) } }, trailingLabelIcons = it.extraIconList, @@ -184,7 +183,7 @@ private fun AutofillSelectionDialog( displayItem: SearchState.DisplayItem, onAutofillItemClick: (cipherId: String) -> Unit, onAutofillAndSaveItemClick: (cipherId: String) -> Unit, - onViewItemClick: (cipherId: String, cipherType: CipherType?) -> Unit, + onViewItemClick: (id: String, type: SearchState.DisplayItem.ItemType) -> Unit, onMasterPasswordRepromptRequest: (MasterPasswordRepromptData) -> Unit, onDismissRequest: () -> Unit, ) { @@ -238,7 +237,7 @@ private fun AutofillSelectionDialog( text = stringResource(id = R.string.view), onClick = { onDismissRequest() - onViewItemClick(displayItem.id, displayItem.cipherType) + onViewItemClick(displayItem.id, displayItem.itemType) }, ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModel.kt index 2ccb4c06ca..34f371640a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModel.kt @@ -8,6 +8,7 @@ import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.data.repository.util.baseIconUrl import com.bitwarden.data.repository.util.baseWebSendUrl import com.bitwarden.network.model.PolicyTypeJson +import com.bitwarden.send.SendType import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText @@ -162,22 +163,22 @@ class SearchViewModel @Inject constructor( } private fun handleItemClick(action: SearchAction.ItemClick) { - val event = when (state.searchType) { - is SearchTypeData.Vault -> { + val event = when (val itemType = action.itemType) { + is SearchState.DisplayItem.ItemType.Vault -> { if (state.isTotp) { SearchEvent.NavigateToEditCipher( cipherId = action.itemId, - cipherType = requireNotNull(action.cipherType).toVaultItemCipherType(), + cipherType = itemType.type.toVaultItemCipherType(), ) } else { SearchEvent.NavigateToViewCipher( cipherId = action.itemId, - cipherType = requireNotNull(action.cipherType).toVaultItemCipherType(), + cipherType = itemType.type.toVaultItemCipherType(), ) } } - is SearchTypeData.Sends -> { + is SearchState.DisplayItem.ItemType.Sends -> { SearchEvent.NavigateToEditSend(sendId = action.itemId) } } @@ -627,7 +628,7 @@ class SearchViewModel @Inject constructor( trySendAction( action = SearchAction.ItemClick( itemId = data.cipherId, - cipherType = CipherType.LOGIN, + itemType = SearchState.DisplayItem.ItemType.Vault(type = CipherType.LOGIN), ), ) } @@ -891,8 +892,25 @@ data class SearchState( val autofillSelectionOptions: List, val isTotp: Boolean, val shouldDisplayMasterPasswordReprompt: Boolean, - val cipherType: CipherType?, - ) : Parcelable + val itemType: ItemType, + ) : Parcelable { + /** + * Indicates the item type as a send or vault item. + */ + sealed class ItemType : Parcelable { + /** + * Indicates the item type is a send. + */ + @Parcelize + data class Sends(val type: SendType) : ItemType() + + /** + * Indicates the item type is a vault item. + */ + @Parcelize + data class Vault(val type: CipherType) : ItemType() + } + } } /** @@ -1071,7 +1089,7 @@ sealed class SearchAction { */ data class ItemClick( val itemId: String, - val cipherType: CipherType?, + val itemType: SearchState.DisplayItem.ItemType, ) : SearchAction() /** diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/handlers/SearchHandlers.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/handlers/SearchHandlers.kt index 008255eb0a..f41b6dba89 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/handlers/SearchHandlers.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/handlers/SearchHandlers.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.feature.search.handlers -import com.bitwarden.vault.CipherType import com.x8bit.bitwarden.ui.platform.feature.search.MasterPasswordRepromptData import com.x8bit.bitwarden.ui.platform.feature.search.SearchAction +import com.x8bit.bitwarden.ui.platform.feature.search.SearchState import com.x8bit.bitwarden.ui.platform.feature.search.SearchViewModel import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType @@ -13,7 +13,7 @@ import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType data class SearchHandlers( val onBackClick: () -> Unit, val onDismissRequest: () -> Unit, - val onItemClick: (cipherId: String, cipherType: CipherType?) -> Unit, + val onItemClick: (id: String, type: SearchState.DisplayItem.ItemType) -> Unit, val onAutofillItemClick: (String) -> Unit, val onAutofillAndSaveItemClick: (String) -> Unit, val onMasterPasswordRepromptSubmit: (password: String, MasterPasswordRepromptData) -> Unit, @@ -31,13 +31,8 @@ data class SearchHandlers( SearchHandlers( onBackClick = { viewModel.trySendAction(SearchAction.BackClick) }, onDismissRequest = { viewModel.trySendAction(SearchAction.DismissDialogClick) }, - onItemClick = { cipherId, cipherType -> - viewModel.trySendAction( - SearchAction.ItemClick( - itemId = cipherId, - cipherType = cipherType, - ), - ) + onItemClick = { id, type -> + viewModel.trySendAction(SearchAction.ItemClick(itemId = id, itemType = type)) }, onAutofillItemClick = { viewModel.trySendAction(SearchAction.AutofillItemClick(it)) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt index ed9b6bd604..770d3ef370 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt @@ -6,6 +6,7 @@ import androidx.annotation.DrawableRes import com.bitwarden.core.data.repository.util.SpecialCharWithPrecedenceComparator import com.bitwarden.send.SendType import com.bitwarden.send.SendView +import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherRepromptType import com.bitwarden.vault.CipherType import com.bitwarden.vault.CipherView @@ -14,7 +15,6 @@ import com.bitwarden.vault.FolderView import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials import com.x8bit.bitwarden.data.platform.util.subtitle -import com.bitwarden.ui.util.asText import com.x8bit.bitwarden.ui.platform.base.util.removeDiacritics import com.x8bit.bitwarden.ui.platform.components.model.IconData import com.x8bit.bitwarden.ui.platform.feature.search.SearchState @@ -233,7 +233,7 @@ private fun CipherView.toDisplayItem( }, isTotp = isTotp, shouldDisplayMasterPasswordReprompt = reprompt == CipherRepromptType.PASSWORD, - cipherType = this.type, + itemType = SearchState.DisplayItem.ItemType.Vault(type = this.type), ) private fun CipherView.toIconData( @@ -375,7 +375,7 @@ private fun SendView.toDisplayItem( autofillSelectionOptions = emptyList(), isTotp = false, shouldDisplayMasterPasswordReprompt = false, - cipherType = null, + itemType = SearchState.DisplayItem.ItemType.Sends(type = this.type), ) /** diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt index d61b965fa8..2ea3a60d16 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt @@ -16,7 +16,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.bitwarden.vault.CipherType import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.x8bit.bitwarden.ui.platform.base.util.toListItemCardStyle @@ -42,7 +41,7 @@ fun VaultItemListingContent( showAddTotpBanner: Boolean, collectionClick: (id: String) -> Unit, folderClick: (id: String) -> Unit, - vaultItemClick: (id: String, cipherType: CipherType?) -> Unit, + vaultItemClick: (id: String, type: VaultItemListingState.DisplayItem.ItemType) -> Unit, masterPasswordRepromptSubmit: (password: String, data: MasterPasswordRepromptData) -> Unit, onOverflowItemClick: (action: ListingItemOverflowAction) -> Unit, modifier: Modifier = Modifier, @@ -222,7 +221,7 @@ fun VaultItemListingContent( cipherId = it.id, ) } else { - vaultItemClick(it.id, it.type) + vaultItemClick(it.id, it.itemType) } }, trailingLabelIcons = it.extraIconList, 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 ceb36763ce..6fa77dc89f 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 @@ -14,6 +14,7 @@ import com.bitwarden.data.repository.util.baseIconUrl import com.bitwarden.data.repository.util.baseWebSendUrl import com.bitwarden.fido.Fido2CredentialAutofillView import com.bitwarden.network.model.PolicyTypeJson +import com.bitwarden.send.SendType import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.util.Text @@ -701,7 +702,7 @@ class VaultItemListingViewModel @Inject constructor( sendEvent( event = VaultItemListingEvent.NavigateToEditCipher( cipherId = action.id, - cipherType = requireNotNull(action.cipherType).toVaultItemCipherType(), + cipherType = VaultItemCipherType.LOGIN, ), ) return @@ -713,15 +714,15 @@ class VaultItemListingViewModel @Inject constructor( return } - val event = when (state.itemListingType) { - is VaultItemListingState.ItemListingType.Vault -> { + val event = when (val itemType = action.type) { + is VaultItemListingState.DisplayItem.ItemType.Vault -> { VaultItemListingEvent.NavigateToVaultItem( id = action.id, - type = requireNotNull(action.cipherType).toVaultItemCipherType(), + type = itemType.type.toVaultItemCipherType(), ) } - is VaultItemListingState.ItemListingType.Send -> { + is VaultItemListingState.DisplayItem.ItemType.Sends -> { VaultItemListingEvent.NavigateToEditSendItem(id = action.id) } } @@ -2297,7 +2298,7 @@ data class VaultItemListingState( * creation flow. * @property shouldShowMasterPasswordReprompt whether or not a master password reprompt is * required for various secure actions. - * @property type Indicates the type of cipher this is or null if it is not a cipher. + * @property itemType Indicates the type of item this is. */ data class DisplayItem( val id: String, @@ -2316,8 +2317,23 @@ data class VaultItemListingState( val isCredentialCreation: Boolean, val isTotp: Boolean, val shouldShowMasterPasswordReprompt: Boolean, - val type: CipherType?, - ) + val itemType: ItemType, + ) { + /** + * Indicates the item type as a send or vault item. + */ + sealed class ItemType { + /** + * Indicates the item type is a send. + */ + data class Sends(val type: SendType) : ItemType() + + /** + * Indicates the item type is a vault item. + */ + data class Vault(val type: CipherType) : ItemType() + } + } /** * The folder that is displayed to the user on the ItemListingScreen. @@ -2745,7 +2761,7 @@ sealed class VaultItemListingsAction { */ data class ItemClick( val id: String, - val cipherType: CipherType?, + val type: VaultItemListingState.DisplayItem.ItemType, ) : VaultItemListingsAction() /** diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/handlers/VaultItemListingHandlers.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/handlers/VaultItemListingHandlers.kt index a85b7f36ce..5256dfe121 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/handlers/VaultItemListingHandlers.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/handlers/VaultItemListingHandlers.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.vault.feature.itemlisting.handlers -import com.bitwarden.vault.CipherType import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary import com.x8bit.bitwarden.ui.vault.feature.itemlisting.MasterPasswordRepromptData +import com.x8bit.bitwarden.ui.vault.feature.itemlisting.VaultItemListingState import com.x8bit.bitwarden.ui.vault.feature.itemlisting.VaultItemListingViewModel import com.x8bit.bitwarden.ui.vault.feature.itemlisting.VaultItemListingsAction import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction @@ -18,7 +18,7 @@ data class VaultItemListingHandlers( val backClick: () -> Unit, val searchIconClick: () -> Unit, val addVaultItemClick: () -> Unit, - val itemClick: (id: String, cipherType: CipherType?) -> Unit, + val itemClick: (id: String, type: VaultItemListingState.DisplayItem.ItemType) -> Unit, val folderClick: (id: String) -> Unit, val collectionClick: (id: String) -> Unit, val masterPasswordRepromptSubmit: (password: String, MasterPasswordRepromptData) -> Unit, @@ -56,9 +56,9 @@ data class VaultItemListingHandlers( collectionClick = { viewModel.trySendAction(VaultItemListingsAction.CollectionClick(it)) }, - itemClick = { cipherId, cipherType -> + itemClick = { id, type -> viewModel.trySendAction( - VaultItemListingsAction.ItemClick(id = cipherId, cipherType = cipherType), + VaultItemListingsAction.ItemClick(id = id, type = type), ) }, folderClick = { viewModel.trySendAction(VaultItemListingsAction.FolderClick(it)) }, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt index b73cb5d797..6291116354 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt @@ -410,7 +410,7 @@ private fun CipherView.toDisplayItem( isTotp = isTotp, shouldShowMasterPasswordReprompt = (reprompt == CipherRepromptType.PASSWORD) && hasMasterPassword, - type = this.type, + itemType = VaultItemListingState.DisplayItem.ItemType.Vault(type = this.type), ) private fun CipherView.toSecondSubtitle(fido2CredentialRpId: String?): String? = @@ -482,7 +482,7 @@ private fun SendView.toDisplayItem( shouldShowMasterPasswordReprompt = false, isCredentialCreation = false, isTotp = false, - type = null, + itemType = VaultItemListingState.DisplayItem.ItemType.Sends(type = this.type), ) @get:DrawableRes diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreenTest.kt index 125d5fb1a7..781414be71 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreenTest.kt @@ -237,7 +237,12 @@ class SearchScreenTest : BaseComposeTest() { .assertIsDisplayed() .performClick() verify { - viewModel.trySendAction(SearchAction.ItemClick("mockId-1", CipherType.LOGIN)) + viewModel.trySendAction( + SearchAction.ItemClick( + itemId = "mockId-1", + itemType = SearchState.DisplayItem.ItemType.Vault(type = CipherType.LOGIN), + ), + ) } } @@ -381,7 +386,7 @@ class SearchScreenTest : BaseComposeTest() { viewModel.trySendAction( SearchAction.ItemClick( itemId = "mockId-1", - cipherType = CipherType.LOGIN, + itemType = SearchState.DisplayItem.ItemType.Vault(type = CipherType.LOGIN), ), ) } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt index d1d16ad8aa..7959b4ecae 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt @@ -9,6 +9,7 @@ import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager import com.bitwarden.data.repository.model.Environment import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.network.model.SyncResponseJson +import com.bitwarden.send.SendType import com.bitwarden.ui.platform.base.BaseViewModelTest import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText @@ -204,7 +205,7 @@ class SearchViewModelTest : BaseViewModelTest() { viewModel.trySendAction( SearchAction.ItemClick( itemId = "mock", - cipherType = CipherType.LOGIN, + itemType = SearchState.DisplayItem.ItemType.Vault(type = CipherType.LOGIN), ), ) assertEquals( @@ -224,7 +225,10 @@ class SearchViewModelTest : BaseViewModelTest() { val viewModel = createViewModel() viewModel.eventFlow.test { viewModel.trySendAction( - SearchAction.ItemClick(itemId = "mock", cipherType = CipherType.LOGIN), + SearchAction.ItemClick( + itemId = "mock", + itemType = SearchState.DisplayItem.ItemType.Vault(type = CipherType.LOGIN), + ), ) assertEquals( SearchEvent.NavigateToEditCipher( @@ -240,7 +244,12 @@ class SearchViewModelTest : BaseViewModelTest() { fun `ItemClick for send item should emit NavigateToEditSend`() = runTest { val viewModel = createViewModel(DEFAULT_STATE.copy(searchType = SearchTypeData.Sends.All)) viewModel.eventFlow.test { - viewModel.trySendAction(SearchAction.ItemClick(itemId = "mock", cipherType = null)) + viewModel.trySendAction( + SearchAction.ItemClick( + itemId = "mock", + itemType = SearchState.DisplayItem.ItemType.Sends(type = SendType.TEXT), + ), + ) assertEquals(SearchEvent.NavigateToEditSend(sendId = "mock"), awaitItem()) } } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchUtil.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchUtil.kt index 03d8b58b76..70faaf0942 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchUtil.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchUtil.kt @@ -73,7 +73,7 @@ fun createMockDisplayItemForCipher( autofillSelectionOptions = emptyList(), shouldDisplayMasterPasswordReprompt = false, isTotp = isTotp, - cipherType = CipherType.LOGIN, + itemType = SearchState.DisplayItem.ItemType.Vault(type = cipherType), ) } @@ -116,7 +116,7 @@ fun createMockDisplayItemForCipher( autofillSelectionOptions = emptyList(), shouldDisplayMasterPasswordReprompt = false, isTotp = false, - cipherType = CipherType.SECURE_NOTE, + itemType = SearchState.DisplayItem.ItemType.Vault(type = cipherType), ) } @@ -165,7 +165,7 @@ fun createMockDisplayItemForCipher( autofillSelectionOptions = emptyList(), shouldDisplayMasterPasswordReprompt = false, isTotp = false, - cipherType = CipherType.CARD, + itemType = SearchState.DisplayItem.ItemType.Vault(type = cipherType), ) } @@ -205,7 +205,7 @@ fun createMockDisplayItemForCipher( autofillSelectionOptions = emptyList(), shouldDisplayMasterPasswordReprompt = false, isTotp = false, - cipherType = CipherType.IDENTITY, + itemType = SearchState.DisplayItem.ItemType.Vault(type = cipherType), ) } @@ -240,7 +240,7 @@ fun createMockDisplayItemForCipher( autofillSelectionOptions = emptyList(), shouldDisplayMasterPasswordReprompt = false, isTotp = false, - cipherType = CipherType.SSH_KEY, + itemType = SearchState.DisplayItem.ItemType.Vault(type = cipherType), ) } } @@ -290,7 +290,7 @@ fun createMockDisplayItemForSend( autofillSelectionOptions = emptyList(), shouldDisplayMasterPasswordReprompt = false, isTotp = false, - cipherType = null, + itemType = SearchState.DisplayItem.ItemType.Sends(type = sendType), ) } @@ -330,7 +330,7 @@ fun createMockDisplayItemForSend( autofillSelectionOptions = emptyList(), shouldDisplayMasterPasswordReprompt = false, isTotp = false, - cipherType = null, + itemType = SearchState.DisplayItem.ItemType.Sends(type = sendType), ) } } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt index ad8f7a3732..73cef9540a 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt @@ -19,6 +19,7 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.repository.model.Environment import com.bitwarden.data.repository.util.baseIconUrl import com.bitwarden.data.repository.util.baseWebSendUrl +import com.bitwarden.send.SendType import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherType import com.x8bit.bitwarden.R @@ -1043,7 +1044,7 @@ class VaultItemListingScreenTest : BaseComposeTest() { viewModel.trySendAction( VaultItemListingsAction.ItemClick( id = "mockId-1", - cipherType = null, + type = VaultItemListingState.DisplayItem.ItemType.Sends(type = SendType.TEXT), ), ) } @@ -2337,7 +2338,7 @@ private fun createDisplayItem(number: Int): VaultItemListingState.DisplayItem = shouldShowMasterPasswordReprompt = false, iconTestTag = null, isTotp = false, - type = null, + itemType = VaultItemListingState.DisplayItem.ItemType.Sends(type = SendType.TEXT), ) private fun createCipherDisplayItem(number: Int): VaultItemListingState.DisplayItem = @@ -2364,5 +2365,5 @@ private fun createCipherDisplayItem(number: Int): VaultItemListingState.DisplayI shouldShowMasterPasswordReprompt = false, iconTestTag = null, isTotp = true, - type = CipherType.LOGIN, + itemType = VaultItemListingState.DisplayItem.ItemType.Vault(type = CipherType.LOGIN), ) 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 80d6d3ac12..b9b788d9b9 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 @@ -20,6 +20,7 @@ import com.bitwarden.data.repository.model.Environment import com.bitwarden.data.repository.util.baseIconUrl import com.bitwarden.data.repository.util.baseWebSendUrl import com.bitwarden.network.model.PolicyTypeJson +import com.bitwarden.send.SendType import com.bitwarden.ui.platform.base.BaseViewModelTest import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText @@ -527,7 +528,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.trySendAction( VaultItemListingsAction.ItemClick( id = "mockId-1", - cipherType = CipherType.LOGIN, + type = VaultItemListingState.DisplayItem.ItemType.Vault( + type = CipherType.LOGIN, + ), ), ) assertEquals(cipherView, awaitItem()) @@ -575,7 +578,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.trySendAction( VaultItemListingsAction.ItemClick( id = "mockId-1", - cipherType = CipherType.LOGIN, + type = VaultItemListingState.DisplayItem.ItemType.Vault( + type = CipherType.LOGIN, + ), ), ) assertEquals( @@ -610,7 +615,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.trySendAction( VaultItemListingsAction.ItemClick( id = cipherView.id.orEmpty(), - cipherType = CipherType.LOGIN, + type = VaultItemListingState.DisplayItem.ItemType.Vault( + type = CipherType.LOGIN, + ), ), ) @@ -660,10 +667,10 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { ) coEvery { bitwardenCredentialManager.registerFido2Credential( - any(), - any(), - any(), - any(), + userId = any(), + callingAppInfo = any(), + createPublicKeyCredentialRequest = any(), + selectedCipherView = any(), ) } returns Fido2RegisterCredentialResult.Success("mockResponse") @@ -671,7 +678,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.trySendAction( VaultItemListingsAction.ItemClick( id = cipherView.id.orEmpty(), - cipherType = CipherType.LOGIN, + type = VaultItemListingState.DisplayItem.ItemType.Vault( + type = CipherType.LOGIN, + ), ), ) @@ -722,10 +731,10 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { ) coEvery { bitwardenCredentialManager.registerFido2Credential( - any(), - any(), - any(), - any(), + userId = any(), + callingAppInfo = any(), + createPublicKeyCredentialRequest = any(), + selectedCipherView = any(), ) } returns Fido2RegisterCredentialResult.Success("mockResponse") @@ -733,7 +742,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.trySendAction( VaultItemListingsAction.ItemClick( id = cipherView.id.orEmpty(), - cipherType = CipherType.LOGIN, + type = VaultItemListingState.DisplayItem.ItemType.Vault( + type = CipherType.LOGIN, + ), ), ) @@ -802,7 +813,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.trySendAction( VaultItemListingsAction.ItemClick( id = cipherView.id.orEmpty(), - cipherType = CipherType.LOGIN, + type = VaultItemListingState.DisplayItem.ItemType.Vault( + type = CipherType.LOGIN, + ), ), ) @@ -861,7 +874,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.trySendAction( VaultItemListingsAction.ItemClick( id = cipherView.id.orEmpty(), - cipherType = CipherType.LOGIN, + type = VaultItemListingState.DisplayItem.ItemType.Vault( + type = CipherType.LOGIN, + ), ), ) @@ -881,7 +896,12 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { val viewModel = createVaultItemListingViewModel() viewModel.eventFlow.test { viewModel.trySendAction( - VaultItemListingsAction.ItemClick(id = "mock", cipherType = CipherType.LOGIN), + VaultItemListingsAction.ItemClick( + id = "mock", + type = VaultItemListingState.DisplayItem.ItemType.Vault( + type = CipherType.LOGIN, + ), + ), ) assertEquals( VaultItemListingEvent.NavigateToVaultItem( @@ -900,7 +920,10 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { ) viewModel.eventFlow.test { viewModel.trySendAction( - VaultItemListingsAction.ItemClick(id = "mock", cipherType = null), + VaultItemListingsAction.ItemClick( + id = "mock", + type = VaultItemListingState.DisplayItem.ItemType.Sends(type = SendType.FILE), + ), ) assertEquals(VaultItemListingEvent.NavigateToEditSendItem(id = "mock"), awaitItem()) } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataUtil.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataUtil.kt index a4935b9a14..d96f9b60d8 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataUtil.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataUtil.kt @@ -78,7 +78,7 @@ fun createMockDisplayItemForCipher( shouldShowMasterPasswordReprompt = false, iconTestTag = "LoginCipherIcon", isTotp = isTotp, - type = cipherType, + itemType = VaultItemListingState.DisplayItem.ItemType.Vault(type = cipherType), ) } @@ -124,7 +124,7 @@ fun createMockDisplayItemForCipher( shouldShowMasterPasswordReprompt = false, iconTestTag = "SecureNoteCipherIcon", isTotp = false, - type = cipherType, + itemType = VaultItemListingState.DisplayItem.ItemType.Vault(type = cipherType), ) } @@ -176,7 +176,7 @@ fun createMockDisplayItemForCipher( shouldShowMasterPasswordReprompt = false, iconTestTag = "CardCipherIcon", isTotp = false, - type = cipherType, + itemType = VaultItemListingState.DisplayItem.ItemType.Vault(type = cipherType), ) } @@ -219,7 +219,7 @@ fun createMockDisplayItemForCipher( shouldShowMasterPasswordReprompt = false, iconTestTag = "IdentityCipherIcon", isTotp = false, - type = cipherType, + itemType = VaultItemListingState.DisplayItem.ItemType.Vault(type = cipherType), ) } @@ -262,7 +262,7 @@ fun createMockDisplayItemForCipher( shouldShowMasterPasswordReprompt = false, iconTestTag = "SshKeyCipherIcon", isTotp = false, - type = cipherType, + itemType = VaultItemListingState.DisplayItem.ItemType.Vault(type = cipherType), ) } } @@ -315,7 +315,7 @@ fun createMockDisplayItemForSend( shouldShowMasterPasswordReprompt = false, iconTestTag = null, isTotp = false, - type = null, + itemType = VaultItemListingState.DisplayItem.ItemType.Sends(type = sendType), ) } @@ -358,7 +358,7 @@ fun createMockDisplayItemForSend( shouldShowMasterPasswordReprompt = false, iconTestTag = null, isTotp = false, - type = null, + itemType = VaultItemListingState.DisplayItem.ItemType.Sends(type = sendType), ) } }