Updated on 2026-08-14

This commit is contained in:
Tangem 2024-08-19 20:08:13 +04:00
parent 7453e8d179
commit fd7ac00fd4
10 changed files with 268 additions and 333 deletions

View file

@ -0,0 +1,31 @@
package com.tangem.feature.wallet.presentation.wallet.domain
import androidx.annotation.DrawableRes
import com.tangem.blockchain.common.Blockchain
import com.tangem.feature.wallet.impl.R
/**
* Note image model
*
* @property blockchain blockchain
* @property imageResId image res id
*
[REDACTED_AUTHOR]
*/
internal enum class NoteImage(
val blockchain: Blockchain,
@DrawableRes val imageResId: Int,
) {
Bitcoin(blockchain = Blockchain.Bitcoin, imageResId = R.drawable.ill_note_btc_120_106),
Ethereum(blockchain = Blockchain.Ethereum, imageResId = R.drawable.ill_note_ethereum_120_106),
Binance(blockchain = Blockchain.BSC, imageResId = R.drawable.ill_note_binance_120_106),
Dogecoin(blockchain = Blockchain.Dogecoin, imageResId = R.drawable.ill_note_doge_120_106),
Cardano(blockchain = Blockchain.Cardano, imageResId = R.drawable.ill_note_cardano_120_106),
XRP(blockchain = Blockchain.XRP, imageResId = R.drawable.ill_note_xrp_120_106),
}

View file

@ -0,0 +1,161 @@
package com.tangem.feature.wallet.presentation.wallet.domain
import androidx.annotation.DrawableRes
import com.tangem.feature.wallet.impl.R
/**
* Wallet2 cobrand image.
* To integrate a new cobrand, just implement new enum object and that all.
*
* @property cards2ResId image resource id for wallet set with 2 cards
* @property cards3ResId image resource id for wallet set with 3 cards
* @property batchIds set of unique batch ids for this cobrand
*
[REDACTED_AUTHOR]
*/
internal enum class Wallet2CobrandImage(
@DrawableRes val cards2ResId: Int,
@DrawableRes val cards3ResId: Int,
val batchIds: Set<String>,
) {
Avrora(
cards2ResId = R.drawable.ill_avrora_card2_120_106,
cards3ResId = R.drawable.ill_avrora_card3_120_106,
batchIds = setOf("AF18"),
),
BabyDoge(
cards2ResId = R.drawable.ill_baby_doge_card2_120_106,
cards3ResId = R.drawable.ill_baby_doge_card3_120_106,
batchIds = setOf("AF51"),
),
Bad(
cards2ResId = R.drawable.ill_bad_card2_120_106,
cards3ResId = R.drawable.ill_bad_card3_120_106,
batchIds = setOf("AF09"),
),
BitcoinPizzaDay(
cards2ResId = R.drawable.ill_pizza_day_card2_120_106,
cards3ResId = R.drawable.ill_pizza_day_card3_120_106,
batchIds = setOf("AF33"),
),
CoinMetrica(
cards2ResId = R.drawable.ill_coin_metrica_card2_120_106,
cards3ResId = R.drawable.ill_coin_metrica_card3_120_106,
batchIds = setOf("AF27"),
),
COQ(
cards2ResId = R.drawable.ill_coq_card2_120_106,
cards3ResId = R.drawable.ill_coq_card3_120_106,
batchIds = setOf("AF28"),
),
CryptoSeth(
cards2ResId = R.drawable.ill_crypto_seth_card2_120_106,
cards3ResId = R.drawable.ill_crypto_seth_card3_120_106,
batchIds = setOf("AF32"),
),
Grim(
cards2ResId = R.drawable.ill_grim_card2_120_106,
cards3ResId = R.drawable.ill_grim_card3_120_106,
batchIds = setOf("AF13"),
),
Jr(
cards2ResId = R.drawable.ill_jr_card2_120_106,
cards3ResId = R.drawable.ill_jr_card3_120_106,
batchIds = setOf("AF14"),
),
Kaspa(
cards2ResId = R.drawable.ill_kaspa_card2_120_106,
cards3ResId = R.drawable.ill_kaspa_card3_120_106,
batchIds = setOf("AF08"),
),
Kaspa2(
cards2ResId = R.drawable.ill_kaspa2_card2_120_106,
cards3ResId = R.drawable.ill_kaspa2_card3_120_106,
batchIds = setOf("AF25"),
),
KaspaReseller(
cards2ResId = R.drawable.ill_kaspa_reseller_card2_120_106,
cards3ResId = R.drawable.ill_kaspa_reseller_card3_120_106,
batchIds = setOf("AF31"),
),
KishuInu(
cards2ResId = R.drawable.ill_kishu_inu_card2_120_106,
cards3ResId = R.drawable.ill_kishu_inu_card3_120_106,
batchIds = setOf("AF52"),
),
NewWorldElite(
cards2ResId = R.drawable.ill_nwe_card2_120_106,
cards3ResId = R.drawable.ill_nwe_card3_120_106,
batchIds = setOf("AF26"),
),
// for multicolored cards use image of 3 cards in all cases
Pastel(
cards2ResId = R.drawable.ill_pastel_cards3_120_106,
cards3ResId = R.drawable.ill_pastel_cards3_120_106,
batchIds = setOf("AF43", "AF44", "AF45"),
),
RedPanda(
cards2ResId = R.drawable.ill_red_panda_card2_120_106,
cards3ResId = R.drawable.ill_red_panda_card3_120_106,
batchIds = setOf("AF34"),
),
SatoshiFriends(
cards2ResId = R.drawable.ill_satoshi_card2_120_106,
cards3ResId = R.drawable.ill_satoshi_card3_120_106,
batchIds = setOf("AF19"),
),
Trillant(
cards2ResId = R.drawable.ill_trillant_card2_120_106,
cards3ResId = R.drawable.ill_trillant_card3_120_106,
batchIds = setOf("AF16"),
),
Tron(
cards2ResId = R.drawable.ill_tron_card2_120_106,
cards3ResId = R.drawable.ill_tron_card3_120_106,
batchIds = setOf("AF07"),
),
VeChain(
cards2ResId = R.drawable.ill_vechain_card2_120_106,
cards3ResId = R.drawable.ill_vechain_card3_120_106,
batchIds = setOf("AF29"),
),
// for multicolored cards use image of 3 cards in all cases
Vivid(
cards2ResId = R.drawable.ill_vivid_cards3_120_106,
cards3ResId = R.drawable.ill_vivid_cards3_120_106,
batchIds = setOf("AF40", "AF41", "AF42"),
),
VoltInu(
cards2ResId = R.drawable.ill_volt_inu_card2_120_106,
cards3ResId = R.drawable.ill_volt_inu_card3_120_106,
batchIds = setOf("AF35"),
),
WhiteTangem(
cards2ResId = R.drawable.ill_white_card2_120_106,
cards3ResId = R.drawable.ill_white_card3_120_106,
batchIds = setOf("AF15"),
),
}

View file

@ -1,7 +1,6 @@
package com.tangem.feature.wallet.presentation.wallet.domain
import androidx.annotation.DrawableRes
import com.tangem.blockchain.common.Blockchain
import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.domain.common.util.getCardsCount
import com.tangem.domain.demo.DemoConfig
@ -13,7 +12,6 @@ import com.tangem.feature.wallet.impl.R
*
[REDACTED_AUTHOR]
*/
// TODO: make flexible to integrate cobrands ([REDACTED_JIRA])
internal object WalletImageResolver {
private const val WALLET_WITHOUT_BACKUP_COUNT = 1
@ -25,42 +23,42 @@ internal object WalletImageResolver {
@DrawableRes
fun resolve(userWallet: UserWallet): Int? {
val cardTypesResolver = userWallet.scanResponse.cardTypesResolver
val cobrandImage = Wallet2CobrandImage.entries.firstOrNull {
it.batchIds.contains(userWallet.scanResponse.card.batchId)
}
val noteImage by lazy {
val noteBlockchain = cardTypesResolver.getBlockchain()
NoteImage.entries.firstOrNull { it.blockchain == noteBlockchain }
}
return when {
cardTypesResolver.isDevKit() -> R.drawable.ill_dev_120_106
cardTypesResolver.isWhiteWallet2() -> userWallet.resolveWhiteWallet2()
cardTypesResolver.isAvroraWallet() -> userWallet.resolveAvroraWallet()
cardTypesResolver.isTraillantWallet() -> userWallet.resolveTraillantWallet()
cardTypesResolver.isTronWallet() -> userWallet.resolveTronWallet()
cardTypesResolver.isKaspaWallet() -> userWallet.resolveKaspaWallet()
cardTypesResolver.isKaspa2Wallet() -> userWallet.resolveKaspa2Wallet()
cardTypesResolver.isKaspaResellerWallet() -> userWallet.resolveKaspaResellerWallet()
cardTypesResolver.isBadWallet() -> userWallet.resolveBadWallet()
cardTypesResolver.isJrWallet() -> userWallet.resolveJrWallet()
cardTypesResolver.isGrimWallet() -> userWallet.resolveGrimWallet()
cardTypesResolver.isSatoshiFriendsWallet() -> userWallet.resolveSatoshiWallet()
cardTypesResolver.isBitcoinPizzaDayWallet() -> userWallet.resolveBitcoinPizzaDayWallet()
cardTypesResolver.isVeChainWallet() -> userWallet.resolveVeChainWallet()
cardTypesResolver.isNewWorldEliteWallet() -> userWallet.resolveNewWorldEliteWallet()
cardTypesResolver.isRedPandaWallet() -> userWallet.resolveRedPandaWallet()
cardTypesResolver.isCryptoSethWallet() -> userWallet.resolveCryptoSethWallet()
cardTypesResolver.isKishuInuWallet() -> userWallet.resolveKishuInuWallet()
cardTypesResolver.isBabyDogeWallet() -> userWallet.resolveBabyDogeWallet()
cardTypesResolver.isCOQWallet() -> userWallet.resolveCOQWallet()
cardTypesResolver.isCoinMetricaWallet() -> userWallet.resolveCoinMetricaWallet()
cardTypesResolver.isVoltInuWallet() -> userWallet.resolveVoltInuWallet()
cardTypesResolver.isVividWallet() -> userWallet.resolveVividWallet()
cardTypesResolver.isPastelWallet() -> userWallet.resolvePastelWallet()
cobrandImage != null -> userWallet.resolveWallet2Cobrand(image = cobrandImage)
cardTypesResolver.isWallet2() -> userWallet.resolveWallet2()
cardTypesResolver.isShibaWallet() -> userWallet.resolveShibaWallet()
cardTypesResolver.isTangemWallet() -> userWallet.resolveWallet1()
cardTypesResolver.isWhiteWallet() -> R.drawable.ill_wallet_old_white_120_106
cardTypesResolver.isTangemTwins() -> R.drawable.ill_twins_120_106
cardTypesResolver.isStart2Coin() -> R.drawable.ill_start2coin_120_106
cardTypesResolver.isTangemNote() -> resolveNote(blockchain = cardTypesResolver.getBlockchain())
cardTypesResolver.isTangemNote() -> noteImage?.imageResId
else -> null
}
}
private fun UserWallet.resolveWallet2Cobrand(image: Wallet2CobrandImage): Int? {
return resolveWallet2(oneBackupResId = image.cards2ResId, twoBackupResId = image.cards3ResId)
}
private fun UserWallet.resolveShibaWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_shiba_card2_120_106,
twoBackupResId = R.drawable.ill_shiba_card3_120_106,
)
}
private fun UserWallet.resolveWallet2(
@DrawableRes oneBackupResId: Int = R.drawable.ill_wallet2_cards2_120_106,
@DrawableRes twoBackupResId: Int = R.drawable.ill_wallet2_cards3_120_106,
@ -76,176 +74,6 @@ internal object WalletImageResolver {
}
}
private fun UserWallet.resolveTronWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_tron_card2_120_106,
twoBackupResId = R.drawable.ill_tron_card3_120_106,
)
}
private fun UserWallet.resolveKaspaWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_kaspa_card2_120_106,
twoBackupResId = R.drawable.ill_kaspa_card3_120_106,
)
}
private fun UserWallet.resolveKaspa2Wallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_kaspa2_card2_120_106,
twoBackupResId = R.drawable.ill_kaspa2_card3_120_106,
)
}
private fun UserWallet.resolveKaspaResellerWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_kaspa_reseller_card2_120_106,
twoBackupResId = R.drawable.ill_kaspa_reseller_card3_120_106,
)
}
private fun UserWallet.resolveBadWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_bad_card2_120_106,
twoBackupResId = R.drawable.ill_bad_card3_120_106,
)
}
private fun UserWallet.resolveJrWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_jr_card2_120_106,
twoBackupResId = R.drawable.ill_jr_card3_120_106,
)
}
private fun UserWallet.resolveGrimWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_grim_card2_120_106,
twoBackupResId = R.drawable.ill_grim_card3_120_106,
)
}
private fun UserWallet.resolveSatoshiWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_satoshi_card2_120_106,
twoBackupResId = R.drawable.ill_satoshi_card3_120_106,
)
}
private fun UserWallet.resolveShibaWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_shiba_card2_120_106,
twoBackupResId = R.drawable.ill_shiba_card3_120_106,
)
}
private fun UserWallet.resolveWhiteWallet2(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_white_card2_120_106,
twoBackupResId = R.drawable.ill_white_card3_120_106,
)
}
private fun UserWallet.resolveAvroraWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_avrora_card2_120_106,
twoBackupResId = R.drawable.ill_avrora_card3_120_106,
)
}
private fun UserWallet.resolveTraillantWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_traillant_card2_120_106,
twoBackupResId = R.drawable.ill_traillant_card3_120_106,
)
}
private fun UserWallet.resolveBitcoinPizzaDayWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_pizza_day_card2_120_106,
twoBackupResId = R.drawable.ill_pizza_day_card3_120_106,
)
}
private fun UserWallet.resolveVeChainWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_vechain_card2_120_106,
twoBackupResId = R.drawable.ill_vechain_card3_120_106,
)
}
private fun UserWallet.resolveNewWorldEliteWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_nwe_card2_120_106,
twoBackupResId = R.drawable.ill_nwe_card3_120_106,
)
}
private fun UserWallet.resolveRedPandaWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_red_panda_card2_120_106,
twoBackupResId = R.drawable.ill_red_panda_card3_120_106,
)
}
private fun UserWallet.resolveCryptoSethWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_crypto_seth_card2_120_106,
twoBackupResId = R.drawable.ill_crypto_seth_card3_120_106,
)
}
private fun UserWallet.resolveKishuInuWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_kishu_inu_card2_120_106,
twoBackupResId = R.drawable.ill_kishu_inu_card3_120_106,
)
}
private fun UserWallet.resolveBabyDogeWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_baby_doge_card2_120_106,
twoBackupResId = R.drawable.ill_baby_doge_card3_120_106,
)
}
private fun UserWallet.resolveCOQWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_coq_card2_120_106,
twoBackupResId = R.drawable.ill_coq_card3_120_106,
)
}
private fun UserWallet.resolveCoinMetricaWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_coin_metrica_card2_120_106,
twoBackupResId = R.drawable.ill_coin_metrica_card3_120_106,
)
}
private fun UserWallet.resolveVoltInuWallet(): Int? {
return resolveWallet2(
oneBackupResId = R.drawable.ill_volt_inu_card2_120_106,
twoBackupResId = R.drawable.ill_volt_inu_card3_120_106,
)
}
private fun UserWallet.resolveVividWallet(): Int? {
// for multicolored cards use image of 3 cards in all cases
return resolveWallet2(
oneBackupResId = R.drawable.ill_vivid_cards3_120_106,
twoBackupResId = R.drawable.ill_vivid_cards3_120_106,
)
}
private fun UserWallet.resolvePastelWallet(): Int? {
// for multicolored cards use image of 3 cards in all cases
return resolveWallet2(
oneBackupResId = R.drawable.ill_pastel_cards3_120_106,
twoBackupResId = R.drawable.ill_pastel_cards3_120_106,
)
}
private fun UserWallet.resolveWallet1(): Int? {
return resolveWalletWithBackups { count ->
when (count) {
@ -262,16 +90,4 @@ internal object WalletImageResolver {
return if (count != null) resolve(count) else null
}
private fun resolveNote(blockchain: Blockchain): Int? {
return when (blockchain) {
Blockchain.Bitcoin -> R.drawable.ill_note_btc_120_106
Blockchain.Ethereum -> R.drawable.ill_note_ethereum_120_106
Blockchain.BSC -> R.drawable.ill_note_binance_120_106
Blockchain.Dogecoin -> R.drawable.ill_note_doge_120_106
Blockchain.Cardano -> R.drawable.ill_note_cardano_120_106
Blockchain.XRP -> R.drawable.ill_note_xrp_120_106
else -> null
}
}
}

View file

@ -0,0 +1,26 @@
package com.tangem.feature.wallet.presentation.wallet.domain
import com.google.common.truth.Truth
import com.tangem.blockchain.common.Blockchain
import org.junit.Test
/**
[REDACTED_AUTHOR]
*/
internal class NoteImageTest {
@Test
fun check() {
// check uniqueness
Truth.assertThat(NoteImage.entries.map { it.blockchain }).containsNoDuplicates()
Truth.assertThat(NoteImage.entries.map { it.imageResId }).containsNoDuplicates()
// check blockchain matching
Truth.assertThat(NoteImage.Bitcoin.blockchain).isEqualTo(Blockchain.Bitcoin)
Truth.assertThat(NoteImage.Ethereum.blockchain).isEqualTo(Blockchain.Ethereum)
Truth.assertThat(NoteImage.Binance.blockchain).isEqualTo(Blockchain.BSC)
Truth.assertThat(NoteImage.Dogecoin.blockchain).isEqualTo(Blockchain.Dogecoin)
Truth.assertThat(NoteImage.Cardano.blockchain).isEqualTo(Blockchain.Cardano)
Truth.assertThat(NoteImage.XRP.blockchain).isEqualTo(Blockchain.XRP)
}
}

View file

@ -0,0 +1,22 @@
package com.tangem.feature.wallet.presentation.wallet.domain
import com.google.common.truth.Truth
import org.junit.Test
/**
[REDACTED_AUTHOR]
*/
internal class Wallet2CobrandImageTest {
@Test
fun checkUniqueness() {
val excluded = listOf(Wallet2CobrandImage.Pastel, Wallet2CobrandImage.Vivid)
(Wallet2CobrandImage.entries - excluded).forEach {
Truth.assertThat(it.cards2ResId != it.cards3ResId).isTrue()
}
Truth.assertThat(Wallet2CobrandImage.entries.map { it.cards2ResId }).containsNoDuplicates()
Truth.assertThat(Wallet2CobrandImage.entries.map { it.cards3ResId }).containsNoDuplicates()
Truth.assertThat(Wallet2CobrandImage.entries.flatMap { it.batchIds }).containsNoDuplicates()
}
}