From b8f4129691c501f28e5beccabc94fb3c81aef172 Mon Sep 17 00:00:00 2001 From: aj-rosado <109146700+aj-rosado@users.noreply.github.com> Date: Wed, 15 Oct 2025 11:24:31 +0100 Subject: [PATCH] [PM-26395] Hide "my items" collection when item is assigned to other collection (#6018) --- .../addedit/util/CipherViewExtensions.kt | 2 ++ .../VaultMoveToOrganizationContent.kt | 2 +- .../VaultMoveToOrganizationViewModel.kt | 22 +++++++++++++++++++ .../VaultMoveToOrganizationViewExtensions.kt | 3 +++ .../ui/vault/model/VaultCollection.kt | 2 ++ .../feature/addedit/VaultAddEditScreenTest.kt | 3 +++ .../addedit/VaultAddEditViewModelTest.kt | 2 ++ .../addedit/util/CipherViewExtensionsTest.kt | 16 +++++++++++++- .../VaultMoveToOrganizationScreenTest.kt | 2 ++ .../VaultMoveToOrganizationViewModelTest.kt | 1 + .../util/VaultMoveToOrganizationTestUtil.kt | 1 + 11 files changed, 54 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt index 9103ed151e..190c54fd6a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt @@ -266,6 +266,8 @@ private fun UserState.Account.toAvailableOwners( ?.contains(collection.id)) ?: (selectedCollectionId != null && collection.id == selectedCollectionId), + isDefaultUserCollection = + collection.type == CollectionType.DEFAULT_USER_COLLECTION, ) }, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt index d68dc8c811..fe6d58163f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt @@ -64,7 +64,7 @@ fun VaultMoveToOrganizationContent( } collectionItemsSelector( - collectionList = state.selectedOrganization.collections, + collectionList = state.selectableCollections, onCollectionSelect = collectionSelect, isCollectionsTitleVisible = !showOnlyCollections, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt index 2d7c9fa2a8..fc570b4396 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt @@ -419,6 +419,28 @@ data class VaultMoveToOrganizationState( val selectedOrganization: Organization get() = organizations.first { it.id == selectedOrganizationId } + val selectableCollections: List + get() { + val collections = organizations + .first { it.id == selectedOrganizationId } + .collections + return collections.filter { + !it.isDefaultUserCollection || + isDefaultUserCollectionSelected + } + } + + private val isDefaultUserCollectionSelected: Boolean + get() = + cipherToMove + ?.collectionIds + ?.any { collectionId -> + selectedOrganization.collections.any { + it.id == collectionId && it.isDefaultUserCollection + } + } + ?: false + /** * Models an organization. * diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationViewExtensions.kt index 147686e3bb..09c89e0f3f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationViewExtensions.kt @@ -1,5 +1,6 @@ package com.x8bit.bitwarden.ui.vault.feature.movetoorganization.util +import com.bitwarden.collections.CollectionType import com.bitwarden.collections.CollectionView import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText @@ -55,6 +56,8 @@ fun Triple, UserState?>.toViewState(): isSelected = currentCipher .collectionIds .contains(collection.id), + isDefaultUserCollection = + collection.type == CollectionType.DEFAULT_USER_COLLECTION, ) }, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultCollection.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultCollection.kt index 2c81918ff7..21dcdc45dd 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultCollection.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultCollection.kt @@ -9,10 +9,12 @@ import kotlinx.parcelize.Parcelize * @property id the collection id. * @property name the collection name. * @property isSelected if the collection is selected or not. + * @property isDefaultUserCollection if the collection is the user default collection or not. */ @Parcelize data class VaultCollection( val id: String, val name: String, val isSelected: Boolean, + val isDefaultUserCollection: Boolean, ) : Parcelable diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt index c5bccb612a..fa62106fe1 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt @@ -2684,6 +2684,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { id = "mockCollectionId-2", name = "mockCollectionName-2", isSelected = false, + isDefaultUserCollection = false, ), ), ) @@ -4444,6 +4445,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { id = "mockCollectionId-new", name = "mockCollectionName-new", isSelected = true, + isDefaultUserCollection = false, ), ) @@ -4470,6 +4472,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { id = "mockCollectionId-2", name = "mockCollectionName-2", isSelected = false, + isDefaultUserCollection = false, ), ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt index b22baa5fef..6134a179e1 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt @@ -4806,6 +4806,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { id = "mockId-1", name = "mockName-1", isSelected = isCollectionSelected, + isDefaultUserCollection = false, ), ) } else { @@ -4823,6 +4824,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { id = "mockId-1", name = "mockName-1", isSelected = false, + isDefaultUserCollection = false, ), ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt index 4f637bc2ed..dbcec749a8 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt @@ -524,7 +524,7 @@ class CipherViewExtensionsTest { val expected = createSecureNoteViewState( cipherView = mockCipherView, - availableOwners = listOf(ORGANIZATION_OWNER), + availableOwners = listOf(ORGANIZATION_OWNER_DEFAULT_COLLECTION), availableFolders = listOf(NO_FOLDER_ITEM), ) @@ -803,6 +803,20 @@ private val ORGANIZATION_OWNER = VaultAddEditState.Owner( id = "mockId-1", name = "mockName-1", isSelected = true, + isDefaultUserCollection = false, + ), + ), +) + +private val ORGANIZATION_OWNER_DEFAULT_COLLECTION = VaultAddEditState.Owner( + id = "mockOrganizationId-1", + name = "organizationName", + collections = listOf( + VaultCollection( + id = "mockId-1", + name = "mockName-1", + isSelected = true, + isDefaultUserCollection = true, ), ), ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt index 5964446103..3cbd02dca7 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt @@ -189,6 +189,7 @@ class VaultMoveToOrganizationScreenTest : BitwardenComposeTest() { id = "mockId-2", name = "mockName-2", isSelected = false, + isDefaultUserCollection = false, ), ), ), @@ -230,6 +231,7 @@ class VaultMoveToOrganizationScreenTest : BitwardenComposeTest() { id = "mockId-1", name = "mockName-1", isSelected = true, + isDefaultUserCollection = false, ), ), ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt index 5e0990de12..67b6918345 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt @@ -150,6 +150,7 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { id = "mockId-1", name = "mockName-1", isSelected = true, + isDefaultUserCollection = false, ), ) val expectedState = createVaultMoveToOrganizationState( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationTestUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationTestUtil.kt index 9a856d6b87..c0a35fbfd7 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationTestUtil.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationTestUtil.kt @@ -29,6 +29,7 @@ fun createMockOrganization( id = "mockId-$number", name = "mockName-$number", isSelected = isCollectionSelected, + isDefaultUserCollection = false, ), ), )