diff --git a/app/build.gradle b/app/build.gradle index 10d64081b7..cfc98ae2b9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,7 @@ android { } debug_beta { initWith release + debuggable true versionNameSuffix "-beta" applicationIdSuffix ".debug" buildConfigField 'String', 'CONFIG_ENVIRONMENT', '\"prod\"' diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt b/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt index d470ae2bf6..be71883ecc 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Picasso.kt @@ -15,9 +15,8 @@ fun Picasso.loadCurrenciesIcon( imageView: ImageView, textView: TextView, token: Token? = null, - blockchain: Blockchain?, + blockchain: Blockchain, ) { - val blockchain = blockchain ?: Blockchain.Ethereum val url = if (token != null) { IconsUtil.getTokenIconUri(blockchain, token) 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 b0b9263034..2ed9fe33e0 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 @@ -58,6 +58,10 @@ sealed class TransactionExtrasAction : SendScreenActionUi { data class HandleUserInput(val data: String) : XlmMemo() } + sealed class BinanceMemo : TransactionExtrasAction() { + data class HandleUserInput(val data: String) : BinanceMemo() + } + sealed class XrpDestinationTag : TransactionExtrasAction() { data class HandleUserInput(val data: String) : XrpDestinationTag() } 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 6ecd4514d4..4215143301 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 @@ -14,7 +14,8 @@ class TransactionExtrasReducer : SendInternalReducer { return when (action) { is Prepare -> handleInitialization(action, sendState) Release -> handleRelease(action, sendState) - is XlmMemo -> handleMemo(action, sendState, sendState.transactionExtrasState) + is XlmMemo -> handleXlmMemo(action, sendState, sendState.transactionExtrasState) + is BinanceMemo -> handleBinanceMemo(action, sendState, sendState.transactionExtrasState) is XrpDestinationTag -> handleXrpTag(action, sendState, sendState.transactionExtrasState) else -> sendState } @@ -40,6 +41,7 @@ class TransactionExtrasReducer : SendInternalReducer { } } Blockchain.Stellar -> TransactionExtrasState(xlmMemo = XlmMemoState()) + Blockchain.Binance -> TransactionExtrasState(binanceMemo = BinanceMemoState()) else -> emptyResult } return updateLastState(sendState.copy(transactionExtrasState = result), result) @@ -50,7 +52,7 @@ class TransactionExtrasReducer : SendInternalReducer { return updateLastState(sendState.copy(transactionExtrasState = result), result) } - private fun handleMemo( + private fun handleXlmMemo( action: XlmMemo, sendState: SendState, infoState: TransactionExtrasState, @@ -94,6 +96,26 @@ class TransactionExtrasReducer : SendInternalReducer { return updateLastState(sendState.copy(transactionExtrasState = result), result) } + private fun handleBinanceMemo( + action: BinanceMemo, + sendState: SendState, + infoState: TransactionExtrasState, + ): SendState { + val result = when (action) { + is BinanceMemo.HandleUserInput -> { + val tag = action.data.toBigIntegerOrNull() + if (tag != null) { + val input = InputViewValue(action.data, true) + val tagState = BinanceMemoState(input, tag) + infoState.copy(binanceMemo = tagState) + } else { + infoState + } + } + } + return updateLastState(sendState.copy(transactionExtrasState = result), result) + } + private fun handleXrpTag( action: XrpDestinationTag, sendState: SendState, diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt index 4f2e4e1a6d..e4f816c106 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt @@ -27,6 +27,7 @@ data class AddressPayIdState( data class TransactionExtrasState( val xlmMemo: XlmMemoState? = null, + val binanceMemo: BinanceMemoState? = null, val xrpDestinationTag: XrpDestinationTagState? = null ) : IdStateHolder { override val stateId: StateId = StateId.TRANSACTION_EXTRAS @@ -54,6 +55,16 @@ data class XlmMemoState( } } +data class BinanceMemoState( + val viewFieldValue: InputViewValue = InputViewValue(""), + val memo: BigInteger? = null, + val error: TransactionExtraError? = null + ) { + companion object { + val MAX_NUMBER: BigInteger = BigInteger("FFFFFFFFFFFFFFFF", 16) + } +} + // tag must contains only digits data class XrpDestinationTagState( val viewFieldValue: InputViewValue = InputViewValue(""), @@ -67,5 +78,6 @@ data class XrpDestinationTagState( enum class TransactionExtraError { INVALID_DESTINATION_TAG, - INVALID_XLM_MEMO + INVALID_XLM_MEMO, + INVALID_BINANCE_MEMO } \ No newline at end of file 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 4d9528605a..1f91fb98cb 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 @@ -115,7 +115,7 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { } private fun setupTransactionExtrasLayout() { - etMemo.inputtedTextAsFlow() + etXlmMemo.inputtedTextAsFlow() .debounce(400) .filter { val info = store.state.sendState.transactionExtrasState @@ -132,6 +132,15 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { } .onEach { store.dispatch(TransactionExtrasAction.XrpDestinationTag.HandleUserInput(it)) } .launchIn(mainScope) + + etBinanceMemo.inputtedTextAsFlow() + .debounce(400) + .filter { + val info = store.state.sendState.transactionExtrasState + info.binanceMemo?.viewFieldValue?.value != it + } + .onEach { store.dispatch(TransactionExtrasAction.BinanceMemo.HandleUserInput(it)) } + .launchIn(mainScope) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 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 49faa587ea..b90c53e080 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 @@ -65,19 +65,20 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber } showView(fg.xlmMemoContainer, infoState.xlmMemo) showView(fg.xrpDestinationTagContainer, infoState.xrpDestinationTag) + showView(fg.binanceMemoContainer, infoState.binanceMemo) infoState.xlmMemo?.let { - fg.etMemo.inputType = when (it.selectedMemoType) { + fg.etXlmMemo.inputType = when (it.selectedMemoType) { XlmMemoType.TEXT -> InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS XlmMemoType.ID -> InputType.TYPE_CLASS_NUMBER } - if (!it.viewFieldValue.isFromUserInput) fg.etMemo.setText(it.viewFieldValue.value) + if (!it.viewFieldValue.isFromUserInput) fg.etXlmMemo.setText(it.viewFieldValue.value) if (it.error != null) { if (it.error == TransactionExtraError.INVALID_XLM_MEMO) { - fg.tilMemo.error = fg.getText(R.string.send_error_invalid_memo_id) + fg.tilXlmMemo.error = fg.getText(R.string.send_error_invalid_memo_id) } } else { - fg.tilMemo.error = null + fg.tilXlmMemo.error = null } } infoState.xrpDestinationTag?.let { @@ -92,6 +93,18 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber fg.etDestinationTag.setText(it.viewFieldValue.value) } } + infoState.binanceMemo?.let { + if (infoState.binanceMemo.error != null) { + if (infoState.binanceMemo.error == TransactionExtraError.INVALID_BINANCE_MEMO) { + fg.tilBinanceMemo.error = fg.getText(R.string.send_error_invalid_memo_id) + } + } else { + fg.tilBinanceMemo.error = null + } + if (!it.viewFieldValue.isFromUserInput) { + fg.etBinanceMemo.setText(it.viewFieldValue.value) + } + } } private fun handleSendScreen(fg: BaseStoreFragment, state: SendState) { 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 154f46bd8a..41a3dc9258 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 @@ -145,7 +145,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), StoreS Picasso.get().loadCurrenciesIcon( imageView = iv_currency, textView = tv_token_letter, - blockchain = wallet.currency?.blockchain, + blockchain = wallet.currency.blockchain, token = (wallet.currency as? Currency.Token)?.token ) } 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 f804f6acef..4d96d05004 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 @@ -63,7 +63,7 @@ class WalletAdapter view.card_wallet.setOnClickListener { store.dispatch(WalletAction.MultiWallet.SelectWallet(wallet)) } - val blockchain = wallet.currency?.blockchain + val blockchain = wallet.currency.blockchain val token = (wallet.currency as? Currency.Token)?.token Picasso.get().loadCurrenciesIcon( diff --git a/app/src/main/res/layout/layout_send_address_payid.xml b/app/src/main/res/layout/layout_send_address_payid.xml index 2b0f046335..232b778f22 100644 --- a/app/src/main/res/layout/layout_send_address_payid.xml +++ b/app/src/main/res/layout/layout_send_address_payid.xml @@ -140,7 +140,7 @@ + + + + + + + + + +