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 347c3cde06..a7f265a6dd 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 @@ -21,6 +21,8 @@ import com.x8bit.bitwarden.ui.vault.feature.itemlisting.util.determineListingPre import com.x8bit.bitwarden.ui.vault.feature.itemlisting.util.toItemListingType import com.x8bit.bitwarden.ui.vault.feature.itemlisting.util.toViewState import com.x8bit.bitwarden.ui.vault.feature.itemlisting.util.updateWithAdditionalDataIfNecessary +import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType +import com.x8bit.bitwarden.ui.vault.feature.vault.util.toFilteredList import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -46,6 +48,7 @@ class VaultItemListingViewModel @Inject constructor( .vaultItemListingType .toItemListingType(), viewState = VaultItemListingState.ViewState.Loading, + vaultFilterType = vaultRepository.vaultFilterType, baseWebSendUrl = environmentRepository.environment.environmentUrlData.baseWebSendUrl, baseIconUrl = environmentRepository.environment.environmentUrlData.baseIconUrl, isIconLoadingDisabled = settingsRepository.isIconLoadingDisabled, @@ -242,9 +245,11 @@ class VaultItemListingViewModel @Inject constructor( .itemListingType .updateWithAdditionalDataIfNecessary( folderList = vaultData - .folderViewList, + .folderViewList + .toFilteredList(state.vaultFilterType), collectionList = vaultData - .collectionViewList, + .collectionViewList + .toFilteredList(state.vaultFilterType), ), viewState = when (val listingType = currentState.itemListingType) { is VaultItemListingState.ItemListingType.Vault -> { @@ -253,6 +258,7 @@ class VaultItemListingViewModel @Inject constructor( .filter { cipherView -> cipherView.determineListingPredicate(listingType) } + .toFilteredList(state.vaultFilterType) .toViewState( baseIconUrl = state.baseIconUrl, isIconLoadingDisabled = state.isIconLoadingDisabled, @@ -280,6 +286,7 @@ class VaultItemListingViewModel @Inject constructor( data class VaultItemListingState( val itemListingType: ItemListingType, val viewState: ViewState, + val vaultFilterType: VaultFilterType, val baseWebSendUrl: String, val baseIconUrl: String, val isIconLoadingDisabled: Boolean, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt index 3e8c92c382..76649025a6 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt @@ -170,8 +170,11 @@ private fun CipherView.toVaultItemOrNull( } } +/** + * Filters out all [CipherView]s that are not part of the given [VaultFilterType]. + */ @JvmName("toFilteredCipherList") -private fun List.toFilteredList( +fun List.toFilteredList( vaultFilterType: VaultFilterType, ): List = this @@ -187,8 +190,11 @@ private fun List.toFilteredList( } } +/** + * Filters out all [FolderView]s that are not part of the given [VaultFilterType]. + */ @JvmName("toFilteredFolderList") -private fun List.toFilteredList( +fun List.toFilteredList( vaultFilterType: VaultFilterType, ): List = this @@ -203,8 +209,11 @@ private fun List.toFilteredList( } } +/** + * Filters out all [CollectionView]s that are not part of the given [VaultFilterType]. + */ @JvmName("toFilteredCollectionList") -private fun List.toFilteredList( +fun List.toFilteredList( vaultFilterType: VaultFilterType, ): List = this 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 fd4acc6314..8c5e82f90e 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 @@ -28,6 +28,7 @@ import com.x8bit.bitwarden.ui.platform.components.model.IconData import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager import com.x8bit.bitwarden.ui.util.assertNoDialogExists import com.x8bit.bitwarden.ui.util.isProgressBar +import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType import io.mockk.every import io.mockk.just import io.mockk.mockk @@ -627,6 +628,7 @@ class VaultItemListingScreenTest : BaseComposeTest() { private val DEFAULT_STATE = VaultItemListingState( itemListingType = VaultItemListingState.ItemListingType.Vault.Login, viewState = VaultItemListingState.ViewState.Loading, + vaultFilterType = VaultFilterType.AllVaults, baseWebSendUrl = Environment.Us.environmentUrlData.baseWebSendUrl, isIconLoadingDisabled = false, baseIconUrl = Environment.Us.environmentUrlData.baseIconUrl, 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 1ed8cd1215..4f0eb96e30 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 @@ -21,6 +21,7 @@ import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest import com.x8bit.bitwarden.ui.platform.base.util.asText import com.x8bit.bitwarden.ui.platform.base.util.concat import com.x8bit.bitwarden.ui.vault.feature.itemlisting.util.createMockDisplayItemForCipher +import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType import com.x8bit.bitwarden.ui.vault.model.VaultItemListingType import io.mockk.every import io.mockk.just @@ -43,6 +44,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { private val mutableVaultDataStateFlow = MutableStateFlow>(DataState.Loading) private val vaultRepository: VaultRepository = mockk { + every { vaultFilterType } returns VaultFilterType.AllVaults every { vaultDataStateFlow } returns mutableVaultDataStateFlow every { sync() } just runs } @@ -648,6 +650,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { VaultItemListingState( itemListingType = itemListingType, viewState = viewState, + vaultFilterType = vaultRepository.vaultFilterType, baseWebSendUrl = Environment.Us.environmentUrlData.baseWebSendUrl, baseIconUrl = environmentRepository.environment.environmentUrlData.baseIconUrl, isIconLoadingDisabled = settingsRepository.isIconLoadingDisabled,