Updated on 2026-08-14

This commit is contained in:
Tangem 2020-03-27 15:41:10 +03:00
parent 83f376b139
commit 24bb1217b2
21 changed files with 211 additions and 77 deletions

View file

@ -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 -> {

View file

@ -7,8 +7,10 @@ interface DataHolder<D> {
var viewModel: D
}
interface Payload {
val payload: MutableMap<String, Any?>
typealias Payload = MutableMap<String, Any?>
interface PayloadHolder {
val payload: Payload
}
interface ItemListHolder<I> {

View file

@ -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<D>(
override var viewModel: ItemViewModel<D>
) : Item, DataHolder<ItemViewModel<D>> {
override var parent: Item? = null
override val payload: MutableMap<String, Any?> = mutableMapOf()
override val payload: Payload = mutableMapOf()
}

View file

@ -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> = (V?) -> Unit
typealias SafeValueChange<V> = (V) -> Unit
interface ItemViewModel<D: Any?> : Payload {
interface ItemViewModel<D : Any?> : PayloadHolder {
val viewState: ViewState
var data: D?
var defaultData: D?
@ -22,7 +23,7 @@ interface ItemViewModel<D: Any?> : Payload {
open class BaseItemViewModel<D> : ItemViewModel<D> {
override val viewState: ViewState = ViewState()
override val payload: MutableMap<String, Any?> = mutableMapOf()
override val payload: Payload = mutableMapOf()
// Don't update it directly from a View. Use for it updateDataByView()
override var data: D? = null

View file

@ -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)

View file

@ -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<Item>,
val payload: Payload,
val consequence: ParamsChangeConsequence?
)

View file

@ -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"
}
}

View file

@ -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<Item>
fun invokeMainAction(cardManager: CardManager, callback: ActionCallback)
fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)?
fun attachPayload(payload: Payload)
}

View file

@ -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<String, Any?> = mutableMapOf()
protected val paramsList: List<Item> by lazy { createParamsList() }
abstract fun createParamsList(): List<Item>
@ -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())
}

View file

@ -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<Id, Resources>) {

View file

@ -49,7 +49,8 @@ class ParamsViewModel(val paramsManager: ParamsManager) : ViewModel() {
}
//invokes Scan, Sign etc...
fun invokeMainAction() {
fun invokeMainAction(payload: MutableMap<String, Any?> = 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
}
}
}

View file

@ -113,6 +113,7 @@ class ParameterWidget(
}
}
fun ParameterWidget.getResNameId(id: Id? = null): Int = MainResourceHolder.safeGet<Resources>(id?: this.id).resName
fun ParameterWidget.getResNameId(id: Id? = null): Int = MainResourceHolder.safeGet<Resources>(id
?: this.id).resName
fun ParameterWidget.getResDescription(): Int? = MainResourceHolder.safeGet<Resources>(id).resDescription

View file

@ -5,7 +5,7 @@ import com.tangem.tangemtest._arch.structure.Id
/**
[REDACTED_AUTHOR]
*/
enum class TlvId: Id {
enum class TlvId : Id {
CardId,
TransactionOutHash,
}

View file

@ -101,7 +101,8 @@ enum class SettingsMaskNdef : BlockItem {
UseNdef,
DynamicNdef,
DisablePrecomputedNdef,
AAR,
Aar,
AarCustom
}
enum class Pins : BlockItem {

View file

@ -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<List<Block>, PersonalizeConfig> {
override fun convert(from: List<Block>): PersonalizeConfig {
return valueMapper.mapOnObject(from, config)
}
}

View file

@ -56,7 +56,7 @@ class IdToValueAssociations : BaseTypedHolder<Id, Value>() {
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<Id, Value>() {
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<KeyValue> {
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", "")
)
}

View file

@ -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<PersonalizeConfig, List<Block>> {
class PersonalizeConfigConverter {
private val associations: IdToValueAssociations = IdToValueAssociations()
private val valueMapper = ValueMapper()
override fun convert(from: PersonalizeConfig): List<Block> {
fun toBlock(from: PersonalizeConfig): List<Block> {
associations.init(from)
val blocList = mutableListOf<Block>()
blocList.add(cardNumber())
@ -150,7 +156,8 @@ class JsonToBlockConverter : Converter<PersonalizeConfig, List<Block>> {
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<PersonalizeConfig, List<Block>> {
}
block.addItem(item)
}
fun toConfig(blockList: List<Block>, 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<NdefRecord>()
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(

View file

@ -18,11 +18,11 @@ class ValueMapper {
private val updatedByItemList: IdToValueAssociations = IdToValueAssociations()
fun mapOnObject(itemList: List<Item>, defaultValues: PersonalizeConfig): PersonalizeConfig {
default.init(defaultValues)
updatedByItemList.init(defaultValues)
fun mapOnObject(itemList: List<Item>, defaultConfig: PersonalizeConfig): PersonalizeConfig {
default.init(defaultConfig)
updatedByItemList.init(defaultConfig)
startMapping(itemList)
return createJson(defaultValues)
return createJson(defaultConfig)
}
private fun startMapping(itemList: List<Item>) {
@ -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)

View file

@ -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

View file

@ -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<Block>()
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) {

View file

@ -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<Block> {
val config = Gson().fromJson(jsonString, PersonalizeConfig::class.java)
return JsonToBlockConverter().convert(config)
return PersonalizeConfigConverter().toBlock(config)
}
fun prepareJson(blocList: List<Block>): String {
val jsonDto = BlockToJsonConverter(ValueMapper(), PersonalizeConfig()).convert(blocList)
return Gson().toJson(jsonDto)
fun createConfig(blocList: List<Block>): 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) {