From 73f6f3344ce8c05b9a718d332c57a12811be6357 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 3 Apr 2020 23:06:44 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../_arch/structure/abstraction/Extension.kt | 26 +++++++++++ .../_arch/structure/abstraction/ViewModel.kt | 2 + .../domain/actions/DepersonalizeAction.kt | 2 +- .../ucase/domain/actions/PersonalizeAction.kt | 46 +++++++++++++++++-- .../ucase/domain/actions/SignAction.kt | 2 +- .../domain/paramsManager/ItemsManager.kt | 12 +---- .../managers/BaseItemsManager.kt | 2 +- .../managers/PersonalizeItemsManager.kt | 6 +-- .../triggers/afterAction/AfterScanModifier.kt | 2 +- .../ParamChangeConsequence.kt | 2 +- .../tangem/tangemtest/ucase/tunnel/Errors.kt | 11 ++++- .../tangemtest/ucase/tunnel/ViewScreen.kt | 1 + .../ucase/ui/BaseCardActionFragment.kt | 6 ++- .../personalize/converter/fromTo/ItemTypes.kt | 8 ++++ .../converter/fromTo/PersonalizeConfigTo.kt | 24 +++++----- .../personalize/ui/PersonalizeFragment.kt | 46 +++++++++++++++---- .../personalize/ui/PersonalizeViewModel.kt | 40 ++-------------- .../ui/widgets/abstraction/ViewWidget.kt | 6 +++ .../ui/widgets/impl/item/EditTextWidget.kt | 14 ++++-- .../ui/widgets/impl/item/NumberWidget.kt | 25 +++++++--- tangem-demo/src/main/res/values/strings.xml | 2 + 21 files changed, 190 insertions(+), 95 deletions(-) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt 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 new file mode 100644 index 0000000000..71924302a3 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt @@ -0,0 +1,26 @@ +package com.tangem.tangemtest._arch.structure.abstraction + +import com.tangem.tangemtest._arch.structure.Id + +/** +[REDACTED_AUTHOR] + */ +fun List.findDataItem(id: Id): BaseItem? { + var foundItem: BaseItem? = null + iterate { + if (it.id == id) { + foundItem = it as? BaseItem + return@iterate + } + } + return foundItem +} + +fun List.iterate(func: (Item) -> Unit) { + forEach { + when (it) { + is BaseItem<*> -> func(it) + is Block -> it.itemList.iterate(func) + } + } +} \ No newline at end of file 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/ViewModel.kt index 63a54281d5..86d1d1b345 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/ViewModel.kt @@ -61,6 +61,8 @@ open class BaseItemViewModel : ItemViewModel { } class ViewState { + var isHiddenField = false + var descriptionVisibility: Int = 0x00000008 set(value) { field = value 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 6a08e2e816..2433302a4b 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,8 +2,8 @@ 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.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.domain.paramsManager.findDataItem import com.tangem.tangemtest.ucase.variants.TlvId /** 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 d82d8c7ddf..8ef5e4c0cc 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 @@ -1,25 +1,65 @@ package com.tangem.tangemtest.ucase.domain.actions -import com.tangem.commands.personalization.entities.CardConfig 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.impl.EditTextItem +import com.tangem.tangemtest._arch.structure.impl.NumberItem import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback 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.fromTo.PersonalizeConfigToCardConfig import com.tangem.tangemtest.ucase.variants.personalize.dto.DefaultPersonalizeParams +import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig +import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf /** [REDACTED_AUTHOR] */ class PersonalizeAction : BaseAction() { override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) { - val cardConfig = attrs.payload.remove(PayloadKey.cardConfig) as? CardConfig - ?: throw IllegalArgumentException("CardConfig must be in the payloads of the ParamsManager") + val itemList = attrs.payload[PayloadKey.itemList] as? List ?: return + val actionView = attrs.payload[PayloadKey.actionView] as? ActionView ?: return + + if (!checkSeries(itemList)) { + actionView.showSnackbar(ItemError.BadSeries) + return + } + if (!checkNumber(itemList)) { + actionView.showSnackbar(ItemError.BadCardNumber) + return + } val issuer = DefaultPersonalizeParams.issuer() val acquirer = DefaultPersonalizeParams.acquirer() val manufacturer = DefaultPersonalizeParams.manufacturer() + val personalizeConfig = PersonalizeConfigConverter().convert(itemList, PersonalizeConfig()) + val cardConfig = PersonalizeConfigToCardConfig().convert(personalizeConfig) + attrs.cardManager.personalize(cardConfig, issuer, manufacturer, acquirer) { handleResult(payload, it, null, attrs, callback) } } + + private fun checkSeries(itemList: List): Boolean { + val seriesItem = itemList.findDataItem(CardNumber.Series) as? EditTextItem ?: return false + val data = seriesItem.getData() ?: 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()) + + return if (seriesData.length == 2 && numberData.length > 13) false + else !(seriesData.length == 4 && numberData.length > 11) + } } \ No newline at end of file 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 f191a4aa4a..18fef1d8c5 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,8 +2,8 @@ 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.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.domain.paramsManager.findDataItem import com.tangem.tangemtest.ucase.variants.TlvId import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf 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 6a37f00b34..f97013d6f8 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 @@ -4,7 +4,6 @@ import com.tangem.CardManager import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.Payload import com.tangem.tangemtest._arch.structure.PayloadHolder -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence import com.tangem.tasks.TaskEvent @@ -34,15 +33,6 @@ interface PayloadKey { val incomingJson: String = "incomingJson" val card = "card" val actionView = "actionView" + val itemList = "itemList" } -} - -fun List.findItem(id: Id): Item? { - return firstOrNull { it.id == id } -} - -fun List.findDataItem(id: Id): BaseItem? { - val item = firstOrNull { it.id == id } - return if (item is BaseItem<*>) item as BaseItem - else null } \ 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 aaf280dedb..c9016165ac 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 @@ -4,12 +4,12 @@ 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.ucase.domain.actions.Action import com.tangem.tangemtest.ucase.domain.actions.AttrForAction 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.findDataItem import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence /** 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 82b6724052..7f40ac54f5 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 @@ -2,18 +2,14 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.managers import com.tangem.CardManager import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.impl.EditTextItem import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.variants.TlvId /** [REDACTED_AUTHOR] */ class PersonalizeItemsManager : BaseItemsManager(PersonalizeAction()) { - override fun createItemsList(): List { - return listOf(EditTextItem(TlvId.CardId)) - } + override fun createItemsList(): List = listOf() 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/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt index cef30ec7f8..b75c721424 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,8 +4,8 @@ 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.ucase.domain.paramsManager.PayloadKey -import com.tangem.tangemtest.ucase.domain.paramsManager.findDataItem import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.tunnel.CardError import com.tangem.tangemtest.ucase.variants.TlvId 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 d7da0d3d1b..2957d43a45 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,8 +6,8 @@ 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.ucase.domain.paramsManager.PayloadKey -import com.tangem.tangemtest.ucase.domain.paramsManager.findDataItem import com.tangem.tangemtest.ucase.tunnel.ActionView import com.tangem.tangemtest.ucase.variants.TlvId import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI 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 e10f81c669..7b7cb530f7 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,6 +5,13 @@ import com.tangem.tangemtest._arch.structure.Id /** [REDACTED_AUTHOR] */ -enum class CardError : Id { - NotPersonalized +interface Errors: Id + +enum class CardError : Errors { + NotPersonalized, +} + +enum class ItemError: Errors { + BadSeries, + BadCardNumber, } \ No newline at end of file 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 d7c1df09f2..ec84ed97ba 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 @@ -6,6 +6,7 @@ interface ViewScreen interface SnackbarHolder { fun showSnackbar(message: String) + fun showSnackbar(id: Int) fun showSnackbar(id: Id) } 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 c4202bfa01..d44d2c998d 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 @@ -133,11 +133,15 @@ abstract class BaseCardActionFragment : Fragment(), LayoutHolder, ActionView { override fun showSnackbar(id: Id) { // MainResourceHolder.safeGet<>() when (id) { - CardError.NotPersonalized -> showSnackbar(requireContext().getString(R.string.card_error_not_personalized)) + CardError.NotPersonalized -> showSnackbar(R.string.card_error_not_personalized) 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/converter/fromTo/ItemTypes.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemTypes.kt index 64cea09fc2..7deee294d8 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/fromTo/ItemTypes.kt @@ -35,4 +35,12 @@ class ItemTypes { val numberList = mutableListOf( CardNumber.Number, Common.MaxSignatures, SignHashExProp.PinLessFloorLimit, Denomination.Denomination, Token.Decimal ) + + val hiddenList = mutableListOf( + CardNumber.Series, CardNumber.BatchId, Pins.Pin3, SigningMethod.SignExternal, + SignHashExProp.CryptoExKey, SignHashExProp.CheckPin3, SettingsMask.OneApdu, + SettingsMask.UseBlock, SettingsMask.ProtectIssuerDataAgainstReplay, + SignHashExProp.RequireTerminalCertSig, SignHashExProp.RequireTerminalTxSig + ) + } \ 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 index ec081640ad..a1186a3291 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 @@ -7,10 +7,7 @@ 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.Block -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.abstraction.* import com.tangem.tangemtest._arch.structure.impl.* import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey import com.tangem.tangemtest.ucase.variants.personalize.* @@ -24,11 +21,11 @@ import java.util.* */ class PersonalizeConfigToItem : ModelToItems { private val valuesHolder = PersonalizeConfigValuesHolder() - private val idIdentification = ItemTypes() + private val itemTypes = ItemTypes() override fun convert(from: PersonalizeConfig): List { valuesHolder.init(from) - val blocList = mutableListOf() + val blocList = mutableListOf() blocList.add(cardNumber()) blocList.add(common()) blocList.add(signingMethod()) @@ -43,6 +40,11 @@ class PersonalizeConfigToItem : ModelToItems { 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 } @@ -186,11 +188,11 @@ class PersonalizeConfigToItem : ModelToItems { private fun createItem(block: ListItemBlock, id: Id) { val holder = valuesHolder.get(id) ?: return val item = when { - idIdentification.blockIdList.contains(id) -> TextItem(id, holder.get() as? String) - idIdentification.listItemList.contains(id) -> ListItem(id, holder.list as List, holder.get()) - idIdentification.boolList.contains(id) -> BoolItem(id, holder.get() as? Boolean) - idIdentification.editTextList.contains(id) -> EditTextItem(id, holder.get() as? String) - idIdentification.numberList.contains(id) -> NumberItem(id, holder.get() as? Number) + 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) 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 03ba760176..3456d91ad2 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 @@ -9,28 +9,32 @@ import androidx.fragment.app.Fragment 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._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.ParamsViewModel import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.WidgetBuilder -import kotlinx.android.synthetic.main.fg_personalize.* import ru.dev.gbixahue.eu4d.lib.android.global.log.Log /** [REDACTED_AUTHOR] */ -class PersonalizeFragment : Fragment() { +class PersonalizeFragment : Fragment(), ActionView { private val mainActivityVM: MainViewModel by activityViewModels() private val personalizeVM: PersonalizeViewModel by viewModels { PersonalizeViewModelFactory(PersonalizeConfig()) } @@ -38,10 +42,9 @@ class PersonalizeFragment : Fragment() { private val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(ActionType.Personalize)!! } private val paramsVM: ParamsViewModel by viewModels() { ActionViewModelFactory(itemsManager) } - private val blockContainer: ViewGroup by lazy { - mainView.findViewById(R.id.ll_container) - } 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") @@ -57,6 +60,11 @@ class PersonalizeFragment : Fragment() { blockList.clear() blockList.addAll(list) blockList.forEach { WidgetBuilder().build(it, blockContainer) } + paramsVM.attachToPayload(mutableMapOf( + PayloadKey.actionView to this as ActionView, + PayloadKey.itemList to blockList + )) + }) mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { personalizeVM.toggleDescriptionVisibility(it) @@ -70,16 +78,34 @@ class PersonalizeFragment : Fragment() { }) paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbarMessage(it) }) - fab_action?.setOnClickListener { - val cardConfig = personalizeVM.createCardConfig(personalizeVM.createConfig(blockList)) - paramsVM.attachToPayload(mutableMapOf(PayloadKey.cardConfig to cardConfig)) - paramsVM.invokeMainAction() - } + 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) { +// MainResourceHolder.safeGet<>() + 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: 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/PersonalizeViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt index 669bbbca81..b2c7ec7fce 100644 --- 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 @@ -4,13 +4,10 @@ import android.view.View import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.google.gson.Gson -import com.tangem.commands.personalization.entities.CardConfig 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.iterate import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter -import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.PersonalizeConfigToCardConfig import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig /** @@ -23,40 +20,13 @@ class PersonalizeViewModelFactory(private val config: PersonalizeConfig) : ViewM class PersonalizeViewModel(private val config: PersonalizeConfig) : ViewModel() { val ldBlockList: MutableLiveData> by lazy { MutableLiveData(initBlockList()) } - private val configConverter = PersonalizeConfigConverter() - private fun initBlockList(): List = createBlocksFromConfig(config) - - fun createBlocksFromConfig(config: PersonalizeConfig): List { - return configConverter.convert(config) - } - - fun createConfig(blocList: List): PersonalizeConfig { - return configConverter.convert(blocList, PersonalizeConfig()) - } - - fun createCardConfig(config: PersonalizeConfig): CardConfig { - return PersonalizeConfigToCardConfig().convert(config) - } - - fun convertToJson(config: PersonalizeConfig): String { - return Gson().toJson(config) - } + private fun initBlockList(): List = PersonalizeConfigConverter().convert(config) fun toggleDescriptionVisibility(state: Boolean) { - ldBlockList.value?.forEach { item -> - when(item) { - is BaseItem<*> -> { - item.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE - } - is Block -> { - item.itemList.forEach { blockItem -> - val vm = blockItem as? BaseItem<*> ?: return@forEach - vm.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE - } - } - } - + 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/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/abstraction/ViewWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/abstraction/ViewWidget.kt index 6295598d1f..7926c4a0cf 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/ucase/variants/personalize/ui/widgets/abstraction/ViewWidget.kt @@ -30,6 +30,12 @@ abstract class BaseWidget( ) : ViewWidget, DataWidget { override val view: View = inflate(getLayoutId(), parent) + + init { + if (dataItem.viewModel.viewState.isHiddenField) { + view.visibility = View.GONE + } + } } abstract class BaseBlockWidget(parent: ViewGroup) : BlockViewWidget { 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/impl/item/EditTextWidget.kt index a60b17fe68..c4bff5cfab 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/impl/item/EditTextWidget.kt @@ -8,6 +8,7 @@ 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 ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf /** @@ -32,10 +33,13 @@ class EditTextWidget(parent: ViewGroup, data: EditTextItem) : DescriptionWidget< tilItem.hint = tilItem.context.getString(getResNameId()) etItem.setText(dataItem.viewModel.data) etItem.addTextChangedListener(watcher) - dataItem.viewModel.onDataUpdated = { - etItem.removeTextChangedListener(watcher) - etItem.setText(it) - etItem.addTextChangedListener(watcher) - } + dataItem.viewModel.onDataUpdated = { silentUpdate(it) } + } + + private fun silentUpdate(value: String?) { + etItem.removeTextChangedListener(watcher) + etItem.setText(value) + etItem.moveCursorToEnd() + etItem.addTextChangedListener(watcher) } } \ No newline at end of file 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/impl/item/NumberWidget.kt index 0c77806970..794c4c1ea0 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/impl/item/NumberWidget.kt @@ -1,13 +1,17 @@ package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item import android.text.Editable +import android.text.InputFilter import android.text.TextWatcher import android.view.ViewGroup 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.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 /** @@ -21,7 +25,7 @@ class NumberWidget(parent: ViewGroup, data: NumberItem) : DescriptionWidgetDocs Your card hasn\'t been personalized yet. You need to run personalize command first. + Wrong Series + Wrong Series and Number Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit