diff --git a/.gitignore b/.gitignore
index 39d65ab0a1..0fde302b00 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,7 +16,7 @@ local.properties
.idea/codeStyles
# LayoutInspector files
-.captures
+/captures
# OS-specific files
.DS_Store
diff --git a/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt b/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt
index 2cfd173be1..4417374a87 100644
--- a/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt
@@ -12,6 +12,7 @@ data class NdefRecord(
URI, AAR, TEXT
}
+ @delegate:Transient
val valueInBytes: ByteArray by lazy { value.toByteArray() }
}
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt
index d6b1cdb38c..30c69cd6b2 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt
@@ -9,6 +9,11 @@ interface DefaultConverter {
fun convert(from: A, default: B): B
}
+interface TwoWayConverter {
+ fun aToB(from: A): B
+ fun bToA(from: B): A
+}
+
interface ItemsToModel : DefaultConverter, M>
interface ModelToItems : Converter>
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 032e162d53..c24ff4494c 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
@@ -1,5 +1,8 @@
package com.tangem.devkit.extensions
+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
@@ -7,6 +10,13 @@ import androidx.fragment.app.Fragment
/**
[REDACTED_AUTHOR]
*/
+fun Context.copyToClipboard(value: Any, label: String = "") {
+ val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager ?: return
+
+ val clip: ClipData = ClipData.newPlainText(label, value.toString())
+ clipboard.setPrimaryClip(clip)
+}
+
fun Fragment.shareText(text: String) {
requireActivity().shareText(text)
}
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/extensions/CardConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/extensions/CardConfig.kt
deleted file mode 100644
index fb3fefaeed..0000000000
--- a/tangem-devkit/src/main/java/com/tangem/devkit/extensions/CardConfig.kt
+++ /dev/null
@@ -1,139 +0,0 @@
-package com.tangem.devkit.extensions
-
-import android.app.Application
-import android.content.Context
-import com.tangem.commands.*
-import com.tangem.commands.personalization.entities.CardConfig
-import com.tangem.commands.personalization.entities.NdefRecord
-import java.util.*
-
-fun CardConfig.Companion.create(application: Application): CardConfig {
-
- val preferences = application.getSharedPreferences("prefs", Context.MODE_PRIVATE)
-
- val signingMethodMaskBuilder = SigningMethodMaskBuilder()
- if (preferences.getBoolean("personalization_SigningMethod_0", false)) {
- signingMethodMaskBuilder.add(SigningMethod.SignHash)
- }
- if (preferences.getBoolean("personalization_SigningMethod_1", false)) {
- signingMethodMaskBuilder.add(SigningMethod.SignRaw)
- }
- if (preferences.getBoolean("personalization_SigningMethod_2", false)) {
- signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuer)
- }
- if (preferences.getBoolean("personalization_SigningMethod_3", false)) {
- signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuer)
- }
- if (preferences.getBoolean("personalization_SigningMethod_4", false)) {
- signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuerWriteIssuerData)
- }
- if (preferences.getBoolean("personalization_SigningMethod_5", false)) {
- signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuerWriteIssuerData)
- }
- if (preferences.getBoolean("personalization_SigningMethod_6", false)) {
- signingMethodMaskBuilder.add(SigningMethod.SignHash)
- }
- val signingMethod = signingMethodMaskBuilder.build()
-
- val isNote = preferences.getBoolean("personalization_ProductMask_IsNote", true)
- val isTag = preferences.getBoolean("personalization_ProductMask_IsTag", false)
- val isIdCard = preferences.getBoolean("personalization_ProductMask_IsIDCard", false)
-
- val productMaskBuilder = ProductMaskBuilder()
- if (isNote) productMaskBuilder.add(Product.Note)
- if (isTag) productMaskBuilder.add(Product.Tag)
- if (isIdCard) productMaskBuilder.add(Product.IdCard)
- val productMask = productMaskBuilder.build()
-
- var tokenSymbol: String? = null
- var tokenContractAddress: String? = null
- var tokenDecimal: Int? = null
- if (preferences.getBoolean("personalization_isToken", false)) {
- tokenSymbol = preferences.getString("personalization_token_symbol", "")
- tokenContractAddress = preferences.getString("personalization_token_contract_address", "")
- tokenDecimal = preferences.getString("personalization_token_decimal", "")!!.toInt()
- }
-
- val cardData = CardData(
- blockchainName = preferences.getString("personalization_Blockchain", "BTC"),
- batchId = preferences.getString("personalization_card_batch", "FFFF"),
- productMask = productMask,
- tokenSymbol = tokenSymbol,
- tokenContractAddress = tokenContractAddress,
- tokenDecimal = tokenDecimal,
- issuerName = null,
- manufactureDateTime = Calendar.getInstance().time,
- manufacturerSignature = null)
-
-
- val ndefAar = preferences.getString("personalization_NDEF_AAR", "Release APP")
- val ndefUri = preferences.getString("personalization_NDEF_URI", "https://tangem.com")
-
- val ndefs = mutableListOf()
- if (!ndefUri.isNullOrEmpty()) {
- ndefs.add(NdefRecord(NdefRecord.Type.URI, ndefUri))
- }
- if (ndefAar != "None") {
- val type = NdefRecord.Type.AAR
- val value = when (ndefAar) {
- "Debug APP" -> {
- "com.tangem.wallet.debug"
- }
- "Release APP" -> {
- "com.tangem.wallet"
- }
- "--- CUSTOM ---" -> {
- preferences.getString("personalization_NDEF_CUSTOM_AAR", "com.tangem.wallet")!!
- }
- else -> ""
- }
- ndefs.add(NdefRecord(type, value))
- }
-
- return CardConfig(
- cardData = cardData,
- curveID = EllipticCurve.byName(preferences.getString("personalization_CurveId", "secp256k1")!!)
- ?: EllipticCurve.Secp256k1,
- signingMethods = signingMethod,
- createWallet = preferences.getBoolean("personalization_CreateWallet", true),
- maxSignatures = preferences.getString("personalization_MaxSignatures", "1000")!!.toInt(),
- isReusable = preferences.getBoolean("personalization_SettingsMask_IsReusable", true),
- protocolAllowUnencrypted = preferences.getBoolean("personalization_SettingsMask_AllowEncryption_None", true),
- protocolAllowStaticEncryption = preferences.getBoolean("personalization_SettingsMask_AllowEncryption_Fast", true),
- useActivation = preferences.getBoolean("personalization_SettingsMask_NeedActivation", false),
-
- useOneCommandAtTime = preferences.getBoolean("personalization_SettingsMask_OneApduAtOnce", false),
- useCvc = preferences.getBoolean("personalization_SettingsMask_UseCVC", false),
- useBlock = preferences.getBoolean("personalization_SettingsMask_UseBlock", false),
- allowSwapPin = preferences.getBoolean("personalization_SettingsMask_AllowSwapPIN", true),
- allowSwapPin2 = preferences.getBoolean("personalization_SettingsMask_AllowSwapPIN2", true),
- useNdef = preferences.getBoolean("personalization_SettingsMask_UseNDEF", true),
- useDynamicNdef = preferences.getBoolean("personalization_SettingsMask_UseDynamicNDEF", true),
- protectIssuerDataAgainstReplay = preferences.getBoolean("personalization_SettingsMask_ProtectIssuerDataAgainstReplay", true),
- forbidDefaultPin = preferences.getBoolean("personalization_SettingsMask_ForbidDefaultPIN", false),
- smartSecurityDelay = preferences.getBoolean("personalization_SettingsMask_SmartSecurityDelay", false),
- pauseBeforePin2 = preferences.getString("personalization_PauseBeforePIN2", "15")!!.toInt() * 1000,
- allowSelectBlockchain = preferences.getBoolean("personalization_SettingsMask_AllowSelectBlockchain", false),
- forbidPurgeWallet = preferences.getBoolean("personalization_SettingsMask_ForbidPurgeWallet", false)
- ?: false,
- disablePrecomputedNdef = preferences.getBoolean("personalization_SettingsMask_DisablePrecomputedNDEF", false)
- ?: false,
- skipSecurityDelayIfValidatedByIssuer = preferences.getBoolean("personalization_SettingsMask_SkipSecurityDelayIfValidatedByIssuer", true),
- skipCheckPIN2andCVCIfValidatedByIssuer = preferences.getBoolean("personalization_SettingsMask_SkipCheckPIN2andCVCIfValidatedByIssuer", true),
-
- skipSecurityDelayIfValidatedByLinkedTerminal = preferences.getBoolean("personalization_SettingsMask_SkipSecurityDelayIfValidatedByLinkedTerminal", true),
- restrictOverwriteIssuerDataEx = preferences.getBoolean("personalization_SettingsMask_RestrictOverwriteIssuerDataEx", true),
-
- requireTerminalTxSignature = preferences.getBoolean("personalization_SettingsMask_RequireTerminalTxSignature", false),
- requireTerminalCertSignature = preferences.getBoolean("personalization_SettingsMask_RequireTerminalCertSignature", false),
- checkPin3onCard = preferences.getBoolean("personalization_SettingsMask_CheckPIN3onCard", true),
-
- cvc = preferences.getString("personalization_cvc", "000") ?: "000",
- pin = preferences.getString("personalization_pin", "000000") ?: "000000",
- pin2 = preferences.getString("personalization_pin2", "000") ?: "000",
- pin3 = preferences.getString("personalization_pin3", "123") ?: "123",
- hexCrExKey = preferences.getString("personalization_CrEx_Key", "00112233445566778899AABBCCDDEEFFFFEEDDCCBBAA998877665544332211000000111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFF"),
-
- ndefRecords = ndefs
- )
-}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PersonalizeAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PersonalizeAction.kt
index a6ac650824..5e0519b5ce 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PersonalizeAction.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/PersonalizeAction.kt
@@ -11,9 +11,10 @@ import com.tangem.devkit.ucase.tunnel.ActionView
import com.tangem.devkit.ucase.tunnel.ItemError
import com.tangem.devkit.ucase.variants.personalize.CardNumberId
import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigConverter
-import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigToCardConfig
+import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationJsonConverter
import com.tangem.devkit.ucase.variants.personalize.dto.DefaultPersonalizationParams
import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
+import com.tangem.devkit.ucase.variants.personalize.dto.toCardConfig
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
/**
@@ -37,10 +38,10 @@ class PersonalizeAction : BaseAction() {
val acquirer = DefaultPersonalizationParams.acquirer()
val manufacturer = DefaultPersonalizationParams.manufacturer()
- val personalizeConfig = PersonalizationConfigConverter().convert(itemList, PersonalizationConfig.default())
- val cardConfig = PersonalizationConfigToCardConfig().convert(personalizeConfig)
+ val config = PersonalizationConfigConverter().convert(itemList, PersonalizationConfig.default())
+ val jsonDto = PersonalizationJsonConverter().bToA(config)
- attrs.tangemSdk.personalize(cardConfig, issuer, manufacturer, acquirer) {
+ attrs.tangemSdk.personalize(jsonDto.toCardConfig(), issuer, manufacturer, acquirer) {
handleResult(payload, it, null, attrs, callback)
}
}
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 a8125f2a51..90a1ceab7b 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,7 +7,10 @@ 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]
@@ -27,6 +30,27 @@ 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/resources/initializers/PersonalizationResources.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt
index 76443bf03e..2319076b7b 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/resources/initializers/PersonalizationResources.kt
@@ -17,7 +17,6 @@ class PersonalizationResources() {
initCommon(holder)
initSigningMethod(holder)
initSignHashExProp(holder)
- initDenomination(holder)
initToken(holder)
initProductMask(holder)
initSettingsMask(holder)
@@ -72,11 +71,6 @@ class PersonalizationResources() {
holder.register(SignHashExPropId.CheckPin3, Resources(R.string.pers_item_check_pin3_on_card, R.string.info_pers_item_check_pin3_on_card))
}
- private fun initDenomination(holder: TypedHolder) {
- holder.register(DenominationId.WriteOnPersonalize, Resources(R.string.pers_item_write_on_personalize, R.string.info_pers_item_write_on_personalize))
- holder.register(DenominationId.Denomination, Resources(R.string.pers_item_denomination, R.string.info_pers_item_denomination))
- }
-
private fun initToken(holder: TypedHolder) {
holder.register(TokenId.ItsToken, Resources(R.string.pers_item_its_token, R.string.info_pers_item_its_token))
holder.register(TokenId.Symbol, Resources(R.string.pers_item_symbol, R.string.info_pers_item_symbol))
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt
index cf576d5192..fef98a3cbc 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/Ids.kt
@@ -54,11 +54,6 @@ enum class SignHashExPropId : PersonalizationId {
CheckPin3,
}
-enum class DenominationId : PersonalizationId {
- WriteOnPersonalize,
- Denomination,
-}
-
enum class TokenId : PersonalizationId {
ItsToken,
Symbol,
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 93b7841d9c..7135d43975 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
@@ -5,6 +5,7 @@ import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.abstraction.KeyValue
import com.tangem.devkit.ucase.variants.personalize.*
import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationJson
import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
/**
@@ -16,9 +17,9 @@ class ConfigValuesHolder : BaseTypedHolder() {
fun init(default: PersonalizationConfig) {
register(CardNumberId.Series, Value(default.series))
register(CardNumberId.Number, Value(default.startNumber))
- register(CardNumberId.BatchId, Value(default.batchId))
+ register(CardNumberId.BatchId, Value(default.cardData.batch))
register(CommonId.Curve, Value(default.curveID, Helper.listOfCurves()))
- register(CommonId.Blockchain, Value(default.blockchain, Helper.listOfBlockchain()))
+ register(CommonId.Blockchain, Value(default.cardData.blockchain, Helper.listOfBlockchain()))
register(CommonId.BlockchainCustom, Value(default.blockchainCustom))
register(CommonId.MaxSignatures, Value(default.MaxSignatures))
register(CommonId.CreateWallet, Value(default.createWallet))
@@ -34,12 +35,10 @@ class ConfigValuesHolder : BaseTypedHolder() {
register(SignHashExPropId.RequireTerminalCertSig, Value(default.requireTerminalCertSignature))
register(SignHashExPropId.RequireTerminalTxSig, Value(default.requireTerminalTxSignature))
register(SignHashExPropId.CheckPin3, Value(default.checkPIN3onCard))
- register(DenominationId.WriteOnPersonalize, Value(default.writeOnPersonalization))
- register(DenominationId.Denomination, Value(default.denomination))
register(TokenId.ItsToken, Value(default.itsToken))
- register(TokenId.Symbol, Value(default.symbol))
- register(TokenId.ContractAddress, Value(default.contractAddress))
- register(TokenId.Decimal, Value(default.decimal))
+ register(TokenId.Symbol, Value(default.cardData.token_symbol))
+ register(TokenId.ContractAddress, Value(default.cardData.token_contract_address))
+ register(TokenId.Decimal, Value(default.cardData.token_decimal))
register(ProductMaskId.Note, Value(default.cardData.product_note))
register(ProductMaskId.Tag, Value(default.cardData.product_tag))
register(ProductMaskId.IdCard, Value(default.cardData.product_id_card))
@@ -49,7 +48,7 @@ class ConfigValuesHolder : BaseTypedHolder() {
register(SettingsMaskId.ForbidPurge, Value(default.forbidPurgeWallet))
register(SettingsMaskId.AllowSelectBlockchain, Value(default.allowSelectBlockchain))
register(SettingsMaskId.UseBlock, Value(default.useBlock))
- register(SettingsMaskId.OneApdu, Value(default.oneApdu))
+ register(SettingsMaskId.OneApdu, Value(default.useOneCommandAtTime))
register(SettingsMaskId.UseCvc, Value(default.useCVC))
register(SettingsMaskId.AllowSwapPin, Value(default.allowSwapPIN))
register(SettingsMaskId.AllowSwapPin2, Value(default.allowSwapPIN2))
@@ -94,7 +93,7 @@ internal class Helper {
fun listOfBlockchain(): List {
return mutableListOf(
- KeyValue("--- CUSTOM ---", ""),
+ KeyValue(PersonalizationJson.CUSTOM, PersonalizationJson.CUSTOM),
KeyValue("BTC", "BTC"),
KeyValue("BTC/test", "BTC/test"),
KeyValue("ETH", "ETH"),
@@ -115,7 +114,7 @@ internal class Helper {
fun aarList(): List {
return mutableListOf(
- KeyValue("--- CUSTOM ---", ""),
+ KeyValue(PersonalizationJson.CUSTOM, PersonalizationJson.CUSTOM),
KeyValue("Release APP", "com.tangem.wallet"),
KeyValue("Debug APP", "com.tangem.wallet.debug"),
KeyValue("None", "")
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt
index ff27859e60..f8c304044c 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt
@@ -17,7 +17,7 @@ class ItemTypes {
CommonId.CreateWallet, SigningMethodId.SignTx, SigningMethodId.SignTxRaw, SigningMethodId.SignValidatedTx,
SigningMethodId.SignValidatedTxRaw, SigningMethodId.SignValidatedTxIssuer,
SigningMethodId.SignValidatedTxRawIssuer, SigningMethodId.SignExternal, SignHashExPropId.RequireTerminalCertSig,
- SignHashExPropId.RequireTerminalTxSig, SignHashExPropId.CheckPin3, DenominationId.WriteOnPersonalize, TokenId.ItsToken,
+ SignHashExPropId.RequireTerminalTxSig, SignHashExPropId.CheckPin3, TokenId.ItsToken,
ProductMaskId.Note, ProductMaskId.Tag, ProductMaskId.IdCard, ProductMaskId.IdIssuerCard, SettingsMaskId.IsReusable, SettingsMaskId.NeedActivation,
SettingsMaskId.ForbidPurge, SettingsMaskId.AllowSelectBlockchain, SettingsMaskId.UseBlock, SettingsMaskId.OneApdu,
SettingsMaskId.UseCvc, SettingsMaskId.AllowSwapPin, SettingsMaskId.AllowSwapPin2, SettingsMaskId.ForbidDefaultPin,
@@ -34,7 +34,7 @@ class ItemTypes {
)
val numberList = mutableListOf(
- CardNumberId.Number, CommonId.MaxSignatures, SignHashExPropId.PinLessFloorLimit, DenominationId.Denomination, TokenId.Decimal
+ CardNumberId.Number, CommonId.MaxSignatures, SignHashExPropId.PinLessFloorLimit, TokenId.Decimal
)
val hiddenList = mutableListOf(
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 9298ef1eca..e6733ed9f4 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
@@ -52,9 +52,9 @@ class ItemsToPersonalizationConfig : ItemsToModel {
val export = PersonalizationConfig()
export.series = getTyped(CardNumberId.Series)
export.startNumber = getTyped(CardNumberId.Number)
- export.batchId = getTyped(CardNumberId.BatchId)
+ export.cardData.batch = getTyped(CardNumberId.BatchId)
export.curveID = getTyped(CommonId.Curve)
- export.blockchain = getTyped(CommonId.Blockchain)
+ export.cardData.blockchain = getTyped(CommonId.Blockchain)
export.blockchainCustom = getTyped(CommonId.BlockchainCustom)
export.MaxSignatures = getTyped(CommonId.MaxSignatures)
export.createWallet = getTyped(CommonId.CreateWallet)
@@ -70,12 +70,10 @@ class ItemsToPersonalizationConfig : ItemsToModel {
export.requireTerminalCertSignature = getTyped(SignHashExPropId.RequireTerminalCertSig)
export.requireTerminalTxSignature = getTyped(SignHashExPropId.RequireTerminalTxSig)
export.checkPIN3onCard = getTyped(SignHashExPropId.CheckPin3)
- export.writeOnPersonalization = getTyped(DenominationId.WriteOnPersonalize)
- export.denomination = getTyped(DenominationId.Denomination)
export.itsToken = getTyped(TokenId.ItsToken)
- export.symbol = getTyped(TokenId.Symbol)
- export.contractAddress = getTyped(TokenId.ContractAddress)
- export.decimal = getTyped(TokenId.Decimal)
+ export.cardData.token_symbol = getTyped(TokenId.Symbol)
+ export.cardData.token_contract_address = getTyped(TokenId.ContractAddress)
+ export.cardData.token_decimal = getTyped(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) }
@@ -85,7 +83,7 @@ class ItemsToPersonalizationConfig : ItemsToModel {
export.forbidPurgeWallet = getTyped(SettingsMaskId.ForbidPurge)
export.allowSelectBlockchain = getTyped(SettingsMaskId.AllowSelectBlockchain)
export.useBlock = getTyped(SettingsMaskId.UseBlock)
- export.oneApdu = getTyped(SettingsMaskId.OneApdu)
+ export.useOneCommandAtTime = getTyped(SettingsMaskId.OneApdu)
export.useCVC = getTyped(SettingsMaskId.UseCvc)
export.allowSwapPIN = getTyped(SettingsMaskId.AllowSwapPin)
export.allowSwapPIN2 = getTyped(SettingsMaskId.AllowSwapPin2)
@@ -138,14 +136,13 @@ class PersonalizationConfigToItems : ModelToItems {
blocList.add(cardNumber())
blocList.add(common())
blocList.add(signingMethod())
-// blocList.add(signHashExProperties())
-// blocList.add(denomination())
-// blocList.add(token())
-// blocList.add(productMask())
-// blocList.add(settingsMask())
-// blocList.add(settingsMaskProtocolEnc())
-// blocList.add(settingsMaskNdef())
-// blocList.add(pins())
+ blocList.add(signHashExProperties())
+ blocList.add(token())
+ blocList.add(productMask())
+ blocList.add(settingsMask())
+ blocList.add(settingsMaskProtocolEnc())
+ blocList.add(settingsMaskNdef())
+ blocList.add(pins())
blocList.iterate {
if (itemTypes.hiddenList.contains(it.id)) {
it.viewModel.viewState.isVisibleState.value = false
@@ -203,15 +200,6 @@ class PersonalizationConfigToItems : ModelToItems {
return block
}
- private fun denomination(): ItemGroup {
- val block = createGroup(BlockId.Denomination)
- mutableListOf(
- DenominationId.WriteOnPersonalize,
- DenominationId.Denomination
- ).forEach { createItem(block, it) }
- return block
- }
-
private fun token(): ItemGroup {
val block = createGroup(BlockId.Token)
mutableListOf(
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
deleted file mode 100644
index e71acdacd5..0000000000
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.tangem.devkit.ucase.variants.personalize.converter
-
-import com.tangem.commands.*
-import com.tangem.commands.personalization.entities.CardConfig
-import com.tangem.commands.personalization.entities.NdefRecord
-import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
-import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter
-import java.util.*
-
-class PersonalizationConfigToCardConfig : Converter {
-
- override fun convert(from: PersonalizationConfig): CardConfig {
- val signingMethodMaskBuilder = SigningMethodMaskBuilder()
- if (from.SigningMethod0) {
- signingMethodMaskBuilder.add(SigningMethod.SignHash)
- }
- if (from.SigningMethod1) {
- signingMethodMaskBuilder.add(SigningMethod.SignRaw)
- }
- if (from.SigningMethod2) {
- signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuer)
- }
- if (from.SigningMethod3) {
- signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuer)
- }
- if (from.SigningMethod4) {
- signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuerWriteIssuerData)
- }
- if (from.SigningMethod5) {
- signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuerWriteIssuerData)
- }
- if (from.SigningMethod6) {
- signingMethodMaskBuilder.add(SigningMethod.SignHash)
- }
- val signingMethod = signingMethodMaskBuilder.build()
-
- val isNote = from.cardData.product_note
- val isTag = from.cardData.product_tag
- val isIdCard = from.cardData.product_id_card
- val isIdIssuer = from.cardData.product_id_issuer
-
- val productMaskBuilder = ProductMaskBuilder()
- if (isNote) productMaskBuilder.add(com.tangem.commands.Product.Note)
- if (isTag) productMaskBuilder.add(com.tangem.commands.Product.Tag)
- if (isIdCard) productMaskBuilder.add(com.tangem.commands.Product.IdCard)
- if (isIdIssuer) productMaskBuilder.add(com.tangem.commands.Product.IdIssuer)
- val productMask = productMaskBuilder.build()
-
- var tokenSymbol: String? = null
- var tokenContractAddress: String? = null
- var tokenDecimal: Int? = null
- if (from.itsToken) {
- tokenSymbol = from.symbol
- tokenContractAddress = from.contractAddress
- tokenDecimal = from.decimal.toInt()
- }
-
- val blockchain = if (from.blockchain.isNotEmpty()) from.blockchain else from.blockchainCustom
- val cardData = CardData(
- blockchainName = blockchain,
- batchId = from.batchId,
- productMask = productMask,
- tokenSymbol = tokenSymbol,
- tokenContractAddress = tokenContractAddress,
- tokenDecimal = tokenDecimal,
- issuerName = null,
- manufactureDateTime = Calendar.getInstance().time,
- manufacturerSignature = null)
-
-
- val ndefs = mutableListOf()
- if (from.uri.isNotEmpty()) {
- ndefs.add(NdefRecord(NdefRecord.Type.URI, from.uri))
- }
- when (from.aar) {
- "None" -> null
- "--- CUSTOM ---" -> NdefRecord(NdefRecord.Type.AAR, from.aarCustom)
- else -> NdefRecord(NdefRecord.Type.AAR, from.aar)
- }?.let { ndefs.add(it) }
-
- return CardConfig(
- "Tangem",
- "Tangem Test",
- from.series,
- from.startNumber,
- 1000,
- from.PIN,
- from.PIN2,
- from.PIN3,
- from.hexCrExKey,
- from.CVC,
- from.pauseBeforePIN2.toInt(),
- from.smartSecurityDelay,
- EllipticCurve.byName(from.curveID) ?: EllipticCurve.Secp256k1,
- signingMethod,
- from.MaxSignatures.toInt(),
- from.isReusable,
- from.allowSwapPIN,
- from.allowSwapPIN2,
- from.useActivation,
- from.useCVC,
- from.useNDEF,
- from.useDynamicNDEF,
- from.oneApdu,
- from.useBlock,
- from.allowSelectBlockchain,
- from.forbidPurgeWallet,
- from.protocolAllowUnencrypted,
- from.protocolAllowStaticEncryption,
- from.protectIssuerDataAgainstReplay,
- from.forbidDefaultPIN,
- from.disablePrecomputedNDEF,
- from.skipSecurityDelayIfValidatedByIssuer,
- from.skipCheckPIN2andCVCIfValidatedByIssuer,
- from.skipSecurityDelayIfValidatedByLinkedTerminal,
- from.restrictOverwriteIssuerDataEx,
- from.requireTerminalTxSignature,
- from.requireTerminalCertSignature,
- from.checkPIN3onCard,
- from.createWallet,
- cardData,
- ndefs
- )
- }
-}
\ No newline at end of file
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
new file mode 100644
index 0000000000..36c074f0a4
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationJsonConverter.kt
@@ -0,0 +1,203 @@
+package com.tangem.devkit.ucase.variants.personalize.converter
+
+import com.tangem.commands.EllipticCurve
+import com.tangem.commands.SigningMethod
+import com.tangem.commands.SigningMethodMask
+import com.tangem.commands.personalization.entities.NdefRecord
+import com.tangem.devkit._arch.structure.abstraction.TwoWayConverter
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
+import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationJson
+import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter
+
+/**
+[REDACTED_AUTHOR]
+ */
+class PersonalizationJsonConverter : TwoWayConverter {
+
+ override fun aToB(from: PersonalizationJson): PersonalizationConfig = JsonToConfig().convert(from)
+
+ override fun bToA(from: PersonalizationConfig): PersonalizationJson = ConfigToJson().convert(from)
+}
+
+internal class JsonToConfig : Converter {
+
+ override fun convert(jsonDto: PersonalizationJson): PersonalizationConfig {
+ val config = PersonalizationConfig.default()
+ config.apply {
+ series = jsonDto.series
+ startNumber = jsonDto.startNumber
+ curveID = EllipticCurve.byName(jsonDto.curveID)?.curve ?: ""
+ blockchainCustom = ""
+ MaxSignatures = jsonDto.MaxSignatures
+ createWallet = jsonDto.createWallet != 0L
+ hexCrExKey = jsonDto.hexCrExKey
+ requireTerminalTxSignature = jsonDto.requireTerminalTxSignature
+ requireTerminalCertSignature = jsonDto.requireTerminalCertSignature
+ checkPIN3onCard = jsonDto.checkPIN3onCard
+ isReusable = jsonDto.isReusable
+ useActivation = jsonDto.useActivation
+ forbidPurgeWallet = jsonDto.forbidPurgeWallet
+ allowSelectBlockchain = jsonDto.allowSelectBlockchain
+ useBlock = jsonDto.useBlock
+ useOneCommandAtTime = jsonDto.useOneCommandAtTime
+ useCVC = jsonDto.useCVC
+ allowSwapPIN = jsonDto.allowSwapPIN
+ allowSwapPIN2 = jsonDto.allowSwapPIN2
+ forbidDefaultPIN = jsonDto.forbidDefaultPIN
+ smartSecurityDelay = jsonDto.smartSecurityDelay
+ protectIssuerDataAgainstReplay = jsonDto.protectIssuerDataAgainstReplay
+ skipSecurityDelayIfValidatedByIssuer = jsonDto.skipSecurityDelayIfValidatedByIssuer
+ skipCheckPIN2andCVCIfValidatedByIssuer = jsonDto.skipCheckPIN2andCVCIfValidatedByIssuer
+ skipSecurityDelayIfValidatedByLinkedTerminal = jsonDto.skipSecurityDelayIfValidatedByLinkedTerminal
+ restrictOverwriteIssuerDataEx = jsonDto.restrictOverwriteIssuerDataEx
+ protocolAllowUnencrypted = jsonDto.protocolAllowUnencrypted
+ protocolAllowStaticEncryption = jsonDto.protocolAllowStaticEncryption
+ useNDEF = jsonDto.useNDEF
+ useDynamicNDEF = jsonDto.useDynamicNDEF
+ disablePrecomputedNDEF = jsonDto.disablePrecomputedNDEF
+ PIN = jsonDto.PIN
+ PIN2 = jsonDto.PIN2
+ PIN3 = jsonDto.PIN3
+ CVC = jsonDto.CVC
+ pauseBeforePIN2 = jsonDto.pauseBeforePIN2
+ count = jsonDto.count
+ issuerName = jsonDto.issuerName
+ issuerData = jsonDto.issuerData
+// numberFormat = from.numberFormat
+// pinLessFloorLimit = 100000L
+ }
+
+ fillCardData(jsonDto, config)
+ fillSigningMethod(jsonDto, config)
+ fillNdef(jsonDto, config)
+
+ return config
+ }
+
+ private fun fillCardData(jsonDto: PersonalizationJson, config: PersonalizationConfig) {
+ val jsonCardData = jsonDto.cardData
+
+ // copy whole object and then checking tricky places
+ config.cardData = jsonCardData
+
+ config.itsToken = jsonCardData.token_contract_address.isNotEmpty() || jsonCardData.token_symbol.isNotEmpty()
+
+ val selectedBlockchain = Helper.listOfBlockchain().firstOrNull { it.value == jsonCardData.blockchain }
+ if (selectedBlockchain == null) {
+ config.cardData.blockchain = PersonalizationJson.CUSTOM
+ config.blockchainCustom = jsonCardData.blockchain
+ }
+ }
+
+ private fun fillSigningMethod(jsonDto: PersonalizationJson, config: PersonalizationConfig) {
+ val mask = SigningMethodMask(jsonDto.SigningMethod.toInt())
+ if (mask.contains(SigningMethod.SignHash)) config.SigningMethod0 = true
+ if (mask.contains(SigningMethod.SignRaw)) config.SigningMethod1 = true
+ if (mask.contains(SigningMethod.SignHashValidateByIssuer)) config.SigningMethod2 = true
+ if (mask.contains(SigningMethod.SignRawValidateByIssuer)) config.SigningMethod3 = true
+ if (mask.contains(SigningMethod.SignHashValidateByIssuerWriteIssuerData)) config.SigningMethod4 = true
+ if (mask.contains(SigningMethod.SignRawValidateByIssuerWriteIssuerData)) config.SigningMethod5 = true
+ }
+
+ private fun fillNdef(jsonDto: PersonalizationJson, config: PersonalizationConfig) {
+ jsonDto.ndef.forEach { record ->
+ when (record.type) {
+ NdefRecord.Type.URI -> config.uri = record.value
+ NdefRecord.Type.AAR -> config.aar = record.value
+ NdefRecord.Type.TEXT -> {
+ }
+ }
+ }
+ val selectedAar = Helper.aarList().firstOrNull { it.value == config.aar }
+ if (selectedAar == null) {
+ config.aarCustom = config.aar
+ config.aar = ""
+ }
+ }
+}
+
+internal class ConfigToJson : Converter {
+
+ override fun convert(from: PersonalizationConfig): PersonalizationJson {
+ val jsonDto = PersonalizationJson()
+ jsonDto.apply {
+ releaseVersion = false
+ issuerName = from.issuerName
+ series = from.series
+ startNumber = from.startNumber
+ count = from.count
+ PIN = from.PIN
+ PIN2 = from.PIN2
+ PIN3 = from.PIN3
+ hexCrExKey = from.hexCrExKey
+ CVC = from.CVC
+ pauseBeforePIN2 = from.pauseBeforePIN2
+ smartSecurityDelay = from.smartSecurityDelay
+ curveID = from.curveID
+ MaxSignatures = from.MaxSignatures
+ isReusable = from.isReusable
+ allowSwapPIN = from.allowSwapPIN
+ allowSwapPIN2 = from.allowSwapPIN2
+ useActivation = from.useActivation
+ useCVC = from.useCVC
+ useNDEF = from.useNDEF
+ useDynamicNDEF = from.useDynamicNDEF
+ useOneCommandAtTime = from.useOneCommandAtTime
+ useBlock = from.useBlock
+ allowSelectBlockchain = from.allowSelectBlockchain
+ forbidPurgeWallet = from.forbidPurgeWallet
+ protocolAllowUnencrypted = from.protocolAllowUnencrypted
+ protocolAllowStaticEncryption = from.protocolAllowStaticEncryption
+ protectIssuerDataAgainstReplay = from.protectIssuerDataAgainstReplay
+ forbidDefaultPIN = from.forbidDefaultPIN
+ disablePrecomputedNDEF = from.disablePrecomputedNDEF
+ skipSecurityDelayIfValidatedByIssuer = from.skipSecurityDelayIfValidatedByIssuer
+ skipCheckPIN2andCVCIfValidatedByIssuer = from.skipCheckPIN2andCVCIfValidatedByIssuer
+ skipSecurityDelayIfValidatedByLinkedTerminal = from.skipSecurityDelayIfValidatedByLinkedTerminal
+ restrictOverwriteIssuerDataEx = from.restrictOverwriteIssuerDataEx
+ requireTerminalTxSignature = from.requireTerminalTxSignature
+ requireTerminalCertSignature = from.requireTerminalCertSignature
+ checkPIN3onCard = from.checkPIN3onCard
+ createWallet = if (from.createWallet) 1 else 0
+ issuerData = from.issuerData
+// numberFormat = from.numberFormat
+// pinLessFloorLimit = 100000L
+ }
+
+ fillCardData(from, jsonDto)
+ fillSigningMethod(from, jsonDto)
+ fillNdef(from, jsonDto)
+ return jsonDto
+ }
+
+ private fun fillCardData(config: PersonalizationConfig, jsonDto: PersonalizationJson) {
+ jsonDto.cardData = config.cardData
+ if (config.cardData.blockchain == PersonalizationJson.CUSTOM) {
+ jsonDto.cardData.blockchain = config.blockchainCustom
+ }
+ if (config.itsToken) {
+ jsonDto.cardData.token_contract_address = config.cardData.token_contract_address
+ jsonDto.cardData.token_symbol = config.cardData.token_symbol
+ jsonDto.cardData.token_decimal = config.cardData.token_decimal
+ } else {
+ jsonDto.cardData.token_contract_address = ""
+ jsonDto.cardData.token_symbol = ""
+ jsonDto.cardData.token_decimal = 0
+ }
+ }
+
+ private fun fillSigningMethod(config: PersonalizationConfig, jsonDto: PersonalizationJson) {
+ jsonDto.SigningMethod = PersonalizationConfig.makeSigningMethodMask(config).rawValue.toLong()
+ }
+
+ private fun fillNdef(config: PersonalizationConfig, jsonDto: PersonalizationJson) {
+ fun add(value: String, type: NdefRecord.Type) {
+ if (value.isNotEmpty()) jsonDto.ndef.add(NdefRecord(type, value))
+ }
+
+ if (config.aarCustom.isNotEmpty()) add(config.aarCustom, NdefRecord.Type.AAR)
+ else add(config.aar, NdefRecord.Type.AAR)
+
+ add(config.uri, NdefRecord.Type.URI)
+ }
+}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt
index 836eac58bb..db4087e625 100644
--- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt
@@ -1,6 +1,9 @@
package com.tangem.devkit.ucase.variants.personalize.dto
import com.tangem.commands.EllipticCurve
+import com.tangem.commands.SigningMethod
+import com.tangem.commands.SigningMethodMask
+import com.tangem.commands.SigningMethodMaskBuilder
/**
[REDACTED_AUTHOR]
@@ -10,11 +13,9 @@ class PersonalizationConfig {
// Card number
var series = ""
var startNumber: Long = 0
- var batchId = ""
// Common
var curveID = ""
- var blockchain = ""
var blockchainCustom = ""
var MaxSignatures: Long = 0
var createWallet = false
@@ -35,16 +36,10 @@ class PersonalizationConfig {
var requireTerminalCertSignature = false
var checkPIN3onCard = false
- // Denomination
- var writeOnPersonalization = false
- var denomination: Long = 0
-
// Token
var itsToken = false
- var symbol = ""
- var contractAddress = ""
- var decimal: Long = 0
+ // Product mask
var cardData = CardData()
// Settings mask
@@ -53,7 +48,7 @@ class PersonalizationConfig {
var forbidPurgeWallet = false
var allowSelectBlockchain = false
var useBlock = false
- var oneApdu = false
+ var useOneCommandAtTime = false
var useCVC = false
var allowSwapPIN = false
var allowSwapPIN2 = false
@@ -69,6 +64,7 @@ class PersonalizationConfig {
var protocolAllowUnencrypted = false
var protocolAllowStaticEncryption = false
+ // Settings mask
var useNDEF = false
var useDynamicNDEF = false
var disablePrecomputedNDEF = false
@@ -83,17 +79,20 @@ class PersonalizationConfig {
var CVC = ""
var pauseBeforePIN2: Long = 0
+ var count: Long = 0
+ var issuerName = ""
+ var issuerData = null
+
companion object {
+
fun default(): PersonalizationConfig {
return PersonalizationConfig().apply {
// Card number
series = "BB"
startNumber = 300000000000L
- batchId = "ffff"
// Common
curveID = EllipticCurve.Secp256k1.curve
- blockchain = "ETH"
blockchainCustom = ""
MaxSignatures = 999999L
createWallet = true
@@ -114,17 +113,10 @@ class PersonalizationConfig {
requireTerminalCertSignature = false
checkPIN3onCard = true
- // Denomination
- writeOnPersonalization = false
- denomination = 1000000L
-
// Token
itsToken = false
- symbol = ""
- contractAddress = ""
- decimal = 0L
- cardData = CardData()
+ cardData = CardData.default()
// Settings mask
isReusable = true
@@ -132,7 +124,7 @@ class PersonalizationConfig {
forbidPurgeWallet = false
allowSelectBlockchain = false
useBlock = false
- oneApdu = false
+ useOneCommandAtTime = false
useCVC = false
allowSwapPIN = true
allowSwapPIN2 = true
@@ -161,17 +153,67 @@ class PersonalizationConfig {
PIN3 = ""
CVC = "000"
pauseBeforePIN2 = 5000L
+
+ count = 1050
+ issuerName = "TANGEM"
+ issuerData = null
}
}
+
+ fun makeSigningMethodMask(from: PersonalizationConfig): SigningMethodMask {
+ val signingMethodMaskBuilder = SigningMethodMaskBuilder()
+ if (from.SigningMethod0) {
+ signingMethodMaskBuilder.add(SigningMethod.SignHash)
+ }
+ if (from.SigningMethod1) {
+ signingMethodMaskBuilder.add(SigningMethod.SignRaw)
+ }
+ if (from.SigningMethod2) {
+ signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuer)
+ }
+ if (from.SigningMethod3) {
+ signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuer)
+ }
+ if (from.SigningMethod4) {
+ signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuerWriteIssuerData)
+ }
+ if (from.SigningMethod5) {
+ signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuerWriteIssuerData)
+ }
+ if (from.SigningMethod6) {
+ signingMethodMaskBuilder.add(SigningMethod.SignHash)
+ }
+ return signingMethodMaskBuilder.build()
+ }
}
}
class CardData {
- var date = "2020-02-17"
- var batch = "FF87"
- var blockchain = "IROHA"
- var product_note = true
+ var date = ""
+ var batch = ""
+ var blockchain = ""
+ var token_symbol = ""
+ var token_contract_address = ""
+ var token_decimal: Long = 0
+ var product_note = false
var product_tag = false
var product_id_card = false
var product_id_issuer = false
+
+ companion object {
+ fun default(): CardData {
+ return CardData().apply {
+ date = "2020-02-17"
+ batch = "FFFF"
+ blockchain = "ETH"
+ token_symbol = ""
+ token_contract_address = ""
+ token_decimal = 0
+ product_note = true
+ product_tag = false
+ product_id_card = false
+ product_id_issuer = false
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt
new file mode 100644
index 0000000000..afe2750564
--- /dev/null
+++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt
@@ -0,0 +1,138 @@
+package com.tangem.devkit.ucase.variants.personalize.dto
+
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.tangem.commands.EllipticCurve
+import com.tangem.commands.Product
+import com.tangem.commands.ProductMaskBuilder
+import com.tangem.commands.SigningMethodMask
+import com.tangem.commands.personalization.entities.CardConfig
+import com.tangem.commands.personalization.entities.NdefRecord
+import java.util.*
+
+class PersonalizationJson {
+
+ var issuerName = ""
+ var series = ""
+ var startNumber = 0L
+ var count = 0L
+ var PIN = ""
+ var PIN2 = ""
+ var PIN3 = ""
+ var hexCrExKey = ""
+ var CVC = ""
+ var pauseBeforePIN2 = 0L
+ var smartSecurityDelay = false
+ var curveID = ""
+ var SigningMethod = 0L
+ var MaxSignatures = 0L
+ var isReusable = false
+ var allowSwapPIN = false
+ var allowSwapPIN2 = false
+ var useActivation = false
+ var useCVC = false
+ var useNDEF = false
+ var useDynamicNDEF = false
+ var useOneCommandAtTime = false
+ var useBlock = false
+ var allowSelectBlockchain = false
+ var forbidPurgeWallet = false
+ var protocolAllowUnencrypted = false
+ var protocolAllowStaticEncryption = false
+ var protectIssuerDataAgainstReplay = false
+ var forbidDefaultPIN = false
+ var disablePrecomputedNDEF = false
+ var skipSecurityDelayIfValidatedByIssuer = false
+ var skipCheckPIN2andCVCIfValidatedByIssuer = false
+ var skipSecurityDelayIfValidatedByLinkedTerminal = false
+ var restrictOverwriteIssuerDataEx = false
+ var requireTerminalTxSignature = false
+ var requireTerminalCertSignature = false
+ var checkPIN3onCard = false
+ var createWallet = 0L
+ var issuerData = null
+
+ var ndef = mutableListOf()
+ var cardData = CardData()
+
+ var releaseVersion = false
+ var numberFormat = ""
+
+ companion object {
+ const val CUSTOM = "--- CUSTOM ---"
+
+ fun getJsonConverter(): Gson {
+ val builder = GsonBuilder().setPrettyPrinting()
+ return builder.create()
+ }
+ }
+}
+
+fun PersonalizationJson.toCardConfig(): CardConfig {
+ val isNote = cardData.product_note
+ val isTag = cardData.product_tag
+ val isIdCard = cardData.product_id_card
+ val isIdIssuer = cardData.product_id_issuer
+
+ val productMaskBuilder = ProductMaskBuilder()
+ if (isNote) productMaskBuilder.add(Product.Note)
+ if (isTag) productMaskBuilder.add(Product.Tag)
+ if (isIdCard) productMaskBuilder.add(Product.IdCard)
+ if (isIdIssuer) productMaskBuilder.add(Product.IdIssuer)
+ val productMask = productMaskBuilder.build()
+
+ val sdkCardData = com.tangem.commands.CardData(
+ blockchainName = this.cardData.blockchain,
+ batchId = this.cardData.batch,
+ productMask = productMask,
+ tokenSymbol = this.cardData.token_symbol,
+ tokenContractAddress = this.cardData.token_contract_address,
+ tokenDecimal = this.cardData.token_decimal.toInt(),
+ issuerName = this.issuerName,
+ manufactureDateTime = Calendar.getInstance().time,
+ manufacturerSignature = null)
+
+ return CardConfig(
+ this.issuerName,
+ "Tangem Test",
+ this.series,
+ this.startNumber,
+ this.count.toInt(),
+ this.PIN,
+ this.PIN2,
+ this.PIN3,
+ this.hexCrExKey,
+ this.CVC,
+ this.pauseBeforePIN2.toInt(),
+ this.smartSecurityDelay,
+ EllipticCurve.byName(this.curveID) ?: EllipticCurve.Secp256k1,
+ SigningMethodMask(this.SigningMethod.toInt()),
+ this.MaxSignatures.toInt(),
+ this.isReusable,
+ this.allowSwapPIN,
+ this.allowSwapPIN2,
+ this.useActivation,
+ this.useCVC,
+ this.useNDEF,
+ this.useDynamicNDEF,
+ this.useOneCommandAtTime,
+ this.useBlock,
+ this.allowSelectBlockchain,
+ this.forbidPurgeWallet,
+ this.protocolAllowUnencrypted,
+ this.protocolAllowStaticEncryption,
+ this.protectIssuerDataAgainstReplay,
+ this.forbidDefaultPIN,
+ this.disablePrecomputedNDEF,
+ this.skipSecurityDelayIfValidatedByIssuer,
+ this.skipCheckPIN2andCVCIfValidatedByIssuer,
+ this.skipSecurityDelayIfValidatedByLinkedTerminal,
+ this.restrictOverwriteIssuerDataEx,
+ this.requireTerminalTxSignature,
+ this.requireTerminalCertSignature,
+ this.checkPIN3onCard,
+ this.createWallet != 0L,
+ sdkCardData,
+ this.ndef
+ )
+}
\ No newline at end of file
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 9fbc9d8b01..76d0116ae3 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
@@ -24,6 +24,7 @@ import com.tangem.devkit._arch.widget.WidgetBuilder
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.view.beginDelayedTransition
import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
@@ -50,7 +51,12 @@ import ru.dev.gbixahue.eu4d.lib.android.global.threading.postWork
*/
class PersonalizationFragment : BaseCardActionFragment(), PersonalizationPresetView {
- override val itemsManager: ItemsManager by lazy { PersonalizationItemsManager(PersonalizationConfigStore(requireContext())) }
+ private lateinit var personalizationItemsManager: PersonalizationItemsManager
+
+ override val itemsManager: ItemsManager by lazy {
+ personalizationItemsManager = PersonalizationItemsManager(PersonalizationConfigStore(requireContext()))
+ personalizationItemsManager
+ }
override fun getLayoutId(): Int = R.layout.fg_base_action_layout
@@ -106,20 +112,47 @@ class PersonalizationFragment : BaseCardActionFragment(), PersonalizationPresetV
override fun widgetsWasCreated() {
super.widgetsWasCreated()
- val btnContainer = contentContainer.inflate(R.layout.view_simple_button)
- val btn = btnContainer.findViewById