From a708c91a86f4f82da42a5726d1c04f6d971f2113 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 20 Jan 2021 22:04:44 +0300 Subject: [PATCH 01/16] Updated on 2026-08-14 --- app/build.gradle | 2 +- .../middlewares/AddressPayIdMiddleware.kt | 21 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e35b177dba..1d97ac961f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -71,7 +71,7 @@ dependencies { implementation 'com.google.android.material:material:1.2.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' - implementation 'com.tangem:blockchain:1.123.0' + implementation 'com.tangem:blockchain:1.130.0' implementation 'com.tangem:core:1.90.0' implementation 'com.tangem:sdk:1.90.0' 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 4380bdbf49..4318957996 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 @@ -105,7 +105,24 @@ internal class AddressPayIdMiddleware { } private fun verifyAddress(address: String, wallet: Wallet, isUserInput: Boolean, dispatch: (Action) -> Unit) { - val supposedAddress = extractAddressFromShareUri(address).removeNonAddressData() + val addressSchemeSplit = address.split(":") + val noSchemeAddress = when (addressSchemeSplit.size) { + 1 -> address // no scheme + 2 -> { // scheme + if (wallet.blockchain.validateShareScheme(addressSchemeSplit[0])) { + addressSchemeSplit[1] + } else { + dispatch(SetAddressError(Error.ADDRESS_INVALID_OR_UNSUPPORTED_BY_BLOCKCHAIN)) + return + } + } + else -> { // invalid URI + dispatch(SetAddressError(Error.ADDRESS_INVALID_OR_UNSUPPORTED_BY_BLOCKCHAIN)) + return + } + } + + val supposedAddress = noSchemeAddress.removeShareUriQuery() //TODO: parse query? val failReason = isValidBlockchainAddressAndNotTheSameAsWallet(wallet, supposedAddress) if (failReason == null) { @@ -134,7 +151,7 @@ internal class AddressPayIdMiddleware { return if (prefixes.isEmpty()) shareUri else shareUri.replace(prefixes[0], "") } - private fun String.removeNonAddressData(): String = this.substringBefore("?") + private fun String.removeShareUriQuery(): String = this.substringBefore("?") private fun verifyClipboard(input: String?, appState: AppState?, dispatch: DispatchFunction) { val addressPayId = input ?: return From 6d7d3060b29246d12ec65c838cd48057b037b0d3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 22 Jan 2021 22:54:14 +0300 Subject: [PATCH 02/16] Updated on 2026-08-14 --- .../tap/features/wallet/redux/WalletState.kt | 8 ++-- .../tap/features/wallet/ui/WalletFragment.kt | 40 +++++++++++++------ app/src/main/res/layout/layout_address.xml | 8 ++-- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 23157af53e..ec4c134bab 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -32,11 +32,13 @@ data class WalletState( currencyData.status != com.tangem.tap.features.wallet.ui.BalanceStatus.EmptyCard && currencyData.status != com.tangem.tap.features.wallet.ui.BalanceStatus.UnknownBlockchain - val showSegwitAddress: Boolean + val showMultipleAddress: Boolean get() { val listOfAddresses = walletAddresses?.list ?: return false - return (wallet?.blockchain == Blockchain.Bitcoin || wallet?.blockchain == Blockchain.BitcoinTestnet) - && listOfAddresses.size > 1 + return (wallet?.blockchain == Blockchain.Bitcoin || + wallet?.blockchain == Blockchain.BitcoinTestnet || + wallet?.blockchain == Blockchain.CardanoShelley) && + listOfAddresses.size > 1 } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index d08504c50b..7dd3bef7a9 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -12,6 +12,8 @@ import androidx.transition.TransitionInflater import com.google.android.material.snackbar.Snackbar import com.squareup.picasso.Picasso import com.tangem.blockchain.blockchains.bitcoin.BitcoinAddressType +import com.tangem.blockchain.blockchains.cardano.CardanoAddressType +import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.address.AddressType import com.tangem.tap.common.extensions.* import com.tangem.tap.common.redux.navigation.AppScreen @@ -229,27 +231,27 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber + chip_group_address_type.setOnCheckedChangeListener { group, checkedId -> if (checkedId == -1) return@setOnCheckedChangeListener - SegwitUiHelper.idToType(checkedId)?.let { + MultipleAddressUiHelper.idToType(checkedId, state.wallet?.blockchain)?.let { store.dispatch(WalletAction.ChangeSelectedAddress(it)) } } } else { tv_address.setPadding(tv_address.paddingStart, tvAddressPaddingTop, tv_address.paddingEnd, tv_address.paddingBottom) - chip_group_segwit.hide() + chip_group_address_type.hide() } tv_address.text = state.walletAddresses.selectedAddress.address tv_explore?.setOnClickListener { @@ -332,20 +334,34 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber R.id.chip_legacy is BitcoinAddressType.Segwit -> R.id.chip_default + is CardanoAddressType.Byron -> R.id.chip_legacy + is CardanoAddressType.Shelley -> R.id.chip_default else -> View.NO_ID } } - fun idToType(id: Int): AddressType? { + fun idToType(id: Int, blockchain: Blockchain?): AddressType? { return when (id) { - R.id.chip_default -> BitcoinAddressType.Segwit - R.id.chip_legacy -> BitcoinAddressType.Legacy + R.id.chip_default -> { + when (blockchain) { + Blockchain.Bitcoin -> BitcoinAddressType.Segwit + Blockchain.CardanoShelley -> CardanoAddressType.Shelley + else -> null + } + } + R.id.chip_legacy -> { + when (blockchain) { + Blockchain.Bitcoin -> BitcoinAddressType.Legacy + Blockchain.CardanoShelley -> CardanoAddressType.Byron + else -> null + } + } else -> null } } diff --git a/app/src/main/res/layout/layout_address.xml b/app/src/main/res/layout/layout_address.xml index f707e8936e..f595eeccd7 100644 --- a/app/src/main/res/layout/layout_address.xml +++ b/app/src/main/res/layout/layout_address.xml @@ -24,7 +24,7 @@ android:layout_height="wrap_content"> + app:layout_constraintTop_toBottomOf="@id/chip_group_address_type"> + app:layout_constraintTop_toBottomOf="@id/chip_group_address_type"> Date: Thu, 4 Feb 2021 18:22:38 +0300 Subject: [PATCH 03/16] Updated on 2026-08-14 --- .../tap/common/redux/global/GlobalAction.kt | 2 ++ .../tap/common/redux/global/GlobalReducer.kt | 19 +++++++++++++++++++ .../details/redux/DetailsMiddleware.kt | 3 +++ 3 files changed, 24 insertions(+) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index 9fb73bdfcb..fc4f5bba9e 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -2,6 +2,7 @@ package com.tangem.tap.common.redux.global import com.tangem.tap.domain.config.ConfigManager import com.tangem.tap.domain.tasks.ScanNoteResponse +import com.tangem.tap.features.details.redux.SecurityOption import org.rekotlin.Action import java.math.BigDecimal @@ -17,4 +18,5 @@ sealed class GlobalAction : Action { } data class UpdateWalletSignedHashes(val walletSignedHashes: Int?) : GlobalAction() data class SetConfigManager(val configManager: ConfigManager) : GlobalAction() + data class UpdateSecurityOptions(val securityOption: SecurityOption) : GlobalAction() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt index 2b27751177..7ab9334181 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt @@ -1,6 +1,7 @@ package com.tangem.tap.common.redux.global import com.tangem.tap.common.redux.AppState +import com.tangem.tap.features.details.redux.SecurityOption import org.rekotlin.Action fun globalReducer(action: Action, state: AppState): GlobalState { @@ -36,6 +37,24 @@ fun globalReducer(action: Action, state: AppState): GlobalState { is GlobalAction.SetConfigManager -> { globalState.copy(configManager = action.configManager) } + is GlobalAction.UpdateSecurityOptions -> { + val card = when (action.securityOption) { + SecurityOption.LongTap -> globalState.scanNoteResponse?.card?.copy( + isPin1Default = true, isPin2Default = true + ) + SecurityOption.PassCode -> globalState.scanNoteResponse?.card?.copy( + isPin1Default = true, isPin2Default = false + ) + SecurityOption.AccessCode -> globalState.scanNoteResponse?.card?.copy( + isPin1Default = false, isPin2Default = true + ) + } + if (card != null) { + globalState.copy(scanNoteResponse = globalState.scanNoteResponse?.copy(card = card)) + } else { + globalState + } + } else -> globalState } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index d603c66c39..95a0a3952c 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -140,6 +140,9 @@ class DetailsMiddleware { withContext(Dispatchers.Main) { when (result) { is CompletionResult.Success -> { + selectedOption?.let { + store.dispatch(GlobalAction.UpdateSecurityOptions(it)) + } if (selectedOption != SecurityOption.LongTap) { store.dispatch(NavigationAction.PopBackTo()) } From 15fa6b984cac54843d4fb4a4a465a4574606a617 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 5 Feb 2021 14:52:22 +0300 Subject: [PATCH 04/16] Updated on 2026-08-14 --- .../features/details/redux/DetailsReducer.kt | 45 ++++--- .../details/ui/DetailsSecurityFragment.kt | 4 + .../res/layout/fragment_details_security.xml | 110 ++++++++++-------- 3 files changed, 92 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt index 593f31d21f..805d31f8c9 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt @@ -144,23 +144,8 @@ private fun handleSecurityAction( allowedOptions = EnumSet.noneOf(SecurityOption::class.java) )) } - val prohibitDefaultPin = state.card.settingsMask?.contains(Settings.ProhibitDefaultPIN1) == true - val allowSetPin1 = state.card.settingsMask?.contains(Settings.AllowSetPIN1) != false - val allowSetPin2 = state.card.settingsMask?.contains(Settings.AllowSetPIN2) != false - val isDefaultPin1 = state.card.isPin1Default != false - val isDefaultPin2 = state.card.isPin2Default != false - - val allowedSecurityOptions = EnumSet.noneOf(SecurityOption::class.java) - if ((isDefaultPin1 && isDefaultPin2) || !prohibitDefaultPin) { - allowedSecurityOptions.add(SecurityOption.LongTap) - } - if (allowSetPin1 && (isDefaultPin2 || !prohibitDefaultPin)) { - allowedSecurityOptions.add(SecurityOption.AccessCode) - } - if (allowSetPin2 && (isDefaultPin1 || !prohibitDefaultPin)) { - allowedSecurityOptions.add(SecurityOption.PassCode) - } + val allowedSecurityOptions = prepareAllowedSecurityOptions(state.card) state.copy(securityScreenState = state.securityScreenState?.copy( allowedOptions = allowedSecurityOptions, selectedOption = state.securityScreenState.currentOption @@ -180,15 +165,37 @@ private fun handleSecurityAction( state.copy(confirmScreenState = confirmScreenState) } is DetailsAction.ManageSecurity.SaveChanges.Success -> { - state.copy(securityScreenState = state.securityScreenState?.copy( - currentOption = state.securityScreenState.selectedOption - )) + // Setting options to show only LongTap from now on + state.copy( + card = state.card?.copy(isPin1Default = true, isPin2Default = true), + securityScreenState = state.securityScreenState?.copy( + currentOption = state.securityScreenState.selectedOption, + allowedOptions = EnumSet.of(SecurityOption.LongTap) + )) } else -> state } } +private fun prepareAllowedSecurityOptions(card: Card): EnumSet { + val prohibitDefaultPin = card.settingsMask?.contains(Settings.ProhibitDefaultPIN1) == true + val isDefaultPin1 = card.isPin1Default != false + val isDefaultPin2 = card.isPin2Default != false + + val allowedSecurityOptions = EnumSet.noneOf(SecurityOption::class.java) + if ((isDefaultPin1 && isDefaultPin2) || !prohibitDefaultPin) { + allowedSecurityOptions.add(SecurityOption.LongTap) + } + if (!isDefaultPin1) { + allowedSecurityOptions.add(SecurityOption.AccessCode) + } + if (!isDefaultPin2) { + allowedSecurityOptions.add(SecurityOption.PassCode) + } + return allowedSecurityOptions +} + private fun Card.toCardInfo(): CardInfo? { val cardId = this.cardId.chunked(4).joinToString(separator = " ") diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/DetailsSecurityFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/DetailsSecurityFragment.kt index caa822e069..fe017dfec7 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/DetailsSecurityFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/DetailsSecurityFragment.kt @@ -5,6 +5,7 @@ import android.view.View import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment import androidx.transition.TransitionInflater +import com.tangem.tap.common.extensions.show import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.details.redux.DetailsAction import com.tangem.tap.features.details.redux.DetailsState @@ -91,6 +92,7 @@ class DetailsSecurityFragment : Fragment(R.layout.fragment_details_security), } private fun enableLongTap(enable: Boolean) { + group_long_tap.show(enable) val alpha = if (enable) 1f else 0.5f tv_long_tap_description.alpha = alpha tv_long_tap_title.alpha = alpha @@ -105,6 +107,7 @@ class DetailsSecurityFragment : Fragment(R.layout.fragment_details_security), } private fun enablePasscode(enable: Boolean) { + group_passcode.show(enable) val alpha = if (enable) 1f else 0.5f tv_passcode_description.alpha = alpha tv_passcode_title.alpha = alpha @@ -119,6 +122,7 @@ class DetailsSecurityFragment : Fragment(R.layout.fragment_details_security), } private fun enableAccessCode(enable: Boolean) { + group_access_code.show(enable) val alpha = if (enable) 1f else 0.5f tv_access_code_description.alpha = alpha tv_access_code_title.alpha = alpha diff --git a/app/src/main/res/layout/fragment_details_security.xml b/app/src/main/res/layout/fragment_details_security.xml index 1dd8549df9..3e232e82d8 100644 --- a/app/src/main/res/layout/fragment_details_security.xml +++ b/app/src/main/res/layout/fragment_details_security.xml @@ -20,154 +20,168 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - app:title="@string/details_row_title_manage_security" - app:navigationIcon="@drawable/ic_baseline_arrow_back_24" /> + app:navigationIcon="@drawable/ic_baseline_arrow_back_24" + app:title="@string/details_row_title_manage_security" /> - + + + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/tv_long_tap_title" /> + app:layout_constraintBottom_toBottomOf="@id/tv_long_tap_description" + app:layout_constraintTop_toTopOf="@id/tv_long_tap_title" /> + + + + app:layout_constraintTop_toBottomOf="@id/v_long_tap" /> + app:layout_constraintTop_toTopOf="@id/v_passcode" /> + app:layout_constraintTop_toBottomOf="@id/tv_passcode_title" /> + app:layout_constraintBottom_toBottomOf="@id/tv_passcode_description" + app:layout_constraintTop_toTopOf="@id/tv_passcode_title" /> + + app:layout_constraintTop_toBottomOf="@id/v_passcode" /> + app:layout_constraintTop_toTopOf="@id/v_access_code" /> + app:layout_constraintTop_toBottomOf="@id/tv_access_code_title" /> + app:layout_constraintBottom_toBottomOf="@id/tv_access_code_description" + app:layout_constraintTop_toTopOf="@id/tv_access_code_title" /> + app:layout_constraintStart_toEndOf="@+id/guideline" /> From fe486a81211dc27ba1aa64a677ca7da33accc96c Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 8 Feb 2021 14:38:17 +0300 Subject: [PATCH 05/16] Updated on 2026-08-14 --- app/build.gradle | 4 ++-- app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt | 2 +- dependencies.gradle | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cb0e83d439..4256b77901 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -72,8 +72,8 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' implementation 'com.tangem:blockchain:1.130.0' - implementation 'com.tangem:core:1.92.0' - implementation 'com.tangem:sdk:1.92.0' + implementation 'com.tangem:core:1.96.0' + implementation 'com.tangem:sdk:1.96.0' // WebView implementation "androidx.browser:browser:1.2.0" diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt index dfa1752929..66c4238850 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt @@ -76,7 +76,7 @@ class ScanNoteTask(val card: Card? = null) : CardSessionRunnable { - callback(CompletionResult.Failure(TangemSdkError.VerificationFailed())) + callback(CompletionResult.Failure(TangemSdkError.CardVerificationFailed())) } } } diff --git a/dependencies.gradle b/dependencies.gradle index 90e2ab6cfd..ed2e48ec9d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,4 +1,4 @@ ext.versions = [ kotlin : '1.4.10', - build_gradle: '4.1.1', + build_gradle: '4.1.2', ] From 3e34740260edb0ebe3e1bac44e54fbd954e8afe1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 8 Feb 2021 14:46:23 +0300 Subject: [PATCH 06/16] Updated on 2026-08-14 --- app/src/main/res/values-it/strings.xml | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 08315d8822..1d53fde617 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -11,12 +11,12 @@ Non hai fornito l\'accesso alla tua videocamera, modifica le tue impostazioni sulla privacy Impostazioni Benvenuti in Tangem. Hai una delle nostre schede?> - Benevenuti di nuovo su Tangem Tap. Scansiona la tua scheda per iniziare. - Si! Scansiona scheda. + Benevenuti di nuovo su Tangem Tap. Scansiona la tua carta per iniziare. + Si! Scansiona carta. Shop - Preparati ad avvicinare la tua scheda sul retro del telefono. + Preparati ad avvicinare la tua carta sul retro del telefono. Avvicina - Scansiona scheda + Scansiona carta Scansiona Invia Crea portafoglio @@ -29,10 +29,10 @@ Blockchain non raggiungibile Conto non creato Carica %1$s+ %2$s per creare un conto - Scheda vuota - Crea un portafoglio per iniziare ad utilizzare la tua scheda Tangem - Questa scheda non è supportata - La tua scheda Tangem è stata creata per funzionare con un\'altra applicazione. Leggere il nome e le istruzioni sulla scheda e installare l\'applicazione corretta + Carta vuota + Crea un portafoglio per iniziare ad utilizzare la tua carta Tangem + Questa carta non è supportata + La tua carta Tangem è stata creata per funzionare con un\'altra applicazione. Leggere il nome e le istruzioni sulla carta e installare l\'applicazione corretta Transazione in corso… Invia\u0020 su %s @@ -42,7 +42,7 @@ Crea PayString portafoglio %s Crea PayString - Scheda: %s + Carta: %s Nome PayString $payid.tangem.com Crea @@ -53,7 +53,7 @@ Indirizzo o PayString Indirizzo Invia - Rete libera + Costi della rete Importo Commissione Totale @@ -72,32 +72,32 @@ Saldo: %1$s %2$s La transazione è stata firmata con successo e inviata al nodo blockchain. Il saldo del portafoglio verrà aggiornato dopo un po\' di tempo Requisiti - ID scheda + ID carta Emittente Firmato Hash %s Valuta dell\'applicazione Impostazioni - Scheda - Convalidare la scheda + Carta + Convalidare la carta Gestione del portafoglio Cancella il portafoglio Questa azione è irreversibile. Se dopo aver eliminato il portafoglio qualcuno invia dei fondi, non potrai ritirarli. - Se dimentichi il codice, perderai la possibilità di utilizzare la scheda. Non è possibile in alcun modo ripristinare o modificare il codice se lo perdi. + Se dimentichi il codice, perderai la possibilità di utilizzare la carta. Non è possibile in alcun modo ripristinare o modificare il codice se lo perdi. Gestione della sicurezza - Mantenimento della scheda - Questo meccanismo protegge dagli avvicinamenti senza contatto sulla scheda. Attiva un ritardo tra la ricezione e l\'esecuzione di un comando. Dopo la prima transazione firmata, questo telefono verrà associato alla scheda e le transazioni verranno firmate immediatamente. + Mantenimento della carta + Questo meccanismo protegge dagli avvicinamenti senza contatto sulla carta. Attiva un ritardo tra la ricezione e l\'esecuzione di un comando. Dopo la prima transazione firmata, questo telefono verrà associato alla carta e le transazioni verranno firmate immediatamente. Password - Dovrai inserire una password prima di eseguire qualsiasi comando che modifichi lo stato della scheda. + Dovrai inserire una password prima di eseguire qualsiasi comando che modifichi lo stato della carta. Codice di accesso - Prima di scansionare la scheda sarà necessario inserire il codice di accesso corretto + Prima di scansionare la carta sarà necessario inserire il codice di accesso corretto Potresti riscontrare problemi con l\'NFC su alcuni iPhone 7/7 + durante la rimozione - Attenzione: questa scheda è già stata ricaricata e ha firmato transazioni in passato. Valuta la possibilità di prelevare immediatamente tutti i fondi se hai ricevuto questa scheda da una fonte inaffidabile. - Questa scheda non è progettata per funzionare con Tangem Tap - La scheda che hai scansionato è una scheda di sviluppo. Non utilizzarla come strumento di pagamento + Attenzione: questa carta è già stata ricaricata e ha firmato transazioni in passato. Valuta la possibilità di prelevare immediatamente tutti i fondi se hai ricevuto questa carta da una fonte inaffidabile. + Questa carta non è progettata per funzionare con Tangem Tap + La carta che hai scansionato è una carta di sviluppo. Non utilizzarla come strumento di pagamento Le schede emesse prima di settembre 2019 non possono attualmente essere utilizzate con un iPhone. Stiamo lavorando a stretto contatto con Apple per renderle disponibili nelle future versioni di iOS. Avvicina per firmare - Avvicina la scheda al telefono come mostrato sopra + Avvicina la carta al telefono come mostrato sopra Avvicina per cancellare il portafoglio Avvicina per creare il portafoglio Avvicina per modificare il codice di accesso @@ -161,7 +161,7 @@ Questa nota legale è stata modificata l\'ultima volta 01.10.2020. Per creare un account, invia %1$s %2$s a questo indirizzo Impossibile ottenere la commissione Accetta - Amount Exceeds Balance + L\'importo supera il saldo Termini del servizio Nessuna connessione a Internet @@ -184,7 +184,7 @@ Questa nota legale è stata modificata l\'ultima volta 01.10.2020. Inserire prima il PayString desiderato Avvicina per scansionare - Avvicina la scheda + Avvicina la carta Il tuo saldo su questo portafoglio non è pari a zero o hai transazioni non confermate. Non è possibile eliminare la funzione portafoglio. E\' l\'opzione attualmente attiva From 28c9bb478571144839769f6e84572a93edf20327 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 8 Feb 2021 19:34:32 +0300 Subject: [PATCH 07/16] Updated on 2026-08-14 --- .../tap/features/details/ui/twins/CreateTwinWalletFragment.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/twins/CreateTwinWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/twins/CreateTwinWalletFragment.kt index 0cb261610b..50d87de052 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/twins/CreateTwinWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/twins/CreateTwinWalletFragment.kt @@ -98,7 +98,9 @@ class CreateTwinWalletFragment : Fragment(R.layout.fragment_details_twin_cards), btn_tap.setOnClickListener { store.dispatch(DetailsAction.CreateTwinWalletAction.LaunchFirstStep( Message(getString( - R.string.details_twins_recreate_title_format, twinCardNumber) + R.string.details_twins_recreate_title_format, + twinCardNumberString + ) ))) } btn_tap.text = getString(R.string.details_twins_recreate_button_format, From f3cfc605119c4b2ab9fc51fe939dab5e4f8f8a06 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 9 Feb 2021 18:13:42 +0300 Subject: [PATCH 08/16] Updated on 2026-08-14 --- .../com/tangem/tap/common/extensions/Specific.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt b/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt index 925969d32f..42fc659da8 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Specific.kt @@ -36,17 +36,17 @@ fun String.toQrCode(): Bitmap { return bmp } -fun BigDecimal.toFormattedString(decimals: Int): String { - val symbols = DecimalFormatSymbols(Locale.US) - symbols.decimalSeparator = '.' +fun BigDecimal.toFormattedString( + decimals: Int, roundingMode: RoundingMode = RoundingMode.DOWN, locale: Locale = Locale.US +): String { + val symbols = DecimalFormatSymbols(locale) val df = DecimalFormat() df.decimalFormatSymbols = symbols df.maximumFractionDigits = decimals df.minimumFractionDigits = 0 df.isGroupingUsed = false - val bd = BigDecimal(unscaledValue(), scale()) - bd.setScale(decimals, RoundingMode.DOWN) - return df.format(bd) + df.roundingMode = roundingMode + return df.format(this) } fun BigDecimal.toFormattedCurrencyString(decimals: Int, currency: String): String { From 4f4b8a175712e96e4f6c957103da407b9ef3b3ac Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 10 Feb 2021 14:05:53 +0300 Subject: [PATCH 09/16] Updated on 2026-08-14 --- .../send/redux/reducers/TransactionExtrasReducer.kt | 10 ++++++++-- .../features/send/redux/states/AddressPayIdState.kt | 13 +++++++++++-- .../send/ui/stateSubscribers/SendStateSubscriber.kt | 11 ++++++++++- app/src/main/res/values/strings_untranslated.xml | 2 ++ 4 files changed, 31 insertions(+), 5 deletions(-) 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 7688e47496..ed44869f90 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 @@ -68,7 +68,8 @@ class TransactionExtrasReducer : SendInternalReducer { // } is XlmMemo.HandleUserInput -> { val inputViewValue = InputViewValue(action.data, true) - var memo = infoState.xlmMemo?.copy(viewFieldValue = inputViewValue) ?: XlmMemoState(inputViewValue) + var memo = infoState.xlmMemo?.copy(viewFieldValue = inputViewValue) + ?: XlmMemoState(inputViewValue) memo = clearMemo(memo) memo = when (infoState.xlmMemo?.selectedMemoType) { XlmMemoType.TEXT -> memo.copy(text = StellarMemo.Text(action.data)) @@ -93,7 +94,12 @@ class TransactionExtrasReducer : SendInternalReducer { is XrpDestinationTag.HandleUserInput -> { val tag = action.data.toLongOrNull() if (tag != null) { - val tagState = XrpDestinationTagState(InputViewValue(action.data, true), tag) + val input = InputViewValue(action.data, true) + val tagState = if (tag <= XrpDestinationTagState.MAX_NUMBER){ + XrpDestinationTagState(input, tag) + } else { + XrpDestinationTagState(input, error = XrpDestinationTagError.INVALID_TAG) + } infoState.copy(xrpDestinationTag = tagState) } else { infoState 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 68ead3b454..877f277ab3 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 @@ -50,5 +50,14 @@ data class XlmMemoState( // tag must contains only digits data class XrpDestinationTagState( val viewFieldValue: InputViewValue = InputViewValue(""), - val tag: Long? = null -) \ No newline at end of file + val tag: Long? = null, + val error: XrpDestinationTagError? = null +) { + companion object { + const val MAX_NUMBER: Long = 4294967295 + } +} + +enum class XrpDestinationTagError { + INVALID_TAG +} \ 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 6d13047f73..0578e51cf2 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 @@ -72,7 +72,16 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber if (!it.viewFieldValue.isFromUserInput) fg.etMemo.setText(it.viewFieldValue.value) } infoState.xrpDestinationTag?.let { - if (!it.viewFieldValue.isFromUserInput) fg.etDestinationTag.setText(it.viewFieldValue.value) + if (infoState.xrpDestinationTag.error != null) { + if (infoState.xrpDestinationTag.error == XrpDestinationTagError.INVALID_TAG) { + fg.tilDestinationTag.error = fg.getText(R.string.send_error_invalid_destination_tag) + } + } else { + fg.tilDestinationTag.error = null + } + if (!it.viewFieldValue.isFromUserInput) { + fg.etDestinationTag.setText(it.viewFieldValue.value) + } } } diff --git a/app/src/main/res/values/strings_untranslated.xml b/app/src/main/res/values/strings_untranslated.xml index ea6b9f43bf..a93def7b54 100644 --- a/app/src/main/res/values/strings_untranslated.xml +++ b/app/src/main/res/values/strings_untranslated.xml @@ -35,5 +35,7 @@ this wallet. Memo Destination tag + Invalid destination tag. It won\'t be added to the transaction + From a07da07f47dbb2ff7018aa43fa386e220928ca90 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 10 Feb 2021 16:00:42 +0300 Subject: [PATCH 10/16] Updated on 2026-08-14 --- .../redux/reducers/TransactionExtrasReducer.kt | 16 ++++++++++++---- .../send/redux/states/AddressPayIdState.kt | 13 ++++++++++--- .../ui/stateSubscribers/SendStateSubscriber.kt | 9 ++++++++- app/src/main/res/values/strings_untranslated.xml | 1 + 4 files changed, 31 insertions(+), 8 deletions(-) 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 ed44869f90..3b8d9cd016 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 @@ -54,7 +54,7 @@ class TransactionExtrasReducer : SendInternalReducer { sendState: SendState, infoState: TransactionExtrasState, ): SendState { - fun clearMemo(memo: XlmMemoState): XlmMemoState = memo.copy(text = null, id = null) + fun clearMemo(memo: XlmMemoState): XlmMemoState = memo.copy(text = null, id = null, error = null) val result = when (action) { // is XlmMemo.ChangeSelectedMemo -> { @@ -74,8 +74,16 @@ class TransactionExtrasReducer : SendInternalReducer { memo = when (infoState.xlmMemo?.selectedMemoType) { XlmMemoType.TEXT -> memo.copy(text = StellarMemo.Text(action.data)) XlmMemoType.ID -> { - val id = action.data.toIntOrNull()?.toBigInteger() - if (id != null) memo.copy(id = StellarMemo.Id(id)) else memo + val id = action.data.toBigIntegerOrNull() + if (id != null) { + if (id > XlmMemoState.MAX_NUMBER) { + memo.copy(error = TransactionExtraError.INVALID_XLM_MEMO) + } else { + memo.copy(id = StellarMemo.Id(id)) + } + } else { + memo + } } null -> memo } @@ -98,7 +106,7 @@ class TransactionExtrasReducer : SendInternalReducer { val tagState = if (tag <= XrpDestinationTagState.MAX_NUMBER){ XrpDestinationTagState(input, tag) } else { - XrpDestinationTagState(input, error = XrpDestinationTagError.INVALID_TAG) + XrpDestinationTagState(input, error = TransactionExtraError.INVALID_DESTINATION_TAG) } infoState.copy(xrpDestinationTag = tagState) } else { 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 877f277ab3..d17531a84a 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 @@ -2,6 +2,7 @@ package com.tangem.tap.features.send.redux.states import com.tangem.blockchain.blockchains.stellar.StellarMemo import com.tangem.tap.features.send.redux.AddressPayIdVerifyAction +import java.math.BigInteger data class AddressPayIdState( val viewFieldValue: InputViewValue = InputViewValue(""), @@ -39,25 +40,31 @@ data class XlmMemoState( val selectedMemoType: XlmMemoType = XlmMemoType.ID, val text: StellarMemo.Text? = null, val id: StellarMemo.Id? = null, + val error: TransactionExtraError? = null, ) { val memo: StellarMemo? get() = when (selectedMemoType) { XlmMemoType.TEXT -> text XlmMemoType.ID -> id } + + companion object { + val MAX_NUMBER: BigInteger = BigInteger("FFFFFFFFFFFFFFFF", 16) + } } // tag must contains only digits data class XrpDestinationTagState( val viewFieldValue: InputViewValue = InputViewValue(""), val tag: Long? = null, - val error: XrpDestinationTagError? = null + val error: TransactionExtraError? = null ) { companion object { const val MAX_NUMBER: Long = 4294967295 } } -enum class XrpDestinationTagError { - INVALID_TAG +enum class TransactionExtraError { + INVALID_DESTINATION_TAG, + INVALID_XLM_MEMO } \ 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 0578e51cf2..8c0c8fdf23 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 @@ -70,10 +70,17 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber XlmMemoType.ID -> InputType.TYPE_CLASS_NUMBER } if (!it.viewFieldValue.isFromUserInput) fg.etMemo.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) + } + } else { + fg.tilMemo.error = null + } } infoState.xrpDestinationTag?.let { if (infoState.xrpDestinationTag.error != null) { - if (infoState.xrpDestinationTag.error == XrpDestinationTagError.INVALID_TAG) { + if (infoState.xrpDestinationTag.error == TransactionExtraError.INVALID_DESTINATION_TAG) { fg.tilDestinationTag.error = fg.getText(R.string.send_error_invalid_destination_tag) } } else { diff --git a/app/src/main/res/values/strings_untranslated.xml b/app/src/main/res/values/strings_untranslated.xml index a93def7b54..da52a1a514 100644 --- a/app/src/main/res/values/strings_untranslated.xml +++ b/app/src/main/res/values/strings_untranslated.xml @@ -36,6 +36,7 @@ this wallet. Memo Destination tag Invalid destination tag. It won\'t be added to the transaction + Invalid Memo ID. It won\'t be added to the transaction From 508b51d795f615abc456f5b5bee430fa08b5baea Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 10 Feb 2021 16:57:02 +0300 Subject: [PATCH 11/16] Updated on 2026-08-14 --- .../features/send/redux/reducers/TransactionExtrasReducer.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 3b8d9cd016..6ecd4514d4 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 @@ -24,8 +24,9 @@ class TransactionExtrasReducer : SendInternalReducer { val emptyResult = TransactionExtrasState() val result = when (action.blockchain) { Blockchain.XRP -> { + val address = action.walletAddress.substringAfter(":") // 'r' - without tag, 'x' - with tag - if (action.walletAddress.startsWith("r", true)) { + if (address.startsWith("r", true)) { val tag = action.xrpTag?.toLongOrNull() if (tag == null) { TransactionExtrasState(xrpDestinationTag = XrpDestinationTagState()) From 600ac9ee165a0172b13310d619e8ff6b763f9006 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 11 Feb 2021 12:53:15 +0300 Subject: [PATCH 12/16] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_wallet.xml | 3 +-- app/src/main/res/layout/layout_wallet_short_buttons.xml | 9 ++++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index 9ed6acedb3..4b25ad6452 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -43,8 +43,7 @@ + android:layout_height="wrap_content"> + app:layout_constraintVertical_bias="1" + android:layout_marginBottom="33dp"/> + app:layout_constraintVertical_bias="1" + android:layout_marginBottom="33dp"/> + app:layout_constraintVertical_bias="1" + android:layout_marginBottom="33dp"/> \ No newline at end of file From 0ea419ee303758e27a75653f48e8d3204f81f265 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 11 Feb 2021 12:54:45 +0300 Subject: [PATCH 13/16] Updated on 2026-08-14 --- app/build.gradle | 8 ++++---- .../tap/features/wallet/ui/WalletFragment.kt | 5 ----- app/src/main/res/layout/layout_address.xml | 14 +++++++------- build.gradle | 4 ++-- dependencies.gradle | 2 +- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4256b77901..1ea7808851 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -72,11 +72,11 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' implementation 'com.tangem:blockchain:1.130.0' - implementation 'com.tangem:core:1.96.0' - implementation 'com.tangem:sdk:1.96.0' + implementation 'com.tangem:core:1.99.0' + implementation 'com.tangem:sdk:1.99.0' // WebView - implementation "androidx.browser:browser:1.2.0" + implementation "androidx.browser:browser:1.3.0" //lifecycle implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0" @@ -102,7 +102,7 @@ dependencies { implementation 'com.google.firebase:firebase-config-ktx' implementation 'com.google.firebase:firebase-analytics-ktx' - testImplementation 'junit:junit:4.13' + testImplementation 'junit:junit:4.13.1' testImplementation "com.google.truth:truth:1.0.1" androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index 7dd3bef7a9..5098d05d83 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -230,11 +230,8 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber + app:layout_constraintBottom_toBottomOf="@id/btn_copy" + app:layout_constraintStart_toStartOf="parent" /> @@ -151,9 +151,9 @@ android:layout_height="wrap_content" android:layout_margin="16dp" android:src="@drawable/ic_payid" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/v_payid_divider" - app:layout_constraintBottom_toBottomOf="parent"/> + app:layout_constraintTop_toBottomOf="@id/v_payid_divider" /> Date: Thu, 11 Feb 2021 20:54:06 +0300 Subject: [PATCH 14/16] Updated on 2026-08-14 --- app/build.gradle | 6 +++--- app/src/main/java/com/tangem/tap/domain/TapErrors.kt | 4 ++++ .../tap/features/send/redux/middlewares/SendMiddleware.kt | 5 +++++ app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1ea7808851..f0431b15cf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -71,9 +71,9 @@ dependencies { implementation 'com.google.android.material:material:1.2.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' - implementation 'com.tangem:blockchain:1.130.0' - implementation 'com.tangem:core:1.99.0' - implementation 'com.tangem:sdk:1.99.0' + implementation 'com.tangem:blockchain:1.140.0' + implementation 'com.tangem:core:1.100.0' + implementation 'com.tangem:sdk:1.100.0' // WebView implementation "androidx.browser:browser:1.3.0" diff --git a/app/src/main/java/com/tangem/tap/domain/TapErrors.kt b/app/src/main/java/com/tangem/tap/domain/TapErrors.kt index 35229ce2e6..37f159fdb8 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapErrors.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapErrors.kt @@ -38,6 +38,10 @@ sealed class TapError( object DustChange : TapError(R.string.send_error_dust_change) data class CreateAccountUnderfunded(override val args: List) : TapError(R.string.send_error_no_target_account) + sealed class XmlError { + object AssetAccountNotCreated: TapError(R.string.send_error_no_account_xlm) + } + data class ValidateTransactionErrors( override val errorList: List, override val builder: (List) -> String 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 65b9f4d9e6..2af762a25c 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 @@ -140,6 +140,11 @@ private fun sendTransaction( message.contains("50002") -> { // user was cancelled the operation by closing the Sdk bottom sheet } + // make it easier latter by handling an appropriate enumError or, like on iOS, + // accept a string identifier of the error message + message.contains("Target account is not created. To create account send 1+ XLM.")-> { + dispatch(SendAction.SendError(TapError.XmlError.AssetAccountNotCreated)) + } else -> { Timber.e(throwable) FirebaseCrashlytics.getInstance().recordException(throwable) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ae4aa7218f..df6ab33618 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -73,6 +73,7 @@ %s %s und %s %s werden gesendet Bilanz: %s %s Die Transaktion wurde erfolgreich signiert und an den Blockchain-Knoten gesendet. Die Walletbilanz wird aktualisiert + Um ein Konto zu erstellen, senden Sie 1+ XLM an diese Adresse Details KartenID Emittent diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 043edee6a3..ffbe678287 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -74,6 +74,7 @@ Sera envoyé %s %s et %s %s Solde : %s %s La transaction a été signée avec succès et envoyée au nœud de blockchain. Le solde du portefeuille sera mis à jour après un certain temps + Pour créer un compte, envoyez 1+ XLM à cette adresse Référénces ID de la carte Emetteur diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1d53fde617..7c683849f7 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -71,6 +71,7 @@ Sarà inviato %1$s %2$s e %1$s %2$s Saldo: %1$s %2$s La transazione è stata firmata con successo e inviata al nodo blockchain. Il saldo del portafoglio verrà aggiornato dopo un po\' di tempo + Per creare un account, invia 1+ XLM a questo indirizzo Requisiti ID carta Emittente diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 05ea986b66..690be865b5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -188,6 +188,7 @@ Invalid Fee Minimum amount is %s Change is too small + To create account send 1+ XLM to this address Address was copied to clipboard From 58a76fb2d2f9abdfedcfb99ffb21f1bdf1d4c539 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 11 Feb 2021 21:04:42 +0300 Subject: [PATCH 15/16] Updated on 2026-08-14 --- app/src/main/res/layout/layout_address.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/layout_address.xml b/app/src/main/res/layout/layout_address.xml index b7ad833af2..abf039bab7 100644 --- a/app/src/main/res/layout/layout_address.xml +++ b/app/src/main/res/layout/layout_address.xml @@ -97,6 +97,7 @@ android:clickable="true" android:elevation="3dp" android:focusable="true" + app:layout_constraintVertical_bias="0" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/btn_show_qr" app:layout_constraintTop_toBottomOf="@id/chip_group_address_type"> @@ -143,7 +144,8 @@ android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:background="@color/lightGray5" - app:layout_constraintTop_toBottomOf="@id/tv_explore" /> + android:layout_marginTop="25dp" + app:layout_constraintTop_toBottomOf="@id/btn_copy" /> Date: Thu, 11 Feb 2021 21:48:51 +0300 Subject: [PATCH 16/16] Updated on 2026-08-14 --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f0431b15cf..439820d87c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -71,9 +71,9 @@ dependencies { implementation 'com.google.android.material:material:1.2.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' - implementation 'com.tangem:blockchain:1.140.0' - implementation 'com.tangem:core:1.100.0' - implementation 'com.tangem:sdk:1.100.0' + implementation 'com.tangem:blockchain:1.141.0' + implementation 'com.tangem:core:1.101.0' + implementation 'com.tangem:sdk:1.101.0' // WebView implementation "androidx.browser:browser:1.3.0"