From 6caa1a39723fc84e451613ea06e12e4b8c95b1f8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 21 Oct 2020 21:46:37 +0300 Subject: [PATCH 1/2] Updated on 2026-08-14 --- .idea/misc.xml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 .idea/misc.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 7bfef59df1..0000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file From 6a0b1bf62983810b9c75eb687a5c516cc9662358 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 22 Oct 2020 00:52:09 +0300 Subject: [PATCH 2/2] Updated on 2026-08-14 --- app/build.gradle | 3 ++ .../domain/extensions/BlockchainExtensions.kt | 7 +++- .../features/send/redux/SendScreenAction.kt | 10 +++++ .../redux/middlewares/AmountMiddleware.kt | 2 + .../send/redux/middlewares/SendMiddleware.kt | 38 ++++++++++++++----- .../send/redux/reducers/SendScreenReducer.kt | 2 + .../features/send/redux/states/SendState.kt | 4 +- .../send/ui/dialogs/TezosWarningDialog.kt | 29 ++++++++++++++ .../stateSubscribers/SendStateSubscriber.kt | 26 +++++++++++-- .../main/res/values/strings_untranslated.xml | 7 ++++ 10 files changed, 113 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/send/ui/dialogs/TezosWarningDialog.kt create mode 100644 app/src/main/res/values/strings_untranslated.xml diff --git a/app/build.gradle b/app/build.gradle index 491da0a3f7..4d9c559847 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,6 +31,9 @@ android { minifyEnabled false applicationIdSuffix ".dev" signingConfig signingConfigs.debug + firebaseCrashlytics { + mappingFileUploadEnabled false + } } debug_beta { initWith debug diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/BlockchainExtensions.kt b/app/src/main/java/com/tangem/tap/domain/extensions/BlockchainExtensions.kt index b9866e5359..00ad0c17ea 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/BlockchainExtensions.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/BlockchainExtensions.kt @@ -3,6 +3,7 @@ package com.tangem.tap.domain.extensions import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token import org.stellar.sdk.requests.ErrorResponse +import java.math.BigDecimal fun Blockchain.isNoAccountError(exception: Throwable): Boolean { @@ -17,10 +18,14 @@ fun Blockchain.isNoAccountError(exception: Throwable): Boolean { fun Blockchain.amountToCreateAccount(token: Token? = null): Double? { return when (this) { - Blockchain.Stellar -> if (token?.symbol == NODL) 1.5 else 1.toDouble() + Blockchain.Stellar -> if (token?.symbol == NODL) 1.5 else 1.toDouble() Blockchain.XRP -> 20.toDouble() else -> null } } +fun Blockchain.minimalAmount(): BigDecimal { + return 1.toBigDecimal().movePointLeft(decimals()) +} + private const val NODL = "NODL" \ No newline at end of file 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 b0ed6c6bf4..e78fb3a81a 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 @@ -2,6 +2,7 @@ package com.tangem.tap.features.send.redux import com.tangem.Message import com.tangem.blockchain.common.Amount +import com.tangem.tangem_sdk_new.ui.animation.VoidCallback import com.tangem.tap.common.redux.ErrorAction import com.tangem.tap.common.redux.ToastNotificationAction import com.tangem.tap.domain.TapError @@ -114,4 +115,13 @@ sealed class SendAction : SendScreenAction { } data class SendError(override val error: TapError) : SendAction(), ErrorAction + + sealed class Dialog : SendAction() { + data class ShowTezosWarningDialog( + val reduceCallback: VoidCallback, + val sendAllCallback: VoidCallback, + val reduceAmount: BigDecimal, + ) : Dialog() + object Hide : Dialog() + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AmountMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AmountMiddleware.kt index 389822d53a..08dc775fba 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AmountMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AmountMiddleware.kt @@ -1,6 +1,7 @@ package com.tangem.tap.features.send.redux.middlewares import com.tangem.blockchain.common.Amount +import com.tangem.blockchain.common.TransactionError import com.tangem.common.extensions.isZero import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.send.redux.* @@ -59,6 +60,7 @@ class AmountMiddleware { val amountToSend = Amount(typedAmount, sendState.getTotalAmountToSend(inputCrypto)) val transactionErrors = walletManager.validateTransaction(amountToSend, sendState.feeState.currentFee) + transactionErrors.remove(TransactionError.TezosSendAll) if (transactionErrors.isEmpty()) { dispatch(AmountAction.SetAmountError(null)) } else { 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 45547fd2bc..03e3ba943c 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 @@ -9,11 +9,9 @@ import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.TapError -import com.tangem.tap.features.send.redux.AddressPayIdActionUi -import com.tangem.tap.features.send.redux.AmountActionUi +import com.tangem.tap.domain.extensions.minimalAmount +import com.tangem.tap.features.send.redux.* import com.tangem.tap.features.send.redux.FeeAction.RequestFee -import com.tangem.tap.features.send.redux.SendAction -import com.tangem.tap.features.send.redux.SendActionUi import com.tangem.tap.features.send.redux.states.SendButtonState import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.scope @@ -55,12 +53,35 @@ private fun verifyAndSendTransaction( val amountToSend = Amount(typedAmount, sendState.getTotalAmountToSend()) - val verifyResult = walletManager.validateTransaction(amountToSend, feeAmount) - if (verifyResult.isNotEmpty()) { - dispatch(SendAction.SendError(createValidateTransactionError(verifyResult, walletManager))) - return + val transactionErrors = walletManager.validateTransaction(amountToSend, feeAmount) + val hadTezosError = transactionErrors.remove(TransactionError.TezosSendAll) + when { + hadTezosError -> { + val reduceAmount = walletManager.wallet.blockchain.minimalAmount() + dispatch(SendAction.Dialog.ShowTezosWarningDialog(reduceCallback = { + dispatch(AmountAction.SetAmount(typedAmount.value!!.minus(reduceAmount), false)) + dispatch(AmountActionUi.CheckAmountToSend) + }, sendAllCallback = { + sendTransaction(action, walletManager, amountToSend, feeAmount, recipientAddress, dispatch) + }, reduceAmount)) + } + transactionErrors.isNotEmpty() -> { + dispatch(SendAction.SendError(createValidateTransactionError(transactionErrors, walletManager))) + } + else -> { + sendTransaction(action, walletManager, amountToSend, feeAmount, recipientAddress, dispatch) + } } +} +private fun sendTransaction( + action: SendActionUi.SendAmountToRecipient, + walletManager: WalletManager, + amountToSend: Amount, + feeAmount: Amount, + recipientAddress: String, + dispatch: (Action) -> Unit +) { dispatch(SendAction.ChangeSendButtonState(SendButtonState.PROGRESS)) val txData = walletManager.createTransaction(amountToSend, feeAmount, recipientAddress) scope.launch { @@ -111,7 +132,6 @@ private fun verifyAndSendTransaction( dispatch(SendAction.ChangeSendButtonState(SendButtonState.ENABLED)) } } - } fun extractErrorsForAmountField(errors: EnumSet): EnumSet { 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 d09cb9b695..e7454abcc1 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 @@ -41,6 +41,8 @@ private class SendReducer : SendInternalReducer { override fun handle(action: SendScreenAction, sendState: SendState): SendState { val result = when (action) { is SendAction.ChangeSendButtonState -> sendState.copy(sendButtonState = action.state) + is SendAction.Dialog.ShowTezosWarningDialog -> sendState.copy(dialog = action) + is SendAction.Dialog.Hide -> sendState.copy(dialog = null) else -> return sendState } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/states/SendState.kt b/app/src/main/java/com/tangem/tap/features/send/redux/states/SendState.kt index 8dcb140ce5..68954619a6 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/states/SendState.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/states/SendState.kt @@ -8,6 +8,7 @@ import com.tangem.tap.common.CurrencyConverter import com.tangem.tap.common.entities.TapCurrency import com.tangem.tap.common.text.DecimalDigitsInputFilter import com.tangem.tap.domain.TapError +import com.tangem.tap.features.send.redux.SendAction import com.tangem.tap.store import org.rekotlin.StateType import java.math.BigDecimal @@ -35,7 +36,8 @@ data class SendState( val amountState: AmountState = AmountState(), val feeState: FeeState = FeeState(), val receiptState: ReceiptState = ReceiptState(), - val sendButtonState: SendButtonState = SendButtonState.DISABLED + val sendButtonState: SendButtonState = SendButtonState.DISABLED, + val dialog: SendAction.Dialog? = null ) : SendScreenState { override val stateId: StateId = StateId.SEND_SCREEN diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/TezosWarningDialog.kt b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/TezosWarningDialog.kt new file mode 100644 index 0000000000..45b092ea8c --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/TezosWarningDialog.kt @@ -0,0 +1,29 @@ +package com.tangem.tap.features.send.ui.dialogs + +import android.content.Context +import androidx.appcompat.app.AlertDialog +import com.tangem.tap.features.send.redux.SendAction +import com.tangem.tap.store +import com.tangem.wallet.R + +class TezosWarningDialog(context: Context) : AlertDialog(context) { + + companion object { + fun create(context: Context, showDialogData: SendAction.Dialog.ShowTezosWarningDialog): AlertDialog { + val reduceAmount = showDialogData.reduceAmount.toPlainString() + return Builder(context).apply { + setTitle(context.getString(R.string.common_warning)) + setMessage(context.getString(R.string.xtz_withdrawal_message_warning, reduceAmount)) + setNegativeButton(R.string.xtz_withdrawal_message_ignore) { _, _ -> + showDialogData.sendAllCallback() + } + setPositiveButton(context.getString(R.string.xtz_withdrawal_message_reduce, reduceAmount)) { _, _ -> + showDialogData.reduceCallback() + } + 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 a88d5ca461..0e266fcc54 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 @@ -1,5 +1,6 @@ package com.tangem.tap.features.send.ui.stateSubscribers +import android.app.Dialog import android.content.Context import android.text.SpannableStringBuilder import android.view.ViewGroup @@ -16,10 +17,12 @@ import com.tangem.tap.domain.assembleErrors import com.tangem.tap.features.send.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.reducers.ReceiptReducer import com.tangem.tap.features.send.redux.states.* import com.tangem.tap.features.send.ui.FeeUiHelper import com.tangem.tap.features.send.ui.SendFragment +import com.tangem.tap.features.send.ui.dialogs.TezosWarningDialog import com.tangem.tap.store import com.tangem.wallet.R import kotlinx.android.synthetic.main.btn_expand_collapse.* @@ -37,6 +40,8 @@ import kotlinx.android.synthetic.main.layout_send_receipt.* */ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber(fragment) { + private var dialog: Dialog? = null + override fun updateWithNewState(fg: BaseStoreFragment, state: SendState) { val lastChangedStates = state.lastChangedStates.toList() state.lastChangedStates.clear() @@ -54,6 +59,19 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber private fun handleSendScreen(fg: BaseStoreFragment, state: SendState) { val sendFragment = (fg as? SendFragment) ?: return + when (state.dialog) { + is SendAction.Dialog.ShowTezosWarningDialog -> { + if (dialog == null) { + dialog = TezosWarningDialog.create(fg.requireContext(), state.dialog) + dialog?.show() + } + } + else -> { + dialog?.dismiss() + dialog = null + } + } + when (state.sendButtonState) { SendButtonState.ENABLED -> { fg.btnSend.isEnabled = true @@ -235,10 +253,10 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber totalLayout.tvTotalValue.update("${roughOrEmpty(receipt.totalFiat)} ${receipt.symbols.fiat}") val willSent = getString( - R.string.send_total_subtitle_asset_format, - receipt.symbols.token ?: "", receipt.willSentToken, - receipt.symbols.crypto, receipt.willSentFeeCoin - ) + R.string.send_total_subtitle_asset_format, + receipt.symbols.token ?: "", receipt.willSentToken, + receipt.symbols.crypto, receipt.willSentFeeCoin + ) totalLayout.tvWillBeSentValue.update(willSent) } ReceiptLayoutType.TOKEN_CRYPTO -> { diff --git a/app/src/main/res/values/strings_untranslated.xml b/app/src/main/res/values/strings_untranslated.xml new file mode 100644 index 0000000000..ee920115aa --- /dev/null +++ b/app/src/main/res/values/strings_untranslated.xml @@ -0,0 +1,7 @@ + + + To avoid paying an increased commission the next time you top up your wallet, reduce the amount by %s XTZ + Reduce by %s XTZ + No, send all + +