From 176d3d5ce19b85f881f5f6825999e04811b862b8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 18 Feb 2021 11:34:37 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../middlewares/AddressPayIdMiddleware.kt | 20 ++++++++++++------- .../tap/features/send/ui/SendFragment.kt | 11 +++++++--- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressPayIdMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressPayIdMiddleware.kt index 900c790986..e9beba0bc0 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressPayIdMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/AddressPayIdMiddleware.kt @@ -129,6 +129,9 @@ internal class AddressPayIdMiddleware { val failReason = isValidBlockchainAddressAndNotTheSameAsWallet(wallet, supposedAddress) if (failReason == null) { + noSchemeAddress.getQueryParameter("amount")?.let { + if (it.isDigitsOnly()) dispatch(AmountAction.SetAmount(it.toBigDecimal(), false)) + } dispatch(SetWalletAddress(supposedAddress, isUserInput)) dispatch(TransactionExtrasAction.Prepare(wallet.blockchain, address, null)) } else { @@ -149,14 +152,10 @@ internal class AddressPayIdMiddleware { } } - //TODO: move to the blockchainSDK - private fun extractAddressFromShareUri(shareUri: String): String { - val sharePrefix = listOf("bitcoin:", "ethereum:", "xrpl:", "litecoin:", "bnb:") - val prefixes = sharePrefix.filter { shareUri.contains(it) } - return if (prefixes.isEmpty()) shareUri else shareUri.replace(prefixes[0], "") - } - private fun String.removeShareUriQuery(): String = this.substringBefore("?") + private fun String.getQueryParameter(name: String): String? { + return this.substringAfter("?").splitToMap("&", "=")[name] + } private fun verifyClipboard(input: String?, appState: AppState?, dispatch: DispatchFunction) { val addressPayId = input ?: return @@ -184,4 +183,11 @@ internal class AddressPayIdMiddleware { private fun isPayIdEnabled(): Boolean { return store.state.globalState.configManager?.config?.isSendingToPayIdEnabled ?: false } +} + +fun String.splitToMap(firstDelimiter: String, secondDelimiter: String): Map { + return this.split(firstDelimiter) + .map { it.split(secondDelimiter) } + .map { it.first() to it.last().toString() } + .toMap() } \ 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 874e744207..6dae105162 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 @@ -139,9 +139,14 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { val scannedCode = data?.getStringExtra(ScanQrCodeActivity.SCAN_RESULT) ?: "" if (scannedCode.isEmpty()) return - store.dispatch(PasteAddressPayId(scannedCode)) - store.dispatch(TruncateOrRestore(!etAddressOrPayId.isFocused)) - store.dispatch(FeeAction.RequestFee) + // Delayed launch is needed in order for the UI to be drawn and to process the sent events. + // If do not use the delay, then etAmount error field is not displayed when + // inserting an incorrect amount by shareUri + imvQrCode.postDelayed({ + store.dispatch(PasteAddressPayId(scannedCode)) + store.dispatch(TruncateOrRestore(!etAddressOrPayId.isFocused)) + store.dispatch(FeeAction.RequestFee) + }, 200) } private fun setupAmountLayout() {