From 2d652c8a2ef61f9f7806a761b5e61dd099d50f8e Mon Sep 17 00:00:00 2001 From: Oleg Semenenko <146032743+oleg-livefront@users.noreply.github.com> Date: Sun, 28 Jan 2024 23:31:20 -0600 Subject: [PATCH] BIT-1301 Adding icons to collection items (#840) --- .../search/util/SearchTypeDataExtensions.kt | 3 +- .../util/VaultItemListingDataExtensions.kt | 3 +- .../feature/util/CipherViewExtensions.kt | 17 ++++ .../ui/vault/feature/vault/VaultContent.kt | 10 +++ .../vault/feature/vault/VaultEntryListItem.kt | 5 ++ .../ui/vault/feature/vault/VaultViewModel.kt | 13 +++ .../feature/vault/util/VaultDataExtensions.kt | 5 ++ .../ui/vault/model/VaultTrailingIcon.kt | 23 ++++++ app/src/main/res/drawable/ic_attachment.xml | 9 +++ .../feature/search/util/SearchUtil.kt | 44 +++++++++- .../util/VaultItemListingDataUtil.kt | 44 +++++++++- .../feature/util/CipherViewExtensionsTest.kt | 81 +++++++++++++++++++ 12 files changed, 247 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/x8bit/bitwarden/ui/vault/model/VaultTrailingIcon.kt create mode 100644 app/src/main/res/drawable/ic_attachment.xml 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 51cac60bc6..37217af534 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 @@ -19,6 +19,7 @@ import com.x8bit.bitwarden.ui.platform.feature.search.SearchTypeData import com.x8bit.bitwarden.ui.platform.util.toFormattedPattern import com.x8bit.bitwarden.ui.tools.feature.send.util.toLabelIcons import com.x8bit.bitwarden.ui.tools.feature.send.util.toOverflowActions +import com.x8bit.bitwarden.ui.vault.feature.util.toLabelIcons import com.x8bit.bitwarden.ui.vault.feature.util.toOverflowActions import com.x8bit.bitwarden.ui.vault.feature.vault.util.toLoginIconData import java.time.Clock @@ -171,7 +172,7 @@ private fun CipherView.toDisplayItem( baseIconUrl = baseIconUrl, isIconLoadingDisabled = isIconLoadingDisabled, ), - extraIconList = emptyList(), + extraIconList = toLabelIcons(), overflowOptions = toOverflowActions(), totpCode = login?.totp, ) 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 b10ee9c887..31cda9960e 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 @@ -17,6 +17,7 @@ import com.x8bit.bitwarden.ui.platform.util.toFormattedPattern import com.x8bit.bitwarden.ui.tools.feature.send.util.toLabelIcons import com.x8bit.bitwarden.ui.tools.feature.send.util.toOverflowActions import com.x8bit.bitwarden.ui.vault.feature.itemlisting.VaultItemListingState +import com.x8bit.bitwarden.ui.vault.feature.util.toLabelIcons import com.x8bit.bitwarden.ui.vault.feature.util.toOverflowActions import com.x8bit.bitwarden.ui.vault.feature.vault.util.toLoginIconData import java.time.Clock @@ -210,7 +211,7 @@ private fun CipherView.toDisplayItem( baseIconUrl = baseIconUrl, isIconLoadingDisabled = isIconLoadingDisabled, ), - extraIconList = emptyList(), + extraIconList = toLabelIcons(), overflowOptions = toOverflowActions(), ) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/util/CipherViewExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/util/CipherViewExtensions.kt index 0b1da31701..4a847036ef 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/util/CipherViewExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/util/CipherViewExtensions.kt @@ -2,7 +2,9 @@ package com.x8bit.bitwarden.ui.vault.feature.util import com.bitwarden.core.CipherType import com.bitwarden.core.CipherView +import com.x8bit.bitwarden.ui.platform.components.model.IconRes import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction +import com.x8bit.bitwarden.ui.vault.model.VaultTrailingIcon /** * Creates the list of overflow actions to be displayed for a [CipherView]. @@ -36,3 +38,18 @@ fun CipherView.toOverflowActions(): List ) } .orEmpty() + +/** + * Checks if the list is empty and if not returns an icon in a list. + */ +fun CipherView.toLabelIcons(): List { + return listOfNotNull( + VaultTrailingIcon.COLLECTION.takeIf { + this.collectionIds.isNotEmpty() || this.organizationId?.isNotEmpty() == true + }, + VaultTrailingIcon.ATTACHMENT.takeIf { this.attachments?.isNotEmpty() == true }, + ) + .map { + IconRes(iconRes = it.iconRes, contentDescription = it.contentDescription) + } +} diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt index 460cd0cca0..16e49a7cac 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt @@ -16,7 +16,9 @@ import androidx.compose.ui.unit.dp import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.BitwardenGroupItem import com.x8bit.bitwarden.ui.platform.components.BitwardenListHeaderTextWithSupportLabel +import com.x8bit.bitwarden.ui.platform.components.model.toIconResources import com.x8bit.bitwarden.ui.vault.feature.vault.handlers.VaultHandlers +import kotlinx.collections.immutable.toPersistentList /** * Content view for the [VaultScreen]. @@ -76,6 +78,10 @@ fun VaultContent( items(state.favoriteItems) { favoriteItem -> VaultEntryListItem( startIcon = favoriteItem.startIcon, + trailingLabelIcons = favoriteItem + .extraIconList + .toIconResources() + .toPersistentList(), label = favoriteItem.name(), supportingLabel = favoriteItem.supportingLabel?.invoke(), onClick = { vaultHandlers.vaultItemClick(favoriteItem) }, @@ -231,6 +237,10 @@ fun VaultContent( items(state.noFolderItems) { noFolderItem -> VaultEntryListItem( startIcon = noFolderItem.startIcon, + trailingLabelIcons = noFolderItem + .extraIconList + .toIconResources() + .toPersistentList(), label = noFolderItem.name(), supportingLabel = noFolderItem.supportingLabel?.invoke(), onClick = { vaultHandlers.vaultItemClick(noFolderItem) }, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultEntryListItem.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultEntryListItem.kt index 5f32427f1d..4d62e1a1e3 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultEntryListItem.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultEntryListItem.kt @@ -7,8 +7,11 @@ import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.BitwardenListItem import com.x8bit.bitwarden.ui.platform.components.SelectionItemData import com.x8bit.bitwarden.ui.platform.components.model.IconData +import com.x8bit.bitwarden.ui.platform.components.model.IconResource import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList /** @@ -30,6 +33,7 @@ fun VaultEntryListItem( overflowOptions: List, onOverflowOptionClick: (ListingItemOverflowAction.VaultAction) -> Unit, modifier: Modifier = Modifier, + trailingLabelIcons: ImmutableList = persistentListOf(), supportingLabel: String? = null, ) { BitwardenListItem( @@ -37,6 +41,7 @@ fun VaultEntryListItem( label = label, supportingLabel = supportingLabel, startIcon = startIcon, + trailingLabelIcons = trailingLabelIcons, onClick = onClick, selectionDataList = overflowOptions .map { option -> diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt index 99b7443c67..2e9ce97abc 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt @@ -20,6 +20,7 @@ import com.x8bit.bitwarden.ui.platform.base.util.concat import com.x8bit.bitwarden.ui.platform.base.util.hexToColor import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary import com.x8bit.bitwarden.ui.platform.components.model.IconData +import com.x8bit.bitwarden.ui.platform.components.model.IconRes import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterData import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType @@ -655,8 +656,16 @@ data class VaultState( */ abstract val name: Text + /** + * The icon at the start of the item. + */ abstract val startIcon: IconData + /** + * The icons shown after the item name. + */ + abstract val extraIconList: List + /** * An optional supporting label for the vault item that provides additional information. * This property is open to be overridden by subclasses that can provide their own @@ -679,6 +688,7 @@ data class VaultState( override val id: String, override val name: Text, override val startIcon: IconData = IconData.Local(R.drawable.ic_login_item), + override val extraIconList: List = emptyList(), override val overflowOptions: List, val username: Text?, ) : VaultItem() { @@ -696,6 +706,7 @@ data class VaultState( override val id: String, override val name: Text, override val startIcon: IconData = IconData.Local(R.drawable.ic_card_item), + override val extraIconList: List = emptyList(), override val overflowOptions: List, val brand: Text? = null, val lastFourDigits: Text? = null, @@ -723,6 +734,7 @@ data class VaultState( override val id: String, override val name: Text, override val startIcon: IconData = IconData.Local(R.drawable.ic_identity_item), + override val extraIconList: List = emptyList(), override val overflowOptions: List, val firstName: Text?, ) : VaultItem() { @@ -738,6 +750,7 @@ data class VaultState( override val id: String, override val name: Text, override val startIcon: IconData = IconData.Local(R.drawable.ic_secure_note_item), + override val extraIconList: List = emptyList(), override val overflowOptions: List, ) : VaultItem() { override val supportingLabel: Text? get() = null 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 00a537e2a1..4019a068f8 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 @@ -10,6 +10,7 @@ import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.repository.model.VaultData import com.x8bit.bitwarden.ui.platform.base.util.asText import com.x8bit.bitwarden.ui.platform.components.model.IconData +import com.x8bit.bitwarden.ui.vault.feature.util.toLabelIcons import com.x8bit.bitwarden.ui.vault.feature.util.toOverflowActions import com.x8bit.bitwarden.ui.vault.feature.vault.VaultState import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType @@ -158,12 +159,14 @@ private fun CipherView.toVaultItemOrNull( baseIconUrl = baseIconUrl, ), overflowOptions = toOverflowActions(), + extraIconList = toLabelIcons(), ) CipherType.SECURE_NOTE -> VaultState.ViewState.VaultItem.SecureNote( id = id, name = name.asText(), overflowOptions = toOverflowActions(), + extraIconList = toLabelIcons(), ) CipherType.CARD -> VaultState.ViewState.VaultItem.Card( @@ -174,6 +177,7 @@ private fun CipherView.toVaultItemOrNull( ?.takeLast(4) ?.asText(), overflowOptions = toOverflowActions(), + extraIconList = toLabelIcons(), ) CipherType.IDENTITY -> VaultState.ViewState.VaultItem.Identity( @@ -181,6 +185,7 @@ private fun CipherView.toVaultItemOrNull( name = name.asText(), firstName = identity?.firstName?.asText(), overflowOptions = toOverflowActions(), + extraIconList = toLabelIcons(), ) } } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/model/VaultTrailingIcon.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/model/VaultTrailingIcon.kt new file mode 100644 index 0000000000..1ca08b70af --- /dev/null +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/model/VaultTrailingIcon.kt @@ -0,0 +1,23 @@ +package com.x8bit.bitwarden.ui.vault.model + +import androidx.annotation.DrawableRes +import com.x8bit.bitwarden.R +import com.x8bit.bitwarden.ui.platform.base.util.Text +import com.x8bit.bitwarden.ui.platform.base.util.asText + +/** + * Represents the icons displayed after the cipher name. + */ +enum class VaultTrailingIcon( + @DrawableRes val iconRes: Int, + val contentDescription: Text, +) { + COLLECTION( + iconRes = R.drawable.ic_collection, + contentDescription = R.string.collections.asText(), + ), + ATTACHMENT( + iconRes = R.drawable.ic_attachment, + contentDescription = R.string.attachments.asText(), + ), +} diff --git a/app/src/main/res/drawable/ic_attachment.xml b/app/src/main/res/drawable/ic_attachment.xml new file mode 100644 index 0000000000..d513645039 --- /dev/null +++ b/app/src/main/res/drawable/ic_attachment.xml @@ -0,0 +1,9 @@ + + + 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 8c2b2ab664..ebcf70111b 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 @@ -26,7 +26,16 @@ fun createMockDisplayItemForCipher( uri = "https://vault.bitwarden.com/icons/www.mockuri.com/icon.png", fallbackIconRes = R.drawable.ic_login_item, ), - extraIconList = emptyList(), + extraIconList = listOf( + IconRes( + iconRes = R.drawable.ic_collection, + contentDescription = R.string.collections.asText(), + ), + IconRes( + iconRes = R.drawable.ic_attachment, + contentDescription = R.string.attachments.asText(), + ), + ), overflowOptions = listOf( ListingItemOverflowAction.VaultAction.ViewClick(cipherId = "mockId-$number"), ListingItemOverflowAction.VaultAction.EditClick(cipherId = "mockId-$number"), @@ -50,7 +59,16 @@ fun createMockDisplayItemForCipher( title = "mockName-$number", subtitle = null, iconData = IconData.Local(R.drawable.ic_secure_note_item), - extraIconList = emptyList(), + extraIconList = listOf( + IconRes( + iconRes = R.drawable.ic_collection, + contentDescription = R.string.collections.asText(), + ), + IconRes( + iconRes = R.drawable.ic_attachment, + contentDescription = R.string.attachments.asText(), + ), + ), overflowOptions = listOf( ListingItemOverflowAction.VaultAction.ViewClick(cipherId = "mockId-$number"), ListingItemOverflowAction.VaultAction.EditClick(cipherId = "mockId-$number"), @@ -68,7 +86,16 @@ fun createMockDisplayItemForCipher( title = "mockName-$number", subtitle = "er-$number", iconData = IconData.Local(R.drawable.ic_card_item), - extraIconList = emptyList(), + extraIconList = listOf( + IconRes( + iconRes = R.drawable.ic_collection, + contentDescription = R.string.collections.asText(), + ), + IconRes( + iconRes = R.drawable.ic_attachment, + contentDescription = R.string.attachments.asText(), + ), + ), overflowOptions = listOf( ListingItemOverflowAction.VaultAction.ViewClick(cipherId = "mockId-$number"), ListingItemOverflowAction.VaultAction.EditClick(cipherId = "mockId-$number"), @@ -89,7 +116,16 @@ fun createMockDisplayItemForCipher( title = "mockName-$number", subtitle = "mockFirstName-${number}mockLastName-$number", iconData = IconData.Local(R.drawable.ic_identity_item), - extraIconList = emptyList(), + extraIconList = listOf( + IconRes( + iconRes = R.drawable.ic_collection, + contentDescription = R.string.collections.asText(), + ), + IconRes( + iconRes = R.drawable.ic_attachment, + contentDescription = R.string.attachments.asText(), + ), + ), overflowOptions = listOf( ListingItemOverflowAction.VaultAction.ViewClick(cipherId = "mockId-$number"), ListingItemOverflowAction.VaultAction.EditClick(cipherId = "mockId-$number"), 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 2eb650f96e..99dfec002a 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 @@ -27,7 +27,16 @@ fun createMockDisplayItemForCipher( "https://vault.bitwarden.com/icons/www.mockuri.com/icon.png", fallbackIconRes = R.drawable.ic_login_item, ), - extraIconList = emptyList(), + extraIconList = listOf( + IconRes( + iconRes = R.drawable.ic_collection, + contentDescription = R.string.collections.asText(), + ), + IconRes( + iconRes = R.drawable.ic_attachment, + contentDescription = R.string.attachments.asText(), + ), + ), overflowOptions = listOf( ListingItemOverflowAction.VaultAction.ViewClick(cipherId = "mockId-$number"), ListingItemOverflowAction.VaultAction.EditClick(cipherId = "mockId-$number"), @@ -50,7 +59,16 @@ fun createMockDisplayItemForCipher( title = "mockName-$number", subtitle = subtitle, iconData = IconData.Local(R.drawable.ic_secure_note_item), - extraIconList = emptyList(), + extraIconList = listOf( + IconRes( + iconRes = R.drawable.ic_collection, + contentDescription = R.string.collections.asText(), + ), + IconRes( + iconRes = R.drawable.ic_attachment, + contentDescription = R.string.attachments.asText(), + ), + ), overflowOptions = listOf( ListingItemOverflowAction.VaultAction.ViewClick(cipherId = "mockId-$number"), ListingItemOverflowAction.VaultAction.EditClick(cipherId = "mockId-$number"), @@ -67,7 +85,16 @@ fun createMockDisplayItemForCipher( title = "mockName-$number", subtitle = subtitle, iconData = IconData.Local(R.drawable.ic_card_item), - extraIconList = emptyList(), + extraIconList = listOf( + IconRes( + iconRes = R.drawable.ic_collection, + contentDescription = R.string.collections.asText(), + ), + IconRes( + iconRes = R.drawable.ic_attachment, + contentDescription = R.string.attachments.asText(), + ), + ), overflowOptions = listOf( ListingItemOverflowAction.VaultAction.ViewClick(cipherId = "mockId-$number"), ListingItemOverflowAction.VaultAction.EditClick(cipherId = "mockId-$number"), @@ -87,7 +114,16 @@ fun createMockDisplayItemForCipher( title = "mockName-$number", subtitle = subtitle, iconData = IconData.Local(R.drawable.ic_identity_item), - extraIconList = emptyList(), + extraIconList = listOf( + IconRes( + iconRes = R.drawable.ic_collection, + contentDescription = R.string.collections.asText(), + ), + IconRes( + iconRes = R.drawable.ic_attachment, + contentDescription = R.string.attachments.asText(), + ), + ), overflowOptions = listOf( ListingItemOverflowAction.VaultAction.ViewClick(cipherId = "mockId-$number"), ListingItemOverflowAction.VaultAction.EditClick(cipherId = "mockId-$number"), diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/util/CipherViewExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/util/CipherViewExtensionsTest.kt index beebd0afb3..7b5949a3a9 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/util/CipherViewExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/util/CipherViewExtensionsTest.kt @@ -7,7 +7,9 @@ import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockIdentityVie import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockLoginView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSecureNoteView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockUriView +import com.x8bit.bitwarden.ui.platform.components.model.IconRes import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction +import com.x8bit.bitwarden.ui.vault.model.VaultTrailingIcon import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -202,4 +204,83 @@ class CipherViewExtensionsTest { result, ) } + + @Test + fun `toTrailingIcons should return collection icon if collectionId is not empty`() { + val cipher = createMockCipherView(1).copy( + organizationId = null, + attachments = null, + ) + + val expected = listOf(VaultTrailingIcon.COLLECTION).map { + IconRes(iconRes = it.iconRes, contentDescription = it.contentDescription) + } + + val result = cipher.toLabelIcons() + + assertEquals(expected, result) + } + + @Test + fun `toTrailingIcons should return collection icon if organizationId is not null`() { + val cipher = createMockCipherView(1).copy( + collectionIds = listOf(), + attachments = null, + ) + + val expected = listOf(VaultTrailingIcon.COLLECTION).map { + IconRes(iconRes = it.iconRes, contentDescription = it.contentDescription) + } + + val result = cipher.toLabelIcons() + + assertEquals(expected, result) + } + + @Test + fun `toTrailingIcons should return attachment icon if attachments is not null`() { + val cipher = createMockCipherView(1).copy( + collectionIds = listOf(), + organizationId = null, + ) + + val expected = listOf(VaultTrailingIcon.ATTACHMENT).map { + IconRes(iconRes = it.iconRes, contentDescription = it.contentDescription) + } + + val result = cipher.toLabelIcons() + + assertEquals(expected, result) + } + + @Test + fun `toTrailingIcons should return trailing icons if cipher has correct data`() { + val cipher = createMockCipherView(1) + + val expected = listOf( + VaultTrailingIcon.COLLECTION, + VaultTrailingIcon.ATTACHMENT, + ).map { + IconRes(iconRes = it.iconRes, contentDescription = it.contentDescription) + } + + val result = cipher.toLabelIcons() + + assertEquals(expected, result) + } + + @Test + fun `toTrailingIcons should return empty list if no data requires an extra icon`() { + val cipher = createMockCipherView(1).copy( + collectionIds = listOf(), + organizationId = null, + attachments = null, + ) + + val expected = listOf() + + val result = cipher.toLabelIcons() + + assertEquals(expected, result) + } }