diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensions.kt index db11d90d44..bc58e6f568 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensions.kt @@ -1,5 +1,6 @@ package com.x8bit.bitwarden.data.platform.repository.util +import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage import com.x8bit.bitwarden.data.platform.repository.model.DataState import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -115,6 +116,7 @@ fun combineDataStates( * * See [combineDataStates] for details. */ +@OmitFromCoverage fun combineDataStates( dataState1: DataState, dataState2: DataState, @@ -127,11 +129,35 @@ fun combineDataStates( transform(t1t2Pair.first, t1t2Pair.second, t3) } +/** + * Combines the [dataState1], [dataState2], [dataState3], and [dataState4] [DataState]s together + * using the provided [transform]. + * + * See [combineDataStates] for details. + */ +@OmitFromCoverage +fun combineDataStates( + dataState1: DataState, + dataState2: DataState, + dataState3: DataState, + dataState4: DataState, + transform: (t1: T1, t2: T2, t3: T3, t4: T4) -> R, +): DataState = + dataState1 + .combineDataStatesWith(dataState2) { t1, t2 -> t1 to t2 } + .combineDataStatesWith(dataState3) { t1t2Pair, t3 -> + Triple(t1t2Pair.first, t1t2Pair.second, t3) + } + .combineDataStatesWith(dataState4) { t1t2t3Triple, t3 -> + transform(t1t2t3Triple.first, t1t2t3Triple.second, t1t2t3Triple.third, t3) + } + /** * Combines [dataState2] with the given [DataState] using the provided [transform]. * * See [combineDataStates] for details. */ +@OmitFromCoverage fun DataState.combineDataStatesWith( dataState2: DataState, transform: (t1: T1, t2: T2) -> R, diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt index 8b09e3a1e1..ec6555beac 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt @@ -107,16 +107,19 @@ class VaultRepositoryImpl( ciphersStateFlow, foldersStateFlow, collectionsStateFlow, - ) { ciphersDataState, foldersDataState, collectionsDataState -> + sendDataStateFlow, + ) { ciphersDataState, foldersDataState, collectionsDataState, sendsDataState -> combineDataStates( ciphersDataState, foldersDataState, collectionsDataState, - ) { ciphersData, foldersData, collectionsData -> + sendsDataState, + ) { ciphersData, foldersData, collectionsData, sendsData -> VaultData( cipherViewList = ciphersData, folderViewList = foldersData, collectionViewList = collectionsData, + sendViewList = sendsData.sendViewList, ) } } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/VaultData.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/VaultData.kt index 562f08b4c3..83b5177026 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/VaultData.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/VaultData.kt @@ -3,6 +3,7 @@ package com.x8bit.bitwarden.data.vault.repository.model import com.bitwarden.core.CipherView import com.bitwarden.core.CollectionView import com.bitwarden.core.FolderView +import com.bitwarden.core.SendView /** * Represents decrypted vault data. @@ -10,9 +11,11 @@ import com.bitwarden.core.FolderView * @param cipherViewList List of decrypted ciphers. * @param collectionViewList List of decrypted collections. * @param folderViewList List of decrypted folders. + * @param sendViewList List of decrypted sends. */ data class VaultData( val cipherViewList: List, val collectionViewList: List, val folderViewList: List, + val sendViewList: List, ) diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt index f498fa374e..75ad8b16f2 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt @@ -966,10 +966,12 @@ class VaultRepositoryTest { val ciphersFlow = bufferedMutableSharedFlow>() val collectionsFlow = bufferedMutableSharedFlow>() val foldersFlow = bufferedMutableSharedFlow>() + val sendsFlow = bufferedMutableSharedFlow>() setupVaultDiskSourceFlows( ciphersFlow = ciphersFlow, collectionsFlow = collectionsFlow, foldersFlow = foldersFlow, + sendsFlow = sendsFlow, ) vaultRepository.vaultDataStateFlow.test { @@ -978,6 +980,7 @@ class VaultRepositoryTest { ciphersFlow.tryEmit(listOf(createMockCipher(number = 1))) collectionsFlow.tryEmit(listOf(createMockCollection(number = 1))) foldersFlow.tryEmit(listOf(createMockFolder(number = 1))) + sendsFlow.tryEmit(listOf(createMockSend(number = 1))) assertEquals( DataState.Loaded( @@ -985,6 +988,7 @@ class VaultRepositoryTest { cipherViewList = listOf(createMockCipherView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), awaitItem(), 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 514916d567..454df966a0 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 @@ -7,6 +7,7 @@ import com.x8bit.bitwarden.data.platform.repository.model.DataState import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCollectionView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFolderView +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSendView import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.VaultData import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest @@ -102,6 +103,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { ), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -129,6 +131,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), folderViewList = emptyList(), collectionViewList = emptyList(), + sendViewList = emptyList(), ), ), ) @@ -148,6 +151,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -180,6 +184,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = false)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -206,6 +211,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -226,6 +232,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -266,6 +273,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = false)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), error = IllegalStateException(), ), @@ -293,6 +301,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), folderViewList = emptyList(), collectionViewList = emptyList(), + sendViewList = emptyList(), ), error = IllegalStateException(), ), @@ -316,6 +325,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), error = IllegalStateException(), ), @@ -359,6 +369,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = false)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -385,6 +396,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), folderViewList = emptyList(), collectionViewList = emptyList(), + sendViewList = emptyList(), ), ), ) @@ -407,6 +419,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt index a530130003..f03761f802 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt @@ -12,6 +12,7 @@ import com.x8bit.bitwarden.data.platform.repository.model.Environment import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCollectionView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFolderView +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSendView import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.VaultData import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest @@ -321,6 +322,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ) mutableVaultDataStateFlow.tryEmit( value = DataState.Loaded( @@ -375,6 +377,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -438,6 +441,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1)), collectionViewList = emptyList(), folderViewList = emptyList(), + sendViewList = emptyList(), ), ), ) @@ -458,6 +462,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), collectionViewList = emptyList(), folderViewList = emptyList(), + sendViewList = emptyList(), ), ), ) @@ -484,6 +489,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), collectionViewList = emptyList(), folderViewList = emptyList(), + sendViewList = emptyList(), ), ) @@ -503,6 +509,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -547,6 +554,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), collectionViewList = emptyList(), folderViewList = emptyList(), + sendViewList = emptyList(), ), ), ) @@ -598,6 +606,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -649,6 +658,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), collectionViewList = emptyList(), folderViewList = emptyList(), + sendViewList = emptyList(), ), ), ) @@ -693,6 +703,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = listOf(createMockCipherView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ), ), ) @@ -743,6 +754,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), collectionViewList = emptyList(), folderViewList = emptyList(), + sendViewList = emptyList(), ), ), ) @@ -784,6 +796,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), collectionViewList = emptyList(), folderViewList = emptyList(), + sendViewList = emptyList(), ), ) @@ -940,6 +953,7 @@ class VaultViewModelTest : BaseViewModelTest() { cipherViewList = emptyList(), collectionViewList = emptyList(), folderViewList = emptyList(), + sendViewList = emptyList(), ), ) val initialState = DEFAULT_STATE.copy( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt index 6a5ac1c094..687831c4ed 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt @@ -3,6 +3,7 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.util import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCollectionView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFolderView +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSendView import com.x8bit.bitwarden.data.vault.repository.model.VaultData import com.x8bit.bitwarden.ui.platform.base.util.asText import com.x8bit.bitwarden.ui.vault.feature.vault.VaultState @@ -19,6 +20,7 @@ class VaultDataExtensionsTest { cipherViewList = listOf(createMockCipherView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ) val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults) @@ -61,6 +63,7 @@ class VaultDataExtensionsTest { ), collectionViewList = listOf(createMockCollectionView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ) val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.MyVault) @@ -100,6 +103,7 @@ class VaultDataExtensionsTest { createMockCollectionView(number = 2), ), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ) val actual = vaultData.toViewState( @@ -137,6 +141,7 @@ class VaultDataExtensionsTest { cipherViewList = emptyList(), collectionViewList = emptyList(), folderViewList = emptyList(), + sendViewList = emptyList(), ) val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults) @@ -153,6 +158,7 @@ class VaultDataExtensionsTest { cipherViewList = listOf(createMockCipherView(number = 1).copy(id = null)), collectionViewList = listOf(createMockCollectionView(number = 1)), folderViewList = listOf(createMockFolderView(number = 1)), + sendViewList = listOf(createMockSendView(number = 1)), ) val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)