Updated on 2026-08-14

This commit is contained in:
Tangem 2020-03-25 19:10:08 +03:00
parent 1c554ecde7
commit 0ff14ccd51
22 changed files with 370 additions and 431 deletions

View file

@ -12,10 +12,12 @@ import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.transition.AutoTransition
import androidx.transition.TransitionManager
import com.tangem.tangemtest.R
import com.tangem.tangemtest._main.MainViewModel
import com.tangem.tangemtest.commons.ActionType
import com.tangem.tangemtest.commons.NavigateOptions
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import com.tangem.tangemtest.card_use_cases.resources.MainResourceHolder
import com.tangem.tangemtest.commons.getDefaultNavigationOptions
import kotlinx.android.synthetic.main.fg_entry_point.*
@ -36,10 +38,6 @@ class EntryPointFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initRecyclerView()
mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer {
// do some thing
})
}
private fun initRecyclerView() {
@ -47,7 +45,15 @@ class EntryPointFragment : Fragment() {
rvActions = rv_actions
rvActions.layoutManager = layoutManager
rvActions.addItemDecoration(DividerItemDecoration(activity, layoutManager.orientation))
rvActions.adapter = RvActionsAdapter { type, position, data -> navigate(data.destinationId) }
val vhDataWrapper = VhExDataWrapper(MainResourceHolder, false)
rvActions.adapter = RvActionsAdapter(vhDataWrapper) { type, position, data -> navigate(data) }
mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer {
vhDataWrapper.descriptionIsVisible = it
TransitionManager.beginDelayedTransition(rvActions as ViewGroup, AutoTransition())
rvActions.adapter?.notifyDataSetChanged()
})
}
override fun onResume() {
@ -62,20 +68,20 @@ class EntryPointFragment : Fragment() {
navController.navigate(destinationId, null, getDefaultNavigationOptions())
}
private fun getNavigateOptions(): MutableList<NavigateOptions> {
private fun getNavigateOptions(): MutableList<ActionType> {
return mutableListOf(
NavigateOptions(ActionType.Scan, R.id.action_nav_entry_point_to_nav_scan),
NavigateOptions(ActionType.Sign, R.id.action_nav_entry_point_to_nav_sign),
NavigateOptions(ActionType.Personalize, R.id.action_nav_entry_point_to_nav_personalize),
NavigateOptions(ActionType.Depersonalize, R.id.action_nav_entry_point_to_nav_depersonalize),
NavigateOptions(ActionType.CreateWallet, R.id.action_nav_entry_point_to_nav_wallet_create),
NavigateOptions(ActionType.PurgeWallet, R.id.action_nav_entry_point_to_nav_wallet_purge),
NavigateOptions(ActionType.ReadIssuerData, R.id.action_nav_entry_point_to_nav_issuer_read_data),
NavigateOptions(ActionType.WriteIssuerData, R.id.action_nav_entry_point_to_nav_issuer_write_data),
NavigateOptions(ActionType.ReadIssuerExData, R.id.action_nav_entry_point_to_nav_issuer_read_ex_data),
NavigateOptions(ActionType.WriteIssuerExData, R.id.action_nav_entry_point_to_nav_issuer_write_ex_data),
NavigateOptions(ActionType.ReadUserData, R.id.action_nav_entry_point_to_nav_user_read_data),
NavigateOptions(ActionType.WriteUserData, R.id.action_nav_entry_point_to_nav_user_write_data)
ActionType.Scan,
ActionType.Sign,
ActionType.Personalize,
ActionType.Depersonalize
// ActionType.CreateWallet,
// ActionType.PurgeWallet,
// ActionType.ReadIssuerData,
// ActionType.WriteIssuerData,
// ActionType.ReadIssuerExData,
// ActionType.WriteIssuerExData,
// ActionType.ReadUserData,
// ActionType.WriteUserData
)
}
}

View file

@ -1,30 +1,69 @@
package com.tangem.tangemtest._main.entry_point
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.StringRes
import androidx.recyclerview.widget.RecyclerView
import com.tangem.tangemtest.R
import com.tangem.tangemtest.commons.NavigateOptions
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvAdapter
import com.tangem.tangemtest.card_use_cases.resources.ActionRes
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import com.tangem.tangemtest.card_use_cases.resources.MainResourceHolder
import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvBaseAdapter
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvBaseVH
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvCallback
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvVH
/**
[REDACTED_AUTHOR]
*/
class RvActionsAdapter(callback: RvCallback<NavigateOptions>) : RvAdapter<RvActionsVH, NavigateOptions>(callback) {
class RvActionsAdapter(
private val wrapper: VhExDataWrapper,
private val callback: RvCallback<Int>
) : RvBaseAdapter<RvActionsVH, ActionType>() {
override fun createViewHolder(view: View, listener: RvCallback<NavigateOptions>?): RvActionsVH {
return RvActionsVH(view, listener)
override fun onBindViewHolder(holder: RvActionsVH, position: Int) {
holder.bindData(itemList[position])
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RvActionsVH {
val view = parent.inflate<View>(R.layout.vh_actions, false)
return RvActionsVH(view, wrapper, callback)
}
override fun getLayoutId(): Int = R.layout.vh_actions
}
class RvActionsVH(itemView: View, callback: RvCallback<NavigateOptions>?) : RvVH<NavigateOptions>(itemView, callback) {
private val tvAction = itemView.findViewById<TextView>(R.id.tv_title)
class VhExDataWrapper(
val resHolder: MainResourceHolder,
var descriptionIsVisible: Boolean
)
override fun onDataBound(data: NavigateOptions) {
tvAction.text = tvAction.context.getString(data.name.resName)
itemView.setOnClickListener { invokeCallback() }
class RvActionsVH(
itemView: View,
private val wrapper: VhExDataWrapper,
private val callback: RvCallback<Int>?
) : RvBaseVH<ActionType>(itemView) {
private val tvAction = itemView.findViewById<TextView>(R.id.tv_title)
private val containerDescription = itemView.findViewById<ViewGroup>(R.id.container_description)
private val tvDescription = itemView.findViewById<TextView>(R.id.tv_description)
override fun bindData(data: ActionType) {
val res: ActionRes = wrapper.resHolder.safeGet(data)
tvAction.text = getString(res.resName)
tvDescription.text = getString(res.resDescription)
itemView.setOnClickListener {
res.resNavigation?.let { callback?.invoke(itemViewType, adapterPosition, it) }
}
containerDescription.visibility = if (wrapper.descriptionIsVisible) View.VISIBLE else View.GONE
}
override fun onDataBound(data: ActionType) {}
}
fun RecyclerView.ViewHolder.getString(@StringRes id: Int?, ifNull: String = ""): String {
val reqId = id ?: return ifNull
return itemView.context.getString(reqId)
}

View file

@ -1,6 +1,6 @@
package com.tangem.tangemtest.card_use_cases.domain.params_manager
import com.tangem.tangemtest.commons.ActionType
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
/**

View file

@ -0,0 +1,22 @@
package com.tangem.tangemtest.card_use_cases.resources
import com.tangem.tangemtest._arch.structure.base.Id
/**
[REDACTED_AUTHOR]
*/
enum class ActionType: Id {
Scan,
Sign,
CreateWallet,
PurgeWallet,
ReadIssuerData,
WriteIssuerData,
ReadIssuerExData,
WriteIssuerExData,
ReadUserData,
WriteUserData,
Personalize,
Depersonalize,
Unknown,
}

View file

@ -0,0 +1,24 @@
package com.tangem.tangemtest.card_use_cases.resources
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.base.Id
import com.tangem.tangemtest.card_use_cases.resources.initializers.ActionResources
import com.tangem.tangemtest.card_use_cases.resources.initializers.PersonalizeResources
import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
/**
[REDACTED_AUTHOR]
*/
open class ResourceHolder<T> : BaseTypedHolder<T, Resources>()
object MainResourceHolder : ResourceHolder<Id>() {
init {
PersonalizeResources().init(this)
ActionResources().init(this)
}
inline fun <reified Res : Resources> safeGet(id: Id): Res {
val result = super.get(id) ?: Resources(R.string.unknown, R.string.unknown)
return result as Res
}
}

View file

@ -0,0 +1,15 @@
package com.tangem.tangemtest.card_use_cases.resources
/**
[REDACTED_AUTHOR]
*/
open class Resources(
val resName: Int,
val resDescription: Int? = null
)
class ActionRes(
resName: Int,
resDescription: Int? = null,
val resNavigation: Int? = null
) : Resources(resName, resDescription)

View file

@ -0,0 +1,29 @@
package com.tangem.tangemtest.card_use_cases.resources.initializers
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.base.Id
import com.tangem.tangemtest.card_use_cases.resources.ActionRes
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import com.tangem.tangemtest.card_use_cases.resources.ResourceHolder
/**
[REDACTED_AUTHOR]
*/
class ActionResources {
fun init(holder: ResourceHolder<Id>) {
holder.register(ActionType.Scan, ActionRes(R.string.action_card_scan, R.string.info_action_card_scan, R.id.action_nav_entry_point_to_nav_scan))
holder.register(ActionType.Sign, ActionRes(R.string.action_card_sign, R.string.info_action_card_sign, R.id.action_nav_entry_point_to_nav_sign))
holder.register(ActionType.Personalize, ActionRes(R.string.action_personalize, R.string.info_action_personalize, R.id.action_nav_entry_point_to_nav_personalize))
holder.register(ActionType.Depersonalize, ActionRes(R.string.action_depersonalize, R.string.info_action_depersonalize, R.id.action_nav_entry_point_to_nav_depersonalize))
holder.register(ActionType.CreateWallet, ActionRes(R.string.action_wallet_create, R.string.info_action_wallet_create, R.id.action_nav_entry_point_to_nav_wallet_create))
holder.register(ActionType.PurgeWallet, ActionRes(R.string.action_wallet_purge, R.string.info_action_wallet_purge, R.id.action_nav_entry_point_to_nav_wallet_purge))
holder.register(ActionType.ReadIssuerData, ActionRes(R.string.action_issuer_read_data, R.string.info_action_issuer_read_data, R.id.action_nav_entry_point_to_nav_issuer_read_data))
holder.register(ActionType.WriteIssuerData, ActionRes(R.string.action_issuer_write_data, R.string.info_action_issuer_write_data, R.id.action_nav_entry_point_to_nav_issuer_write_data))
holder.register(ActionType.ReadIssuerExData, ActionRes(R.string.action_issuer_read_ex_data, R.string.info_action_issuer_read_ex_data, R.id.action_nav_entry_point_to_nav_issuer_read_ex_data))
holder.register(ActionType.WriteIssuerExData, ActionRes(R.string.action_issuer_write_ex_data, R.string.info_action_issuer_write_ex_data, R.id.action_nav_entry_point_to_nav_issuer_write_ex_data))
holder.register(ActionType.ReadUserData, ActionRes(R.string.action_user_read_data, R.string.info_action_user_read_data, R.id.action_nav_entry_point_to_nav_user_read_data))
holder.register(ActionType.WriteUserData, ActionRes(R.string.action_user_write_data, R.string.info_action_user_write_data, R.id.action_nav_entry_point_to_nav_user_write_data))
// holder.register(ActionType.Unknown, getIfNotContains())
}
}

View file

@ -0,0 +1,126 @@
package com.tangem.tangemtest.card_use_cases.resources.initializers
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.base.*
import com.tangem.tangemtest.card_use_cases.resources.ResourceHolder
import com.tangem.tangemtest.card_use_cases.resources.Resources
import ru.dev.gbixahue.eu4d.lib.kotlin.common.TypedHolder
class PersonalizeResources() {
fun init(holder: ResourceHolder<Id>) {
initBlock(holder)
initCardNumber(holder)
initCommon(holder)
initSigningMethod(holder)
initSignHashExProp(holder)
initDenomination(holder)
initToken(holder)
initProductMask(holder)
initSettingsMask(holder)
initSettingsMaskProtocolEnc(holder)
initSettingsMaskNde(holder)
initPins(holder)
}
private fun initBlock(holder: TypedHolder<Id, Resources>) {
holder.register(BlockId.CARD_NUMBER, Resources(R.string.pers_block_card_number, R.string.info_pers_block_card_number))
holder.register(BlockId.COMMON, Resources(R.string.pers_block_common, R.string.info_pers_block_common))
holder.register(BlockId.SIGNING_METHOD, Resources(R.string.pers_block_signing_method, R.string.info_pers_block_signing_method))
holder.register(BlockId.SIGN_HASH_EX_PROP, Resources(R.string.pers_block_sign_hash_ex_prop, R.string.info_pers_block_sign_hash_ex_prop))
holder.register(BlockId.DENOMINATION, Resources(R.string.pers_block_denomination, R.string.info_pers_block_denomination))
holder.register(BlockId.TOKEN, Resources(R.string.pers_block_token, R.string.info_pers_block_token))
holder.register(BlockId.PROD_MASK, Resources(R.string.pers_block_product_mask, R.string.info_pers_block_product_mask))
holder.register(BlockId.SETTINGS_MASK, Resources(R.string.pers_block_settings_mask, R.string.info_pers_block_settings_mask))
holder.register(BlockId.SETTINGS_MASK_PROTOCOL_ENC, Resources(R.string.pers_block_settings_mask_protocol_enc, R.string.info_pers_block_settings_mask_protocol_enc))
holder.register(BlockId.SETTINGS_MASK_NDEF, Resources(R.string.pers_block_settings_mask_ndef, R.string.info_pers_block_settings_mask_ndef))
holder.register(BlockId.PINS, Resources(R.string.pers_block_pins, R.string.info_pers_block_pins))
}
private fun initCardNumber(holder: TypedHolder<Id, Resources>) {
holder.register(CardNumber.SERIES, Resources(R.string.pers_item_series, R.string.info_pers_item_series))
holder.register(CardNumber.NUMBER, Resources(R.string.pers_item_number, R.string.info_pers_item_number))
}
private fun initCommon(holder: TypedHolder<Id, Resources>) {
holder.register(Common.CURVE, Resources(R.string.pers_item_curve, R.string.info_pers_item_curve))
holder.register(Common.BLOCKCHAIN, Resources(R.string.pers_item_blockchain, R.string.info_pers_item_blockchain))
holder.register(Common.BLOCKCHAIN_CUSTOM, Resources(R.string.pers_item_custom_blockchain, R.string.info_pers_item_custom_blockchain))
holder.register(Common.MAX_SIGNATURES, Resources(R.string.pers_item_max_signatures, R.string.info_pers_item_max_signatures))
holder.register(Common.CREATE_WALLET, Resources(R.string.pers_item_create_wallet, R.string.info_pers_item_create_wallet))
}
private fun initSigningMethod(holder: TypedHolder<Id, Resources>) {
holder.register(SigningMethod.SIGN_TX, Resources(R.string.pers_item_sign_tx_hashes, R.string.info_pers_item_sign_tx_hashes))
holder.register(SigningMethod.SIGN_TX_RAW, Resources(R.string.pers_item_sign_raw_tx, R.string.info_pers_item_sign_raw_tx))
holder.register(SigningMethod.SIGN_VALIDATED_TX, Resources(R.string.pers_item_sign_validated_tx_hashes, R.string.info_pers_item_sign_validated_tx_hashes))
holder.register(SigningMethod.SIGN_VALIDATED_TX_RAW, Resources(R.string.pers_item_sign_validated_raw_tx, R.string.info_pers_item_sign_validated_raw_tx))
holder.register(SigningMethod.SIGN_VALIDATED_TX_ISSUER, Resources(R.string.pers_item_sign_validated_tx_hashes_with_iss_data, R.string.info_pers_item_sign_validated_tx_hashes_with_iss_data))
holder.register(SigningMethod.SIGN_VALIDATED_TX_RAW_ISSUER, Resources(R.string.pers_item_sign_validated_raw_tx_with_iss_data, R.string.info_pers_item_sign_validated_raw_tx_with_iss_data))
holder.register(SigningMethod.SIGN_EXTERNAL, Resources(R.string.pers_item_sign_hash_ex, R.string.info_pers_item_sign_hash_ex))
}
private fun initSignHashExProp(holder: TypedHolder<Id, Resources>) {
holder.register(SignHashExProp.PIN_LESS_FLOOR_LIMIT, Resources(R.string.pers_item_pin_less_floor_limit, R.string.info_pers_item_pin_less_floor_limit))
holder.register(SignHashExProp.CRYPTO_EXTRACT_KEY, Resources(R.string.pers_item_cr_ex_key, R.string.info_pers_item_cr_ex_key))
holder.register(SignHashExProp.REQUIRE_TERMINAL_CERT_SIG, Resources(R.string.pers_item_require_terminal_cert_sig, R.string.info_pers_item_require_terminal_cert_sig))
holder.register(SignHashExProp.REQUIRE_TERMINAL_TX_SIG, Resources(R.string.pers_item_require_terminal_tx_sig, R.string.info_pers_item_require_terminal_tx_sig))
holder.register(SignHashExProp.CHECK_PIN3, Resources(R.string.pers_item_pin3, R.string.info_pers_item_pin3))
}
private fun initDenomination(holder: TypedHolder<Id, Resources>) {
holder.register(Denomination.WRITE_ON_PERSONALIZE, Resources(R.string.pers_item_write_on_personalize, R.string.info_pers_item_write_on_personalize))
holder.register(Denomination.DENOMINATION, Resources(R.string.pers_item_denomination, R.string.info_pers_item_denomination))
}
private fun initToken(holder: TypedHolder<Id, Resources>) {
holder.register(Token.ITS_TOKEN, Resources(R.string.pers_item_its_token, R.string.info_pers_item_its_token))
holder.register(Token.SYMBOL, Resources(R.string.pers_item_symbol, R.string.info_pers_item_symbol))
holder.register(Token.CONTRACT_ADDRESS, Resources(R.string.pers_item_contract_address, R.string.info_pers_item_contract_address))
holder.register(Token.DECIMAL, Resources(R.string.pers_item_decimal, R.string.info_pers_item_decimal))
}
private fun initProductMask(holder: TypedHolder<Id, Resources>) {
holder.register(ProductMask.NOTE, Resources(R.string.pers_item_note, R.string.info_pers_item_note))
holder.register(ProductMask.TAG, Resources(R.string.pers_item_tag, R.string.info_pers_item_tag))
holder.register(ProductMask.ID_CARD, Resources(R.string.pers_item_id_card, R.string.info_pers_item_id_card))
}
private fun initSettingsMask(holder: TypedHolder<Id, Resources>) {
holder.register(SettingsMask.IS_REUSABLE, Resources(R.string.pers_item_is_reusable, R.string.info_pers_item_is_reusable))
holder.register(SettingsMask.NEED_ACTIVATION, Resources(R.string.pers_item_need_activation, R.string.info_pers_item_need_activation))
holder.register(SettingsMask.FORBID_PURGE, Resources(R.string.pers_item_forbid_purge, R.string.info_pers_item_forbid_purge))
holder.register(SettingsMask.ALLOW_SELECT_BLOCKCHAIN, Resources(R.string.pers_item_allow_select_blockchain, R.string.info_pers_item_allow_select_blockchain))
holder.register(SettingsMask.USE_BLOCK, Resources(R.string.pers_item_use_block, R.string.info_pers_item_use_block))
holder.register(SettingsMask.ONE_APDU, Resources(R.string.pers_item_one_apdu_at_once, R.string.info_pers_item_one_apdu_at_once))
holder.register(SettingsMask.USE_CVC, Resources(R.string.pers_item_use_cvc, R.string.info_pers_item_use_cvc))
holder.register(SettingsMask.ALLOW_SWAP_PIN, Resources(R.string.pers_item_allow_swap_pin, R.string.info_pers_item_allow_swap_pin))
holder.register(SettingsMask.ALLOW_SWAP_PIN2, Resources(R.string.pers_item_allow_swap_pin2, R.string.info_pers_item_allow_swap_pin2))
holder.register(SettingsMask.FORBID_DEFAULT_PIN, Resources(R.string.pers_item_forbid_default_pin, R.string.info_pers_item_forbid_default_pin))
holder.register(SettingsMask.SMART_SECURITY_DELAY, Resources(R.string.pers_item_smart_security_delay, R.string.info_pers_item_smart_security_delay))
holder.register(SettingsMask.PROTECT_ISSUER_DATA_AGAINST_REPLAY, Resources(R.string.pers_item_protect_issuer_data_against_replay, R.string.info_pers_item_protect_issuer_data_against_replay))
holder.register(SettingsMask.SKIP_SECURITY_DELAY_IF_VALIDATED, Resources(R.string.pers_item_skip_security_delay_if_validated, R.string.info_pers_item_skip_security_delay_if_validated))
holder.register(SettingsMask.SKIP_PIN2_CVC_IF_VALIDATED, Resources(R.string.pers_item_skip_pin2_and_cvc_if_validated, R.string.info_pers_item_skip_pin2_and_cvc_if_validated))
holder.register(SettingsMask.SKIP_SECURITY_DELAY_ON_LINKED_TERMINAL, Resources(R.string.pers_item_skip_security_delay_on_linked_terminal, R.string.info_pers_item_skip_security_delay_on_linked_terminal))
holder.register(SettingsMask.RESTRICT_OVERWRITE_EXTRA_ISSUER_DATA, Resources(R.string.pers_item_restrict_overwrite_ex_issuer_data, R.string.info_pers_item_restrict_overwrite_ex_issuer_data))
}
private fun initSettingsMaskProtocolEnc(holder: TypedHolder<Id, Resources>) {
holder.register(SettingsMaskProtocolEnc.ALLOW_UNENCRYPTED, Resources(R.string.pers_item_allow_unencrypted, R.string.info_pers_item_allow_unencrypted))
holder.register(SettingsMaskProtocolEnc.ALLOW_FAST_ENCRYPTION, Resources(R.string.pers_item_allow_fast_encryption, R.string.info_pers_item_allow_fast_encryption))
}
private fun initSettingsMaskNde(holder: TypedHolder<Id, Resources>) {
holder.register(SettingsMaskNdef.USE_NDEF, Resources(R.string.pers_item_use_ndef, R.string.info_pers_item_use_ndef))
holder.register(SettingsMaskNdef.DYNAMIC_NDEF, Resources(R.string.pers_item_dynamic_ndef, R.string.info_pers_item_dynamic_ndef))
holder.register(SettingsMaskNdef.DISABLE_PRECOMPUTED_NDEF, 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))
}
private fun initPins(holder: TypedHolder<Id, Resources>) {
holder.register(Pins.PIN, Resources(R.string.pers_item_pin, R.string.info_pers_item_pin))
holder.register(Pins.PIN2, Resources(R.string.pers_item_pin2, R.string.info_pers_item_pin2))
holder.register(Pins.PIN3, Resources(R.string.pers_item_pin3, R.string.info_pers_item_pin3))
holder.register(Pins.CVC, Resources(R.string.pers_item_cvc, R.string.info_pers_item_cvc))
holder.register(Pins.PAUSE_BEFORE_PIN2, Resources(R.string.pers_item_pause_before_pin2, R.string.info_pers_item_pause_before_pin2))
}
}

View file

@ -17,10 +17,11 @@ import com.tangem.tangem_sdk_new.extensions.init
import com.tangem.tangemtest.R
import com.tangem.tangemtest.card_use_cases.domain.params_manager.ParamsManager
import com.tangem.tangemtest.card_use_cases.domain.params_manager.ParamsManagerFactory
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import com.tangem.tangemtest.card_use_cases.resources.MainResourceHolder
import com.tangem.tangemtest.card_use_cases.ui.card.actions.ActionViewModelFactory
import com.tangem.tangemtest.card_use_cases.ui.card.actions.ParamsViewModel
import com.tangem.tangemtest.card_use_cases.ui.card.actions.widgets.ParameterWidget
import com.tangem.tangemtest.commons.ActionType
import ru.dev.gbixahue.eu4d.lib.android._android.views.find
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
@ -63,7 +64,7 @@ abstract class BaseCardActionFragment : Fragment(), LayoutHolder {
viewModel.ldParams.observe(viewLifecycleOwner, Observer { paramsList ->
val widgetList = mutableListOf<ParameterWidget>()
paramsList.forEach { param ->
val widget = ParameterWidget(inflateParamView(incomingParamsContainer), param)
val widget = ParameterWidget(inflateParamView(incomingParamsContainer), MainResourceHolder, param)
widget.onValueChanged = { tag, value -> viewModel.userChangedParameter(tag, value) }
widget.onActionBtnClickListener = viewModel.getParameterAction(param.tlvTag)
widgetList.add(widget)

View file

@ -1,8 +1,8 @@
package com.tangem.tangemtest.card_use_cases.ui.card.actions
import com.tangem.tangemtest.R
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import com.tangem.tangemtest.card_use_cases.ui.card.BaseCardActionFragment
import com.tangem.tangemtest.commons.ActionType
/**
[REDACTED_AUTHOR]

View file

@ -1,8 +1,8 @@
package com.tangem.tangemtest.card_use_cases.ui.card.actions
import com.tangem.tangemtest.R
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import com.tangem.tangemtest.card_use_cases.ui.card.BaseCardActionFragment
import com.tangem.tangemtest.commons.ActionType
/**
[REDACTED_AUTHOR]

View file

@ -1,8 +1,8 @@
package com.tangem.tangemtest.card_use_cases.ui.card.actions
import com.tangem.tangemtest.R
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import com.tangem.tangemtest.card_use_cases.ui.card.BaseCardActionFragment
import com.tangem.tangemtest.commons.ActionType
/**
[REDACTED_AUTHOR]

View file

@ -12,14 +12,20 @@ import com.google.android.material.textfield.TextInputLayout
import com.tangem.common.tlv.TlvTag
import com.tangem.tangemtest.R
import com.tangem.tangemtest.card_use_cases.domain.params_manager.IncomingParameter
import com.tangem.tangemtest.commons.ActionType
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import com.tangem.tangemtest.card_use_cases.resources.MainResourceHolder
import com.tangem.tangemtest.card_use_cases.resources.Resources
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
/**
[REDACTED_AUTHOR]
*/
class ParameterWidget(private val parent: ViewGroup, model: IncomingParameter) {
class ParameterWidget(
private val parent: ViewGroup,
private val resHolder: MainResourceHolder,
model: IncomingParameter
) {
val tlvTag: TlvTag = model.tlvTag
@ -43,7 +49,7 @@ class ParameterWidget(private val parent: ViewGroup, model: IncomingParameter) {
etValue.setText(stringOf(model.data))
etValue.addTextChangedListener(valueWatcher)
btnAction.setOnClickListener { onActionBtnClickListener?.invoke() }
btnAction.text = btnAction.context.getString(getActionResName())
btnAction.text = btnAction.context.getString(getResName(tlvTag))
toggleActionBtnVisibility()
}
@ -75,12 +81,12 @@ class ParameterWidget(private val parent: ViewGroup, model: IncomingParameter) {
}
}
private fun getActionResName(): Int {
val action = when (tlvTag) {
private fun getResName(tag: TlvTag): Int {
val action = when (tag) {
TlvTag.CardId -> ActionType.Scan
else -> ActionType.Unknown
}
return action.resName
return resHolder.safeGet<Resources>(action).resName
}
private fun toggleActionBtnVisibility() {

View file

@ -18,10 +18,10 @@ import com.tangem.tangemtest.R
import com.tangem.tangemtest._main.MainViewModel
import com.tangem.tangemtest.card_use_cases.domain.params_manager.ParamsManager
import com.tangem.tangemtest.card_use_cases.domain.params_manager.ParamsManagerFactory
import com.tangem.tangemtest.card_use_cases.resources.ActionType
import com.tangem.tangemtest.card_use_cases.ui.card.actions.ActionViewModelFactory
import com.tangem.tangemtest.card_use_cases.ui.card.actions.ParamsViewModel
import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.WidgetBuilder
import com.tangem.tangemtest.commons.ActionType
import kotlinx.android.synthetic.main.fg_personalize.*
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import java.io.IOException

View file

@ -1,339 +0,0 @@
package com.tangem.tangemtest.card_use_cases.ui.personalize
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.base.*
/**
[REDACTED_AUTHOR]
*/
data class UnitResource(
val resName: Int,
val resDescription: Int? = null
)
object PersonalizeResources {
private val map = mutableMapOf<Id, UnitResource>()
init {
InfoInitializer().init(map)
}
fun get(id: Id): UnitResource = map[id] ?: UnitResource(R.string.unknown, R.string.unknown)
}
internal class InfoInitializer() {
fun init(map: MutableMap<Id, UnitResource>) {
initBlock(map)
initCardNumber(map)
initCommon(map)
initSigningMethod(map)
initSignHashExProp(map)
initDenomination(map)
initToken(map)
initProductMask(map)
initSettingsMask(map)
initSettingsMaskProtocolEnc(map)
initSettingsMaskNde(map)
initPins(map)
}
private fun initBlock(map: MutableMap<Id, UnitResource>) {
map[BlockId.CARD_NUMBER] = UnitResource(
R.string.pers_block_card_number,
R.string.info_pers_block_card_number
)
map[BlockId.COMMON] = UnitResource(
R.string.pers_block_common,
R.string.info_pers_block_common
)
map[BlockId.SIGNING_METHOD] = UnitResource(
R.string.pers_block_signing_method,
R.string.info_pers_block_signing_method
)
map[BlockId.SIGN_HASH_EX_PROP] = UnitResource(
R.string.pers_block_sign_hash_ex_prop,
R.string.info_pers_block_sign_hash_ex_prop
)
map[BlockId.DENOMINATION] = UnitResource(
R.string.pers_block_denomination,
R.string.info_pers_block_denomination
)
map[BlockId.TOKEN] = UnitResource(
R.string.pers_block_token,
R.string.info_pers_block_token
)
map[BlockId.PROD_MASK] = UnitResource(
R.string.pers_block_product_mask,
R.string.info_pers_block_product_mask
)
map[BlockId.SETTINGS_MASK] = UnitResource(
R.string.pers_block_settings_mask,
R.string.info_pers_block_settings_mask
)
map[BlockId.SETTINGS_MASK_PROTOCOL_ENC] = UnitResource(
R.string.pers_block_settings_mask_protocol_enc,
R.string.info_pers_block_settings_mask_protocol_enc
)
map[BlockId.SETTINGS_MASK_NDEF] = UnitResource(
R.string.pers_block_settings_mask_ndef,
R.string.info_pers_block_settings_mask_ndef
)
map[BlockId.PINS] = UnitResource(
R.string.pers_block_pins,
R.string.info_pers_block_pins
)
}
private fun initCardNumber(map: MutableMap<Id, UnitResource>) {
map[CardNumber.SERIES] = UnitResource(
R.string.pers_item_series,
R.string.info_pers_item_series
)
map[CardNumber.NUMBER] = UnitResource(
R.string.pers_item_number,
R.string.info_pers_item_number
)
}
private fun initCommon(map: MutableMap<Id, UnitResource>) {
map[Common.CURVE] = UnitResource(
R.string.pers_item_curve,
R.string.info_pers_item_curve
)
map[Common.BLOCKCHAIN] = UnitResource(
R.string.pers_item_blockchain,
R.string.info_pers_item_blockchain
)
map[Common.BLOCKCHAIN_CUSTOM] = UnitResource(
R.string.pers_item_custom_blockchain,
R.string.info_pers_item_custom_blockchain
)
map[Common.MAX_SIGNATURES] = UnitResource(
R.string.pers_item_max_signatures,
R.string.info_pers_item_max_signatures
)
map[Common.CREATE_WALLET] = UnitResource(
R.string.pers_item_create_wallet,
R.string.info_pers_item_create_wallet
)
}
private fun initSigningMethod(map: MutableMap<Id, UnitResource>) {
map[SigningMethod.SIGN_TX] = UnitResource(
R.string.pers_item_sign_tx_hashes,
R.string.info_pers_item_sign_tx_hashes
)
map[SigningMethod.SIGN_TX_RAW] = UnitResource(
R.string.pers_item_sign_raw_tx,
R.string.info_pers_item_sign_raw_tx
)
map[SigningMethod.SIGN_VALIDATED_TX] = UnitResource(
R.string.pers_item_sign_validated_tx_hashes,
R.string.info_pers_item_sign_validated_tx_hashes
)
map[SigningMethod.SIGN_VALIDATED_TX_RAW] = UnitResource(
R.string.pers_item_sign_validated_raw_tx,
R.string.info_pers_item_sign_validated_raw_tx
)
map[SigningMethod.SIGN_VALIDATED_TX_ISSUER] = UnitResource(
R.string.pers_item_sign_validated_tx_hashes_with_iss_data,
R.string.info_pers_item_sign_validated_tx_hashes_with_iss_data
)
map[SigningMethod.SIGN_VALIDATED_TX_RAW_ISSUER] = UnitResource(
R.string.pers_item_sign_validated_raw_tx_with_iss_data,
R.string.info_pers_item_sign_validated_raw_tx_with_iss_data
)
map[SigningMethod.SIGN_EXTERNAL] = UnitResource(
R.string.pers_item_sign_hash_ex,
R.string.info_pers_item_sign_hash_ex
)
}
private fun initSignHashExProp(map: MutableMap<Id, UnitResource>) {
map[SignHashExProp.PIN_LESS_FLOOR_LIMIT] = UnitResource(
R.string.pers_item_pin_less_floor_limit,
R.string.info_pers_item_pin_less_floor_limit
)
map[SignHashExProp.CRYPTO_EXTRACT_KEY] = UnitResource(
R.string.pers_item_cr_ex_key,
R.string.info_pers_item_cr_ex_key
)
map[SignHashExProp.REQUIRE_TERMINAL_CERT_SIG] = UnitResource(
R.string.pers_item_require_terminal_cert_sig,
R.string.info_pers_item_require_terminal_cert_sig
)
map[SignHashExProp.REQUIRE_TERMINAL_TX_SIG] = UnitResource(
R.string.pers_item_require_terminal_tx_sig,
R.string.info_pers_item_require_terminal_tx_sig
)
map[SignHashExProp.CHECK_PIN3] = UnitResource(
R.string.pers_item_pin3,
R.string.info_pers_item_pin3
)
}
private fun initDenomination(map: MutableMap<Id, UnitResource>) {
map[Denomination.WRITE_ON_PERSONALIZE] = UnitResource(
R.string.pers_item_write_on_personalize,
R.string.info_pers_item_write_on_personalize
)
map[Denomination.DENOMINATION] = UnitResource(
R.string.pers_item_denomination,
R.string.info_pers_item_denomination
)
}
private fun initToken(map: MutableMap<Id, UnitResource>) {
map[Token.ITS_TOKEN] = UnitResource(
R.string.pers_item_its_token,
R.string.info_pers_item_its_token
)
map[Token.SYMBOL] = UnitResource(
R.string.pers_item_symbol,
R.string.info_pers_item_symbol
)
map[Token.CONTRACT_ADDRESS] = UnitResource(
R.string.pers_item_contract_address,
R.string.info_pers_item_contract_address
)
map[Token.DECIMAL] = UnitResource(
R.string.pers_item_decimal,
R.string.info_pers_item_decimal
)
}
private fun initProductMask(map: MutableMap<Id, UnitResource>) {
map[ProductMask.NOTE] = UnitResource(
R.string.pers_item_note,
R.string.info_pers_item_note
)
map[ProductMask.TAG] = UnitResource(
R.string.pers_item_tag,
R.string.info_pers_item_tag
)
map[ProductMask.ID_CARD] = UnitResource(
R.string.pers_item_id_card,
R.string.info_pers_item_id_card
)
}
private fun initSettingsMask(map: MutableMap<Id, UnitResource>) {
map[SettingsMask.IS_REUSABLE] = UnitResource(
R.string.pers_item_is_reusable,
R.string.info_pers_item_is_reusable
)
map[SettingsMask.NEED_ACTIVATION] = UnitResource(
R.string.pers_item_need_activation,
R.string.info_pers_item_need_activation
)
map[SettingsMask.FORBID_PURGE] = UnitResource(
R.string.pers_item_forbid_purge,
R.string.info_pers_item_forbid_purge
)
map[SettingsMask.ALLOW_SELECT_BLOCKCHAIN] = UnitResource(
R.string.pers_item_allow_select_blockchain,
R.string.info_pers_item_allow_select_blockchain
)
map[SettingsMask.USE_BLOCK] = UnitResource(
R.string.pers_item_use_block,
R.string.info_pers_item_use_block
)
map[SettingsMask.ONE_APDU] = UnitResource(
R.string.pers_item_one_apdu_at_once,
R.string.info_pers_item_one_apdu_at_once
)
map[SettingsMask.USE_CVC] = UnitResource(
R.string.pers_item_use_cvc,
R.string.info_pers_item_use_cvc
)
map[SettingsMask.ALLOW_SWAP_PIN] = UnitResource(
R.string.pers_item_allow_swap_pin,
R.string.info_pers_item_allow_swap_pin
)
map[SettingsMask.ALLOW_SWAP_PIN2] = UnitResource(
R.string.pers_item_allow_swap_pin2,
R.string.info_pers_item_allow_swap_pin2
)
map[SettingsMask.FORBID_DEFAULT_PIN] = UnitResource(
R.string.pers_item_forbid_default_pin,
R.string.info_pers_item_forbid_default_pin
)
map[SettingsMask.SMART_SECURITY_DELAY] = UnitResource(
R.string.pers_item_smart_security_delay,
R.string.info_pers_item_smart_security_delay
)
map[SettingsMask.PROTECT_ISSUER_DATA_AGAINST_REPLAY] = UnitResource(
R.string.pers_item_protect_issuer_data_against_replay,
R.string.info_pers_item_protect_issuer_data_against_replay
)
map[SettingsMask.SKIP_SECURITY_DELAY_IF_VALIDATED] = UnitResource(
R.string.pers_item_skip_security_delay_if_validated,
R.string.info_pers_item_skip_security_delay_if_validated
)
map[SettingsMask.SKIP_PIN2_CVC_IF_VALIDATED] = UnitResource(
R.string.pers_item_skip_pin2_and_cvc_if_validated,
R.string.info_pers_item_skip_pin2_and_cvc_if_validated
)
map[SettingsMask.SKIP_SECURITY_DELAY_ON_LINKED_TERMINAL] = UnitResource(
R.string.pers_item_skip_security_delay_on_linked_terminal,
R.string.info_pers_item_skip_security_delay_on_linked_terminal
)
map[SettingsMask.RESTRICT_OVERWRITE_EXTRA_ISSUER_DATA] = UnitResource(
R.string.pers_item_restrict_overwrite_ex_issuer_data,
R.string.info_pers_item_restrict_overwrite_ex_issuer_data
)
}
private fun initSettingsMaskProtocolEnc(map: MutableMap<Id, UnitResource>) {
map[SettingsMaskProtocolEnc.ALLOW_UNENCRYPTED] = UnitResource(
R.string.pers_item_allow_unencrypted,
R.string.info_pers_item_allow_unencrypted
)
map[SettingsMaskProtocolEnc.ALLOW_FAST_ENCRYPTION] = UnitResource(
R.string.pers_item_allow_fast_encryption,
R.string.info_pers_item_allow_fast_encryption
)
}
private fun initSettingsMaskNde(map: MutableMap<Id, UnitResource>) {
map[SettingsMaskNdef.USE_NDEF] = UnitResource(
R.string.pers_item_use_ndef,
R.string.info_pers_item_use_ndef
)
map[SettingsMaskNdef.DYNAMIC_NDEF] = UnitResource(
R.string.pers_item_dynamic_ndef,
R.string.info_pers_item_dynamic_ndef
)
map[SettingsMaskNdef.DISABLE_PRECOMPUTED_NDEF] = UnitResource(
R.string.pers_item_disable_precomputed_ndef,
R.string.info_pers_item_disable_precomputed_ndef
)
map[SettingsMaskNdef.AAR] = UnitResource(
R.string.pers_item_aar,
R.string.info_pers_item_aar
)
}
private fun initPins(map: MutableMap<Id, UnitResource>) {
map[Pins.PIN] = UnitResource(
R.string.pers_item_pin,
R.string.info_pers_item_pin
)
map[Pins.PIN2] = UnitResource(
R.string.pers_item_pin2,
R.string.info_pers_item_pin2
)
map[Pins.PIN3] = UnitResource(
R.string.pers_item_pin3,
R.string.info_pers_item_pin3
)
map[Pins.CVC] = UnitResource(
R.string.pers_item_cvc,
R.string.info_pers_item_cvc
)
map[Pins.PAUSE_BEFORE_PIN2] = UnitResource(
R.string.pers_item_pause_before_pin2,
R.string.info_pers_item_pause_before_pin2
)
}
}

View file

@ -5,7 +5,8 @@ import android.view.View
import android.view.ViewGroup
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.base.DataUnit
import com.tangem.tangemtest.card_use_cases.ui.personalize.PersonalizeResources
import com.tangem.tangemtest.card_use_cases.resources.MainResourceHolder
import com.tangem.tangemtest.card_use_cases.resources.Resources
import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
/**
@ -31,6 +32,6 @@ abstract class BaseViewWidget(parent: ViewGroup) : ViewWidget {
}
}
fun UnitWidget<*>.getResNameId(): Int = PersonalizeResources.get(unit.id).resName
fun UnitWidget<*>.getResNameId(): Int = MainResourceHolder.safeGet<Resources>(unit.id).resName
fun UnitWidget<*>.getResDescription(): Int? = PersonalizeResources.get(unit.id).resDescription
fun UnitWidget<*>.getResDescription(): Int? = MainResourceHolder.safeGet<Resources>(unit.id).resDescription

View file

@ -1,6 +1,5 @@
package com.tangem.tangemtest.commons
import androidx.annotation.StringRes
import androidx.navigation.NavOptions
import androidx.navigation.navOptions
import com.tangem.tangemtest.R
@ -18,22 +17,4 @@ fun getDefaultNavigationOptions(): NavOptions {
popExit = R.anim.slide_out_right
}
}
}
data class NavigateOptions(val name: ActionType, val destinationId: Int)
enum class ActionType(@StringRes val resName: Int) {
Scan(R.string.action_card_scan),
Sign(R.string.action_card_sign),
CreateWallet(R.string.action_wallet_create),
PurgeWallet(R.string.action_wallet_purge),
ReadIssuerData(R.string.action_issuer_read_data),
WriteIssuerData(R.string.action_issuer_write_data),
ReadIssuerExData(R.string.action_issuer_read_ex_data),
WriteIssuerExData(R.string.action_issuer_write_ex_data),
ReadUserData(R.string.action_user_read_data),
WriteUserData(R.string.action_user_write_data),
Personalize(R.string.personalize),
Depersonalize(R.string.depersonalize),
Unknown(R.string.unknown),
}

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -7,10 +7,9 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_actions"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -1,21 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="?android:attr/selectableItemBackground">
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:gravity="center"
android:orientation="vertical"
android:padding="@dimen/def_indent">
<TextView
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/def_indent"
android:layout_marginEnd="@dimen/def_indent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Action method" />
</androidx.constraintlayout.widget.ConstraintLayout>
<include
layout="@layout/w_field_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_title"
tools:visibility="visible" />
</LinearLayout>

View file

@ -2,19 +2,8 @@
<string name="app_name">Tangem Demo</string>
<string name="fg_name_entry_point">@string/app_name</string>
<string name="action_card_scan">Scan</string>
<string name="action_card_sign">Sign</string>
<string name="action_personalize">Personalize</string>
<string name="action_depersonalize">Depersonalize</string>
<string name="action_wallet_create">Create wallet</string>
<string name="action_wallet_purge">Purge wallet</string>
<string name="action_issuer_read_data">Read issuer data</string>
<string name="action_issuer_write_data">Write issuer data</string>
<string name="action_issuer_read_ex_data">Read issuer extra data</string>
<string name="action_issuer_write_ex_data">Write issuer extra data</string>
<string name="action_user_read_data">Read user data</string>
<string name="action_user_write_data">Write user data</string>
<string name="current_card_id">"Current card ID: "</string>
<string name="unknown">unknown</string>
</resources>

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="action_card_scan">Scan</string>
<string name="action_card_sign">Sign</string>
<string name="action_personalize">Personalize</string>
<string name="action_depersonalize">Depersonalize</string>
<string name="action_wallet_create">Create wallet</string>
<string name="action_wallet_purge">Purge wallet</string>
<string name="action_issuer_read_data">Read issuer data</string>
<string name="action_issuer_write_data">Write issuer data</string>
<string name="action_issuer_read_ex_data">Read issuer extra data</string>
<string name="action_issuer_write_ex_data">Write issuer extra data</string>
<string name="action_user_read_data">Read user data</string>
<string name="action_user_write_data">Write user data</string>
<string name="info_action_card_scan">SomeDescription</string>
<string name="info_action_card_sign">SomeDescription</string>
<string name="info_action_personalize">SomeDescription</string>
<string name="info_action_depersonalize">SomeDescription</string>
<string name="info_action_wallet_create">SomeDescription</string>
<string name="info_action_wallet_purge">SomeDescription</string>
<string name="info_action_issuer_read_data">SomeDescription</string>
<string name="info_action_issuer_write_data">SomeDescription</string>
<string name="info_action_issuer_read_ex_data">SomeDescription</string>
<string name="info_action_issuer_write_ex_data">SomeDescription</string>
<string name="info_action_user_read_data">SomeDescription</string>
<string name="info_action_user_write_data">SomeDescription</string>
</resources>

View file

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="personalize">Personalize</string>
<string name="depersonalize">Depersonalize</string>
<string name="pers_block_card_number">Card number</string>
<string name="pers_block_common">Common</string>
<string name="pers_block_signing_method">Signing method</string>