diff --git a/app/src/main/java/com/tangem/data/Blockchain.java b/app/src/main/java/com/tangem/data/Blockchain.java index 3224ae7da0..b2771a6bb2 100644 --- a/app/src/main/java/com/tangem/data/Blockchain.java +++ b/app/src/main/java/com/tangem/data/Blockchain.java @@ -105,4 +105,25 @@ public enum Blockchain { return getImageResource(); } + public String getUriScheme() { + String scheme = null; + switch (this) { + case Bitcoin: + case BitcoinDual: + scheme = "bitcoin"; + break; + case Ethereum: + case Token: + case TokenEmv: + scheme = "ethereum"; + break; + case Litecoin: + scheme = "litecoin"; + break; + case Ripple: + scheme = "ripple"; + } + return scheme; + } + } diff --git a/app/src/main/java/com/tangem/data/network/ServerApiBinance.java b/app/src/main/java/com/tangem/data/network/ServerApiBinance.java index 783d303add..8527a9c0d4 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiBinance.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiBinance.java @@ -62,7 +62,6 @@ public class ServerApiBinance { BinanceAssetData binanceAssetData = (BinanceAssetData) binanceData; for (Balance balance : account.getBalances()) { if (balance.getSymbol().equals(ctx.getCard().getContractAddress())) { - binanceAssetData.setBalanceReceived(true); binanceAssetData.setAssetBalance(balance.getFree()); break; } diff --git a/app/src/main/java/com/tangem/wallet/CoinEngine.java b/app/src/main/java/com/tangem/wallet/CoinEngine.java index 5fce47c602..edf38cad4c 100644 --- a/app/src/main/java/com/tangem/wallet/CoinEngine.java +++ b/app/src/main/java/com/tangem/wallet/CoinEngine.java @@ -197,10 +197,11 @@ public abstract class CoinEngine { public abstract Uri getShareWalletUri(); public Uri getShareWalletUriEx(){ - if (ctx.getBlockchain() == Blockchain.BitcoinCash) - return getShareWalletUri(); + String scheme = ctx.getBlockchain().getUriScheme(); + if (scheme != null) + return Uri.parse(scheme + ":" + getShareWalletUri()); else - return Uri.parse(ctx.getBlockchain().name().toLowerCase() + ":" + getShareWalletUri().toString()); + return getShareWalletUri(); } public abstract boolean checkNewTransactionAmount(Amount amount); diff --git a/app/src/main/java/com/tangem/wallet/TangemContext.java b/app/src/main/java/com/tangem/wallet/TangemContext.java index 09674de601..9d3c4d5194 100644 --- a/app/src/main/java/com/tangem/wallet/TangemContext.java +++ b/app/src/main/java/com/tangem/wallet/TangemContext.java @@ -68,7 +68,7 @@ public class TangemContext { if (blockchain == Blockchain.NftToken) { return card.getTokenSymbol().substring(4) + "
" + getBlockchain().getOfficialName() + " non-fungible token"; } - if (blockchain == Blockchain.StellarAsset) { + if (blockchain == Blockchain.StellarAsset || blockchain == Blockchain.BinanceAsset) { return card.getTokenSymbol() + "
" + getBlockchain().getOfficialName() + " asset"; } if (blockchain == Blockchain.StellarTag) { diff --git a/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java b/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java index d3dc0dc13e..9e336690a3 100644 --- a/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java +++ b/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java @@ -89,13 +89,13 @@ public class BinanceAssetEngine extends CoinEngine { @Override public String getBalanceHTML() { - Amount balance = getBalance(); + Amount balance = coinData.getBalance(); Amount assetBalance = coinData.getAssetBalance(); if (balance != null) { if (assetBalance != null) { return assetBalance.toDescriptionString(getDecimals()) + "
+ " + balance.toDescriptionString(getDecimals()) + " for fee"; } - return balance.toDescriptionString(getDecimals()); + return new Amount(BigDecimal.ZERO, ctx.getCard().tokenSymbol).toDescriptionString(getDecimals()) + "
+ " + balance.toDescriptionString(getDecimals()) + " for fee"; } else { return ""; } @@ -125,7 +125,7 @@ public class BinanceAssetEngine extends CoinEngine { @Override public boolean hasBalanceInfo() { if (coinData == null) return false; - return coinData.hasBalanceInfo(); + return coinData.hasBalanceInfo() || coinData.isError404(); } public boolean isExtractPossible() { @@ -135,6 +135,8 @@ public class BinanceAssetEngine extends CoinEngine { ctx.setMessage(R.string.general_wallet_empty); } else if (awaitingConfirmation()) { ctx.setMessage(R.string.loaded_wallet_message_wait); + } else if (coinData.getBalance() == null || coinData.getBalance().isZero()) { + ctx.setMessage(ctx.getString(R.string.confirm_transaction_error_not_enough_eth_for_fee)); } else { return true; } diff --git a/app/src/main/java/com/tangem/wallet/binance/BinanceEngine.java b/app/src/main/java/com/tangem/wallet/binance/BinanceEngine.java index 48ae73ef42..ca6286a35d 100644 --- a/app/src/main/java/com/tangem/wallet/binance/BinanceEngine.java +++ b/app/src/main/java/com/tangem/wallet/binance/BinanceEngine.java @@ -120,7 +120,7 @@ public class BinanceEngine extends CoinEngine { @Override public boolean hasBalanceInfo() { if (coinData == null) return false; - return coinData.hasBalanceInfo(); + return coinData.hasBalanceInfo() || coinData.isError404(); } public boolean isExtractPossible() { diff --git a/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionFragment.kt b/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionFragment.kt index 48a385a3d8..1b5fa7d2c7 100644 --- a/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionFragment.kt +++ b/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionFragment.kt @@ -154,17 +154,8 @@ class PrepareTransactionFragment : BaseFragment(), NavigationResultListener, Nfc val schemeSplit = code!!.split(":") when (schemeSplit.size) { 2 -> { - if (ctx.blockchain.officialName.toLowerCase(Locale.ROOT).replace("\\s", "") == schemeSplit[0]) { - val uri = Uri.parse(schemeSplit[1]) - etWallet?.setText(uri.path) -// val amount = uri.getQueryParameter("amount") //TODO: enable after redesign -// if (amount != null) { -// etAmount?.setText(amount) -// rgIncFee.check(R.id.rbFeeOut) -// } - } else if (ctx.blockchain == Blockchain.Ripple && schemeSplit[0] == "ripple") { - val uri = Uri.parse(schemeSplit[1]) - etWallet?.setText(uri.path) + if (schemeSplit[0] == ctx.blockchain.uriScheme) { + etWallet?.setText(schemeSplit[1]) } else { etWallet?.setText(code) } diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt index 49c7c20368..63743abc73 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt @@ -5,6 +5,7 @@ import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.Transfe import com.tangem.blockchain.blockchains.binance.client.encoding.message.MessageType import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransactionRequestAssemblerExtSign import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransferMessage +import com.tangem.blockchain.common.AmountType import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.TransactionData import com.tangem.blockchain.extensions.Result @@ -28,13 +29,14 @@ class BinanceTransactionBuilder( private var transferMessage: TransferMessage? = null fun buildToSign(transactionData: TransactionData): Result { + val amount = transactionData.amount - if (!transactionData.amount.isAboveZero()) return Result.Failure(Exception("Transaction amount is not defined")) + if (!amount.isAboveZero()) return Result.Failure(Exception("Transaction amount is not defined")) val accountNumber = accountNumber ?: return Result.Failure(Exception("No account number")) val sequence = sequence ?: return Result.Failure(Exception("No sequence")) val transfer = Transfer() - transfer.coin = transactionData.amount.currencySymbol + transfer.coin = if (amount.type == AmountType.Coin) amount.currencySymbol else amount.address transfer.fromAddress = transactionData.sourceAddress transfer.toAddress = transactionData.destinationAddress transfer.amount = transactionData.amount.value!! diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt index e8d2b759eb..4bb91c341f 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt @@ -1,12 +1,12 @@ package com.tangem.blockchain.blockchains.binance import android.util.Log -import com.tangem.blockchain.blockchains.binance.network.BinanceInfoResponse import com.tangem.blockchain.blockchains.binance.network.BinanceNetworkManager import com.tangem.blockchain.common.* import com.tangem.blockchain.extensions.Result import com.tangem.blockchain.extensions.SimpleResult import com.tangem.common.CompletionResult +import com.tangem.blockchain.blockchains.binance.network.BinanceInfoResponse class BinanceWalletManager( cardId: String, @@ -18,7 +18,7 @@ class BinanceWalletManager( private val blockchain = wallet.blockchain override suspend fun update() { - val result = networkManager.getInfo(wallet.address) + val result = networkManager.getInfo(wallet.address, wallet.amounts[AmountType.Token]?.address) when (result) { is Result.Success -> updateWallet(result.data) is Result.Failure -> updateError(result.error) @@ -28,6 +28,7 @@ class BinanceWalletManager( private fun updateWallet(response: BinanceInfoResponse) { Log.d(this::class.java.simpleName, "Balance is ${response.balance}") wallet.amounts[AmountType.Coin]?.value = response.balance + wallet.amounts[AmountType.Token]?.value = response.assetBalance transactionBuilder.accountNumber = response.accountNumber transactionBuilder.sequence = response.sequence diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt index 92532a3ceb..2ccdd82ca5 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt @@ -25,20 +25,22 @@ class BinanceNetworkManager(isTestNet: Boolean = false) { ) } - suspend fun getInfo(address: String): Result { + suspend fun getInfo(address: String, assetCode: String? = null): Result { return try { val accountData = retryIO { client.getAccount(address) } var coinBalance = BigDecimal.ZERO + var assetBalance = BigDecimal.ZERO for (balance in accountData.balances) { - if (balance.symbol == "BNB") { - coinBalance = balance.free.toBigDecimal() - break + when (balance.symbol) { + "BNB" -> coinBalance = balance.free.toBigDecimal() + assetCode -> assetBalance = balance.free.toBigDecimal() } } Result.Success(BinanceInfoResponse( balance = coinBalance, + assetBalance = assetBalance, accountNumber = accountData.accountNumber.toLong(), sequence = accountData.sequence )) @@ -46,6 +48,7 @@ class BinanceNetworkManager(isTestNet: Boolean = false) { if (exception.message == "account not found") { Result.Success(BinanceInfoResponse( balance = BigDecimal.ZERO, //TODO check account not found logic + assetBalance = null, accountNumber = null, sequence = null )) @@ -88,7 +91,8 @@ class BinanceNetworkManager(isTestNet: Boolean = false) { } data class BinanceInfoResponse( - val balance: BigDecimal?, + val balance: BigDecimal, + val assetBalance: BigDecimal?, val accountNumber: Long?, val sequence: Long? ) \ No newline at end of file diff --git a/tangem-core/src/main/java/com/tangem/CardSession.kt b/tangem-core/src/main/java/com/tangem/CardSession.kt index 34f243fc4f..6021923099 100644 --- a/tangem-core/src/main/java/com/tangem/CardSession.kt +++ b/tangem-core/src/main/java/com/tangem/CardSession.kt @@ -37,7 +37,7 @@ interface CardSessionRunnable { * @property viewDelegate is an interface that allows interaction with users and shows relevant UI. * @property cardId ID, Unique Tangem card ID number. If not null, the SDK will check that you the card * with which you tapped a phone has this [cardId] and SDK will return - * the [TangemSdkError.WrongCard] otherwise. + * the [TangemSdkError.WrongCardNumber] otherwise. * @property initialMessage A custom description that will be shown at the beginning of the NFC session. * If null, a default header and text body will be used. */ @@ -77,7 +77,16 @@ class CardSession( runnable.run(this) { result -> when (result) { is CompletionResult.Success -> stop() - is CompletionResult.Failure -> stopWithError(result.error) + is CompletionResult.Failure -> { + if (result.error is TangemSdkError.ExtendedLengthNotSupported) { + if (session.environment.terminalKeys != null) { + session.environment.terminalKeys = null + startWithRunnable(runnable, callback) + return@run + } + } + stopWithError(result.error) + } } callback(result) } @@ -133,8 +142,8 @@ class CardSession( is CompletionResult.Success -> { val receivedCardId = result.data.cardId if (cardId != null && receivedCardId != cardId) { - stopWithError(TangemSdkError.WrongCard()) - callback(CompletionResult.Failure(TangemSdkError.WrongCard())) + stopWithError(TangemSdkError.WrongCardNumber()) + callback(CompletionResult.Failure(TangemSdkError.WrongCardNumber())) return@run } val allowedCardTypes = environment.cardFilter.allowedCardTypes @@ -166,6 +175,8 @@ class CardSession( * @param error An error that will be shown. */ private fun stopWithError(error: Exception) { + if (!isBusy) return + reader.closeSession() isBusy = false @@ -175,9 +186,12 @@ class CardSession( error.localizedMessage } if (error !is TangemSdkError.UserCancelled) { - Log.e("tag", "Finishing with error: $errorMessage") + Log.e(tag, "Finishing with error: $errorMessage") viewDelegate.onError(errorMessage) + } else { + Log.i(tag, "User cancelled NFC session") } + } fun send(apdu: CommandApdu, callback: (result: CompletionResult) -> Unit) { diff --git a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt index e51d5e5d97..5f8734f685 100644 --- a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt +++ b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt @@ -17,10 +17,10 @@ data class SessionEnvironment( var pin1: ByteArray = DEFAULT_PIN.calculateSha256(), var pin2: ByteArray = DEFAULT_PIN2.calculateSha256(), var card: Card? = null, - val terminalKeys: KeyPair? = null, + var terminalKeys: KeyPair? = null, var encryptionMode: EncryptionMode = EncryptionMode.NONE, var encryptionKey: ByteArray? = null, - val cvc: ByteArray? = null, + var cvc: ByteArray? = null, var cardFilter: CardFilter = CardFilter(), val handleErrors: Boolean = true ) { diff --git a/tangem-core/src/main/java/com/tangem/TangemSdk.kt b/tangem-core/src/main/java/com/tangem/TangemSdk.kt index 880796d9e7..ce0c0e8a47 100644 --- a/tangem-core/src/main/java/com/tangem/TangemSdk.kt +++ b/tangem-core/src/main/java/com/tangem/TangemSdk.kt @@ -347,7 +347,7 @@ class TangemSdk( * @runnable: A custom task, adopting [CardSessionRunnable] protocol * @cardId: CID, Unique Tangem card ID number. If not null, the SDK will check that you the card * with which you tapped a phone has this [cardId] and SDK will return - * the [TangemSdkError.WrongCard] otherwise. + * the [TangemSdkError.WrongCardNumber] otherwise. * @initialMessage: A custom description that shows at the beginning of the NFC session. * If null, default message will be used. * @callback: Standard [TangemSdk] callback. @@ -365,7 +365,7 @@ class TangemSdk( * @cardId: CID, Unique Tangem card ID number. If not null, the SDK will check that you the card * with which you tapped a phone has this [cardId] and SDK will return - * the [TangemSdkError.WrongCard] otherwise. + * the [TangemSdkError.WrongCardNumber] otherwise. * @initialMessage: A custom description that shows at the beginning of the NFC session. * If null, default message will be used. * @callback: At first, you should check that the [TangemSdkError] is not null, diff --git a/tangem-core/src/main/java/com/tangem/TangemSdkError.kt b/tangem-core/src/main/java/com/tangem/TangemSdkError.kt index 4ea2612c51..bcf51d0617 100644 --- a/tangem-core/src/main/java/com/tangem/TangemSdkError.kt +++ b/tangem-core/src/main/java/com/tangem/TangemSdkError.kt @@ -16,6 +16,10 @@ sealed class TangemSdkError(val code: Int) : Exception(code.toString()) { * (e.g. a user detaches card from the phone's NFC module) while the NFC session is in progress. */ class TagLost : TangemSdkError(10001) + /** + * This error is returned when NFC driver on an Android device does not support sending more than 261 bytes. + */ + class ExtendedLengthNotSupported : TangemSdkError(10002) class SerializeCommandError : TangemSdkError(20001) @@ -67,16 +71,6 @@ sealed class TangemSdkError(val code: Int) : Exception(code.toString()) { //Read Errors class Pin1Required : TangemSdkError(40401) - /** - * This error is returned when a [Task] expects a user to use a particular card, - * but the user tries to use a different card. - */ - class WrongCard : TangemSdkError(40403) - /** - * This error is returned when a user scans a card of a [com.tangem.common.extensions.CardType] - * that is not specified in [Config.cardFilter]. - */ - class WrongCardType : TangemSdkError(40404) //CreateWallet Errors class AlreadyCreated : TangemSdkError(40501) @@ -128,11 +122,6 @@ sealed class TangemSdkError(val code: Int) : Exception(code.toString()) { class OverwritingDataIsProhibited : TangemSdkError(40008) class DataCannotBeWritten : TangemSdkError(40009) class MissingIssuerPubicKey : TangemSdkError(40010) - /** - * This error is returned when a [ScanTask] returns a [Card] without some of the essential fields. - */ - class CardError : TangemSdkError(40011) - //SDK Errors class UnknownError: TangemSdkError(50001) @@ -150,7 +139,20 @@ sealed class TangemSdkError(val code: Int) : Exception(code.toString()) { * is executed before performing other commands. */ class MissingPreflightRead : TangemSdkError(50004) - + /** + * This error is returned when a [Task] expects a user to use a particular card, + * but the user tries to use a different card. + */ + class WrongCardNumber : TangemSdkError(50005) + /** + * This error is returned when a user scans a card of a [com.tangem.common.extensions.CardType] + * that is not specified in [Config.cardFilter]. + */ + class WrongCardType : TangemSdkError(50006) + /** + * This error is returned when a [ScanTask] returns a [Card] without some of the essential fields. + */ + class CardError : TangemSdkError(50007) } diff --git a/tangem-core/src/main/java/com/tangem/commands/Command.kt b/tangem-core/src/main/java/com/tangem/commands/Command.kt index fad1b0d025..e7e90c5123 100644 --- a/tangem-core/src/main/java/com/tangem/commands/Command.kt +++ b/tangem-core/src/main/java/com/tangem/commands/Command.kt @@ -38,7 +38,7 @@ abstract class Command : CardSessionRunnable { abstract fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): T override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) { - Log.i("Command", "Sending ${this::class.java.simpleName}") + Log.i("Command", "Initializing ${this::class.java.simpleName}") if (session.environment.handleErrors) { if (performPreCheck(session, callback)) return } diff --git a/tangem-core/src/main/java/com/tangem/common/tlv/TlvBuilder.kt b/tangem-core/src/main/java/com/tangem/common/tlv/TlvBuilder.kt index 3cade3e92a..8c7ec12fad 100644 --- a/tangem-core/src/main/java/com/tangem/common/tlv/TlvBuilder.kt +++ b/tangem-core/src/main/java/com/tangem/common/tlv/TlvBuilder.kt @@ -14,7 +14,7 @@ class TlvBuilder { fun serialize(): ByteArray { Log.v("TLV", - "List of encoded TLVs:\n${tlvs.joinToString("\n")}") + "Data encoded to TLVs:\n${tlvs.joinToString("\n")}") return tlvs.serialize() } diff --git a/tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt b/tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt index 62c0899f2d..866fbbd41c 100644 --- a/tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt +++ b/tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt @@ -20,7 +20,7 @@ class TlvDecoder(val tlvList: List) { init { Log.v("TLV", - "List of decoded TLVs:\n${tlvList.joinToString("\n")}") + "Decoding data from TLV:\n${tlvList.joinToString("\n")}") } /** @@ -33,7 +33,7 @@ class TlvDecoder(val tlvList: List) { */ inline fun decodeOptional(tag: TlvTag): T? = try { - decode(tag) + decode(tag, false) } catch (exception: TangemSdkError.DecodingFailedMissingTag) { null } @@ -47,14 +47,18 @@ class TlvDecoder(val tlvList: List) { * * @return [Tlv] value converted to a nullable type [T]. * - * @throws [TaskError.MissingTag] exception if no [Tlv] is found by the Tag. + * @throws [TangemSdkError.DecodingFailedMissingTag] exception if no [Tlv] is found by the Tag. */ - inline fun decode(tag: TlvTag): T { + inline fun decode(tag: TlvTag, logError: Boolean = true): T { val tlvValue: ByteArray = tlvList.find { it.tag == tag }?.value ?: if (tag.valueType() == TlvValueType.BoolValue && T::class == Boolean::class) { return false as T } else { - Log.e(this::class.simpleName!!, "Tag $tag not found") + if (logError) { + Log.e(this::class.simpleName!!, "TLV $tag not found") + } else { + Log.v(this::class.simpleName!!, "TLV $tag not found, but it is not required") + } throw TangemSdkError.DecodingFailedMissingTag() } diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt index c24ff4494c..d7ae706d37 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/AndroidComponents.kt @@ -4,7 +4,6 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent -import androidx.activity.ComponentActivity import androidx.fragment.app.Fragment /** @@ -17,11 +16,7 @@ fun Context.copyToClipboard(value: Any, label: String = "") { clipboard.setPrimaryClip(clip) } -fun Fragment.shareText(text: String) { - requireActivity().shareText(text) -} - -fun ComponentActivity.shareText(text: String) { +fun Context.shareText(text: String) { val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, text) @@ -29,4 +24,8 @@ fun ComponentActivity.shareText(text: String) { } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent) +} + +fun Fragment.shareText(text: String) { + requireContext().shareText(text) } \ No newline at end of file diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt index 90a1ceab7b..a8125f2a51 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt @@ -7,10 +7,7 @@ import com.tangem.devkit.commons.Store import com.tangem.devkit.ucase.domain.actions.PersonalizeAction import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigConverter -import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationJsonConverter import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig -import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationJson -import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] @@ -30,27 +27,6 @@ class PersonalizationItemsManager( action.executeMainAction(this, getAttrsForAction(tangemSdk), callback) } - fun importJsonConfig(jsonString: String) { - if (jsonString.isEmpty()) return - - val jsonDto = try { - PersonalizationJson.getJsonConverter().fromJson(jsonString, PersonalizationJson::class.java) - } catch (ex: Exception) { - Log.e(this, "Can't convert imported string to Json object. Error: $ex") - return - } - - val config = PersonalizationJsonConverter().aToB(jsonDto) - updateByItemList(converter.convert(config)) - } - - fun exportJsonConfig(): String { - val config = converter.convert(itemList, PersonalizationConfig.default()) - val jsonDto = PersonalizationJsonConverter().bToA(config) - val jsonString = PersonalizationJson.getJsonConverter().toJson(jsonDto) - return jsonString - } - @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onDestroy() { val config = converter.convert(itemList, PersonalizationConfig.default()) diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt index 7135d43975..4af4f57691 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt @@ -106,8 +106,8 @@ internal class Helper { KeyValue("RSK", "RSK"), KeyValue("XPR", "XPR"), KeyValue("CARDANO", "CARDANO"), - KeyValue("BNB", "BNB"), - KeyValue("XTZ", "XTZ"), + KeyValue("BNB", "BINANCE"), + KeyValue("XTZ", "TEZOS"), KeyValue("DUC", "DUC") ) } diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt index e6733ed9f4..ce10098ef1 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt @@ -71,9 +71,9 @@ class ItemsToPersonalizationConfig : ItemsToModel { export.requireTerminalTxSignature = getTyped(SignHashExPropId.RequireTerminalTxSig) export.checkPIN3onCard = getTyped(SignHashExPropId.CheckPin3) export.itsToken = getTyped(TokenId.ItsToken) - export.cardData.token_symbol = getTyped(TokenId.Symbol) - export.cardData.token_contract_address = getTyped(TokenId.ContractAddress) - export.cardData.token_decimal = getTyped(TokenId.Decimal) + export.cardData.token_symbol = getTypedUnsafe(TokenId.Symbol) + export.cardData.token_contract_address = getTypedUnsafe(TokenId.ContractAddress) + export.cardData.token_decimal = getTypedUnsafe(TokenId.Decimal) export.cardData = export.cardData.apply { this.product_note = getTyped(ProductMaskId.Note) } export.cardData = export.cardData.apply { this.product_tag = getTyped(ProductMaskId.Tag) } export.cardData = export.cardData.apply { this.product_id_card = getTyped(ProductMaskId.IdCard) } @@ -114,6 +114,10 @@ class ItemsToPersonalizationConfig : ItemsToModel { return getTypedBy(valuesHolder, id)!! } + private inline fun getTypedUnsafe(id: Id): Type? { + return getTypedBy(valuesHolder, id) + } + private inline fun getTypedBy(holder: ConfigValuesHolder, id: Id): Type? { Log.d(this, "getTyped for id: $id") var typedValue = holder.get(id)?.get() diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt index 322f1643b6..a2590ebb3c 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt @@ -78,7 +78,7 @@ internal class JsonToConfig : Converter(R.id.et_json_export) val btnExportJson = parent.findViewById