From 61eabc786469361c157222779a7afb627310c566 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 15 Apr 2022 10:57:21 +0400 Subject: [PATCH 1/2] Updated on 2026-08-14 --- .../tap/domain/tokens/CurrenciesRepository.kt | 3 +- .../com/tangem/tap/domain/tokens/Currency.kt | 19 +++++++----- .../ui/compose/CollapsedCurrencyItem.kt | 8 +++-- .../tokens/ui/compose/ExpandedCurrencyItem.kt | 10 ++++--- .../redux/reducers/MultiWalletReducer.kt | 6 ++-- .../domain/common/extensions/Blockchain.kt | 30 ++++++++++++------- 6 files changed, 48 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt index 640faa30fb..08c9fdb959 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt @@ -168,7 +168,8 @@ class CurrenciesRepository(val context: Application) { fun getSupportedTokens(isTestNet: Boolean = false): List { val fileName = if (isTestNet) "testnet_tokens" else "tokens" val json = context.assets.readJsonFileToString(fileName) - return currenciesAdapter.fromJson(json)!!.tokens.map { Currency.fromJsonObject(it) } + return currenciesAdapter.fromJson(json)!!.tokens + .map { Currency.fromJsonObject(it, isTestNet) } } private fun loadTokensJson(blockchain: Blockchain): String? { diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/Currency.kt b/app/src/main/java/com/tangem/tap/domain/tokens/Currency.kt index 128190acd2..801a4f263e 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/Currency.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/Currency.kt @@ -21,13 +21,13 @@ data class ContractFromJson( @JsonClass(generateAdapter = true) data class CurrenciesFromJson( - val imageHost: String, + val imageHost: String?, val tokens: List ) -fun List.toContracts(): List { - return mapNotNull { Contract.fromJsonObject(it) } +fun List.toContracts(isTestNet: Boolean): List { + return mapNotNull { Contract.fromJsonObject(it, isTestNet) } } data class Currency( @@ -39,13 +39,13 @@ data class Currency( ) { companion object { - fun fromJsonObject(currency: CurrencyFromJson): Currency { + fun fromJsonObject(currency: CurrencyFromJson, isTestNet: Boolean): Currency { return Currency( id = currency.id, name = currency.name, symbol = currency.symbol, iconUrl = getIconUrl(currency.id), - contracts = currency.contracts?.toContracts() + contracts = currency.contracts?.toContracts(isTestNet) ) } } @@ -60,16 +60,19 @@ data class Contract( ) { companion object { - fun fromJsonObject(contract: ContractFromJson): Contract? { - val blockchain = Blockchain.fromNetworkId(contract.networkId) ?: return null + fun fromJsonObject(contract: ContractFromJson, isTestNet: Boolean): Contract? { + val networkId = if (isTestNet) contract.networkId + TESTNET else contract.networkId + val blockchain = Blockchain.fromNetworkId(networkId) ?: return null return Contract( - networkId = contract.networkId, + networkId = networkId, blockchain = blockchain, address = contract.address, decimalCount = contract.decimalCount, iconUrl = getIconUrl(contract.networkId) ) } + + const val TESTNET = "-testnet" } } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CollapsedCurrencyItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CollapsedCurrencyItem.kt index 51db0013b3..21d2de3afd 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CollapsedCurrencyItem.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CollapsedCurrencyItem.kt @@ -10,11 +10,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil.compose.SubcomposeAsyncImage +import coil.request.ImageRequest import com.tangem.blockchain.common.Blockchain import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.tap.common.extensions.getGreyedOutIconRes @@ -36,10 +38,12 @@ fun CollapsedCurrencyItem( .clickable(onClick = { onCurrencyClick(currency.id) }) ) { val blockchain = Blockchain.fromNetworkId(currency.id) - val iconRes = currency.iconUrl SubcomposeAsyncImage( - model = iconRes, + model = ImageRequest.Builder(LocalContext.current) + .data(currency.iconUrl) + .crossfade(true) + .build(), contentDescription = currency.id, loading = { CurrencyPlaceholderIcon(currency.id) }, error = { CurrencyPlaceholderIcon(currency.id) }, diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt index e5f57c2eaf..181bb64187 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt @@ -11,12 +11,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil.compose.SubcomposeAsyncImage +import coil.request.ImageRequest import com.tangem.blockchain.common.Blockchain import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.tap.domain.tokens.Currency @@ -36,9 +38,6 @@ fun ExpandedCurrencyItem( onAddCurrencyToggled: (Currency, TokenWithBlockchain?) -> Unit, onNetworkItemClicked: (ContractAddress) -> Unit ) { - val blockchain = Blockchain.fromNetworkId(currency.id) - val iconRes = currency.iconUrl - Column { Row( modifier = Modifier @@ -46,7 +45,10 @@ fun ExpandedCurrencyItem( .clickable(onClick = { onCurrencyClick(currency.id) }) ) { SubcomposeAsyncImage( - model = iconRes, + model = ImageRequest.Builder(LocalContext.current) + .data(currency.iconUrl) + .crossfade(true) + .build(), contentDescription = currency.id, loading = { CurrencyPlaceholderIcon(currency.id) }, error = { CurrencyPlaceholderIcon(currency.id) }, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt index a644ca36b2..0e140c131a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt @@ -19,11 +19,11 @@ class MultiWalletReducer { fun reduce(action: WalletAction.MultiWallet, state: WalletState): WalletState { return when (action) { is WalletAction.MultiWallet.AddBlockchains -> { - val wallets: List = action.blockchains.map { blockchain -> - val walletManager = action.walletManagers.first { + val wallets: List = action.blockchains.mapNotNull { blockchain -> + val walletManager = action.walletManagers.firstOrNull { it.wallet.blockchain == blockchain.blockchain && (it.wallet.publicKey.derivationPath?.rawPath == blockchain.derivationPath) - } + } ?: return@mapNotNull null val wallet = walletManager.wallet val cardToken = if (!state.isMultiwalletAllowed) { wallet.getFirstToken()?.symbol?.let { TokenData("", tokenSymbol = it) } diff --git a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index 94e5daec42..5573c8a4f0 100644 --- a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -5,20 +5,30 @@ import com.tangem.blockchain.common.Blockchain fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { return when (networkId) { "avalanche" -> Blockchain.Avalanche + "avalanche-testnet" -> Blockchain.AvalancheTestnet "binancecoin" -> Blockchain.Binance + "binancecoin-testnet" -> Blockchain.BinanceTestnet "binance-smart-chain" -> Blockchain.BSC + "binance-smart-chain-testnet" -> Blockchain.BSCTestnet "ethereum" -> Blockchain.Ethereum + "ethereum-testnet" -> Blockchain.EthereumTestnet "polygon-pos" -> Blockchain.Polygon + "polygon-pos-testnet" -> Blockchain.PolygonTestnet "solana" -> Blockchain.Solana + "solana-testnet" -> Blockchain.SolanaTestnet "fantom" -> Blockchain.Fantom + "fantom-testnet" -> Blockchain.FantomTestnet "bitcoin" -> Blockchain.Bitcoin + "bitcoin-testnet" -> Blockchain.BitcoinTestnet "bitcoin-cash" -> Blockchain.BitcoinCash + "bitcoin-cash-testnet" -> Blockchain.BitcoinCashTestnet "cardano" -> Blockchain.CardanoShelley "dogecoin" -> Blockchain.Dogecoin "ducatus" -> Blockchain.Ducatus "litecoin" -> Blockchain.Litecoin "rsk" -> Blockchain.RSK "stellar" -> Blockchain.Stellar + "stellar-testnet" -> Blockchain.StellarTestnet "tezos" -> Blockchain.Tezos "ripple" -> Blockchain.XRP else -> null @@ -29,31 +39,31 @@ fun Blockchain.toNetworkId(): String { return when (this) { Blockchain.Unknown -> "unknown" Blockchain.Avalanche -> "avalanche" - Blockchain.AvalancheTestnet -> "avalaunche" + Blockchain.AvalancheTestnet -> "avalanche-testnet" Blockchain.Binance -> "binancecoin" - Blockchain.BinanceTestnet -> "binancecoin" + Blockchain.BinanceTestnet -> "binancecoin-testnet" Blockchain.BSC -> "binance-smart-chain" - Blockchain.BSCTestnet -> "binance-smart-chain" + Blockchain.BSCTestnet -> "binance-smart-chain-testnet" Blockchain.Bitcoin -> "bitcoin" - Blockchain.BitcoinTestnet -> "bitcoin" + Blockchain.BitcoinTestnet -> "bitcoin-testnet" Blockchain.BitcoinCash -> "bitcoin-cash" - Blockchain.BitcoinCashTestnet -> "bitcoin-cash" + Blockchain.BitcoinCashTestnet -> "bitcoin-cash-testnet" Blockchain.Cardano -> "cardano" Blockchain.CardanoShelley -> "cardano" Blockchain.Dogecoin -> "dogecoin" Blockchain.Ducatus -> "ducatus" Blockchain.Ethereum -> "ethereum" - Blockchain.EthereumTestnet -> "ethereum" + Blockchain.EthereumTestnet -> "ethereum-testnet" Blockchain.Fantom -> "fantom" - Blockchain.FantomTestnet -> "fantom" + Blockchain.FantomTestnet -> "fantom-testnet" Blockchain.Litecoin -> "litecoin" Blockchain.Polygon -> "matic-network" - Blockchain.PolygonTestnet -> "matic-networks" + Blockchain.PolygonTestnet -> "matic-networks-testnet" Blockchain.RSK -> "rootstock" Blockchain.Stellar -> "stellar" - Blockchain.StellarTestnet -> "stellar" + Blockchain.StellarTestnet -> "stellar-testnet" Blockchain.Solana -> "solana" - Blockchain.SolanaTestnet -> "solana" + Blockchain.SolanaTestnet -> "solana-testnet" Blockchain.Tezos -> "tezos" Blockchain.XRP -> "ripple" } From c6ca6b009dff18d00aa02c958600eb692edad8ba Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 15 Apr 2022 11:23:21 +0400 Subject: [PATCH 2/2] Updated on 2026-08-14 --- .../tap/domain/tokens/CurrenciesRepository.kt | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt index 08c9fdb959..e7ee96d05b 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt @@ -107,12 +107,9 @@ class CurrenciesRepository(val context: Application) { } return try { val json = context.readFileText(getFileNameForBlockchains(cardId)) - blockchainNetworkAdapter.fromJson(json)?.distinct() ?: loadSavedCurrenciesOldWay( - cardId, - derivationStyle - ) + blockchainNetworkAdapter.fromJson(json)?.distinct() ?: emptyList() } catch (exception: Exception) { - emptyList() + tryToLoadPreviousFormatAndMigrate(cardId, derivationStyle) } } @@ -126,6 +123,20 @@ class CurrenciesRepository(val context: Application) { } } + private fun tryToLoadPreviousFormatAndMigrate( + cardId: String, + derivationStyle: DerivationStyle? + ): List { + return try { + loadSavedCurrenciesOldWay( + cardId, + derivationStyle + ) + } catch (exception: Exception) { + emptyList() + } + } + private fun loadSavedCurrenciesOldWay( cardId: String, derivationStyle: DerivationStyle? ): List {