From bf6ce69af2cea1f9e3c16d973b66ad201b38e151 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 12 Jul 2022 22:51:43 +0400 Subject: [PATCH 01/23] Updated on 2026-08-14 --- app/build.gradle | 2 +- app/src/main/assets/tangem-app-config | 2 +- .../com/tangem/tap/domain/configurable/config/ConfigManager.kt | 3 ++- .../com/tangem/tap/domain/configurable/config/JsonModels.kt | 3 ++- domain/build.gradle | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index abf8cda691..d51ad6b9a6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -93,7 +93,7 @@ dependencies { implementation 'com.google.android.play:core-ktx:1.8.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' - implementation 'com.tangem:blockchain:develop-93' + implementation 'com.tangem:blockchain:AND-1939_tron_fix_release-97' // implementation 'com.tangem:blockchain:0.0.1' implementation 'com.tangem.tangem-sdk-kotlin:core:develop-154' implementation 'com.tangem.tangem-sdk-kotlin:android:develop-154' diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index 59ee0bff06..bf673f7f88 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit 59ee0bff06ee54f3202421c28f7fb6e3d421dad8 +Subproject commit bf673f7f88ed561cd8827447c4886f80f30b7e23 diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt index 52037f828c..bd99957d6e 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/ConfigManager.kt @@ -90,7 +90,8 @@ class ConfigManager( blockchairApiKey = values.blockchairApiKey, blockchairAuthorizationToken = values.blockchairAuthorizationToken, blockcypherTokens = values.blockcypherTokens, - infuraProjectId = values.infuraProjectId + infuraProjectId = values.infuraProjectId, + tronGridApiKey = values.tronGridApiKey ), appsFlyerDevKey = values.appsFlyerDevKey, shopify = values.shopifyShop, diff --git a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt index f9e053ee98..542a006a8e 100644 --- a/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt +++ b/app/src/main/java/com/tangem/tap/domain/configurable/config/JsonModels.kt @@ -24,7 +24,8 @@ class ConfigValueModel( val blockcypherTokens: Set?, val infuraProjectId: String?, val appsFlyerDevKey: String, - val shopifyShop: ShopifyShop? + val shopifyShop: ShopifyShop?, + val tronGridApiKey: String, ) class ConfigModel(val features: FeatureModel?, val configValues: ConfigValueModel?) { diff --git a/domain/build.gradle b/domain/build.gradle index 5a54411b94..c2e5c807db 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation implementation(project(path: ':network')) implementation implementation(project(path: ':common')) - implementation 'com.tangem:blockchain:develop-93' + implementation 'com.tangem:blockchain:AND-1939_tron_fix_release-97' // implementation 'com.tangem:blockchain:0.0.1' implementation 'com.tangem.tangem-sdk-kotlin:core:develop-154' implementation 'com.tangem.tangem-sdk-kotlin:android:develop-154' From 4b723df55baf775458552a8cdf7627a4ac976d6f Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 13 Jul 2022 14:42:19 +0300 Subject: [PATCH 02/23] Updated on 2026-08-14 --- .../tap/features/wallet/models/WalletWarning.kt | 1 - .../tangem/tap/features/wallet/redux/WalletState.kt | 12 +----------- .../tap/features/wallet/ui/WalletWarningConverter.kt | 3 --- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/models/WalletWarning.kt b/app/src/main/java/com/tangem/tap/features/wallet/models/WalletWarning.kt index f54300f3ec..0b4a56fa11 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/models/WalletWarning.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/models/WalletWarning.kt @@ -4,7 +4,6 @@ sealed class WalletWarning( val showingPosition: Int, ) { object TransactionInProgress : WalletWarning(10) - object SolanaTokensUnsupported : WalletWarning(20) data class BalanceNotEnoughForFee(val blockchainFullName: String) : WalletWarning(30) data class Rent(val walletRent: WalletRent) : WalletWarning(40) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 1bbf3366a6..749f84b926 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -9,7 +9,6 @@ import com.tangem.blockchain.common.Wallet import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.common.address.AddressType import com.tangem.common.extensions.isZero -import com.tangem.domain.common.extensions.canHandleToken import com.tangem.domain.common.extensions.toCoinId import com.tangem.domain.features.addCustomToken.CustomCurrency import com.tangem.tap.common.entities.Button @@ -36,8 +35,8 @@ import com.tangem.tap.features.wallet.ui.BalanceWidgetData import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.store import java.math.BigDecimal -import org.rekotlin.StateType import kotlin.properties.ReadOnlyProperty +import org.rekotlin.StateType data class WalletState( val state: ProgressState = ProgressState.Done, @@ -417,19 +416,10 @@ data class WalletData( } fun assembleWarnings(): List { - val blockchain = currency.blockchain val walletWarnings = mutableListOf() if (currencyData.status == BalanceStatus.SameCurrencyTransactionInProgress) { walletWarnings.add(WalletWarning.TransactionInProgress) } - if (currency.isBlockchain()) { - if (blockchain == Blockchain.Solana || blockchain == Blockchain.SolanaTestnet) { - val card = store.state.globalState.scanResponse?.card - if (card?.canHandleToken(blockchain) == false) { - walletWarnings.add(WalletWarning.SolanaTokensUnsupported) - } - } - } if (walletRent != null) { walletWarnings.add(WalletWarning.Rent(walletRent)) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletWarningConverter.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletWarningConverter.kt index 6137f344e3..1e9e127e59 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletWarningConverter.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletWarningConverter.kt @@ -21,9 +21,6 @@ class WalletWarningConverter( message.blockchainFullName, message.blockchainFullName ) } - WalletWarning.SolanaTokensUnsupported -> { - context.getString(R.string.warning_token_send_unsupported_message) - } WalletWarning.TransactionInProgress -> { context.getString(R.string.wallet_pending_transaction_warning) } From b77a9a017a7c1dd2221470be797c0bb6125657b6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 13 Jul 2022 15:07:56 +0300 Subject: [PATCH 03/23] Updated on 2026-08-14 --- app/src/main/res/values-ru/strings.xml | 4 ++-- app/src/main/res/values/strings_untranslated.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1e7e892972..3df2976282 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -261,8 +261,8 @@ Ваша криптокарта активирована и готова к использованию Продолжить Баланс - Отправляйте только %s (%s) на этот адрес. Отправка любой другой валюты приведет к ее безвозвратной потере. - Отправляйте только %s (%s) из сети %s на этот адрес. Отправка любой другой валюты приведет к ее безвозвратной потере. + Отправляйте только %s (%s) на этот адрес. Иначе это может привести к утрате средств. + Отправляйте только %s (%s) из сети %s на этот адрес. Иначе это может привести к утрате средств. Если процесс повторного создания кошелька каким-либо образом прервется, вам придется начать все сначала. Процесс связывания карт частично завершен. Вы не можете выйти из него сейчас. Внутренняя ошибка: не удается создать менеджер кошельков diff --git a/app/src/main/res/values/strings_untranslated.xml b/app/src/main/res/values/strings_untranslated.xml index 687dd82c75..1f498055db 100644 --- a/app/src/main/res/values/strings_untranslated.xml +++ b/app/src/main/res/values/strings_untranslated.xml @@ -206,8 +206,8 @@ Your crypto card is activated and ready to be used Continue Balance - Send only %s (%s) to this address. Sending any other currency will result in its irreversible loss. - Send only %s (%s) from %s network to this address. Sending any other currency will result in its irreversible loss. + Send only %s (%s) to this address. Using other tokens and networks may result in loss of funds. + Send only %s (%s) from %s network to this address. Using other tokens and networks may result in loss of funds. If the process of re-creating the wallet gets interrupted in any way, you\'ll have to start over. The twinning process is partly complete. You can\'t exit it now. From 8397279b35919858e3ca4cfe43eb4b3abf6b600e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 13 Jul 2022 16:06:18 +0300 Subject: [PATCH 04/23] Updated on 2026-08-14 --- .../wallet/ui/images/CurrencyIconRequest.kt | 10 +--- .../RoundedCornersCropTransformation.kt | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/wallet/ui/images/RoundedCornersCropTransformation.kt diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt index fb75bc6474..e2cc94ef12 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt @@ -5,7 +5,6 @@ import android.widget.TextView import androidx.constraintlayout.utils.widget.ImageFilterView import coil.imageLoader import coil.request.ImageRequest -import coil.transform.RoundedCornersTransformation import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.IconsUtil import com.tangem.blockchain.common.Token @@ -135,14 +134,7 @@ private inline fun ImageView.loadIcon( .placeholder(placeholderRes) .error(placeholderRes) .fallback(placeholderRes) - .transformations( - RoundedCornersTransformation( - topLeft = 32f, - topRight = 32f, - bottomLeft = 32f, - bottomRight = 32f - ) - ) + .transformations(RoundedCornersCropTransformation(16f)) .listener( onStart = { onStart() }, onSuccess = { _, _ -> onSuccess() }, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/RoundedCornersCropTransformation.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/RoundedCornersCropTransformation.kt new file mode 100644 index 0000000000..7a9b0a3015 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/RoundedCornersCropTransformation.kt @@ -0,0 +1,58 @@ +package com.tangem.tap.features.wallet.ui.images + +import android.graphics.Bitmap +import android.graphics.BitmapShader +import android.graphics.Matrix +import android.graphics.Paint +import android.graphics.RectF +import android.graphics.Shader +import androidx.annotation.Px +import androidx.core.graphics.applyCanvas +import coil.size.Size +import coil.size.pxOrElse +import coil.transform.Transformation + +class RoundedCornersCropTransformation( + @Px val radiusPx: Float, +) : Transformation { + override val cacheKey: String = "${javaClass.name}-$radiusPx" + + override suspend fun transform(input: Bitmap, size: Size): Bitmap { + val outputWidth = size.width.pxOrElse { Int.MAX_VALUE } + val outputHeight = size.height.pxOrElse { Int.MAX_VALUE } + val outputSize = minOf(outputWidth, outputHeight) + val output = Bitmap.createBitmap(outputSize, outputSize, Bitmap.Config.ARGB_8888) + + val rect = RectF( + /* left = */ 0f, + /* top = */ 0f, + /* right = */ outputWidth.toFloat(), + /* bottom = */ outputHeight.toFloat() + ) + val matrix = Matrix().apply { + setTranslate( + /* dx = */ (outputWidth - input.width) * .5f, + /* dy = */ (outputHeight - input.height) * .5f + ) + } + val bitmapShader = BitmapShader( + /* bitmap = */ input, + /* tileX = */ Shader.TileMode.DECAL, + /* tileY = */ Shader.TileMode.DECAL + ).apply { + setLocalMatrix(matrix) + } + val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).apply { + shader = bitmapShader + } + + return output.applyCanvas { + drawRoundRect( + /* rect = */ rect, + /* rx = */ radiusPx, + /* ry = */ radiusPx, + /* paint = */ paint + ) + } + } +} \ No newline at end of file From 62fb8b7a89d99e9b7659a295a69f8d51eeae607f Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 14 Jul 2022 12:26:13 +0400 Subject: [PATCH 05/23] Updated on 2026-08-14 --- .../tangem/tap/features/wallet/models/PendingTransaction.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/models/PendingTransaction.kt b/app/src/main/java/com/tangem/tap/features/wallet/models/PendingTransaction.kt index b96f055f59..698a4c9eb9 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/models/PendingTransaction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/models/PendingTransaction.kt @@ -10,8 +10,8 @@ data class PendingTransaction( val type: PendingTransactionType, ) { val address: String? = when (type) { - PendingTransactionType.Incoming -> transactionData.destinationAddress - PendingTransactionType.Outgoing -> transactionData.sourceAddress + PendingTransactionType.Incoming -> transactionData.sourceAddress + PendingTransactionType.Outgoing -> transactionData.destinationAddress PendingTransactionType.Unknown -> null } From b6905f167cfa3267f04d04c4791f3e67e5482ae2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 14 Jul 2022 16:57:40 +0300 Subject: [PATCH 06/23] Updated on 2026-08-14 --- .../tap/features/wallet/ui/images/CurrencyIconRequest.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt index e2cc94ef12..0561426bad 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt @@ -5,6 +5,7 @@ import android.widget.TextView import androidx.constraintlayout.utils.widget.ImageFilterView import coil.imageLoader import coil.request.ImageRequest +import coil.transform.RoundedCornersTransformation import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.IconsUtil import com.tangem.blockchain.common.Token @@ -134,7 +135,9 @@ private inline fun ImageView.loadIcon( .placeholder(placeholderRes) .error(placeholderRes) .fallback(placeholderRes) - .transformations(RoundedCornersCropTransformation(16f)) + .transformations( + RoundedCornersTransformation(radius = 8f) + ) .listener( onStart = { onStart() }, onSuccess = { _, _ -> onSuccess() }, From e4f0c28a2fc2b5861d09ea21296bc24b859db371 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 15 Jul 2022 13:00:30 +0300 Subject: [PATCH 07/23] Updated on 2026-08-14 --- .../com/tangem/tap/common/redux/global/GlobalMidlleware.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt index 7f61d63022..344a11cc29 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt @@ -145,14 +145,14 @@ private fun handleAction(action: Action, appState: () -> AppState?, dispatch: Di val techService = store.state.domainNetworks.tangemTechService when (val result = techService.userCountry()) { is Result.Success -> { - store.dispatch( + store.dispatchOnMain( GlobalAction.FetchUserCountry.Success( countryCode = result.data.code.lowercase() ) ) } is Result.Failure -> { - store.dispatch( + store.dispatchOnMain( GlobalAction.FetchUserCountry.Success( countryCode = Locale.getDefault().country.lowercase() ) From 69298b05abf05546f442f2a2629d90449a522a36 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 15 Jul 2022 15:06:32 +0400 Subject: [PATCH 08/23] Updated on 2026-08-14 --- .../tangem/domain/common/TapWorkarounds.kt | 4 ++++ .../addCustomToken/redux/AddCustomTokenHub.kt | 9 ++++---- .../redux/AddCustomTokenState.kt | 21 ++++++++++++++----- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt b/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt index 644cc7525e..b556a3b1f8 100644 --- a/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt +++ b/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt @@ -32,6 +32,10 @@ object TapWorkarounds { DerivationStyle.NEW } + val Card.allowToAddCustomDerivation: Boolean + get() = useOldStyleDerivation || batchId == "AC03" + // To recover funds for users who scanned AC03 batch on old app version and got old style derivation + fun Card.isExcluded(): Boolean { val excludedBatch = excludedBatches.contains(batchId) val excludedIssuerName = excludedIssuers.contains(issuer.name.uppercase(Locale.ROOT)) diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt index 9a4b0be414..60ce94068f 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt @@ -2,7 +2,6 @@ package com.tangem.domain.features.addCustomToken.redux import android.webkit.ValueCallback import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.DerivationStyle import com.tangem.common.extensions.guard import com.tangem.common.services.Result import com.tangem.domain.AddCustomTokenError @@ -10,6 +9,7 @@ import com.tangem.domain.AddCustomTokenError.Warning.* import com.tangem.domain.AddCustomTokenException import com.tangem.domain.DomainDialog import com.tangem.domain.DomainWrapped +import com.tangem.domain.common.TapWorkarounds.allowToAddCustomDerivation import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.extensions.canHandleToken import com.tangem.domain.common.extensions.fromNetworkId @@ -572,9 +572,10 @@ private class AddCustomTokenReducer( ) var derivationPathState = state.screenState.derivationPath - derivationPathState = when (card.derivationStyle) { - DerivationStyle.LEGACY -> derivationPathState.copy(isVisible = true) - null, DerivationStyle.NEW -> derivationPathState.copy(isVisible = false) + derivationPathState = if (card.allowToAddCustomDerivation) { + derivationPathState.copy(isVisible = true) + } else { + derivationPathState.copy(isVisible = false) } val form = Form(AddCustomTokenState.createFormFields(card, CustomTokenType.Blockchain)) state.copy( diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt index ed18fe69f5..97c652da19 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt @@ -50,7 +50,7 @@ data class AddCustomTokenState( fun blockchainToName(blockchain: Blockchain, isDerivationPath: Boolean = false): String? { return when { - isDerivationPath -> blockchain.derivationPath(cardDerivationStyle)?.rawPath + isDerivationPath -> blockchain.derivationPath(DerivationStyle.LEGACY)?.rawPath else -> { when (blockchain) { Blockchain.Unknown -> null @@ -150,10 +150,21 @@ data class AddCustomTokenState( mainNetwork: Blockchain, derivationNetwork: Blockchain, derivationStyle: DerivationStyle? - ): com.tangem.common.hdWallet.DerivationPath? = when (derivationNetwork) { - Blockchain.Unknown -> mainNetwork - else -> derivationNetwork - }.derivationPath(derivationStyle) + ): com.tangem.common.hdWallet.DerivationPath? { + // If we allow user to select derivations, we need to provide different derivations + // (Legacy style derivations). + // But the mainNetwork derivation depends on whether a user has a card + // with legacy derivations or new style derivations. + val derivationStyleToUse = if (derivationNetwork == Blockchain.Unknown) { + derivationStyle + } else { + DerivationStyle.LEGACY + } + return when (derivationNetwork) { + Blockchain.Unknown -> mainNetwork + else -> derivationNetwork + }.derivationPath(derivationStyleToUse) + } internal fun createFormFields(card: Card, type: CustomTokenType): List> { return listOf( From 795087e814ae0cc7cb5f035295a20475bb69cef2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 15 Jul 2022 15:21:20 +0400 Subject: [PATCH 09/23] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/TapWorkarounds.kt | 4 ---- .../features/addCustomToken/redux/AddCustomTokenHub.kt | 8 -------- 2 files changed, 12 deletions(-) diff --git a/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt b/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt index b556a3b1f8..644cc7525e 100644 --- a/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt +++ b/domain/src/main/java/com/tangem/domain/common/TapWorkarounds.kt @@ -32,10 +32,6 @@ object TapWorkarounds { DerivationStyle.NEW } - val Card.allowToAddCustomDerivation: Boolean - get() = useOldStyleDerivation || batchId == "AC03" - // To recover funds for users who scanned AC03 batch on old app version and got old style derivation - fun Card.isExcluded(): Boolean { val excludedBatch = excludedBatches.contains(batchId) val excludedIssuerName = excludedIssuers.contains(issuer.name.uppercase(Locale.ROOT)) diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt index 60ce94068f..1c09b4116a 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt @@ -9,7 +9,6 @@ import com.tangem.domain.AddCustomTokenError.Warning.* import com.tangem.domain.AddCustomTokenException import com.tangem.domain.DomainDialog import com.tangem.domain.DomainWrapped -import com.tangem.domain.common.TapWorkarounds.allowToAddCustomDerivation import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.extensions.canHandleToken import com.tangem.domain.common.extensions.fromNetworkId @@ -571,18 +570,11 @@ private class AddCustomTokenReducer( supportedTokenNetworkIds = supportedTokenNetworkIds ) - var derivationPathState = state.screenState.derivationPath - derivationPathState = if (card.allowToAddCustomDerivation) { - derivationPathState.copy(isVisible = true) - } else { - derivationPathState.copy(isVisible = false) - } val form = Form(AddCustomTokenState.createFormFields(card, CustomTokenType.Blockchain)) state.copy( cardDerivationStyle = card.derivationStyle, form = form, tangemTechServiceManager = tangemTechServiceManager, - screenState = state.screenState.copy(derivationPath = derivationPathState) ) } is OnDestroy -> { From 4ff768af303d989309ba06af525af9dbc7c3a583 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 21 Jul 2022 10:47:20 +0300 Subject: [PATCH 10/23] Updated on 2026-08-14 --- .../java/com/tangem/tap/features/home/HomeFragment.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index c453cdadc4..fe998d4f19 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -4,16 +4,20 @@ import android.os.Bundle import android.view.View import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment import com.google.accompanist.appcompattheme.AppCompatTheme +import com.tangem.tap.common.entities.IndeterminateProgressButton import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.home.compose.StoriesScreen import com.tangem.tap.features.home.redux.HomeAction import com.tangem.tap.features.home.redux.HomeState import com.tangem.tap.features.onboarding.products.wallet.redux.BackupAction +import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.features.tokens.redux.TokensAction +import com.tangem.tap.features.wallet.redux.ProgressState import com.tangem.tap.store import com.tangem.wallet.R import org.rekotlin.StoreSubscriber @@ -37,7 +41,12 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber Date: Sun, 24 Jul 2022 21:38:08 +0300 Subject: [PATCH 11/23] Updated on 2026-08-14 --- .../java/com/tangem/tap/features/home/HomeFragment.kt | 10 ++++------ .../com/tangem/tap/features/home/compose/Stories.kt | 8 ++++---- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index fe998d4f19..2821cc4a99 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -4,7 +4,6 @@ import android.os.Bundle import android.view.View import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment import com.google.accompanist.appcompattheme.AppCompatTheme @@ -17,7 +16,6 @@ import com.tangem.tap.features.home.redux.HomeState import com.tangem.tap.features.onboarding.products.wallet.redux.BackupAction import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.features.tokens.redux.TokensAction -import com.tangem.tap.features.wallet.redux.ProgressState import com.tangem.tap.store import com.tangem.wallet.R import org.rekotlin.StoreSubscriber @@ -36,17 +34,17 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber(R.id.cv_stories)?.setContent { AppCompatTheme { StoriesScreen( homeState, onScanButtonClick = { - store.dispatch(HomeAction.ReadCard) - homeState.value = HomeState(store.state.homeState.shouldScanCardOnResume, + homeState.value = HomeState( + store.state.homeState.shouldScanCardOnResume, IndeterminateProgressButton(ButtonState.PROGRESS) ) - }, + store.dispatch(HomeAction.ReadCard) + }, onShopButtonClick = { store.dispatch(HomeAction.GoToShop(store.state.globalState.userCountryCode)) }, diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt b/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt index 183392a4b4..2df573ae65 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt @@ -139,11 +139,11 @@ fun StoriesScreen( colorFilter = if (isDarkBackground) null else ColorFilter.tint(Color.Black) ) when (currentStep.value) { - 1 -> FirstStoriesContent(isPaused, currentStep.duration()) { hideContent.value = it } + 1 -> FirstStoriesContent(needsToBePaused.value, currentStep.duration()) { hideContent.value = it } 2 -> StoriesRevolutionaryWallet(currentStep.duration()) - 3 -> StoriesUltraSecureBackup(isPaused, currentStep.duration()) - 4 -> StoriesCurrencies(isPaused, currentStep.duration()) - 5 -> StoriesWeb3(isPaused, currentStep.duration()) + 3 -> StoriesUltraSecureBackup(needsToBePaused.value, currentStep.duration()) + 4 -> StoriesCurrencies(needsToBePaused.value, currentStep.duration()) + 5 -> StoriesWeb3(needsToBePaused.value, currentStep.duration()) 6 -> StoriesWalletForEveryone(currentStep.duration()) } } From 2f8cdb311ea55fe1583cdcf5b02f40db7898a858 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 24 Jul 2022 21:52:59 +0300 Subject: [PATCH 12/23] Updated on 2026-08-14 --- .../com/tangem/tap/features/home/HomeFragment.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 2821cc4a99..3156852df2 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -39,10 +39,15 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber Date: Sun, 24 Jul 2022 22:13:09 +0300 Subject: [PATCH 13/23] Updated on 2026-08-14 --- .../com/tangem/tap/features/home/HomeFragment.kt | 2 +- .../com/tangem/tap/features/home/compose/Stories.kt | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 3156852df2..971db909e8 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -39,7 +39,7 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber FirstStoriesContent(needsToBePaused.value, currentStep.duration()) { hideContent.value = it } + 1 -> FirstStoriesContent(needsToBePaused.value.value.btnScanState.progressState == ProgressState.Loading, currentStep.duration()) { hideContent.value = it } 2 -> StoriesRevolutionaryWallet(currentStep.duration()) - 3 -> StoriesUltraSecureBackup(needsToBePaused.value, currentStep.duration()) - 4 -> StoriesCurrencies(needsToBePaused.value, currentStep.duration()) - 5 -> StoriesWeb3(needsToBePaused.value, currentStep.duration()) + 3 -> StoriesUltraSecureBackup(needsToBePaused.value.value.btnScanState.progressState == ProgressState.Loading, currentStep.duration()) + 4 -> StoriesCurrencies(needsToBePaused.value.value.btnScanState.progressState == ProgressState.Loading, currentStep.duration()) + 5 -> StoriesWeb3(needsToBePaused.value.value.btnScanState.progressState == ProgressState.Loading, currentStep.duration()) 6 -> StoriesWalletForEveryone(currentStep.duration()) } } From 8b0dce5bcd0b101905b526317e0b74fbbdb47bf3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Jul 2022 08:38:27 +0300 Subject: [PATCH 14/23] Updated on 2026-08-14 --- .../java/com/tangem/tap/features/home/HomeFragment.kt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 971db909e8..521ddb9db6 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -39,15 +39,6 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber Date: Mon, 25 Jul 2022 08:39:19 +0300 Subject: [PATCH 15/23] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 521ddb9db6..7a1ed28159 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -31,9 +31,7 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber(R.id.cv_stories)?.setContent { AppCompatTheme { StoriesScreen( From 562767038c6cefdd7eddc6249b0535d84933a667 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Jul 2022 08:41:10 +0300 Subject: [PATCH 16/23] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 7a1ed28159..125458acf8 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -7,14 +7,12 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment import com.google.accompanist.appcompattheme.AppCompatTheme -import com.tangem.tap.common.entities.IndeterminateProgressButton import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.home.compose.StoriesScreen import com.tangem.tap.features.home.redux.HomeAction import com.tangem.tap.features.home.redux.HomeState import com.tangem.tap.features.onboarding.products.wallet.redux.BackupAction -import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.features.tokens.redux.TokensAction import com.tangem.tap.store import com.tangem.wallet.R From 6f236db962eb677ac137dba6529d837088aaf458 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Jul 2022 18:32:44 +0300 Subject: [PATCH 17/23] Updated on 2026-08-14 --- .../com/tangem/tap/features/home/compose/Stories.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt b/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt index 11c6bfbeb4..3ea4e1c26b 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt @@ -54,9 +54,7 @@ fun StoriesScreen( } val isPressed = remember { mutableStateOf(false) } - val needsToBePaused = - remember(homeState) { mutableStateOf(homeState) } - val isPaused = isPressed.value || needsToBePaused.value.value.btnScanState.progressState == ProgressState.Loading + val isPaused = isPressed.value || homeState.value.btnScanState.progressState == ProgressState.Loading val hideContent = remember { mutableStateOf(true) } @@ -139,11 +137,11 @@ fun StoriesScreen( colorFilter = if (isDarkBackground) null else ColorFilter.tint(Color.Black) ) when (currentStep.value) { - 1 -> FirstStoriesContent(needsToBePaused.value.value.btnScanState.progressState == ProgressState.Loading, currentStep.duration()) { hideContent.value = it } + 1 -> FirstStoriesContent(isPaused, currentStep.duration()) { hideContent.value = it } 2 -> StoriesRevolutionaryWallet(currentStep.duration()) - 3 -> StoriesUltraSecureBackup(needsToBePaused.value.value.btnScanState.progressState == ProgressState.Loading, currentStep.duration()) - 4 -> StoriesCurrencies(needsToBePaused.value.value.btnScanState.progressState == ProgressState.Loading, currentStep.duration()) - 5 -> StoriesWeb3(needsToBePaused.value.value.btnScanState.progressState == ProgressState.Loading, currentStep.duration()) + 3 -> StoriesUltraSecureBackup(isPaused, currentStep.duration()) + 4 -> StoriesCurrencies(isPaused, currentStep.duration()) + 5 -> StoriesWeb3(isPaused, currentStep.duration()) 6 -> StoriesWalletForEveryone(currentStep.duration()) } } From 17f6799abf6be368313a1011eefdd5a82b73c0d0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Jul 2022 22:14:00 +0300 Subject: [PATCH 18/23] Updated on 2026-08-14 --- .../tangem/tap/features/home/HomeFragment.kt | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index fc23162829..f1b3fa3f55 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -31,8 +31,6 @@ class HomeFragment : Fragment(), StoreSubscriber { store.dispatch(HomeAction.Init) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -41,22 +39,6 @@ class HomeFragment : Fragment(), StoreSubscriber { val context = container?.context ?: return null store.dispatch(BackupAction.CheckForUnfinishedBackup) - getView()?.findViewById(R.id.cv_stories)?.setContent { - AppCompatTheme { - StoriesScreen( - homeState, - onScanButtonClick = { - store.dispatch(HomeAction.ReadCard) - }, - onShopButtonClick = { - store.dispatch(HomeAction.GoToShop(store.state.globalState.userCountryCode)) - }, - onSearchTokensClick = { - store.dispatch(NavigationAction.NavigateTo(AppScreen.AddTokens)) - store.dispatch(TokensAction.AllowToAddTokens(false)) - store.dispatch(TokensAction.LoadCurrencies()) - } - ) composeView = ComposeView(context).apply { setContent { AppCompatTheme { From 4c8457477068806653d6da390c6d79447a1b33d2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 29 Jul 2022 17:58:45 +0300 Subject: [PATCH 19/23] Updated on 2026-08-14 --- .../tangem/tap/features/demo/DemoHelper.kt | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt index 7fe717e1a5..6e993d0c56 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt @@ -106,7 +106,8 @@ class DemoConfig { private fun getReleaseIds(): List { return (releaseDemoCardIds + releaseDemoCardIds_19042022 + - testDemoCardIds).distinct() + releaseDemoCardIds_29072022 + + testDemoCardIds).distinct() } private val releaseDemoCardIds = mutableListOf( @@ -254,6 +255,72 @@ class DemoConfig { "AB02000000018561", ) + private val releaseDemoCardIds_29072022 = mutableListOf( + // Wallet + "AC01000000044120", + "AC01000000044997", + "AC01000000044989", + "AC01000000043494", + "AC01000000043486", + "AC01000000044187", + "AC01000000043148", + "AC01000000044013", + "AC01000000043973", + "AC01000000044815", + "AC01000000044807", + "AC01000000043809", + "AC01000000043833", + "AC01000000043460", + "AC01000000043064", + "AC01000000044138", + "AC01000000044500", + "AC01000000044492", + "AC01000000044260", + "AC01000000044278", + // Note BTC + "AB01000000049864", + "AB01000000053239", + "AB01000000053056", + "AB01000000054237", + "AB01000000054245", + "AB01000000054211", + "AB01000000054229", + "AB01000000053189", + "AB01000000054195", + "AB01000000050797", + "AB01000000053833", + "AB01000000052124", + "AB01000000051605", + "AB01000000052223", + "AB01000000052207", + "AB01000000052199", + "AB01000000047785", + "AB01000000047850", + "AB01000000047868", + "AB01000000048288", + // Note ETH + "AB02000000049715", + "AB02000000049848", + "AB02000000049814", + "AB02000000049863", + "AB02000000049871", + "AB02000000049855", + "AB02000000049285", + "AB02000000049277", + "AB02000000049558", + "AB02000000049889", + "AB02000000049988", + "AB02000000049707", + "AB02000000049699", + "AB02000000049897", + "AB02000000049905", + "AB02000000049913", + "AB02000000049251", + "AB02000000049533", + "AB02000000049541", + "AB02000000049830", + ) + private val testDemoCardIds = listOf( "FB20000000000186", // Note ETH "FB10000000000196", // Note BTC From eaa2923a54a85af6e116125d495cd4b27a08bb67 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 29 Jul 2022 19:05:40 +0300 Subject: [PATCH 20/23] Updated on 2026-08-14 --- .../tangem/tap/features/demo/DemoHelper.kt | 210 ++++++++++++++---- 1 file changed, 165 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt index 6e993d0c56..2a38c4e657 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt @@ -104,57 +104,25 @@ class DemoConfig { ?: Amount(BigDecimal.ZERO, blockchain).copy() private fun getReleaseIds(): List { - return (releaseDemoCardIds + - releaseDemoCardIds_19042022 + - releaseDemoCardIds_29072022 + - testDemoCardIds).distinct() + return (releaseDemoCardIds + testDemoCardIds).distinct() } - private val releaseDemoCardIds = mutableListOf( -// Tangem Wallet: - "AC01000000041100", - "AC01000000042462", - "AC01000000041647", - "AC01000000041621", - "AC01000000041217", + private val releaseDemoCardIds = mutableListOf( + // === Not from the Google Sheet table === + "FB10000000000196", // Note BTC + "FB20000000000186", // Note ETH + "FB30000000000176", // Wallet "AC01000000041225", - "AC01000000041209", - "AC01000000041092", "AC01000000041472", - "AC01000000041662", - "AC01000000045754", - "AC01000000045960", -// Tangem Note BTC: - "AB01000000046530", - "AB01000000046720", - "AB01000000046746", "AB01000000046498", - "AB01000000046753", "AB01000000049608", - "AB01000000046761", "AB01000000049574", - "AB01000000046605", - "AB01000000046571", "AB01000000046704", - "AB01000000046647", -// Tangem Note Ethereum: "AB02000000051000", - "AB02000000050986", - "AB02000000051026", - "AB02000000051042", - "AB02000000051091", - "AB02000000051083", - "AB02000000050960", - "AB02000000051034", "AB02000000050911", - "AB02000000051133", - "AB02000000051158", - "AB02000000051059", - ) - // https://tangem.slack.com/archives/GMXC6PP71/p1650360610759269 - private val releaseDemoCardIds_19042022 = listOf( - // Wallet + // === Mvideo === + // Wallet "AC01000000045754", "AC01000000041662", "AC01000000041647", @@ -187,7 +155,58 @@ class DemoConfig { "AC01000000013497", "AC01000000013836", "AC01000000013505", -// Note BTC + "AC03000000046693", + "AC03000000046685", + "AC03000000046677", + "AC03000000046669", + "AC03000000046651", + "AC03000000046644", + "AC03000000046636", + "AC03000000046628", + "AC03000000046610", + "AC03000000046602", + "AC03000000046594", + "AC03000000046586", + "AC03000000046578", + "AC03000000046560", + "AC03000000046552", + "AC03000000046545", + "AC03000000046537", + "AC03000000046529", + "AC03000000046511", + "AC03000000046800", + "AC03000000046792", + "AC03000000046784", + "AC03000000046776", + "AC03000000046768", + "AC03000000046750", + "AC03000000046743", + "AC03000000046735", + "AC03000000046727", + "AC03000000046446", + "AC03000000046438", + "AC03000000046412", + "AC03000000046388", + "AC03000000046370", + "AC03000000046354", + "AC03000000046347", + "AC03000000046339", + "AC03000000046321", + "AC03000000046172", + "AC03000000046396", + "AC03000000046404", + "AC03000000046701", + "AC03000000046420", + "AC03000000046719", + "AC03000000046503", + "AC03000000046495", + "AC03000000046487", + "AC03000000046362", + "AC03000000046479", + "AC03000000046461", + "AC03000000046453", + + // Note BTC "AB01000000059608", "AB01000000046647", "AB01000000046571", @@ -220,7 +239,58 @@ class DemoConfig { "AB01000000015782", "AB01000000022598", "AB01000000022580", -// Note ETH + "AB01000000005688", + "AB07000000005696", + "AB07000000005902", + "AB07000000005910", + "AB07000000005928", + "AB07000000005936", + "AB07000000005944", + "AB07000000005993", + "AB07000000005985", + "AB07000000005977", + "AB07000000005969", + "AB07000000005951", + "AB07000000005605", + "AB07000000005803", + "AB07000000005811", + "AB07000000005829", + "AB07000000005837", + "AB07000000005845", + "AB07000000005852", + "AB07000000005860", + "AB07000000005878", + "AB07000000005886", + "AB07000000005894", + "AB07000000005704", + "AB07000000005712", + "AB07000000005720", + "AB07000000005738", + "AB07000000005746", + "AB07000000005514", + "AB07000000005522", + "AB07000000005563", + "AB07000000005571", + "AB07000000005589", + "AB07000000005597", + "AB07000000005613", + "AB07000000005621", + "AB07000000005639", + "AB07000000005647", + "AB07000000005654", + "AB07000000005662", + "AB07000000005670", + "AB07000000005530", + "AB07000000005548", + "AB07000000005555", + "AB07000000005753", + "AB07000000005761", + "AB07000000005779", + "AB07000000005787", + "AB07000000005795", + "AB07000000005506", + + // Note ETH "AB02000000051083", "AB02000000051059", "AB02000000051158", @@ -253,9 +323,58 @@ class DemoConfig { "AB02000000020252", "AB02000000018652", "AB02000000018561", - ) + "AB08000000009481", + "AB08000000009473", + "AB08000000009705", + "AB08000000009897", + "AB08000000009689", + "AB08000000009671", + "AB08000000009465", + "AB08000000009457", + "AB08000000009440", + "AB08000000009432", + "AB08000000009424", + "AB08000000009416", + "AB08000000009408", + "AB08000000009390", + "AB08000000009374", + "AB08000000009382", + "AB08000000009267", + "AB08000000009275", + "AB08000000009283", + "AB08000000009291", + "AB08000000009309", + "AB08000000009317", + "AB08000000009325", + "AB08000000009333", + "AB08000000009341", + "AB08000000009358", + "AB08000000009366", + "AB08000000009077", + "AB08000000009143", + "AB08000000009168", + "AB08000000009184", + "AB08000000009192", + "AB08000000009200", + "AB08000000009226", + "AB08000000009218", + "AB08000000009234", + "AB08000000009242", + "AB08000000008574", + "AB08000000009069", + "AB08000000008525", + "AB08000000009051", + "AB08000000009135", + "AB08000000009150", + "AB08000000009176", + "AB08000000009085", + "AB08000000009093", + "AB08000000009101", + "AB08000000009119", + "AB08000000009127", + "AB08000000009259", - private val releaseDemoCardIds_29072022 = mutableListOf( + // === Technopark === // Wallet "AC01000000044120", "AC01000000044997", @@ -277,6 +396,7 @@ class DemoConfig { "AC01000000044492", "AC01000000044260", "AC01000000044278", + // Note BTC "AB01000000049864", "AB01000000053239", @@ -298,6 +418,7 @@ class DemoConfig { "AB01000000047850", "AB01000000047868", "AB01000000048288", + // Note ETH "AB02000000049715", "AB02000000049848", @@ -348,7 +469,6 @@ class DemoTransactionSender( } } - override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult { val dataToSign = randomString(32).toByteArray() val signerResponse = signer.sign(dataToSign, walletManager.wallet.cardId, walletManager.wallet.publicKey) From fd93510a748b290655d4f73e7e7b11311bbdcfa6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 1 Aug 2022 01:11:18 +0300 Subject: [PATCH 21/23] Updated on 2026-08-14 --- .../ui/compose/CollapsedCurrencyItem.kt | 155 ------------- .../tokens/ui/compose/ExpandedCurrencyItem.kt | 152 ------------- .../tokens/ui/compose/ListOfCurrencies.kt | 12 +- .../currencyItem/CurrencyExpandedContent.kt | 62 ++++++ .../{ => currencyItem}/CurrencyItem.kt | 28 ++- .../compose/currencyItem/CurrencyItemArrow.kt | 91 ++++++++ .../currencyItem/CurrencyItemHeader.kt | 208 ++++++++++++++++++ .../compose/{ => currencyItem}/NetworkItem.kt | 89 +++++--- 8 files changed, 438 insertions(+), 359 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CollapsedCurrencyItem.kt delete mode 100644 app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt create mode 100644 app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyExpandedContent.kt rename app/src/main/java/com/tangem/tap/features/tokens/ui/compose/{ => currencyItem}/CurrencyItem.kt (53%) create mode 100644 app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemArrow.kt create mode 100644 app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt rename app/src/main/java/com/tangem/tap/features/tokens/ui/compose/{ => currencyItem}/NetworkItem.kt (70%) 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 deleted file mode 100644 index 5ac13c1815..0000000000 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CollapsedCurrencyItem.kt +++ /dev/null @@ -1,155 +0,0 @@ -package com.tangem.tap.features.tokens.ui.compose - -import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -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 -import com.tangem.tap.common.extensions.getRoundIconRes -import com.tangem.tap.domain.tokens.Currency -import com.tangem.tap.features.tokens.redux.TokenWithBlockchain -import com.tangem.wallet.R - -@Composable -fun CollapsedCurrencyItem( - currency: Currency, - addedTokens: List, - addedBlockchains: List, - onCurrencyClick: (String) -> Unit -) { - Row( - modifier = Modifier - .fillMaxWidth() - .clickable(onClick = { onCurrencyClick(currency.id) }) - ) { - val blockchain = Blockchain.fromNetworkId(currency.id) - - SubcomposeAsyncImage( - model = ImageRequest.Builder(LocalContext.current) - .data(currency.iconUrl) - .crossfade(true) - .build(), - contentDescription = currency.id, - loading = { CurrencyPlaceholderIcon(currency.id) }, - error = { CurrencyPlaceholderIcon(currency.id) }, - modifier = Modifier - .clip(CircleShape) - .padding(16.dp) - .size(46.dp), - ) - Column( - modifier = Modifier - .fillMaxHeight() - .weight(1f) - .align(Alignment.CenterVertically) - ) { - Text( - text = currency.fullName, - fontSize = 17.sp, - fontWeight = FontWeight.Normal, - color = Color(0xFF1C1C1E), - ) - Spacer(modifier = Modifier.size(6.dp)) - Row { - if (!currency.contracts.isNullOrEmpty()) { - currency.contracts.map { contract -> - if (contract.address == null) { - BlockchainNetworkItem( - blockchain = contract.blockchain, - isMainNetwork = true, - addedBlockchains = addedBlockchains - ) - } else { - val added = - addedTokens.map { it.token.contractAddress } - .contains(contract.address) - val icon = if (added) { - contract.blockchain.getRoundIconRes() - } else { - contract.blockchain.getGreyedOutIconRes() - } - Image( - painter = painterResource(id = icon), - contentDescription = null, - Modifier - .size(20.dp) - ) - Spacer(modifier = Modifier.size(5.dp)) - } - - } - } else { - BlockchainNetworkItem( - blockchain = blockchain, - isMainNetwork = false, - addedBlockchains = addedBlockchains - ) - } - } - } - Image( - painter = painterResource(id = R.drawable.ic_arrow_collapsed), - contentDescription = null, - Modifier - .padding(20.dp) - .align(Alignment.CenterVertically) - - ) - } -} - -@Composable -fun BlockchainNetworkItem( - blockchain: Blockchain?, - isMainNetwork: Boolean, - addedBlockchains: List -) { - val added = addedBlockchains.contains(blockchain) - val icon = - if (added) blockchain?.getRoundIconRes() else blockchain?.getGreyedOutIconRes() - if (icon != null) { - Box(Modifier - .size(20.dp)) { - Image( - painter = painterResource(id = icon), - contentDescription = null, - Modifier - .size(20.dp) - ) - if (isMainNetwork) { - Box( - modifier = Modifier - .align(Alignment.TopEnd) - .size(7.dp) - .clip(CircleShape) - .background(Color.White) - ) { - Box( - modifier = Modifier - .align(Alignment.Center) - .size(5.dp) - .clip(CircleShape) - .background(Color(0xFF1ACE80)) - ) - } - } - } - Spacer(modifier = Modifier.size(5.dp)) - } -} \ No newline at end of file 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 deleted file mode 100644 index cecf873bf9..0000000000 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt +++ /dev/null @@ -1,152 +0,0 @@ -package com.tangem.tap.features.tokens.ui.compose - -import androidx.compose.foundation.Image -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.Divider -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -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.tap.domain.tokens.Currency -import com.tangem.tap.features.tokens.redux.ContractAddress -import com.tangem.tap.features.tokens.redux.TokenWithBlockchain -import com.tangem.wallet.R - -@Composable -fun ExpandedCurrencyItem( - currency: Currency, - addedTokens: List, - addedBlockchains: List, - allowToAdd: Boolean, - onCurrencyClick: (String) -> Unit, - onAddCurrencyToggled: (Currency, TokenWithBlockchain?) -> Unit, - onNetworkItemClicked: (ContractAddress) -> Unit -) { - Column { - Row( - modifier = Modifier - .fillMaxWidth() - .clickable(onClick = { onCurrencyClick(currency.id) }) - ) { - SubcomposeAsyncImage( - model = ImageRequest.Builder(LocalContext.current) - .data(currency.iconUrl) - .crossfade(true) - .build(), - contentDescription = currency.id, - loading = { CurrencyPlaceholderIcon(currency.id) }, - error = { CurrencyPlaceholderIcon(currency.id) }, - modifier = Modifier - .clip(CircleShape) - .padding(start = 16.dp, top = 16.dp, end = 16.dp) - .size(46.dp), - ) - Column( - modifier = Modifier - .fillMaxHeight() - .weight(1f) - .padding(top = 14.dp) - .align(Alignment.CenterVertically) - ) { - Text( - text = currency.fullName, - fontSize = 17.sp, - fontWeight = FontWeight.Normal, - color = Color(0xFF1C1C1E), - ) - Spacer(modifier = Modifier.size(6.dp)) - Text( - text = stringResource(id = R.string.currency_subtitle_expanded), - fontSize = 13.sp, - fontWeight = FontWeight.Normal, - color = Color(0xFF8E8E93), - ) - } - Image( - painter = painterResource(id = R.drawable.ic_arrow_extended), - contentDescription = null, - Modifier - .padding(20.dp) - .align(Alignment.CenterVertically) - ) - } - - val blockchains = currency.contracts.map { it.blockchain } - - Row { - Box( - modifier = Modifier - .fillMaxHeight() - ) { - if (blockchains.size > 1) { - val dividerHeight = if (blockchains.size == 2) { - 60 - } else if (blockchains.size == 3) { - 110 - } else { - 43 * blockchains.size - } - Divider( - color = Color(0xFFDEDEDE), - modifier = Modifier - .height(dividerHeight.dp) - .padding(start = 37.5.dp) - .width(1.dp) - ) - } - - Column { - blockchains.map { - Image( - painter = painterResource(id = R.drawable.ic_link), - contentDescription = null, - Modifier - .padding( - start = 37.dp, - ) - ) - Spacer(modifier = Modifier.size(13.5.dp)) - } - } - } - - Column( - modifier = Modifier - .fillMaxWidth() - .padding(top = 6.dp), - ) { - blockchains.map { blockchain -> - val contract = currency.contracts.firstOrNull { it.blockchain == blockchain } - ?: return@map - val added = if (contract.address != null) { - addedTokens.map { it.token.contractAddress }.contains(contract.address) - } else { - addedBlockchains.contains(blockchain) - } - NetworkItem( - currency = currency, - contract = contract, - blockchain = blockchain, - allowToAdd = allowToAdd, - added = added, - onAddCurrencyToggled = onAddCurrencyToggled, - onNetworkItemClicked = onNetworkItemClicked, - ) - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt index 14f36c1dd4..613f741c55 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.tokens.ui.compose +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.LazyColumn @@ -16,7 +17,7 @@ import com.tangem.tap.common.compose.extensions.OnBottomReached import com.tangem.tap.domain.tokens.Currency import com.tangem.tap.features.tokens.redux.ContractAddress import com.tangem.tap.features.tokens.redux.TokenWithBlockchain - +import com.tangem.tap.features.tokens.ui.compose.currencyItem.CurrencyItem @Composable fun ListOfCurrencies( @@ -27,7 +28,7 @@ fun ListOfCurrencies( allowToAdd: Boolean, onAddCurrencyToggled: (Currency, TokenWithBlockchain?) -> Unit, onNetworkItemClicked: (ContractAddress) -> Unit, - onLoadMore: () -> Unit + onLoadMore: () -> Unit, ) { val expandedCurrencies = remember { mutableStateOf(listOf("")) } @@ -50,7 +51,8 @@ fun ListOfCurrencies( state = listState, modifier = Modifier .fillMaxSize(), - contentPadding = PaddingValues(bottom = 90.dp) + contentPadding = PaddingValues(bottom = 90.dp), + verticalArrangement = Arrangement.spacedBy(12.dp), ) { item { header() } itemsIndexed(currencies) { index, currency -> @@ -59,10 +61,10 @@ fun ListOfCurrencies( addedTokens = addedTokens, addedBlockchains = addedBlockchains, allowToAdd = allowToAdd, - expanded = expandedCurrencies.value.contains(currency.id), + isExpanded = expandedCurrencies.value.contains(currency.id), onCurrencyClick = onCurrencyClick, onAddCurrencyToggled = onAddCurrencyToggled, - onNetworkItemClicked = onNetworkItemClicked + onNetworkItemClicked = onNetworkItemClicked, ) } } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyExpandedContent.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyExpandedContent.kt new file mode 100644 index 0000000000..b6d2fb3070 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyExpandedContent.kt @@ -0,0 +1,62 @@ +package com.tangem.tap.features.tokens.ui.compose.currencyItem + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.expandVertically +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.shrinkVertically +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.blockchain.common.Blockchain +import com.tangem.tap.domain.tokens.Currency +import com.tangem.tap.features.tokens.redux.ContractAddress +import com.tangem.tap.features.tokens.redux.TokenWithBlockchain + +@Composable +fun CurrencyExpandedContent( + currency: Currency, + addedTokens: List, + addedBlockchains: List, + allowToAdd: Boolean, + isExpanded: Boolean, + onAddCurrencyToggled: (Currency, TokenWithBlockchain?) -> Unit, + onNetworkItemClicked: (ContractAddress) -> Unit, +) { + AnimatedVisibility( + visible = isExpanded, + enter = fadeIn() + expandVertically(), + exit = fadeOut() + shrinkVertically(), + ) { + val blockchains = currency.contracts.map { it.blockchain } + Row { + Column( + modifier = Modifier + .fillMaxWidth(), + ) { + blockchains.mapIndexed { index, blockchain -> + val contract = currency.contracts.firstOrNull { it.blockchain == blockchain } + ?: return@mapIndexed + val added = if (contract.address != null) { + addedTokens.map { it.token.contractAddress }.contains(contract.address) + } else { + addedBlockchains.contains(blockchain) + } + NetworkItem( + currency = currency, + contract = contract, + blockchain = blockchain, + allowToAdd = allowToAdd, + added = added, + index = index, + size = blockchains.size, + onAddCurrencyToggled = onAddCurrencyToggled, + onNetworkItemClicked = onNetworkItemClicked, + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrencyItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItem.kt similarity index 53% rename from app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrencyItem.kt rename to app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItem.kt index 5ba1f8b683..6758c71e82 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrencyItem.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItem.kt @@ -1,5 +1,6 @@ -package com.tangem.tap.features.tokens.ui.compose +package com.tangem.tap.features.tokens.ui.compose.currencyItem +import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import com.tangem.blockchain.common.Blockchain import com.tangem.tap.domain.tokens.Currency @@ -12,24 +13,27 @@ fun CurrencyItem( addedTokens: List, addedBlockchains: List, allowToAdd: Boolean, - expanded: Boolean, + isExpanded: Boolean, onCurrencyClick: (String) -> Unit, onAddCurrencyToggled: (Currency, TokenWithBlockchain?) -> Unit, - onNetworkItemClicked: (ContractAddress) -> Unit + onNetworkItemClicked: (ContractAddress) -> Unit, ) { - if (expanded) { - ExpandedCurrencyItem( + Column { + CurrencyItemHeader( + currency = currency, + addedTokens = addedTokens, + addedBlockchains = addedBlockchains, + isExpanded = isExpanded, + onCurrencyClick = onCurrencyClick, + ) + CurrencyExpandedContent( currency = currency, addedTokens = addedTokens, addedBlockchains = addedBlockchains, allowToAdd = allowToAdd, - onCurrencyClick = onCurrencyClick, onAddCurrencyToggled = onAddCurrencyToggled, - onNetworkItemClicked = onNetworkItemClicked - ) - } else { - CollapsedCurrencyItem( - currency = currency, addedTokens = addedTokens, - addedBlockchains = addedBlockchains, onCurrencyClick + isExpanded = isExpanded, + onAddCurrencyToggled = onAddCurrencyToggled, + onNetworkItemClicked = onNetworkItemClicked, ) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemArrow.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemArrow.kt new file mode 100644 index 0000000000..4be02043d5 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemArrow.kt @@ -0,0 +1,91 @@ +package com.tangem.tap.features.tokens.ui.compose.currencyItem + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.tangem.wallet.R + +/** +[REDACTED_AUTHOR] + */ +@Composable +fun CurrencyItemArrow( + rowHeight: Dp, + isLastArrow: Boolean, +) { + Box(Modifier.height(rowHeight)) { + if (!isLastArrow) { + MiddleArrowView(rowHeight) + } else { + LastArrowView(rowHeight) + } + } +} + +@Composable +private fun MiddleArrowView(rowHeight: Dp) { + Box { + Box( + modifier = Modifier + .padding(start = 0.5.dp), + ) { + Box( + modifier = Modifier + .background(color = Color(0xFFDEDEDE)) + .width(0.8.dp) + .fillMaxHeight(), + ) + } + + LastArrowView(rowHeight) + } +} + +@Composable +private fun LastArrowView(rowHeight: Dp) { + Image( + modifier = Modifier + .height(rowHeight / 2 + 3.5.dp), + painter = painterResource(id = R.drawable.ic_link), + contentDescription = null, + ) +} + +@Preview +@Composable +fun ArrowViewPreview() { + Box( + Modifier + .background(color = Color.White), + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight() + .padding(start = 37.dp), + ) { + CurrencyItemArrow( + rowHeight = 62.dp, + isLastArrow = false, + ) + CurrencyItemArrow( + rowHeight = 62.dp, + isLastArrow = true, + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt new file mode 100644 index 0000000000..f3d40a401b --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt @@ -0,0 +1,208 @@ +package com.tangem.tap.features.tokens.ui.compose.currencyItem + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +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.common.extensions.getGreyedOutIconRes +import com.tangem.tap.common.extensions.getRoundIconRes +import com.tangem.tap.domain.tokens.Currency +import com.tangem.tap.features.tokens.redux.TokenWithBlockchain +import com.tangem.tap.features.tokens.ui.compose.CurrencyPlaceholderIcon +import com.tangem.tap.features.tokens.ui.compose.fullName +import com.tangem.wallet.R + +@Composable +fun CurrencyItemHeader( + currency: Currency, + addedTokens: List, + addedBlockchains: List, + isExpanded: Boolean, + onCurrencyClick: (String) -> Unit, +) { + Row( + modifier = Modifier + .fillMaxWidth() + .height(62.dp) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = { onCurrencyClick(currency.id) }, + ), + ) { + Box( + modifier = Modifier + .padding(horizontal = 16.dp) + .align(Alignment.CenterVertically) + .clip(RoundedCornerShape(6.dp)), + ) { + SubcomposeAsyncImage( + modifier = Modifier + .size(46.dp), + model = ImageRequest.Builder(LocalContext.current) + .data(currency.iconUrl) + .crossfade(true) + .build(), + contentDescription = currency.id, + loading = { CurrencyPlaceholderIcon(currency.id) }, + error = { CurrencyPlaceholderIcon(currency.id) }, + ) + } + + Column( + modifier = Modifier + .weight(1f) + .align(Alignment.CenterVertically), + ) { + Text( + text = currency.fullName, + fontSize = 17.sp, + fontWeight = FontWeight.Normal, + color = Color(0xFF1C1C1E), + ) + Spacer(modifier = Modifier.size(6.dp)) + + Box( + modifier = Modifier + .fillMaxWidth() + .height(20.dp), + ) { + if (isExpanded) { + Text( + modifier = Modifier.align(Alignment.TopStart), + text = stringResource(id = R.string.currency_subtitle_expanded), + fontSize = 13.sp, + fontWeight = FontWeight.Normal, + color = Color(0xFF8E8E93), + ) + } else { + NetworksRow( + currency = currency, + addedTokens = addedTokens, + addedBlockchains = addedBlockchains, + ) + } + } + } + + val expandCollapseArrow = if (isExpanded) R.drawable.ic_arrow_extended else R.drawable.ic_arrow_collapsed + Image( + painter = painterResource(id = expandCollapseArrow), + contentDescription = null, + Modifier + .padding(20.dp) + .align(Alignment.CenterVertically), + ) + } +} + +@Composable +private fun NetworksRow( + currency: Currency, + addedTokens: List, + addedBlockchains: List, +) { + Row { + if (currency.contracts.isNotEmpty()) { + currency.contracts.map { contract -> + if (contract.address == null) { + BlockchainNetworkItem( + blockchain = contract.blockchain, + isMainNetwork = true, + addedBlockchains = addedBlockchains, + ) + } else { + val isAdded = addedTokens.map { it.token.contractAddress }.contains(contract.address) + val iconResId = if (isAdded) { + contract.blockchain.getRoundIconRes() + } else { + contract.blockchain.getGreyedOutIconRes() + } + Image( + modifier = Modifier + .size(20.dp), + painter = painterResource(id = iconResId), + contentDescription = null, + ) + Spacer(Modifier.size(5.dp)) + } + + } + } else { + BlockchainNetworkItem( + blockchain = Blockchain.fromNetworkId(currency.id), + isMainNetwork = false, + addedBlockchains = addedBlockchains, + ) + } + } +} + +@Composable +private fun BlockchainNetworkItem( + blockchain: Blockchain?, + isMainNetwork: Boolean, + addedBlockchains: List, +) { + val added = addedBlockchains.contains(blockchain) + val icon = + if (added) blockchain?.getRoundIconRes() else blockchain?.getGreyedOutIconRes() + if (icon != null) { + Box( + Modifier + .size(20.dp), + ) { + Image( + painter = painterResource(id = icon), + contentDescription = null, + Modifier + .size(20.dp), + ) + if (isMainNetwork) { + Box( + modifier = Modifier + .align(Alignment.TopEnd) + .size(7.dp) + .clip(CircleShape) + .background(Color.White), + ) { + Box( + modifier = Modifier + .align(Alignment.Center) + .size(5.dp) + .clip(CircleShape) + .background(Color(0xFF1ACE80)), + ) + } + } + } + Spacer(modifier = Modifier.size(5.dp)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/NetworkItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/NetworkItem.kt similarity index 70% rename from app/src/main/java/com/tangem/tap/features/tokens/ui/compose/NetworkItem.kt rename to app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/NetworkItem.kt index 0f45d867bf..2928ace0d8 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/NetworkItem.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/NetworkItem.kt @@ -1,10 +1,18 @@ -package com.tangem.tap.features.tokens.ui.compose +package com.tangem.tap.features.tokens.ui.compose.currencyItem import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Switch import androidx.compose.material.SwitchDefaults @@ -31,6 +39,7 @@ import com.tangem.tap.domain.tokens.Contract import com.tangem.tap.domain.tokens.Currency import com.tangem.tap.features.tokens.redux.ContractAddress import com.tangem.tap.features.tokens.redux.TokenWithBlockchain +import com.tangem.tap.features.tokens.ui.compose.CurrencyPlaceholderIcon @OptIn(ExperimentalFoundationApi::class) @Composable @@ -40,13 +49,17 @@ fun NetworkItem( blockchain: Blockchain, allowToAdd: Boolean, added: Boolean, + index: Int, + size: Int, onAddCurrencyToggled: (Currency, TokenWithBlockchain?) -> Unit, - onNetworkItemClicked: (ContractAddress) -> Unit + onNetworkItemClicked: (ContractAddress) -> Unit, ) { + val rowHeight = 53.dp Row( modifier = Modifier .fillMaxWidth() + .height(rowHeight) .combinedClickable( enabled = allowToAdd, onLongClick = { @@ -54,13 +67,22 @@ fun NetworkItem( }, onClick = {}, indication = null, - interactionSource = remember { MutableInteractionSource() } - ) + interactionSource = remember { MutableInteractionSource() }, + ), ) { + Box( + Modifier + .width(78.dp) + .padding(start = 38.dp), + ) { + CurrencyItemArrow( + rowHeight = rowHeight, + isLastArrow = index == size - 1, + ) + } Box( modifier = Modifier - .align(Alignment.CenterVertically) - .padding(start = 8.dp, top = 16.dp, bottom = 16.dp, end = 6.dp) + .align(Alignment.CenterVertically), ) { SubcomposeAsyncImage( model = if (added) blockchain.getRoundIconRes() else blockchain.getGreyedOutIconRes(), @@ -68,7 +90,7 @@ fun NetworkItem( loading = { CurrencyPlaceholderIcon(blockchain.id) }, error = { CurrencyPlaceholderIcon(blockchain.id) }, modifier = Modifier - .size(20.dp) + .size(20.dp), ) if (contract.address == null) { Box( @@ -76,34 +98,31 @@ fun NetworkItem( .align(Alignment.TopEnd) .size(7.dp) .clip(CircleShape) - .background(Color.White) + .background(Color.White), ) { Box( modifier = Modifier .align(Alignment.Center) .size(5.dp) .clip(CircleShape) - .background(Color(0xFF1ACE80)) + .background(Color(0xFF1ACE80)), ) } } } - Row( + Spacer(Modifier.width(6.dp)) + Text( modifier = Modifier - .fillMaxHeight() .weight(1f) - .align(Alignment.CenterVertically) - ) { - Text( - text = prepareNetworkNameSpannableText( - blockchain = blockchain, - contractAddress = contract.address - ), - fontWeight = FontWeight.SemiBold, - fontSize = 13.sp, - color = if (added) Color.Black else Color(0xFF848488), - ) - } + .align(Alignment.CenterVertically), + text = prepareNetworkNameSpannableText( + blockchain = blockchain, + contractAddress = contract.address, + ), + fontWeight = FontWeight.SemiBold, + fontSize = 13.sp, + color = if (added) Color.Black else Color(0xFF848488), + ) if (allowToAdd) { val token = if (contract.address != null) { @@ -117,8 +136,7 @@ fun NetworkItem( } else { null } - val tokenWithBlockchain = - token?.let { TokenWithBlockchain(token, contract.blockchain) } + val tokenWithBlockchain = token?.let { TokenWithBlockchain(it, contract.blockchain) } val currencyToSave = if (contract.address == null) { currency.copy(id = contract.networkId) @@ -127,22 +145,23 @@ fun NetworkItem( } Switch( + modifier = Modifier + .fillMaxHeight() + .padding(start = 16.dp, end = 16.dp), checked = added, onCheckedChange = { onAddCurrencyToggled(currencyToSave, tokenWithBlockchain) }, - modifier = Modifier.padding(start = 16.dp, end = 16.dp), colors = SwitchDefaults.colors( - checkedThumbColor = Color(0xFF1ACE80) - ) + checkedThumbColor = Color(0xFF1ACE80), + ), ) } } } - @Composable -fun prepareNetworkNameSpannableText( +private fun prepareNetworkNameSpannableText( blockchain: Blockchain, - contractAddress: String? + contractAddress: String?, ): AnnotatedString { val blockchainName = blockchain.fullNameWithoutTestnet.uppercase() @@ -158,11 +177,11 @@ fun prepareNetworkNameSpannableText( AnnotatedString.Range( SpanStyle( fontWeight = FontWeight.Normal, - color = if (contractAddress != null) Color(0xFF8E8E93) else Color(0xFF1ACE80) + color = if (contractAddress != null) Color(0xFF8E8E93) else Color(0xFF1ACE80), ), start = startOfAdditionalText, - end = text.length - ) + end = text.length, + ), ) return AnnotatedString(text = text, spanStyles = spanStyles) } \ No newline at end of file From e8d77000db7fd1b5a9dc454b673e4fd2080a0ab8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 3 Aug 2022 15:50:28 +0300 Subject: [PATCH 22/23] Updated on 2026-08-14 --- .idea/codeStyles/Project.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index ad9c1261c4..3ab743df69 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -175,8 +175,8 @@