Updated on 2026-08-14
This commit is contained in:
parent
83f376b139
commit
24bb1217b2
21 changed files with 211 additions and 77 deletions
|
|
@ -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 -> {
|
||||
|
|
|
|||
|
|
@ -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> {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
|
@ -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>) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -5,7 +5,7 @@ import com.tangem.tangemtest._arch.structure.Id
|
|||
/**
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
enum class TlvId: Id {
|
||||
enum class TlvId : Id {
|
||||
CardId,
|
||||
TransactionOutHash,
|
||||
}
|
||||
|
|
@ -101,7 +101,8 @@ enum class SettingsMaskNdef : BlockItem {
|
|||
UseNdef,
|
||||
DynamicNdef,
|
||||
DisablePrecomputedNdef,
|
||||
AAR,
|
||||
Aar,
|
||||
AarCustom
|
||||
}
|
||||
|
||||
enum class Pins : BlockItem {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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", "")
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue