From a2d36ff27c647c97db746d21f77254df264fa34d Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 19 Feb 2024 22:18:19 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../features/send/redux/SendScreenAction.kt | 5 +++ .../send/redux/middlewares/SendMiddleware.kt | 2 ++ .../reducers/TransactionExtrasReducer.kt | 19 +++++++++++ .../send/redux/states/AddressState.kt | 18 +++++++++-- .../tap/features/send/ui/SendFragment.kt | 9 ++++++ .../stateSubscribers/SendStateSubscriber.kt | 11 +++++++ .../main/res/layout/layout_send_address.xml | 32 +++++++++++++++++++ .../DefaultTransactionRepository.kt | 2 ++ .../SendRecipientMemoFieldConverter.kt | 1 + gradle/dependencies.toml | 2 +- 10 files changed, 98 insertions(+), 3 deletions(-) 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 00e279678b..3c3409459e 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 @@ -89,6 +89,11 @@ sealed class TransactionExtrasAction : SendScreenActionUi { sealed class HederaMemo : TransactionExtrasAction() { data class HandleUserInput(val data: String) : HederaMemo() } + + @Deprecated("Only in legacy send screen") + sealed class AlgorandMemo : TransactionExtrasAction() { + data class HandleUserInput(val data: String) : AlgorandMemo() + } } sealed class AddressVerifyAction : SendScreenAction { diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt index dcdd0913bb..2c21ea333c 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt @@ -1,6 +1,7 @@ package com.tangem.tap.features.send.redux.middlewares import com.google.firebase.crashlytics.FirebaseCrashlytics +import com.tangem.blockchain.blockchains.algorand.AlgorandTransactionExtras import com.tangem.blockchain.blockchains.binance.BinanceTransactionExtras import com.tangem.blockchain.blockchains.cosmos.CosmosTransactionExtras import com.tangem.blockchain.blockchains.hedera.HederaTransactionBuilder @@ -177,6 +178,7 @@ private fun sendTransaction( extras = HederaTransactionBuilder.HederaTransactionExtras(it), ) } + transactionExtras.algorandMemoState?.memo?.let { txData = txData.copy(extras = AlgorandTransactionExtras(it)) } scope.launch { // TODO: Risky commented this part, unknown logic, need to test if removed diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt index 058a8ded6e..c781547049 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt @@ -20,6 +20,7 @@ class TransactionExtrasReducer : SendInternalReducer { is TonMemo -> handleTonMemo(action, sendState, sendState.transactionExtrasState) is CosmosMemo -> handleCosmosMemo(action, sendState, sendState.transactionExtrasState) is HederaMemo -> handleHederaMemo(action, sendState, sendState.transactionExtrasState) + is AlgorandMemo -> handleAlgorandMemo(action, sendState, sendState.transactionExtrasState) else -> sendState } } @@ -54,6 +55,9 @@ class TransactionExtrasReducer : SendInternalReducer { Blockchain.TerraV2, -> TransactionExtrasState(cosmosMemoState = CosmosMemoState()) Blockchain.Hedera, Blockchain.HederaTestnet -> TransactionExtrasState(hederaMemoState = HederaMemoState()) + Blockchain.Algorand, Blockchain.AlgorandTestnet -> TransactionExtrasState( + algorandMemoState = AlgorandMemoState(), + ) else -> emptyResult } return updateLastState(sendState.copy(transactionExtrasState = result), result) @@ -179,4 +183,19 @@ class TransactionExtrasReducer : SendInternalReducer { } return updateLastState(sendState.copy(transactionExtrasState = result), result) } + + private fun handleAlgorandMemo( + action: AlgorandMemo, + sendState: SendState, + infoState: TransactionExtrasState, + ): SendState { + val result = when (action) { + is AlgorandMemo.HandleUserInput -> { + val memo = action.data + val input = InputViewValue(memo, true) + infoState.copy(algorandMemoState = AlgorandMemoState(input, memo)) + } + } + return updateLastState(sendState.copy(transactionExtrasState = result), result) + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressState.kt b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressState.kt index bda2324f45..3310a772ce 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressState.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressState.kt @@ -31,12 +31,13 @@ data class TransactionExtrasState( val tonMemoState: TonMemoState? = null, val cosmosMemoState: CosmosMemoState? = null, val hederaMemoState: HederaMemoState? = null, + val algorandMemoState: AlgorandMemoState? = null, ) : IdStateHolder { override val stateId: StateId = StateId.TRANSACTION_EXTRAS fun isNull(): Boolean { return xlmMemo == null && binanceMemo == null && xrpDestinationTag == null && tonMemoState == null && - cosmosMemoState == null && hederaMemoState == null + cosmosMemoState == null && hederaMemoState == null && algorandMemoState == null } fun isEmpty(): Boolean { @@ -46,8 +47,15 @@ data class TransactionExtrasState( val isTonEmpty = tonMemoState?.viewFieldValue?.value?.isEmpty() ?: false val isCosmosEmpty = cosmosMemoState?.viewFieldValue?.value?.isEmpty() ?: false val isHederaEmpty = hederaMemoState?.viewFieldValue?.value?.isEmpty() ?: false + val isAlgorandEmpty = algorandMemoState?.viewFieldValue?.value?.isEmpty() ?: false - return isXlmEmpty || isBinanceEmpty || isXrpEmpty || isTonEmpty || isCosmosEmpty || isHederaEmpty + return isXlmEmpty || + isBinanceEmpty || + isXrpEmpty || + isTonEmpty || + isCosmosEmpty || + isHederaEmpty || + isAlgorandEmpty } } @@ -129,6 +137,12 @@ data class HederaMemoState( val error: TransactionExtraError? = null, ) +data class AlgorandMemoState( + val viewFieldValue: InputViewValue = InputViewValue(""), + val memo: String? = null, + val error: TransactionExtraError? = null, +) + enum class TransactionExtraError { INVALID_DESTINATION_TAG, INVALID_XLM_MEMO, diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt b/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt index 4bf8730db7..775a5cc578 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt @@ -243,6 +243,15 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { } .onEach { store.dispatch(TransactionExtrasAction.HederaMemo.HandleUserInput(it)) } .launchIn(mainScope) + + etAlgorandMemo.inputtedTextAsFlow() + .debounce(EDIT_TEXT_INPUT_DEBOUNCE) + .filter { + val info = store.state.sendState.transactionExtrasState + info.algorandMemoState?.viewFieldValue?.value != it + } + .onEach { store.dispatch(TransactionExtrasAction.AlgorandMemo.HandleUserInput(it)) } + .launchIn(mainScope) } private fun onCodeScanned(scannedCode: String) { 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 a2342fb5bf..81899d8e65 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 @@ -75,6 +75,7 @@ internal class SendStateSubscriber( showView(tonMemoContainer, infoState.tonMemoState) showView(cosmosMemoContainer, infoState.cosmosMemoState) showView(hederaMemoContainer, infoState.hederaMemoState) + showView(algorandMemoContainer, infoState.algorandMemoState) infoState.xlmMemo?.let { if (!it.viewFieldValue.isFromUserInput) etXlmMemo.setText(it.viewFieldValue.value) @@ -141,6 +142,16 @@ internal class SendStateSubscriber( etHederaMemo.setText(it.viewFieldValue.value) } } + infoState.algorandMemoState?.let { + if (infoState.algorandMemoState.error != null) { + tilAlgorandMemo.error = fg.getText(R.string.send_extras_error_invalid_memo) + } else { + tilAlgorandMemo.error = null + } + if (!it.viewFieldValue.isFromUserInput) { + etAlgorandMemo.setText(it.viewFieldValue.value) + } + } } @Suppress("ComplexMethod") diff --git a/app/src/main/res/layout/layout_send_address.xml b/app/src/main/res/layout/layout_send_address.xml index dd4b1d9cc2..1256f33037 100644 --- a/app/src/main/res/layout/layout_send_address.xml +++ b/app/src/main/res/layout/layout_send_address.xml @@ -292,6 +292,38 @@ + + + + + + + + + + diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt index 25704e1bf1..76b16b1409 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt @@ -1,6 +1,7 @@ package com.tangem.data.transaction import androidx.core.text.isDigitsOnly +import com.tangem.blockchain.blockchains.algorand.AlgorandTransactionExtras import com.tangem.blockchain.blockchains.binance.BinanceTransactionExtras import com.tangem.blockchain.blockchains.cosmos.CosmosTransactionExtras import com.tangem.blockchain.blockchains.hedera.HederaTransactionBuilder @@ -73,6 +74,7 @@ internal class DefaultTransactionRepository( Blockchain.Cosmos -> CosmosTransactionExtras(memo) Blockchain.TON -> TonTransactionExtras(memo) Blockchain.Hedera -> HederaTransactionBuilder.HederaTransactionExtras(memo) + Blockchain.Algorand -> AlgorandTransactionExtras(memo) else -> null } } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/recipient/SendRecipientMemoFieldConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/recipient/SendRecipientMemoFieldConverter.kt index f3a0cefdd9..1eeffb3762 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/recipient/SendRecipientMemoFieldConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/recipient/SendRecipientMemoFieldConverter.kt @@ -29,6 +29,7 @@ internal class SendRecipientMemoFieldConverter( Blockchain.TerraV2.id, Blockchain.Stellar.id, Blockchain.Hedera.id, + Blockchain.Algorand.id, -> convert(R.string.send_extras_hint_memo) else -> null } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 198e563f67..56e74e1713 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,7 +85,7 @@ web3j = "4.10.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "develop-493" +tangemBlockchainSdk = "develop-495" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "develop-324" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^