From 8c24ae20107210413ecd6b0703fb670960aeafa2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 12 May 2020 15:30:17 +0300 Subject: [PATCH 1/7] Updated on 2026-08-14 --- tangem-core/src/main/java/com/tangem/CardSession.kt | 7 ++++++- .../main/java/com/tangem/common/tlv/TlvDecoder.kt | 12 ++++++++---- .../tangem_sdk_new/DefaultSessionViewDelegate.kt | 1 - .../java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt | 7 ++++--- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tangem-core/src/main/java/com/tangem/CardSession.kt b/tangem-core/src/main/java/com/tangem/CardSession.kt index 34f243fc4f..39ee1cc750 100644 --- a/tangem-core/src/main/java/com/tangem/CardSession.kt +++ b/tangem-core/src/main/java/com/tangem/CardSession.kt @@ -166,6 +166,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 +177,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/common/tlv/TlvDecoder.kt b/tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt index 62c0899f2d..ac83d38b06 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 @@ -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") + } throw TangemSdkError.DecodingFailedMissingTag() } diff --git a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/DefaultSessionViewDelegate.kt b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/DefaultSessionViewDelegate.kt index 4b422c3687..a15f16521e 100644 --- a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/DefaultSessionViewDelegate.kt +++ b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/DefaultSessionViewDelegate.kt @@ -61,7 +61,6 @@ class DefaultSessionViewDelegate(private val reader: NfcReader) : SessionViewDel readingDialog?.setOnCancelListener { reader.readingCancelled = true reader.closeSession() - Log.i(this::class.simpleName!!, "readingCancelled is set to true") } readingDialog?.show() } diff --git a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt index 225edfb595..9b42d5b108 100644 --- a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt +++ b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt @@ -26,7 +26,7 @@ class NfcReader : CardReader { if (field == null) { field = value // if tag is received, call connect first before transceiving data - connect() + if (value != null) connect() } if (value == null) field = value } @@ -46,6 +46,7 @@ class NfcReader : CardReader { private var callback: ((response: CompletionResult) -> Unit)? = null override fun openSession() { + Log.i(this::class.simpleName!!, "NFC reader is starting NFC session") readingActive = true readingCancelled = false manager?.disableReaderMode() @@ -85,7 +86,7 @@ class NfcReader : CardReader { return } if (rawResponse != null) { - Log.i(this::class.simpleName!!, "Nfc response is received") + Log.i(this::class.simpleName!!, "NFC response is received") data = null } rawResponse?.let { callback?.invoke(CompletionResult.Success(ResponseApdu(it))) } @@ -103,7 +104,7 @@ class NfcReader : CardReader { isoDep?.close() isoDep?.connect() isoDep?.timeout = 240000 - Log.i(this::class.simpleName!!, "Nfc session is started") + Log.i(this::class.simpleName!!, "NFC tag is connected") } private fun onNfcVDiscovered(nfcV: NfcV) { From 432a46e98476a1e02b0c78407847f807d79432ab Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 12 May 2020 17:40:20 +0300 Subject: [PATCH 2/7] Updated on 2026-08-14 --- tangem-core/src/main/java/com/tangem/commands/Command.kt | 2 +- tangem-core/src/main/java/com/tangem/common/tlv/TlvBuilder.kt | 2 +- tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt | 4 ++-- .../src/main/java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) 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 ac83d38b06..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")}") } /** @@ -57,7 +57,7 @@ class TlvDecoder(val tlvList: List) { if (logError) { Log.e(this::class.simpleName!!, "TLV $tag not found") } else { - Log.v(this::class.simpleName!!, "TLV $tag not found") + Log.v(this::class.simpleName!!, "TLV $tag not found, but it is not required") } throw TangemSdkError.DecodingFailedMissingTag() } diff --git a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt index 9b42d5b108..8640e30abc 100644 --- a/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt +++ b/tangem-sdk/src/main/java/com/tangem/tangem_sdk_new/nfc/NfcReader.kt @@ -75,6 +75,7 @@ class NfcReader : CardReader { val rawResponse: ByteArray? try { + Log.i(this::class.simpleName!!, "Sending data to the card") rawResponse = isoDep?.transceive(data) } catch (exception: TagLostException) { callback?.invoke(CompletionResult.Failure(TangemSdkError.TagLost())) @@ -86,7 +87,7 @@ class NfcReader : CardReader { return } if (rawResponse != null) { - Log.i(this::class.simpleName!!, "NFC response is received") + Log.i(this::class.simpleName!!, "Data from the card was received") data = null } rawResponse?.let { callback?.invoke(CompletionResult.Success(ResponseApdu(it))) } From a38813b2bed09a9f91469ac31ef905cbada7fbd3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 13 May 2020 11:47:56 +0300 Subject: [PATCH 3/7] Updated on 2026-08-14 --- .../ucase/variants/personalize/converter/DefaultValues.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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") ) } From 64f39a728d5f7f23723d01b9c8b5d870f4e63916 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 13 May 2020 13:23:04 +0300 Subject: [PATCH 4/7] Updated on 2026-08-14 --- .../main/java/com/tangem/wallet/binance/BinanceAssetEngine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..f5d4b8aeb7 100644 --- a/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java +++ b/app/src/main/java/com/tangem/wallet/binance/BinanceAssetEngine.java @@ -89,7 +89,7 @@ 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) { From 563322e9b10bdf325af901788e352c766c44fad6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 13 May 2020 13:32:26 +0300 Subject: [PATCH 5/7] Updated on 2026-08-14 --- app/src/main/java/com/tangem/wallet/binance/BinanceEngine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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() { From ba9506e48d77cd2871f90134a95b0026f1565568 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 13 May 2020 13:33:29 +0300 Subject: [PATCH 6/7] Updated on 2026-08-14 --- .../devkit/extensions/AndroidComponents.kt | 11 ++--- .../managers/PersonalizationItemsManager.kt | 24 ---------- .../PersonalizationConfigConverter.kt | 10 ++-- .../personalize/ui/PersonalizationFragment.kt | 48 ++++++++++++++++--- .../presets/PersonalizationPresetManager.kt | 32 +++++++++++-- .../src/main/res/drawable/ic_import.xml | 12 +++++ .../main/res/drawable/ic_share_white_18dp.xml | 4 +- .../dlg_personalization_preset_load.xml | 4 +- .../dlg_personalization_preset_save.xml | 1 - .../main/res/menu/menu_fg_peronalization.xml | 16 ++++++- .../src/main/res/menu/menu_fg_response.xml | 2 +- tangem-devkit/src/main/res/values/strings.xml | 2 + .../res/values/strings_personalization.xml | 7 +++ .../src/main/res/values/strings_response.xml | 2 - 14 files changed, 122 insertions(+), 53 deletions(-) create mode 100644 tangem-devkit/src/main/res/drawable/ic_import.xml 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/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/ui/PersonalizationFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt index 76d0116ae3..bb5b708b86 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/ui/PersonalizationFragment.kt @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.transition.Fade +import com.google.android.material.textfield.TextInputLayout import com.tangem.commands.Card import com.tangem.devkit.R import com.tangem.devkit._arch.structure.Id @@ -25,6 +26,7 @@ import com.tangem.devkit.commons.DialogController import com.tangem.devkit.commons.view.MultiActionView import com.tangem.devkit.commons.view.ViewAction import com.tangem.devkit.extensions.copyToClipboard +import com.tangem.devkit.extensions.shareText import com.tangem.devkit.extensions.view.beginDelayedTransition import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey @@ -132,6 +134,7 @@ class PersonalizationFragment : BaseCardActionFragment(), PersonalizationPresetV fun initImportExportJson(parent: ViewGroup) { val tvJsonExport = parent.findViewById(R.id.et_json_export) val btnExportJson = parent.findViewById