diff --git a/tangem-core/src/main/java/com/tangem/CardSession.kt b/tangem-core/src/main/java/com/tangem/CardSession.kt index 6021923099..b2971b2758 100644 --- a/tangem-core/src/main/java/com/tangem/CardSession.kt +++ b/tangem-core/src/main/java/com/tangem/CardSession.kt @@ -19,6 +19,8 @@ import com.tangem.crypto.pbkdf2Hash */ interface CardSessionRunnable { + val performPreflightRead: Boolean + /** * The starting point for custom business logic. * Implement this interface and use [TangemSdk.startSessionWithRunnable] to run. @@ -55,6 +57,8 @@ class CardSession( */ private var isBusy = false + private var performPreflightRead = true + /** * This metod starts a card session, performs preflight [ReadCommand], * invokes [CardSessionRunnable.run] and closes the session. @@ -64,6 +68,8 @@ class CardSession( fun , R : CommandResponse> startWithRunnable( runnable: T, callback: (result: CompletionResult) -> Unit) { + performPreflightRead = runnable.performPreflightRead + start { session, error -> if (error != null) { callback(CompletionResult.Failure(error)) @@ -104,6 +110,11 @@ class CardSession( callback(this, error) } + if (!performPreflightRead) { + callback(this, null) + return + } + preflightRead() { result -> when (result) { is CompletionResult.Failure -> { diff --git a/tangem-core/src/main/java/com/tangem/TangemSdk.kt b/tangem-core/src/main/java/com/tangem/TangemSdk.kt index ce0c0e8a47..b03d3c87e3 100644 --- a/tangem-core/src/main/java/com/tangem/TangemSdk.kt +++ b/tangem-core/src/main/java/com/tangem/TangemSdk.kt @@ -307,7 +307,7 @@ class TangemSdk( * card response in the form of [DepersonalizeResponse] if the task was performed successfully * or [TangemSdkError] in case of an error. * */ - fun depersonalize(cardId: String, initialMessage: Message? = null, + fun depersonalize(cardId: String? = null, initialMessage: Message? = null, callback: (result: CompletionResult) -> Unit) { startSessionWithRunnable(DepersonalizeCommand(), cardId, initialMessage, callback) } diff --git a/tangem-core/src/main/java/com/tangem/commands/Command.kt b/tangem-core/src/main/java/com/tangem/commands/Command.kt index e7e90c5123..0b17642735 100644 --- a/tangem-core/src/main/java/com/tangem/commands/Command.kt +++ b/tangem-core/src/main/java/com/tangem/commands/Command.kt @@ -19,6 +19,8 @@ interface CommandResponse */ abstract class Command : CardSessionRunnable { + override val performPreflightRead: Boolean = true + /** * Serializes data into an array of [com.tangem.common.tlv.Tlv], * then creates [CommandApdu] with this data. diff --git a/tangem-core/src/main/java/com/tangem/commands/personalization/DepersonalizeCommand.kt b/tangem-core/src/main/java/com/tangem/commands/personalization/DepersonalizeCommand.kt index c3bb2d4de8..00dccae6a1 100644 --- a/tangem-core/src/main/java/com/tangem/commands/personalization/DepersonalizeCommand.kt +++ b/tangem-core/src/main/java/com/tangem/commands/personalization/DepersonalizeCommand.kt @@ -1,12 +1,8 @@ package com.tangem.commands.personalization -import com.tangem.CardSession import com.tangem.SessionEnvironment -import com.tangem.TangemSdkError -import com.tangem.commands.CardStatus import com.tangem.commands.Command import com.tangem.commands.CommandResponse -import com.tangem.common.CompletionResult import com.tangem.common.apdu.CommandApdu import com.tangem.common.apdu.Instruction import com.tangem.common.apdu.ResponseApdu @@ -21,17 +17,19 @@ data class DepersonalizeResponse(val success: Boolean) : CommandResponse */ class DepersonalizeCommand : Command() { - override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean { - if (session.environment.card?.status == CardStatus.NotPersonalized) { - callback(CompletionResult.Failure(TangemSdkError.NotPersonalized())) - return true - } - if (session.environment.card?.firmwareVersion?.contains("SDK") == false) { - callback(CompletionResult.Failure(TangemSdkError.CannotBeDepersonalized())) - return true - } - return false - } + override val performPreflightRead = false + +// override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean { +// if (session.environment.card?.status == CardStatus.NotPersonalized) { +// callback(CompletionResult.Failure(TangemSdkError.NotPersonalized())) +// return true +// } +// if (session.environment.card?.firmwareVersion?.contains("SDK") == false) { +// callback(CompletionResult.Failure(TangemSdkError.CannotBeDepersonalized())) +// return true +// } +// return false +// } override fun serialize(environment: SessionEnvironment): CommandApdu { return CommandApdu( diff --git a/tangem-core/src/main/java/com/tangem/tasks/CreateWalletTask.kt b/tangem-core/src/main/java/com/tangem/tasks/CreateWalletTask.kt index c9b87b4da2..317134af60 100644 --- a/tangem-core/src/main/java/com/tangem/tasks/CreateWalletTask.kt +++ b/tangem-core/src/main/java/com/tangem/tasks/CreateWalletTask.kt @@ -11,6 +11,8 @@ import com.tangem.common.CompletionResult class CreateWalletTask : CardSessionRunnable { + override val performPreflightRead = true + override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) { val curve = session.environment.card?.curve if (curve == null) { diff --git a/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt b/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt index db78568806..c05384d5a1 100644 --- a/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt +++ b/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt @@ -13,6 +13,8 @@ import com.tangem.common.CompletionResult */ internal class ScanTask : CardSessionRunnable { + override val performPreflightRead = true + override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) { val card = session.environment.card diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/DepersonalizeAction.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/DepersonalizeAction.kt index d938eb85ad..9cfec29492 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/DepersonalizeAction.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/actions/DepersonalizeAction.kt @@ -1,26 +1,14 @@ package com.tangem.devkit.ucase.domain.actions -import com.tangem.devkit._arch.structure.Id import com.tangem.devkit._arch.structure.PayloadHolder -import com.tangem.devkit._arch.structure.abstraction.findItem import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback -import com.tangem.devkit.ucase.variants.TlvId +import com.tangem.devkit.ucase.domain.paramsManager.triggers.afterAction.AfterScanModifier /** [REDACTED_AUTHOR] */ class DepersonalizeAction : BaseAction() { override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) { - val item = attrs.itemList.findItem(TlvId.CardId) ?: return - val cardId = item.viewModel.data as? String ?: return - - attrs.tangemSdk.depersonalize(cardId) { handleResult(payload, it, null, attrs, callback) } - } - - override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? { - return when (id) { - TlvId.CardId -> { callback -> ScanAction().executeMainAction(payload, attrs, callback) } - else -> null - } + attrs.tangemSdk.depersonalize { handleResult(payload, it, AfterScanModifier(), attrs, callback) } } } \ No newline at end of file diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt index bb6b16540e..350a72b9f1 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/domain/paramsManager/managers/SimpleManagers.kt @@ -10,13 +10,7 @@ import com.tangem.devkit.ucase.variants.TlvId */ class ScanItemsManager : BaseItemsManager(ScanAction()) -class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) { - - init { - setItemChangeConsequences(CardIdConsequence()) - setItems(listOf(EditTextItem(TlvId.CardId, null))) - } -} +class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) class SignItemsManager : BaseItemsManager(SignAction()) { diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt index 802ba1e807..9d1409d58d 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt @@ -1,8 +1,18 @@ package com.tangem.devkit.ucase.variants.depersonalize.ui +import android.os.Bundle +import android.util.TypedValue +import android.view.Gravity +import android.view.View +import android.widget.FrameLayout +import android.widget.TextView +import com.tangem.commands.Card +import com.tangem.devkit.R import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager import com.tangem.devkit.ucase.domain.paramsManager.managers.DepersonalizeItemsManager import com.tangem.devkit.ucase.ui.BaseCardActionFragment +import com.tangem.devkit.ucase.variants.responses.ui.ResponseFragment +import ru.dev.gbixahue.eu4d.lib.android._android.views.dpToPx /** [REDACTED_AUTHOR] @@ -10,4 +20,37 @@ import com.tangem.devkit.ucase.ui.BaseCardActionFragment class DepersonalizeActionFragment : BaseCardActionFragment() { override val itemsManager: ItemsManager by lazy { DepersonalizeItemsManager() } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val howToUseView = createHowToUse() + contentContainer.layoutParams = FrameLayout.LayoutParams(-1, -1, Gravity.CENTER) + contentContainer.addView(howToUseView) + } + + private fun createHowToUse(): View { + val fl = FrameLayout(requireContext()) + fl.layoutParams = FrameLayout.LayoutParams(-1, -1, Gravity.CENTER) + val tv = TextView(requireContext()).apply { + val padding = dpToPx(16f).toInt() + setPadding(padding, 0, padding, 0) + gravity = Gravity.CENTER + setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f) + setText(R.string.htu_depersonalize_action) + } + fl.addView(tv) + return fl + } + + override fun initViews() { + swrLayout.isEnabled = false + actionFab.setOnClickListener { actionVM.invokeMainAction() } + } + + override fun handleResponseCardData(card: Card) { + super.handleResponseCardData(card) + val bundle = ResponseFragment.setTittle(R.string.fg_name_response_depersonalization) + navigateTo(R.id.action_nav_card_action_to_response_screen, bundle, null) + } } \ No newline at end of file diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt index f8c304044c..052430a792 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/ItemTypes.kt @@ -38,10 +38,11 @@ class ItemTypes { ) val hiddenList = mutableListOf( - CardNumberId.Series, CardNumberId.BatchId, PinsId.Pin3, SigningMethodId.SignExternal, + CardNumberId.Series, CardNumberId.BatchId, SigningMethodId.SignExternal, SignHashExPropId.CryptoExKey, SignHashExPropId.CheckPin3, SettingsMaskId.OneApdu, SettingsMaskId.UseBlock, SettingsMaskId.ProtectIssuerDataAgainstReplay, - SignHashExPropId.RequireTerminalCertSig, SignHashExPropId.RequireTerminalTxSig + SignHashExPropId.RequireTerminalCertSig, SignHashExPropId.RequireTerminalTxSig, + BlockId.Pins, PinsId.Pin, PinsId.Pin2, PinsId.Pin3, PinsId.Cvc ) val oftenUsedList = listOf( diff --git a/tangem-devkit/src/main/res/values/strings_action.xml b/tangem-devkit/src/main/res/values/strings_action.xml index 68d55b7bd9..f1a1c5f9ca 100644 --- a/tangem-devkit/src/main/res/values/strings_action.xml +++ b/tangem-devkit/src/main/res/values/strings_action.xml @@ -30,5 +30,6 @@ This command writes to the card User Data and User Counter fields. This command writes to the card User Protected Data and User Protected Counter fields. + To depersonalize the card, press the button at the right bottom corner of the screen \ No newline at end of file