From 3b904e7ef46829dd005c58e995f8699ab63406e5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 10 Sep 2022 12:20:17 +0300 Subject: [PATCH 01/10] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/CardSdk.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/domain/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt b/domain/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt index ea805497c6..204602df42 100644 --- a/domain/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt +++ b/domain/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt @@ -18,8 +18,7 @@ fun Card.supportedBlockchains(): List { Blockchain.fromCurve(EllipticCurve.Secp256k1) } else -> { - Blockchain.fromCurve(EllipticCurve.Secp256k1) + - Blockchain.fromCurve(EllipticCurve.Ed25519) + (Blockchain.fromCurve(EllipticCurve.Secp256k1) + Blockchain.fromCurve(EllipticCurve.Ed25519)).distinct() } } val filtered = supportedBlockchains.filter { isTestCard == it.isTestnet() } From f45da41502a07bb6591e9ee5ef3bc8ccc06ab165 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 10 Sep 2022 13:25:10 +0300 Subject: [PATCH 02/10] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/Blockchain.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 139bc99365..3ced07e447 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,7 +5,7 @@ import com.tangem.blockchain.common.Blockchain fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { return when (networkId) { "arbitrum-one" -> Blockchain.Arbitrum - "arbitrum-one/test" -> Blockchain.ArbitrumTestnet + "arbitrum/test" -> Blockchain.ArbitrumTestnet "avalanche", "avalanche-2" -> Blockchain.Avalanche "avalanche/test", "avalanche-2/test" -> Blockchain.AvalancheTestnet "binancecoin" -> Blockchain.Binance From b6e2da91c002b538a2d972a5ff7f4dadfc9e185a Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 10 Sep 2022 13:25:47 +0300 Subject: [PATCH 03/10] Updated on 2026-08-14 --- .../features/BlockchainNetworkIdTests.kt | 29 +++++++++++++++++++ .../tangem/domain/features/ExampleUnitTest.kt | 16 ---------- 2 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt delete mode 100644 domain/src/test/java/com/tangem/domain/features/ExampleUnitTest.kt diff --git a/domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt b/domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt new file mode 100644 index 0000000000..9982a61c80 --- /dev/null +++ b/domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt @@ -0,0 +1,29 @@ +package com.tangem.domain.features + +import com.google.common.truth.Truth +import com.tangem.blockchain.common.Blockchain +import com.tangem.domain.common.extensions.fromNetworkId +import com.tangem.domain.common.extensions.toNetworkId +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class BlockchainNetworkIdTests { + @Test + fun checkAppropriateImplementationForNetworkIds() { + val unimplementedIds = Blockchain.values() + .toMutableList() + .apply { remove(Blockchain.Unknown) }.map { + val networkId = it.toNetworkId() + networkId to Blockchain.fromNetworkId(networkId) + }.filter { it.second == null } + + if (unimplementedIds.isEmpty()) return + + val message = unimplementedIds.joinToString("\n") { it.first } + Truth.assert_().withMessage(message).fail() + } +} \ No newline at end of file diff --git a/domain/src/test/java/com/tangem/domain/features/ExampleUnitTest.kt b/domain/src/test/java/com/tangem/domain/features/ExampleUnitTest.kt deleted file mode 100644 index 99368f65e4..0000000000 --- a/domain/src/test/java/com/tangem/domain/features/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.tangem.domain.features - -import org.junit.Assert.assertEquals -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file From 07732b4b55c6508476d1246e6332527004e37a17 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 10 Sep 2022 13:27:13 +0300 Subject: [PATCH 04/10] Updated on 2026-08-14 --- dependencies.gradle | 2 +- .../java/com/tangem/domain/common/extensions/Blockchain.kt | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 4717ab51df..394b8cc997 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,7 +2,7 @@ ext.versions = [ kotlin : '1.6.10', build_gradle : '7.1.3', tangem_card_sdk : 'develop-159', - tangem_blockchain_sdk: 'develop-107', + tangem_blockchain_sdk: 'develop-111', // tangem_blockchain_sdk: '0.0.1', ] 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 3ced07e447..a162d197b2 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 @@ -40,6 +40,7 @@ fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { "xdai" -> Blockchain.Gnosis "polkadot" -> Blockchain.Polkadot "polkadot/test" -> Blockchain.PolkadotTestnet + "kusama" -> Blockchain.Kusama else -> null } } @@ -84,6 +85,7 @@ fun Blockchain.toNetworkId(): String { Blockchain.Gnosis -> "xdai" Blockchain.Polkadot -> "polkadot" Blockchain.PolkadotTestnet -> "polkadot/test" + Blockchain.Kusama -> "kusama" } } @@ -101,15 +103,16 @@ fun Blockchain.toCoinId(): String { Blockchain.Avalanche, Blockchain.AvalancheTestnet -> "avalanche-2" Blockchain.Solana, Blockchain.SolanaTestnet -> "solana" Blockchain.Fantom, Blockchain.FantomTestnet -> "fantom" + Blockchain.Tron, Blockchain.TronTestnet -> "tron" + Blockchain.Polkadot, Blockchain.PolkadotTestnet -> "polkadot" Blockchain.Ducatus -> "ducatus" Blockchain.Litecoin -> "litecoin" Blockchain.RSK -> "rootstock" Blockchain.Tezos -> "tezos" Blockchain.XRP -> "ripple" Blockchain.Dogecoin -> "dogecoin" - Blockchain.Tron, Blockchain.TronTestnet -> "tron" Blockchain.Gnosis -> "xdai" - Blockchain.Polkadot, Blockchain.PolkadotTestnet -> "polkadot" + Blockchain.Kusama -> "kusama" Blockchain.Unknown -> "unknown" } } \ No newline at end of file From a67df03d6306980a140f0752d8aad418c9ecbc2f Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 10 Sep 2022 13:31:45 +0300 Subject: [PATCH 05/10] Updated on 2026-08-14 --- .../domain/features/BlockchainNetworkIdTests.kt | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt b/domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt index 9982a61c80..ff5079bdf4 100644 --- a/domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt +++ b/domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt @@ -6,24 +6,18 @@ import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.extensions.toNetworkId import org.junit.Test -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ class BlockchainNetworkIdTests { @Test fun checkAppropriateImplementationForNetworkIds() { val unimplementedIds = Blockchain.values() .toMutableList() - .apply { remove(Blockchain.Unknown) }.map { - val networkId = it.toNetworkId() - networkId to Blockchain.fromNetworkId(networkId) - }.filter { it.second == null } + .apply { remove(Blockchain.Unknown) } + .map { it to Blockchain.fromNetworkId(it.toNetworkId()) } + .filter { it.second == null } if (unimplementedIds.isEmpty()) return - val message = unimplementedIds.joinToString("\n") { it.first } + val message = unimplementedIds.joinToString("\n") { it.first.fullName } Truth.assert_().withMessage(message).fail() } } \ No newline at end of file From 18e35b6b42da60761a328d6cf2c27ff42b498b14 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 13 Sep 2022 17:21:37 +0300 Subject: [PATCH 06/10] Updated on 2026-08-14 --- .../features/send/redux/SendScreenAction.kt | 12 ++++--- .../redux/middlewares/RequestFeeMiddleware.kt | 19 +++++++---- .../send/redux/reducers/FeeReducer.kt | 7 ++-- .../send/redux/reducers/SendScreenReducer.kt | 4 +-- .../features/send/redux/states/FeeState.kt | 4 +-- .../send/ui/dialogs/RequestFeeErrorDialog.kt | 32 +++++++++++++++++++ .../stateSubscribers/SendStateSubscriber.kt | 32 ++++++++----------- 7 files changed, 70 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt b/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt index 8c76739e6b..41b3f9d34a 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt @@ -113,15 +113,11 @@ sealed class FeeActionUi : SendScreenActionUi { } sealed class FeeAction : SendScreenAction { - enum class Error { - ADDRESS_OR_AMOUNT_IS_EMPTY, - REQUEST_FAILED - } object RequestFee : FeeAction() sealed class FeeCalculation : FeeAction() { data class SetFeeResult(val fee: List) : FeeCalculation() - data class SetFeeError(val error: Error) : FeeCalculation() + object ClearResult : FeeCalculation() } data class ChangeLayoutVisibility( @@ -160,6 +156,12 @@ sealed class SendAction : SendScreenAction { data class CardSdkError(val error: TangemSdkError): Dialog() data class BlockchainSdkError(val error: com.tangem.blockchain.common.BlockchainSdkError): Dialog() } + + data class RequestFeeError( + val error: com.tangem.blockchain.common.BlockchainSdkError, + val onRetry: () -> Unit, + ) : Dialog() + object Hide : Dialog() } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt index cd4075a0ca..f73c2c3241 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/RequestFeeMiddleware.kt @@ -2,6 +2,7 @@ package com.tangem.tap.features.send.redux.middlewares import com.tangem.blockchain.common.Amount import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.BlockchainSdkError import com.tangem.blockchain.common.TransactionSender import com.tangem.blockchain.extensions.Result import com.tangem.common.extensions.isZero @@ -31,8 +32,7 @@ class RequestFeeMiddleware { val scanResponse = appState.globalState.scanResponse ?: return if (!SendState.isReadyToRequestFee()) { - dispatch(FeeAction.FeeCalculation.SetFeeError(FeeAction.Error.ADDRESS_OR_AMOUNT_IS_EMPTY)) -// dispatch(FeeAction.ChangeLayoutVisibility(main = false, chipGroup = true)) + dispatch(FeeAction.FeeCalculation.ClearResult) dispatch(ReceiptAction.RefreshReceipt) dispatch(SendAction.ChangeSendButtonState(sendState.getButtonState())) return @@ -66,14 +66,21 @@ class RequestFeeMiddleware { } } is Result.Failure -> { - dispatch(FeeAction.FeeCalculation.SetFeeError(FeeAction.Error.REQUEST_FAILED)) + dispatch(FeeAction.FeeCalculation.ClearResult) dispatch(FeeAction.ChangeLayoutVisibility(main = false)) + + val blockchainSdkError = feeResult.error as? BlockchainSdkError ?: return@withContext + dispatch( + SendAction.Dialog.RequestFeeError( + error = blockchainSdkError, + onRetry = { dispatch(FeeAction.RequestFee) }, + ), + ) } } dispatch(AmountActionUi.CheckAmountToSend) } } - } } @@ -93,13 +100,13 @@ class FeeMock { suspend fun feeStandard(blockchain: Blockchain): List = listOf( Amount(0.001500.toBigDecimal(), blockchain), Amount(0.0030.toBigDecimal(), blockchain), - Amount(0.0045001.toBigDecimal(), blockchain) + Amount(0.0045001.toBigDecimal(), blockchain), ) suspend fun feeStandardBig(blockchain: Blockchain): List = listOf( Amount(1.76.toBigDecimal(), blockchain), Amount(2.30.toBigDecimal(), blockchain), - Amount(3.45.toBigDecimal(), blockchain) + Amount(3.45.toBigDecimal(), blockchain), ) suspend fun feeSingle(blockchain: Blockchain): List = listOf(Amount(0.0015.toBigDecimal(), blockchain)) diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt index 4c2fae60ba..9965636a49 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt @@ -36,7 +36,7 @@ class FeeReducer : SendInternalReducer { private fun handleAction(action: FeeAction, sendState: SendState, state: FeeState): SendState { val result = when (action) { is FeeAction.RequestFee -> { - state.copy(error = null) + state } is FeeAction.ChangeLayoutVisibility -> { fun getVisibility(current: Boolean, proposed: Boolean?): Boolean = proposed ?: current @@ -56,7 +56,6 @@ class FeeReducer : SendInternalReducer { selectedFeeType = feeType, feeList = fees, currentFee = currentFee, - error = null, feeIsApproximate = isFeeApproximate(sendState), ) } else { @@ -67,16 +66,14 @@ class FeeReducer : SendInternalReducer { selectedFeeType = feeType, feeList = fees, currentFee = currentFee, - error = null, feeIsApproximate = isFeeApproximate(sendState), ) } } - is FeeAction.FeeCalculation.SetFeeError -> { + FeeAction.FeeCalculation.ClearResult -> { state.copy( feeList = null, currentFee = null, - error = action.error, ) } } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt index 07936d3e49..d44a27f0d1 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/SendScreenReducer.kt @@ -59,10 +59,10 @@ private class SendReducer : SendInternalReducer { is SendAction.Dialog.TezosWarningDialog -> sendState.copy(dialog = action) is SendAction.Dialog.SendTransactionFails.CardSdkError -> sendState.copy(dialog = action) is SendAction.Dialog.SendTransactionFails.BlockchainSdkError -> sendState.copy(dialog = action) + is SendAction.Dialog.RequestFeeError -> sendState.copy(dialog = action) is SendAction.Dialog.Hide -> sendState.copy(dialog = null) is SendAction.Warnings.Set -> sendState.copy(sendWarningsList = action.warningList) - is SendAction.SendSpecificTransaction -> - handleSendSpecificTransactionAction(action, sendState) + is SendAction.SendSpecificTransaction -> handleSendSpecificTransactionAction(action, sendState) else -> return sendState } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/states/FeeState.kt b/app/src/main/java/com/tangem/tap/features/send/redux/states/FeeState.kt index 4c9818a669..d9b8798a1e 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/states/FeeState.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/states/FeeState.kt @@ -1,7 +1,6 @@ package com.tangem.tap.features.send.redux.states import com.tangem.blockchain.common.Amount -import com.tangem.tap.features.send.redux.FeeAction import java.math.BigDecimal /** @@ -21,12 +20,11 @@ data class FeeState( val controlsLayoutIsVisible: Boolean = false, val feeChipGroupIsVisible: Boolean = true, val includeFeeSwitcherIsEnabled: Boolean = true, - val error: FeeAction.Error? = null, ) : SendScreenState { override val stateId: StateId = StateId.FEE - fun isReady(): Boolean = error == null && currentFee != null + fun isReady(): Boolean = currentFee != null fun getCurrentFeeValue(): BigDecimal = currentFee?.value ?: BigDecimal.ZERO } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt new file mode 100644 index 0000000000..669ec571f0 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt @@ -0,0 +1,32 @@ +package com.tangem.tap.features.send.ui.dialogs + +import android.content.Context +import androidx.appcompat.app.AlertDialog +import com.tangem.tap.common.feedback.SendTransactionFailedEmail +import com.tangem.tap.common.redux.global.GlobalAction +import com.tangem.tap.features.send.redux.SendAction +import com.tangem.tap.store +import com.tangem.wallet.R + +/** +[REDACTED_AUTHOR] + */ +class RequestFeeErrorDialog { + + companion object { + fun create(context: Context, dialog: SendAction.Dialog.RequestFeeError): AlertDialog { + val errorMessage = dialog.error.customMessage + + return AlertDialog.Builder(context).apply { + setTitle(R.string.send_error_fee_request_failed) + setMessage(context.getString(R.string.alert_failed_to_send_transaction_message, errorMessage)) + setNegativeButton(R.string.alert_button_send_feedback) { _, _ -> + store.dispatch(GlobalAction.SendEmail(SendTransactionFailedEmail(errorMessage))) + } + setPositiveButton(R.string.common_retry) { _, _ -> dialog.onRetry() } + setNeutralButton(R.string.common_cancel) { _, _ -> } + setOnDismissListener { store.dispatch(SendAction.Dialog.Hide) } + }.create() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt index 4496bd570b..96624950c0 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt @@ -20,7 +20,6 @@ import com.tangem.tap.domain.MultiMessageError import com.tangem.tap.domain.assembleErrors import com.tangem.tap.features.BaseStoreFragment import com.tangem.tap.features.send.redux.AddressPayIdVerifyAction.Error -import com.tangem.tap.features.send.redux.FeeAction import com.tangem.tap.features.send.redux.SendAction import com.tangem.tap.features.send.redux.states.AddressPayIdState import com.tangem.tap.features.send.redux.states.AmountState @@ -35,12 +34,12 @@ import com.tangem.tap.features.send.redux.states.TransactionExtrasState import com.tangem.tap.features.send.redux.states.XlmMemoType import com.tangem.tap.features.send.ui.FeeUiHelper import com.tangem.tap.features.send.ui.SendFragment +import com.tangem.tap.features.send.ui.dialogs.RequestFeeErrorDialog import com.tangem.tap.features.send.ui.dialogs.SendTransactionFailsDialog import com.tangem.tap.features.send.ui.dialogs.TezosWarningDialog import com.tangem.tap.features.wallet.redux.WalletState.Companion.ROUGH_SIGN import com.tangem.tap.features.wallet.redux.WalletState.Companion.UNKNOWN_AMOUNT_SIGN import com.tangem.tap.features.wallet.ui.adapters.WarningMessagesAdapter -import com.tangem.tap.store import com.tangem.wallet.R /** @@ -62,10 +61,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : when (it) { StateId.SEND_SCREEN -> handleSendScreen(fg, state) StateId.ADDRESS_PAY_ID -> handleAddressPayIdState(fg, state.addressPayIdState) - StateId.TRANSACTION_EXTRAS -> handleTransactionExtrasState( - fg, - state.transactionExtrasState - ) + StateId.TRANSACTION_EXTRAS -> handleTransactionExtrasState(fg, state.transactionExtrasState) StateId.AMOUNT -> handleAmountState(fg, state.amountState) StateId.FEE -> handleFeeState(fg, state.feeState) StateId.RECEIPT -> handleReceiptState(fg, state.receiptState) @@ -144,6 +140,12 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : dialog?.show() } } + is SendAction.Dialog.RequestFeeError -> { + if (dialog == null) { + dialog = RequestFeeErrorDialog.create(fg.requireContext(), state.dialog) + dialog?.show() + } + } else -> { dialog?.dismiss() dialog = null @@ -161,7 +163,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : toolbar.title = fg.getString( R.string.send_title_currency_format, - state.amountState.mainCurrency.currencySymbol + state.amountState.mainCurrency.currencySymbol, ) } @@ -233,11 +235,11 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : val balanceText = when (state.mainCurrency.type) { MainCurrencyType.FIAT -> fg.getString( R.string.send_balance_subtitle_format, - state.viewBalanceValue, state.mainCurrency.currencySymbol + state.viewBalanceValue, state.mainCurrency.currencySymbol, ).remove(":") MainCurrencyType.CRYPTO -> fg.getString( R.string.send_balance_subtitle_format, - state.mainCurrency.currencySymbol, state.viewBalanceValue + state.mainCurrency.currencySymbol, state.viewBalanceValue, ) } @@ -263,14 +265,6 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : swIncludeFee.isChecked = state.feeIsIncluded } - if (state.error == FeeAction.Error.REQUEST_FAILED) { - fg.showRetrySnackbar( - fg.requireContext().getString(R.string.send_error_fee_request_failed) - ) { - store.dispatch(FeeAction.RequestFee) - } - } - val chipId = FeeUiHelper.toId(state.selectedFeeType) if (chipGroup.checkedChipId != chipId && chipId != View.NO_ID) chipGroup.check(chipId) } @@ -299,7 +293,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : val willSent = getString( R.string.send_total_subtitle_format, - receipt.willSentCrypto, receipt.symbols.crypto + receipt.willSentCrypto, receipt.symbols.crypto, ) llTotalContainer.tvWillBeSentValue.update(willSent) @@ -334,7 +328,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : val willSent = getString( R.string.send_total_subtitle_asset_format, receipt.symbols.token ?: "", receipt.willSentToken, - receipt.symbols.crypto, receipt.willSentFeeCoin + receipt.symbols.crypto, receipt.willSentFeeCoin, ) llTotalContainer.tvWillBeSentValue.update(willSent) } From 325f78d2e1ca9e360f2a500b57af45ddde9fe7d0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 14 Sep 2022 23:57:18 +0300 Subject: [PATCH 07/10] Updated on 2026-08-14 --- .../com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt index 9092292f99..4be9104bb1 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt @@ -62,7 +62,7 @@ class WalletAdapter fun bind(wallet: WalletData) = with(binding) { val status = wallet.currencyData.status // Skip changes when on refreshing status - if (status == BalanceStatus.Refreshing || wallet.fiatRateString == null) return@with + if (status == BalanceStatus.Refreshing) return@with val statusMessage = when (status) { BalanceStatus.TransactionInProgress -> { From 5ddcb3b97a4a5c994f1ecfb9ee7855e36c1e0e41 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 15 Sep 2022 00:00:26 +0300 Subject: [PATCH 08/10] Updated on 2026-08-14 --- .../com/tangem/tap/common/extensions/Token.kt | 20 ++++++---- .../wallet/ui/images/CurrencyIconRequest.kt | 33 +++++++++++----- .../wallet/ui/images/CurrencyIconView.kt | 39 +++++++++---------- .../main/res/layout/view_currency_icon.xml | 7 ++-- 4 files changed, 58 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Token.kt b/app/src/main/java/com/tangem/tap/common/extensions/Token.kt index 10897bc069..59c918d736 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Token.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Token.kt @@ -5,19 +5,23 @@ import androidx.annotation.ColorInt import androidx.core.graphics.luminance import androidx.core.graphics.toColorInt import com.tangem.blockchain.common.Token -import com.tangem.wallet.R @ColorInt -fun Token.getColor(): Int { - return try { - ("#" + this.contractAddress.subSequence(2..7).toString()) - .toColorInt() +fun Token.getColor(isTestnet: Boolean = false): Int { + val defaultColor = "#C7C7CC".toColorInt() // equivalent to R.color.lightGray4 + + return if (isTestnet) + defaultColor + else try { + ("#" + this.contractAddress.subSequence(2..7).toString()).toColorInt() } catch (exception: Exception) { - R.color.lightGray4 + defaultColor } } @ColorInt -fun Token.getTextColor(): Int { - return if (this.getColor().luminance > 0.5) Color.BLACK else Color.WHITE +fun Token.getTextColor(isTestnet: Boolean = false): Int = when { + isTestnet -> Color.WHITE + this.getColor().luminance > 0.5 -> Color.BLACK + else -> Color.WHITE } \ No newline at end of file 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 cd7959319e..62f015909c 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 @@ -21,7 +21,7 @@ private const val VOYR = "VOYRME" class CurrencyIconRequest( private val currencyImageView: ImageFilterView, - private val currencyTextView: TextView, + private val currencyTextView: TextView?, private val token: Token?, private val blockchain: Blockchain, ) { @@ -38,7 +38,7 @@ class CurrencyIconRequest( loadBlockchainIconBase( onStart = { currencyImageView.colorFilter = null - } + }, ) } @@ -46,7 +46,7 @@ class CurrencyIconRequest( loadBlockchainIconBase( onStart = { currencyImageView.saturation = 0f - } + }, ) } @@ -57,7 +57,11 @@ class CurrencyIconRequest( }, onSuccess = { currencyImageView.colorFilter = null - } + }, + onError = { + currencyImageView.setColorFilter(it.getColor()) + currencyTextView?.setTextColor(it.getTextColor()) + }, ) } @@ -65,7 +69,12 @@ class CurrencyIconRequest( loadTokenIconBase( onStart = { currencyImageView.saturation = 0f - } + }, + onError = { + currencyImageView.saturation = 0f + currencyImageView.setColorFilter(it.getColor(true)) + currencyTextView?.setTextColor(it.getTextColor(true)) + }, ) } @@ -94,15 +103,19 @@ class CurrencyIconRequest( data = getTokenIcon(token, blockchain), placeholderRes = R.drawable.shape_circle, onStart = { - currencyTextView.text = token.symbol.take(1) - currencyTextView.setTextColor(token.getTextColor()) + currencyTextView?.text = token.name.take(1) + currencyTextView?.setTextColor(token.getTextColor()) onStart(token) }, onSuccess = { - currencyTextView.text = null + currencyTextView?.text = null onSuccess(token) }, - onError = { onError(token) }, + onError = { + // for some reason the onStart doesn't call if an error occurs + currencyTextView?.text = token.name.take(1) + onError(token) + }, ) } } @@ -122,7 +135,7 @@ private inline fun ImageView.loadIcon( .listener( onStart = { onStart() }, onSuccess = { _, _ -> onSuccess() }, - onError = { _, _ -> onError() } + onError = { _, _ -> onError() }, ) .target(imageView = this) .build() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt index ec9ff38519..bc31d17000 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt @@ -4,13 +4,11 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.widget.TextView -import androidx.annotation.DrawableRes import androidx.constraintlayout.utils.widget.ImageFilterView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible import com.tangem.blockchain.common.DerivationStyle import com.tangem.tangem_sdk_new.extensions.dpToPx -import com.tangem.tap.common.extensions.getRoundIconRes import com.tangem.tap.features.wallet.models.Currency import com.tangem.wallet.databinding.ViewCurrencyIconBinding import kotlin.math.roundToInt @@ -31,22 +29,13 @@ class CurrencyIconView @JvmOverloads constructor( private val currencyTextView: TextView get() = binding.tvTokenLetter - private var isBlockchainIconVisible: Boolean - get() = binding.ivBlockchain.isVisible - set(value) = binding.ivBlockchain::isVisible.set(value) + private var isBlockchainBadgeVisible: Boolean + get() = binding.ivBlockchainBadge.isVisible + set(value) = binding.ivBlockchainBadge::isVisible.set(value) - private var isBadgeVisible: Boolean - get() = binding.badge.isVisible - set(value) = binding.badge::isVisible.set(value) - - @DrawableRes - private var blockchainIconRes: Int? = null - set(value) { - if (value != null && value != field && isBlockchainIconVisible) { - binding.ivBlockchain.setImageResource(value) - field = value - } - } + private var isCustomCurrencyBadgeVisible: Boolean + get() = binding.customBadge.isVisible + set(value) = binding.customBadge::isVisible.set(value) init { minWidth = dpToPx(48f).roundToInt() @@ -57,9 +46,7 @@ class CurrencyIconView @JvmOverloads constructor( currency: Currency, derivationStyle: DerivationStyle?, ) { - isBlockchainIconVisible = currency.isToken() - isBadgeVisible = currency.isCustomCurrency(derivationStyle) - blockchainIconRes = currency.blockchain.getRoundIconRes() + isCustomCurrencyBadgeVisible = currency.isCustomCurrency(derivationStyle) CurrencyIconRequest( currencyImageView = currencyImageView, @@ -67,5 +54,17 @@ class CurrencyIconView @JvmOverloads constructor( token = (currency as? Currency.Token)?.token, blockchain = currency.blockchain, ).load() + + if (currency.isToken()) { + // load a blockchain icon into the blockchain badge + isBlockchainBadgeVisible = true + + CurrencyIconRequest( + currencyImageView = binding.ivBlockchainBadge, + currencyTextView = null, + token = null, + blockchain = currency.blockchain, + ).load() + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/view_currency_icon.xml b/app/src/main/res/layout/view_currency_icon.xml index 801ac76c97..aa1330c398 100644 --- a/app/src/main/res/layout/view_currency_icon.xml +++ b/app/src/main/res/layout/view_currency_icon.xml @@ -35,12 +35,13 @@ android:textColor="@android:color/white" android:textSize="25sp" android:textStyle="bold" + android:translationY="-1dp" tools:text="J" /> - Date: Thu, 15 Sep 2022 11:36:29 +0300 Subject: [PATCH 09/10] Updated on 2026-08-14 --- ...BlockchainNetworkIdTests.kt => BlockchainTests.kt} | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) rename domain/src/test/java/com/tangem/domain/features/{BlockchainNetworkIdTests.kt => BlockchainTests.kt} (60%) diff --git a/domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt b/domain/src/test/java/com/tangem/domain/features/BlockchainTests.kt similarity index 60% rename from domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt rename to domain/src/test/java/com/tangem/domain/features/BlockchainTests.kt index ff5079bdf4..b8291b93ac 100644 --- a/domain/src/test/java/com/tangem/domain/features/BlockchainNetworkIdTests.kt +++ b/domain/src/test/java/com/tangem/domain/features/BlockchainTests.kt @@ -6,18 +6,15 @@ import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.extensions.toNetworkId import org.junit.Test -class BlockchainNetworkIdTests { +class BlockchainTests { @Test - fun checkAppropriateImplementationForNetworkIds() { + fun allNetworkIdsAreImplemented() { val unimplementedIds = Blockchain.values() .toMutableList() .apply { remove(Blockchain.Unknown) } .map { it to Blockchain.fromNetworkId(it.toNetworkId()) } - .filter { it.second == null } + .mapNotNull { if(it.second == null) it.first else null } - if (unimplementedIds.isEmpty()) return - - val message = unimplementedIds.joinToString("\n") { it.first.fullName } - Truth.assert_().withMessage(message).fail() + Truth.assertThat(unimplementedIds).isEmpty() } } \ No newline at end of file From ef6d985c047ff2bac87cb5a154759d4b8a52bb95 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 15 Sep 2022 14:44:08 +0300 Subject: [PATCH 10/10] Updated on 2026-08-14 --- .../wallet/ui/WalletDetailsFragment.kt | 1 + .../wallet/ui/adapters/WalletAdapter.kt | 1 + .../wallet/ui/images/CurrencyIconView.kt | 51 ++++++++++--------- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index ab07dd33d5..db9173e486 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -41,6 +41,7 @@ import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.redux.WalletState.Companion.UNKNOWN_AMOUNT_SIGN import com.tangem.tap.features.wallet.ui.adapters.PendingTransactionsAdapter import com.tangem.tap.features.wallet.ui.adapters.WalletDetailWarningMessagesAdapter +import com.tangem.tap.features.wallet.ui.images.load import com.tangem.tap.features.wallet.ui.test.TestWalletDetails import com.tangem.tap.store import com.tangem.wallet.R diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt index 4be9104bb1..af061d48f1 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/adapters/WalletAdapter.kt @@ -15,6 +15,7 @@ import com.tangem.tap.common.extensions.show import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.WalletData import com.tangem.tap.features.wallet.ui.BalanceStatus +import com.tangem.tap.features.wallet.ui.images.load import com.tangem.tap.store import com.tangem.wallet.R import com.tangem.wallet.databinding.ItemCurrencyWalletBinding diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt index bc31d17000..8bf8cebcf1 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt @@ -23,17 +23,20 @@ class CurrencyIconView @JvmOverloads constructor( this, ) - private val currencyImageView: ImageFilterView + val currencyImageView: ImageFilterView get() = binding.ivCurrency - private val currencyTextView: TextView + val currencyTextView: TextView get() = binding.tvTokenLetter - private var isBlockchainBadgeVisible: Boolean + val blockchainBadge: ImageFilterView + get() = binding.ivBlockchainBadge + + var isBlockchainBadgeVisible: Boolean get() = binding.ivBlockchainBadge.isVisible set(value) = binding.ivBlockchainBadge::isVisible.set(value) - private var isCustomCurrencyBadgeVisible: Boolean + var isCustomCurrencyBadgeVisible: Boolean get() = binding.customBadge.isVisible set(value) = binding.customBadge::isVisible.set(value) @@ -41,30 +44,30 @@ class CurrencyIconView @JvmOverloads constructor( minWidth = dpToPx(48f).roundToInt() minHeight = dpToPx(48f).roundToInt() } +} - fun load( - currency: Currency, - derivationStyle: DerivationStyle?, - ) { - isCustomCurrencyBadgeVisible = currency.isCustomCurrency(derivationStyle) +fun CurrencyIconView.load( + currency: Currency, + derivationStyle: DerivationStyle?, +) { + isCustomCurrencyBadgeVisible = currency.isCustomCurrency(derivationStyle) + + CurrencyIconRequest( + currencyImageView = currencyImageView, + currencyTextView = currencyTextView, + token = (currency as? Currency.Token)?.token, + blockchain = currency.blockchain, + ).load() + + if (currency.isToken()) { + // load a blockchain icon into the blockchain badge + isBlockchainBadgeVisible = true CurrencyIconRequest( - currencyImageView = currencyImageView, - currencyTextView = currencyTextView, - token = (currency as? Currency.Token)?.token, + currencyImageView = blockchainBadge, + currencyTextView = null, + token = null, blockchain = currency.blockchain, ).load() - - if (currency.isToken()) { - // load a blockchain icon into the blockchain badge - isBlockchainBadgeVisible = true - - CurrencyIconRequest( - currencyImageView = binding.ivBlockchainBadge, - currencyTextView = null, - token = null, - blockchain = currency.blockchain, - ).load() - } } } \ No newline at end of file