From 1c554ecde7446de4e5f3655caa04a0be7623b543 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 25 Mar 2020 14:06:08 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tangemtest/AppTangemDemo.kt | 5 ++ .../_main/entry_point/EntryPointFragment.kt | 1 + .../domain/card_action/card_actions.kt | 51 ++++++++++++++++++- .../domain/params_manager/factory.kt | 1 + .../modifiers/after_action_modifiers.kt | 1 + .../domain/params_manager/params_managers.kt | 14 +++++ .../actions/DepesonalizeActionFragment.kt | 16 ++++++ .../ui/card/actions/ParamsViewModel.kt | 2 +- .../ui/personalize/PersonalizeFragment.kt | 31 +++++++++-- .../tangem/tangemtest/commons/navigation.kt | 1 + .../src/main/res/layout/activity_main.xml | 0 .../src/main/res/layout/fg_depersonalize.xml | 40 +++++++++++++++ .../src/main/res/layout/fg_personalize.xml | 33 +++++++++--- .../src/main/res/layout/old_activity_main.xml | 18 ++++++- .../src/main/res/navigation/navigation.xml | 11 +++- .../res/values/string_personalization.xml | 1 + tangem-demo/src/main/res/values/strings.xml | 1 + 17 files changed, 213 insertions(+), 14 deletions(-) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/DepesonalizeActionFragment.kt delete mode 100644 tangem-demo/src/main/res/layout/activity_main.xml create mode 100644 tangem-demo/src/main/res/layout/fg_depersonalize.xml diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt index fd90e38433..5a7b929612 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt @@ -14,6 +14,7 @@ class AppTangemDemo : Application() { override fun onCreate() { super.onCreate() + AppTangemDemo.appInstance = this setupLoggers() } @@ -21,4 +22,8 @@ class AppTangemDemo : Application() { Log.setLogger(TangemLogger()) ULog.setLogger(UnitLogger()) } + + companion object { + lateinit var appInstance: AppTangemDemo + } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entry_point/EntryPointFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entry_point/EntryPointFragment.kt index eb8907f312..5e16fc992f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entry_point/EntryPointFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entry_point/EntryPointFragment.kt @@ -67,6 +67,7 @@ class EntryPointFragment : Fragment() { 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), diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/card_action/card_actions.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/card_action/card_actions.kt index ae177a8eab..7948f07f61 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/card_action/card_actions.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/card_action/card_actions.kt @@ -1,13 +1,17 @@ package com.tangem.tangemtest.card_use_cases.domain.card_action import com.tangem.CardManager +import com.tangem.commands.personalization.CardConfig import com.tangem.common.tlv.TlvTag +import com.tangem.tangemtest.AppTangemDemo import com.tangem.tangemtest.card_use_cases.domain.params_manager.ActionCallback import com.tangem.tangemtest.card_use_cases.domain.params_manager.IncomingParameter import com.tangem.tangemtest.card_use_cases.domain.params_manager.findParameter import com.tangem.tangemtest.card_use_cases.domain.params_manager.modifiers.AfterActionModification import com.tangem.tangemtest.card_use_cases.domain.params_manager.modifiers.AfterScanModifier import com.tangem.tangemtest.card_use_cases.domain.params_manager.modifiers.ParamsChangeConsequence +import com.tangem.tangemtest.extensions.init +import com.tangem.tasks.ScanEvent import com.tangem.tasks.TaskEvent import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf @@ -74,6 +78,51 @@ class SignAction : BaseCardAction() { class PersonalizeAction : BaseCardAction() { override fun executeMainAction(attrs: AttrForAction, callback: ActionCallback) { - TODO("Not yet implemented") + ScanAction().executeMainAction(attrs) { response, b -> + when(response){ + is TaskEvent.Event -> { + val taskEvent = response as TaskEvent.Event + val cardId = handleDataEvent(taskEvent.data) + if (cardId == null) { + handleResponse(response, null, attrs, callback) + return@executeMainAction + } + + attrs.cardManager.personalize(CardConfig.init(AppTangemDemo.appInstance), cardId) { + handleResponse(it, null, attrs, callback) + } + } + is TaskEvent.Completion -> { + handleResponse(response, null, attrs, callback) + } + } + + + } + } + + private fun handleDataEvent(event: Any?): String? { + return when (event) { + is ScanEvent.OnReadEvent -> { + event.card.cardId + } + else -> null + } + + } +} + +class DepesonalizeAction : BaseCardAction() { + override fun executeMainAction(attrs: AttrForAction, callback: ActionCallback) { + val cardId = attrs.paramsList.findParameter(TlvTag.CardId)?.data as? String ?: return + + attrs.cardManager.depersonalize(cardId) { handleResponse(it, null, attrs, callback) } + } + + override fun getActionByTag(tag: TlvTag, attrs: AttrForAction): ((ActionCallback) -> Unit)? { + return when (tag) { + TlvTag.CardId -> { callback -> ScanAction().executeMainAction(attrs, callback) } + else -> null + } } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/factory.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/factory.kt index 9d95abb8b3..8977c9e10b 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/factory.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/factory.kt @@ -14,6 +14,7 @@ class ParamsManagerFactory : BaseTypedHolder() { register(ActionType.Scan, ScanParamsManager()) register(ActionType.Sign, SignParamsManager()) register(ActionType.Personalize, PersonalizeParamsManager()) + register(ActionType.Depersonalize, DepersonalizeParamsManager()) } } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/modifiers/after_action_modifiers.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/modifiers/after_action_modifiers.kt index c504238c0f..f4ca3b51a2 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/modifiers/after_action_modifiers.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/modifiers/after_action_modifiers.kt @@ -26,4 +26,5 @@ class AfterScanModifier : AfterActionModification { listOf(parameter) } else listOf() } + } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/params_managers.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/params_managers.kt index afc762c311..8f9e390ad9 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/params_managers.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/domain/params_manager/params_managers.kt @@ -94,6 +94,20 @@ class PersonalizeParamsManager : BaseParamsManager(PersonalizeAction()) { } override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { + action.executeMainAction(getAttrsForAction(cardManager), callback) + } +} +class DepersonalizeParamsManager: BaseParamsManager(DepesonalizeAction()){ + override fun createParamsList(): List { + return listOf(IncomingParameter(TlvTag.CardId, null)) + } + + override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { + action.executeMainAction(getAttrsForAction(cardManager), callback) + } + + override fun getActionByTag(tag: TlvTag, cardManager: CardManager): ((ActionCallback) -> Unit)? { + return action.getActionByTag(tag, getAttrsForAction(cardManager)) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/DepesonalizeActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/DepesonalizeActionFragment.kt new file mode 100644 index 0000000000..88a6fbe6a8 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/DepesonalizeActionFragment.kt @@ -0,0 +1,16 @@ +package com.tangem.tangemtest.card_use_cases.ui.card.actions + +import com.tangem.tangemtest.R +import com.tangem.tangemtest.card_use_cases.ui.card.BaseCardActionFragment +import com.tangem.tangemtest.commons.ActionType + +/** +[REDACTED_AUTHOR] + */ +class DepesonalizeActionFragment : BaseCardActionFragment() { + + override fun getLayoutId(): Int = R.layout.fg_depersonalize + + override fun getAction(): ActionType = ActionType.Depersonalize + +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ParamsViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ParamsViewModel.kt index 6576c6ae98..d280a32ec9 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ParamsViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ParamsViewModel.kt @@ -114,7 +114,7 @@ internal class Notifier(private val vm: ParamsViewModel) { if (notShowedError == null) { vm.seError.postValue("User was cancelled") } else { - vm.seError.postValue("Error description not implemented. Code: ${notShowedError!!.code}") + vm.seError.postValue("${notShowedError!!::class.simpleName}") notShowedError = null } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeFragment.kt index 9915bf4cb0..80dd27b9a7 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeFragment.kt @@ -10,9 +10,19 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Observer +import com.google.android.material.snackbar.BaseTransientBottomBar +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._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.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 import java.io.InputStream @@ -24,7 +34,10 @@ import java.nio.charset.Charset class PersonalizeFragment : Fragment() { private val mainActivityVM: MainViewModel by activityViewModels() - private val viewModel: PersonalizeViewModel by viewModels { PersonalizeViewModelFactory(getPersonalizeJson()) } + private val personalizeVM: PersonalizeViewModel by viewModels { PersonalizeViewModelFactory(getPersonalizeJson()) } + + private val paramsManager: ParamsManager by lazy { ParamsManagerFactory.createFactory().get(ActionType.Personalize)!! } + private val paramsVM: ParamsViewModel by viewModels() { ActionViewModelFactory(paramsManager) } private val blockContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_container) @@ -40,12 +53,24 @@ class PersonalizeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - viewModel.ldBlockList.observe(viewLifecycleOwner, Observer { blocList -> + personalizeVM.ldBlockList.observe(viewLifecycleOwner, Observer { blocList -> blocList.forEach { WidgetBuilder().build(it, blockContainer) } }) mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { - viewModel.toggleDescriptionVisibility(it) + personalizeVM.toggleDescriptionVisibility(it) }) + + paramsVM.setCardManager(CardManager.init(requireActivity())) + paramsVM.ldResponse.observe(viewLifecycleOwner, Observer { + Log.d(this, "action response: ${if (it.length > 50) it.substring(0..50) else it}") + showSnackbarMessage(it) + }) + paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbarMessage(it) }) + fab_action?.setOnClickListener { paramsVM.invokeMainAction() } + } + + protected fun showSnackbarMessage(message: String) { + Snackbar.make(mainView, message, BaseTransientBottomBar.LENGTH_SHORT).show() } private fun getPersonalizeJson(): String { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/navigation.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/navigation.kt index 899776890c..79482e51c5 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/navigation.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/navigation.kt @@ -34,5 +34,6 @@ enum class ActionType(@StringRes val resName: Int) { 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), } \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/activity_main.xml b/tangem-demo/src/main/res/layout/activity_main.xml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tangem-demo/src/main/res/layout/fg_depersonalize.xml b/tangem-demo/src/main/res/layout/fg_depersonalize.xml new file mode 100644 index 0000000000..45978494a3 --- /dev/null +++ b/tangem-demo/src/main/res/layout/fg_depersonalize.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/fg_personalize.xml b/tangem-demo/src/main/res/layout/fg_personalize.xml index e5ed26be0d..81cd81dc72 100644 --- a/tangem-demo/src/main/res/layout/fg_personalize.xml +++ b/tangem-demo/src/main/res/layout/fg_personalize.xml @@ -1,14 +1,33 @@ - - + + + + + + + + + android:layout_marginEnd="@dimen/def_indent" + android:layout_marginBottom="@dimen/def_double_indent" + android:src="@drawable/ic_nfc" + app:layout_anchor="@id/scroll_view" + app:layout_anchorGravity="bottom|end" /> - - - \ No newline at end of file + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/old_activity_main.xml b/tangem-demo/src/main/res/layout/old_activity_main.xml index 0bef5b78fb..fa56a8213d 100644 --- a/tangem-demo/src/main/res/layout/old_activity_main.xml +++ b/tangem-demo/src/main/res/layout/old_activity_main.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - +