Updated on 2026-08-14

This commit is contained in:
Tangem 2023-09-15 15:59:45 +08:00
parent ae2edc7fbf
commit 7cdf385873
16 changed files with 143 additions and 102 deletions

View file

@ -0,0 +1,17 @@
package com.tangem.feature.wallet.presentation.wallet.domain
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.wallets.models.UserWallet
fun UserWallet.getCardsCount(): Int? {
return if (isMultiCurrency) {
when (val status = scanResponse.card.backupStatus) {
is CardDTO.BackupStatus.Active -> status.cardCount + 1
is CardDTO.BackupStatus.CardLinked -> status.cardCount + 1
is CardDTO.BackupStatus.NoBackup -> 1
null -> 1 // Multi-currency wallet without backup function. Example, 4.12
}
} else {
null
}
}

View file

@ -2,9 +2,10 @@ package com.tangem.feature.wallet.presentation.wallet.domain
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.plus
import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.core.ui.utils.BigDecimalFormatter
import com.tangem.domain.common.CardTypesResolver
import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.feature.wallet.impl.R
import java.math.BigDecimal
@ -16,55 +17,73 @@ import java.math.BigDecimal
*/
internal object WalletAdditionalInfoFactory {
private val DIVIDER_RES by lazy { TextReference.Str(value = "") }
private val DIVIDER by lazy(mode = LazyThreadSafetyMode.NONE) { stringReference(value = "") }
/**
* Get additional info
*
* @param cardTypesResolver card type resolver
* @param wallet current wallet
* @param currencyAmount amount of currency
*/
fun resolve(
cardTypesResolver: CardTypesResolver,
wallet: UserWallet,
currencyAmount: BigDecimal? = null,
): TextReference {
return if (cardTypesResolver.isMultiwalletAllowed()) {
resolveMultiCurrencyInfo(cardTypesResolver, wallet)
fun resolve(wallet: UserWallet, currencyAmount: BigDecimal? = null): TextReference {
return if (wallet.isMultiCurrency) {
wallet.resolveMultiCurrencyInfo()
} else {
resolveSingleCurrencyInfo(cardTypesResolver, wallet, currencyAmount)
wallet.resolveSingleCurrencyInfo(currencyAmount)
}
}
private fun resolveMultiCurrencyInfo(cardTypeResolver: CardTypesResolver, wallet: UserWallet): TextReference {
val backupCardsCount = wallet.cardsInWallet.size + 1
val backupInfoRes = TextReference.PluralRes(
id = R.plurals.card_label_card_count,
count = backupCardsCount,
formatArgs = wrappedList(backupCardsCount),
)
return if (wallet.isLocked) {
backupInfoRes + DIVIDER_RES + TextReference.Res(R.string.common_locked)
private fun UserWallet.resolveMultiCurrencyInfo(): TextReference {
return if (isLocked) {
getBackupInfoWithDivider(backupCardsCount = getCardsCount()) + TextReference.Res(R.string.common_locked)
} else {
val cardTypeResolver = scanResponse.cardTypesResolver
if (cardTypeResolver.isWallet2()) {
backupInfoRes + DIVIDER_RES + TextReference.Res(id = R.string.common_seed_phrase)
resolveWallet2Info()
} else {
backupInfoRes
getBackupInfo(backupCardsCount = getCardsCount())
}
}
}
private fun resolveSingleCurrencyInfo(
cardTypeResolver: CardTypesResolver,
wallet: UserWallet,
currencyAmount: BigDecimal?,
): TextReference {
return if (wallet.isLocked) {
private fun UserWallet.resolveWallet2Info(): TextReference {
return if (isImported) {
getBackupInfoWithDivider(backupCardsCount = getCardsCount()) +
TextReference.Res(id = R.string.common_seed_phrase)
} else {
getBackupInfo(backupCardsCount = getCardsCount())
}
}
private fun getBackupInfoWithDivider(backupCardsCount: Int?): TextReference {
return if (backupCardsCount != null) {
getBackupInfoTextReference(count = backupCardsCount) + DIVIDER
} else {
TextReference.EMPTY
}
}
private fun getBackupInfo(backupCardsCount: Int?): TextReference {
return if (backupCardsCount != null) {
getBackupInfoTextReference(count = backupCardsCount)
} else {
TextReference.EMPTY
}
}
private fun getBackupInfoTextReference(count: Int): TextReference {
return TextReference.PluralRes(
id = R.plurals.card_label_card_count,
count = count,
formatArgs = wrappedList(count),
)
}
private fun UserWallet.resolveSingleCurrencyInfo(currencyAmount: BigDecimal?): TextReference {
return if (isLocked) {
TextReference.Res(R.string.common_locked)
} else {
val blockchain = cardTypeResolver.getBlockchain()
val blockchain = scanResponse.cardTypesResolver.getBlockchain()
val amount = currencyAmount?.let {
BigDecimalFormatter.formatCryptoAmount(
cryptoAmount = it,

View file

@ -2,7 +2,8 @@ package com.tangem.feature.wallet.presentation.wallet.domain
import androidx.annotation.DrawableRes
import com.tangem.blockchain.common.Blockchain
import com.tangem.domain.common.CardTypesResolver
import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.feature.wallet.impl.R
/**
@ -12,34 +13,41 @@ import com.tangem.feature.wallet.impl.R
*/
internal object WalletImageResolver {
private const val DOUBLE_WALLET_SET_BACKUP_COUNT = 1
private const val TRIPLE_WALLET_SET_BACKUP_COUNT = 2
private const val DOUBLE_WALLET_SET_BACKUP_COUNT = 2
private const val TRIPLE_WALLET_SET_BACKUP_COUNT = 3
/** Get image by [cardTypesResolver] */
/** Get a specified wallet [userWallet] image */
@DrawableRes
fun resolve(cardTypesResolver: CardTypesResolver): Int? {
fun resolve(userWallet: UserWallet): Int? {
val cardTypesResolver = userWallet.scanResponse.cardTypesResolver
return when {
cardTypesResolver.isWallet2() -> resolveWallet2(cardTypesResolver)
cardTypesResolver.isDev() -> R.drawable.ill_dev_120_106
cardTypesResolver.isWallet2() -> userWallet.resolveWallet2()
cardTypesResolver.isTangemWallet() -> R.drawable.ill_wallet_120_106
cardTypesResolver.isWhiteWallet() -> R.drawable.ill_old_wallet_120_106
cardTypesResolver.isTangemTwins() -> R.drawable.ill_twin_120_106
cardTypesResolver.isStart2Coin() -> R.drawable.ill_start2coin_120_106
cardTypesResolver.isTangemNote() -> resolveNote(cardTypesResolver)
cardTypesResolver.isDev() -> R.drawable.ill_dev_120_106
cardTypesResolver.isTangemNote() -> resolveNote(blockchain = cardTypesResolver.getBlockchain())
else -> null
}
}
private fun resolveWallet2(cardTypesResolver: CardTypesResolver): Int? {
return when (cardTypesResolver.getBackupCardsCount()) {
DOUBLE_WALLET_SET_BACKUP_COUNT -> R.drawable.ill_wallet2_cards2_120_106
TRIPLE_WALLET_SET_BACKUP_COUNT -> R.drawable.ill_wallet2_cards3_120_106
else -> null
private fun UserWallet.resolveWallet2(): Int? {
val count = getCardsCount()
return if (count != null) {
when (count) {
DOUBLE_WALLET_SET_BACKUP_COUNT -> R.drawable.ill_wallet2_cards2_120_106
TRIPLE_WALLET_SET_BACKUP_COUNT -> R.drawable.ill_wallet2_cards3_120_106
else -> null
}
} else {
null
}
}
private fun resolveNote(cardTypesResolver: CardTypesResolver): Int? {
return when (cardTypesResolver.getBlockchain()) {
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

View file

@ -3,7 +3,6 @@ package com.tangem.feature.wallet.presentation.wallet.state.factory
import arrow.core.Either
import com.tangem.common.Provider
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.common.CardTypesResolver
import com.tangem.domain.tokens.error.TokenListError
import com.tangem.domain.tokens.model.TokenList
import com.tangem.domain.wallets.models.UserWallet
@ -17,10 +16,11 @@ import com.tangem.utils.converter.Converter
/**
* Converter from loaded [TokenListError] or [TokenList] to [WalletMultiCurrencyState]
*
* @property currentStateProvider current ui state provider
* @param cardTypeResolverProvider card type resolver
* @param currentWalletProvider current wallet provider
* @param clickIntents screen click intents
* @property currentStateProvider current ui state provider
* @property tokenListErrorConverter converter of tokens list
* @param appCurrencyProvider app currency provider
* @param currentWalletProvider current wallet provider
* @param clickIntents screen click intents
*
[REDACTED_AUTHOR]
*/
@ -28,14 +28,12 @@ internal class WalletLoadedTokensListConverter(
private val currentStateProvider: Provider<WalletState>,
private val tokenListErrorConverter: TokenListErrorConverter,
appCurrencyProvider: Provider<AppCurrency>,
cardTypeResolverProvider: Provider<CardTypesResolver>,
currentWalletProvider: Provider<UserWallet>,
clickIntents: WalletClickIntents,
) : Converter<Either<TokenListError, TokenList>, WalletState> {
private val tokenListStateConverter = TokenListToWalletStateConverter(
currentStateProvider = currentStateProvider,
cardTypeResolverProvider = cardTypeResolverProvider,
currentWalletProvider = currentWalletProvider,
appCurrencyProvider = appCurrencyProvider,
isWalletContentHidden = false, // TODO: [REDACTED_JIRA]

View file

@ -6,7 +6,6 @@ import com.tangem.core.ui.components.marketprice.MarketPriceBlockState
import com.tangem.core.ui.components.marketprice.PriceChangeConfig
import com.tangem.core.ui.utils.BigDecimalFormatter
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.common.CardTypesResolver
import com.tangem.domain.tokens.error.CurrencyStatusError
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.wallets.models.UserWallet
@ -23,7 +22,6 @@ import java.math.BigDecimal
internal class WalletSingleCurrencyLoadedBalanceConverter(
private val currentStateProvider: Provider<WalletState>,
private val cardTypeResolverProvider: Provider<CardTypesResolver>,
private val appCurrencyProvider: Provider<AppCurrency>,
private val currentWalletProvider: Provider<UserWallet>,
private val currencyStatusErrorConverter: CurrencyStatusErrorConverter,
@ -90,7 +88,6 @@ internal class WalletSingleCurrencyLoadedBalanceConverter(
id = selectedWallet.id,
title = selectedWallet.title,
additionalInfo = WalletAdditionalInfoFactory.resolve(
cardTypesResolver = cardTypeResolverProvider(),
wallet = currentWalletProvider(),
currencyAmount = status.amount,
),

View file

@ -136,7 +136,7 @@ internal class WalletSkeletonStateConverter(
private fun UserWallet.createAdditionalInfo(): TextReference? {
return if (isMultiCurrency) {
WalletAdditionalInfoFactory.resolve(cardTypesResolver = scanResponse.cardTypesResolver, wallet = this)
WalletAdditionalInfoFactory.resolve(wallet = this)
} else {
null
}
@ -144,7 +144,7 @@ internal class WalletSkeletonStateConverter(
@DrawableRes
private fun UserWallet.createImageResId(): Int? {
return WalletImageResolver.resolve(cardTypesResolver = scanResponse.cardTypesResolver)
return WalletImageResolver.resolve(userWallet = this)
}
private fun createPullToRefreshConfig(): WalletPullToRefreshConfig {

View file

@ -66,9 +66,8 @@ internal class WalletStateFactory(
WalletLoadedTokensListConverter(
currentStateProvider = currentStateProvider,
tokenListErrorConverter = tokenListErrorConverter,
cardTypeResolverProvider = currentCardTypeResolverProvider,
currentWalletProvider = currentWalletProvider,
appCurrencyProvider = appCurrencyProvider,
currentWalletProvider = currentWalletProvider,
clickIntents = clickIntents,
)
}
@ -91,7 +90,6 @@ internal class WalletStateFactory(
private val singleCurrencyLoadedBalanceConverter by lazy {
WalletSingleCurrencyLoadedBalanceConverter(
currentStateProvider = currentStateProvider,
cardTypeResolverProvider = currentCardTypeResolverProvider,
appCurrencyProvider = appCurrencyProvider,
currentWalletProvider = currentWalletProvider,
currencyStatusErrorConverter = currencyStatusErrorConverter,
@ -186,7 +184,6 @@ internal class WalletStateFactory(
isBottomSheetShow = true,
onBottomSheetDismiss = clickIntents::onDismissBottomSheet,
)
else -> state
}
}

View file

@ -118,7 +118,7 @@ internal class WalletsUnlockStateConverter(
id = id,
title = title,
additionalInfo = userWallet.createAdditionalInfo(),
imageResId = WalletImageResolver.resolve(cardTypesResolver = userWallet.scanResponse.cardTypesResolver),
imageResId = WalletImageResolver.resolve(userWallet = userWallet),
onRenameClick = onRenameClick,
onDeleteClick = onDeleteClick,
)
@ -126,7 +126,7 @@ internal class WalletsUnlockStateConverter(
private fun UserWallet.createAdditionalInfo(): TextReference? {
return if (isMultiCurrency) {
WalletAdditionalInfoFactory.resolve(cardTypesResolver = scanResponse.cardTypesResolver, wallet = this)
WalletAdditionalInfoFactory.resolve(wallet = this)
} else {
null
}

View file

@ -3,7 +3,6 @@ package com.tangem.feature.wallet.presentation.wallet.utils
import com.tangem.common.Provider
import com.tangem.core.ui.utils.BigDecimalFormatter.formatFiatAmount
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.common.CardTypesResolver
import com.tangem.domain.tokens.model.TokenList.FiatBalance
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.feature.wallet.presentation.wallet.domain.WalletAdditionalInfoFactory
@ -12,7 +11,6 @@ import com.tangem.utils.converter.Converter
internal class FiatBalanceToWalletCardConverter(
private val currentState: WalletCardState,
private val cardTypeResolverProvider: Provider<CardTypesResolver>,
private val appCurrencyProvider: Provider<AppCurrency>,
private val currentWalletProvider: Provider<UserWallet>,
private val isWalletContentHidden: Boolean,
@ -37,10 +35,7 @@ internal class FiatBalanceToWalletCardConverter(
imageResId = imageResId,
onDeleteClick = onDeleteClick,
onRenameClick = onRenameClick,
additionalInfo = WalletAdditionalInfoFactory.resolve(
cardTypesResolver = cardTypeResolverProvider(),
wallet = currentWalletProvider(),
),
additionalInfo = WalletAdditionalInfoFactory.resolve(wallet = currentWalletProvider()),
)
}
@ -60,10 +55,7 @@ internal class FiatBalanceToWalletCardConverter(
WalletCardState.Content(
id = currentState.id,
title = currentState.title,
additionalInfo = WalletAdditionalInfoFactory.resolve(
cardTypesResolver = cardTypeResolverProvider(),
wallet = currentWalletProvider(),
),
additionalInfo = WalletAdditionalInfoFactory.resolve(wallet = currentWalletProvider()),
imageResId = currentState.imageResId,
onRenameClick = currentState.onRenameClick,
onDeleteClick = currentState.onDeleteClick,

View file

@ -2,7 +2,6 @@ package com.tangem.feature.wallet.presentation.wallet.utils
import com.tangem.common.Provider
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.common.CardTypesResolver
import com.tangem.domain.tokens.model.TokenList
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.feature.wallet.presentation.wallet.state.WalletMultiCurrencyState
@ -16,7 +15,6 @@ import kotlinx.collections.immutable.toPersistentList
@Suppress("LongParameterList")
internal class TokenListToWalletStateConverter(
private val currentStateProvider: Provider<WalletState>,
private val cardTypeResolverProvider: Provider<CardTypesResolver>,
private val currentWalletProvider: Provider<UserWallet>,
private val appCurrencyProvider: Provider<AppCurrency>,
private val isWalletContentHidden: Boolean,
@ -50,9 +48,8 @@ internal class TokenListToWalletStateConverter(
val selectedWalletCard = walletsListConfig.wallets[selectedWalletIndex]
val converter = FiatBalanceToWalletCardConverter(
currentState = selectedWalletCard,
currentWalletProvider = currentWalletProvider,
cardTypeResolverProvider = cardTypeResolverProvider,
appCurrencyProvider = appCurrencyProvider,
currentWalletProvider = currentWalletProvider,
isWalletContentHidden = isWalletContentHidden,
)