From 24bb1217b223e9842b809f4e2fa12dca8dd83ee1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 27 Mar 2020 15:41:10 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tangemtest/Old_MainActivity.kt | 4 +- .../_arch/structure/HelpAbstracts.kt | 6 +- .../_arch/structure/abstraction/Item.kt | 5 +- .../_arch/structure/abstraction/ViewModel.kt | 5 +- .../tangemtest/extensions/CardConfig.kt | 2 +- .../ucase/domain/actions/CardAction.kt | 2 + .../ucase/domain/actions/PersonalizeAction.kt | 10 +- .../domain/paramsManager/ParamsManager.kt | 6 +- .../managers/BaseParamsManager.kt | 8 +- .../initializers/PersonalizeResources.kt | 2 +- .../tangemtest/ucase/ui/ParamsViewModel.kt | 32 +++-- .../ucase/ui/widgets/ParameterWidget.kt | 3 +- .../tangem/tangemtest/ucase/variants/Ids.kt | 2 +- .../ucase/variants/personalize/Ids.kt | 3 +- .../converter/BlockToJsonConverter.kt | 18 --- .../converter/IdToValueAssociations.kt | 9 +- ...erter.kt => PersonalizeConfigConverter.kt} | 116 +++++++++++++++++- .../personalize/converter/ValueMapper.kt | 13 +- .../personalize/dto/PersonalizeConfig.kt | 7 +- .../personalize/ui/PersonalizeFragment.kt | 15 ++- .../personalize/ui/PersonalizeViewModel.kt | 20 +-- 21 files changed, 211 insertions(+), 77 deletions(-) delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/BlockToJsonConverter.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/{JsonToBlockConverter.kt => PersonalizeConfigConverter.kt} (62%) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt index 36f3b2adfd..26dc5d312a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt @@ -6,7 +6,7 @@ import androidx.appcompat.app.AppCompatActivity import com.tangem.CardManager import com.tangem.commands.personalization.CardConfig import com.tangem.tangem_sdk_new.extensions.init -import com.tangem.tangemtest.extensions.init +import com.tangem.tangemtest.extensions.create import com.tangem.tasks.ScanEvent import com.tangem.tasks.TaskError import com.tangem.tasks.TaskEvent @@ -155,7 +155,7 @@ class Old_MainActivity : AppCompatActivity() { btn_read_write_user_data?.setOnClickListener { startActivity(Intent(this, TestUserDataActivity::class.java)) } btn_personalize?.setOnClickListener { _ -> cardManager.personalize( - CardConfig.init(application), "BB00000000000395" + CardConfig.create(application), "BB00000000000395" ) { when (it) { is TaskEvent.Completion -> { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt index 7f396518aa..7706ea2c14 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt @@ -7,8 +7,10 @@ interface DataHolder { var viewModel: D } -interface Payload { - val payload: MutableMap +typealias Payload = MutableMap + +interface PayloadHolder { + val payload: Payload } interface ItemListHolder { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt index 85a12c1856..2865a8fab3 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt @@ -3,11 +3,12 @@ package com.tangem.tangemtest._arch.structure.abstraction import com.tangem.tangemtest._arch.structure.DataHolder import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.Payload +import com.tangem.tangemtest._arch.structure.PayloadHolder /** [REDACTED_AUTHOR] */ -interface Item : Payload { +interface Item : PayloadHolder { val id: Id var parent: Item? } @@ -16,5 +17,5 @@ abstract class BaseItem( override var viewModel: ItemViewModel ) : Item, DataHolder> { override var parent: Item? = null - override val payload: MutableMap = mutableMapOf() + override val payload: Payload = mutableMapOf() } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt index 244f55b204..63a54281d5 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt @@ -2,6 +2,7 @@ package com.tangem.tangemtest._arch.structure.abstraction import com.tangem.tangemtest._arch.structure.ILog import com.tangem.tangemtest._arch.structure.Payload +import com.tangem.tangemtest._arch.structure.PayloadHolder /** @@ -10,7 +11,7 @@ import com.tangem.tangemtest._arch.structure.Payload typealias ValueChange = (V?) -> Unit typealias SafeValueChange = (V) -> Unit -interface ItemViewModel : Payload { +interface ItemViewModel : PayloadHolder { val viewState: ViewState var data: D? var defaultData: D? @@ -22,7 +23,7 @@ interface ItemViewModel : Payload { open class BaseItemViewModel : ItemViewModel { override val viewState: ViewState = ViewState() - override val payload: MutableMap = mutableMapOf() + override val payload: Payload = mutableMapOf() // Don't update it directly from a View. Use for it updateDataByView() override var data: D? = null diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt index 5412ab7c15..adda79efbb 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/CardConfig.kt @@ -7,7 +7,7 @@ import com.tangem.commands.personalization.CardConfig import com.tangem.commands.personalization.NdefRecord import java.util.* -fun CardConfig.Companion.init(application: Application): CardConfig { +fun CardConfig.Companion.create(application: Application): CardConfig { val preferences = application.getSharedPreferences("prefs", Context.MODE_PRIVATE) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/CardAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/CardAction.kt index 0517d86fbd..1042d8bc20 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/CardAction.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/CardAction.kt @@ -2,6 +2,7 @@ package com.tangem.tangemtest.ucase.domain.actions import com.tangem.CardManager import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.Payload import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction.AfterActionModification @@ -17,6 +18,7 @@ import com.tangem.tasks.TaskEvent data class AttrForAction( val cardManager: CardManager, val paramsList: List, + val payload: Payload, val consequence: ParamsChangeConsequence? ) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt index d66ae12b1c..51e8223bea 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt @@ -1,8 +1,6 @@ package com.tangem.tangemtest.ucase.domain.actions import com.tangem.commands.personalization.CardConfig -import com.tangem.tangemtest.AppTangemDemo -import com.tangem.tangemtest.extensions.init import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback import com.tangem.tasks.ScanEvent import com.tangem.tasks.TaskEvent @@ -21,8 +19,10 @@ class PersonalizeAction : BaseCardAction() { handleResponse(response, null, attrs, callback) return@executeMainAction } + val cardConfig = attrs.payload.remove(cardConfig) as? CardConfig + ?: throw IllegalArgumentException("CardConfig must be in the payloads of the ParamsManager") - attrs.cardManager.personalize(CardConfig.init(AppTangemDemo.appInstance), cardId) { + attrs.cardManager.personalize(cardConfig, cardId) { handleResponse(it, null, attrs, callback) } } @@ -44,4 +44,8 @@ class PersonalizeAction : BaseCardAction() { } } + + companion object { + val cardConfig = "cardConfig" + } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ParamsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ParamsManager.kt index 80613d01c0..8176199631 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ParamsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ParamsManager.kt @@ -2,6 +2,8 @@ package com.tangem.tangemtest.ucase.domain.paramsManager import com.tangem.CardManager import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.Payload +import com.tangem.tangemtest._arch.structure.PayloadHolder import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tasks.TaskEvent @@ -14,13 +16,13 @@ typealias ActionCallback = (ActionResponse, AffectedList) -> Unit /** [REDACTED_AUTHOR] */ -interface ParamsManager { +interface ParamsManager : PayloadHolder { fun parameterChanged(id: Id, value: Any?, callback: AffectedParamsCallback? = null) fun getParams(): List fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? - + fun attachPayload(payload: Payload) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseParamsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseParamsManager.kt index a33a0c4644..353dd20d37 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseParamsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseParamsManager.kt @@ -2,6 +2,7 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.managers import com.tangem.CardManager import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.Payload import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest.ucase.domain.actions.AttrForAction import com.tangem.tangemtest.ucase.domain.actions.CardAction @@ -16,6 +17,7 @@ import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequen */ abstract class BaseParamsManager(protected val action: CardAction) : ParamsManager { + override val payload: MutableMap = mutableMapOf() protected val paramsList: List by lazy { createParamsList() } abstract fun createParamsList(): List @@ -32,6 +34,10 @@ abstract class BaseParamsManager(protected val action: CardAction) : ParamsManag override fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? = null + override fun attachPayload(payload: Payload) { + payload.forEach { this.payload[it.key] = it.value } + } + // Use it if current parameter needs to be affect any other parameters protected open fun applyChangesByAffectedParams(param: Item, callback: AffectedParamsCallback?) { getChangeConsequence()?.affectChanges(param, paramsList)?.let { callback?.invoke(it) } @@ -40,5 +46,5 @@ abstract class BaseParamsManager(protected val action: CardAction) : ParamsManag protected open fun getChangeConsequence(): ParamsChangeConsequence? = null protected fun getAttrsForAction(cardManager: CardManager) - : AttrForAction = AttrForAction(cardManager, paramsList, getChangeConsequence()) + : AttrForAction = AttrForAction(cardManager, paramsList, payload, getChangeConsequence()) } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt index ca78771e14..9032ac889d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt @@ -117,7 +117,7 @@ class PersonalizeResources() { holder.register(SettingsMaskNdef.UseNdef, Resources(R.string.pers_item_use_ndef, R.string.info_pers_item_use_ndef)) holder.register(SettingsMaskNdef.DynamicNdef, Resources(R.string.pers_item_dynamic_ndef, R.string.info_pers_item_dynamic_ndef)) holder.register(SettingsMaskNdef.DisablePrecomputedNdef, Resources(R.string.pers_item_disable_precomputed_ndef, R.string.info_pers_item_disable_precomputed_ndef)) - holder.register(SettingsMaskNdef.AAR, Resources(R.string.pers_item_aar, R.string.info_pers_item_aar)) + holder.register(SettingsMaskNdef.Aar, Resources(R.string.pers_item_aar, R.string.info_pers_item_aar)) } private fun initPins(holder: TypedHolder) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt index 9df1ce1dcd..dd2ae58474 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt @@ -49,7 +49,8 @@ class ParamsViewModel(val paramsManager: ParamsManager) : ViewModel() { } //invokes Scan, Sign etc... - fun invokeMainAction() { + fun invokeMainAction(payload: MutableMap = mutableMapOf()) { + paramsManager.attachPayload(payload) performAction(paramsManager, cardManager) { paramsManager, cardManager -> paramsManager.invokeMainAction(cardManager) { response, listOfChangedParams -> notifier.handleActionResult(response, listOfChangedParams) @@ -107,17 +108,26 @@ internal class Notifier(private val vm: ParamsViewModel) { } private fun handleCompletionEvent(taskEvent: TaskEvent.Completion<*>) { - val error: TaskError = taskEvent.error ?: return - when (error) { - is TaskError.UserCancelled -> { - if (notShowedError == null) { - vm.seError.postValue("User was cancelled") - } else { - vm.seError.postValue("${notShowedError!!::class.simpleName}") - notShowedError = null - } + if (taskEvent.error == null) { + if (notShowedError == null) { + vm.seError.postValue("User was cancelled") + } else { + vm.seError.postValue("${notShowedError!!::class.simpleName}") + notShowedError = null + } + } else { + when (taskEvent.error) { + is TaskError.UserCancelled -> { + if (notShowedError == null) { + vm.seError.postValue("User was cancelled") + } else { + vm.seError.postValue("${notShowedError!!::class.simpleName}") + notShowedError = null + } + } + else -> notShowedError = taskEvent.error } - else -> notShowedError = error } + } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt index 2147654525..15ba1cdcba 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt @@ -113,6 +113,7 @@ class ParameterWidget( } } -fun ParameterWidget.getResNameId(id: Id? = null): Int = MainResourceHolder.safeGet(id?: this.id).resName +fun ParameterWidget.getResNameId(id: Id? = null): Int = MainResourceHolder.safeGet(id + ?: this.id).resName fun ParameterWidget.getResDescription(): Int? = MainResourceHolder.safeGet(id).resDescription \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt index 01d33a8aa4..13f4ddcf27 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt @@ -5,7 +5,7 @@ import com.tangem.tangemtest._arch.structure.Id /** [REDACTED_AUTHOR] */ -enum class TlvId: Id { +enum class TlvId : Id { CardId, TransactionOutHash, } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt index f24354de68..44860aff33 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt @@ -101,7 +101,8 @@ enum class SettingsMaskNdef : BlockItem { UseNdef, DynamicNdef, DisablePrecomputedNdef, - AAR, + Aar, + AarCustom } enum class Pins : BlockItem { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/BlockToJsonConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/BlockToJsonConverter.kt deleted file mode 100644 index 8b3d3a5ee5..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/BlockToJsonConverter.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.tangem.tangemtest.ucase.variants.personalize.converter - -import com.tangem.tangemtest._arch.structure.abstraction.Block -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig -import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter - -/** -[REDACTED_AUTHOR] - */ -class BlockToJsonConverter( - private val valueMapper: ValueMapper, - private val config: PersonalizeConfig -) : Converter, PersonalizeConfig> { - - override fun convert(from: List): PersonalizeConfig { - return valueMapper.mapOnObject(from, config) - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/IdToValueAssociations.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/IdToValueAssociations.kt index ee5e6cf935..98928924d9 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/IdToValueAssociations.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/IdToValueAssociations.kt @@ -56,7 +56,7 @@ class IdToValueAssociations : BaseTypedHolder() { register(SettingsMask.ForbidPurge, Value(from.forbidPurgeWallet)) register(SettingsMask.AllowSelectBlockchain, Value(from.allowSelectBlockchain)) register(SettingsMask.UseBlock, Value(from.useBlock)) - register(SettingsMask.OneApdu, Value(from.useOneCommandAtTime)) + register(SettingsMask.OneApdu, Value(from.oneApdu)) register(SettingsMask.UseCvc, Value(from.useCVC)) register(SettingsMask.AllowSwapPin, Value(from.allowSwapPIN)) register(SettingsMask.AllowSwapPin2, Value(from.allowSwapPIN2)) @@ -72,7 +72,8 @@ class IdToValueAssociations : BaseTypedHolder() { register(SettingsMaskNdef.UseNdef, Value(from.useNDEF)) register(SettingsMaskNdef.DynamicNdef, Value(from.useDynamicNDEF)) register(SettingsMaskNdef.DisablePrecomputedNdef, Value(from.disablePrecomputedNDEF)) - register(SettingsMaskNdef.AAR, Value(from.NDEF, Helper.aarList())) + register(SettingsMaskNdef.Aar, Value(from.aar, Helper.aarList())) + register(SettingsMaskNdef.AarCustom, Value(from.aar)) register(Pins.Pin, Value(from.PIN)) register(Pins.Pin2, Value(from.PIN2)) register(Pins.Pin3, Value(from.PIN3)) @@ -111,8 +112,8 @@ internal class Helper { fun aarList(): List { return mutableListOf( KeyValue("--- CUSTOM ---", ""), - KeyValue("Release APP", "com.some.release"), - KeyValue("Debug APP", "com.some.debug"), + KeyValue("Release APP", "com.tangem.wallet"), + KeyValue("Debug APP", "com.tangem.wallet.debug"), KeyValue("None", "") ) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/JsonToBlockConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizeConfigConverter.kt similarity index 62% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/JsonToBlockConverter.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizeConfigConverter.kt index 1d57deae2b..6223b4eae3 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/JsonToBlockConverter.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizeConfigConverter.kt @@ -1,5 +1,10 @@ package com.tangem.tangemtest.ucase.variants.personalize.converter +import com.tangem.commands.CardData +import com.tangem.commands.EllipticCurve +import com.tangem.commands.ProductMaskBuilder +import com.tangem.commands.personalization.CardConfig +import com.tangem.commands.personalization.NdefRecord import com.tangem.tangemtest._arch.structure.Additional import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.abstraction.Block @@ -7,16 +12,17 @@ import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock import com.tangem.tangemtest._arch.structure.impl.* import com.tangem.tangemtest.ucase.variants.personalize.* import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig -import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter +import java.util.* /** [REDACTED_AUTHOR] */ -class JsonToBlockConverter : Converter> { +class PersonalizeConfigConverter { private val associations: IdToValueAssociations = IdToValueAssociations() + private val valueMapper = ValueMapper() - override fun convert(from: PersonalizeConfig): List { + fun toBlock(from: PersonalizeConfig): List { associations.init(from) val blocList = mutableListOf() blocList.add(cardNumber()) @@ -150,7 +156,8 @@ class JsonToBlockConverter : Converter> { SettingsMaskNdef.UseNdef, SettingsMaskNdef.DynamicNdef, SettingsMaskNdef.DisablePrecomputedNdef, - SettingsMaskNdef.AAR + SettingsMaskNdef.Aar, + SettingsMaskNdef.AarCustom ).forEach { createItem(block, it) } return block } @@ -182,6 +189,103 @@ class JsonToBlockConverter : Converter> { } block.addItem(item) } + + fun toConfig(blockList: List, defaultConfig: PersonalizeConfig): PersonalizeConfig { + return valueMapper.mapOnObject(blockList, defaultConfig) + } + + fun createCardConfig(applyConfig: PersonalizeConfig): CardConfig { + val signingMethod = com.tangem.commands.SigningMethod.build( + signHash = applyConfig.SigningMethod0, + signRaw = applyConfig.SigningMethod1, + signHashValidatedByIssuer = applyConfig.SigningMethod2, + signRawValidatedByIssuer = applyConfig.SigningMethod3, + signHashValidatedByIssuerAndWriteIssuerData = applyConfig.SigningMethod4, + signRawValidatedByIssuerAndWriteIssuerData = applyConfig.SigningMethod5, + signPos = applyConfig.SigningMethod6 + ) + + val isNote = applyConfig.cardData.product_note + val isTag = applyConfig.cardData.product_tag + val isIdCard = applyConfig.cardData.product_id_card + + val productMaskBuilder = ProductMaskBuilder() + if (isNote) productMaskBuilder.add(com.tangem.commands.ProductMask.note) + if (isTag) productMaskBuilder.add(com.tangem.commands.ProductMask.tag) + if (isIdCard) productMaskBuilder.add(com.tangem.commands.ProductMask.idCard) + val productMask = productMaskBuilder.build() + + var tokenSymbol: String? = null + var tokenContractAddress: String? = null + var tokenDecimal: Int? = null + if (applyConfig.itsToken) { + tokenSymbol = applyConfig.symbol + tokenContractAddress = applyConfig.contractAddress + tokenDecimal = applyConfig.decimal.toInt() + } + + val cardData = CardData( + blockchainName = applyConfig.blockchain, + batchId = applyConfig.series, + productMask = productMask, + tokenSymbol = tokenSymbol, + tokenContractAddress = tokenContractAddress, + tokenDecimal = tokenDecimal, + issuerName = null, + manufactureDateTime = Calendar.getInstance().time, + manufacturerSignature = null) + + + val ndefs = mutableListOf() + when (applyConfig.aar) { + "None" -> null + "--- CUSTOM ---" -> NdefRecord(NdefRecord.Type.AAR, applyConfig.aarCustom) + else -> NdefRecord(NdefRecord.Type.AAR, applyConfig.aar) + }?.let { ndefs.add(it) } + + return CardConfig( + cardData = cardData, + curveID = EllipticCurve.byName(applyConfig.curveID) ?: EllipticCurve.Secp256k1, + signingMethod = signingMethod, + createWallet = applyConfig.createWallet, + maxSignatures = applyConfig.MaxSignatures.toInt(), + isReusable = applyConfig.isReusable, + protocolAllowUnencrypted = applyConfig.protocolAllowUnencrypted, + protocolAllowStaticEncryption = applyConfig.protocolAllowStaticEncryption, + useActivation = applyConfig.useActivation, + + useOneCommandAtTime = applyConfig.oneApdu, + useCvc = applyConfig.useCVC, + useBlock = applyConfig.useBlock, + allowSwapPin = applyConfig.allowSwapPIN, + allowSwapPin2 = applyConfig.allowSwapPIN2, + useNdef = applyConfig.useNDEF, + useDynamicNdef = applyConfig.useDynamicNDEF, + protectIssuerDataAgainstReplay = applyConfig.protectIssuerDataAgainstReplay, + forbidDefaultPin = applyConfig.forbidDefaultPIN, + smartSecurityDelay = applyConfig.smartSecurityDelay, + pauseBeforePin2 = applyConfig.pauseBeforePIN2.toInt(), + allowSelectBlockchain = applyConfig.allowSelectBlockchain, + forbidPurgeWallet = applyConfig.forbidPurgeWallet, + disablePrecomputedNdef = applyConfig.disablePrecomputedNDEF, + skipSecurityDelayIfValidatedByIssuer = applyConfig.skipSecurityDelayIfValidatedByIssuer, + skipCheckPIN2andCVCIfValidatedByIssuer = applyConfig.skipCheckPIN2andCVCIfValidatedByIssuer, + + skipSecurityDelayIfValidatedByLinkedTerminal = applyConfig.skipSecurityDelayIfValidatedByLinkedTerminal, + restrictOverwriteIssuerDataEx = applyConfig.restrictOverwriteIssuerDataEx, + + requireTerminalTxSignature = applyConfig.requireTerminalTxSignature, + requireTerminalCertSignature = applyConfig.requireTerminalCertSignature, + checkPin3onCard = applyConfig.checkPIN3onCard, + + cvc = applyConfig.CVC, + pin = applyConfig.PIN, + pin2 = applyConfig.PIN2, + pin3 = applyConfig.PIN3, + hexCrExKey = applyConfig.hexCrExKey, + ndefRecords = ndefs + ) + } } class IdItemHelper { @@ -192,7 +296,7 @@ class IdItemHelper { BlockId.SettingsMaskNdef, BlockId.Pins ) - val listItemList = mutableListOf(Common.Curve, Common.Blockchain, SettingsMaskNdef.AAR, Pins.PauseBeforePin2) + val listItemList = mutableListOf(Common.Curve, Common.Blockchain, SettingsMaskNdef.Aar, Pins.PauseBeforePin2) val boolList = mutableListOf( Common.CreateWallet, SigningMethod.SignTx, SigningMethod.SignTxRaw, SigningMethod.SignValidatedTx, @@ -211,7 +315,7 @@ class IdItemHelper { val editTextList = mutableListOf( CardNumber.Series, Common.BlockchainCustom, SignHashExProp.CryptoExKey, Token.Symbol, - Token.ContractAddress, Pins.Pin, Pins.Pin2, Pins.Pin3, Pins.Cvc + Token.ContractAddress, Pins.Pin, Pins.Pin2, Pins.Pin3, Pins.Cvc, SettingsMaskNdef.AarCustom ) val numberList = mutableListOf( diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ValueMapper.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ValueMapper.kt index f31e640e87..3c2e36d2bd 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ValueMapper.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ValueMapper.kt @@ -18,11 +18,11 @@ class ValueMapper { private val updatedByItemList: IdToValueAssociations = IdToValueAssociations() - fun mapOnObject(itemList: List, defaultValues: PersonalizeConfig): PersonalizeConfig { - default.init(defaultValues) - updatedByItemList.init(defaultValues) + fun mapOnObject(itemList: List, defaultConfig: PersonalizeConfig): PersonalizeConfig { + default.init(defaultConfig) + updatedByItemList.init(defaultConfig) startMapping(itemList) - return createJson(defaultValues) + return createJson(defaultConfig) } private fun startMapping(itemList: List) { @@ -74,7 +74,7 @@ class ValueMapper { export.forbidPurgeWallet = getTyped(SettingsMask.ForbidPurge, defaultConfig.forbidPurgeWallet) export.allowSelectBlockchain = getTyped(SettingsMask.AllowSelectBlockchain, defaultConfig.allowSelectBlockchain) export.useBlock = getTyped(SettingsMask.UseBlock, defaultConfig.useBlock) - export.useOneCommandAtTime = getTyped(SettingsMask.OneApdu, defaultConfig.useOneCommandAtTime) + export.oneApdu = getTyped(SettingsMask.OneApdu, defaultConfig.oneApdu) export.useCVC = getTyped(SettingsMask.UseCvc, defaultConfig.useCVC) export.allowSwapPIN = getTyped(SettingsMask.AllowSwapPin, defaultConfig.allowSwapPIN) export.allowSwapPIN2 = getTyped(SettingsMask.AllowSwapPin2, defaultConfig.allowSwapPIN2) @@ -90,7 +90,8 @@ class ValueMapper { export.useNDEF = getTyped(SettingsMaskNdef.UseNdef, defaultConfig.useNDEF) export.useDynamicNDEF = getTyped(SettingsMaskNdef.DynamicNdef, defaultConfig.useDynamicNDEF) export.disablePrecomputedNDEF = getTyped(SettingsMaskNdef.DisablePrecomputedNdef, defaultConfig.disablePrecomputedNDEF) - export.NDEF = getTyped(SettingsMaskNdef.AAR, defaultConfig.NDEF) + export.aar = getTyped(SettingsMaskNdef.Aar, defaultConfig.aar) + export.aarCustom = getTyped(SettingsMaskNdef.AarCustom, defaultConfig.aarCustom) export.PIN = getTyped(Pins.Pin, defaultConfig.PIN) export.PIN2 = getTyped(Pins.Pin2, defaultConfig.PIN2) export.PIN3 = getTyped(Pins.Pin3, defaultConfig.PIN3) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt index da449b5e42..bee6db79bb 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt @@ -29,7 +29,7 @@ class PersonalizeConfig { // Sign hash external properties var pinLessFloorLimit: Long = 0 - var hexCrExKey = "" + var hexCrExKey = "00112233445566778899AABBCCDDEEFFFFEEDDCCBBAA998877665544332211000000111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFF" var requireTerminalTxSignature = false var requireTerminalCertSignature = false var checkPIN3onCard = false @@ -56,7 +56,7 @@ class PersonalizeConfig { var forbidPurgeWallet = false var allowSelectBlockchain = false var useBlock = false - var useOneCommandAtTime = false + var oneApdu = false var useCVC = false var allowSwapPIN = false var allowSwapPIN2 = true @@ -78,7 +78,8 @@ class PersonalizeConfig { var useNDEF = true var useDynamicNDEF = true var disablePrecomputedNDEF = false - var NDEF = "com.tangem.wallet" + var aar = "com.tangem.wallet" + var aarCustom = "" // Pins diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt index 9a96d95f20..930f22cef5 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt @@ -15,7 +15,9 @@ import com.google.android.material.snackbar.Snackbar import com.tangem.CardManager import com.tangem.tangem_sdk_new.extensions.init import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.structure.abstraction.Block import com.tangem.tangemtest._main.MainViewModel +import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManager import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManagerFactory import com.tangem.tangemtest.ucase.resources.ActionType @@ -53,8 +55,11 @@ class PersonalizeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - personalizeVM.ldBlockList.observe(viewLifecycleOwner, Observer { blocList -> - blocList.forEach { WidgetBuilder().build(it, blockContainer) } + val blockList = mutableListOf() + personalizeVM.ldBlockList.observe(viewLifecycleOwner, Observer { list -> + blockList.clear() + blockList.addAll(list) + blockList.forEach { WidgetBuilder().build(it, blockContainer) } }) mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { personalizeVM.toggleDescriptionVisibility(it) @@ -66,7 +71,11 @@ class PersonalizeFragment : Fragment() { showSnackbarMessage(it) }) paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbarMessage(it) }) - fab_action?.setOnClickListener { paramsVM.invokeMainAction() } + + fab_action?.setOnClickListener { + val cardConfig = personalizeVM.createCardConfig(personalizeVM.createConfig(blockList)) + paramsVM.invokeMainAction(mutableMapOf(PersonalizeAction.cardConfig to cardConfig)) + } } protected fun showSnackbarMessage(message: String) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt index 876e548975..cd60a87f98 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt @@ -5,11 +5,10 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.google.gson.Gson +import com.tangem.commands.personalization.CardConfig import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._arch.structure.abstraction.Block -import com.tangem.tangemtest.ucase.variants.personalize.converter.BlockToJsonConverter -import com.tangem.tangemtest.ucase.variants.personalize.converter.JsonToBlockConverter -import com.tangem.tangemtest.ucase.variants.personalize.converter.ValueMapper +import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig /** @@ -27,12 +26,19 @@ class PersonalizeViewModel(private val jsonPersonalizeString: String) : ViewMode fun parseJsonToBlockList(jsonString: String): List { val config = Gson().fromJson(jsonString, PersonalizeConfig::class.java) - return JsonToBlockConverter().convert(config) + return PersonalizeConfigConverter().toBlock(config) } - fun prepareJson(blocList: List): String { - val jsonDto = BlockToJsonConverter(ValueMapper(), PersonalizeConfig()).convert(blocList) - return Gson().toJson(jsonDto) + fun createConfig(blocList: List): PersonalizeConfig { + return PersonalizeConfigConverter().toConfig(blocList, PersonalizeConfig()) + } + + fun createCardConfig(config: PersonalizeConfig): CardConfig { + return PersonalizeConfigConverter().createCardConfig(config) + } + + fun convertToJson(config: PersonalizeConfig): String { + return Gson().toJson(config) } fun toggleDescriptionVisibility(state: Boolean) {