From 72616738fe50c6250d5350efc7fda743d4a11245 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 7 Apr 2020 16:13:02 +0300 Subject: [PATCH 01/19] Updated on 2026-08-14 --- .../_arch/widget/ItemWidgetBuilder.kt | 12 +++ .../tangemtest/_arch/widget/WidgetBuilder.kt | 37 +++++++ .../widget}/abstraction/ViewWidget.kt | 2 +- .../widget/impl}/LinearBlockWidget.kt | 14 ++- .../widget}/impl/StubWidget.kt | 4 +- .../_main/entryPoint/ActionListFragment.kt | 20 ++-- .../triggers/afterAction/AfterScanModifier.kt | 4 +- .../ParamChangeConsequence.kt | 2 +- .../tangemtest/ucase/tunnel/ViewScreen.kt | 15 +-- .../ucase/ui/BaseCardActionFragment.kt | 42 +++----- .../ucase/ui/BaseCardResponseFragment.kt | 58 +++++++++++ .../tangemtest/ucase/ui/BaseFragment.kt | 38 ++++++++ .../tangemtest/ucase/ui/ParamsViewModel.kt | 17 ++-- .../ucase/ui/ResponseItemBuilder.kt | 20 ++++ .../ucase/ui/widgets/ResponseTextWidget.kt | 34 +++++++ .../personalize/ui/PersonalizeFragment.kt | 96 +++++++++++-------- .../item/TextWidget.kt => BlockHeadWidget.kt} | 6 +- .../{impl/item => }/DescriptionWidget.kt | 6 +- .../widgets/{impl/item => }/EditTextWidget.kt | 4 +- .../widgets/{impl/item => }/NumberWidget.kt | 4 +- .../ui/widgets/PersonalizeItemBuilder.kt | 23 +++++ .../widgets/{impl/item => }/SpinnerWidget.kt | 4 +- .../widgets/{impl/item => }/SwitchWidget.kt | 4 +- .../personalize/ui/widgets/WidgetBuilder.kt | 48 ---------- .../src/main/res/layout/fg_card_response.xml | 22 +++++ .../src/main/res/layout/w_response_item.xml | 34 +++++++ .../src/main/res/navigation/navigation.xml | 10 ++ 27 files changed, 406 insertions(+), 174 deletions(-) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/{ucase/variants/personalize/ui/widgets => _arch/widget}/abstraction/ViewWidget.kt (95%) rename tangem-demo/src/main/java/com/tangem/tangemtest/{ucase/variants/personalize/ui/widgets/impl/block => _arch/widget/impl}/LinearBlockWidget.kt (52%) rename tangem-demo/src/main/java/com/tangem/tangemtest/{ucase/variants/personalize/ui/widgets => _arch/widget}/impl/StubWidget.kt (67%) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardResponseFragment.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ResponseItemBuilder.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ResponseTextWidget.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/{impl/item/TextWidget.kt => BlockHeadWidget.kt} (68%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/{impl/item => }/DescriptionWidget.kt (87%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/{impl/item => }/EditTextWidget.kt (94%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/{impl/item => }/NumberWidget.kt (95%) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizeItemBuilder.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/{impl/item => }/SpinnerWidget.kt (96%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/{impl/item => }/SwitchWidget.kt (91%) delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/WidgetBuilder.kt create mode 100644 tangem-demo/src/main/res/layout/fg_card_response.xml create mode 100644 tangem-demo/src/main/res/layout/w_response_item.xml diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt new file mode 100644 index 0000000000..b507573e99 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt @@ -0,0 +1,12 @@ +package com.tangem.tangemtest._arch.widget + +import android.view.ViewGroup +import com.tangem.tangemtest._arch.structure.abstraction.BaseItem +import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget + +/** +[REDACTED_AUTHOR] + */ +interface ItemWidgetBuilder { + fun build(item: BaseItem<*>, parent: ViewGroup): ViewWidget? +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt new file mode 100644 index 0000000000..a524006f74 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt @@ -0,0 +1,37 @@ +package com.tangem.tangemtest._arch.widget + +import android.view.ViewGroup +import com.tangem.tangemtest._arch.structure.abstraction.BaseItem +import com.tangem.tangemtest._arch.structure.abstraction.Block +import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock +import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget +import com.tangem.tangemtest._arch.widget.impl.LinearBlockWidget +import com.tangem.tangemtest._arch.widget.impl.StubWidget + +/** +[REDACTED_AUTHOR] + */ +class WidgetBuilder( + private val itemBuilder: ItemWidgetBuilder +) { + + fun build(item: Item, parent: ViewGroup): ViewWidget? { + return when (item) { + is Block -> buildBlock(item, parent) + is BaseItem<*> -> itemBuilder.build(item, parent) + else -> StubWidget(parent) + } + } + + private fun buildBlock(block: Block, parent: ViewGroup): ViewWidget { + return when (block) { + is ListItemBlock -> { + val linearBlock = LinearBlockWidget(parent, block) + block.getItems().forEach { build(it, linearBlock.view as ViewGroup) } + linearBlock + } + else -> StubWidget(parent) + } + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/abstraction/ViewWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt similarity index 95% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/abstraction/ViewWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt index 7926c4a0cf..b3ca53c3a0 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/abstraction/ViewWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction +package com.tangem.tangemtest._arch.widget.abstraction import android.view.LayoutInflater import android.view.View diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/block/LinearBlockWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearBlockWidget.kt similarity index 52% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/block/LinearBlockWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearBlockWidget.kt index fb4be30444..5f1d268c6f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/block/LinearBlockWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearBlockWidget.kt @@ -1,11 +1,11 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.block +package com.tangem.tangemtest._arch.widget.impl import android.view.ViewGroup import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.BaseBlockWidget +import com.tangem.tangemtest._arch.structure.abstraction.iterate +import com.tangem.tangemtest._arch.widget.abstraction.BaseBlockWidget /** [REDACTED_AUTHOR] @@ -17,5 +17,11 @@ class LinearBlockWidget( override fun getLayoutId(): Int = R.layout.w_personilize_block override var viewModel: List> = listOf() - get() = children.itemList.map { it as BaseItem<*> }.map { it.viewModel } + get() { + val vmList = mutableListOf>() + children.itemList.iterate { item -> + (item as? ItemViewModel<*>)?.let { vmList.add(it) } + } + return vmList.toList() + } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/StubWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt similarity index 67% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/StubWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt index a087c6e0cb..98e2bcd57a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/StubWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt @@ -1,9 +1,9 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl +package com.tangem.tangemtest._arch.widget.impl import android.view.ViewGroup import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.BaseBlockWidget +import com.tangem.tangemtest._arch.widget.abstraction.BaseBlockWidget /** [REDACTED_AUTHOR] diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt index 313c4aaffe..ea17194439 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt @@ -1,14 +1,10 @@ package com.tangem.tangemtest._main.entryPoint import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer -import androidx.navigation.NavController -import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -19,21 +15,19 @@ import com.tangem.tangemtest._main.MainViewModel import com.tangem.tangemtest.ucase.getDefaultNavigationOptions import com.tangem.tangemtest.ucase.resources.ActionType import com.tangem.tangemtest.ucase.resources.MainResourceHolder +import com.tangem.tangemtest.ucase.ui.BaseFragment import kotlinx.android.synthetic.main.fg_entry_point.* /** [REDACTED_AUTHOR] */ -class ActionListFragment : Fragment() { +class ActionListFragment : BaseFragment() { - private val navController: NavController by lazy { findNavController() } private lateinit var rvActions: RecyclerView private val mainActivityVM: MainViewModel by activityViewModels() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fg_entry_point, container, false) - } + override fun getLayoutId(): Int = R.layout.fg_entry_point override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -48,7 +42,9 @@ class ActionListFragment : Fragment() { val vhDataWrapper = VhExDataWrapper(MainResourceHolder, false) - rvActions.adapter = RvActionsAdapter(vhDataWrapper) { type, position, data -> navigate(data) } + rvActions.adapter = RvActionsAdapter(vhDataWrapper) { type, position, data -> + navigateTo(data, options = getDefaultNavigationOptions()) + } mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { vhDataWrapper.descriptionIsVisible = it TransitionManager.beginDelayedTransition(rvActions as ViewGroup, AutoTransition()) @@ -64,10 +60,6 @@ class ActionListFragment : Fragment() { adapter.notifyDataSetChanged() } - private fun navigate(destinationId: Int) { - navController.navigate(destinationId, null, getDefaultNavigationOptions()) - } - private fun getNavigateOptions(): MutableList { return mutableListOf( ActionType.Scan, diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt index b75c721424..990f2a78f4 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt @@ -24,12 +24,12 @@ class AfterScanModifier : AfterActionModification { return if (isNotPersonalized(card)) { actionView.showSnackbar(CardError.NotPersonalized) - postUI { actionView.showActionFab(false) } + postUI { actionView.enableActionFab(false) } listOf() } else { payload.set(PayloadKey.card, card) foundItem.setData(card.cardId) - postUI { actionView.showActionFab(true) } + postUI { actionView.enableActionFab(true) } listOf(foundItem) } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt index 2957d43a45..5f61c31c34 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt @@ -32,7 +32,7 @@ class SignScanConsequence: ItemsChangeConsequence { val card = payload.remove(PayloadKey.card) as Card? if (card == null) { hashItem.restoreDefaultData() - postUI { (payload.get(PayloadKey.actionView) as? ActionView)?.showActionFab(false) } + postUI { (payload.get(PayloadKey.actionView) as? ActionView)?.enableActionFab(false) } } else { val dataForHashing = hashItem.getData() as? String ?: "Any data mother...s" val hashedData = when(card.curve) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt index ec84ed97ba..a22a6b14ae 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt @@ -1,15 +1,16 @@ package com.tangem.tangemtest.ucase.tunnel +import com.google.android.material.snackbar.Snackbar import com.tangem.tangemtest._arch.structure.Id +interface SnackbarHolder { + fun showSnackbar(message: String, length: Int = Snackbar.LENGTH_SHORT) + fun showSnackbar(id: Int, length: Int = Snackbar.LENGTH_SHORT) +} + interface ViewScreen -interface SnackbarHolder { - fun showSnackbar(message: String) - fun showSnackbar(id: Int) - fun showSnackbar(id: Id) -} - interface ActionView : ViewScreen, SnackbarHolder { - fun showActionFab(show: Boolean) + fun enableActionFab(enable: Boolean) + fun showSnackbar(id: Id) } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt index d44d2c998d..6871b38bbb 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt @@ -5,14 +5,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import android.widget.TextView -import androidx.fragment.app.Fragment +import androidx.core.os.bundleOf import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import com.google.android.material.floatingactionbutton.FloatingActionButton -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 @@ -26,18 +23,18 @@ import com.tangem.tangemtest.ucase.resources.ActionType import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.ui.widgets.ParameterWidget +import ru.dev.gbixahue.eu4d.lib.android._android.views.enable import ru.dev.gbixahue.eu4d.lib.android.global.log.Log import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder /** [REDACTED_AUTHOR] */ -abstract class BaseCardActionFragment : Fragment(), LayoutHolder, ActionView { +abstract class BaseCardActionFragment : BaseFragment(), LayoutHolder, ActionView { protected val incomingParamsContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_incoming_params_container) } - protected lateinit var mainView: View protected val actionFab: FloatingActionButton by lazy { mainView.findViewById(R.id.fab_action) } protected val paramsVM: ParamsViewModel by viewModels { ActionViewModelFactory(itemsManager) } @@ -45,12 +42,6 @@ abstract class BaseCardActionFragment : Fragment(), LayoutHolder, ActionView { private val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(getAction())!! } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - Log.d(this, "onCreateView") - mainView = inflater.inflate(getLayoutId(), container, false) - return mainView - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) Log.d(this, "onViewCreated") @@ -59,18 +50,17 @@ abstract class BaseCardActionFragment : Fragment(), LayoutHolder, ActionView { paramsVM.setCardManager(CardManager.init(requireActivity())) paramsVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView)) initFab() - showActionFab(false) createWidgets { subscribeToViewModelChanges() } } private fun initFab() { - Log.d(this, "initFab") + enableActionFab(false) actionFab.setOnClickListener { paramsVM.invokeMainAction() } } private fun createWidgets(widgetCreatedCallback: () -> Unit) { Log.d(this, "createWidgets") - paramsVM.ldParams.observe(viewLifecycleOwner, Observer { itemList -> + paramsVM.ldItemList.observe(viewLifecycleOwner, Observer { itemList -> itemList.forEach { param -> val widget = ParameterWidget(inflateParamView(incomingParamsContainer), param) widget.onValueChanged = { id, value -> paramsVM.userChangedItem(id, value) } @@ -83,17 +73,19 @@ abstract class BaseCardActionFragment : Fragment(), LayoutHolder, ActionView { private fun subscribeToViewModelChanges() { Log.d(this, "subscribeToViewModelChanges") + listenReadResponse() listenResponse() listenError() listenChangedItems() listenDescriptionSwitchChanges() } + protected open fun listenReadResponse() {} + protected open fun listenResponse() { - val tvResponse by lazy { mainView.findViewById(R.id.tv_action_response_json) } - paramsVM.ldResponse.observe(viewLifecycleOwner, Observer { - Log.d(this, "action response: ${if (it.length > 50) it.substring(0..50) else it}") - tvResponse.text = it + paramsVM.seResponse.observe(viewLifecycleOwner, Observer { + navigateTo(R.id.action_nav_card_action_to_response_screen, + bundleOf(Pair(BaseCardResponseFragment.response, it))) }) } @@ -126,8 +118,8 @@ abstract class BaseCardActionFragment : Fragment(), LayoutHolder, ActionView { return view as ViewGroup } - override fun showActionFab(show: Boolean) { - if (show) actionFab.show() else actionFab.hide() + override fun enableActionFab(enable: Boolean) { + actionFab.enable(enable) } override fun showSnackbar(id: Id) { @@ -138,13 +130,5 @@ abstract class BaseCardActionFragment : Fragment(), LayoutHolder, ActionView { } } - override fun showSnackbar(id: Int) { - showSnackbar(requireContext().getString(id)) - } - - override fun showSnackbar(message: String) { - Snackbar.make(mainView, message, BaseTransientBottomBar.LENGTH_SHORT).show() - } - abstract fun getAction(): ActionType } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardResponseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardResponseFragment.kt new file mode 100644 index 0000000000..51d5e0866f --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardResponseFragment.kt @@ -0,0 +1,58 @@ +package com.tangem.tangemtest.ucase.ui + +import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer +import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.structure.abstraction.BaseItem +import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock +import com.tangem.tangemtest._arch.structure.abstraction.iterate +import com.tangem.tangemtest._arch.structure.impl.TextItem +import com.tangem.tangemtest._arch.widget.WidgetBuilder +import com.tangem.tangemtest._main.MainViewModel +import com.tangem.tangemtest.ucase.resources.StringId + +/** +[REDACTED_AUTHOR] + */ +class BaseCardResponseFragment : BaseFragment() { + + companion object Arg { + val response = "response" + } + + private val mainActivityVM: MainViewModel by activityViewModels() + private val blockContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_container) } + + override fun getLayoutId(): Int = R.layout.fg_card_response + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val response = requireArguments().getString(Arg.response) ?: return + if (response.isEmpty()) return + + val itemList = createItemList(response) + itemList.forEach { WidgetBuilder(ResponseItemBuilder()).build(it, blockContainer) } + + mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { + itemList.iterate { item -> + val baseItem = item as? BaseItem<*> ?: return@iterate + baseItem.viewModel.viewState.descriptionVisibility = if (it) View.VISIBLE else View.GONE + } + }) + + } + + protected open fun createItemList(response: String): List { + return listOf( + ListItemBlock(StringId("")).apply { + addItem(TextItem(StringId("resp.fieldName"), response)) + } + ) + } +} diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt new file mode 100644 index 0000000000..29dfeec6be --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt @@ -0,0 +1,38 @@ +package com.tangem.tangemtest.ucase.ui + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.navigation.NavOptions +import androidx.navigation.fragment.NavHostFragment.findNavController +import com.google.android.material.snackbar.Snackbar +import com.tangem.tangemtest.ucase.getDefaultNavigationOptions +import com.tangem.tangemtest.ucase.tunnel.SnackbarHolder +import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder + +/** +[REDACTED_AUTHOR] + */ +abstract class BaseFragment : Fragment(), LayoutHolder, SnackbarHolder { + + protected lateinit var mainView: View + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + mainView = inflater.inflate(getLayoutId(), container, false) + return mainView + } + + protected fun navigateTo(navigationId: Int, bundle: Bundle? = null, options: NavOptions? = getDefaultNavigationOptions()) { + findNavController(this).navigate(navigationId, bundle, options) + } + + override fun showSnackbar(id: Int, length: Int) { + showSnackbar(requireContext().getString(id), length) + } + + override fun showSnackbar(message: String, length: Int) { + Snackbar.make(mainView, message, length).show() + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt index 2df743786e..94b4d47a3f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt @@ -4,7 +4,6 @@ import androidx.annotation.UiThread import androidx.lifecycle.* import com.google.gson.Gson import com.tangem.CardManager -import com.tangem.commands.Card import com.tangem.tangemtest._arch.SingleLiveEvent import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.Payload @@ -27,12 +26,10 @@ class ActionViewModelFactory(private val manager: ItemsManager) : ViewModelProvi class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), LifecycleObserver { - val ldCard = MutableLiveData() - val ldIsVerified = MutableLiveData() - val ldResponse = MutableLiveData() - val ldReadResponse = MutableLiveData() - val ldParams = MutableLiveData(itemsManager.getItems()) + val seReadResponse = SingleLiveEvent() + val seResponse = SingleLiveEvent() + val ldItemList = MutableLiveData(itemsManager.getItems()) val seError: MutableLiveData = SingleLiveEvent() val seChangedItems: MutableLiveData> = SingleLiveEvent() @@ -109,13 +106,13 @@ internal class Notifier(private val vm: ParamsViewModel) { private fun handleDataEvent(event: Any?) { when (event) { is ScanEvent.OnReadEvent -> { - vm.ldCard.postValue(event.card) - vm.ldReadResponse.postValue(gson.toJson(event)) +// vm.ldCard.postValue(event.card) + vm.seReadResponse.postValue(gson.toJson(event)) } is ScanEvent.OnVerifyEvent -> { - vm.ldIsVerified.postValue(true) +// vm.ldIsVerified.postValue(true) } - else -> vm.ldResponse.postValue(gson.toJson(event)) + else -> vm.seResponse.postValue(gson.toJson(event)) } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ResponseItemBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ResponseItemBuilder.kt new file mode 100644 index 0000000000..dd80c57862 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ResponseItemBuilder.kt @@ -0,0 +1,20 @@ +package com.tangem.tangemtest.ucase.ui + +import android.view.ViewGroup +import com.tangem.tangemtest._arch.structure.abstraction.BaseItem +import com.tangem.tangemtest._arch.structure.impl.TextItem +import com.tangem.tangemtest._arch.widget.ItemWidgetBuilder +import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget +import com.tangem.tangemtest.ucase.ui.widgets.ResponseTextWidget + +/** +[REDACTED_AUTHOR] + */ +class ResponseItemBuilder : ItemWidgetBuilder { + override fun build(item: BaseItem<*>, parent: ViewGroup): ViewWidget? { + return when (item) { + is TextItem -> ResponseTextWidget(parent, item) + else -> null + } + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ResponseTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ResponseTextWidget.kt new file mode 100644 index 0000000000..fde72c3d54 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ResponseTextWidget.kt @@ -0,0 +1,34 @@ +package com.tangem.tangemtest.ucase.ui.widgets + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.view.ViewGroup +import android.widget.TextView +import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.structure.impl.TextItem +import com.tangem.tangemtest._arch.widget.abstraction.getResNameId +import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget + +/** +[REDACTED_AUTHOR] + */ +class ResponseTextWidget(parent: ViewGroup, textItem: TextItem) : DescriptionWidget(parent, textItem) { + override fun getLayoutId(): Int = R.layout.w_response_item + + private val tvName: TextView by lazy { view.findViewById(R.id.tv_name) } + private val tvValue: TextView by lazy { view.findViewById(R.id.tv_value) } + + init { + tvName.setText(getResNameId()) + tvValue.text = dataItem.getData() + + view.setOnClickListener { + val clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager + ?: return@setOnClickListener + + val clip: ClipData = ClipData.newPlainText("FieldValue", "${dataItem.getData()}") + clipboard.setPrimaryClip(clip) + } + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt index 3456d91ad2..d206e1f3d1 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt @@ -1,22 +1,20 @@ package com.tangem.tangemtest.ucase.variants.personalize.ui import android.os.Bundle -import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment +import androidx.core.os.bundleOf import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import com.google.android.material.floatingactionbutton.FloatingActionButton -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._arch.structure.Id import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest._arch.widget.WidgetBuilder import com.tangem.tangemtest._main.MainViewModel import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManagerFactory @@ -26,67 +24,89 @@ import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.tunnel.ItemError import com.tangem.tangemtest.ucase.ui.ActionViewModelFactory +import com.tangem.tangemtest.ucase.ui.BaseCardResponseFragment +import com.tangem.tangemtest.ucase.ui.BaseFragment import com.tangem.tangemtest.ucase.ui.ParamsViewModel import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.WidgetBuilder +import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.PersonalizeItemBuilder import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ -class PersonalizeFragment : Fragment(), ActionView { +class PersonalizeFragment : BaseFragment(), ActionView { private val mainActivityVM: MainViewModel by activityViewModels() private val personalizeVM: PersonalizeViewModel by viewModels { PersonalizeViewModelFactory(PersonalizeConfig()) } - - private val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(ActionType.Personalize)!! } private val paramsVM: ParamsViewModel by viewModels() { ActionViewModelFactory(itemsManager) } - private lateinit var mainView: View private val blockContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_container) } private val actionFab: FloatingActionButton by lazy { mainView.findViewById(R.id.fab_action) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - Log.d(this, "onCreateView") - mainView = inflater.inflate(R.layout.fg_personalize, container, false) - return mainView - } + private val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(ActionType.Personalize)!! } + + override fun getLayoutId(): Int = R.layout.fg_personalize override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + paramsVM.setCardManager(CardManager.init(requireActivity())) + paramsVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView)) + + initFab() + createWidgets { subscribeToViewModelChanges() } + } + + private fun initFab() { + enableActionFab(true) + actionFab.setOnClickListener { paramsVM.invokeMainAction() } + } + + private fun createWidgets(widgetCreatedCallback: () -> Unit) { val blockList = mutableListOf() personalizeVM.ldBlockList.observe(viewLifecycleOwner, Observer { list -> blockList.clear() blockList.addAll(list) - blockList.forEach { WidgetBuilder().build(it, blockContainer) } + blockList.forEach { WidgetBuilder(PersonalizeItemBuilder()).build(it, blockContainer) } paramsVM.attachToPayload(mutableMapOf( PayloadKey.actionView to this as ActionView, PayloadKey.itemList to blockList )) - + widgetCreatedCallback() }) + } + + override fun enableActionFab(enable: Boolean) { + if (enable) actionFab.show() else actionFab.hide() + } + + private fun subscribeToViewModelChanges() { + Log.d(this, "subscribeToViewModelChanges") + listenReadResponse() + listenResponse() + listenError() +// listenChangedItems() + listenDescriptionSwitchChanges() + } + + private fun listenReadResponse() {} + + private fun listenResponse() { + paramsVM.seResponse.observe(viewLifecycleOwner, Observer { + navigateTo(R.id.action_nav_card_action_to_response_screen, + bundleOf(Pair(BaseCardResponseFragment.response, it))) + }) + } + + private fun listenError() { + paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbar(it) }) + + } + + private fun listenDescriptionSwitchChanges() { mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { personalizeVM.toggleDescriptionVisibility(it) }) - - val cardManager = CardManager.init(requireActivity()) - paramsVM.setCardManager(cardManager) - 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) }) - - actionFab.setOnClickListener { paramsVM.invokeMainAction() } - } - - protected fun showSnackbarMessage(message: String) { - Snackbar.make(mainView, message, BaseTransientBottomBar.LENGTH_SHORT).show() - } - - override fun showActionFab(show: Boolean) { - if (show) actionFab.show() else actionFab.hide() } override fun showSnackbar(id: Id) { @@ -98,14 +118,6 @@ class PersonalizeFragment : Fragment(), ActionView { else -> showSnackbar(requireContext().getString(R.string.unknown)) } } - - override fun showSnackbar(id: Int) { - showSnackbar(requireContext().getString(id)) - } - - override fun showSnackbar(message: String) { - Snackbar.make(mainView, message, BaseTransientBottomBar.LENGTH_SHORT).show() - } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/TextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt similarity index 68% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/TextWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt index ae12a19231..2f2dde5d72 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/TextWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt @@ -1,15 +1,15 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item +package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets import android.view.ViewGroup import android.widget.TextView import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.TextItem -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId +import com.tangem.tangemtest._arch.widget.abstraction.getResNameId /** [REDACTED_AUTHOR] */ -class TextWidget(parent: ViewGroup, data: TextItem) : DescriptionWidget(parent, data) { +class BlockHeadWidget(parent: ViewGroup, data: TextItem) : DescriptionWidget(parent, data) { override fun getLayoutId(): Int = R.layout.w_personalize_item_text private val tvName = view.findViewById(R.id.tv_name) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/DescriptionWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt similarity index 87% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/DescriptionWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt index c50a5e91dd..70107becdb 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/DescriptionWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item +package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets import android.view.ViewGroup import android.widget.TextView @@ -6,8 +6,8 @@ import androidx.transition.AutoTransition import androidx.transition.TransitionManager import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.BaseWidget -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResDescription +import com.tangem.tangemtest._arch.widget.abstraction.BaseWidget +import com.tangem.tangemtest._arch.widget.abstraction.getResDescription import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/EditTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt similarity index 94% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/EditTextWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt index c4bff5cfab..791e80b048 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/EditTextWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item +package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets import android.text.Editable import android.text.TextWatcher @@ -7,7 +7,7 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.EditTextItem -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId +import com.tangem.tangemtest._arch.widget.abstraction.getResNameId import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/NumberWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt similarity index 95% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/NumberWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt index 794c4c1ea0..1b72f5f21d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/NumberWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item +package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets import android.text.Editable import android.text.InputFilter @@ -8,8 +8,8 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.NumberItem +import com.tangem.tangemtest._arch.widget.abstraction.getResNameId import com.tangem.tangemtest.ucase.variants.personalize.CardNumber -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId import ru.dev.gbixahue.eu4d.lib.android._android.views.addInputFilter import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizeItemBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizeItemBuilder.kt new file mode 100644 index 0000000000..30788d1e70 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizeItemBuilder.kt @@ -0,0 +1,23 @@ +package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets + +import android.view.ViewGroup +import com.tangem.tangemtest._arch.structure.abstraction.BaseItem +import com.tangem.tangemtest._arch.structure.impl.* +import com.tangem.tangemtest._arch.widget.ItemWidgetBuilder +import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget + +/** +[REDACTED_AUTHOR] + */ +class PersonalizeItemBuilder : ItemWidgetBuilder { + override fun build(item: BaseItem<*>, parent: ViewGroup): ViewWidget? { + return when (item) { + is TextItem -> BlockHeadWidget(parent, item) + is EditTextItem -> EditTextWidget(parent, item) + is NumberItem -> NumberWidget(parent, item) + is BoolItem -> SwitchWidget(parent, item) + is ListItem -> SpinnerWidget(parent, item) + else -> null + } + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SpinnerWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt similarity index 96% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SpinnerWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt index b6ec1d006c..8ea3d0f4ac 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SpinnerWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item +package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets import android.view.View import android.view.ViewGroup @@ -10,7 +10,7 @@ import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.KeyValue import com.tangem.tangemtest._arch.structure.impl.ListItem import com.tangem.tangemtest._arch.structure.impl.ListValueWrapper -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId +import com.tangem.tangemtest._arch.widget.abstraction.getResNameId import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SwitchWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt similarity index 91% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SwitchWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt index 3b7d85bed0..35a12ff069 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SwitchWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt @@ -1,11 +1,11 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item +package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets import android.view.ViewGroup import android.widget.CompoundButton import androidx.appcompat.widget.SwitchCompat import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.BoolItem -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId +import com.tangem.tangemtest._arch.widget.abstraction.getResNameId /** [REDACTED_AUTHOR] diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/WidgetBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/WidgetBuilder.kt deleted file mode 100644 index a9aa921bcf..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/WidgetBuilder.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets - -import android.view.ViewGroup -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest._arch.structure.abstraction.Block -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock -import com.tangem.tangemtest._arch.structure.impl.* -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.ViewWidget -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.StubWidget -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.block.LinearBlockWidget -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item.* - -/** -[REDACTED_AUTHOR] - */ -class WidgetBuilder { - - fun build(item: Item, parent: ViewGroup): ViewWidget? { - return when (item) { - is Block -> buildBlock(item, parent) - is BaseItem<*> -> buildUnitItem(item, parent) - else -> StubWidget(parent) - } - } - - private fun buildBlock(block: Block, parent: ViewGroup): ViewWidget { - return when (block) { - is ListItemBlock -> { - val linearBlock = LinearBlockWidget(parent, block) - block.getItems().forEach { build(it, linearBlock.view as ViewGroup) } - linearBlock - } - else -> StubWidget(parent) - } - } - - private fun buildUnitItem(item: BaseItem<*>, parent: ViewGroup): ViewWidget? { - return when (item) { - is TextItem -> TextWidget(parent, item) - is EditTextItem -> EditTextWidget(parent, item) - is NumberItem -> NumberWidget(parent, item) - is BoolItem -> SwitchWidget(parent, item) - is ListItem -> SpinnerWidget(parent, item) - else -> null - } - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/fg_card_response.xml b/tangem-demo/src/main/res/layout/fg_card_response.xml new file mode 100644 index 0000000000..f9aeaa5923 --- /dev/null +++ b/tangem-demo/src/main/res/layout/fg_card_response.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/w_response_item.xml b/tangem-demo/src/main/res/layout/w_response_item.xml new file mode 100644 index 0000000000..a18a8a24b7 --- /dev/null +++ b/tangem-demo/src/main/res/layout/w_response_item.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/navigation/navigation.xml b/tangem-demo/src/main/res/navigation/navigation.xml index 42db9c6d1c..68e2e1ca1c 100644 --- a/tangem-demo/src/main/res/navigation/navigation.xml +++ b/tangem-demo/src/main/res/navigation/navigation.xml @@ -4,6 +4,10 @@ xmlns:tools="http://schemas.android.com/tools" app:startDestination="@+id/nav_entry_point"> + + + + From 2111f460faad0e8d15af9ba4b762746be980e4ea Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 7 Apr 2020 16:14:00 +0300 Subject: [PATCH 02/19] Updated on 2026-08-14 --- .../variants/scan/ui/ScanActionFragment.kt | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt index ef5e6d8f01..11a16f5fb0 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt @@ -2,13 +2,12 @@ package com.tangem.tangemtest.ucase.variants.scan.ui import android.os.Bundle import android.view.View -import android.widget.TextView +import androidx.core.os.bundleOf import androidx.lifecycle.Observer import com.tangem.tangemtest.R import com.tangem.tangemtest.ucase.resources.ActionType import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment -import ru.dev.gbixahue.eu4d.lib.android._android.views.show -import ru.dev.gbixahue.eu4d.lib.android.global.log.Log +import com.tangem.tangemtest.ucase.ui.BaseCardResponseFragment /** [REDACTED_AUTHOR] @@ -21,17 +20,15 @@ class ScanActionFragment : BaseCardActionFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - - showActionFab(true) + enableActionFab(true) } - override fun listenResponse() { - val tvStub = mainView.findViewById(R.id.tv_screen_stub) - val tvResponse by lazy { mainView.findViewById(R.id.tv_action_response_json) } - paramsVM.ldReadResponse.observe(viewLifecycleOwner, Observer { - Log.d(this, "action response: ${if (it.length > 50) it.substring(0..50) else it}") - tvStub.show(false) - tvResponse.text = it + override fun listenReadResponse() { + paramsVM.seReadResponse.observe(viewLifecycleOwner, Observer { + navigateTo( + R.id.action_nav_card_action_to_response_screen, + bundleOf(Pair(BaseCardResponseFragment.response, it)) + ) }) } } \ No newline at end of file From 93117f441f9d37595e5e16ee5e9a10b3a40ad323 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 7 Apr 2020 17:43:43 +0300 Subject: [PATCH 03/19] Updated on 2026-08-14 --- .idea/codeStyles/codeStyleConfig.xml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .idea/codeStyles/codeStyleConfig.xml diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a179b..0000000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file From e7d4125588c0e2c23885dc1a70dc3b52b50751f2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 7 Apr 2020 21:14:44 +0300 Subject: [PATCH 04/19] Updated on 2026-08-14 --- .gitignore | 1 + .../_arch/structure/abstraction/Item.kt | 2 +- .../tangemtest/_arch/structure/impl/Items.kt | 2 +- .../ParamChangeConsequence.kt | 4 +- .../ucase/domain/responses/GsonInitializer.kt | 2 +- .../personalize/ui/PersonalizeFragment.kt | 38 +++++++++---------- .../variants/scan/ui/ScanActionFragment.kt | 2 +- .../src/main/res/layout/w_response_item.xml | 5 ++- .../src/main/res/navigation/navigation.xml | 2 +- 9 files changed, 29 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index ae9ed9c524..d741153000 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ local.properties .idea/caches/ .idea/libraries/ .idea/*.xml +.idea/codeStyles # OS-specific files .DS_Store diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt index 2cfbc69173..40a546b78b 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt @@ -25,7 +25,7 @@ abstract class BaseItem( viewModel.data = value } - fun restoreDefaultData(){ + fun restoreDefaultData() { setData(viewModel.defaultData) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt index 11ea5510c0..5e6d10bd37 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt @@ -16,4 +16,4 @@ class ListItem(override val id: Id, value: List, selectedValue: Any?) : BaseItem(ListViewModel(ListValueWrapper(selectedValue, value)) ) -inline fun BaseItem.getData(): T? = viewModel.data \ No newline at end of file +inline fun BaseItem.getData(): T? = viewModel.data \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt index 5f61c31c34..41bd4cd0a3 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt @@ -22,7 +22,7 @@ interface ItemsChangeConsequence { fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List): List? } -class SignScanConsequence: ItemsChangeConsequence { +class SignScanConsequence : ItemsChangeConsequence { override fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List): List? { if (changedItem.id != TlvId.CardId) return null @@ -35,7 +35,7 @@ class SignScanConsequence: ItemsChangeConsequence { postUI { (payload.get(PayloadKey.actionView) as? ActionView)?.enableActionFab(false) } } else { val dataForHashing = hashItem.getData() as? String ?: "Any data mother...s" - val hashedData = when(card.curve) { + val hashedData = when (card.curve) { EllipticCurve.Secp256k1 -> dataForHashing.calculateSha256() EllipticCurve.Ed25519 -> dataForHashing.calculateSha512() else -> return null diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt index 32c93a7ff8..4d6e2407d7 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt @@ -57,7 +57,7 @@ class SigningMethodTypeAdapter : JsonSerializer { } } -class DateTypeAdapter: JsonSerializer { +class DateTypeAdapter : JsonSerializer { override fun serialize(src: Date, typeOfSrc: Type, context: JsonSerializationContext): JsonElement { val formatter = DateFormat.getDateInstance(DateFormat.DEFAULT, Locale("en_US")) return JsonPrimitive(formatter.format(src).toString()) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt index d206e1f3d1..f6501e0187 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt @@ -3,8 +3,6 @@ package com.tangem.tangemtest.ucase.variants.personalize.ui import android.os.Bundle import android.view.View import android.view.ViewGroup -import android.widget.LinearLayout -import androidx.core.os.bundleOf import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Observer @@ -24,7 +22,6 @@ import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.tunnel.ItemError import com.tangem.tangemtest.ucase.ui.ActionViewModelFactory -import com.tangem.tangemtest.ucase.ui.BaseCardResponseFragment import com.tangem.tangemtest.ucase.ui.BaseFragment import com.tangem.tangemtest.ucase.ui.ParamsViewModel import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig @@ -36,19 +33,21 @@ import ru.dev.gbixahue.eu4d.lib.android.global.log.Log */ class PersonalizeFragment : BaseFragment(), ActionView { + private lateinit var itemContainer: ViewGroup + private lateinit var actionFab: FloatingActionButton + private val mainActivityVM: MainViewModel by activityViewModels() private val personalizeVM: PersonalizeViewModel by viewModels { PersonalizeViewModelFactory(PersonalizeConfig()) } private val paramsVM: ParamsViewModel by viewModels() { ActionViewModelFactory(itemsManager) } - private val blockContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_container) } - private val actionFab: FloatingActionButton by lazy { mainView.findViewById(R.id.fab_action) } - private val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(ActionType.Personalize)!! } override fun getLayoutId(): Int = R.layout.fg_personalize override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + itemContainer = mainView.findViewById(R.id.ll_container) + actionFab = mainView.findViewById(R.id.fab_action) paramsVM.setCardManager(CardManager.init(requireActivity())) paramsVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView)) @@ -58,16 +57,17 @@ class PersonalizeFragment : BaseFragment(), ActionView { } private fun initFab() { - enableActionFab(true) actionFab.setOnClickListener { paramsVM.invokeMainAction() } } private fun createWidgets(widgetCreatedCallback: () -> Unit) { + Log.d(this, "createWidgets") val blockList = mutableListOf() personalizeVM.ldBlockList.observe(viewLifecycleOwner, Observer { list -> + Log.d(this, "ldBlockList size: ${list.size}") blockList.clear() blockList.addAll(list) - blockList.forEach { WidgetBuilder(PersonalizeItemBuilder()).build(it, blockContainer) } + blockList.forEach { WidgetBuilder(PersonalizeItemBuilder()).build(it, itemContainer) } paramsVM.attachToPayload(mutableMapOf( PayloadKey.actionView to this as ActionView, PayloadKey.itemList to blockList @@ -76,25 +76,17 @@ class PersonalizeFragment : BaseFragment(), ActionView { }) } - override fun enableActionFab(enable: Boolean) { - if (enable) actionFab.show() else actionFab.hide() - } - private fun subscribeToViewModelChanges() { Log.d(this, "subscribeToViewModelChanges") - listenReadResponse() - listenResponse() + listenEvent() listenError() -// listenChangedItems() listenDescriptionSwitchChanges() } - private fun listenReadResponse() {} - - private fun listenResponse() { - paramsVM.seResponse.observe(viewLifecycleOwner, Observer { - navigateTo(R.id.action_nav_card_action_to_response_screen, - bundleOf(Pair(BaseCardResponseFragment.response, it))) + private fun listenEvent() { + paramsVM.seResponseEvent.observe(viewLifecycleOwner, Observer { + mainActivityVM.changeResponseEvent(it) + navigateTo(R.id.action_nav_card_action_to_response_screen) }) } @@ -109,6 +101,10 @@ class PersonalizeFragment : BaseFragment(), ActionView { }) } + override fun enableActionFab(enable: Boolean) { + if (enable) actionFab.show() else actionFab.hide() + } + override fun showSnackbar(id: Id) { // MainResourceHolder.safeGet<>() when (id) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt index 11a16f5fb0..ff1428465b 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.Observer import com.tangem.tangemtest.R import com.tangem.tangemtest.ucase.resources.ActionType import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment -import com.tangem.tangemtest.ucase.ui.BaseCardResponseFragment +import com.tangem.tangemtest.ucase.ui.response.BaseCardResponseFragment /** [REDACTED_AUTHOR] diff --git a/tangem-demo/src/main/res/layout/w_response_item.xml b/tangem-demo/src/main/res/layout/w_response_item.xml index a18a8a24b7..c44aa9cd78 100644 --- a/tangem-demo/src/main/res/layout/w_response_item.xml +++ b/tangem-demo/src/main/res/layout/w_response_item.xml @@ -4,7 +4,10 @@ android:id="@+id/root" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="@dimen/def_indent"> + android:paddingStart="@dimen/def_indent" + android:paddingTop="6dp" + android:paddingEnd="@dimen/def_indent" + android:paddingBottom="6dp"> From 6a69b80ae80e0c5e38ab958dc723cbf72fcea31c Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Apr 2020 00:07:11 +0300 Subject: [PATCH 05/19] Updated on 2026-08-14 --- .../managers/PersonalizeItemsManager.kt | 4 +- .../tangem/tangemtest/ucase/tunnel/Errors.kt | 4 +- .../ucase/ui/BaseCardActionFragment.kt | 46 ++++++----- .../ucase/ui/BaseCardResponseFragment.kt | 58 -------------- .../tangemtest/ucase/ui/BaseFragment.kt | 2 + .../tangemtest/ucase/ui/ParamsViewModel.kt | 22 ++++-- .../personalize/ui/PersonalizeFragment.kt | 78 ++++--------------- .../personalize/ui/PersonalizeViewModel.kt | 32 -------- .../main/res/layout/fg_action_card_scan.xml | 2 +- .../main/res/layout/fg_action_card_sign.xml | 2 +- .../src/main/res/layout/fg_depersonalize.xml | 2 +- 11 files changed, 68 insertions(+), 184 deletions(-) delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardResponseFragment.kt delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt index 7f40ac54f5..c8c0b07380 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt @@ -4,12 +4,14 @@ import com.tangem.CardManager import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback +import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig /** [REDACTED_AUTHOR] */ class PersonalizeItemsManager : BaseItemsManager(PersonalizeAction()) { - override fun createItemsList(): List = listOf() + override fun createItemsList(): List = PersonalizeConfigConverter().convert(PersonalizeConfig()) override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { action.executeMainAction(this, getAttrsForAction(cardManager), callback) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt index 7b7cb530f7..8ae2a5370a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt @@ -5,13 +5,13 @@ import com.tangem.tangemtest._arch.structure.Id /** [REDACTED_AUTHOR] */ -interface Errors: Id +interface Errors : Id enum class CardError : Errors { NotPersonalized, } -enum class ItemError: Errors { +enum class ItemError : Errors { BadSeries, BadCardNumber, } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt index 6871b38bbb..d5313ac34e 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt @@ -4,8 +4,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.LinearLayout -import androidx.core.os.bundleOf import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Observer @@ -32,15 +30,18 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder */ abstract class BaseCardActionFragment : BaseFragment(), LayoutHolder, ActionView { - protected val incomingParamsContainer: ViewGroup by lazy { - mainView.findViewById(R.id.ll_incoming_params_container) - } - protected val actionFab: FloatingActionButton by lazy { mainView.findViewById(R.id.fab_action) } + protected val itemContainer: ViewGroup + get() = mainView.findViewById(R.id.ll_container) + protected val actionFab: FloatingActionButton + get() = mainView.findViewById(R.id.fab_action) + + protected val mainActivityVM by activityViewModels() protected val paramsVM: ParamsViewModel by viewModels { ActionViewModelFactory(itemsManager) } - protected val widgetList = mutableListOf() - private val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(getAction())!! } + protected val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(getAction())!! } + + private val paramsWidgetList = mutableListOf() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -49,30 +50,32 @@ abstract class BaseCardActionFragment : BaseFragment(), LayoutHolder, ActionView viewLifecycleOwner.lifecycle.addObserver(paramsVM) paramsVM.setCardManager(CardManager.init(requireActivity())) paramsVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView)) + initFab() createWidgets { subscribeToViewModelChanges() } } - private fun initFab() { + protected open fun initFab() { enableActionFab(false) actionFab.setOnClickListener { paramsVM.invokeMainAction() } } - private fun createWidgets(widgetCreatedCallback: () -> Unit) { + protected open fun createWidgets(widgetCreatedCallback: () -> Unit) { Log.d(this, "createWidgets") paramsVM.ldItemList.observe(viewLifecycleOwner, Observer { itemList -> itemList.forEach { param -> - val widget = ParameterWidget(inflateParamView(incomingParamsContainer), param) + val widget = ParameterWidget(inflateParamView(itemContainer), param) widget.onValueChanged = { id, value -> paramsVM.userChangedItem(id, value) } widget.onActionBtnClickListener = paramsVM.getItemAction(param.id) - widgetList.add(widget) + paramsWidgetList.add(widget) } widgetCreatedCallback() }) } - private fun subscribeToViewModelChanges() { + protected open fun subscribeToViewModelChanges() { Log.d(this, "subscribeToViewModelChanges") + listenEvent() listenReadResponse() listenResponse() listenError() @@ -80,12 +83,17 @@ abstract class BaseCardActionFragment : BaseFragment(), LayoutHolder, ActionView listenDescriptionSwitchChanges() } + protected open fun listenEvent() { + paramsVM.seResponseEvent.observe(viewLifecycleOwner, Observer { + mainActivityVM.changeResponseEvent(it) + }) + } + protected open fun listenReadResponse() {} protected open fun listenResponse() { paramsVM.seResponse.observe(viewLifecycleOwner, Observer { - navigateTo(R.id.action_nav_card_action_to_response_screen, - bundleOf(Pair(BaseCardResponseFragment.response, it))) + navigateTo(R.id.action_nav_card_action_to_response_screen) }) } @@ -93,21 +101,21 @@ abstract class BaseCardActionFragment : BaseFragment(), LayoutHolder, ActionView paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbar(it) }) } + @Deprecated("Start to use itemViewModel") protected open fun listenChangedItems() { paramsVM.seChangedItems.observe(viewLifecycleOwner, Observer { itemList -> itemList.forEach { item -> Log.d(this, "item changed from VM - name: ${item.id}") val dataItem = item as? BaseItem ?: return@Observer Log.d(this, "item changed from VM - name: ${dataItem.id}, value:${dataItem.viewModel.data}") - widgetList.firstOrNull { it.id == item.id }?.changeParamValue(item.viewModel.data) + paramsWidgetList.firstOrNull { it.id == item.id }?.changeParamValue(item.viewModel.data) } }) } protected open fun listenDescriptionSwitchChanges() { - val mainActViewModel by activityViewModels() - mainActViewModel.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { isEnabled -> - widgetList.forEach { it.toggleDescriptionVisibility(isEnabled) } + mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { + paramsVM.toggleDescriptionVisibility(it) }) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardResponseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardResponseFragment.kt deleted file mode 100644 index 51d5e0866f..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardResponseFragment.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.tangem.tangemtest.ucase.ui - -import android.os.Bundle -import android.view.View -import android.view.ViewGroup -import android.widget.LinearLayout -import androidx.fragment.app.activityViewModels -import androidx.lifecycle.Observer -import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock -import com.tangem.tangemtest._arch.structure.abstraction.iterate -import com.tangem.tangemtest._arch.structure.impl.TextItem -import com.tangem.tangemtest._arch.widget.WidgetBuilder -import com.tangem.tangemtest._main.MainViewModel -import com.tangem.tangemtest.ucase.resources.StringId - -/** -[REDACTED_AUTHOR] - */ -class BaseCardResponseFragment : BaseFragment() { - - companion object Arg { - val response = "response" - } - - private val mainActivityVM: MainViewModel by activityViewModels() - private val blockContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_container) } - - override fun getLayoutId(): Int = R.layout.fg_card_response - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val response = requireArguments().getString(Arg.response) ?: return - if (response.isEmpty()) return - - val itemList = createItemList(response) - itemList.forEach { WidgetBuilder(ResponseItemBuilder()).build(it, blockContainer) } - - mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { - itemList.iterate { item -> - val baseItem = item as? BaseItem<*> ?: return@iterate - baseItem.viewModel.viewState.descriptionVisibility = if (it) View.VISIBLE else View.GONE - } - }) - - } - - protected open fun createItemList(response: String): List { - return listOf( - ListItemBlock(StringId("")).apply { - addItem(TextItem(StringId("resp.fieldName"), response)) - } - ) - } -} diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt index 29dfeec6be..a7fabc3df0 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt @@ -10,6 +10,7 @@ import androidx.navigation.fragment.NavHostFragment.findNavController import com.google.android.material.snackbar.Snackbar import com.tangem.tangemtest.ucase.getDefaultNavigationOptions import com.tangem.tangemtest.ucase.tunnel.SnackbarHolder +import ru.dev.gbixahue.eu4d.lib.android.global.log.Log import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder /** @@ -25,6 +26,7 @@ abstract class BaseFragment : Fragment(), LayoutHolder, SnackbarHolder { } protected fun navigateTo(navigationId: Int, bundle: Bundle? = null, options: NavOptions? = getDefaultNavigationOptions()) { + Log.d(this, "navigateTo id: $navigationId") findNavController(this).navigate(navigationId, bundle, options) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt index 94b4d47a3f..0c0dc21908 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt @@ -1,5 +1,6 @@ package com.tangem.tangemtest.ucase.ui +import android.view.View import androidx.annotation.UiThread import androidx.lifecycle.* import com.google.gson.Gson @@ -7,7 +8,9 @@ import com.tangem.CardManager import com.tangem.tangemtest._arch.SingleLiveEvent import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.Payload +import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest._arch.structure.abstraction.iterate import com.tangem.tangemtest.commons.performAction import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.responses.GsonInitializer @@ -26,6 +29,7 @@ class ActionViewModelFactory(private val manager: ItemsManager) : ViewModelProvi class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), LifecycleObserver { + val seResponseEvent = SingleLiveEvent>() val seReadResponse = SingleLiveEvent() val seResponse = SingleLiveEvent() @@ -67,6 +71,13 @@ class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif } } + fun toggleDescriptionVisibility(state: Boolean) { + ldItemList.value?.iterate { + val baseItem = it as? BaseItem<*> ?: return@iterate + baseItem.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE + } + } + fun attachToPayload(payload: Payload) { itemsManager.attachPayload(payload) } @@ -99,18 +110,17 @@ internal class Notifier(private val vm: ParamsViewModel) { when (taskEvent) { is TaskEvent.Completion -> handleCompletionEvent(taskEvent) - is TaskEvent.Event -> handleDataEvent(taskEvent.data) + is TaskEvent.Event -> { + handleDataEvent(taskEvent.data) + vm.seResponseEvent.postValue(taskEvent) + } } } private fun handleDataEvent(event: Any?) { when (event) { - is ScanEvent.OnReadEvent -> { -// vm.ldCard.postValue(event.card) - vm.seReadResponse.postValue(gson.toJson(event)) - } + is ScanEvent.OnReadEvent -> vm.seReadResponse.postValue(gson.toJson(event)) is ScanEvent.OnVerifyEvent -> { -// vm.ldIsVerified.postValue(true) } else -> vm.seResponse.postValue(gson.toJson(event)) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt index f6501e0187..7c0928b7bd 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt @@ -1,112 +1,62 @@ package com.tangem.tangemtest.ucase.variants.personalize.ui -import android.os.Bundle -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.activityViewModels -import androidx.fragment.app.viewModels import androidx.lifecycle.Observer -import com.google.android.material.floatingactionbutton.FloatingActionButton -import com.tangem.CardManager -import com.tangem.tangem_sdk_new.extensions.init import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest._arch.widget.WidgetBuilder -import com.tangem.tangemtest._main.MainViewModel -import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager -import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManagerFactory import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey import com.tangem.tangemtest.ucase.resources.ActionType import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.tunnel.ItemError -import com.tangem.tangemtest.ucase.ui.ActionViewModelFactory -import com.tangem.tangemtest.ucase.ui.BaseFragment -import com.tangem.tangemtest.ucase.ui.ParamsViewModel -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.PersonalizeItemBuilder import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ -class PersonalizeFragment : BaseFragment(), ActionView { - - private lateinit var itemContainer: ViewGroup - private lateinit var actionFab: FloatingActionButton - - private val mainActivityVM: MainViewModel by activityViewModels() - private val personalizeVM: PersonalizeViewModel by viewModels { PersonalizeViewModelFactory(PersonalizeConfig()) } - private val paramsVM: ParamsViewModel by viewModels() { ActionViewModelFactory(itemsManager) } - - private val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(ActionType.Personalize)!! } +class PersonalizeFragment : BaseCardActionFragment(), ActionView { override fun getLayoutId(): Int = R.layout.fg_personalize - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - itemContainer = mainView.findViewById(R.id.ll_container) - actionFab = mainView.findViewById(R.id.fab_action) - - paramsVM.setCardManager(CardManager.init(requireActivity())) - paramsVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView)) - - initFab() - createWidgets { subscribeToViewModelChanges() } - } - - private fun initFab() { + override fun initFab() { actionFab.setOnClickListener { paramsVM.invokeMainAction() } } - private fun createWidgets(widgetCreatedCallback: () -> Unit) { + override fun createWidgets(widgetCreatedCallback: () -> Unit) { Log.d(this, "createWidgets") - val blockList = mutableListOf() - personalizeVM.ldBlockList.observe(viewLifecycleOwner, Observer { list -> + val itemList = mutableListOf() + + paramsVM.ldItemList.observe(viewLifecycleOwner, Observer { list -> Log.d(this, "ldBlockList size: ${list.size}") - blockList.clear() - blockList.addAll(list) - blockList.forEach { WidgetBuilder(PersonalizeItemBuilder()).build(it, itemContainer) } + itemList.clear() + itemList.addAll(list) + itemList.forEach { WidgetBuilder(PersonalizeItemBuilder()).build(it, itemContainer) } paramsVM.attachToPayload(mutableMapOf( PayloadKey.actionView to this as ActionView, - PayloadKey.itemList to blockList + PayloadKey.itemList to itemList )) widgetCreatedCallback() }) } - private fun subscribeToViewModelChanges() { + override fun subscribeToViewModelChanges() { Log.d(this, "subscribeToViewModelChanges") listenEvent() listenError() listenDescriptionSwitchChanges() } - private fun listenEvent() { + override fun listenEvent() { paramsVM.seResponseEvent.observe(viewLifecycleOwner, Observer { mainActivityVM.changeResponseEvent(it) navigateTo(R.id.action_nav_card_action_to_response_screen) }) } - private fun listenError() { - paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbar(it) }) - - } - - private fun listenDescriptionSwitchChanges() { - mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { - personalizeVM.toggleDescriptionVisibility(it) - }) - } - - override fun enableActionFab(enable: Boolean) { - if (enable) actionFab.show() else actionFab.hide() - } - override fun showSnackbar(id: Id) { -// MainResourceHolder.safeGet<>() when (id) { CardError.NotPersonalized -> showSnackbar(R.string.card_error_not_personalized) ItemError.BadSeries -> showSnackbar(R.string.card_error_bad_series) @@ -114,6 +64,8 @@ class PersonalizeFragment : BaseFragment(), ActionView { else -> showSnackbar(requireContext().getString(R.string.unknown)) } } + + override fun getAction(): ActionType = ActionType.Personalize } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt deleted file mode 100644 index b2c7ec7fce..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.tangem.tangemtest.ucase.variants.personalize.ui - -import android.view.View -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.iterate -import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig - -/** -[REDACTED_AUTHOR] - */ -class PersonalizeViewModelFactory(private val config: PersonalizeConfig) : ViewModelProvider.NewInstanceFactory() { - override fun create(modelClass: Class): T = PersonalizeViewModel(config) as T -} - -class PersonalizeViewModel(private val config: PersonalizeConfig) : ViewModel() { - - val ldBlockList: MutableLiveData> by lazy { MutableLiveData(initBlockList()) } - - private fun initBlockList(): List = PersonalizeConfigConverter().convert(config) - - fun toggleDescriptionVisibility(state: Boolean) { - ldBlockList.value?.iterate { - val baseItem = it as? BaseItem<*> ?: return@iterate - baseItem.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE - } - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/fg_action_card_scan.xml b/tangem-demo/src/main/res/layout/fg_action_card_scan.xml index aa343731bc..8b2deca0e8 100644 --- a/tangem-demo/src/main/res/layout/fg_action_card_scan.xml +++ b/tangem-demo/src/main/res/layout/fg_action_card_scan.xml @@ -15,7 +15,7 @@ android:orientation="vertical"> diff --git a/tangem-demo/src/main/res/layout/fg_action_card_sign.xml b/tangem-demo/src/main/res/layout/fg_action_card_sign.xml index 45978494a3..8013659452 100644 --- a/tangem-demo/src/main/res/layout/fg_action_card_sign.xml +++ b/tangem-demo/src/main/res/layout/fg_action_card_sign.xml @@ -15,7 +15,7 @@ android:orientation="vertical"> diff --git a/tangem-demo/src/main/res/layout/fg_depersonalize.xml b/tangem-demo/src/main/res/layout/fg_depersonalize.xml index 45978494a3..8013659452 100644 --- a/tangem-demo/src/main/res/layout/fg_depersonalize.xml +++ b/tangem-demo/src/main/res/layout/fg_depersonalize.xml @@ -15,7 +15,7 @@ android:orientation="vertical"> From 1a1109d1d851eff2fc1cd400d272dca63dfa6a11 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Apr 2020 00:08:50 +0300 Subject: [PATCH 06/19] Updated on 2026-08-14 --- .../com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt | 3 +-- .../ucase/variants/personalize/ui/PersonalizeFragment.kt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt index d5313ac34e..eba8eec1d6 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt @@ -23,12 +23,11 @@ import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.ui.widgets.ParameterWidget import ru.dev.gbixahue.eu4d.lib.android._android.views.enable import ru.dev.gbixahue.eu4d.lib.android.global.log.Log -import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder /** [REDACTED_AUTHOR] */ -abstract class BaseCardActionFragment : BaseFragment(), LayoutHolder, ActionView { +abstract class BaseCardActionFragment : BaseFragment(), ActionView { protected val itemContainer: ViewGroup get() = mainView.findViewById(R.id.ll_container) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt index 7c0928b7bd..0a18a0989f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt @@ -17,7 +17,7 @@ import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ -class PersonalizeFragment : BaseCardActionFragment(), ActionView { +class PersonalizeFragment : BaseCardActionFragment() { override fun getLayoutId(): Int = R.layout.fg_personalize From e6426d92f40ab0e42e451575c3258367a7cc002d Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Apr 2020 00:50:00 +0300 Subject: [PATCH 07/19] Updated on 2026-08-14 --- .../tangem/tangemtest/_main/MainViewModel.kt | 10 ++++++ .../ucase/domain/paramsManager/Factory.kt | 12 +++++-- ...{ParamsViewModel.kt => ActionViewModel.kt} | 7 ++-- .../ucase/ui/BaseCardActionFragment.kt | 36 ++++++++++--------- .../personalize/ui/PersonalizeFragment.kt | 8 ++--- .../variants/scan/ui/ScanActionFragment.kt | 2 +- 6 files changed, 48 insertions(+), 27 deletions(-) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/{ParamsViewModel.kt => ActionViewModel.kt} (95%) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt index 17ce97d8f9..a7d2eef283 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt @@ -2,14 +2,24 @@ package com.tangem.tangemtest._main import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.tangem.tasks.TaskEvent +import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ class MainViewModel : ViewModel() { val ldDescriptionSwitch = MutableLiveData(false) + val ldResponseEvent = MutableLiveData>() fun switchToggled(state: Boolean) { ldDescriptionSwitch.postValue(state) } + + fun changeResponseEvent(event: TaskEvent<*>?) { + Log.d(this, "changeResponseEvent") + val reqEvent = event ?: return + + ldResponseEvent.value = reqEvent + } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt index 000e9a53c5..c71097292c 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt @@ -5,16 +5,22 @@ import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizeItem import com.tangem.tangemtest.ucase.domain.paramsManager.managers.ScanItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.managers.SignItemsManager import com.tangem.tangemtest.ucase.resources.ActionType +import ru.dev.gbixahue.eu4d.lib.android.global.log.Log import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder /** [REDACTED_AUTHOR] */ -class ParamsManagerFactory : BaseTypedHolder() { +class ItemManagersStore : BaseTypedHolder() { companion object { - fun createFactory(): ParamsManagerFactory { - return ParamsManagerFactory().apply { + val instance: ItemManagersStore + get() = createFactory() + + private fun createFactory(): ItemManagersStore { + Log.d(this, "New instance was created") + + return ItemManagersStore().apply { register(ActionType.Scan, ScanItemsManager()) register(ActionType.Sign, SignItemsManager()) register(ActionType.Personalize, PersonalizeItemsManager()) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt similarity index 95% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt index 0c0dc21908..8ffcb80328 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt @@ -24,10 +24,10 @@ import ru.dev.gbixahue.eu4d.lib.android.global.log.Log [REDACTED_AUTHOR] */ class ActionViewModelFactory(private val manager: ItemsManager) : ViewModelProvider.NewInstanceFactory() { - override fun create(modelClass: Class): T = ParamsViewModel(manager) as T + override fun create(modelClass: Class): T = ActionViewModel(manager) as T } -class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), LifecycleObserver { +class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), LifecycleObserver { val seResponseEvent = SingleLiveEvent>() val seReadResponse = SingleLiveEvent() @@ -44,6 +44,7 @@ class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif this.cardManager = cardManager } + @Deprecated("Events must be send directly from the Widget") fun userChangedItem(id: Id, value: Any?) { itemChanged(id, value) } @@ -90,7 +91,7 @@ class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif } } -internal class Notifier(private val vm: ParamsViewModel) { +internal class Notifier(private val vm: ActionViewModel) { private var notShowedError: TaskError? = null private val gson: Gson = GsonInitializer().gson diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt index eba8eec1d6..63e2c8be82 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.plusAssign import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Observer @@ -14,8 +15,8 @@ import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._main.MainViewModel +import com.tangem.tangemtest.ucase.domain.paramsManager.ItemManagersStore import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager -import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManagerFactory import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey import com.tangem.tangemtest.ucase.resources.ActionType import com.tangem.tangemtest.ucase.tunnel.ActionView @@ -36,9 +37,12 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { get() = mainView.findViewById(R.id.fab_action) protected val mainActivityVM by activityViewModels() - protected val paramsVM: ParamsViewModel by viewModels { ActionViewModelFactory(itemsManager) } + protected val actionVM: ActionViewModel by viewModels { ActionViewModelFactory(itemsManager) } - protected val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(getAction())!! } + protected val itemsManager: ItemsManager by lazy { + Log.d(this, "create ItemManager") + ItemManagersStore.instance.get(getAction())!! + } private val paramsWidgetList = mutableListOf() @@ -46,9 +50,9 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { super.onViewCreated(view, savedInstanceState) Log.d(this, "onViewCreated") - viewLifecycleOwner.lifecycle.addObserver(paramsVM) - paramsVM.setCardManager(CardManager.init(requireActivity())) - paramsVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView)) + viewLifecycleOwner.lifecycle.addObserver(actionVM) + actionVM.setCardManager(CardManager.init(requireActivity())) + actionVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView)) initFab() createWidgets { subscribeToViewModelChanges() } @@ -56,16 +60,16 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { protected open fun initFab() { enableActionFab(false) - actionFab.setOnClickListener { paramsVM.invokeMainAction() } + actionFab.setOnClickListener { actionVM.invokeMainAction() } } protected open fun createWidgets(widgetCreatedCallback: () -> Unit) { Log.d(this, "createWidgets") - paramsVM.ldItemList.observe(viewLifecycleOwner, Observer { itemList -> + actionVM.ldItemList.observe(viewLifecycleOwner, Observer { itemList -> itemList.forEach { param -> val widget = ParameterWidget(inflateParamView(itemContainer), param) - widget.onValueChanged = { id, value -> paramsVM.userChangedItem(id, value) } - widget.onActionBtnClickListener = paramsVM.getItemAction(param.id) + widget.onValueChanged = { id, value -> actionVM.userChangedItem(id, value) } + widget.onActionBtnClickListener = actionVM.getItemAction(param.id) paramsWidgetList.add(widget) } widgetCreatedCallback() @@ -83,7 +87,7 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { } protected open fun listenEvent() { - paramsVM.seResponseEvent.observe(viewLifecycleOwner, Observer { + actionVM.seResponseEvent.observe(viewLifecycleOwner, Observer { mainActivityVM.changeResponseEvent(it) }) } @@ -91,18 +95,18 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { protected open fun listenReadResponse() {} protected open fun listenResponse() { - paramsVM.seResponse.observe(viewLifecycleOwner, Observer { + actionVM.seResponse.observe(viewLifecycleOwner, Observer { navigateTo(R.id.action_nav_card_action_to_response_screen) }) } protected open fun listenError() { - paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbar(it) }) + actionVM.seError.observe(viewLifecycleOwner, Observer { showSnackbar(it) }) } @Deprecated("Start to use itemViewModel") protected open fun listenChangedItems() { - paramsVM.seChangedItems.observe(viewLifecycleOwner, Observer { itemList -> + actionVM.seChangedItems.observe(viewLifecycleOwner, Observer { itemList -> itemList.forEach { item -> Log.d(this, "item changed from VM - name: ${item.id}") val dataItem = item as? BaseItem ?: return@Observer @@ -114,14 +118,14 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { protected open fun listenDescriptionSwitchChanges() { mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { - paramsVM.toggleDescriptionVisibility(it) + actionVM.toggleDescriptionVisibility(it) }) } private fun inflateParamView(where: ViewGroup): ViewGroup { val inflater = LayoutInflater.from(where.context) val view = inflater.inflate(R.layout.w_card_incoming_param, where, false) - where.addView(view) + where.plusAssign(view) return view as ViewGroup } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt index 0a18a0989f..ebf8b92c2a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt @@ -22,19 +22,19 @@ class PersonalizeFragment : BaseCardActionFragment() { override fun getLayoutId(): Int = R.layout.fg_personalize override fun initFab() { - actionFab.setOnClickListener { paramsVM.invokeMainAction() } + actionFab.setOnClickListener { actionVM.invokeMainAction() } } override fun createWidgets(widgetCreatedCallback: () -> Unit) { Log.d(this, "createWidgets") val itemList = mutableListOf() - paramsVM.ldItemList.observe(viewLifecycleOwner, Observer { list -> + actionVM.ldItemList.observe(viewLifecycleOwner, Observer { list -> Log.d(this, "ldBlockList size: ${list.size}") itemList.clear() itemList.addAll(list) itemList.forEach { WidgetBuilder(PersonalizeItemBuilder()).build(it, itemContainer) } - paramsVM.attachToPayload(mutableMapOf( + actionVM.attachToPayload(mutableMapOf( PayloadKey.actionView to this as ActionView, PayloadKey.itemList to itemList )) @@ -50,7 +50,7 @@ class PersonalizeFragment : BaseCardActionFragment() { } override fun listenEvent() { - paramsVM.seResponseEvent.observe(viewLifecycleOwner, Observer { + actionVM.seResponseEvent.observe(viewLifecycleOwner, Observer { mainActivityVM.changeResponseEvent(it) navigateTo(R.id.action_nav_card_action_to_response_screen) }) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt index ff1428465b..c878382e63 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt @@ -24,7 +24,7 @@ class ScanActionFragment : BaseCardActionFragment() { } override fun listenReadResponse() { - paramsVM.seReadResponse.observe(viewLifecycleOwner, Observer { + actionVM.seReadResponse.observe(viewLifecycleOwner, Observer { navigateTo( R.id.action_nav_card_action_to_response_screen, bundleOf(Pair(BaseCardResponseFragment.response, it)) From 6ea0feb3ee5232ea30970ba7424ed2f1512d2004 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Apr 2020 02:45:50 +0300 Subject: [PATCH 08/19] Updated on 2026-08-14 --- .../converter/fromTo/ItemsToPersonalizeConfig.kt | 10 +++------- .../variants/personalize/ui/widgets/SpinnerWidget.kt | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt index 6b8083ce29..177ac87463 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt @@ -1,11 +1,7 @@ package com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest._arch.structure.abstraction.Block -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.ItemsToModel -import com.tangem.tangemtest._arch.structure.impl.KeyValue +import com.tangem.tangemtest._arch.structure.abstraction.* import com.tangem.tangemtest._arch.structure.impl.ListValueWrapper import com.tangem.tangemtest.ucase.variants.personalize.* import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigValuesHolder @@ -25,7 +21,7 @@ class ItemsToPersonalizeConfig : ItemsToModel { } private fun mapListItems(itemList: List) { - itemList.forEach { item -> mapItemToHolder(item) } + itemList.iterate { item -> mapItemToHolder(item) } } private fun mapItemToHolder(item: Item) { @@ -110,7 +106,7 @@ class ItemsToPersonalizeConfig : ItemsToModel { var typedValue = holder.get(id)?.get() typedValue = when (typedValue) { - is ListValueWrapper -> (typedValue.selectedItem as KeyValue).value as Type + is ListValueWrapper -> typedValue.selectedItem as Type else -> typedValue as? Type ?: null } return typedValue diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt index 8ea3d0f4ac..88736e6517 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt @@ -29,7 +29,7 @@ class SpinnerWidget(parent: ViewGroup, listItem: ListItem) : DescriptionWidget?) {} override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - data.selectedItem = data.itemList[position] + data.selectedItem = data.itemList[position].value dataItem.viewModel.updateDataByView(data) } } From 273f02f256704cf91286e6958e6129eb7284b75b Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Apr 2020 03:02:10 +0300 Subject: [PATCH 09/19] Updated on 2026-08-14 --- .../com/tangem/tangemtest/AppTangemDemo.kt | 6 +++ .../ucase/domain/paramsManager/Factory.kt | 31 ---------------- .../managers/BaseItemsManager.kt | 2 +- .../managers/PersonalizeItemsManager.kt | 30 ++++++++++++++- .../ucase/ui/BaseCardActionFragment.kt | 23 +++++------- .../ui/DepersonalizeActionFragment.kt | 8 ++-- .../personalize/ui/PersonalizeFragment.kt | 37 +++++++++++++++++-- .../variants/scan/ui/ScanActionFragment.kt | 7 ++-- .../variants/sign/ui/SignActionFragment.kt | 7 ++-- 9 files changed, 90 insertions(+), 61 deletions(-) delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt 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 c9fc162b6a..ab604ee506 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt @@ -1,6 +1,8 @@ package com.tangem.tangemtest import android.app.Application +import android.content.Context +import android.content.SharedPreferences import com.tangem.tangemtest._arch.structure.ILog import com.tangem.tangemtest._arch.structure.ItemLogger import com.tangem.tangemtest.commons.TangemLogger @@ -23,6 +25,10 @@ class AppTangemDemo : Application() { ILog.setLogger(ItemLogger()) } + fun sharedPreferences(name: String = "DevKitApp", mode: Int = Context.MODE_PRIVATE): SharedPreferences { + return getSharedPreferences(name, mode) + } + companion object { lateinit var appInstance: AppTangemDemo } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt deleted file mode 100644 index c71097292c..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.tangem.tangemtest.ucase.domain.paramsManager - -import com.tangem.tangemtest.ucase.domain.paramsManager.managers.DepersonalizeItemsManager -import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizeItemsManager -import com.tangem.tangemtest.ucase.domain.paramsManager.managers.ScanItemsManager -import com.tangem.tangemtest.ucase.domain.paramsManager.managers.SignItemsManager -import com.tangem.tangemtest.ucase.resources.ActionType -import ru.dev.gbixahue.eu4d.lib.android.global.log.Log -import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder - -/** -[REDACTED_AUTHOR] - */ -class ItemManagersStore : BaseTypedHolder() { - - companion object { - val instance: ItemManagersStore - get() = createFactory() - - private fun createFactory(): ItemManagersStore { - Log.d(this, "New instance was created") - - return ItemManagersStore().apply { - register(ActionType.Scan, ScanItemsManager()) - register(ActionType.Sign, SignItemsManager()) - register(ActionType.Personalize, PersonalizeItemsManager()) - register(ActionType.Depersonalize, DepersonalizeItemsManager()) - } - } - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt index c9016165ac..03ccaf4728 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt @@ -31,7 +31,7 @@ abstract class BaseItemsManager(protected val action: Action) : ItemsManager { applyChangesByAffectedItems(foundItem, callback) } - override fun getItems(): MutableList = itemList.toMutableList() + override fun getItems(): List = itemList override fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? = null diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt index c8c0b07380..c0381252bb 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt @@ -1,19 +1,45 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.managers +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.OnLifecycleEvent import com.tangem.CardManager import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ -class PersonalizeItemsManager : BaseItemsManager(PersonalizeAction()) { - override fun createItemsList(): List = PersonalizeConfigConverter().convert(PersonalizeConfig()) +class PersonalizeItemsManager( + private val store: Store +) : BaseItemsManager(PersonalizeAction()), LifecycleObserver { + + init { + Log.d(this, "new instance created") + } + private val converter = PersonalizeConfigConverter() + + override fun createItemsList(): List { + val config = store.restore() + return converter.convert(config) + } override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { action.executeMainAction(this, getAttrsForAction(cardManager), callback) } + + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + fun onDestroy() { + val config = converter.convert(itemList, PersonalizeConfig()) + store.save(config) + } +} + +interface Store { + fun save(config: M) + fun restore(): M } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt index 63e2c8be82..67242ae326 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt @@ -15,10 +15,8 @@ import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._main.MainViewModel -import com.tangem.tangemtest.ucase.domain.paramsManager.ItemManagersStore import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey -import com.tangem.tangemtest.ucase.resources.ActionType import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.ui.widgets.ParameterWidget @@ -30,26 +28,20 @@ import ru.dev.gbixahue.eu4d.lib.android.global.log.Log */ abstract class BaseCardActionFragment : BaseFragment(), ActionView { - protected val itemContainer: ViewGroup - get() = mainView.findViewById(R.id.ll_container) - - protected val actionFab: FloatingActionButton - get() = mainView.findViewById(R.id.fab_action) + protected lateinit var itemContainer: ViewGroup + protected lateinit var actionFab: FloatingActionButton + protected abstract val itemsManager: ItemsManager protected val mainActivityVM by activityViewModels() protected val actionVM: ActionViewModel by viewModels { ActionViewModelFactory(itemsManager) } - protected val itemsManager: ItemsManager by lazy { - Log.d(this, "create ItemManager") - ItemManagersStore.instance.get(getAction())!! - } - private val paramsWidgetList = mutableListOf() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) Log.d(this, "onViewCreated") + bindViews() viewLifecycleOwner.lifecycle.addObserver(actionVM) actionVM.setCardManager(CardManager.init(requireActivity())) actionVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView)) @@ -58,6 +50,11 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { createWidgets { subscribeToViewModelChanges() } } + protected open fun bindViews() { + itemContainer = mainView.findViewById(R.id.ll_container) + actionFab = mainView.findViewById(R.id.fab_action) + } + protected open fun initFab() { enableActionFab(false) actionFab.setOnClickListener { actionVM.invokeMainAction() } @@ -140,6 +137,4 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { else -> showSnackbar(requireContext().getString(R.string.unknown)) } } - - abstract fun getAction(): ActionType } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt index 6567e465b1..e2ae9cdbdd 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt @@ -1,7 +1,8 @@ package com.tangem.tangemtest.ucase.variants.depersonalize.ui import com.tangem.tangemtest.R -import com.tangem.tangemtest.ucase.resources.ActionType +import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager +import com.tangem.tangemtest.ucase.domain.paramsManager.managers.DepersonalizeItemsManager import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment /** @@ -9,8 +10,7 @@ import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment */ class DepersonalizeActionFragment : BaseCardActionFragment() { + override val itemsManager: ItemsManager by lazy { DepersonalizeItemsManager() } + 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/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt index ebf8b92c2a..788d196392 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt @@ -1,16 +1,26 @@ package com.tangem.tangemtest.ucase.variants.personalize.ui +import android.content.Context +import android.content.SharedPreferences +import android.os.Bundle +import android.view.View +import androidx.core.content.edit import androidx.lifecycle.Observer +import com.google.gson.Gson +import com.tangem.tangemtest.AppTangemDemo import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest._arch.widget.WidgetBuilder +import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey -import com.tangem.tangemtest.ucase.resources.ActionType +import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizeItemsManager +import com.tangem.tangemtest.ucase.domain.paramsManager.managers.Store import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.tunnel.ItemError import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.PersonalizeItemBuilder import ru.dev.gbixahue.eu4d.lib.android.global.log.Log @@ -19,8 +29,15 @@ import ru.dev.gbixahue.eu4d.lib.android.global.log.Log */ class PersonalizeFragment : BaseCardActionFragment() { + override val itemsManager: ItemsManager by lazy { PersonalizeItemsManager(PersonalizationConfigStore(requireContext())) } + override fun getLayoutId(): Int = R.layout.fg_personalize + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + lifecycle.addObserver(itemsManager as PersonalizeItemsManager) + } + override fun initFab() { actionFab.setOnClickListener { actionVM.invokeMainAction() } } @@ -64,8 +81,23 @@ class PersonalizeFragment : BaseCardActionFragment() { else -> showSnackbar(requireContext().getString(R.string.unknown)) } } +} - override fun getAction(): ActionType = ActionType.Personalize +class PersonalizationConfigStore(context: Context) : Store { + + private val key = "personalization_config" + + private val sp: SharedPreferences = (context.applicationContext as AppTangemDemo).sharedPreferences() + private val gson: Gson = Gson() + + override fun save(config: PersonalizeConfig) { + sp.edit(true) { putString(key, gson.toJson(config)) } + } + + override fun restore(): PersonalizeConfig { + val json = sp.getString(key, gson.toJson(PersonalizeConfig())) + return gson.fromJson(json, PersonalizeConfig::class.java) + } } @@ -73,4 +105,3 @@ class PersonalizeFragment : BaseCardActionFragment() { - diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt index c878382e63..1edc4c72de 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt @@ -5,7 +5,8 @@ import android.view.View import androidx.core.os.bundleOf import androidx.lifecycle.Observer import com.tangem.tangemtest.R -import com.tangem.tangemtest.ucase.resources.ActionType +import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager +import com.tangem.tangemtest.ucase.domain.paramsManager.managers.ScanItemsManager import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment import com.tangem.tangemtest.ucase.ui.response.BaseCardResponseFragment @@ -14,9 +15,9 @@ import com.tangem.tangemtest.ucase.ui.response.BaseCardResponseFragment */ class ScanActionFragment : BaseCardActionFragment() { - override fun getLayoutId(): Int = R.layout.fg_action_card_scan + override val itemsManager: ItemsManager by lazy { ScanItemsManager() } - override fun getAction(): ActionType = ActionType.Scan + override fun getLayoutId(): Int = R.layout.fg_action_card_scan override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt index 9ce99ee075..1699672834 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt @@ -1,7 +1,8 @@ package com.tangem.tangemtest.ucase.variants.sign.ui import com.tangem.tangemtest.R -import com.tangem.tangemtest.ucase.resources.ActionType +import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager +import com.tangem.tangemtest.ucase.domain.paramsManager.managers.SignItemsManager import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment /** @@ -9,7 +10,7 @@ import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment */ class SignActionFragment : BaseCardActionFragment() { - override fun getLayoutId(): Int = R.layout.fg_action_card_sign + override val itemsManager: ItemsManager by lazy { SignItemsManager() } - override fun getAction(): ActionType = ActionType.Sign + override fun getLayoutId(): Int = R.layout.fg_action_card_sign } \ No newline at end of file From f9b627bd62c273b04d336b3b7a1f6173f2c7bdf3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Apr 2020 20:58:06 +0300 Subject: [PATCH 10/19] Updated on 2026-08-14 --- .idea/codeStyles/Project.xml | 116 ----------------------------------- 1 file changed, 116 deletions(-) delete mode 100644 .idea/codeStyles/Project.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 681f41ae2a..0000000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - -
- - - - xmlns:android - - ^$ - - - -
-
- - - - xmlns:.* - - ^$ - - - BY_NAME - -
-
- - - - .*:id - - http://schemas.android.com/apk/res/android - - - -
-
- - - - .*:name - - http://schemas.android.com/apk/res/android - - - -
-
- - - - name - - ^$ - - - -
-
- - - - style - - ^$ - - - -
-
- - - - .* - - ^$ - - - BY_NAME - -
-
- - - - .* - - http://schemas.android.com/apk/res/android - - - ANDROID_ATTRIBUTE_ORDER - -
-
- - - - .* - - .* - - - BY_NAME - -
-
-
-
-
-
\ No newline at end of file From 6e762cc7fffc5b42e999059792bc6072d62fe0d6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Apr 2020 23:04:48 +0300 Subject: [PATCH 11/19] Updated on 2026-08-14 --- .../tangem/tangemtest/_arch/structure/Ids.kt | 2 + .../_arch/widget/abstraction/ViewWidget.kt | 7 + .../ucase/resources/MainResourceHolder.kt | 4 +- .../initializers/ResponseResources.kt | 53 +++++++ .../personalize/ui/widgets/BlockHeadWidget.kt | 4 +- .../ui/widgets/DescriptionWidget.kt | 15 +- .../personalize/ui/widgets/EditTextWidget.kt | 6 +- .../personalize/ui/widgets/NumberWidget.kt | 6 +- .../personalize/ui/widgets/SpinnerWidget.kt | 4 +- .../personalize/ui/widgets/SwitchWidget.kt | 6 +- .../ucase/variants/responses/Ids.kt | 44 ++++++ .../variants/responses/ResponseViewModel.kt | 41 ++++++ .../responses/converter/CardConverter.kt | 85 +++++++++++ .../responses/converter/ConvertersStore.kt | 17 +++ .../responses/converter/SimpleConverters.kt | 35 +++++ .../variants/responses/ui/ResponseFragment.kt | 56 +++++++ .../responses/ui/widget/CheckBoxWidget.kt | 25 ++++ .../ui/widget}/ResponseItemBuilder.kt | 5 +- .../ui/widget}/ResponseTextWidget.kt | 25 +++- .../variants/scan/ui/ScanActionFragment.kt | 4 +- .../src/main/res/layout/fg_card_response.xml | 8 +- .../src/main/res/layout/w_response_item.xml | 24 ++- .../res/layout/w_response_item_checkbox.xml | 41 ++++++ .../src/main/res/navigation/navigation.xml | 2 +- tangem-demo/src/main/res/values/colors.xml | 5 +- tangem-demo/src/main/res/values/strings.xml | 2 +- .../src/main/res/values/strings_response.xml | 138 ++++++++++++++++++ 27 files changed, 611 insertions(+), 53 deletions(-) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/Ids.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/{ui => variants/responses/ui/widget}/ResponseItemBuilder.kt (75%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/{ui/widgets => variants/responses/ui/widget}/ResponseTextWidget.kt (53%) create mode 100644 tangem-demo/src/main/res/layout/w_response_item_checkbox.xml create mode 100644 tangem-demo/src/main/res/values/strings_response.xml diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt index 3b40edcc77..ce27853356 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt @@ -5,6 +5,8 @@ package com.tangem.tangemtest._arch.structure */ interface Id +class StringId(val name: String) : Id + enum class Additional : Id { UNDEFINED, JSON_INCOMING, diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt index b3ca53c3a0..7fa8fd5bbb 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt @@ -5,10 +5,12 @@ import android.view.View import android.view.ViewGroup import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.DataHolder +import com.tangem.tangemtest._arch.structure.StringId import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel import com.tangem.tangemtest.ucase.resources.MainResourceHolder import com.tangem.tangemtest.ucase.resources.Resources +import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder /** @@ -46,6 +48,11 @@ fun DataWidget<*>.getResNameId(): Int = MainResourceHolder.safeGet(da fun DataWidget<*>.getResDescription(): Int? = MainResourceHolder.safeGet(dataItem.id).resDescription +fun DataWidget<*>.getName(): String { + val id = dataItem.id + return if (id is StringId) id.name else view.stringFrom(getResNameId()) +} + internal fun inflate(id: Int, parent: ViewGroup): View { val layoutId = if (id <= 0) R.layout.w_empty else id val inflatedView = LayoutInflater.from(parent.context).inflate(layoutId, parent, false) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt index 90b908b742..44028d9018 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt @@ -4,6 +4,7 @@ import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest.ucase.resources.initializers.ActionResources import com.tangem.tangemtest.ucase.resources.initializers.PersonalizeResources +import com.tangem.tangemtest.ucase.resources.initializers.ResponseResources import com.tangem.tangemtest.ucase.resources.initializers.TlvResources import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder @@ -17,10 +18,11 @@ object MainResourceHolder : ResourceHolder() { PersonalizeResources().init(this) ActionResources().init(this) TlvResources().init(this) + ResponseResources().init(this) } inline fun safeGet(id: Id): Res { val result = super.get(id) ?: Resources(R.string.unknown, R.string.unknown) return result as Res } -} +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt new file mode 100644 index 0000000000..a9ad0a3d69 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt @@ -0,0 +1,53 @@ +package com.tangem.tangemtest.ucase.resources.initializers + +import com.tangem.tangemtest.R +import com.tangem.tangemtest.ucase.resources.MainResourceHolder +import com.tangem.tangemtest.ucase.resources.Resources +import com.tangem.tangemtest.ucase.variants.responses.CardDataId +import com.tangem.tangemtest.ucase.variants.responses.CardId + +/** +[REDACTED_AUTHOR] + */ +class ResponseResources { + fun init(holder: MainResourceHolder) { + initCard(holder) + initCardData(holder) + } + + private fun initCard(holder: MainResourceHolder) { + holder.register(CardId.cardId, Resources(R.string.response_card_cid, R.string.info_response_card_cid)) + holder.register(CardId.manufacturerName, Resources(R.string.response_card_manufacturer_name, R.string.info_response_card_manufacturer_name)) + holder.register(CardId.status, Resources(R.string.response_card_status, R.string.info_response_card_status)) + holder.register(CardId.firmwareVersion, Resources(R.string.response_card_firmware_version, R.string.info_response_card_firmware_version)) + holder.register(CardId.cardPublicKey, Resources(R.string.response_card_public_key, R.string.info_response_card_public_key)) + holder.register(CardId.settingsMask, Resources(R.string.response_card_settings_mask, R.string.info_response_card_settings_mask)) + holder.register(CardId.cardData, Resources(R.string.response_card_card_data, R.string.info_response_card_card_data)) + holder.register(CardId.issuerPublicKey, Resources(R.string.response_card_issuer_data_public_key, R.string.info_response_card_issuer_data_public_key)) + holder.register(CardId.curve, Resources(R.string.response_card_curve, R.string.info_response_card_curve)) + holder.register(CardId.maxSignatures, Resources(R.string.response_card_max_signatures, R.string.info_response_card_max_signatures)) + holder.register(CardId.signingMethod, Resources(R.string.response_card_signing_method, R.string.response_card_signing_method)) + holder.register(CardId.pauseBeforePin2, Resources(R.string.response_card_pause_before_pin2, R.string.info_response_card_allow_pin2)) + holder.register(CardId.walletPublicKey, Resources(R.string.response_card_wallet_public_key, R.string.info_response_card_wallet_public_key)) + holder.register(CardId.walletRemainingSignatures, Resources(R.string.response_card_wallet_remaining_signatures, R.string.info_response_card_wallet_remaining_signatures)) + holder.register(CardId.walletSignedHashes, Resources(R.string.response_card_wallet_signed_hashes, R.string.info_response_card_wallet_signed_hashes)) + holder.register(CardId.health, Resources(R.string.response_card_health, R.string.info_response_card_health)) + holder.register(CardId.isActivated, Resources(R.string.response_card_is_activated, R.string.info_response_card_is_activated)) + holder.register(CardId.activationSeed, Resources(R.string.response_card_activation_seed, R.string.info_response_card_activation_seed)) + holder.register(CardId.paymentFlowVersion, Resources(R.string.response_card_payment_flow_version, R.string.info_response_card_payment_flow_version)) + holder.register(CardId.userCounter, Resources(R.string.response_card_user_counter, R.string.info_response_card_user_counter)) + holder.register(CardId.userProtectedCounter, Resources(R.string.response_card_user_protected_counter, R.string.info_response_card_user_protected_counter)) + } + + private fun initCardData(holder: MainResourceHolder) { + holder.register(CardDataId.batchId, Resources(R.string.response_card_card_data_batch_id, R.string.info_response_card_card_data_batch_id)) + holder.register(CardDataId.manufactureDateTime, Resources(R.string.response_card_card_data_manufacture_date_time, R.string.info_response_card_card_data_manufacture_date_time)) + holder.register(CardDataId.issuerName, Resources(R.string.response_card_card_data_issuer_name, R.string.info_response_card_card_data_issuer_name)) + holder.register(CardDataId.blockchainName, Resources(R.string.response_card_card_data_blockchain_name, R.string.info_response_card_card_data_blockchain_name)) + holder.register(CardDataId.manufacturerSignature, Resources(R.string.response_card_card_data_manufacturer_signature, R.string.info_response_card_card_data_manufacturer_signature)) + holder.register(CardDataId.productMask, Resources(R.string.response_card_card_data_product_mask, R.string.info_response_card_card_data_product_mask)) + holder.register(CardDataId.tokenSymbol, Resources(R.string.response_card_card_data_token_symbol, R.string.info_response_card_card_data_token_symbol)) + holder.register(CardDataId.tokenContractAddress, Resources(R.string.response_card_card_data_token_contract_address, R.string.info_response_card_card_data_token_contract_address)) + holder.register(CardDataId.tokenDecimal, Resources(R.string.response_card_card_data_token_decimal, R.string.info_response_card_card_data_token_decimal)) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt index 2f2dde5d72..4b0837723b 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt @@ -4,7 +4,7 @@ import android.view.ViewGroup import android.widget.TextView import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.TextItem -import com.tangem.tangemtest._arch.widget.abstraction.getResNameId +import com.tangem.tangemtest._arch.widget.abstraction.getName /** [REDACTED_AUTHOR] @@ -15,6 +15,6 @@ class BlockHeadWidget(parent: ViewGroup, data: TextItem) : DescriptionWidget(R.id.tv_name) init { - tvName?.setText(getResNameId()) + tvName.text = getName() } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt index 70107becdb..9dfff32c48 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt @@ -30,7 +30,7 @@ abstract class DescriptionWidget( dataItem.viewModel.viewState.onDescriptionVisibilityChanged = { changeDescriptionVisibility(it) } } - protected fun changeDescriptionVisibility(state: Int) { + protected open fun changeDescriptionVisibility(state: Int) { val tv = tvDescription ?: return val descriptionId = getResDescription() ?: return val description = tv.context.getString(descriptionId) @@ -40,15 +40,4 @@ abstract class DescriptionWidget( TransitionManager.beginDelayedTransition(view.parent as ViewGroup, AutoTransition()) descriptionContainer.visibility = state } -} - - - - - - - - - - - +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt index 791e80b048..9cb1061414 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt @@ -7,7 +7,7 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.EditTextItem -import com.tangem.tangemtest._arch.widget.abstraction.getResNameId +import com.tangem.tangemtest._arch.widget.abstraction.getName import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf @@ -30,8 +30,8 @@ class EditTextWidget(parent: ViewGroup, data: EditTextItem) : DescriptionWidget< } init { - tilItem.hint = tilItem.context.getString(getResNameId()) - etItem.setText(dataItem.viewModel.data) + tilItem.hint = getName() + etItem.setText(dataItem.getData()) etItem.addTextChangedListener(watcher) dataItem.viewModel.onDataUpdated = { silentUpdate(it) } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt index 1b72f5f21d..e2702465a4 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt @@ -8,7 +8,7 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.NumberItem -import com.tangem.tangemtest._arch.widget.abstraction.getResNameId +import com.tangem.tangemtest._arch.widget.abstraction.getName import com.tangem.tangemtest.ucase.variants.personalize.CardNumber import ru.dev.gbixahue.eu4d.lib.android._android.views.addInputFilter import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd @@ -33,12 +33,12 @@ class NumberWidget(parent: ViewGroup, data: NumberItem) : DescriptionWidget(R.id.tv_name) - name.setText(getResNameId()) + name.text = getName() spItem.adapter = spAdapter spAdapter.getItemPosition(stringOf(data.selectedItem))?.let { spItem.setSelection(it) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt index 35a12ff069..015ea477b2 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt @@ -5,7 +5,7 @@ import android.widget.CompoundButton import androidx.appcompat.widget.SwitchCompat import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.BoolItem -import com.tangem.tangemtest._arch.widget.abstraction.getResNameId +import com.tangem.tangemtest._arch.widget.abstraction.getName /** [REDACTED_AUTHOR] @@ -20,8 +20,8 @@ class SwitchWidget(parent: ViewGroup, data: BoolItem) : DescriptionWidget? = null + + fun createItemList(taskEvent: TaskEvent<*>): List { + Log.d(this, "createItemList: itemList size: ${itemList?.size ?: 0}") + + val event = taskEvent as? TaskEvent.Event ?: return emptyList() + val type = event.data::class.java + val converter = convertersHolder.get(type) as? ModelToItems ?: return emptyList() + itemList = converter.convert(event.data) + return itemList!! + } + + fun toggleDescriptionVisibility(state: Boolean) { + itemList?.iterate { + val baseItem = it as? BaseItem<*> ?: return@iterate + baseItem.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE + } + } +} + + + + diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt new file mode 100644 index 0000000000..492989ebe1 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt @@ -0,0 +1,85 @@ +package com.tangem.tangemtest.ucase.variants.responses.converter + +import com.tangem.commands.Card +import com.tangem.commands.Settings +import com.tangem.commands.SettingsMask +import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.StringId +import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock +import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems +import com.tangem.tangemtest._arch.structure.impl.BoolItem +import com.tangem.tangemtest._arch.structure.impl.TextItem +import com.tangem.tangemtest.ucase.variants.personalize.BlockId +import com.tangem.tangemtest.ucase.variants.responses.CardDataId +import com.tangem.tangemtest.ucase.variants.responses.CardId +import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf + +/** +[REDACTED_AUTHOR] + */ +class CardConverter : ModelToItems { + override fun convert(from: Card): List { + val itemList = mutableListOf() +// val holder = GsonInitializer() +// itemList.add(TextItem(Additional.JSON_INCOMING, holder.gson.toJson(from))) + + itemList.add(simpleFields(from)) + itemList.add(cardData(from)) + itemList.add(settingsMask(from.settingsMask)) + return itemList + } + + private fun simpleFields(from: Card): Item { + val block = createBlock(BlockId.Common) + block.addItem(TextItem(CardId.cardId, from.cardId)) + block.addItem(TextItem(CardId.manufacturerName, from.manufacturerName)) + block.addItem(TextItem(CardId.status, stringOf(from.status))) + block.addItem(TextItem(CardId.firmwareVersion, from.firmwareVersion)) + block.addItem(TextItem(CardId.cardPublicKey, stringOf(from.cardPublicKey))) + block.addItem(TextItem(CardId.issuerPublicKey, stringOf(from.issuerPublicKey))) + block.addItem(TextItem(CardId.curve, stringOf(from.curve))) + block.addItem(TextItem(CardId.maxSignatures, stringOf(from.maxSignatures))) + block.addItem(TextItem(CardId.signingMethod, stringOf(from.signingMethod))) + block.addItem(TextItem(CardId.pauseBeforePin2, stringOf(from.pauseBeforePin2))) + block.addItem(TextItem(CardId.walletPublicKey, stringOf(from.walletPublicKey))) + block.addItem(TextItem(CardId.walletRemainingSignatures, stringOf(from.walletRemainingSignatures))) + block.addItem(TextItem(CardId.walletSignedHashes, stringOf(from.walletSignedHashes))) + block.addItem(TextItem(CardId.health, stringOf(from.health))) + block.addItem(TextItem(CardId.isActivated, stringOf(from.isActivated))) + block.addItem(TextItem(CardId.activationSeed, stringOf(from.activationSeed))) + block.addItem(TextItem(CardId.paymentFlowVersion, stringOf(from.paymentFlowVersion))) + block.addItem(TextItem(CardId.userCounter, stringOf(from.userCounter))) +// block.addItem(TextItem(CardId.UserProtectedCounter, stringOf(from.userProtectedCounter))) + return block + } + + private fun cardData(from: Card): Item { + val block = createBlock(BlockId.Common) + val data = from.cardData ?: return block + + val itemList = block.itemList + itemList.add(TextItem(CardDataId.batchId, data.batchId)) +// Format: Year (2 bytes) | Month (1 byte) | Day (1 byte) + itemList.add(TextItem(CardDataId.manufactureDateTime, stringOf(data.manufactureDateTime))) + itemList.add(TextItem(CardDataId.issuerName, data.issuerName)) + itemList.add(TextItem(CardDataId.blockchainName, data.blockchainName)) + itemList.add(TextItem(CardDataId.manufacturerSignature, stringOf(data.manufacturerSignature))) + itemList.add(TextItem(CardDataId.productMask, stringOf(data.productMask))) + itemList.add(TextItem(CardDataId.tokenSymbol, data.tokenSymbol)) + itemList.add(TextItem(CardDataId.tokenContractAddress, data.tokenContractAddress)) + itemList.add(TextItem(CardDataId.tokenDecimal, data.tokenSymbol)) + + return block + } + + private fun settingsMask(from: SettingsMask?): Item { + val block = createBlock(CardId.settingsMask) + val data = from ?: return block + + Settings.values().forEach { block.addItem(BoolItem(StringId(it.name), data.contains(it))) } + return block + } + + private fun createBlock(id: Id): ListItemBlock = ListItemBlock(id).apply { addItem(TextItem(id)) } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt new file mode 100644 index 0000000000..9b1dc76a49 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt @@ -0,0 +1,17 @@ +package com.tangem.tangemtest.ucase.variants.responses.converter + +import com.tangem.commands.Card +import com.tangem.commands.SignResponse +import com.tangem.commands.personalization.DepersonalizeResponse +import com.tangem.tasks.ScanEvent +import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder +import java.lang.reflect.Type + +class ConvertersStore : BaseTypedHolder() { + init { + register(ScanEvent.OnReadEvent::class.java, ReadEventConverter()) + register(SignResponse::class.java, SignResponseConverter()) + register(Card::class.java, CardConverter()) + register(DepersonalizeResponse::class.java, DepersonalizeResponseConverter()) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt new file mode 100644 index 0000000000..a1c997465b --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt @@ -0,0 +1,35 @@ +package com.tangem.tangemtest.ucase.variants.responses.converter + +import com.tangem.commands.SignResponse +import com.tangem.commands.personalization.DepersonalizeResponse +import com.tangem.tangemtest._arch.structure.StringId +import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems +import com.tangem.tangemtest._arch.structure.impl.TextItem +import com.tangem.tasks.ScanEvent +import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf + +/** +[REDACTED_AUTHOR] + */ +class ReadEventConverter : ModelToItems { + override fun convert(from: ScanEvent.OnReadEvent): List = CardConverter().convert(from.card) +} + +class SignResponseConverter : ModelToItems { + + override fun convert(from: SignResponse): List { + return listOf( + TextItem(StringId("CID"), from.cardId), + TextItem(StringId("Wallet signed hashes"), stringOf(from.walletSignedHashes)), + TextItem(StringId("Wallet remaining signatures"), stringOf(from.walletRemainingSignatures)), + TextItem(StringId("Signature"), stringOf(from.signature)) + ) + } +} + +class DepersonalizeResponseConverter : ModelToItems { + override fun convert(from: DepersonalizeResponse): List { + return listOf(TextItem(StringId("Is success"), stringOf(from.success))) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt new file mode 100644 index 0000000000..e3009a8787 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt @@ -0,0 +1,56 @@ +package com.tangem.tangemtest.ucase.variants.responses.ui + +import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels +import androidx.lifecycle.Observer +import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.widget.WidgetBuilder +import com.tangem.tangemtest._main.MainViewModel +import com.tangem.tangemtest.ucase.ui.BaseFragment +import com.tangem.tangemtest.ucase.variants.responses.ResponseViewModel +import com.tangem.tangemtest.ucase.variants.responses.ui.widget.ResponseItemBuilder +import ru.dev.gbixahue.eu4d.lib.android.global.log.Log + +/** +[REDACTED_AUTHOR] + */ +open class ResponseFragment : BaseFragment() { + + companion object Arg { + val response = "response" + } + + private val mainActivityVM: MainViewModel by activityViewModels() + private val selfVM: ResponseViewModel by viewModels() + + private val itemContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_container) } + + override fun getLayoutId(): Int = R.layout.fg_card_response + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mainActivityVM.ldResponseEvent.observe(viewLifecycleOwner, Observer { event -> + val builder = WidgetBuilder(ResponseItemBuilder()) + val itemList = selfVM.createItemList(event) + itemList.forEach { builder.build(it, itemContainer) } + }) + subscribeToViewModelChanges() + } + + private fun subscribeToViewModelChanges() { + Log.d(this, "subscribeToViewModelChanges") + listenDescriptionSwitchChanges() + } + + + private fun listenDescriptionSwitchChanges() { + mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { + selfVM.toggleDescriptionVisibility(it) + }) + } +} diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt new file mode 100644 index 0000000000..5350ab0135 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt @@ -0,0 +1,25 @@ +package com.tangem.tangemtest.ucase.variants.responses.ui.widget + +import android.view.ViewGroup +import com.google.android.material.checkbox.MaterialCheckBox +import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.structure.impl.BoolItem +import com.tangem.tangemtest._arch.widget.abstraction.getName +import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget +import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom + +/** +[REDACTED_AUTHOR] + */ +class CheckBoxWidget(parent: ViewGroup, private val boolItem: BoolItem) : DescriptionWidget(parent, boolItem) { + override fun getLayoutId(): Int = R.layout.w_response_item_checkbox + + private val switchItem = view.findViewById(R.id.sw_item) + + init { + switchItem.text = getName() + switchItem.isChecked = dataItem.getData() ?: false + switchItem.isEnabled = false + switchItem.setTextColor(switchItem.colorFrom(R.color.action_name)) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ResponseItemBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt similarity index 75% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ResponseItemBuilder.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt index dd80c57862..cde044dc2c 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ResponseItemBuilder.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt @@ -1,11 +1,11 @@ -package com.tangem.tangemtest.ucase.ui +package com.tangem.tangemtest.ucase.variants.responses.ui.widget import android.view.ViewGroup import com.tangem.tangemtest._arch.structure.abstraction.BaseItem +import com.tangem.tangemtest._arch.structure.impl.BoolItem import com.tangem.tangemtest._arch.structure.impl.TextItem import com.tangem.tangemtest._arch.widget.ItemWidgetBuilder import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget -import com.tangem.tangemtest.ucase.ui.widgets.ResponseTextWidget /** [REDACTED_AUTHOR] @@ -14,6 +14,7 @@ class ResponseItemBuilder : ItemWidgetBuilder { override fun build(item: BaseItem<*>, parent: ViewGroup): ViewWidget? { return when (item) { is TextItem -> ResponseTextWidget(parent, item) + is BoolItem -> CheckBoxWidget(parent, item) else -> null } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ResponseTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt similarity index 53% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ResponseTextWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt index fde72c3d54..468b9963e7 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ResponseTextWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt @@ -1,27 +1,38 @@ -package com.tangem.tangemtest.ucase.ui.widgets +package com.tangem.tangemtest.ucase.variants.responses.ui.widget import android.content.ClipData import android.content.ClipboardManager import android.content.Context +import android.view.View import android.view.ViewGroup import android.widget.TextView import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.TextItem -import com.tangem.tangemtest._arch.widget.abstraction.getResNameId +import com.tangem.tangemtest._arch.widget.abstraction.getName import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget /** [REDACTED_AUTHOR] */ -class ResponseTextWidget(parent: ViewGroup, textItem: TextItem) : DescriptionWidget(parent, textItem) { +class ResponseTextWidget(parent: ViewGroup, private val textItem: TextItem) : DescriptionWidget(parent, textItem) { override fun getLayoutId(): Int = R.layout.w_response_item - private val tvName: TextView by lazy { view.findViewById(R.id.tv_name) } - private val tvValue: TextView by lazy { view.findViewById(R.id.tv_value) } + private val tvName: TextView = view.findViewById(R.id.tv_name) + private val tvValue: TextView = view.findViewById(R.id.tv_value) init { - tvName.setText(getResNameId()) - tvValue.text = dataItem.getData() + initWidgets() + } + + private fun initWidgets() { + val data = textItem.getData() + if (data == null || data.isEmpty()) { + view.visibility = View.GONE + return + } + + tvName.text = getName() + tvValue.text = data view.setOnClickListener { val clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt index 1edc4c72de..3ec710a4b7 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt @@ -8,7 +8,7 @@ import com.tangem.tangemtest.R import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.managers.ScanItemsManager import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment -import com.tangem.tangemtest.ucase.ui.response.BaseCardResponseFragment +import com.tangem.tangemtest.ucase.variants.responses.ui.ResponseFragment /** [REDACTED_AUTHOR] @@ -28,7 +28,7 @@ class ScanActionFragment : BaseCardActionFragment() { actionVM.seReadResponse.observe(viewLifecycleOwner, Observer { navigateTo( R.id.action_nav_card_action_to_response_screen, - bundleOf(Pair(BaseCardResponseFragment.response, it)) + bundleOf(Pair(ResponseFragment.response, it)) ) }) } diff --git a/tangem-demo/src/main/res/layout/fg_card_response.xml b/tangem-demo/src/main/res/layout/fg_card_response.xml index f9aeaa5923..357f9c82c6 100644 --- a/tangem-demo/src/main/res/layout/fg_card_response.xml +++ b/tangem-demo/src/main/res/layout/fg_card_response.xml @@ -1,8 +1,8 @@ - + android:layout_height="match_parent"> - \ No newline at end of file + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/w_response_item.xml b/tangem-demo/src/main/res/layout/w_response_item.xml index c44aa9cd78..c0f3b1e887 100644 --- a/tangem-demo/src/main/res/layout/w_response_item.xml +++ b/tangem-demo/src/main/res/layout/w_response_item.xml @@ -3,23 +3,24 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingStart="@dimen/def_indent" - android:paddingTop="6dp" - android:paddingEnd="@dimen/def_indent" - android:paddingBottom="6dp"> + android:layout_height="wrap_content"> + android:orientation="vertical" + android:paddingStart="@dimen/def_indent" + android:paddingTop="6dp" + android:paddingEnd="@dimen/def_indent" + android:paddingBottom="8dp"> + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/w_response_item_checkbox.xml b/tangem-demo/src/main/res/layout/w_response_item_checkbox.xml new file mode 100644 index 0000000000..2102af0305 --- /dev/null +++ b/tangem-demo/src/main/res/layout/w_response_item_checkbox.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + diff --git a/tangem-demo/src/main/res/navigation/navigation.xml b/tangem-demo/src/main/res/navigation/navigation.xml index cd84c2a849..8107b48599 100644 --- a/tangem-demo/src/main/res/navigation/navigation.xml +++ b/tangem-demo/src/main/res/navigation/navigation.xml @@ -127,7 +127,7 @@ diff --git a/tangem-demo/src/main/res/values/colors.xml b/tangem-demo/src/main/res/values/colors.xml index 20e2693328..c72e37bcd8 100644 --- a/tangem-demo/src/main/res/values/colors.xml +++ b/tangem-demo/src/main/res/values/colors.xml @@ -8,7 +8,10 @@ #E6959595 #2B2B2B - #888888 + + #888888 + #303030 + @color/field_info #C6C6C6 #FFE391 diff --git a/tangem-demo/src/main/res/values/strings.xml b/tangem-demo/src/main/res/values/strings.xml index 5cb0f4053a..df8e87a708 100644 --- a/tangem-demo/src/main/res/values/strings.xml +++ b/tangem-demo/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - Tangem Demo + Tangem Development Kit @string/app_name "Current card ID: " diff --git a/tangem-demo/src/main/res/values/strings_response.xml b/tangem-demo/src/main/res/values/strings_response.xml new file mode 100644 index 0000000000..c0086d1186 --- /dev/null +++ b/tangem-demo/src/main/res/values/strings_response.xml @@ -0,0 +1,138 @@ + + + + + + CID + Manufacturer_Name + Status + Firmware_Version + Card_PublicKey + Settings_Mask + Is_Reusable + Use_Activation + Prohibit_Purge_Wallet + Use_Block + Allow_SET_PIN1 + Allow_SET_PIN2 + Use_CVC + Prohibit_Default_PIN1 + Use_One_CommandAtTime + Use_NDEF + Use_Dynamic_NDEF + Smart_Security_Delay + Allow_Unencrypted + Allow_Fast_Encryption + Protect_Issuer_Data_Against_Replay + Allow_Select_Blockchain + Disable_Precomputed_NDEF + Skip_Security_Delay_If_Validated_By_Issuer + Skip_Check_PIN2_and_CVC_If_Validated_By_Issuer + Skip_Security_Delay_If_Validated_By_Linked_Terminal + Restrict_Overwrite_Issuer_Extra_Data + 1 – prohibit overwriting Issuer_Extra_Data + Require_Term_Tx_Signature + Require_Term_Cert_Signature + Check_PIN3_on_Card + Card_Data + Issuer_Data_PublicKey + Curve_ID + Max_Signatures + Signing_Method + Pause_Before_PIN2 + Wallet_PublicKey + Wallet_Remaining_Signatures + Wallet_Signed_Hashes + Health + Is_Activated + Activation_Seed + Payment_Flow_Version + User_Counter + User_Protected_Counter + + + Unique Tangem card ID number + Name of Tangem card manufacturer + Current status of the card + Version of Tangem COS + Public key that is used to authenticate the card against manufacturer’s database. It is generated one time during card manufacturing. See Security section for more details. + Card settings defined by personalization (bit mask: 0 – Enabled, 1 – Disabled): + Defines what happens when user calls PURGE_WALLET command: + \n0 - Card will switch to Purged state + \n1 - Card will switch to Empty state and let create a new wallet again + + 0 – Card will accept PURGE_WALLET command + \n1 – Card will reject PURGE_WALLET command + + Is user allowed to change PIN1 with SET_PIN command + Is user allowed to change PIN2 with SET_PIN command + All commands requiring PIN2 will also require additional CVC code printed on the card + SET_PIN commands will not change PIN1 to default value (‘000000’). + Card will execute only one command during one communication session, thus requiring user to physically take the card away from the host after each action (all commands except for READ_CARD). + Whether the card should emulate NDEF. In default configuration, two NDEF records are loaded during personalization: (1) Tangem web site address, (2) name of Android App package in Google Play Store. + 0 – Disable dynamic generation of NDEF for iOS. See Dynamic NDEF section for more details. + /n1 – Enable dynamic NDEF for iOS. + Security delay Pause_Before_PIN2 will not be applied if PIN2 is not default. + Whether the card supports unencrypted NFC communication. See NFC communication section for more details. + Whether the card supports fast encrypted NFC communication. See NFC communication section for more details. + 0 – No replay protection on write issuer data + /n1 – Enable replay protection on write issuer data (card will require additional Issuer_Data_Counter incremented on each write) + 0 – Wallet elliptic curve and blockchain information stored during PERSONALIZE command and never change + /n1 – Wallet elliptic curve and blockchain information can be changed on CREATE_WALLET command + 0 – Enable precomputed dynamic NDEF to work around iPhone 7+ NFC bug. + /n1 – Disable precomputed dynamic NDEF. See Dynamic NDEF section for more details. + 0 – Enforce security delay in SIGN command if the issuer validates the transaction (for signing methods 2, 3, 4 and 5). + /n1 – Skip security delay in SIGN command if the issuer validates the transaction (for signing methods 2, 3, 4 and 5). + 0 – Require and check PIN2 and CVC in SIGN command if the issuer validates the transaction (for signing method 2, 3, 4 and 5). + /n1 – Skip checking PIN2 and CVC in SIGN command if the issuer validates the transaction (for signing method 2, 3, 4 and 5). + 1 - Store Terminal_PublicKey public key of linked terminal no each SIGN command, skip security delay if valid signature of transaction is made with Terminal_PrivateKey is provided in SIGN command + + + 0 – Skip checking terminal’s signature when signing POS transaction + /n1 – Check terminal’s signature when signing POS transaction + 0 – Skip checking acquirer’s signature of terminal certificate when signing POS transaction + /n1 – Check acquirer’s signature of terminal certificate when signing POS transaction + 0 – Additionally encrypt POS transaction signature with key derived from PIN3 when the transaction amount exceeds PIN3 floor limit + /n1 – Require terminal to send PIN3 to card when the POS transaction amount exceeds PIN3_Floor_Limit + Detailed information about card contents. Format is defined by the card issuer. Cards complaint with Tangem Wallet application should have TLV format described in Personalization section. + Public key that is used by the card issuer to sign Issuer_Data field. See Security section for more details. + Explicit text name of the elliptic curve used for all wallet key operations. + Total number of signatures allowed for the wallet when the card was personalized. + Defines what data should be submitted to SIGN command. + Delay in seconds before COS executes commands protected by PIN2. + Public key of the blockchain wallet. Value returned only if the wallet has already been created by CREATE_WALLET command. See Security section for more details. + Remaining number of SIGN operations before the wallet will stop signing transactions. Value returned only if the wallet has already been created by CREATE_WALLET command. + Total number of signed single hashes returned by the card in SIGN command responses since card personalization. Sums up array elements within all SIGN commands. + Any non-zero value indicates that the card experiences some hardware problems. User should withdraw the value to other blockchain wallet as soon as possible. Non-zero Health tag will also appear in responses of all other commands. + Whether the card requires issuer’s confirmation of activation. + /n0 – card will require issuer’s confirmation of activation, + /notherwise this field will not be returned (card is activated and operational). + A random challenge generated by PERSONALIZE command that should be signed and returned to COS by the issuer to confirm the card has been activated. See ACTIVATE_CARD command for more details. + /nThis field will not be returned if the card is activated. + Version of POS payment scheme supported by COS ([0x02,0x01] for version 2.30) + /nReturned only if SigningMethod ‘6’ enabling POS transactions is supported by card. + This value can be initialized by App and will be increased by COS with the execution of each SIGN command. For example, this field can store blockchain “nonce” for a quick one-touch transaction on POS terminals. Returned only if SigningMethod =6. + This value can be initialized by App (with PIN2 confirmation) and will be increased by COS with the execution of each SIGN command. For example, this field can store blockchain “nonce” for a quick one-touch transaction on POS terminals. Returned only if SigningMethod =6. + + + + Batch_ID + Manufacture_Date_Time + Issuer_Name + Blockchain_Name + Manufacturer_Signature + ProductMask + tokenSymbol + tokenContractAddress + tokenDecimal + + Tangem internal manufacturing batch ID, should correspond with the data in Tangem’s card list (see Card attestation and UID and CID sections) + Timestamp of manufacturing should correspond with the data in Tangem’s card list (see Card attestation section). + Name of the issuer + Name of the blockchain (once personalized, the target blockchain is fixed for the whole life cycle) + Signature of CID with the MANUFACTURER_PRIVATE_KEY + Mask of products enabled on card + + + + \ No newline at end of file From 5491d7c795a4d4299a6f319e1a0f97e59519f9c5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 9 Apr 2020 00:27:51 +0300 Subject: [PATCH 12/19] Updated on 2026-08-14 --- .gitignore | 3 ++ .../tangem/tangemtest/commons/Abstractions.kt | 9 +++++ .../tangemtest/ucase/domain/actions/Action.kt | 2 ++ .../domain/paramsManager/ItemsManager.kt | 4 +-- .../managers/BaseItemsManager.kt | 36 ++++++++++++++----- .../managers/DepersonalizeItemsManager.kt | 26 -------------- .../managers/PersonalizeItemsManager.kt | 18 +++------- .../managers/ScanItemsManager.kt | 17 --------- .../managers/SignItemsManager.kt | 34 ------------------ .../paramsManager/managers/SimpleManagers.kt | 31 ++++++++++++++++ .../personalize/PersonalizationConfigStore.kt | 26 ++++++++++++++ .../personalize/ui/PersonalizeFragment.kt | 33 ++--------------- 12 files changed, 106 insertions(+), 133 deletions(-) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeItemsManager.kt delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanItemsManager.kt delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignItemsManager.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt diff --git a/.gitignore b/.gitignore index d741153000..39d65ab0a1 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,9 @@ local.properties .idea/*.xml .idea/codeStyles +# LayoutInspector files +.captures + # OS-specific files .DS_Store .DS_Store? diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt new file mode 100644 index 0000000000..f5f02c0ace --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt @@ -0,0 +1,9 @@ +package com.tangem.tangemtest.commons + +/** +[REDACTED_AUTHOR] + */ +interface Store { + fun save(config: M) + fun restore(): M +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt index 285c8de4b6..a5f736fe1f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt @@ -43,4 +43,6 @@ abstract class BaseAction : Action { } callback(taskEvent, modifiedItems) } + + override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? = null } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt index f97013d6f8..42b92174ad 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt @@ -19,12 +19,12 @@ typealias ActionCallback = (ActionResponse, AffectedList) -> Unit interface ItemsManager : PayloadHolder { fun itemChanged(id: Id, value: Any?, callback: AffectedItemsCallback? = null) + fun setItems(items: List) fun getItems(): List + fun setItemChangeConsequences(consequence: ItemsChangeConsequence?) fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? fun attachPayload(payload: Payload) - - val consequence: ItemsChangeConsequence? } interface PayloadKey { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt index 03ccaf4728..bfb987742d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt @@ -1,5 +1,6 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.managers +import androidx.lifecycle.LifecycleObserver import com.tangem.CardManager import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.Payload @@ -11,18 +12,22 @@ import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback import com.tangem.tangemtest.ucase.domain.paramsManager.AffectedItemsCallback import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence +import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ -abstract class BaseItemsManager(protected val action: Action) : ItemsManager { +open class BaseItemsManager(protected val action: Action) : ItemsManager, LifecycleObserver { - protected val itemList: List by lazy { createItemsList() } - - override val consequence: ItemsChangeConsequence? = null + init { + Log.d(this, "new instance created") + } override val payload: MutableMap = mutableMapOf() + protected var changeConsequence: ItemsChangeConsequence? = null + protected val itemList: MutableList = mutableListOf() + override fun itemChanged(id: Id, value: Any?, callback: AffectedItemsCallback?) { if (itemList.isEmpty()) return val foundItem = itemList.findDataItem(id) ?: return @@ -31,9 +36,24 @@ abstract class BaseItemsManager(protected val action: Action) : ItemsManager { applyChangesByAffectedItems(foundItem, callback) } + override fun setItems(items: List) { + itemList.clear() + itemList.addAll(items) + } + override fun getItems(): List = itemList - override fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? = null + override fun setItemChangeConsequences(consequence: ItemsChangeConsequence?) { + this.changeConsequence = consequence + } + + override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { + action.executeMainAction(this, getAttrsForAction(cardManager), callback) + } + + override fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? { + return action.getActionByTag(this, id, getAttrsForAction(cardManager)) + } override fun attachPayload(payload: Payload) { payload.forEach { this.payload[it.key] = it.value } @@ -41,11 +61,9 @@ abstract class BaseItemsManager(protected val action: Action) : ItemsManager { // Use it if current item needs to be affect any other items protected open fun applyChangesByAffectedItems(param: Item, callback: AffectedItemsCallback?) { - consequence?.affectChanges(this, param, itemList)?.let { callback?.invoke(it) } + changeConsequence?.affectChanges(this, param, itemList)?.let { callback?.invoke(it) } } protected fun getAttrsForAction(cardManager: CardManager) - : AttrForAction = AttrForAction(cardManager, itemList, payload, consequence) - - abstract fun createItemsList(): List + : AttrForAction = AttrForAction(cardManager, itemList, payload, changeConsequence) } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeItemsManager.kt deleted file mode 100644 index 8267c86bb6..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeItemsManager.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.tangem.tangemtest.ucase.domain.paramsManager.managers - -import com.tangem.CardManager -import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.impl.EditTextItem -import com.tangem.tangemtest.ucase.domain.actions.DepersonalizeAction -import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.variants.TlvId - -/** -[REDACTED_AUTHOR] - */ -class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) { - override fun createItemsList(): List { - return listOf(EditTextItem(TlvId.CardId, null)) - } - - override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { - action.executeMainAction(this, getAttrsForAction(cardManager), callback) - } - - override fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? { - return action.getActionByTag(this, id, getAttrsForAction(cardManager)) - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt index c0381252bb..a483cfe69d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt @@ -1,31 +1,26 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.managers import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent import com.tangem.CardManager -import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest.commons.Store import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig -import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ class PersonalizeItemsManager( private val store: Store -) : BaseItemsManager(PersonalizeAction()), LifecycleObserver { +) : BaseItemsManager(PersonalizeAction()) { - init { - Log.d(this, "new instance created") - } private val converter = PersonalizeConfigConverter() - override fun createItemsList(): List { + init { val config = store.restore() - return converter.convert(config) + setItems(converter.convert(config)) } override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { @@ -37,9 +32,4 @@ class PersonalizeItemsManager( val config = converter.convert(itemList, PersonalizeConfig()) store.save(config) } -} - -interface Store { - fun save(config: M) - fun restore(): M } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanItemsManager.kt deleted file mode 100644 index 1d9c973786..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanItemsManager.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.tangem.tangemtest.ucase.domain.paramsManager.managers - -import com.tangem.CardManager -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest.ucase.domain.actions.ScanAction -import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback - -/** -[REDACTED_AUTHOR] - */ -class ScanItemsManager : BaseItemsManager(ScanAction()) { - override fun createItemsList(): List = listOf() - - override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { - action.executeMainAction(this, getAttrsForAction(cardManager), callback) - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignItemsManager.kt deleted file mode 100644 index 7d5d77a912..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignItemsManager.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.tangem.tangemtest.ucase.domain.paramsManager.managers - -import com.tangem.CardManager -import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.impl.EditTextItem -import com.tangem.tangemtest.ucase.domain.actions.SignAction -import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence -import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.SignScanConsequence -import com.tangem.tangemtest.ucase.variants.TlvId - -/** -[REDACTED_AUTHOR] - */ -class SignItemsManager : BaseItemsManager(SignAction()) { - - override val consequence: ItemsChangeConsequence? by lazy { SignScanConsequence() } - - override fun createItemsList(): List { - return listOf( - EditTextItem(TlvId.CardId, null), - EditTextItem(TlvId.TransactionOutHash, "Data used for hashing") - ) - } - - override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { - action.executeMainAction(this, getAttrsForAction(cardManager), callback) - } - - override fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? { - return action.getActionByTag(this, id, getAttrsForAction(cardManager)) - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt new file mode 100644 index 0000000000..c892b6761b --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt @@ -0,0 +1,31 @@ +package com.tangem.tangemtest.ucase.domain.paramsManager.managers + +import com.tangem.tangemtest._arch.structure.impl.EditTextItem +import com.tangem.tangemtest.ucase.domain.actions.DepersonalizeAction +import com.tangem.tangemtest.ucase.domain.actions.ScanAction +import com.tangem.tangemtest.ucase.domain.actions.SignAction +import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.SignScanConsequence +import com.tangem.tangemtest.ucase.variants.TlvId + +/** +[REDACTED_AUTHOR] + */ +class ScanItemsManager : BaseItemsManager(ScanAction()) + +class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) { + + init { + setItems(listOf(EditTextItem(TlvId.CardId, null))) + } +} + +class SignItemsManager : BaseItemsManager(SignAction()) { + + init { + setItemChangeConsequences(SignScanConsequence()) + setItems(listOf( + EditTextItem(TlvId.CardId, null), + EditTextItem(TlvId.TransactionOutHash, "Data used for hashing") + )) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt new file mode 100644 index 0000000000..6f7acaba65 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt @@ -0,0 +1,26 @@ +package com.tangem.tangemtest.ucase.variants.personalize + +import android.content.Context +import android.content.SharedPreferences +import androidx.core.content.edit +import com.google.gson.Gson +import com.tangem.tangemtest.AppTangemDemo +import com.tangem.tangemtest.commons.Store +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig + +class PersonalizationConfigStore(context: Context) : Store { + + private val key = "personalization_config" + + private val sp: SharedPreferences = (context.applicationContext as AppTangemDemo).sharedPreferences() + private val gson: Gson = Gson() + + override fun save(config: PersonalizeConfig) { + sp.edit(true) { putString(key, gson.toJson(config)) } + } + + override fun restore(): PersonalizeConfig { + val json = sp.getString(key, gson.toJson(PersonalizeConfig())) + return gson.fromJson(json, PersonalizeConfig::class.java) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt index 788d196392..740eeb0dde 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt @@ -1,13 +1,8 @@ package com.tangem.tangemtest.ucase.variants.personalize.ui -import android.content.Context -import android.content.SharedPreferences import android.os.Bundle import android.view.View -import androidx.core.content.edit import androidx.lifecycle.Observer -import com.google.gson.Gson -import com.tangem.tangemtest.AppTangemDemo import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.abstraction.Item @@ -15,12 +10,11 @@ import com.tangem.tangemtest._arch.widget.WidgetBuilder import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizeItemsManager -import com.tangem.tangemtest.ucase.domain.paramsManager.managers.Store import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.tunnel.ItemError import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import com.tangem.tangemtest.ucase.variants.personalize.PersonalizationConfigStore import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.PersonalizeItemBuilder import ru.dev.gbixahue.eu4d.lib.android.global.log.Log @@ -81,27 +75,4 @@ class PersonalizeFragment : BaseCardActionFragment() { else -> showSnackbar(requireContext().getString(R.string.unknown)) } } -} - -class PersonalizationConfigStore(context: Context) : Store { - - private val key = "personalization_config" - - private val sp: SharedPreferences = (context.applicationContext as AppTangemDemo).sharedPreferences() - private val gson: Gson = Gson() - - override fun save(config: PersonalizeConfig) { - sp.edit(true) { putString(key, gson.toJson(config)) } - } - - override fun restore(): PersonalizeConfig { - val json = sp.getString(key, gson.toJson(PersonalizeConfig())) - return gson.fromJson(json, PersonalizeConfig::class.java) - } -} - - - - - - +} \ No newline at end of file From 6de895da1889e46fd8ff81ca6588c865ff3f9c32 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 9 Apr 2020 00:37:03 +0300 Subject: [PATCH 13/19] Updated on 2026-08-14 --- .../ucase/domain/actions/PersonalizeAction.kt | 14 +++++----- ...ager.kt => PersonalizationItemsManager.kt} | 12 ++++---- .../ucase/resources/MainResourceHolder.kt | 4 +-- ...sources.kt => PersonalizationResources.kt} | 2 +- .../ucase/variants/personalize/Ids.kt | 28 +++++++++---------- .../personalize/PersonalizationConfigStore.kt | 12 ++++---- .../personalize/converter/DefaultValues.kt | 6 ++-- ...r.kt => PersonalizationConfigConverter.kt} | 16 +++++------ ...fig.kt => ItemsToPersonalizationConfig.kt} | 16 +++++------ .../converter/fromTo/PersonalizeConfigTo.kt | 16 +++++------ ...ams.kt => DefaultPersonalizationParams.kt} | 2 +- ...lizeConfig.kt => PersonalizationConfig.kt} | 2 +- ...Fragment.kt => PersonalizationFragment.kt} | 14 +++++----- ...ilder.kt => PersonalizationItemBuilder.kt} | 2 +- ...personalize.xml => fg_personalization.xml} | 0 .../src/main/res/navigation/navigation.xml | 4 +-- 16 files changed, 74 insertions(+), 76 deletions(-) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/{PersonalizeItemsManager.kt => PersonalizationItemsManager.kt} (77%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/{PersonalizeResources.kt => PersonalizationResources.kt} (99%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/{PersonalizeConfigConverter.kt => PersonalizationConfigConverter.kt} (55%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/{ItemsToPersonalizeConfig.kt => ItemsToPersonalizationConfig.kt} (92%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/{DefaultPersonalizeParams.kt => DefaultPersonalizationParams.kt} (97%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/{PersonalizeConfig.kt => PersonalizationConfig.kt} (98%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/{PersonalizeFragment.kt => PersonalizationFragment.kt} (86%) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/{PersonalizeItemBuilder.kt => PersonalizationItemBuilder.kt} (93%) rename tangem-demo/src/main/res/layout/{fg_personalize.xml => fg_personalization.xml} (100%) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt index 8ef5e4c0cc..a50bc09456 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt @@ -10,10 +10,10 @@ import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.ItemError import com.tangem.tangemtest.ucase.variants.personalize.CardNumber -import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter +import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.PersonalizeConfigToCardConfig -import com.tangem.tangemtest.ucase.variants.personalize.dto.DefaultPersonalizeParams -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import com.tangem.tangemtest.ucase.variants.personalize.dto.DefaultPersonalizationParams +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf /** @@ -33,11 +33,11 @@ class PersonalizeAction : BaseAction() { return } - val issuer = DefaultPersonalizeParams.issuer() - val acquirer = DefaultPersonalizeParams.acquirer() - val manufacturer = DefaultPersonalizeParams.manufacturer() + val issuer = DefaultPersonalizationParams.issuer() + val acquirer = DefaultPersonalizationParams.acquirer() + val manufacturer = DefaultPersonalizationParams.manufacturer() - val personalizeConfig = PersonalizeConfigConverter().convert(itemList, PersonalizeConfig()) + val personalizeConfig = PersonalizationConfigConverter().convert(itemList, PersonalizationConfig()) val cardConfig = PersonalizeConfigToCardConfig().convert(personalizeConfig) attrs.cardManager.personalize(cardConfig, issuer, manufacturer, acquirer) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt similarity index 77% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt index a483cfe69d..e67e278aca 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt @@ -6,17 +6,17 @@ import com.tangem.CardManager import com.tangem.tangemtest.commons.Store import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig /** [REDACTED_AUTHOR] */ -class PersonalizeItemsManager( - private val store: Store +class PersonalizationItemsManager( + private val store: Store ) : BaseItemsManager(PersonalizeAction()) { - private val converter = PersonalizeConfigConverter() + private val converter = PersonalizationConfigConverter() init { val config = store.restore() @@ -29,7 +29,7 @@ class PersonalizeItemsManager( @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onDestroy() { - val config = converter.convert(itemList, PersonalizeConfig()) + val config = converter.convert(itemList, PersonalizationConfig()) store.save(config) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt index 44028d9018..cf6a61abbc 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt @@ -3,7 +3,7 @@ package com.tangem.tangemtest.ucase.resources import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest.ucase.resources.initializers.ActionResources -import com.tangem.tangemtest.ucase.resources.initializers.PersonalizeResources +import com.tangem.tangemtest.ucase.resources.initializers.PersonalizationResources import com.tangem.tangemtest.ucase.resources.initializers.ResponseResources import com.tangem.tangemtest.ucase.resources.initializers.TlvResources import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder @@ -15,7 +15,7 @@ open class ResourceHolder : BaseTypedHolder() object MainResourceHolder : ResourceHolder() { init { - PersonalizeResources().init(this) + PersonalizationResources().init(this) ActionResources().init(this) TlvResources().init(this) ResponseResources().init(this) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt similarity index 99% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt index fe56561030..a45bc55ed4 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt @@ -10,7 +10,7 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.common.TypedHolder /** [REDACTED_AUTHOR] */ -class PersonalizeResources() { +class PersonalizationResources() { fun init(holder: ResourceHolder) { initBlock(holder) initCardNumber(holder) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt index b8573bbdf5..6305b68975 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt @@ -6,11 +6,9 @@ import com.tangem.tangemtest._arch.structure.Id [REDACTED_AUTHOR] */ -interface PersonalizeId : Id +interface PersonalizationId : Id -interface BlockItem : PersonalizeId - -enum class BlockId : PersonalizeId { +enum class BlockId : PersonalizationId { CardNumber, Common, SigningMethod, @@ -24,13 +22,13 @@ enum class BlockId : PersonalizeId { Pins, } -enum class CardNumber : BlockItem { +enum class CardNumber : PersonalizationId { Series, Number, BatchId, } -enum class Common : BlockItem { +enum class Common : PersonalizationId { Curve, Blockchain, BlockchainCustom, @@ -38,7 +36,7 @@ enum class Common : BlockItem { CreateWallet, } -enum class SigningMethod : BlockItem { +enum class SigningMethod : PersonalizationId { SignTx, SignTxRaw, SignValidatedTx, @@ -48,7 +46,7 @@ enum class SigningMethod : BlockItem { SignExternal, } -enum class SignHashExProp : BlockItem { +enum class SignHashExProp : PersonalizationId { PinLessFloorLimit, CryptoExKey, RequireTerminalCertSig, @@ -56,26 +54,26 @@ enum class SignHashExProp : BlockItem { CheckPin3, } -enum class Denomination : BlockItem { +enum class Denomination : PersonalizationId { WriteOnPersonalize, Denomination, } -enum class Token : BlockItem { +enum class Token : PersonalizationId { ItsToken, Symbol, ContractAddress, Decimal } -enum class ProductMask : BlockItem { +enum class ProductMask : PersonalizationId { Note, Tag, IdCard, IdIssuerCard } -enum class SettingsMask : BlockItem { +enum class SettingsMask : PersonalizationId { IsReusable, NeedActivation, ForbidPurge, @@ -94,12 +92,12 @@ enum class SettingsMask : BlockItem { RestrictOverwriteExtraIssuerData, } -enum class SettingsMaskProtocolEnc : BlockItem { +enum class SettingsMaskProtocolEnc : PersonalizationId { AllowUnencrypted, AllowStaticEncryption } -enum class SettingsMaskNdef : BlockItem { +enum class SettingsMaskNdef : PersonalizationId { UseNdef, DynamicNdef, DisablePrecomputedNdef, @@ -108,7 +106,7 @@ enum class SettingsMaskNdef : BlockItem { Uri, } -enum class Pins : BlockItem { +enum class Pins : PersonalizationId { Pin, Pin2, Pin3, diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt index 6f7acaba65..77a68278f8 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt @@ -6,21 +6,21 @@ import androidx.core.content.edit import com.google.gson.Gson import com.tangem.tangemtest.AppTangemDemo import com.tangem.tangemtest.commons.Store -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig -class PersonalizationConfigStore(context: Context) : Store { +class PersonalizationConfigStore(context: Context) : Store { private val key = "personalization_config" private val sp: SharedPreferences = (context.applicationContext as AppTangemDemo).sharedPreferences() private val gson: Gson = Gson() - override fun save(config: PersonalizeConfig) { + override fun save(config: PersonalizationConfig) { sp.edit(true) { putString(key, gson.toJson(config)) } } - override fun restore(): PersonalizeConfig { - val json = sp.getString(key, gson.toJson(PersonalizeConfig())) - return gson.fromJson(json, PersonalizeConfig::class.java) + override fun restore(): PersonalizationConfig { + val json = sp.getString(key, gson.toJson(PersonalizationConfig())) + return gson.fromJson(json, PersonalizationConfig::class.java) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt index 54ad12d4ab..49dd2faa8d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt @@ -4,16 +4,16 @@ import com.tangem.commands.EllipticCurve import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.impl.KeyValue import com.tangem.tangemtest.ucase.variants.personalize.* -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder /** [REDACTED_AUTHOR] */ -class PersonalizeConfigValuesHolder : BaseTypedHolder() { +class ConfigValuesHolder : BaseTypedHolder() { // All registered association values can't be objects - fun init(default: PersonalizeConfig) { + fun init(default: PersonalizationConfig) { register(CardNumber.Series, Value(default.series)) register(CardNumber.Number, Value(default.startNumber)) register(CardNumber.BatchId, Value(default.batchId)) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizeConfigConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt similarity index 55% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizeConfigConverter.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt index 6b9b041b49..7fbf672259 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizeConfigConverter.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt @@ -4,23 +4,23 @@ import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest._arch.structure.abstraction.ItemsToModel import com.tangem.tangemtest._arch.structure.abstraction.ModelConverter import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems -import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.ItemsToPersonalizeConfig -import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.PersonalizeConfigToItem -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.ItemsToPersonalizationConfig +import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.PersonalizationConfigToItems +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig /** [REDACTED_AUTHOR] */ -class PersonalizeConfigConverter : ModelConverter { +class PersonalizationConfigConverter : ModelConverter { - private val toModel: ItemsToModel = ItemsToPersonalizeConfig() - private val toItems: ModelToItems = PersonalizeConfigToItem() + private val toModel: ItemsToModel = ItemsToPersonalizationConfig() + private val toItems: ModelToItems = PersonalizationConfigToItems() - override fun convert(from: List, default: PersonalizeConfig): PersonalizeConfig { + override fun convert(from: List, default: PersonalizationConfig): PersonalizationConfig { return toModel.convert(from, default) } - override fun convert(from: PersonalizeConfig): List { + override fun convert(from: PersonalizationConfig): List { return toItems.convert(from) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizationConfig.kt similarity index 92% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizationConfig.kt index 177ac87463..95fd18908d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizationConfig.kt @@ -4,17 +4,17 @@ import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.abstraction.* import com.tangem.tangemtest._arch.structure.impl.ListValueWrapper import com.tangem.tangemtest.ucase.variants.personalize.* -import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigValuesHolder -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import com.tangem.tangemtest.ucase.variants.personalize.converter.ConfigValuesHolder +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ -class ItemsToPersonalizeConfig : ItemsToModel { - protected val valuesHolder = PersonalizeConfigValuesHolder() +class ItemsToPersonalizationConfig : ItemsToModel { + protected val valuesHolder = ConfigValuesHolder() - override fun convert(from: List, default: PersonalizeConfig): PersonalizeConfig { + override fun convert(from: List, default: PersonalizationConfig): PersonalizationConfig { valuesHolder.init(default) mapListItems(from) return createModel() @@ -34,8 +34,8 @@ class ItemsToPersonalizeConfig : ItemsToModel { } } - private fun createModel(): PersonalizeConfig { - val export = PersonalizeConfig() + private fun createModel(): PersonalizationConfig { + val export = PersonalizationConfig() export.series = getTyped(CardNumber.Series) export.startNumber = getTyped(CardNumber.Number) export.curveID = getTyped(Common.Curve) @@ -101,7 +101,7 @@ class ItemsToPersonalizeConfig : ItemsToModel { return getTypedBy(valuesHolder, id)!! } - private inline fun getTypedBy(holder: PersonalizeConfigValuesHolder, id: Id): Type? { + private inline fun getTypedBy(holder: ConfigValuesHolder, id: Id): Type? { Log.d(this, "getTyped for id: $id") var typedValue = holder.get(id)?.get() diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt index eb560d496d..30a581378f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt @@ -11,19 +11,19 @@ import com.tangem.tangemtest._arch.structure.abstraction.* import com.tangem.tangemtest._arch.structure.impl.* import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey import com.tangem.tangemtest.ucase.variants.personalize.* -import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigValuesHolder -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import com.tangem.tangemtest.ucase.variants.personalize.converter.ConfigValuesHolder +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter import java.util.* /** [REDACTED_AUTHOR] */ -class PersonalizeConfigToItem : ModelToItems { - private val valuesHolder = PersonalizeConfigValuesHolder() +class PersonalizationConfigToItems : ModelToItems { + private val valuesHolder = ConfigValuesHolder() private val itemTypes = ItemTypes() - override fun convert(from: PersonalizeConfig): List { + override fun convert(from: PersonalizationConfig): List { valuesHolder.init(from) val blocList = mutableListOf() blocList.add(cardNumber()) @@ -183,7 +183,7 @@ class PersonalizeConfigToItem : ModelToItems { return ListItemBlock(id).apply { addItem(TextItem(id)) } } - private fun addPayload(block: Block, from: PersonalizeConfig) { + private fun addPayload(block: Block, from: PersonalizationConfig) { block.payload[PayloadKey.incomingJson] = from } @@ -201,9 +201,9 @@ class PersonalizeConfigToItem : ModelToItems { } } -class PersonalizeConfigToCardConfig : Converter { +class PersonalizeConfigToCardConfig : Converter { - override fun convert(from: PersonalizeConfig): CardConfig { + override fun convert(from: PersonalizationConfig): CardConfig { val signingMethod = com.tangem.commands.SigningMethod.build( signHash = from.SigningMethod0, signRaw = from.SigningMethod1, diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizeParams.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt similarity index 97% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizeParams.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt index c8d9afa0d1..d82099cab8 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizeParams.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt @@ -9,7 +9,7 @@ import com.tangem.common.KeyPair [REDACTED_AUTHOR] */ -interface DefaultPersonalizeParams { +interface DefaultPersonalizationParams { companion object { fun issuer(): Issuer { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizationConfig.kt similarity index 98% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizationConfig.kt index bc855da8b1..1b09726453 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizationConfig.kt @@ -3,7 +3,7 @@ package com.tangem.tangemtest.ucase.variants.personalize.dto /** [REDACTED_AUTHOR] */ -class PersonalizeConfig { +class PersonalizationConfig { // Card number var series = "BB" diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt similarity index 86% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt index 740eeb0dde..dc6a412473 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt @@ -9,27 +9,27 @@ import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest._arch.widget.WidgetBuilder import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey -import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizeItemsManager +import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizationItemsManager import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.tunnel.ItemError import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment import com.tangem.tangemtest.ucase.variants.personalize.PersonalizationConfigStore -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.PersonalizeItemBuilder +import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.PersonalizationItemBuilder import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ -class PersonalizeFragment : BaseCardActionFragment() { +class PersonalizationFragment : BaseCardActionFragment() { - override val itemsManager: ItemsManager by lazy { PersonalizeItemsManager(PersonalizationConfigStore(requireContext())) } + override val itemsManager: ItemsManager by lazy { PersonalizationItemsManager(PersonalizationConfigStore(requireContext())) } - override fun getLayoutId(): Int = R.layout.fg_personalize + override fun getLayoutId(): Int = R.layout.fg_personalization override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - lifecycle.addObserver(itemsManager as PersonalizeItemsManager) + lifecycle.addObserver(itemsManager as PersonalizationItemsManager) } override fun initFab() { @@ -44,7 +44,7 @@ class PersonalizeFragment : BaseCardActionFragment() { Log.d(this, "ldBlockList size: ${list.size}") itemList.clear() itemList.addAll(list) - itemList.forEach { WidgetBuilder(PersonalizeItemBuilder()).build(it, itemContainer) } + itemList.forEach { WidgetBuilder(PersonalizationItemBuilder()).build(it, itemContainer) } actionVM.attachToPayload(mutableMapOf( PayloadKey.actionView to this as ActionView, PayloadKey.itemList to itemList diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizeItemBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt similarity index 93% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizeItemBuilder.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt index 30788d1e70..53b6c336e4 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizeItemBuilder.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/PersonalizationItemBuilder.kt @@ -9,7 +9,7 @@ import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget /** [REDACTED_AUTHOR] */ -class PersonalizeItemBuilder : ItemWidgetBuilder { +class PersonalizationItemBuilder : ItemWidgetBuilder { override fun build(item: BaseItem<*>, parent: ViewGroup): ViewWidget? { return when (item) { is TextItem -> BlockHeadWidget(parent, item) diff --git a/tangem-demo/src/main/res/layout/fg_personalize.xml b/tangem-demo/src/main/res/layout/fg_personalization.xml similarity index 100% rename from tangem-demo/src/main/res/layout/fg_personalize.xml rename to tangem-demo/src/main/res/layout/fg_personalization.xml diff --git a/tangem-demo/src/main/res/navigation/navigation.xml b/tangem-demo/src/main/res/navigation/navigation.xml index 8107b48599..1cc5427895 100644 --- a/tangem-demo/src/main/res/navigation/navigation.xml +++ b/tangem-demo/src/main/res/navigation/navigation.xml @@ -67,9 +67,9 @@ + tools:layout="@layout/fg_personalization" /> Date: Thu, 9 Apr 2020 00:54:54 +0300 Subject: [PATCH 14/19] Updated on 2026-08-14 --- .../tangem/tangemtest/ucase/tunnel/ViewScreen.kt | 2 +- .../tangemtest/ucase/ui/BaseCardActionFragment.kt | 12 +++++++----- .../personalize/ui/PersonalizationFragment.kt | 14 +++++++------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt index a22a6b14ae..53ab0b4883 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt @@ -12,5 +12,5 @@ interface ViewScreen interface ActionView : ViewScreen, SnackbarHolder { fun enableActionFab(enable: Boolean) - fun showSnackbar(id: Id) + fun showSnackbar(id: Id, additionalHandler: ((Id) -> Int)? = null) } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt index 67242ae326..44acd319b8 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt @@ -34,6 +34,7 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { protected abstract val itemsManager: ItemsManager protected val mainActivityVM by activityViewModels() protected val actionVM: ActionViewModel by viewModels { ActionViewModelFactory(itemsManager) } + protected val UNDEFINED = -1 private val paramsWidgetList = mutableListOf() @@ -130,11 +131,12 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { actionFab.enable(enable) } - override fun showSnackbar(id: Id) { -// MainResourceHolder.safeGet<>() - when (id) { - CardError.NotPersonalized -> showSnackbar(R.string.card_error_not_personalized) - else -> showSnackbar(requireContext().getString(R.string.unknown)) + override fun showSnackbar(id: Id, additionalHandler: ((Id) -> Int)?) { + val resourceId = when (id) { + CardError.NotPersonalized -> R.string.card_error_not_personalized + else -> additionalHandler?.invoke(id) ?: UNDEFINED } + + if (resourceId != UNDEFINED) showSnackbar(resourceId) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt index dc6a412473..d0216c725b 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt @@ -11,7 +11,6 @@ import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizationItemsManager import com.tangem.tangemtest.ucase.tunnel.ActionView -import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.tunnel.ItemError import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment import com.tangem.tangemtest.ucase.variants.personalize.PersonalizationConfigStore @@ -67,12 +66,13 @@ class PersonalizationFragment : BaseCardActionFragment() { }) } - override fun showSnackbar(id: Id) { - when (id) { - CardError.NotPersonalized -> showSnackbar(R.string.card_error_not_personalized) - ItemError.BadSeries -> showSnackbar(R.string.card_error_bad_series) - ItemError.BadCardNumber -> showSnackbar(R.string.card_error_bad_series_number) - else -> showSnackbar(requireContext().getString(R.string.unknown)) + override fun showSnackbar(id: Id, additionalHandler: ((Id) -> Int)?) { + super.showSnackbar(id) { + when (id) { + ItemError.BadSeries -> R.string.card_error_bad_series + ItemError.BadCardNumber -> R.string.card_error_bad_series_number + else -> additionalHandler?.invoke(id) ?: UNDEFINED + } } } } \ No newline at end of file From 9056c31bb6ae30622c2d67d9b38a247cd4d66b6b Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 9 Apr 2020 18:03:08 +0300 Subject: [PATCH 15/19] Updated on 2026-08-14 --- .../_arch/structure/HelpAbstracts.kt | 12 - .../tangem/tangemtest/_arch/structure/Ids.kt | 4 +- .../_arch/structure/abstraction/Extension.kt | 10 +- .../_arch/structure/abstraction/Item.kt | 32 +- .../abstraction/{Block.kt => ItemGroup.kt} | 32 +- .../{ViewModel.kt => ItemViewModel.kt} | 105 +++--- .../tangemtest/_arch/structure/impl/Items.kt | 24 +- .../_arch/structure/impl/ViewModels.kt | 29 -- .../_arch/widget/ItemWidgetBuilder.kt | 2 +- .../tangemtest/_arch/widget/WidgetBuilder.kt | 23 +- .../_arch/widget/abstraction/ViewWidget.kt | 44 +-- .../_arch/widget/impl/LinearBlockWidget.kt | 27 -- .../_arch/widget/impl/LinearGroupWidget.kt | 18 ++ .../_arch/widget/impl/StubWidget.kt | 9 +- .../tangemtest/commons/GlobalFunctions.kt | 3 +- .../domain/actions/DepersonalizeAction.kt | 4 +- .../ucase/domain/actions/PersonalizeAction.kt | 18 +- .../ucase/domain/actions/SignAction.kt | 6 +- .../managers/BaseItemsManager.kt | 4 +- .../triggers/afterAction/AfterScanModifier.kt | 4 +- .../ParamChangeConsequence.kt | 4 +- .../tangemtest/ucase/ui/ActionViewModel.kt | 8 +- .../ucase/ui/BaseCardActionFragment.kt | 5 +- .../ucase/ui/widgets/ParameterWidget.kt | 8 +- .../personalize/converter/DefaultValues.kt | 2 +- .../converter/{fromTo => }/ItemTypes.kt | 2 +- .../PersonalizationConfigConverter.kt | 289 ++++++++++++++++- .../PersonalizationConfigToCardConfig.kt | 113 +++++++ .../fromTo/ItemsToPersonalizationConfig.kt | 114 ------- .../converter/fromTo/PersonalizeConfigTo.kt | 305 ------------------ .../personalize/ui/widgets/BaseAppWidget.kt | 28 ++ .../ui/widgets/DescriptionWidget.kt | 14 +- .../personalize/ui/widgets/EditTextWidget.kt | 13 +- ...BlockHeadWidget.kt => GroupTitleWidget.kt} | 3 +- .../personalize/ui/widgets/NumberWidget.kt | 16 +- .../ui/widgets/PersonalizationItemBuilder.kt | 6 +- .../personalize/ui/widgets/SpinnerWidget.kt | 32 +- .../personalize/ui/widgets/SwitchWidget.kt | 15 +- .../variants/responses/ResponseViewModel.kt | 4 +- .../responses/converter/CardConverter.kt | 79 +++-- .../responses/ui/widget/CheckBoxWidget.kt | 9 +- .../ui/widget/ResponseItemBuilder.kt | 2 +- .../responses/ui/widget/ResponseTextWidget.kt | 11 +- 43 files changed, 730 insertions(+), 762 deletions(-) rename tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/{Block.kt => ItemGroup.kt} (61%) rename tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/{ViewModel.kt => ItemViewModel.kt} (70%) delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/ViewModels.kt delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearBlockWidget.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/{fromTo => }/ItemTypes.kt (99%) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizationConfig.kt delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/{BlockHeadWidget.kt => GroupTitleWidget.kt} (72%) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt index 98704005f5..309309c947 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt @@ -3,10 +3,6 @@ package com.tangem.tangemtest._arch.structure /** [REDACTED_AUTHOR] */ -interface DataHolder { - var viewModel: D -} - typealias Payload = MutableMap interface PayloadHolder { @@ -17,12 +13,4 @@ interface PayloadHolder { fun set(key: String, value: Any?) { payload[key] = value } -} - -interface ItemListHolder { - fun setItems(list: MutableList) - fun getItems(): MutableList - fun addItem(item: I) - fun removeItem(item: I) - fun clear() } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt index ce27853356..5e517808f2 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt @@ -5,7 +5,9 @@ package com.tangem.tangemtest._arch.structure */ interface Id -class StringId(val name: String) : Id +class StringId(val value: String) : Id + +class StringResId(val value: Int) : Id enum class Additional : Id { UNDEFINED, diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt index 71924302a3..76b43ce50a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt @@ -5,11 +5,11 @@ import com.tangem.tangemtest._arch.structure.Id /** [REDACTED_AUTHOR] */ -fun List.findDataItem(id: Id): BaseItem? { - var foundItem: BaseItem? = null +fun List.findItem(id: Id): Item? { + var foundItem: Item? = null iterate { if (it.id == id) { - foundItem = it as? BaseItem + foundItem = it return@iterate } } @@ -19,8 +19,8 @@ fun List.findDataItem(id: Id): BaseItem? { fun List.iterate(func: (Item) -> Unit) { forEach { when (it) { - is BaseItem<*> -> func(it) - is Block -> it.itemList.iterate(func) + is BaseItem -> func(it) + is ItemGroup -> it.itemList.iterate(func) } } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt index 40a546b78b..eaf3d7afa4 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt @@ -1,31 +1,39 @@ package com.tangem.tangemtest._arch.structure.abstraction -import com.tangem.tangemtest._arch.structure.DataHolder import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.Payload -import com.tangem.tangemtest._arch.structure.PayloadHolder /** [REDACTED_AUTHOR] */ -interface Item : PayloadHolder { +interface Item { val id: Id var parent: Item? -} + var viewModel: ItemViewModel -abstract class BaseItem( - override var viewModel: ItemViewModel -) : Item, DataHolder> { - override var parent: Item? = null - override val payload: Payload = mutableMapOf() + fun added(parent: Item) { + this.parent = parent + } - fun getData(): D? = viewModel.data + fun removed(parent: Item) { + this.parent = null + } - fun setData(value: D?) { + fun getData(): D? = viewModel.data as? D + + fun setData(value: Any?) { viewModel.data = value } fun restoreDefaultData() { setData(viewModel.defaultData) } +} + +open class BaseItem( + override val id: Id, + override var viewModel: ItemViewModel +) : Item { + + override var parent: Item? = null + } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Block.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemGroup.kt similarity index 61% rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Block.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemGroup.kt index 11086e6f93..61a43a0d1c 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Block.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemGroup.kt @@ -2,45 +2,47 @@ package com.tangem.tangemtest._arch.structure.abstraction import com.tangem.tangemtest._arch.structure.ILog import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.ItemListHolder /** [REDACTED_AUTHOR] */ -interface Block : Item { +interface ItemGroup : Item { val itemList: MutableList + + fun setItems(list: MutableList) + fun getItems(): MutableList + fun addItem(item: Item) + fun removeItem(item: Item) + fun clear() } -abstract class BaseBlock : Block { +open class SimpleItemGroup( + override val id: Id, + override var viewModel: ItemViewModel = BaseItemViewModel() +) : ItemGroup { + override var parent: Item? = null override val itemList: MutableList = mutableListOf() - override val payload: MutableMap = mutableMapOf() -} - -open class ListItemBlock( - override val id: Id -) : BaseBlock(), ItemListHolder { override fun setItems(list: MutableList) { ILog.d(this, "setItems into: $id, count: ${list.size}") + itemList.forEach { it.removed(this) } itemList.clear() - itemList.addAll(list) - itemList.forEach { it.parent = this } + list.forEach { addItem(it) } } - override fun getItems(): MutableList { - return itemList - } + override fun getItems(): MutableList = itemList override fun addItem(item: Item) { ILog.d(this, "addItem into: $id, who: ${item.id}") - item.parent = this itemList.add(item) + item.added(this) } override fun removeItem(item: Item) { ILog.d(this, "removeItem from: $id, which: ${item.id}") itemList.remove(item) + item.removed(this) } override fun clear() { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt similarity index 70% rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt index 86d1d1b345..d298f84f93 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt @@ -11,54 +11,7 @@ import com.tangem.tangemtest._arch.structure.PayloadHolder typealias ValueChange = (V?) -> Unit typealias SafeValueChange = (V) -> Unit -interface ItemViewModel : PayloadHolder { - val viewState: ViewState - var data: D? - var defaultData: D? - var onDataUpdated: ValueChange? - - fun updateDataByView(data: D?) -} - -open class BaseItemViewModel : ItemViewModel { - - override val viewState: ViewState = ViewState() - override val payload: Payload = mutableMapOf() - - // Don't update it directly from a View. Use for it updateDataByView() - override var data: D? = null - set(value) { - if (handleDataUpdates(value)) field = value - } - - // Data for restoring initial value - override var defaultData: D? = null - set(value) { - field = value - data = value - } - - // Use it for handling data updates in View - override var onDataUpdated: ValueChange? = null - - // When data updates directly it invokes onDataUpdated - // return true = data will update - // return false = data won't update - protected open fun handleDataUpdates(value: D?): Boolean { - ILog.d(this, "handleDateUpdates: $value") - onDataUpdated?.invoke(value) - return true - } - - // Use it to update the data from a View. It disables onDataUpdated to prevent a callback loop - override fun updateDataByView(data: D?) { - ILog.d(this, "data changed: $data") - val callback = onDataUpdated - onDataUpdated = null - this.data = data - onDataUpdated = callback - } -} +class KeyValue(val key: String, val value: Any) class ViewState { var isHiddenField = false @@ -70,4 +23,58 @@ class ViewState { } var onDescriptionVisibilityChanged: SafeValueChange? = null -} \ No newline at end of file +} + +interface ItemViewModel : PayloadHolder { + val viewState: ViewState + var data: Any? + var defaultData: Any? + var onDataUpdated: ValueChange? + + fun updateDataByView(data: Any?) +} + +open class BaseItemViewModel(value: Any? = null) : ItemViewModel { + + override val viewState: ViewState = ViewState() + override val payload: Payload = mutableMapOf() + + // Don't update it directly from a View. Use for it updateDataByView() + override var data: Any? = value + set(value) { + if (handleDataUpdates(value)) field = value + } + + // Data for restoring initial value + override var defaultData: Any? = value + set(value) { + field = value + data = value + } + + // Use it for handling data updates in View + override var onDataUpdated: ValueChange? = null + + // When data updates directly it invokes onDataUpdated + // return true = data will update + // return false = data won't update + protected open fun handleDataUpdates(value: Any?): Boolean { + ILog.d(this, "handleDateUpdates: $value") + onDataUpdated?.invoke(value) + return true + } + + // Use it to update the data from a View. It disables onDataUpdated to prevent a callback loop + override fun updateDataByView(data: Any?) { + ILog.d(this, "data changed: $data") + val callback = onDataUpdated + onDataUpdated = null + this.data = data + onDataUpdated = callback + } +} + +class ListViewModel( + var selectedItem: Any?, + val itemList: List +) : BaseItemViewModel(selectedItem) \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt index 5e6d10bd37..923f58f94a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt @@ -2,18 +2,24 @@ package com.tangem.tangemtest._arch.structure.impl import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.abstraction.BaseItem +import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel +import com.tangem.tangemtest._arch.structure.abstraction.KeyValue +import com.tangem.tangemtest._arch.structure.abstraction.ListViewModel /** [REDACTED_AUTHOR] */ -class AnyItem(override val id: Id, value: Any? = null) : BaseItem(AnyViewModel(value)) -class TextItem(override val id: Id, value: String? = null) : BaseItem(StringViewModel(value)) -class EditTextItem(override val id: Id, value: String? = null) : BaseItem(StringViewModel(value)) -class NumberItem(override val id: Id, value: Number? = null) : BaseItem(NumberViewModel(value)) -class BoolItem(override val id: Id, value: Boolean? = null) : BaseItem(BoolViewModel(value)) -class ListItem(override val id: Id, value: List, selectedValue: Any?) - : BaseItem(ListViewModel(ListValueWrapper(selectedValue, value)) -) +open class TypedItem(id: Id, value: D? = null) : BaseItem(id, BaseItemViewModel(value)) { + open fun getTypedData(): D? = viewModel.data as? D +} -inline fun BaseItem.getData(): T? = viewModel.data \ No newline at end of file +class TextItem(id: Id, value: String? = null) : TypedItem(id, value) +class NumberItem(id: Id, value: Number? = null) : TypedItem(id, value) +class BoolItem(id: Id, value: Boolean? = null) : TypedItem(id, value) + +class EditTextItem(id: Id, value: String? = null) : TypedItem(id, value) + +class SpinnerItem(id: Id, value: List, selectedValue: Any?) + : TypedItem(id, ListViewModel(selectedValue, value) +) \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/ViewModels.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/ViewModels.kt deleted file mode 100644 index f082577e70..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/ViewModels.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.tangem.tangemtest._arch.structure.impl - -import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel - -/** -[REDACTED_AUTHOR] - */ -open class TransitiveViewModel(value: D?) : BaseItemViewModel() { - init { - defaultData = value - } -} - -class AnyViewModel(value: Any? = null) : TransitiveViewModel(value) -class StringViewModel(value: String? = null) : TransitiveViewModel(value) -class NumberViewModel(value: Number? = null) : TransitiveViewModel(value) -class BoolViewModel(value: Boolean? = null) : TransitiveViewModel(value) -class ListViewModel(value: ListValueWrapper? = null) : TransitiveViewModel(value) { - - override fun handleDataUpdates(value: ListValueWrapper?): Boolean { - val newValue = value ?: return false - if (newValue.selectedItem == data?.selectedItem) return false - - return super.handleDataUpdates(value) - } -} - -class KeyValue(val key: String, val value: Any) -class ListValueWrapper(var selectedItem: Any?, val itemList: List) \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt index b507573e99..2ed1e1ab8f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt @@ -8,5 +8,5 @@ import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget [REDACTED_AUTHOR] */ interface ItemWidgetBuilder { - fun build(item: BaseItem<*>, parent: ViewGroup): ViewWidget? + fun build(item: BaseItem, parent: ViewGroup): ViewWidget? } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt index a524006f74..3d9a3493a5 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt @@ -2,11 +2,10 @@ package com.tangem.tangemtest._arch.widget import android.view.ViewGroup import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest._arch.structure.abstraction.Block import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock +import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget -import com.tangem.tangemtest._arch.widget.impl.LinearBlockWidget +import com.tangem.tangemtest._arch.widget.impl.LinearGroupWidget import com.tangem.tangemtest._arch.widget.impl.StubWidget /** @@ -18,20 +17,20 @@ class WidgetBuilder( fun build(item: Item, parent: ViewGroup): ViewWidget? { return when (item) { - is Block -> buildBlock(item, parent) - is BaseItem<*> -> itemBuilder.build(item, parent) - else -> StubWidget(parent) + is ItemGroup -> buildBlock(item, parent) + is BaseItem -> itemBuilder.build(item, parent) + else -> StubWidget(item.id, parent) } } - private fun buildBlock(block: Block, parent: ViewGroup): ViewWidget { - return when (block) { - is ListItemBlock -> { - val linearBlock = LinearBlockWidget(parent, block) - block.getItems().forEach { build(it, linearBlock.view as ViewGroup) } + private fun buildBlock(itemGroup: ItemGroup, parent: ViewGroup): ViewWidget { + return when (itemGroup) { + is ItemGroup -> { + val linearBlock = LinearGroupWidget(parent, itemGroup) + itemGroup.getItems().forEach { build(it, linearBlock.view as ViewGroup) } linearBlock } - else -> StubWidget(parent) + else -> StubWidget(itemGroup.id, parent) } } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt index 7fa8fd5bbb..8a220c0f1a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt @@ -4,13 +4,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.DataHolder import com.tangem.tangemtest._arch.structure.StringId -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel -import com.tangem.tangemtest.ucase.resources.MainResourceHolder -import com.tangem.tangemtest.ucase.resources.Resources -import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom +import com.tangem.tangemtest._arch.structure.StringResId +import com.tangem.tangemtest._arch.structure.abstraction.Item import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder /** @@ -18,39 +14,31 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder */ interface ViewWidget : LayoutHolder { val view: View + var item: Item + + fun getName(): String } -interface DataWidget : ViewWidget { - var dataItem: BaseItem -} - -interface BlockViewWidget : ViewWidget, DataHolder>> - -abstract class BaseWidget( +abstract class BaseViewWidget( parent: ViewGroup, - override var dataItem: BaseItem -) : ViewWidget, DataWidget { + override var item: Item +) : ViewWidget { override val view: View = inflate(getLayoutId(), parent) init { - if (dataItem.viewModel.viewState.isHiddenField) { + if (item.viewModel.viewState.isHiddenField) { view.visibility = View.GONE } } -} -abstract class BaseBlockWidget(parent: ViewGroup) : BlockViewWidget { - override val view: View = inflate(getLayoutId(), parent) -} - -fun DataWidget<*>.getResNameId(): Int = MainResourceHolder.safeGet(dataItem.id).resName - -fun DataWidget<*>.getResDescription(): Int? = MainResourceHolder.safeGet(dataItem.id).resDescription - -fun DataWidget<*>.getName(): String { - val id = dataItem.id - return if (id is StringId) id.name else view.stringFrom(getResNameId()) + override fun getName(): String { + return when (val id = item.id) { + is StringId -> id.value + is StringResId -> view.resources.getString(id.value) + else -> view.resources.getString(R.string.unknown) + } + } } internal fun inflate(id: Int, parent: ViewGroup): View { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearBlockWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearBlockWidget.kt deleted file mode 100644 index 5f1d268c6f..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearBlockWidget.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.tangem.tangemtest._arch.widget.impl - -import android.view.ViewGroup -import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel -import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock -import com.tangem.tangemtest._arch.structure.abstraction.iterate -import com.tangem.tangemtest._arch.widget.abstraction.BaseBlockWidget - -/** -[REDACTED_AUTHOR] - */ -class LinearBlockWidget( - parent: ViewGroup, - private val children: ListItemBlock -) : BaseBlockWidget(parent) { - override fun getLayoutId(): Int = R.layout.w_personilize_block - - override var viewModel: List> = listOf() - get() { - val vmList = mutableListOf>() - children.itemList.iterate { item -> - (item as? ItemViewModel<*>)?.let { vmList.add(it) } - } - return vmList.toList() - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt new file mode 100644 index 0000000000..97c8d36a35 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt @@ -0,0 +1,18 @@ +package com.tangem.tangemtest._arch.widget.impl + +import android.view.ViewGroup +import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup +import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget + +/** +[REDACTED_AUTHOR] + */ +class LinearGroupWidget( + parent: ViewGroup, + itemGroup: ItemGroup +) : BaseViewWidget(parent, itemGroup) { + + override fun getLayoutId(): Int = R.layout.w_personilize_block + +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt index 98e2bcd57a..1b832e362a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt @@ -2,13 +2,14 @@ package com.tangem.tangemtest._arch.widget.impl import android.view.ViewGroup import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel -import com.tangem.tangemtest._arch.widget.abstraction.BaseBlockWidget +import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.abstraction.BaseItem +import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel +import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget /** [REDACTED_AUTHOR] */ -class StubWidget(parent: ViewGroup) : BaseBlockWidget(parent) { +class StubWidget(id: Id, parent: ViewGroup) : BaseViewWidget(parent, BaseItem(id, BaseItemViewModel())) { override fun getLayoutId(): Int = R.layout.w_empty - override var viewModel: List> = listOf() } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt index 7a19cf981f..59ae0da2b9 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt @@ -3,6 +3,7 @@ package com.tangem.tangemtest.commons /** [REDACTED_AUTHOR] */ -fun performAction(a: A?, b: B?, action: (A, B) -> Unit) { +fun performAction(a: A?, b: B?, action: (A, B) -> Unit, onFail: (() -> Unit)? = null) { if (a != null && b != null) action(a, b) + else onFail?.invoke() } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt index 2433302a4b..5f49aa15aa 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt @@ -2,7 +2,7 @@ package com.tangem.tangemtest.ucase.domain.actions import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.PayloadHolder -import com.tangem.tangemtest._arch.structure.abstraction.findDataItem +import com.tangem.tangemtest._arch.structure.abstraction.findItem import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback import com.tangem.tangemtest.ucase.variants.TlvId @@ -11,7 +11,7 @@ import com.tangem.tangemtest.ucase.variants.TlvId */ class DepersonalizeAction : BaseAction() { override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) { - val item = attrs.itemList.findDataItem(TlvId.CardId) ?: return + val item = attrs.itemList.findItem(TlvId.CardId) ?: return val cardId = item.viewModel.data as? String ?: return attrs.cardManager.depersonalize(cardId) { handleResult(payload, it, null, attrs, callback) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt index a50bc09456..21143ddec8 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt @@ -2,7 +2,7 @@ package com.tangem.tangemtest.ucase.domain.actions import com.tangem.tangemtest._arch.structure.PayloadHolder import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.findDataItem +import com.tangem.tangemtest._arch.structure.abstraction.findItem import com.tangem.tangemtest._arch.structure.impl.EditTextItem import com.tangem.tangemtest._arch.structure.impl.NumberItem import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback @@ -11,7 +11,7 @@ import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.ItemError import com.tangem.tangemtest.ucase.variants.personalize.CardNumber import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter -import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.PersonalizeConfigToCardConfig +import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigToCardConfig import com.tangem.tangemtest.ucase.variants.personalize.dto.DefaultPersonalizationParams import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf @@ -38,7 +38,7 @@ class PersonalizeAction : BaseAction() { val manufacturer = DefaultPersonalizationParams.manufacturer() val personalizeConfig = PersonalizationConfigConverter().convert(itemList, PersonalizationConfig()) - val cardConfig = PersonalizeConfigToCardConfig().convert(personalizeConfig) + val cardConfig = PersonalizationConfigToCardConfig().convert(personalizeConfig) attrs.cardManager.personalize(cardConfig, issuer, manufacturer, acquirer) { handleResult(payload, it, null, attrs, callback) @@ -46,18 +46,18 @@ class PersonalizeAction : BaseAction() { } private fun checkSeries(itemList: List): Boolean { - val seriesItem = itemList.findDataItem(CardNumber.Series) as? EditTextItem ?: return false - val data = seriesItem.getData() ?: return false + val seriesItem = itemList.findItem(CardNumber.Series) as? EditTextItem ?: return false + val data = seriesItem.getData() as? String ?: return false seriesItem.setData(data.toUpperCase()) return data.length == 2 || data.length == 4 } private fun checkNumber(itemList: List): Boolean { - val seriesItem = itemList.findDataItem(CardNumber.Series) as? EditTextItem ?: return false - val numberItem = itemList.findDataItem(CardNumber.Number) as? NumberItem ?: return false - val seriesData = seriesItem.getData() ?: return false - val numberData = stringOf(numberItem.getData()) + val seriesItem = itemList.findItem(CardNumber.Series) as? EditTextItem ?: return false + val numberItem = itemList.findItem(CardNumber.Number) as? NumberItem ?: return false + val seriesData = seriesItem.getData() as? String ?: return false + val numberData = stringOf(numberItem.getData() as? Number) return if (seriesData.length == 2 && numberData.length > 13) false else !(seriesData.length == 4 && numberData.length > 11) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt index 18fef1d8c5..d71eaeb900 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt @@ -2,7 +2,7 @@ package com.tangem.tangemtest.ucase.domain.actions import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.PayloadHolder -import com.tangem.tangemtest._arch.structure.abstraction.findDataItem +import com.tangem.tangemtest._arch.structure.abstraction.findItem import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback import com.tangem.tangemtest.ucase.variants.TlvId import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf @@ -12,9 +12,9 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf */ class SignAction : BaseAction() { override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) { - val dataForHashing = attrs.itemList.findDataItem(TlvId.TransactionOutHash) ?: return + val dataForHashing = attrs.itemList.findItem(TlvId.TransactionOutHash) ?: return val hash = dataForHashing.getData() as? ByteArray ?: return - val cardId = attrs.itemList.findDataItem(TlvId.CardId)?.viewModel?.data ?: return + val cardId = attrs.itemList.findItem(TlvId.CardId)?.viewModel?.data ?: return attrs.cardManager.sign(arrayOf(hash), stringOf(cardId)) { handleResult(payload, it, null, attrs, callback) } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt index bfb987742d..72729d11eb 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt @@ -5,7 +5,7 @@ import com.tangem.CardManager import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.Payload import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.findDataItem +import com.tangem.tangemtest._arch.structure.abstraction.findItem import com.tangem.tangemtest.ucase.domain.actions.Action import com.tangem.tangemtest.ucase.domain.actions.AttrForAction import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback @@ -30,7 +30,7 @@ open class BaseItemsManager(protected val action: Action) : ItemsManager, Lifecy override fun itemChanged(id: Id, value: Any?, callback: AffectedItemsCallback?) { if (itemList.isEmpty()) return - val foundItem = itemList.findDataItem(id) ?: return + val foundItem = itemList.findItem(id) ?: return foundItem.setData(value) applyChangesByAffectedItems(foundItem, callback) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt index 990f2a78f4..5cf644eb32 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt @@ -4,7 +4,7 @@ import com.tangem.commands.Card import com.tangem.commands.CardStatus import com.tangem.tangemtest._arch.structure.PayloadHolder import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.findDataItem +import com.tangem.tangemtest._arch.structure.abstraction.findItem import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError @@ -18,7 +18,7 @@ import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI */ class AfterScanModifier : AfterActionModification { override fun modify(payload: PayloadHolder, taskEvent: TaskEvent<*>, itemList: List): List { - val foundItem = itemList.findDataItem(TlvId.CardId) ?: return listOf() + val foundItem = itemList.findItem(TlvId.CardId) ?: return listOf() val card = smartCast(taskEvent)?.card ?: return listOf() val actionView = payload.get(PayloadKey.actionView) as? ActionView ?: return listOf() diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt index 41bd4cd0a3..730c570be6 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt @@ -6,7 +6,7 @@ import com.tangem.common.extensions.calculateSha256 import com.tangem.common.extensions.calculateSha512 import com.tangem.tangemtest._arch.structure.PayloadHolder import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.findDataItem +import com.tangem.tangemtest._arch.structure.abstraction.findItem import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.variants.TlvId @@ -27,7 +27,7 @@ class SignScanConsequence : ItemsChangeConsequence { override fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List): List? { if (changedItem.id != TlvId.CardId) return null - val hashItem = itemList.findDataItem(TlvId.TransactionOutHash) ?: return null + val hashItem = itemList.findItem(TlvId.TransactionOutHash) ?: return null val affectedItems = mutableListOf(hashItem) val card = payload.remove(PayloadKey.card) as Card? if (card == null) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt index 8ffcb80328..e1b63c7df7 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt @@ -8,7 +8,6 @@ import com.tangem.CardManager import com.tangem.tangemtest._arch.SingleLiveEvent import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.Payload -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest._arch.structure.abstraction.iterate import com.tangem.tangemtest.commons.performAction @@ -55,11 +54,11 @@ class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif //invokes Scan, Sign etc... fun invokeMainAction() { - performAction(itemsManager, cardManager) { paramsManager, cardManager -> + performAction(itemsManager, cardManager, { paramsManager, cardManager -> paramsManager.invokeMainAction(cardManager) { response, listOfChangedParams -> notifier.handleActionResult(response, listOfChangedParams) } - } + }) } fun getItemAction(id: Id): (() -> Unit)? { @@ -74,8 +73,7 @@ class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif fun toggleDescriptionVisibility(state: Boolean) { ldItemList.value?.iterate { - val baseItem = it as? BaseItem<*> ?: return@iterate - baseItem.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE + it.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt index 44acd319b8..b9186f495a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt @@ -13,7 +13,6 @@ import com.tangem.CardManager import com.tangem.tangem_sdk_new.extensions.init import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._main.MainViewModel import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey @@ -106,9 +105,7 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView { protected open fun listenChangedItems() { actionVM.seChangedItems.observe(viewLifecycleOwner, Observer { itemList -> itemList.forEach { item -> - Log.d(this, "item changed from VM - name: ${item.id}") - val dataItem = item as? BaseItem ?: return@Observer - Log.d(this, "item changed from VM - name: ${dataItem.id}, value:${dataItem.viewModel.data}") + Log.d(this, "item changed from VM - name: ${item.id}, value:${item.viewModel.data}") paramsWidgetList.firstOrNull { it.id == item.id }?.changeParamValue(item.viewModel.data) } }) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt index 15ba1cdcba..96037984ea 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt @@ -12,8 +12,8 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest._arch.structure.impl.EditTextItem import com.tangem.tangemtest.ucase.resources.ActionType import com.tangem.tangemtest.ucase.resources.MainResourceHolder import com.tangem.tangemtest.ucase.resources.Resources @@ -29,7 +29,7 @@ class ParameterWidget( ) { val id: Id = item.id - val dataItem: BaseItem = item as BaseItem + val typedItem = item as EditTextItem var onValueChanged: ((Id, Any?) -> Unit)? = null var onActionBtnClickListener: (() -> Unit)? = null @@ -47,11 +47,11 @@ class ParameterWidget( private val tvDescription: TextView? by lazy { descriptionContainer.findViewById(R.id.tv_description) } private var actionBtnVisibilityState: Int = btnAction.visibility - private var value: Any? = dataItem.viewModel.data + private var value: Any? = typedItem.viewModel.data init { tilValue.hint = tilValue.context.getString(getResNameId()) - etValue.setText(stringOf(dataItem.viewModel.data)) + etValue.setText(stringOf(typedItem.viewModel.data)) etValue.addTextChangedListener(valueWatcher) btnAction.setOnClickListener { onActionBtnClickListener?.invoke() } btnAction.setText(getResNameId(ActionType.Scan)) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt index 49dd2faa8d..37364a0f8a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt @@ -2,7 +2,7 @@ package com.tangem.tangemtest.ucase.variants.personalize.converter import com.tangem.commands.EllipticCurve import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.impl.KeyValue +import com.tangem.tangemtest._arch.structure.abstraction.KeyValue import com.tangem.tangemtest.ucase.variants.personalize.* import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemTypes.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ItemTypes.kt similarity index 99% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemTypes.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ItemTypes.kt index 9902d38da4..238a0aeaa0 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemTypes.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ItemTypes.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo +package com.tangem.tangemtest.ucase.variants.personalize.converter import com.tangem.tangemtest.ucase.variants.personalize.* diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt index 7fbf672259..c350690412 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt @@ -1,12 +1,12 @@ package com.tangem.tangemtest.ucase.variants.personalize.converter -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.ItemsToModel -import com.tangem.tangemtest._arch.structure.abstraction.ModelConverter -import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems -import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.ItemsToPersonalizationConfig -import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.PersonalizationConfigToItems +import com.tangem.tangemtest._arch.structure.Additional +import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.abstraction.* +import com.tangem.tangemtest._arch.structure.impl.* +import com.tangem.tangemtest.ucase.variants.personalize.* import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig +import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] @@ -23,4 +23,281 @@ class PersonalizationConfigConverter : ModelConverter { override fun convert(from: PersonalizationConfig): List { return toItems.convert(from) } +} + +class ItemsToPersonalizationConfig : ItemsToModel { + protected val valuesHolder = ConfigValuesHolder() + + override fun convert(from: List, default: PersonalizationConfig): PersonalizationConfig { + valuesHolder.init(default) + mapListItems(from) + return createModel() + } + + private fun mapListItems(itemList: List) { + itemList.iterate { item -> mapItemToHolder(item) } + } + + private fun mapItemToHolder(item: Item) { + when (item) { + is ItemGroup -> mapListItems(item.itemList) + is BaseItem -> { + val defValue = valuesHolder.get(item.id) ?: return + defValue.set(item.viewModel.data) + } + } + } + + private fun createModel(): PersonalizationConfig { + val export = PersonalizationConfig() + export.series = getTyped(CardNumber.Series) + export.startNumber = getTyped(CardNumber.Number) + export.curveID = getTyped(Common.Curve) + export.blockchain = getTyped(Common.Blockchain) + export.blockchainCustom = getTyped(Common.BlockchainCustom) + export.MaxSignatures = getTyped(Common.MaxSignatures) + export.createWallet = getTyped(Common.CreateWallet) + export.SigningMethod0 = getTyped(SigningMethod.SignTx) + export.SigningMethod1 = getTyped(SigningMethod.SignTxRaw) + export.SigningMethod2 = getTyped(SigningMethod.SignValidatedTx) + export.SigningMethod3 = getTyped(SigningMethod.SignValidatedTxRaw) + export.SigningMethod4 = getTyped(SigningMethod.SignValidatedTxIssuer) + export.SigningMethod5 = getTyped(SigningMethod.SignValidatedTxRawIssuer) + export.SigningMethod6 = getTyped(SigningMethod.SignExternal) + export.pinLessFloorLimit = getTyped(SignHashExProp.PinLessFloorLimit) + export.hexCrExKey = getTyped(SignHashExProp.CryptoExKey) + export.requireTerminalCertSignature = getTyped(SignHashExProp.RequireTerminalCertSig) + export.requireTerminalTxSignature = getTyped(SignHashExProp.RequireTerminalTxSig) + export.checkPIN3onCard = getTyped(SignHashExProp.CheckPin3) + export.writeOnPersonalization = getTyped(Denomination.WriteOnPersonalize) + export.denomination = getTyped(Denomination.Denomination) + export.itsToken = getTyped(Token.ItsToken) + export.symbol = getTyped(Token.Symbol) + export.contractAddress = getTyped(Token.ContractAddress) + export.decimal = getTyped(Token.Decimal) + export.cardData = export.cardData.apply { this.product_note = getTyped(ProductMask.Note) } + export.cardData = export.cardData.apply { this.product_tag = getTyped(ProductMask.Tag) } + export.cardData = export.cardData.apply { this.product_id_card = getTyped(ProductMask.IdCard) } + export.cardData = export.cardData.apply { this.product_id_issuer = getTyped(ProductMask.IdIssuerCard) } + export.isReusable = getTyped(SettingsMask.IsReusable) + export.useActivation = getTyped(SettingsMask.NeedActivation) + export.forbidPurgeWallet = getTyped(SettingsMask.ForbidPurge) + export.allowSelectBlockchain = getTyped(SettingsMask.AllowSelectBlockchain) + export.useBlock = getTyped(SettingsMask.UseBlock) + export.oneApdu = getTyped(SettingsMask.OneApdu) + export.useCVC = getTyped(SettingsMask.UseCvc) + export.allowSwapPIN = getTyped(SettingsMask.AllowSwapPin) + export.allowSwapPIN2 = getTyped(SettingsMask.AllowSwapPin2) + export.forbidDefaultPIN = getTyped(SettingsMask.ForbidDefaultPin) + export.smartSecurityDelay = getTyped(SettingsMask.SmartSecurityDelay) + export.protectIssuerDataAgainstReplay = getTyped(SettingsMask.ProtectIssuerDataAgainstReplay) + export.skipSecurityDelayIfValidatedByIssuer = getTyped(SettingsMask.SkipSecurityDelayIfValidated) + export.skipCheckPIN2andCVCIfValidatedByIssuer = getTyped(SettingsMask.SkipPin2CvcIfValidated) + export.skipSecurityDelayIfValidatedByLinkedTerminal = getTyped(SettingsMask.SkipSecurityDelayOnLinkedTerminal) + export.restrictOverwriteIssuerDataEx = getTyped(SettingsMask.RestrictOverwriteExtraIssuerData) + export.protocolAllowUnencrypted = getTyped(SettingsMaskProtocolEnc.AllowUnencrypted) + export.protocolAllowStaticEncryption = getTyped(SettingsMaskProtocolEnc.AllowStaticEncryption) + export.useNDEF = getTyped(SettingsMaskNdef.UseNdef) + export.useDynamicNDEF = getTyped(SettingsMaskNdef.DynamicNdef) + export.disablePrecomputedNDEF = getTyped(SettingsMaskNdef.DisablePrecomputedNdef) + export.aar = getTyped(SettingsMaskNdef.Aar) + export.aarCustom = getTyped(SettingsMaskNdef.AarCustom) + export.uri = getTyped(SettingsMaskNdef.Uri) + export.PIN = getTyped(Pins.Pin) + export.PIN2 = getTyped(Pins.Pin2) + export.PIN3 = getTyped(Pins.Pin3) + export.CVC = getTyped(Pins.Cvc) + export.pauseBeforePIN2 = getTyped(Pins.PauseBeforePin2) + return export + } + + private inline fun getTyped(id: Id): Type { + return getTypedBy(valuesHolder, id)!! + } + + private inline fun getTypedBy(holder: ConfigValuesHolder, id: Id): Type? { + Log.d(this, "getTyped for id: $id") + var typedValue = holder.get(id)?.get() + + typedValue = when (typedValue) { + is ListViewModel -> typedValue.selectedItem as Type + else -> typedValue as? Type ?: null + } + return typedValue + } +} + +class PersonalizationConfigToItems : ModelToItems { + private val valuesHolder = ConfigValuesHolder() + private val itemTypes = ItemTypes() + + override fun convert(from: PersonalizationConfig): List { + valuesHolder.init(from) + val blocList = mutableListOf() + blocList.add(cardNumber()) + blocList.add(common()) + blocList.add(signingMethod()) + blocList.add(signHashExProperties()) + blocList.add(denomination()) + blocList.add(token()) + blocList.add(productMask()) + blocList.add(settingsMask()) + blocList.add(settingsMaskProtocolEnc()) + blocList.add(settingsMaskNdef()) + blocList.add(pins()) + blocList.iterate { + if (itemTypes.hiddenList.contains(it.id)) { + it.viewModel.viewState.isHiddenField = true + } + } + return blocList + } + + private fun cardNumber(): ItemGroup { + val block = createGroup(BlockId.CardNumber) + mutableListOf( + CardNumber.Series, + CardNumber.Number, + CardNumber.BatchId + ).forEach { createItem(block, it as Id) } + return block + } + + private fun common(): ItemGroup { + val block = createGroup(BlockId.Common) + mutableListOf( + Common.Curve, + Common.Blockchain, + Common.BlockchainCustom, + Common.MaxSignatures, + Common.CreateWallet + ).forEach { createItem(block, it) } + return block + } + + private fun signingMethod(): ItemGroup { + val block = createGroup(BlockId.SigningMethod) + mutableListOf( + SigningMethod.SignTx, + SigningMethod.SignTxRaw, + SigningMethod.SignValidatedTx, + SigningMethod.SignValidatedTxRaw, + SigningMethod.SignValidatedTxIssuer, + SigningMethod.SignValidatedTxRawIssuer, + SigningMethod.SignExternal + ).forEach { createItem(block, it) } + return block + } + + private fun signHashExProperties(): ItemGroup { + val block = createGroup(BlockId.SignHashExProp) + mutableListOf( + SignHashExProp.PinLessFloorLimit, + SignHashExProp.CryptoExKey, + SignHashExProp.RequireTerminalCertSig, + SignHashExProp.RequireTerminalTxSig, + SignHashExProp.CheckPin3 + ).forEach { createItem(block, it) } + return block + } + + private fun denomination(): ItemGroup { + val block = createGroup(BlockId.Denomination) + mutableListOf( + Denomination.WriteOnPersonalize, + Denomination.Denomination + ).forEach { createItem(block, it) } + return block + } + + private fun token(): ItemGroup { + val block = createGroup(BlockId.Token) + mutableListOf( + Token.ItsToken, + Token.Symbol, + Token.ContractAddress, + Token.Decimal + ).forEach { createItem(block, it) } + return block + } + + private fun productMask(): ItemGroup { + val block = createGroup(BlockId.ProdMask) + mutableListOf( + ProductMask.Note, + ProductMask.Tag, + ProductMask.IdCard, + ProductMask.IdIssuerCard + ).forEach { createItem(block, it) } + return block + } + + private fun settingsMask(): ItemGroup { + val block = createGroup(BlockId.SettingsMask) + mutableListOf( + SettingsMask.IsReusable, + SettingsMask.NeedActivation, + SettingsMask.ForbidPurge, + SettingsMask.AllowSelectBlockchain, + SettingsMask.UseBlock, + SettingsMask.OneApdu, + SettingsMask.UseCvc, + SettingsMask.AllowSwapPin, + SettingsMask.AllowSwapPin2, + SettingsMask.ForbidDefaultPin, + SettingsMask.SmartSecurityDelay, + SettingsMask.ProtectIssuerDataAgainstReplay, + SettingsMask.SkipSecurityDelayIfValidated, + SettingsMask.SkipPin2CvcIfValidated, + SettingsMask.SkipSecurityDelayOnLinkedTerminal, + SettingsMask.RestrictOverwriteExtraIssuerData + ).forEach { createItem(block, it) } + return block + } + + private fun settingsMaskProtocolEnc(): ItemGroup { + val block = createGroup(BlockId.SettingsMaskProtocolEnc) + mutableListOf( + SettingsMaskProtocolEnc.AllowUnencrypted, + SettingsMaskProtocolEnc.AllowStaticEncryption + ).forEach { createItem(block, it) } + return block + } + + private fun settingsMaskNdef(): ItemGroup { + val block = createGroup(BlockId.SettingsMaskNdef) + mutableListOf( + SettingsMaskNdef.UseNdef, + SettingsMaskNdef.DynamicNdef, + SettingsMaskNdef.DisablePrecomputedNdef, + SettingsMaskNdef.Aar, + SettingsMaskNdef.AarCustom, + SettingsMaskNdef.Uri + ).forEach { createItem(block, it) } + return block + } + + private fun pins(): ItemGroup { + val block = createGroup(BlockId.Pins) + mutableListOf(Pins.Pin, Pins.Pin2, Pins.Pin3, Pins.Cvc, Pins.PauseBeforePin2) + .forEach { createItem(block, it) } + return block + } + + private fun createGroup(id: Id): ItemGroup { + return SimpleItemGroup(id).apply { addItem(TextItem(id)) } + } + + private fun createItem(itemGroup: ItemGroup, id: Id) { + val holder = valuesHolder.get(id) ?: return + val item = when { + itemTypes.blockIdList.contains(id) -> TextItem(id, holder.get() as? String) + itemTypes.listItemList.contains(id) -> SpinnerItem(id, holder.list as List, holder.get()) + itemTypes.boolList.contains(id) -> BoolItem(id, holder.get() as? Boolean) + itemTypes.editTextList.contains(id) -> EditTextItem(id, holder.get() as? String) + itemTypes.numberList.contains(id) -> NumberItem(id, holder.get() as? Number) + else -> SimpleItemGroup(Additional.UNDEFINED) + } + itemGroup.addItem(item) + } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt new file mode 100644 index 0000000000..fa79df96e0 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt @@ -0,0 +1,113 @@ +package com.tangem.tangemtest.ucase.variants.personalize.converter + +import com.tangem.commands.CardData +import com.tangem.commands.EllipticCurve +import com.tangem.commands.ProductMaskBuilder +import com.tangem.commands.personalization.entities.CardConfig +import com.tangem.commands.personalization.entities.NdefRecord +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig +import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter +import java.util.* + +class PersonalizationConfigToCardConfig : Converter { + + override fun convert(from: PersonalizationConfig): CardConfig { + val signingMethod = com.tangem.commands.SigningMethod.build( + signHash = from.SigningMethod0, + signRaw = from.SigningMethod1, + signHashValidatedByIssuer = from.SigningMethod2, + signRawValidatedByIssuer = from.SigningMethod3, + signHashValidatedByIssuerAndWriteIssuerData = from.SigningMethod4, + signRawValidatedByIssuerAndWriteIssuerData = from.SigningMethod5, + signPos = from.SigningMethod6 + ) + + val isNote = from.cardData.product_note + val isTag = from.cardData.product_tag + val isIdCard = from.cardData.product_id_card + val isIdIssuer = from.cardData.product_id_issuer + + val productMaskBuilder = ProductMaskBuilder() + if (isNote) productMaskBuilder.add(com.tangem.commands.ProductMask.note) + if (isTag) productMaskBuilder.add(com.tangem.commands.ProductMask.tag) + if (isIdCard) productMaskBuilder.add(com.tangem.commands.ProductMask.idCard) + if (isIdIssuer) productMaskBuilder.add(com.tangem.commands.ProductMask.idIssuer) + val productMask = productMaskBuilder.build() + + var tokenSymbol: String? = null + var tokenContractAddress: String? = null + var tokenDecimal: Int? = null + if (from.itsToken) { + tokenSymbol = from.symbol + tokenContractAddress = from.contractAddress + tokenDecimal = from.decimal.toInt() + } + + val blockchain = if (from.blockchain.isNotEmpty()) from.blockchain else from.blockchainCustom + val cardData = CardData( + blockchainName = blockchain, + batchId = from.batchId, + productMask = productMask, + tokenSymbol = tokenSymbol, + tokenContractAddress = tokenContractAddress, + tokenDecimal = tokenDecimal, + issuerName = null, + manufactureDateTime = Calendar.getInstance().time, + manufacturerSignature = null) + + + val ndefs = mutableListOf() + if (from.uri.isNotEmpty()) { + ndefs.add(NdefRecord(NdefRecord.Type.URI, from.uri)) + } + when (from.aar) { + "None" -> null + "--- CUSTOM ---" -> NdefRecord(NdefRecord.Type.AAR, from.aarCustom) + else -> NdefRecord(NdefRecord.Type.AAR, from.aar) + }?.let { ndefs.add(it) } + + return CardConfig( + "Tangem", + "Tangem Test", + from.series, + from.startNumber, + 1000, + from.PIN, + from.PIN2, + from.PIN3, + from.hexCrExKey, + from.CVC, + from.pauseBeforePIN2.toInt(), + from.smartSecurityDelay, + EllipticCurve.byName(from.curveID) ?: EllipticCurve.Secp256k1, + signingMethod, + from.MaxSignatures.toInt(), + from.isReusable, + from.allowSwapPIN, + from.allowSwapPIN2, + from.useActivation, + from.useCVC, + from.useNDEF, + from.useDynamicNDEF, + from.oneApdu, + from.useBlock, + from.allowSelectBlockchain, + from.forbidPurgeWallet, + from.protocolAllowUnencrypted, + from.protocolAllowStaticEncryption, + from.protectIssuerDataAgainstReplay, + from.forbidDefaultPIN, + from.disablePrecomputedNDEF, + from.skipSecurityDelayIfValidatedByIssuer, + from.skipCheckPIN2andCVCIfValidatedByIssuer, + from.skipSecurityDelayIfValidatedByLinkedTerminal, + from.restrictOverwriteIssuerDataEx, + from.requireTerminalTxSignature, + from.requireTerminalCertSignature, + from.checkPIN3onCard, + from.createWallet, + cardData, + ndefs + ) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizationConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizationConfig.kt deleted file mode 100644 index 95fd18908d..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizationConfig.kt +++ /dev/null @@ -1,114 +0,0 @@ -package com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo - -import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.abstraction.* -import com.tangem.tangemtest._arch.structure.impl.ListValueWrapper -import com.tangem.tangemtest.ucase.variants.personalize.* -import com.tangem.tangemtest.ucase.variants.personalize.converter.ConfigValuesHolder -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig -import ru.dev.gbixahue.eu4d.lib.android.global.log.Log - -/** -[REDACTED_AUTHOR] - */ -class ItemsToPersonalizationConfig : ItemsToModel { - protected val valuesHolder = ConfigValuesHolder() - - override fun convert(from: List, default: PersonalizationConfig): PersonalizationConfig { - valuesHolder.init(default) - mapListItems(from) - return createModel() - } - - private fun mapListItems(itemList: List) { - itemList.iterate { item -> mapItemToHolder(item) } - } - - private fun mapItemToHolder(item: Item) { - when (item) { - is Block -> mapListItems(item.itemList) - is BaseItem<*> -> { - val defValue = valuesHolder.get(item.id) ?: return - defValue.set(item.viewModel.data) - } - } - } - - private fun createModel(): PersonalizationConfig { - val export = PersonalizationConfig() - export.series = getTyped(CardNumber.Series) - export.startNumber = getTyped(CardNumber.Number) - export.curveID = getTyped(Common.Curve) - export.blockchain = getTyped(Common.Blockchain) - export.blockchainCustom = getTyped(Common.BlockchainCustom) - export.MaxSignatures = getTyped(Common.MaxSignatures) - export.createWallet = getTyped(Common.CreateWallet) - export.SigningMethod0 = getTyped(SigningMethod.SignTx) - export.SigningMethod1 = getTyped(SigningMethod.SignTxRaw) - export.SigningMethod2 = getTyped(SigningMethod.SignValidatedTx) - export.SigningMethod3 = getTyped(SigningMethod.SignValidatedTxRaw) - export.SigningMethod4 = getTyped(SigningMethod.SignValidatedTxIssuer) - export.SigningMethod5 = getTyped(SigningMethod.SignValidatedTxRawIssuer) - export.SigningMethod6 = getTyped(SigningMethod.SignExternal) - export.pinLessFloorLimit = getTyped(SignHashExProp.PinLessFloorLimit) - export.hexCrExKey = getTyped(SignHashExProp.CryptoExKey) - export.requireTerminalCertSignature = getTyped(SignHashExProp.RequireTerminalCertSig) - export.requireTerminalTxSignature = getTyped(SignHashExProp.RequireTerminalTxSig) - export.checkPIN3onCard = getTyped(SignHashExProp.CheckPin3) - export.writeOnPersonalization = getTyped(Denomination.WriteOnPersonalize) - export.denomination = getTyped(Denomination.Denomination) - export.itsToken = getTyped(Token.ItsToken) - export.symbol = getTyped(Token.Symbol) - export.contractAddress = getTyped(Token.ContractAddress) - export.decimal = getTyped(Token.Decimal) - export.cardData = export.cardData.apply { this.product_note = getTyped(ProductMask.Note) } - export.cardData = export.cardData.apply { this.product_tag = getTyped(ProductMask.Tag) } - export.cardData = export.cardData.apply { this.product_id_card = getTyped(ProductMask.IdCard) } - export.cardData = export.cardData.apply { this.product_id_issuer = getTyped(ProductMask.IdIssuerCard) } - export.isReusable = getTyped(SettingsMask.IsReusable) - export.useActivation = getTyped(SettingsMask.NeedActivation) - export.forbidPurgeWallet = getTyped(SettingsMask.ForbidPurge) - export.allowSelectBlockchain = getTyped(SettingsMask.AllowSelectBlockchain) - export.useBlock = getTyped(SettingsMask.UseBlock) - export.oneApdu = getTyped(SettingsMask.OneApdu) - export.useCVC = getTyped(SettingsMask.UseCvc) - export.allowSwapPIN = getTyped(SettingsMask.AllowSwapPin) - export.allowSwapPIN2 = getTyped(SettingsMask.AllowSwapPin2) - export.forbidDefaultPIN = getTyped(SettingsMask.ForbidDefaultPin) - export.smartSecurityDelay = getTyped(SettingsMask.SmartSecurityDelay) - export.protectIssuerDataAgainstReplay = getTyped(SettingsMask.ProtectIssuerDataAgainstReplay) - export.skipSecurityDelayIfValidatedByIssuer = getTyped(SettingsMask.SkipSecurityDelayIfValidated) - export.skipCheckPIN2andCVCIfValidatedByIssuer = getTyped(SettingsMask.SkipPin2CvcIfValidated) - export.skipSecurityDelayIfValidatedByLinkedTerminal = getTyped(SettingsMask.SkipSecurityDelayOnLinkedTerminal) - export.restrictOverwriteIssuerDataEx = getTyped(SettingsMask.RestrictOverwriteExtraIssuerData) - export.protocolAllowUnencrypted = getTyped(SettingsMaskProtocolEnc.AllowUnencrypted) - export.protocolAllowStaticEncryption = getTyped(SettingsMaskProtocolEnc.AllowStaticEncryption) - export.useNDEF = getTyped(SettingsMaskNdef.UseNdef) - export.useDynamicNDEF = getTyped(SettingsMaskNdef.DynamicNdef) - export.disablePrecomputedNDEF = getTyped(SettingsMaskNdef.DisablePrecomputedNdef) - export.aar = getTyped(SettingsMaskNdef.Aar) - export.aarCustom = getTyped(SettingsMaskNdef.AarCustom) - export.uri = getTyped(SettingsMaskNdef.Uri) - export.PIN = getTyped(Pins.Pin) - export.PIN2 = getTyped(Pins.Pin2) - export.PIN3 = getTyped(Pins.Pin3) - export.CVC = getTyped(Pins.Cvc) - export.pauseBeforePIN2 = getTyped(Pins.PauseBeforePin2) - return export - } - - private inline fun getTyped(id: Id): Type { - return getTypedBy(valuesHolder, id)!! - } - - private inline fun getTypedBy(holder: ConfigValuesHolder, id: Id): Type? { - Log.d(this, "getTyped for id: $id") - var typedValue = holder.get(id)?.get() - - typedValue = when (typedValue) { - is ListValueWrapper -> typedValue.selectedItem as Type - else -> typedValue as? Type ?: null - } - return typedValue - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt deleted file mode 100644 index 30a581378f..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt +++ /dev/null @@ -1,305 +0,0 @@ -package com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo - -import com.tangem.commands.CardData -import com.tangem.commands.EllipticCurve -import com.tangem.commands.ProductMaskBuilder -import com.tangem.commands.personalization.entities.CardConfig -import com.tangem.commands.personalization.entities.NdefRecord -import com.tangem.tangemtest._arch.structure.Additional -import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.abstraction.* -import com.tangem.tangemtest._arch.structure.impl.* -import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey -import com.tangem.tangemtest.ucase.variants.personalize.* -import com.tangem.tangemtest.ucase.variants.personalize.converter.ConfigValuesHolder -import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig -import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter -import java.util.* - -/** -[REDACTED_AUTHOR] - */ -class PersonalizationConfigToItems : ModelToItems { - private val valuesHolder = ConfigValuesHolder() - private val itemTypes = ItemTypes() - - override fun convert(from: PersonalizationConfig): List { - valuesHolder.init(from) - val blocList = mutableListOf() - blocList.add(cardNumber()) - blocList.add(common()) - blocList.add(signingMethod()) - blocList.add(signHashExProperties()) - blocList.add(denomination()) - blocList.add(token()) - blocList.add(productMask()) - blocList.add(settingsMask()) - blocList.add(settingsMaskProtocolEnc()) - blocList.add(settingsMaskNdef()) - blocList.add(pins()) - val payloadBlock = ListItemBlock(Additional.JSON_TAILS) - addPayload(payloadBlock, from) - blocList.add(payloadBlock) - blocList.iterate { - if (itemTypes.hiddenList.contains(it.id)) { - (it as BaseItem<*>)?.viewModel.viewState.isHiddenField = true - } - } - return blocList - } - - private fun cardNumber(): Block { - val block = createBlock(BlockId.CardNumber) - mutableListOf( - CardNumber.Series, - CardNumber.Number, - CardNumber.BatchId - ).forEach { createItem(block, it as Id) } - return block - } - - private fun common(): Block { - val block = createBlock(BlockId.Common) - mutableListOf( - Common.Curve, - Common.Blockchain, - Common.BlockchainCustom, - Common.MaxSignatures, - Common.CreateWallet - ).forEach { createItem(block, it) } - return block - } - - private fun signingMethod(): Block { - val block = createBlock(BlockId.SigningMethod) - mutableListOf( - SigningMethod.SignTx, - SigningMethod.SignTxRaw, - SigningMethod.SignValidatedTx, - SigningMethod.SignValidatedTxRaw, - SigningMethod.SignValidatedTxIssuer, - SigningMethod.SignValidatedTxRawIssuer, - SigningMethod.SignExternal - ).forEach { createItem(block, it) } - return block - } - - private fun signHashExProperties(): Block { - val block = createBlock(BlockId.SignHashExProp) - mutableListOf( - SignHashExProp.PinLessFloorLimit, - SignHashExProp.CryptoExKey, - SignHashExProp.RequireTerminalCertSig, - SignHashExProp.RequireTerminalTxSig, - SignHashExProp.CheckPin3 - ).forEach { createItem(block, it) } - return block - } - - private fun denomination(): Block { - val block = createBlock(BlockId.Denomination) - mutableListOf( - Denomination.WriteOnPersonalize, - Denomination.Denomination - ).forEach { createItem(block, it) } - return block - } - - private fun token(): Block { - val block = createBlock(BlockId.Token) - mutableListOf( - Token.ItsToken, - Token.Symbol, - Token.ContractAddress, - Token.Decimal - ).forEach { createItem(block, it) } - return block - } - - private fun productMask(): Block { - val block = createBlock(BlockId.ProdMask) - mutableListOf( - ProductMask.Note, - ProductMask.Tag, - ProductMask.IdCard, - ProductMask.IdIssuerCard - ).forEach { createItem(block, it) } - return block - } - - private fun settingsMask(): Block { - val block = createBlock(BlockId.SettingsMask) - mutableListOf( - SettingsMask.IsReusable, - SettingsMask.NeedActivation, - SettingsMask.ForbidPurge, - SettingsMask.AllowSelectBlockchain, - SettingsMask.UseBlock, - SettingsMask.OneApdu, - SettingsMask.UseCvc, - SettingsMask.AllowSwapPin, - SettingsMask.AllowSwapPin2, - SettingsMask.ForbidDefaultPin, - SettingsMask.SmartSecurityDelay, - SettingsMask.ProtectIssuerDataAgainstReplay, - SettingsMask.SkipSecurityDelayIfValidated, - SettingsMask.SkipPin2CvcIfValidated, - SettingsMask.SkipSecurityDelayOnLinkedTerminal, - SettingsMask.RestrictOverwriteExtraIssuerData - ).forEach { createItem(block, it) } - return block - } - - private fun settingsMaskProtocolEnc(): Block { - val block = createBlock(BlockId.SettingsMaskProtocolEnc) - mutableListOf( - SettingsMaskProtocolEnc.AllowUnencrypted, - SettingsMaskProtocolEnc.AllowStaticEncryption - ).forEach { createItem(block, it) } - return block - } - - private fun settingsMaskNdef(): Block { - val block = createBlock(BlockId.SettingsMaskNdef) - mutableListOf( - SettingsMaskNdef.UseNdef, - SettingsMaskNdef.DynamicNdef, - SettingsMaskNdef.DisablePrecomputedNdef, - SettingsMaskNdef.Aar, - SettingsMaskNdef.AarCustom, - SettingsMaskNdef.Uri - ).forEach { createItem(block, it) } - return block - } - - private fun pins(): Block { - val block = createBlock(BlockId.Pins) - mutableListOf(Pins.Pin, Pins.Pin2, Pins.Pin3, Pins.Cvc, Pins.PauseBeforePin2) - .forEach { createItem(block, it) } - return block - } - - private fun createBlock(id: Id): ListItemBlock { - return ListItemBlock(id).apply { addItem(TextItem(id)) } - } - - private fun addPayload(block: Block, from: PersonalizationConfig) { - block.payload[PayloadKey.incomingJson] = from - } - - private fun createItem(block: ListItemBlock, id: Id) { - val holder = valuesHolder.get(id) ?: return - val item = when { - itemTypes.blockIdList.contains(id) -> TextItem(id, holder.get() as? String) - itemTypes.listItemList.contains(id) -> ListItem(id, holder.list as List, holder.get()) - itemTypes.boolList.contains(id) -> BoolItem(id, holder.get() as? Boolean) - itemTypes.editTextList.contains(id) -> EditTextItem(id, holder.get() as? String) - itemTypes.numberList.contains(id) -> NumberItem(id, holder.get() as? Number) - else -> ListItemBlock(Additional.UNDEFINED) - } - block.addItem(item) - } -} - -class PersonalizeConfigToCardConfig : Converter { - - override fun convert(from: PersonalizationConfig): CardConfig { - val signingMethod = com.tangem.commands.SigningMethod.build( - signHash = from.SigningMethod0, - signRaw = from.SigningMethod1, - signHashValidatedByIssuer = from.SigningMethod2, - signRawValidatedByIssuer = from.SigningMethod3, - signHashValidatedByIssuerAndWriteIssuerData = from.SigningMethod4, - signRawValidatedByIssuerAndWriteIssuerData = from.SigningMethod5, - signPos = from.SigningMethod6 - ) - - val isNote = from.cardData.product_note - val isTag = from.cardData.product_tag - val isIdCard = from.cardData.product_id_card - val isIdIssuer = from.cardData.product_id_issuer - - val productMaskBuilder = ProductMaskBuilder() - if (isNote) productMaskBuilder.add(com.tangem.commands.ProductMask.note) - if (isTag) productMaskBuilder.add(com.tangem.commands.ProductMask.tag) - if (isIdCard) productMaskBuilder.add(com.tangem.commands.ProductMask.idCard) - if (isIdIssuer) productMaskBuilder.add(com.tangem.commands.ProductMask.idIssuer) - val productMask = productMaskBuilder.build() - - var tokenSymbol: String? = null - var tokenContractAddress: String? = null - var tokenDecimal: Int? = null - if (from.itsToken) { - tokenSymbol = from.symbol - tokenContractAddress = from.contractAddress - tokenDecimal = from.decimal.toInt() - } - - val blockchain = if (from.blockchain.isNotEmpty()) from.blockchain else from.blockchainCustom - val cardData = CardData( - blockchainName = blockchain, - batchId = from.batchId, - productMask = productMask, - tokenSymbol = tokenSymbol, - tokenContractAddress = tokenContractAddress, - tokenDecimal = tokenDecimal, - issuerName = null, - manufactureDateTime = Calendar.getInstance().time, - manufacturerSignature = null) - - - val ndefs = mutableListOf() - if (from.uri.isNotEmpty()) { - ndefs.add(NdefRecord(NdefRecord.Type.URI, from.uri)) - } - when (from.aar) { - "None" -> null - "--- CUSTOM ---" -> NdefRecord(NdefRecord.Type.AAR, from.aarCustom) - else -> NdefRecord(NdefRecord.Type.AAR, from.aar) - }?.let { ndefs.add(it) } - - return CardConfig( - "Tangem", - "Tangem Test", - from.series, - from.startNumber, - 1000, - from.PIN, - from.PIN2, - from.PIN3, - from.hexCrExKey, - from.CVC, - from.pauseBeforePIN2.toInt(), - from.smartSecurityDelay, - EllipticCurve.byName(from.curveID) ?: EllipticCurve.Secp256k1, - signingMethod, - from.MaxSignatures.toInt(), - from.isReusable, - from.allowSwapPIN, - from.allowSwapPIN2, - from.useActivation, - from.useCVC, - from.useNDEF, - from.useDynamicNDEF, - from.oneApdu, - from.useBlock, - from.allowSelectBlockchain, - from.forbidPurgeWallet, - from.protocolAllowUnencrypted, - from.protocolAllowStaticEncryption, - from.protectIssuerDataAgainstReplay, - from.forbidDefaultPIN, - from.disablePrecomputedNDEF, - from.skipSecurityDelayIfValidatedByIssuer, - from.skipCheckPIN2andCVCIfValidatedByIssuer, - from.skipSecurityDelayIfValidatedByLinkedTerminal, - from.restrictOverwriteIssuerDataEx, - from.requireTerminalTxSignature, - from.requireTerminalCertSignature, - from.checkPIN3onCard, - from.createWallet, - cardData, - ndefs - ) - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt new file mode 100644 index 0000000000..60ab69c243 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt @@ -0,0 +1,28 @@ +package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets + +import android.view.ViewGroup +import com.tangem.tangemtest._arch.structure.StringId +import com.tangem.tangemtest._arch.structure.StringResId +import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget +import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget +import com.tangem.tangemtest.ucase.resources.MainResourceHolder +import com.tangem.tangemtest.ucase.resources.Resources +import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom + +/** +[REDACTED_AUTHOR] + */ +abstract class BaseAppWidget(parent: ViewGroup, item: Item): BaseViewWidget(parent, item) { + override fun getName(): String { + return when (val id = item.id) { + is StringId -> id.value + is StringResId -> view.stringFrom(id.value) + else -> view.stringFrom(getResNameId()) + } + } +} + +fun ViewWidget.getResNameId(): Int = MainResourceHolder.safeGet(item.id).resName + +fun ViewWidget.getResDescription(): Int? = MainResourceHolder.safeGet(item.id).resDescription \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt index 9dfff32c48..0e49f54ec5 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt @@ -5,29 +5,27 @@ import android.widget.TextView import androidx.transition.AutoTransition import androidx.transition.TransitionManager import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest._arch.widget.abstraction.BaseWidget -import com.tangem.tangemtest._arch.widget.abstraction.getResDescription +import com.tangem.tangemtest._arch.structure.abstraction.Item import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ -abstract class DescriptionWidget( +abstract class DescriptionWidget( parent: ViewGroup, - data: BaseItem -) : BaseWidget(parent, data) { + item: Item +) : BaseAppWidget(parent, item) { private val descriptionContainer: ViewGroup by lazy { view.findViewById(R.id.container_description) } private val tvDescription: TextView? by lazy { descriptionContainer.findViewById(R.id.tv_description) } init { - Log.d(this, "init id: ${dataItem.id}") + Log.d(this, "init id: ${item.id}") initDescriptionWidget() } private fun initDescriptionWidget() { - dataItem.viewModel.viewState.onDescriptionVisibilityChanged = { changeDescriptionVisibility(it) } + item.viewModel.viewState.onDescriptionVisibilityChanged = { changeDescriptionVisibility(it) } } protected open fun changeDescriptionVisibility(state: Int) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt index 9cb1061414..df0951947d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt @@ -7,14 +7,17 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.EditTextItem -import com.tangem.tangemtest._arch.widget.abstraction.getName import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf /** [REDACTED_AUTHOR] */ -class EditTextWidget(parent: ViewGroup, data: EditTextItem) : DescriptionWidget(parent, data) { +class EditTextWidget( + parent: ViewGroup, + private val typedItem: EditTextItem +) : DescriptionWidget(parent, typedItem) { + override fun getLayoutId(): Int = R.layout.w_personalize_item_edit_text private val tilItem = view.findViewById(R.id.til_item) @@ -22,7 +25,7 @@ class EditTextWidget(parent: ViewGroup, data: EditTextItem) : DescriptionWidget< private val watcher = object : TextWatcher { override fun afterTextChanged(s: Editable?) { - dataItem.viewModel.updateDataByView(stringOf(s)) + typedItem.viewModel.updateDataByView(stringOf(s)) } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} @@ -31,9 +34,9 @@ class EditTextWidget(parent: ViewGroup, data: EditTextItem) : DescriptionWidget< init { tilItem.hint = getName() - etItem.setText(dataItem.getData()) + etItem.setText(typedItem.getTypedData()) etItem.addTextChangedListener(watcher) - dataItem.viewModel.onDataUpdated = { silentUpdate(it) } + item.viewModel.onDataUpdated = { silentUpdate(it as? String) } } private fun silentUpdate(value: String?) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/GroupTitleWidget.kt similarity index 72% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/GroupTitleWidget.kt index 4b0837723b..27167508ad 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BlockHeadWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/GroupTitleWidget.kt @@ -4,12 +4,11 @@ import android.view.ViewGroup import android.widget.TextView import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.TextItem -import com.tangem.tangemtest._arch.widget.abstraction.getName /** [REDACTED_AUTHOR] */ -class BlockHeadWidget(parent: ViewGroup, data: TextItem) : DescriptionWidget(parent, data) { +class GroupTitleWidget(parent: ViewGroup, data: TextItem) : DescriptionWidget(parent, data) { override fun getLayoutId(): Int = R.layout.w_personalize_item_text private val tvName = view.findViewById(R.id.tv_name) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt index e2702465a4..61cab1f430 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt @@ -8,7 +8,6 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.NumberItem -import com.tangem.tangemtest._arch.widget.abstraction.getName import com.tangem.tangemtest.ucase.variants.personalize.CardNumber import ru.dev.gbixahue.eu4d.lib.android._android.views.addInputFilter import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd @@ -17,7 +16,11 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf /** [REDACTED_AUTHOR] */ -class NumberWidget(parent: ViewGroup, data: NumberItem) : DescriptionWidget(parent, data) { +class NumberWidget( + parent: ViewGroup, + private val typedItem: NumberItem +) : DescriptionWidget(parent, typedItem) { + override fun getLayoutId(): Int = R.layout.w_personalize_item_number private val tilItem = view.findViewById(R.id.til_item) @@ -25,7 +28,7 @@ class NumberWidget(parent: ViewGroup, data: NumberItem) : DescriptionWidget, parent: ViewGroup): ViewWidget? { + override fun build(item: BaseItem, parent: ViewGroup): ViewWidget? { return when (item) { - is TextItem -> BlockHeadWidget(parent, item) + is TextItem -> GroupTitleWidget(parent, item) is EditTextItem -> EditTextWidget(parent, item) is NumberItem -> NumberWidget(parent, item) is BoolItem -> SwitchWidget(parent, item) - is ListItem -> SpinnerWidget(parent, item) + is SpinnerItem -> SpinnerWidget(parent, item) else -> null } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt index d4e2b2fb40..757634df6d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt @@ -7,20 +7,23 @@ import android.widget.BaseAdapter import android.widget.Spinner import android.widget.TextView import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.impl.KeyValue -import com.tangem.tangemtest._arch.structure.impl.ListItem -import com.tangem.tangemtest._arch.structure.impl.ListValueWrapper -import com.tangem.tangemtest._arch.widget.abstraction.getName +import com.tangem.tangemtest._arch.structure.abstraction.KeyValue +import com.tangem.tangemtest._arch.structure.abstraction.ListViewModel +import com.tangem.tangemtest._arch.structure.impl.SpinnerItem import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf /** [REDACTED_AUTHOR] */ -class SpinnerWidget(parent: ViewGroup, listItem: ListItem) : DescriptionWidget(parent, listItem) { +class SpinnerWidget( + parent: ViewGroup, + private val typedItem: SpinnerItem +) : DescriptionWidget(parent, typedItem) { + override fun getLayoutId(): Int = R.layout.w_personalize_item_spinner - private val data: ListValueWrapper = listItem.getData()!! + private val data: ListViewModel = typedItem.getTypedData()!! private val spItem = view.findViewById(R.id.sp_item) private val spAdapter = SpItemAdapter(data.itemList) @@ -30,7 +33,7 @@ class SpinnerWidget(parent: ViewGroup, listItem: ListItem) : DescriptionWidget?, view: View?, position: Int, id: Long) { data.selectedItem = data.itemList[position].value - dataItem.viewModel.updateDataByView(data) + typedItem.viewModel.updateDataByView(data) } } @@ -42,15 +45,14 @@ class SpinnerWidget(parent: ViewGroup, listItem: ListItem) : DescriptionWidget item.value == selectedItem }?.let { - val position = itemList.indexOf(it) - spItem.setSelection(position) - } - spItem.onItemSelectedListener = onItemSelectedListener + typedItem.viewModel.onDataUpdated = { + val selectedItem = it as? String + spItem.onItemSelectedListener = null + data.itemList.firstOrNull { item -> item.value == selectedItem }?.let { keyValue -> + val position = data.itemList.indexOf(keyValue) + spItem.setSelection(position) } + spItem.onItemSelectedListener = onItemSelectedListener } } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt index 015ea477b2..ffa0b6879b 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt @@ -5,27 +5,30 @@ import android.widget.CompoundButton import androidx.appcompat.widget.SwitchCompat import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.BoolItem -import com.tangem.tangemtest._arch.widget.abstraction.getName /** [REDACTED_AUTHOR] */ -class SwitchWidget(parent: ViewGroup, data: BoolItem) : DescriptionWidget(parent, data) { +class SwitchWidget( + parent: ViewGroup, + private val typedItem: BoolItem +) : DescriptionWidget(parent, typedItem) { + override fun getLayoutId(): Int = R.layout.w_personalize_item_switch private val switchItem = view.findViewById(R.id.sw_item) private val changeListener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> - dataItem.viewModel.updateDataByView(isChecked) + typedItem.viewModel.updateDataByView(isChecked) } init { switchItem.text = getName() - switchItem.isChecked = dataItem.getData() ?: false + switchItem.isChecked = typedItem.getTypedData() ?: false switchItem.setOnCheckedChangeListener(changeListener) - dataItem.viewModel.onDataUpdated = { + typedItem.viewModel.onDataUpdated = { switchItem.setOnCheckedChangeListener(null) - switchItem.isChecked = it ?: false + switchItem.isChecked = it as? Boolean ?: false switchItem.setOnCheckedChangeListener(changeListener) } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt index ced5ffa144..50e8df7aa2 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt @@ -2,7 +2,6 @@ package com.tangem.tangemtest.ucase.variants.responses import android.view.View import androidx.lifecycle.ViewModel -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems import com.tangem.tangemtest._arch.structure.abstraction.iterate @@ -30,8 +29,7 @@ class ResponseViewModel : ViewModel() { fun toggleDescriptionVisibility(state: Boolean) { itemList?.iterate { - val baseItem = it as? BaseItem<*> ?: return@iterate - baseItem.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE + it.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE } } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt index 492989ebe1..007cf07543 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt @@ -6,8 +6,9 @@ import com.tangem.commands.SettingsMask import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.StringId import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock +import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems +import com.tangem.tangemtest._arch.structure.abstraction.SimpleItemGroup import com.tangem.tangemtest._arch.structure.impl.BoolItem import com.tangem.tangemtest._arch.structure.impl.TextItem import com.tangem.tangemtest.ucase.variants.personalize.BlockId @@ -31,55 +32,53 @@ class CardConverter : ModelToItems { } private fun simpleFields(from: Card): Item { - val block = createBlock(BlockId.Common) - block.addItem(TextItem(CardId.cardId, from.cardId)) - block.addItem(TextItem(CardId.manufacturerName, from.manufacturerName)) - block.addItem(TextItem(CardId.status, stringOf(from.status))) - block.addItem(TextItem(CardId.firmwareVersion, from.firmwareVersion)) - block.addItem(TextItem(CardId.cardPublicKey, stringOf(from.cardPublicKey))) - block.addItem(TextItem(CardId.issuerPublicKey, stringOf(from.issuerPublicKey))) - block.addItem(TextItem(CardId.curve, stringOf(from.curve))) - block.addItem(TextItem(CardId.maxSignatures, stringOf(from.maxSignatures))) - block.addItem(TextItem(CardId.signingMethod, stringOf(from.signingMethod))) - block.addItem(TextItem(CardId.pauseBeforePin2, stringOf(from.pauseBeforePin2))) - block.addItem(TextItem(CardId.walletPublicKey, stringOf(from.walletPublicKey))) - block.addItem(TextItem(CardId.walletRemainingSignatures, stringOf(from.walletRemainingSignatures))) - block.addItem(TextItem(CardId.walletSignedHashes, stringOf(from.walletSignedHashes))) - block.addItem(TextItem(CardId.health, stringOf(from.health))) - block.addItem(TextItem(CardId.isActivated, stringOf(from.isActivated))) - block.addItem(TextItem(CardId.activationSeed, stringOf(from.activationSeed))) - block.addItem(TextItem(CardId.paymentFlowVersion, stringOf(from.paymentFlowVersion))) - block.addItem(TextItem(CardId.userCounter, stringOf(from.userCounter))) + val group = createGroup(BlockId.Common) + group.addItem(TextItem(CardId.cardId, from.cardId)) + group.addItem(TextItem(CardId.manufacturerName, from.manufacturerName)) + group.addItem(TextItem(CardId.status, stringOf(from.status))) + group.addItem(TextItem(CardId.firmwareVersion, from.firmwareVersion)) + group.addItem(TextItem(CardId.cardPublicKey, stringOf(from.cardPublicKey))) + group.addItem(TextItem(CardId.issuerPublicKey, stringOf(from.issuerPublicKey))) + group.addItem(TextItem(CardId.curve, stringOf(from.curve))) + group.addItem(TextItem(CardId.maxSignatures, stringOf(from.maxSignatures))) + group.addItem(TextItem(CardId.signingMethod, stringOf(from.signingMethod))) + group.addItem(TextItem(CardId.pauseBeforePin2, stringOf(from.pauseBeforePin2))) + group.addItem(TextItem(CardId.walletPublicKey, stringOf(from.walletPublicKey))) + group.addItem(TextItem(CardId.walletRemainingSignatures, stringOf(from.walletRemainingSignatures))) + group.addItem(TextItem(CardId.walletSignedHashes, stringOf(from.walletSignedHashes))) + group.addItem(TextItem(CardId.health, stringOf(from.health))) + group.addItem(TextItem(CardId.isActivated, stringOf(from.isActivated))) + group.addItem(TextItem(CardId.activationSeed, stringOf(from.activationSeed))) + group.addItem(TextItem(CardId.paymentFlowVersion, stringOf(from.paymentFlowVersion))) + group.addItem(TextItem(CardId.userCounter, stringOf(from.userCounter))) // block.addItem(TextItem(CardId.UserProtectedCounter, stringOf(from.userProtectedCounter))) - return block + return group } private fun cardData(from: Card): Item { - val block = createBlock(BlockId.Common) - val data = from.cardData ?: return block - - val itemList = block.itemList - itemList.add(TextItem(CardDataId.batchId, data.batchId)) + val group = createGroup(BlockId.Common) + val data = from.cardData ?: return group + group.addItem(TextItem(CardDataId.batchId, data.batchId)) // Format: Year (2 bytes) | Month (1 byte) | Day (1 byte) - itemList.add(TextItem(CardDataId.manufactureDateTime, stringOf(data.manufactureDateTime))) - itemList.add(TextItem(CardDataId.issuerName, data.issuerName)) - itemList.add(TextItem(CardDataId.blockchainName, data.blockchainName)) - itemList.add(TextItem(CardDataId.manufacturerSignature, stringOf(data.manufacturerSignature))) - itemList.add(TextItem(CardDataId.productMask, stringOf(data.productMask))) - itemList.add(TextItem(CardDataId.tokenSymbol, data.tokenSymbol)) - itemList.add(TextItem(CardDataId.tokenContractAddress, data.tokenContractAddress)) - itemList.add(TextItem(CardDataId.tokenDecimal, data.tokenSymbol)) + group.addItem(TextItem(CardDataId.manufactureDateTime, stringOf(data.manufactureDateTime))) + group.addItem(TextItem(CardDataId.issuerName, data.issuerName)) + group.addItem(TextItem(CardDataId.blockchainName, data.blockchainName)) + group.addItem(TextItem(CardDataId.manufacturerSignature, stringOf(data.manufacturerSignature))) + group.addItem(TextItem(CardDataId.productMask, stringOf(data.productMask))) + group.addItem(TextItem(CardDataId.tokenSymbol, data.tokenSymbol)) + group.addItem(TextItem(CardDataId.tokenContractAddress, data.tokenContractAddress)) + group.addItem(TextItem(CardDataId.tokenDecimal, data.tokenSymbol)) - return block + return group } private fun settingsMask(from: SettingsMask?): Item { - val block = createBlock(CardId.settingsMask) - val data = from ?: return block + val group = createGroup(CardId.settingsMask) + val data = from ?: return group - Settings.values().forEach { block.addItem(BoolItem(StringId(it.name), data.contains(it))) } - return block + Settings.values().forEach { group.addItem(BoolItem(StringId(it.name), data.contains(it))) } + return group } - private fun createBlock(id: Id): ListItemBlock = ListItemBlock(id).apply { addItem(TextItem(id)) } + private fun createGroup(id: Id): ItemGroup = SimpleItemGroup(id).apply { addItem(TextItem(id)) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt index 5350ab0135..a988a93948 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt @@ -4,21 +4,24 @@ import android.view.ViewGroup import com.google.android.material.checkbox.MaterialCheckBox import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.BoolItem -import com.tangem.tangemtest._arch.widget.abstraction.getName import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom /** [REDACTED_AUTHOR] */ -class CheckBoxWidget(parent: ViewGroup, private val boolItem: BoolItem) : DescriptionWidget(parent, boolItem) { +class CheckBoxWidget( + parent: ViewGroup, + private val typedItem: BoolItem +) : DescriptionWidget(parent, typedItem) { + override fun getLayoutId(): Int = R.layout.w_response_item_checkbox private val switchItem = view.findViewById(R.id.sw_item) init { switchItem.text = getName() - switchItem.isChecked = dataItem.getData() ?: false + switchItem.isChecked = typedItem.getData() ?: false switchItem.isEnabled = false switchItem.setTextColor(switchItem.colorFrom(R.color.action_name)) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt index cde044dc2c..051974e674 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt @@ -11,7 +11,7 @@ import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget [REDACTED_AUTHOR] */ class ResponseItemBuilder : ItemWidgetBuilder { - override fun build(item: BaseItem<*>, parent: ViewGroup): ViewWidget? { + override fun build(item: BaseItem, parent: ViewGroup): ViewWidget? { return when (item) { is TextItem -> ResponseTextWidget(parent, item) is BoolItem -> CheckBoxWidget(parent, item) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt index 468b9963e7..a0d546f973 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt @@ -8,13 +8,16 @@ import android.view.ViewGroup import android.widget.TextView import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.TextItem -import com.tangem.tangemtest._arch.widget.abstraction.getName import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget /** [REDACTED_AUTHOR] */ -class ResponseTextWidget(parent: ViewGroup, private val textItem: TextItem) : DescriptionWidget(parent, textItem) { +class ResponseTextWidget( + parent: ViewGroup, + private val typedItem: TextItem +) : DescriptionWidget(parent, typedItem) { + override fun getLayoutId(): Int = R.layout.w_response_item private val tvName: TextView = view.findViewById(R.id.tv_name) @@ -25,7 +28,7 @@ class ResponseTextWidget(parent: ViewGroup, private val textItem: TextItem) : De } private fun initWidgets() { - val data = textItem.getData() + val data = typedItem.getData() as? String if (data == null || data.isEmpty()) { view.visibility = View.GONE return @@ -38,7 +41,7 @@ class ResponseTextWidget(parent: ViewGroup, private val textItem: TextItem) : De val clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager ?: return@setOnClickListener - val clip: ClipData = ClipData.newPlainText("FieldValue", "${dataItem.getData()}") + val clip: ClipData = ClipData.newPlainText("FieldValue", "$data") clipboard.setPrimaryClip(clip) } } From acd023b2f540d9546af64efb6984bd7250bcc81b Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 9 Apr 2020 20:11:20 +0300 Subject: [PATCH 16/19] Updated on 2026-08-14 --- .../structure/abstraction/ItemViewModel.kt | 15 ++++--- .../tangemtest/_arch/structure/impl/Items.kt | 38 ++++++++++++------ .../_arch/widget/abstraction/ViewWidget.kt | 20 +++++++++- .../PersonalizationConfigConverter.kt | 2 +- .../personalize/ui/widgets/SpinnerWidget.kt | 32 +++++++-------- .../responses/converter/CardConverter.kt | 40 ++++++++++++++----- .../responses/ui/widget/ResponseTextWidget.kt | 6 --- tangem-demo/src/main/res/values/colors.xml | 4 ++ 8 files changed, 106 insertions(+), 51 deletions(-) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt index d298f84f93..8c548ee17c 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt @@ -13,8 +13,10 @@ typealias SafeValueChange = (V) -> Unit class KeyValue(val key: String, val value: Any) -class ViewState { - var isHiddenField = false +class ViewState( + var isHidden: Boolean = false, + var backgroundColor: Int? = -1 +) { var descriptionVisibility: Int = 0x00000008 set(value) { @@ -34,9 +36,11 @@ interface ItemViewModel : PayloadHolder { fun updateDataByView(data: Any?) } -open class BaseItemViewModel(value: Any? = null) : ItemViewModel { +open class BaseItemViewModel( + value: Any? = null, + override val viewState: ViewState = ViewState() +) : ItemViewModel { - override val viewState: ViewState = ViewState() override val payload: Payload = mutableMapOf() // Don't update it directly from a View. Use for it updateDataByView() @@ -75,6 +79,7 @@ open class BaseItemViewModel(value: Any? = null) : ItemViewModel { } class ListViewModel( + val itemList: List, var selectedItem: Any?, - val itemList: List + override val viewState: ViewState = ViewState() ) : BaseItemViewModel(selectedItem) \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt index 923f58f94a..e402650802 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/Items.kt @@ -1,25 +1,39 @@ package com.tangem.tangemtest._arch.structure.impl import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel -import com.tangem.tangemtest._arch.structure.abstraction.KeyValue -import com.tangem.tangemtest._arch.structure.abstraction.ListViewModel +import com.tangem.tangemtest._arch.structure.abstraction.* /** [REDACTED_AUTHOR] */ -open class TypedItem(id: Id, value: D? = null) : BaseItem(id, BaseItemViewModel(value)) { +open class TypedItem(id: Id, viewModel: ItemViewModel) : BaseItem(id, viewModel) { open fun getTypedData(): D? = viewModel.data as? D } -class TextItem(id: Id, value: String? = null) : TypedItem(id, value) -class NumberItem(id: Id, value: Number? = null) : TypedItem(id, value) -class BoolItem(id: Id, value: Boolean? = null) : TypedItem(id, value) +class TextItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, value: String? = null, viewState: ViewState = ViewState()) + : this(id, BaseItemViewModel(value, viewState)) +} -class EditTextItem(id: Id, value: String? = null) : TypedItem(id, value) +class NumberItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, value: Number? = null, viewState: ViewState = ViewState()) + : this(id, BaseItemViewModel(value, viewState)) +} -class SpinnerItem(id: Id, value: List, selectedValue: Any?) - : TypedItem(id, ListViewModel(selectedValue, value) -) \ No newline at end of file +class BoolItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, value: Boolean? = null, viewState: ViewState = ViewState()) + : this(id, BaseItemViewModel(value, viewState)) +} + + +class EditTextItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, value: String? = null, viewState: ViewState = ViewState()) + : this(id, BaseItemViewModel(value, viewState)) +} + + +class SpinnerItem(id: Id, viewModel: ListViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, list: List, selectedValue: Any?, viewState: ViewState = ViewState()) + : this(id, ListViewModel(list, selectedValue, viewState)) +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt index 8a220c0f1a..9047cdacc1 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt @@ -1,12 +1,16 @@ package com.tangem.tangemtest._arch.widget.abstraction +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.ColorRes import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.StringId import com.tangem.tangemtest._arch.structure.StringResId import com.tangem.tangemtest._arch.structure.abstraction.Item +import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder /** @@ -17,6 +21,7 @@ interface ViewWidget : LayoutHolder { var item: Item fun getName(): String + fun setBackgroundColor(@ColorRes colorId: Int?) } abstract class BaseViewWidget( @@ -25,10 +30,14 @@ abstract class BaseViewWidget( ) : ViewWidget { override val view: View = inflate(getLayoutId(), parent) + private var defaultBackground: Drawable = view.background + init { - if (item.viewModel.viewState.isHiddenField) { + if (item.viewModel.viewState.isHidden) { view.visibility = View.GONE + } else { + setBackgroundColor(item.viewModel.viewState.backgroundColor) } } @@ -39,6 +48,15 @@ abstract class BaseViewWidget( else -> view.resources.getString(R.string.unknown) } } + + override fun setBackgroundColor(colorId: Int?) { + val background = when { + colorId == null -> null + colorId == -1 -> defaultBackground + else -> ColorDrawable(view.colorFrom(colorId)) + } + view.background = background + } } internal fun inflate(id: Int, parent: ViewGroup): View { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt index c350690412..cd0c912920 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt @@ -147,7 +147,7 @@ class PersonalizationConfigToItems : ModelToItems { blocList.add(pins()) blocList.iterate { if (itemTypes.hiddenList.contains(it.id)) { - it.viewModel.viewState.isHiddenField = true + it.viewModel.viewState.isHidden = true } } return blocList diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt index 757634df6d..d3e06d96cf 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt @@ -18,41 +18,41 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf */ class SpinnerWidget( parent: ViewGroup, - private val typedItem: SpinnerItem + typedItem: SpinnerItem ) : DescriptionWidget(parent, typedItem) { override fun getLayoutId(): Int = R.layout.w_personalize_item_spinner - private val data: ListViewModel = typedItem.getTypedData()!! + private val viewModel: ListViewModel = typedItem.viewModel as ListViewModel - private val spItem = view.findViewById(R.id.sp_item) - private val spAdapter = SpItemAdapter(data.itemList) + private val spinner = view.findViewById(R.id.sp_item) + private val spAdapter = SpItemAdapter(viewModel.itemList) private val onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onNothingSelected(parent: AdapterView<*>?) {} override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - data.selectedItem = data.itemList[position].value - typedItem.viewModel.updateDataByView(data) + viewModel.selectedItem = viewModel.itemList[position].value + item.viewModel.updateDataByView(viewModel) } } init { val name = view.findViewById(R.id.tv_name) name.text = getName() - spItem.adapter = spAdapter - spAdapter.getItemPosition(stringOf(data.selectedItem))?.let { - spItem.setSelection(it) + spinner.adapter = spAdapter + spAdapter.getItemPosition(stringOf(viewModel.selectedItem))?.let { + spinner.setSelection(it) } - spItem.onItemSelectedListener = onItemSelectedListener - typedItem.viewModel.onDataUpdated = { + spinner.onItemSelectedListener = onItemSelectedListener + item.viewModel.onDataUpdated = { val selectedItem = it as? String - spItem.onItemSelectedListener = null - data.itemList.firstOrNull { item -> item.value == selectedItem }?.let { keyValue -> - val position = data.itemList.indexOf(keyValue) - spItem.setSelection(position) + spinner.onItemSelectedListener = null + viewModel.itemList.firstOrNull { item -> item.value == selectedItem }?.let { keyValue -> + val position = viewModel.itemList.indexOf(keyValue) + spinner.setSelection(position) } - spItem.onItemSelectedListener = onItemSelectedListener + spinner.onItemSelectedListener = onItemSelectedListener } } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt index 007cf07543..40db39e261 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt @@ -1,14 +1,13 @@ package com.tangem.tangemtest.ucase.variants.responses.converter import com.tangem.commands.Card +import com.tangem.commands.CardData import com.tangem.commands.Settings import com.tangem.commands.SettingsMask +import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.StringId -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup -import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems -import com.tangem.tangemtest._arch.structure.abstraction.SimpleItemGroup +import com.tangem.tangemtest._arch.structure.abstraction.* import com.tangem.tangemtest._arch.structure.impl.BoolItem import com.tangem.tangemtest._arch.structure.impl.TextItem import com.tangem.tangemtest.ucase.variants.personalize.BlockId @@ -26,11 +25,26 @@ class CardConverter : ModelToItems { // itemList.add(TextItem(Additional.JSON_INCOMING, holder.gson.toJson(from))) itemList.add(simpleFields(from)) - itemList.add(cardData(from)) + itemList.add(cardData(from.cardData)) itemList.add(settingsMask(from.settingsMask)) + hideEmptyNullFields(itemList) + return itemList } + private fun hideEmptyNullFields(itemList: MutableList) { + itemList.iterate { + val data = it.getData() + val isHidden = if (data == null) true + else when (data) { + is String -> data.isEmpty() + else -> false + } + + if (isHidden) it.viewModel.viewState.isHidden = true + } + } + private fun simpleFields(from: Card): Item { val group = createGroup(BlockId.Common) group.addItem(TextItem(CardId.cardId, from.cardId)) @@ -55,9 +69,11 @@ class CardConverter : ModelToItems { return group } - private fun cardData(from: Card): Item { - val group = createGroup(BlockId.Common) - val data = from.cardData ?: return group + private fun cardData(from: CardData?): Item { + val group = createGroup(BlockId.Common, R.color.group_card_data) + val data = from ?: return group + +// group.addItem(TextItem(StringResId(R.string.response_card_card_data))) group.addItem(TextItem(CardDataId.batchId, data.batchId)) // Format: Year (2 bytes) | Month (1 byte) | Day (1 byte) group.addItem(TextItem(CardDataId.manufactureDateTime, stringOf(data.manufactureDateTime))) @@ -73,12 +89,16 @@ class CardConverter : ModelToItems { } private fun settingsMask(from: SettingsMask?): Item { - val group = createGroup(CardId.settingsMask) + val group = createGroup(CardId.settingsMask, R.color.group_signing_method) val data = from ?: return group +// group.addItem(TextItem(StringResId(R.string.response_card_settings_mask))) Settings.values().forEach { group.addItem(BoolItem(StringId(it.name), data.contains(it))) } return group } - private fun createGroup(id: Id): ItemGroup = SimpleItemGroup(id).apply { addItem(TextItem(id)) } + private fun createGroup(id: Id, colorId: Int? = null): ItemGroup { + return if (colorId == null) SimpleItemGroup(id) + else SimpleItemGroup(id, BaseItemViewModel(viewState = ViewState(backgroundColor = colorId))) + } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt index a0d546f973..9367b0bc0c 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt @@ -3,7 +3,6 @@ package com.tangem.tangemtest.ucase.variants.responses.ui.widget import android.content.ClipData import android.content.ClipboardManager import android.content.Context -import android.view.View import android.view.ViewGroup import android.widget.TextView import com.tangem.tangemtest.R @@ -29,11 +28,6 @@ class ResponseTextWidget( private fun initWidgets() { val data = typedItem.getData() as? String - if (data == null || data.isEmpty()) { - view.visibility = View.GONE - return - } - tvName.text = getName() tvValue.text = data diff --git a/tangem-demo/src/main/res/values/colors.xml b/tangem-demo/src/main/res/values/colors.xml index c72e37bcd8..1c183064f5 100644 --- a/tangem-demo/src/main/res/values/colors.xml +++ b/tangem-demo/src/main/res/values/colors.xml @@ -13,6 +13,10 @@ #303030 @color/field_info + #D7E4F3 + #D7F3E6 + + #C6C6C6 #FFE391 #FFFFFF From 635f38bb8699ffc795277616c00c7ed3d20ad8ca Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 9 Apr 2020 20:55:12 +0300 Subject: [PATCH 17/19] Updated on 2026-08-14 --- .../com/tangem/tangemtest/Old_MainActivity.kt | 1 - .../_arch/widget/abstraction/ViewWidget.kt | 2 +- .../tangem/tangemtest/_main/MainActivity.kt | 10 +++--- .../tangem/tangemtest/_main/MainViewModel.kt | 5 +-- .../tangemtest/ucase/ui/BaseFragment.kt | 2 -- .../personalize/ui/widgets/BaseAppWidget.kt | 2 +- .../variants/responses/ResponseViewModel.kt | 19 ++++++++++- .../variants/responses/ui/ResponseFragment.kt | 32 ++++++++++--------- .../variants/scan/ui/ScanActionFragment.kt | 7 +--- tangem-demo/src/main/res/values/strings.xml | 5 ++- 10 files changed, 50 insertions(+), 35 deletions(-) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt index b39081b6b0..f2c89bc9b4 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/Old_MainActivity.kt @@ -5,7 +5,6 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.tangem.CardManager import com.tangem.tangem_sdk_new.extensions.init -import com.tangem.tangemtest.extensions.create import com.tangem.tasks.ScanEvent import com.tangem.tasks.TaskError import com.tangem.tasks.TaskEvent diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt index 9047cdacc1..20fcb7f37f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt @@ -30,8 +30,8 @@ abstract class BaseViewWidget( ) : ViewWidget { override val view: View = inflate(getLayoutId(), parent) - private var defaultBackground: Drawable = view.background + private var defaultBackground: Drawable? = view.background init { if (item.viewModel.viewState.isHidden) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt index 4e774f0be7..92e093d2c8 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt @@ -2,7 +2,6 @@ package com.tangem.tangemtest._main import android.content.res.Resources import android.os.Bundle -import android.util.Log import android.view.Menu import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -12,8 +11,9 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.navigateUp -import androidx.navigation.ui.setupActionBarWithNavController +import androidx.navigation.ui.setupWithNavController import com.tangem.tangemtest.R +import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] @@ -34,8 +34,8 @@ class MainActivity : AppCompatActivity() { .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return val navController = host.navController - appBarConfiguration = AppBarConfiguration(setOf(R.id.nav_entry_point)) - setupActionBarWithNavController(navController, appBarConfiguration) + appBarConfiguration = AppBarConfiguration(navController.graph) + toolbar.setupWithNavController(navController, appBarConfiguration) navController.addOnDestinationChangedListener { _, destination, _ -> val dest: String = try { @@ -43,7 +43,7 @@ class MainActivity : AppCompatActivity() { } catch (e: Resources.NotFoundException) { destination.id.toString() } - Log.d("NavigationActivity", "Navigated to $dest") + Log.d(this, "Navigated to $dest") } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt index a7d2eef283..a599bcb479 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt @@ -10,7 +10,8 @@ import ru.dev.gbixahue.eu4d.lib.android.global.log.Log */ class MainViewModel : ViewModel() { val ldDescriptionSwitch = MutableLiveData(false) - val ldResponseEvent = MutableLiveData>() + + var responseEvent: TaskEvent<*>? = null fun switchToggled(state: Boolean) { ldDescriptionSwitch.postValue(state) @@ -20,6 +21,6 @@ class MainViewModel : ViewModel() { Log.d(this, "changeResponseEvent") val reqEvent = event ?: return - ldResponseEvent.value = reqEvent + responseEvent = reqEvent } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt index a7fabc3df0..29dfeec6be 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt @@ -10,7 +10,6 @@ import androidx.navigation.fragment.NavHostFragment.findNavController import com.google.android.material.snackbar.Snackbar import com.tangem.tangemtest.ucase.getDefaultNavigationOptions import com.tangem.tangemtest.ucase.tunnel.SnackbarHolder -import ru.dev.gbixahue.eu4d.lib.android.global.log.Log import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder /** @@ -26,7 +25,6 @@ abstract class BaseFragment : Fragment(), LayoutHolder, SnackbarHolder { } protected fun navigateTo(navigationId: Int, bundle: Bundle? = null, options: NavOptions? = getDefaultNavigationOptions()) { - Log.d(this, "navigateTo id: $navigationId") findNavController(this).navigate(navigationId, bundle, options) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt index 60ab69c243..65f110c8c2 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt @@ -13,7 +13,7 @@ import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom /** [REDACTED_AUTHOR] */ -abstract class BaseAppWidget(parent: ViewGroup, item: Item): BaseViewWidget(parent, item) { +abstract class BaseAppWidget(parent: ViewGroup, item: Item) : BaseViewWidget(parent, item) { override fun getName(): String { return when (val id = item.id) { is StringId -> id.value diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt index 50e8df7aa2..6216ffbddc 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt @@ -2,10 +2,15 @@ package com.tangem.tangemtest.ucase.variants.responses import android.view.View import androidx.lifecycle.ViewModel +import com.tangem.commands.Card +import com.tangem.commands.SignResponse +import com.tangem.commands.personalization.DepersonalizeResponse +import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems import com.tangem.tangemtest._arch.structure.abstraction.iterate import com.tangem.tangemtest.ucase.variants.responses.converter.ConvertersStore +import com.tangem.tasks.ScanEvent import com.tangem.tasks.TaskEvent import ru.dev.gbixahue.eu4d.lib.android.global.log.Log @@ -17,7 +22,7 @@ class ResponseViewModel : ViewModel() { private val convertersHolder = ConvertersStore() private var itemList: List? = null - fun createItemList(taskEvent: TaskEvent<*>): List { + fun createItemList(taskEvent: TaskEvent<*>?): List { Log.d(this, "createItemList: itemList size: ${itemList?.size ?: 0}") val event = taskEvent as? TaskEvent.Event ?: return emptyList() @@ -32,6 +37,18 @@ class ResponseViewModel : ViewModel() { it.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE } } + + fun determineTitleId(taskEvent: TaskEvent<*>?): Int { + val event = taskEvent as? TaskEvent.Event ?: return R.string.unknown + + return when (event.data) { + is ScanEvent.OnReadEvent -> R.string.fg_name_response_scan + is SignResponse -> R.string.fg_name_response_sign + is Card -> R.string.fg_name_response_personalization + is DepersonalizeResponse -> R.string.fg_name_response_depersonalization + else -> R.string.unknown + } + } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt index e3009a8787..683ebd7e86 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt @@ -1,6 +1,7 @@ package com.tangem.tangemtest.ucase.variants.responses.ui import android.os.Bundle +import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout @@ -13,17 +14,12 @@ import com.tangem.tangemtest._main.MainViewModel import com.tangem.tangemtest.ucase.ui.BaseFragment import com.tangem.tangemtest.ucase.variants.responses.ResponseViewModel import com.tangem.tangemtest.ucase.variants.responses.ui.widget.ResponseItemBuilder -import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ open class ResponseFragment : BaseFragment() { - companion object Arg { - val response = "response" - } - private val mainActivityVM: MainViewModel by activityViewModels() private val selfVM: ResponseViewModel by viewModels() @@ -31,22 +27,28 @@ open class ResponseFragment : BaseFragment() { override fun getLayoutId(): Int = R.layout.fg_card_response + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + setTittle() + return super.onCreateView(inflater, container, savedInstanceState) + } + + private fun setTittle() { + val titleId = selfVM.determineTitleId(mainActivityVM.responseEvent) + activity?.setTitle(titleId) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mainActivityVM.ldResponseEvent.observe(viewLifecycleOwner, Observer { event -> - val builder = WidgetBuilder(ResponseItemBuilder()) - val itemList = selfVM.createItemList(event) - itemList.forEach { builder.build(it, itemContainer) } - }) - subscribeToViewModelChanges() - } - - private fun subscribeToViewModelChanges() { - Log.d(this, "subscribeToViewModelChanges") + buildWidgets() listenDescriptionSwitchChanges() } + private fun buildWidgets() { + val builder = WidgetBuilder(ResponseItemBuilder()) + val itemList = selfVM.createItemList(mainActivityVM.responseEvent) + itemList.forEach { builder.build(it, itemContainer) } + } private fun listenDescriptionSwitchChanges() { mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt index 3ec710a4b7..1e5ed5eb9b 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt @@ -2,13 +2,11 @@ package com.tangem.tangemtest.ucase.variants.scan.ui import android.os.Bundle import android.view.View -import androidx.core.os.bundleOf import androidx.lifecycle.Observer import com.tangem.tangemtest.R import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager import com.tangem.tangemtest.ucase.domain.paramsManager.managers.ScanItemsManager import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment -import com.tangem.tangemtest.ucase.variants.responses.ui.ResponseFragment /** [REDACTED_AUTHOR] @@ -26,10 +24,7 @@ class ScanActionFragment : BaseCardActionFragment() { override fun listenReadResponse() { actionVM.seReadResponse.observe(viewLifecycleOwner, Observer { - navigateTo( - R.id.action_nav_card_action_to_response_screen, - bundleOf(Pair(ResponseFragment.response, it)) - ) + navigateTo(R.id.action_nav_card_action_to_response_screen) }) } } \ No newline at end of file diff --git a/tangem-demo/src/main/res/values/strings.xml b/tangem-demo/src/main/res/values/strings.xml index df8e87a708..cb44b6cc03 100644 --- a/tangem-demo/src/main/res/values/strings.xml +++ b/tangem-demo/src/main/res/values/strings.xml @@ -2,7 +2,10 @@ Tangem Development Kit @string/app_name - "Current card ID: " + Scan response + Sign response + Personalization response + Depersonalization response unknown Docs From c72faf1c3544cf05a3df302cc4d78f681dd68238 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 9 Apr 2020 22:03:49 +0300 Subject: [PATCH 18/19] Updated on 2026-08-14 --- .../extensions/AndroidComponents.kt | 22 +++++++++++++ .../variants/responses/ui/ResponseFragment.kt | 27 ++++++++++++---- .../responses/ui/widget/CheckBoxWidget.kt | 5 ++- .../responses/ui/widget/ResponseTextWidget.kt | 14 +------- .../responses/ui/widget/ResponseWidget.kt | 32 +++++++++++++++++++ .../main/res/drawable/ic_share_white_18dp.xml | 9 ++++++ tangem-demo/src/main/res/menu/main_menu.xml | 8 +++++ .../src/main/res/navigation/navigation.xml | 2 +- tangem-demo/src/main/res/values/strings.xml | 1 + 9 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt create mode 100644 tangem-demo/src/main/res/drawable/ic_share_white_18dp.xml diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt new file mode 100644 index 0000000000..3a9205574c --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt @@ -0,0 +1,22 @@ +package com.tangem.tangemtest.extensions + +import android.content.Intent +import androidx.activity.ComponentActivity +import androidx.fragment.app.Fragment + +/** +[REDACTED_AUTHOR] + */ +fun Fragment.shareText(text: String) { + requireActivity().shareText(text) +} + +fun ComponentActivity.shareText(text: String) { + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, text) + type = "text/plain" + } + val shareIntent = Intent.createChooser(sendIntent, null) + startActivity(shareIntent) +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt index 683ebd7e86..e5cc169f68 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt @@ -1,16 +1,16 @@ package com.tangem.tangemtest.ucase.variants.responses.ui import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import android.widget.LinearLayout import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Observer +import com.google.gson.Gson import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.widget.WidgetBuilder import com.tangem.tangemtest._main.MainViewModel +import com.tangem.tangemtest.extensions.shareText import com.tangem.tangemtest.ucase.ui.BaseFragment import com.tangem.tangemtest.ucase.variants.responses.ResponseViewModel import com.tangem.tangemtest.ucase.variants.responses.ui.widget.ResponseItemBuilder @@ -27,9 +27,9 @@ open class ResponseFragment : BaseFragment() { override fun getLayoutId(): Int = R.layout.fg_card_response - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) setTittle() - return super.onCreateView(inflater, container, savedInstanceState) } private fun setTittle() { @@ -40,6 +40,7 @@ open class ResponseFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + setHasOptionsMenu(true) buildWidgets() listenDescriptionSwitchChanges() } @@ -55,4 +56,18 @@ open class ResponseFragment : BaseFragment() { selfVM.toggleDescriptionVisibility(it) }) } -} + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + + val menuItem = menu.findItem(R.id.action_share) + menuItem.isVisible = true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.action_share -> shareText(Gson().toJson(mainActivityVM.responseEvent)) + } + return super.onOptionsItemSelected(item) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt index a988a93948..65dd1a5831 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt @@ -4,7 +4,6 @@ import android.view.ViewGroup import com.google.android.material.checkbox.MaterialCheckBox import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.BoolItem -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom /** @@ -13,7 +12,7 @@ import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom class CheckBoxWidget( parent: ViewGroup, private val typedItem: BoolItem -) : DescriptionWidget(parent, typedItem) { +) : ResponseWidget(parent, typedItem) { override fun getLayoutId(): Int = R.layout.w_response_item_checkbox @@ -22,7 +21,7 @@ class CheckBoxWidget( init { switchItem.text = getName() switchItem.isChecked = typedItem.getData() ?: false - switchItem.isEnabled = false + switchItem.isClickable = false switchItem.setTextColor(switchItem.colorFrom(R.color.action_name)) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt index 9367b0bc0c..8859d78527 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt @@ -1,13 +1,9 @@ package com.tangem.tangemtest.ucase.variants.responses.ui.widget -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context import android.view.ViewGroup import android.widget.TextView import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.impl.TextItem -import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget /** [REDACTED_AUTHOR] @@ -15,7 +11,7 @@ import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWi class ResponseTextWidget( parent: ViewGroup, private val typedItem: TextItem -) : DescriptionWidget(parent, typedItem) { +) : ResponseWidget(parent, typedItem) { override fun getLayoutId(): Int = R.layout.w_response_item @@ -30,13 +26,5 @@ class ResponseTextWidget( val data = typedItem.getData() as? String tvName.text = getName() tvValue.text = data - - view.setOnClickListener { - val clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager - ?: return@setOnClickListener - - val clip: ClipData = ClipData.newPlainText("FieldValue", "$data") - clipboard.setPrimaryClip(clip) - } } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt new file mode 100644 index 0000000000..d08de11386 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt @@ -0,0 +1,32 @@ +package com.tangem.tangemtest.ucase.variants.responses.ui.widget + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.view.ViewGroup +import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget +import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom +import ru.dev.gbixahue.eu4d.lib.android._android.views.toast +import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf + +/** +[REDACTED_AUTHOR] + */ +abstract class ResponseWidget(parent: ViewGroup, item: Item): DescriptionWidget(parent, item) { + + init { + view.setOnClickListener { + val data = stringOf(item.getData()) + val clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager + ?: return@setOnClickListener + + val clip: ClipData = ClipData.newPlainText("FieldValue", "$data") + clipboard.setPrimaryClip(clip) + + val copyMessage = view.stringFrom(R.string.copy_to_clipboard) + view.toast("$copyMessage: ${getName()} - $data") + } + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/res/drawable/ic_share_white_18dp.xml b/tangem-demo/src/main/res/drawable/ic_share_white_18dp.xml new file mode 100644 index 0000000000..0075e4b78c --- /dev/null +++ b/tangem-demo/src/main/res/drawable/ic_share_white_18dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/tangem-demo/src/main/res/menu/main_menu.xml b/tangem-demo/src/main/res/menu/main_menu.xml index 6241fdec1d..7f4be83642 100644 --- a/tangem-demo/src/main/res/menu/main_menu.xml +++ b/tangem-demo/src/main/res/menu/main_menu.xml @@ -2,9 +2,17 @@ + + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/navigation/navigation.xml b/tangem-demo/src/main/res/navigation/navigation.xml index 1cc5427895..7209eb2e22 100644 --- a/tangem-demo/src/main/res/navigation/navigation.xml +++ b/tangem-demo/src/main/res/navigation/navigation.xml @@ -128,7 +128,7 @@ diff --git a/tangem-demo/src/main/res/values/strings.xml b/tangem-demo/src/main/res/values/strings.xml index cb44b6cc03..064c3a64c8 100644 --- a/tangem-demo/src/main/res/values/strings.xml +++ b/tangem-demo/src/main/res/values/strings.xml @@ -8,6 +8,7 @@ Depersonalization response unknown + Copy to clipboard Docs Your card hasn\'t been personalized yet. You need to run personalize command first. From bcf885568f196707ac1e5a639fa839a3bcaee243 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 10 Apr 2020 12:26:42 +0300 Subject: [PATCH 19/19] Updated on 2026-08-14 --- ...nitializer.kt => ResponseJsonConverter.kt} | 10 +++++++++- .../ucase/resources/MainResourceHolder.kt | 20 +++++++++++++++++++ .../tangemtest/ucase/ui/ActionViewModel.kt | 4 ++-- .../personalize/ui/widgets/BaseAppWidget.kt | 14 ++++++------- .../ui/widgets/DescriptionWidget.kt | 2 +- .../responses/converter/CardConverter.kt | 11 +++++----- .../variants/responses/ui/ResponseFragment.kt | 6 ++++-- .../responses/ui/widget/ResponseWidget.kt | 5 +++-- 8 files changed, 52 insertions(+), 20 deletions(-) rename tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/{GsonInitializer.kt => ResponseJsonConverter.kt} (89%) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/ResponseJsonConverter.kt similarity index 89% rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/ResponseJsonConverter.kt index 4d6e2407d7..84695d90fb 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/ResponseJsonConverter.kt @@ -6,6 +6,7 @@ import com.tangem.commands.Settings import com.tangem.commands.SettingsMask import com.tangem.commands.SigningMethod import com.tangem.common.extensions.toHexString +import com.tangem.tasks.TaskEvent import java.lang.reflect.Type import java.text.DateFormat import java.util.* @@ -13,7 +14,7 @@ import java.util.* /** [REDACTED_AUTHOR] */ -class GsonInitializer { +class ResponseJsonConverter { val gson: Gson by lazy { init() } private fun init(): Gson { @@ -27,6 +28,13 @@ class GsonInitializer { builder.setPrettyPrinting() return builder.create() } + + fun convertTaskEvent(task: TaskEvent<*>?): String = gson.toJson(task) + + fun convertEvent(task: TaskEvent<*>?): String { + val event = task as? TaskEvent.Event ?: "" + return gson.toJson(event) + } } class ByteTypeAdapter : JsonSerializer { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt index cf6a61abbc..86c7454365 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt @@ -1,7 +1,10 @@ package com.tangem.tangemtest.ucase.resources +import com.tangem.tangemtest.AppTangemDemo import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.StringId +import com.tangem.tangemtest._arch.structure.StringResId import com.tangem.tangemtest.ucase.resources.initializers.ActionResources import com.tangem.tangemtest.ucase.resources.initializers.PersonalizationResources import com.tangem.tangemtest.ucase.resources.initializers.ResponseResources @@ -21,6 +24,23 @@ object MainResourceHolder : ResourceHolder() { ResponseResources().init(this) } + override fun get(type: Id): Resources? { + return when(type) { + is StringId -> getResourcesFromName(type.value) + is StringResId -> Resources(type.value) + else -> super.get(type) + } + } + + private fun getResourcesFromName(resName: String): Resources? { + val context = AppTangemDemo.appInstance.applicationContext + val resNameId = context.resources.getIdentifier(resName, "string", context.packageName) + val resInfoId = context.resources.getIdentifier("info_$resName", "string", context.packageName) + if (resNameId == 0) return null + + return Resources(resNameId, if (resInfoId == 0) null else resInfoId) + } + inline fun safeGet(id: Id): Res { val result = super.get(id) ?: Resources(R.string.unknown, R.string.unknown) return result as Res diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt index e1b63c7df7..a44367f98c 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt @@ -12,7 +12,7 @@ import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest._arch.structure.abstraction.iterate import com.tangem.tangemtest.commons.performAction import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager -import com.tangem.tangemtest.ucase.domain.responses.GsonInitializer +import com.tangem.tangemtest.ucase.domain.responses.ResponseJsonConverter import com.tangem.tangemtest.ucase.tunnel.ViewScreen import com.tangem.tasks.ScanEvent import com.tangem.tasks.TaskError @@ -92,7 +92,7 @@ class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif internal class Notifier(private val vm: ActionViewModel) { private var notShowedError: TaskError? = null - private val gson: Gson = GsonInitializer().gson + private val gson: Gson = ResponseJsonConverter().gson fun handleActionResult(response: TaskEvent<*>, list: List) { if (list.isNotEmpty()) notifyItemsChanged(list) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt index 65f110c8c2..5900b5da37 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt @@ -2,7 +2,6 @@ package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets import android.view.ViewGroup import com.tangem.tangemtest._arch.structure.StringId -import com.tangem.tangemtest._arch.structure.StringResId import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget @@ -15,14 +14,15 @@ import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom */ abstract class BaseAppWidget(parent: ViewGroup, item: Item) : BaseViewWidget(parent, item) { override fun getName(): String { - return when (val id = item.id) { - is StringId -> id.value - is StringResId -> view.stringFrom(id.value) - else -> view.stringFrom(getResNameId()) - } + val idName = if (item.id is StringId) (item.id as StringId).value else "" + + val resources = getResources() ?: return idName + return view.stringFrom(resources.resName) } } +fun ViewWidget.getResources(): Resources? = MainResourceHolder.get(item.id) + fun ViewWidget.getResNameId(): Int = MainResourceHolder.safeGet(item.id).resName -fun ViewWidget.getResDescription(): Int? = MainResourceHolder.safeGet(item.id).resDescription \ No newline at end of file +fun ViewWidget.getResDescriptionId(): Int? = MainResourceHolder.get(item.id)?.resDescription \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt index 0e49f54ec5..b1d699f972 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt @@ -30,7 +30,7 @@ abstract class DescriptionWidget( protected open fun changeDescriptionVisibility(state: Int) { val tv = tvDescription ?: return - val descriptionId = getResDescription() ?: return + val descriptionId = getResDescriptionId() ?: return val description = tv.context.getString(descriptionId) if (description.isEmpty()) return diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt index 40db39e261..374cdaaf20 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt @@ -4,6 +4,7 @@ import com.tangem.commands.Card import com.tangem.commands.CardData import com.tangem.commands.Settings import com.tangem.commands.SettingsMask +import com.tangem.common.extensions.toHexString import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.StringId @@ -51,11 +52,11 @@ class CardConverter : ModelToItems { group.addItem(TextItem(CardId.manufacturerName, from.manufacturerName)) group.addItem(TextItem(CardId.status, stringOf(from.status))) group.addItem(TextItem(CardId.firmwareVersion, from.firmwareVersion)) - group.addItem(TextItem(CardId.cardPublicKey, stringOf(from.cardPublicKey))) - group.addItem(TextItem(CardId.issuerPublicKey, stringOf(from.issuerPublicKey))) + group.addItem(TextItem(CardId.cardPublicKey, from.cardPublicKey?.toHexString())) + group.addItem(TextItem(CardId.issuerPublicKey, from.issuerPublicKey?.toHexString())) group.addItem(TextItem(CardId.curve, stringOf(from.curve))) group.addItem(TextItem(CardId.maxSignatures, stringOf(from.maxSignatures))) - group.addItem(TextItem(CardId.signingMethod, stringOf(from.signingMethod))) + group.addItem(TextItem(CardId.signingMethod, stringOf(from.signingMethod?.rawValue))) group.addItem(TextItem(CardId.pauseBeforePin2, stringOf(from.pauseBeforePin2))) group.addItem(TextItem(CardId.walletPublicKey, stringOf(from.walletPublicKey))) group.addItem(TextItem(CardId.walletRemainingSignatures, stringOf(from.walletRemainingSignatures))) @@ -79,8 +80,8 @@ class CardConverter : ModelToItems { group.addItem(TextItem(CardDataId.manufactureDateTime, stringOf(data.manufactureDateTime))) group.addItem(TextItem(CardDataId.issuerName, data.issuerName)) group.addItem(TextItem(CardDataId.blockchainName, data.blockchainName)) - group.addItem(TextItem(CardDataId.manufacturerSignature, stringOf(data.manufacturerSignature))) - group.addItem(TextItem(CardDataId.productMask, stringOf(data.productMask))) + group.addItem(TextItem(CardDataId.manufacturerSignature, data.manufacturerSignature?.toHexString())) + group.addItem(TextItem(CardDataId.productMask, stringOf(data.productMask?.rawValue))) group.addItem(TextItem(CardDataId.tokenSymbol, data.tokenSymbol)) group.addItem(TextItem(CardDataId.tokenContractAddress, data.tokenContractAddress)) group.addItem(TextItem(CardDataId.tokenDecimal, data.tokenSymbol)) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt index e5cc169f68..4477f12894 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt @@ -6,11 +6,11 @@ import android.widget.LinearLayout import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Observer -import com.google.gson.Gson import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.widget.WidgetBuilder import com.tangem.tangemtest._main.MainViewModel import com.tangem.tangemtest.extensions.shareText +import com.tangem.tangemtest.ucase.domain.responses.ResponseJsonConverter import com.tangem.tangemtest.ucase.ui.BaseFragment import com.tangem.tangemtest.ucase.variants.responses.ResponseViewModel import com.tangem.tangemtest.ucase.variants.responses.ui.widget.ResponseItemBuilder @@ -66,7 +66,9 @@ open class ResponseFragment : BaseFragment() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.action_share -> shareText(Gson().toJson(mainActivityVM.responseEvent)) + R.id.action_share -> { + shareText(ResponseJsonConverter().convertEvent(mainActivityVM.responseEvent)) + } } return super.onOptionsItemSelected(item) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt index d08de11386..054ab81dbc 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt @@ -22,11 +22,12 @@ abstract class ResponseWidget(parent: ViewGroup, item: Item): DescriptionWidget( val clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager ?: return@setOnClickListener - val clip: ClipData = ClipData.newPlainText("FieldValue", "$data") + val clipboardData = "${getName()} - $data" + val clip: ClipData = ClipData.newPlainText("FieldValue", clipboardData) clipboard.setPrimaryClip(clip) val copyMessage = view.stringFrom(R.string.copy_to_clipboard) - view.toast("$copyMessage: ${getName()} - $data") + view.toast("$copyMessage\n$clipboardData") } } } \ No newline at end of file