From eeb151c805ffb09f9e665da9b30c751c2532f582 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 22 Jul 2025 10:30:04 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../ui/account/CryptoPortfolioIconExt.kt | 49 ++++++ .../main/res/drawable/ic_airplane_mode_24.xml | 10 ++ core/ui/src/main/res/drawable/ic_beach_24.xml | 14 ++ .../src/main/res/drawable/ic_bookmark_24.xml | 10 ++ .../main/res/drawable/ic_circle_clock_24.xml | 11 ++ .../ui/src/main/res/drawable/ic_family_24.xml | 30 ++++ .../src/main/res/drawable/ic_favourite_24.xml | 10 ++ core/ui/src/main/res/drawable/ic_gift_24.xml | 19 +++ core/ui/src/main/res/drawable/ic_home_24.xml | 11 ++ .../ui/src/main/res/drawable/ic_letter_24.xml | 19 +++ core/ui/src/main/res/drawable/ic_money_24.xml | 11 ++ .../src/main/res/drawable/ic_package_24.xml | 11 ++ .../main/res/drawable/ic_rounded_star_24.xml | 10 ++ core/ui/src/main/res/drawable/ic_safe_24.xml | 15 ++ core/ui/src/main/res/drawable/ic_shirt_24.xml | 10 ++ .../res/drawable/ic_shopping_basket_24.xml | 11 ++ .../src/main/res/drawable/ic_start_up_24.xml | 23 +++ core/ui/src/main/res/drawable/ic_user_24.xml | 14 ++ .../ui/src/main/res/drawable/ic_wallet_24.xml | 11 ++ .../models/account/CryptoPortfolioIcon.kt | 148 ++++++++++++++++++ 20 files changed, 447 insertions(+) create mode 100644 common/ui/src/main/java/com/tangem/common/ui/account/CryptoPortfolioIconExt.kt create mode 100644 core/ui/src/main/res/drawable/ic_airplane_mode_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_beach_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_bookmark_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_circle_clock_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_family_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_favourite_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_gift_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_home_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_letter_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_money_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_package_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_rounded_star_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_safe_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_shirt_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_shopping_basket_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_start_up_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_user_24.xml create mode 100644 core/ui/src/main/res/drawable/ic_wallet_24.xml create mode 100644 domain/models/src/main/kotlin/com/tangem/domain/models/account/CryptoPortfolioIcon.kt diff --git a/common/ui/src/main/java/com/tangem/common/ui/account/CryptoPortfolioIconExt.kt b/common/ui/src/main/java/com/tangem/common/ui/account/CryptoPortfolioIconExt.kt new file mode 100644 index 0000000000..96cc19fb44 --- /dev/null +++ b/common/ui/src/main/java/com/tangem/common/ui/account/CryptoPortfolioIconExt.kt @@ -0,0 +1,49 @@ +package com.tangem.common.ui.account + +import androidx.annotation.DrawableRes +import androidx.compose.ui.graphics.Color +import com.tangem.core.ui.R +import com.tangem.domain.models.account.CryptoPortfolioIcon + +/** Extension function to get the UI color associated with an [CryptoPortfolioIcon.Color] */ +fun CryptoPortfolioIcon.Color.getUiColor(): Color { + return when (this) { + CryptoPortfolioIcon.Color.Azure -> Color(color = 0xFF007FFF) + CryptoPortfolioIcon.Color.CaribbeanBlue -> Color(color = 0xFF0FBED6) + CryptoPortfolioIcon.Color.DullLavender -> Color(color = 0xFFA28BF2) + CryptoPortfolioIcon.Color.CandyGrapeFizz -> Color(color = 0xFF704AF1) + CryptoPortfolioIcon.Color.SweetDesire -> Color(color = 0xFFAF34E3) + CryptoPortfolioIcon.Color.PalatinateBlue -> Color(color = 0xFF2D30EE) + CryptoPortfolioIcon.Color.FuchsiaNebula -> Color(color = 0xFF7E28A3) + CryptoPortfolioIcon.Color.Pelati -> Color(color = 0xFFFF2E32) + CryptoPortfolioIcon.Color.Pattypan -> Color(color = 0xFFF0B90B) + CryptoPortfolioIcon.Color.UFOGreen -> Color(color = 0xFF32CB77) + CryptoPortfolioIcon.Color.SweetHoney -> Color(color = 0xFFD1A657) + } +} + +/** Extension function to get the drawable resource ID associated with an [CryptoPortfolioIcon.Icon] */ +@Suppress("CyclomaticComplexMethod") +@DrawableRes +fun CryptoPortfolioIcon.Icon.getResId(): Int { + return when (this) { + CryptoPortfolioIcon.Icon.Letter -> R.drawable.ic_letter_24 + CryptoPortfolioIcon.Icon.Star -> R.drawable.ic_rounded_star_24 + CryptoPortfolioIcon.Icon.User -> R.drawable.ic_user_24 + CryptoPortfolioIcon.Icon.Family -> R.drawable.ic_family_24 + CryptoPortfolioIcon.Icon.Wallet -> R.drawable.ic_wallet_24 + CryptoPortfolioIcon.Icon.Money -> R.drawable.ic_money_24 + CryptoPortfolioIcon.Icon.Home -> R.drawable.ic_home_24 + CryptoPortfolioIcon.Icon.Safe -> R.drawable.ic_safe_24 + CryptoPortfolioIcon.Icon.Beach -> R.drawable.ic_beach_24 + CryptoPortfolioIcon.Icon.AirplaneMode -> R.drawable.ic_airplane_mode_24 + CryptoPortfolioIcon.Icon.Shirt -> R.drawable.ic_shirt_24 + CryptoPortfolioIcon.Icon.ShoppingBasket -> R.drawable.ic_shopping_basket_24 + CryptoPortfolioIcon.Icon.Favourite -> R.drawable.ic_favourite_24 + CryptoPortfolioIcon.Icon.Bookmark -> R.drawable.ic_bookmark_24 + CryptoPortfolioIcon.Icon.StartUp -> R.drawable.ic_start_up_24 + CryptoPortfolioIcon.Icon.Clock -> R.drawable.ic_circle_clock_24 + CryptoPortfolioIcon.Icon.Package -> R.drawable.ic_package_24 + CryptoPortfolioIcon.Icon.Gift -> R.drawable.ic_gift_24 + } +} \ No newline at end of file diff --git a/core/ui/src/main/res/drawable/ic_airplane_mode_24.xml b/core/ui/src/main/res/drawable/ic_airplane_mode_24.xml new file mode 100644 index 0000000000..1675380665 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_airplane_mode_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_beach_24.xml b/core/ui/src/main/res/drawable/ic_beach_24.xml new file mode 100644 index 0000000000..1924d45f03 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_beach_24.xml @@ -0,0 +1,14 @@ + + + + diff --git a/core/ui/src/main/res/drawable/ic_bookmark_24.xml b/core/ui/src/main/res/drawable/ic_bookmark_24.xml new file mode 100644 index 0000000000..71339a6d61 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_bookmark_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_circle_clock_24.xml b/core/ui/src/main/res/drawable/ic_circle_clock_24.xml new file mode 100644 index 0000000000..e9ffc5829c --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_circle_clock_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_family_24.xml b/core/ui/src/main/res/drawable/ic_family_24.xml new file mode 100644 index 0000000000..237d6fe900 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_family_24.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/core/ui/src/main/res/drawable/ic_favourite_24.xml b/core/ui/src/main/res/drawable/ic_favourite_24.xml new file mode 100644 index 0000000000..141b953ff5 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_favourite_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_gift_24.xml b/core/ui/src/main/res/drawable/ic_gift_24.xml new file mode 100644 index 0000000000..f65dfa8e45 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_gift_24.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/core/ui/src/main/res/drawable/ic_home_24.xml b/core/ui/src/main/res/drawable/ic_home_24.xml new file mode 100644 index 0000000000..dc1b6183b9 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_home_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_letter_24.xml b/core/ui/src/main/res/drawable/ic_letter_24.xml new file mode 100644 index 0000000000..5533166467 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_letter_24.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/core/ui/src/main/res/drawable/ic_money_24.xml b/core/ui/src/main/res/drawable/ic_money_24.xml new file mode 100644 index 0000000000..ab5e464707 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_money_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_package_24.xml b/core/ui/src/main/res/drawable/ic_package_24.xml new file mode 100644 index 0000000000..cdd65a9d87 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_package_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_rounded_star_24.xml b/core/ui/src/main/res/drawable/ic_rounded_star_24.xml new file mode 100644 index 0000000000..7ac40b791d --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_rounded_star_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_safe_24.xml b/core/ui/src/main/res/drawable/ic_safe_24.xml new file mode 100644 index 0000000000..b5ad950fa4 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_safe_24.xml @@ -0,0 +1,15 @@ + + + + diff --git a/core/ui/src/main/res/drawable/ic_shirt_24.xml b/core/ui/src/main/res/drawable/ic_shirt_24.xml new file mode 100644 index 0000000000..23d594ab98 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_shirt_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_shopping_basket_24.xml b/core/ui/src/main/res/drawable/ic_shopping_basket_24.xml new file mode 100644 index 0000000000..a127e763a4 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_shopping_basket_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/core/ui/src/main/res/drawable/ic_start_up_24.xml b/core/ui/src/main/res/drawable/ic_start_up_24.xml new file mode 100644 index 0000000000..1cbfb12392 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_start_up_24.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/core/ui/src/main/res/drawable/ic_user_24.xml b/core/ui/src/main/res/drawable/ic_user_24.xml new file mode 100644 index 0000000000..f2ba2b493a --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_user_24.xml @@ -0,0 +1,14 @@ + + + + diff --git a/core/ui/src/main/res/drawable/ic_wallet_24.xml b/core/ui/src/main/res/drawable/ic_wallet_24.xml new file mode 100644 index 0000000000..3eda593712 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_wallet_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/account/CryptoPortfolioIcon.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/account/CryptoPortfolioIcon.kt new file mode 100644 index 0000000000..cb96240154 --- /dev/null +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/account/CryptoPortfolioIcon.kt @@ -0,0 +1,148 @@ +package com.tangem.domain.models.account + +import com.tangem.domain.models.account.CryptoPortfolioIcon.Companion.ofCustomAccount +import com.tangem.domain.models.account.CryptoPortfolioIcon.Companion.ofMainAccount +import kotlinx.serialization.Serializable + +/** + * Represents an icon for an [Account.CryptoPortfolio] account + * + * @property type the type of the account icon + * @property color the color of the account icon + * + * @constructor [ofMainAccount], [ofCustomAccount] + * +[REDACTED_AUTHOR] + */ +@Serializable +data class CryptoPortfolioIcon private constructor( + val type: Type, + val color: Color, +) { + + /** + * Represents the type of an account icon. Can either be a specific [Icon] or a [Symbol] + */ + @Serializable + sealed interface Type { + + /** + * Represents a specific predefined icon type + * + * @property value the predefined [Icon] of the icon + */ + @Serializable + data class Icon(val value: CryptoPortfolioIcon.Icon) : Type + + /** + * Represents an icon with a letter + * + * @property value the letter used as the icon + */ + @Serializable + data class Symbol(val value: Char) : Type + } + + /** + * Enum class representing the icons of accounts + */ + @Serializable + enum class Icon { + Letter, + Star, + User, + Family, + Wallet, + Money, + Home, + Safe, + Beach, + AirplaneMode, + Shirt, + ShoppingBasket, + Favourite, + Bookmark, + StartUp, + Clock, + Package, + Gift, + ; + } + + /** + * Enum class representing the colors of account icons + */ + @Serializable + enum class Color { + Azure, + CaribbeanBlue, + DullLavender, + CandyGrapeFizz, + SweetDesire, + PalatinateBlue, + FuchsiaNebula, + Pelati, + Pattypan, + UFOGreen, + SweetHoney, + ; + } + + companion object { + + private val defaultMainAccountType: Icon = Icon.Star + private val defaultMainAccountColor: Color = Color.Azure + + /** + * Creates an [CryptoPortfolioIcon] for the Main account, ensuring the color is not in the excluded set. + * + * @param exclude excluded colors that are already used for main accounts + */ + fun ofMainAccount(exclude: Set): CryptoPortfolioIcon { + val isDefaultColorBusy = defaultMainAccountColor in exclude + + val color = if (isDefaultColorBusy) { + val colorsWithExcluded = Color.entries - exclude + + val availableColors = if (colorsWithExcluded.isNotEmpty()) { + colorsWithExcluded + } else { + Color.entries + } + + availableColors.random() + } else { + defaultMainAccountColor + } + + return CryptoPortfolioIcon( + type = Type.Icon(value = defaultMainAccountType), + color = color, + ) + } + + /** + * Creates an [CryptoPortfolioIcon] for a user account based on the account name + * + * @param accountName the name of the account, used to determine the letter for the icon + */ + fun ofCustomAccount(accountName: String): CryptoPortfolioIcon { + val color = Color.entries.random() + + return CryptoPortfolioIcon( + type = Type.Symbol(value = accountName.first()), + color = color, + ) + } + + /** + * Creates a [CryptoPortfolioIcon] for a user account with a specific type and color + * + * @param type the type of the account icon + * @param color the color of the account icon + */ + fun ofCustomAccount(type: Type, color: Color): CryptoPortfolioIcon { + return CryptoPortfolioIcon(type = type, color = color) + } + } +} \ No newline at end of file