Updated on 2026-08-14

This commit is contained in:
Tangem 2020-04-29 22:08:38 +03:00
parent 833a9b6817
commit 337ac5d9ea
9 changed files with 131 additions and 245 deletions

View file

@ -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<NdefRecord>()
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
)
}

View file

@ -2,7 +2,6 @@ package com.tangem.devkit.ucase.domain.paramsManager.managers
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.OnLifecycleEvent
import com.google.gson.Gson
import com.tangem.TangemSdk
import com.tangem.devkit.commons.Store
import com.tangem.devkit.ucase.domain.actions.PersonalizeAction
@ -35,20 +34,20 @@ class PersonalizationItemsManager(
if (jsonString.isEmpty()) return
val jsonDto = try {
Gson().fromJson(jsonString, PersonalizationJson::class.java)
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)
setItems(converter.convert(config))
updateByItemList(converter.convert(config))
}
fun exportJsonConfig(): String {
val config = converter.convert(itemList, PersonalizationConfig.default())
val jsonDto = PersonalizationJsonConverter().bToA(config)
val jsonString = Gson().toJson(jsonDto)
val jsonString = PersonalizationJson.getJsonConverter().toJson(jsonDto)
return jsonString
}

View file

@ -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
/**
@ -92,7 +93,7 @@ internal class Helper {
fun listOfBlockchain(): List<KeyValue> {
return mutableListOf(
KeyValue("--- CUSTOM ---", ""),
KeyValue(PersonalizationJson.CUSTOM, PersonalizationJson.CUSTOM),
KeyValue("BTC", "BTC"),
KeyValue("BTC/test", "BTC/test"),
KeyValue("ETH", "ETH"),
@ -113,7 +114,7 @@ internal class Helper {
fun aarList(): List<KeyValue> {
return mutableListOf(
KeyValue("--- CUSTOM ---", ""),
KeyValue(PersonalizationJson.CUSTOM, PersonalizationJson.CUSTOM),
KeyValue("Release APP", "com.tangem.wallet"),
KeyValue("Debug APP", "com.tangem.wallet.debug"),
KeyValue("None", "")

View file

@ -7,6 +7,7 @@ import com.tangem.commands.ProductMaskBuilder
import com.tangem.commands.personalization.entities.CardConfig
import com.tangem.commands.personalization.entities.NdefRecord
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
import java.util.*
@ -29,7 +30,7 @@ class PersonalizationConfigToCardConfig : Converter<PersonalizationConfig, CardC
var tokenSymbol: String? = null
var tokenContractAddress: String? = null
var tokenDecimal: Int? = null
var tokenDecimal: Long? = null
if (from.itsToken) {
tokenSymbol = from.cardData.token_symbol
tokenContractAddress = from.cardData.token_contract_address
@ -43,7 +44,7 @@ class PersonalizationConfigToCardConfig : Converter<PersonalizationConfig, CardC
productMask = productMask,
tokenSymbol = tokenSymbol,
tokenContractAddress = tokenContractAddress,
tokenDecimal = tokenDecimal,
tokenDecimal = tokenDecimal?.toInt(),
issuerName = null,
manufactureDateTime = Calendar.getInstance().time,
manufacturerSignature = null)
@ -55,7 +56,7 @@ class PersonalizationConfigToCardConfig : Converter<PersonalizationConfig, CardC
}
when (from.aar) {
"None" -> null
"--- CUSTOM ---" -> NdefRecord(NdefRecord.Type.AAR, from.aarCustom)
PersonalizationJson.CUSTOM -> NdefRecord(NdefRecord.Type.AAR, from.aarCustom)
else -> NdefRecord(NdefRecord.Type.AAR, from.aar)
}?.let { ndefs.add(it) }

View file

@ -5,7 +5,6 @@ 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.CardData
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
@ -21,85 +20,77 @@ class PersonalizationJsonConverter : TwoWayConverter<PersonalizationJson, Person
}
internal class JsonToConfig : Converter<PersonalizationJson, PersonalizationConfig> {
override fun convert(from: PersonalizationJson): PersonalizationConfig {
override fun convert(jsonDto: PersonalizationJson): PersonalizationConfig {
val config = PersonalizationConfig.default()
config.apply {
// Card number
series = from.series
startNumber = from.startNumber
// Common
curveID = EllipticCurve.byName(from.curveID)?.curve ?: ""
series = jsonDto.series
startNumber = jsonDto.startNumber
curveID = EllipticCurve.byName(jsonDto.curveID)?.curve ?: ""
blockchainCustom = ""
MaxSignatures = from.MaxSignatures
createWallet = from.createWallet != 0L
// Sign hash external properties
// pinLessFloorLimit = 100000L
hexCrExKey = from.hexCrExKey
requireTerminalTxSignature = from.requireTerminalTxSignature
requireTerminalCertSignature = from.requireTerminalCertSignature
checkPIN3onCard = from.checkPIN3onCard
// Product mask
cardData = from.cardData
// Settings mask
isReusable = from.isReusable
useActivation = from.useActivation
forbidPurgeWallet = from.forbidPurgeWallet
allowSelectBlockchain = from.allowSelectBlockchain
useBlock = from.useBlock
useOneCommandAtTime = from.useOneCommandAtTime
useCVC = from.useCVC
allowSwapPIN = from.allowSwapPIN
allowSwapPIN2 = from.allowSwapPIN2
forbidDefaultPIN = from.forbidDefaultPIN
smartSecurityDelay = from.smartSecurityDelay
protectIssuerDataAgainstReplay = from.protectIssuerDataAgainstReplay
skipSecurityDelayIfValidatedByIssuer = from.skipSecurityDelayIfValidatedByIssuer
skipCheckPIN2andCVCIfValidatedByIssuer = from.skipCheckPIN2andCVCIfValidatedByIssuer
skipSecurityDelayIfValidatedByLinkedTerminal = from.skipSecurityDelayIfValidatedByLinkedTerminal
restrictOverwriteIssuerDataEx = from.restrictOverwriteIssuerDataEx
// Settings mask - protocol encryption
protocolAllowUnencrypted = from.protocolAllowUnencrypted
protocolAllowStaticEncryption = from.protocolAllowStaticEncryption
// Settings mask
useNDEF = from.useNDEF
useDynamicNDEF = from.useDynamicNDEF
disablePrecomputedNDEF = from.disablePrecomputedNDEF
// Pins
PIN = from.PIN
PIN2 = from.PIN2
PIN3 = from.PIN3
CVC = from.CVC
pauseBeforePIN2 = from.pauseBeforePIN2
count = from.count
issuerName = from.issuerName
issuerData = from.issuerData
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
}
fillToken(config, from.cardData)
fillSigningMethod(config, from.SigningMethod)
fillNdef(config, from.ndef)
fillCardData(jsonDto, config)
fillSigningMethod(jsonDto, config)
fillNdef(jsonDto, config)
return config
}
private fun fillToken(config: PersonalizationConfig, cardData: CardData) {
config.itsToken = cardData.token_contract_address.isNotEmpty() || cardData.token_symbol.isNotEmpty()
config.cardData.token_contract_address = cardData.token_contract_address
config.cardData.token_symbol = cardData.token_symbol
config.cardData.token_decimal = cardData.token_decimal
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(config: PersonalizationConfig, signingMethod: Long) {
val mask = SigningMethodMask(signingMethod.toInt())
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
@ -108,8 +99,8 @@ internal class JsonToConfig : Converter<PersonalizationJson, PersonalizationConf
if (mask.contains(SigningMethod.SignRawValidateByIssuerWriteIssuerData)) config.SigningMethod5 = true
}
private fun fillNdef(config: PersonalizationConfig, ndef: MutableList<NdefRecord>) {
ndef.forEach { record ->
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
@ -121,6 +112,7 @@ internal class JsonToConfig : Converter<PersonalizationJson, PersonalizationConf
}
internal class ConfigToJson : Converter<PersonalizationConfig, PersonalizationJson> {
override fun convert(from: PersonalizationConfig): PersonalizationJson {
val jsonDto = PersonalizationJson()
jsonDto.apply {
@ -163,27 +155,44 @@ internal class ConfigToJson : Converter<PersonalizationConfig, PersonalizationJs
checkPIN3onCard = from.checkPIN3onCard
createWallet = if (from.createWallet) 1 else 0
issuerData = from.issuerData
cardData = from.cardData
// numberFormat = from.numberFormat
// pinLessFloorLimit = 100000L
}
fillSigningMethod(jsonDto, from)
fillNdef(jsonDto, from)
fillCardData(from, jsonDto)
fillSigningMethod(from, jsonDto)
fillNdef(from, jsonDto)
return jsonDto
}
private fun fillSigningMethod(jsonDto: PersonalizationJson, from: PersonalizationConfig) {
jsonDto.SigningMethod = PersonalizationConfig.makeSigningMethodMask(from).rawValue.toLong()
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 fillNdef(jsonDto: PersonalizationJson, from: PersonalizationConfig) {
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 (from.aarCustom.isNotEmpty()) add(from.aarCustom, NdefRecord.Type.AAR)
else add(from.aar, NdefRecord.Type.AAR)
if (config.aarCustom.isNotEmpty()) add(config.aarCustom, NdefRecord.Type.AAR)
else add(config.aar, NdefRecord.Type.AAR)
add(from.uri, NdefRecord.Type.URI)
add(config.uri, NdefRecord.Type.URI)
}
}

View file

@ -79,10 +79,6 @@ class PersonalizationConfig {
var CVC = ""
var pauseBeforePIN2: Long = 0
// Fields from JSON
// var releaseVersion = true - don't use in personalization
// var count = 1050 - don't use in personalization
// var numberFormat = "" - don't use in personalization
var count: Long = 0
var issuerName = ""
var issuerData = null
@ -198,7 +194,7 @@ class CardData {
var blockchain = ""
var token_symbol = ""
var token_contract_address = ""
var token_decimal: Int = 0
var token_decimal: Long = 0
var product_note = false
var product_tag = false
var product_id_card = false

View file

@ -1,10 +1,11 @@
package com.tangem.devkit.ucase.variants.personalize.dto
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.tangem.commands.personalization.entities.NdefRecord
class PersonalizationJson {
var releaseVersion = false
var issuerName = ""
var series = ""
var startNumber = 0L
@ -48,5 +49,15 @@ class PersonalizationJson {
var ndef = mutableListOf<NdefRecord>()
var cardData = CardData()
var releaseVersion = false
var numberFormat = ""
companion object {
const val CUSTOM = "--- CUSTOM ---"
fun getJsonConverter(): Gson {
val builder = GsonBuilder().setPrettyPrinting()
return builder.create()
}
}
}

View file

@ -39,7 +39,6 @@ import com.tangem.devkit.ucase.variants.personalize.ui.presets.PersonalizationPr
import com.tangem.devkit.ucase.variants.personalize.ui.presets.RvPresetNamesAdapter
import com.tangem.devkit.ucase.variants.personalize.ui.widgets.PersonalizationItemBuilder
import com.tangem.devkit.ucase.variants.responses.ui.ResponseFragment
import ru.dev.gbixahue.eu4d.lib.android._android.views.afterTextChanged
import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import ru.dev.gbixahue.eu4d.lib.android.global.threading.post
@ -131,19 +130,22 @@ class PersonalizationFragment : BaseCardActionFragment(), PersonalizationPresetV
}
fun initImportExportJson(parent: ViewGroup) {
val tvJsonImport = parent.findViewById<EditText>(R.id.et_json_import)
tvJsonImport.afterTextChanged { personalizationItemsManager.importJsonConfig(it) }
val tvJsonExport = parent.findViewById<EditText>(R.id.et_json_export)
val btnExportJson = parent.findViewById<Button>(R.id.btn_export_json)
val tvJsonExport = parent.findViewById<TextView>(R.id.tv_json_export)
tvJsonExport.setOnClickListener {
val jsonString = tvJsonExport.text
Log.w(this, jsonString)
requireContext().copyToClipboard(jsonString, "Exported Json")
}
btnExportJson.setOnClickListener {
tvJsonExport.setText(personalizationItemsManager.exportJsonConfig())
}
val btnPrepareExport = parent.findViewById<Button>(R.id.btn_prepare_export)
btnPrepareExport.setOnClickListener {
tvJsonExport.text = personalizationItemsManager.exportJsonConfig()
val tvJsonImport = parent.findViewById<EditText>(R.id.et_json_import)
val btnImportJson = parent.findViewById<Button>(R.id.btn_import_json)
btnImportJson.setOnClickListener {
personalizationItemsManager.importJsonConfig(tvJsonImport.text.toString().trim())
}
}