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 331950ea89..244f55b204 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 @@ -10,7 +10,7 @@ import com.tangem.tangemtest._arch.structure.Payload typealias ValueChange = (V?) -> Unit typealias SafeValueChange = (V) -> Unit -interface ItemViewModel : Payload { +interface ItemViewModel : Payload { val viewState: ViewState var data: D? var defaultData: D? diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/CardAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/CardAction.kt index bf622ac218..0517d86fbd 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/CardAction.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/CardAction.kt @@ -1,9 +1,9 @@ package com.tangem.tangemtest.ucase.domain.actions import com.tangem.CardManager -import com.tangem.common.tlv.TlvTag +import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction.AfterActionModification import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ParamsChangeConsequence import com.tangem.tasks.TaskEvent @@ -16,13 +16,13 @@ import com.tangem.tasks.TaskEvent */ data class AttrForAction( val cardManager: CardManager, - val paramsList: List, + val paramsList: List, val consequence: ParamsChangeConsequence? ) interface CardAction { fun executeMainAction(attrs: AttrForAction, callback: ActionCallback) - fun getActionByTag(tag: TlvTag, attrs: AttrForAction): ((ActionCallback) -> Unit)? = null + fun getActionByTag(id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? = null } abstract class BaseCardAction : CardAction { @@ -32,7 +32,7 @@ abstract class BaseCardAction : CardAction { attrs: AttrForAction, callback: ActionCallback ) { - val allModifiedParams = mutableListOf() + val allModifiedParams = mutableListOf() modifier?.modify(taskEvent, attrs.paramsList)?.forEach { parameter -> allModifiedParams.add(parameter) attrs.consequence?.affectChanges(parameter, attrs.paramsList)?.let { allModifiedParams.addAll(it) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepesonalizeAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepesonalizeAction.kt index 2c35284065..6934443f7d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepesonalizeAction.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepesonalizeAction.kt @@ -1,22 +1,24 @@ package com.tangem.tangemtest.ucase.domain.actions -import com.tangem.common.tlv.TlvTag +import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.domain.paramsManager.findParameter +import com.tangem.tangemtest.ucase.domain.paramsManager.findDataParameter +import com.tangem.tangemtest.ucase.variants.TlvId /** [REDACTED_AUTHOR] */ class DepesonalizeAction : BaseCardAction() { override fun executeMainAction(attrs: AttrForAction, callback: ActionCallback) { - val cardId = attrs.paramsList.findParameter(TlvTag.CardId)?.data as? String ?: return + val item = attrs.paramsList.findDataParameter(TlvId.CardId) ?: return + val cardId = item.viewModel.data as? String ?: return attrs.cardManager.depersonalize(cardId) { handleResponse(it, null, attrs, callback) } } - override fun getActionByTag(tag: TlvTag, attrs: AttrForAction): ((ActionCallback) -> Unit)? { - return when (tag) { - TlvTag.CardId -> { callback -> ScanAction().executeMainAction(attrs, callback) } + override fun getActionByTag(id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? { + return when (id) { + TlvId.CardId -> { callback -> ScanAction().executeMainAction(attrs, callback) } else -> null } } 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 5dc57933fe..a4bdcfd74c 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 @@ -1,8 +1,9 @@ package com.tangem.tangemtest.ucase.domain.actions -import com.tangem.common.tlv.TlvTag +import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.domain.paramsManager.findParameter +import com.tangem.tangemtest.ucase.domain.paramsManager.findDataParameter +import com.tangem.tangemtest.ucase.variants.TlvId import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf /** @@ -10,17 +11,17 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf */ class SignAction : BaseCardAction() { override fun executeMainAction(attrs: AttrForAction, callback: ActionCallback) { - val dataForHashing = attrs.paramsList.findParameter(TlvTag.TransactionOutHash) ?: return + val dataForHashing = attrs.paramsList.findDataParameter(TlvId.TransactionOutHash) ?: return - val arHashes = createHashes(stringOf(dataForHashing.data)) - val cardId = attrs.paramsList.findParameter(TlvTag.CardId)?.data ?: return + val arHashes = createHashes(stringOf(dataForHashing.viewModel.data)) + val cardId = attrs.paramsList.findDataParameter(TlvId.CardId)?.viewModel?.data ?: return attrs.cardManager.sign(arHashes, stringOf(cardId)) { handleResponse(it, null, attrs, callback) } } - override fun getActionByTag(tag: TlvTag, attrs: AttrForAction): ((ActionCallback) -> Unit)? { - return when (tag) { - TlvTag.CardId -> { callback -> ScanAction().executeMainAction(attrs, callback) } + override fun getActionByTag(id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? { + return when (id) { + TlvId.CardId -> { callback -> ScanAction().executeMainAction(attrs, callback) } else -> null } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ParamsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ParamsManager.kt index dabac40bab..80613d01c0 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ParamsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ParamsManager.kt @@ -1,11 +1,13 @@ package com.tangem.tangemtest.ucase.domain.paramsManager import com.tangem.CardManager -import com.tangem.common.tlv.TlvTag +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.tasks.TaskEvent typealias ActionResponse = TaskEvent<*> -typealias AffectedList = List +typealias AffectedList = List typealias AffectedParamsCallback = (AffectedList) -> Unit typealias ActionCallback = (ActionResponse, AffectedList) -> Unit @@ -14,15 +16,20 @@ typealias ActionCallback = (ActionResponse, AffectedList) -> Unit */ interface ParamsManager { - fun parameterChanged(tag: TlvTag, value: Any?, callback: AffectedParamsCallback? = null) - fun getParams(): List + fun parameterChanged(id: Id, value: Any?, callback: AffectedParamsCallback? = null) + fun getParams(): List fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) - fun getActionByTag(tag: TlvTag, cardManager: CardManager): ((ActionCallback) -> Unit)? + fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? } -class IncomingParameter(val tlvTag: TlvTag, var data: Any? = null) -fun List.findParameter(tag: TlvTag): IncomingParameter? { - return firstOrNull { it.tlvTag == tag } +fun List.findParameter(id: Id): Item? { + return firstOrNull { it.id == id } +} + +fun List.findDataParameter(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/BaseParamsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseParamsManager.kt index 3c148998f2..a33a0c4644 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseParamsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseParamsManager.kt @@ -1,10 +1,14 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.managers import com.tangem.CardManager -import com.tangem.common.tlv.TlvTag +import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest.ucase.domain.actions.AttrForAction import com.tangem.tangemtest.ucase.domain.actions.CardAction -import com.tangem.tangemtest.ucase.domain.paramsManager.* +import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback +import com.tangem.tangemtest.ucase.domain.paramsManager.AffectedParamsCallback +import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManager +import com.tangem.tangemtest.ucase.domain.paramsManager.findDataParameter import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ParamsChangeConsequence /** @@ -12,24 +16,24 @@ import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequen */ abstract class BaseParamsManager(protected val action: CardAction) : ParamsManager { - protected val paramsList: List by lazy { createParamsList() } + protected val paramsList: List by lazy { createParamsList() } - abstract fun createParamsList(): List + abstract fun createParamsList(): List - override fun parameterChanged(tag: TlvTag, value: Any?, callback: AffectedParamsCallback?) { + override fun parameterChanged(id: Id, value: Any?, callback: AffectedParamsCallback?) { if (paramsList.isEmpty()) return - val foundParam = paramsList.findParameter(tag) ?: return + val foundParam = paramsList.findDataParameter(id) ?: return - foundParam.data = value + foundParam.viewModel.data = value applyChangesByAffectedParams(foundParam, callback) } - override fun getParams(): MutableList = paramsList.toMutableList() + override fun getParams(): MutableList = paramsList.toMutableList() - override fun getActionByTag(tag: TlvTag, cardManager: CardManager): ((ActionCallback) -> Unit)? = null + override fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? = null // Use it if current parameter needs to be affect any other parameters - protected open fun applyChangesByAffectedParams(param: IncomingParameter, callback: AffectedParamsCallback?) { + protected open fun applyChangesByAffectedParams(param: Item, callback: AffectedParamsCallback?) { getChangeConsequence()?.affectChanges(param, paramsList)?.let { callback?.invoke(it) } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeParamsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeParamsManager.kt index c5e62648bd..df7bb08f3d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeParamsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeParamsManager.kt @@ -1,24 +1,26 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.managers import com.tangem.CardManager -import com.tangem.common.tlv.TlvTag +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.DepesonalizeAction import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter +import com.tangem.tangemtest.ucase.variants.TlvId /** [REDACTED_AUTHOR] */ class DepersonalizeParamsManager : BaseParamsManager(DepesonalizeAction()) { - override fun createParamsList(): List { - return listOf(IncomingParameter(TlvTag.CardId, null)) + override fun createParamsList(): List { + return listOf(EditTextItem(TlvId.CardId, null)) } override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { action.executeMainAction(getAttrsForAction(cardManager), callback) } - override fun getActionByTag(tag: TlvTag, cardManager: CardManager): ((ActionCallback) -> Unit)? { - return action.getActionByTag(tag, getAttrsForAction(cardManager)) + override fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? { + return action.getActionByTag(id, getAttrsForAction(cardManager)) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeParamsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeParamsManager.kt index c0d2ac94c2..ccaeba9804 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeParamsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeParamsManager.kt @@ -1,15 +1,15 @@ 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.PersonalizeAction import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter /** [REDACTED_AUTHOR] */ class PersonalizeParamsManager : BaseParamsManager(PersonalizeAction()) { - override fun createParamsList(): List { + override fun createParamsList(): List { return listOf() } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanParamsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanParamsManager.kt index 63c2918a28..5151c4d4f1 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanParamsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanParamsManager.kt @@ -1,17 +1,18 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.managers import com.tangem.CardManager -import com.tangem.common.tlv.TlvTag +import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest._arch.structure.impl.EditTextItem import com.tangem.tangemtest.ucase.domain.actions.ScanAction import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback -import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter +import com.tangem.tangemtest.ucase.variants.TlvId /** [REDACTED_AUTHOR] */ class ScanParamsManager : BaseParamsManager(ScanAction()) { - override fun createParamsList(): List { - return listOf(IncomingParameter(TlvTag.CardId, null)) + override fun createParamsList(): List { + return listOf(EditTextItem(TlvId.CardId, null)) } override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignParamsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignParamsManager.kt index b741700bb9..de1336bf31 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignParamsManager.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignParamsManager.kt @@ -1,19 +1,21 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.managers import com.tangem.CardManager -import com.tangem.common.tlv.TlvTag +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.IncomingParameter +import com.tangem.tangemtest.ucase.variants.TlvId /** [REDACTED_AUTHOR] */ class SignParamsManager : BaseParamsManager(SignAction()) { - override fun createParamsList(): List { + override fun createParamsList(): List { return listOf( - IncomingParameter(TlvTag.CardId, null), - IncomingParameter(TlvTag.TransactionOutHash, "Data used for hashing") + EditTextItem(TlvId.CardId, null), + EditTextItem(TlvId.TransactionOutHash, "Data used for hashing") ) } @@ -21,7 +23,7 @@ class SignParamsManager : BaseParamsManager(SignAction()) { action.executeMainAction(getAttrsForAction(cardManager), callback) } - override fun getActionByTag(tag: TlvTag, cardManager: CardManager): ((ActionCallback) -> Unit)? { - return action.getActionByTag(tag, getAttrsForAction(cardManager)) + override fun getActionByTag(id: Id, cardManager: CardManager): ((ActionCallback) -> Unit)? { + return action.getActionByTag(id, getAttrsForAction(cardManager)) } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt index c808aeaa76..635e1d67f3 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterActionModifiers.kt @@ -1,6 +1,6 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction -import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter +import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tasks.TaskEvent /** @@ -11,5 +11,5 @@ import com.tangem.tasks.TaskEvent * Returns a list of parameters that have been modified */ interface AfterActionModification { - fun modify(taskEvent: TaskEvent<*>, paramsList: List): List + fun modify(taskEvent: TaskEvent<*>, paramsList: List): List } \ No newline at end of file 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 e011e5a7fc..43615f6a1b 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 @@ -1,8 +1,8 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction -import com.tangem.common.tlv.TlvTag -import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter -import com.tangem.tangemtest.ucase.domain.paramsManager.findParameter +import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest.ucase.domain.paramsManager.findDataParameter +import com.tangem.tangemtest.ucase.variants.TlvId import com.tangem.tasks.ScanEvent import com.tangem.tasks.TaskEvent @@ -10,11 +10,11 @@ import com.tangem.tasks.TaskEvent [REDACTED_AUTHOR] */ class AfterScanModifier : AfterActionModification { - override fun modify(taskEvent: TaskEvent<*>, paramsList: List): List { - val parameter = paramsList.findParameter(TlvTag.CardId) ?: return listOf() + override fun modify(taskEvent: TaskEvent<*>, paramsList: List): List { + val parameter = paramsList.findDataParameter(TlvId.CardId) ?: return listOf() return if (taskEvent is TaskEvent.Event && taskEvent.data is ScanEvent.OnReadEvent) { - parameter.data = (taskEvent.data as ScanEvent.OnReadEvent).card.cardId + parameter.viewModel.data = (taskEvent.data as ScanEvent.OnReadEvent).card.cardId listOf(parameter) } else 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 cb2fa2dd98..846c4027d3 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 @@ -1,7 +1,7 @@ package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence -import com.tangem.common.tlv.TlvTag -import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter +import com.tangem.tangemtest._arch.structure.abstraction.Item +import com.tangem.tangemtest.ucase.variants.TlvId /** [REDACTED_AUTHOR] @@ -10,15 +10,15 @@ import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter * of the incoming parameter */ interface ParamsChangeConsequence { - fun affectChanges(changedParameter: IncomingParameter, paramsList: List): List + fun affectChanges(changedParameter: Item, paramsList: List): List } class ExampleConsequenceForCardId : ParamsChangeConsequence { - override fun affectChanges(changedParameter: IncomingParameter, paramsList: List): List { - if (changedParameter.tlvTag != TlvTag.CardId) return listOf() + override fun affectChanges(changedParameter: Item, paramsList: List): List { + if (changedParameter.id != TlvId.CardId) return listOf() - val affectedList = paramsList.filter { it.tlvTag != changedParameter.tlvTag } - affectedList.forEach { it.data = changedParameter.data.hashCode() } + val affectedList = paramsList.filter { it.id != changedParameter.id } +// affectedList.forEach { it.viewModel.data = changedParameter.viewModel.data?.hashCode() } return affectedList } } \ 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 997701527b..90b908b742 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.TlvResources import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder /** @@ -15,6 +16,7 @@ object MainResourceHolder : ResourceHolder() { init { PersonalizeResources().init(this) ActionResources().init(this) + TlvResources().init(this) } inline fun safeGet(id: Id): Res { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/TlvResources.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/TlvResources.kt new file mode 100644 index 0000000000..4de4ab008f --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/TlvResources.kt @@ -0,0 +1,20 @@ +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.TlvId + +/** +[REDACTED_AUTHOR] + */ +class TlvResources { + fun init(holder: MainResourceHolder) { + initScan(holder) + } + + private fun initScan(holder: MainResourceHolder) { + holder.register(TlvId.CardId, Resources(R.string.tlv_card_id, R.string.info_tlv_card_id)) + holder.register(TlvId.TransactionOutHash, Resources(R.string.tlv_transaction_out_hash, R.string.info_tlv_transaction_out_hash)) + } +} \ 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 46b38b597f..22185ec7e4 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 @@ -7,6 +7,7 @@ import android.view.ViewGroup import android.widget.LinearLayout import android.widget.TextView 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 @@ -15,10 +16,11 @@ 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.abstraction.BaseItem +import com.tangem.tangemtest._main.MainViewModel import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManager import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManagerFactory import com.tangem.tangemtest.ucase.resources.ActionType -import com.tangem.tangemtest.ucase.resources.MainResourceHolder import com.tangem.tangemtest.ucase.ui.widgets.ParameterWidget import ru.dev.gbixahue.eu4d.lib.android._android.views.find import ru.dev.gbixahue.eu4d.lib.android.global.log.Log @@ -62,9 +64,9 @@ abstract class BaseCardActionFragment : Fragment(), LayoutHolder { viewModel.ldParams.observe(viewLifecycleOwner, Observer { paramsList -> val widgetList = mutableListOf() paramsList.forEach { param -> - val widget = ParameterWidget(inflateParamView(incomingParamsContainer), MainResourceHolder, param) - widget.onValueChanged = { tag, value -> viewModel.userChangedParameter(tag, value) } - widget.onActionBtnClickListener = viewModel.getParameterAction(param.tlvTag) + val widget = ParameterWidget(inflateParamView(incomingParamsContainer), param) + widget.onValueChanged = { id, value -> viewModel.userChangedParameter(id, value) } + widget.onActionBtnClickListener = viewModel.getParameterAction(param.id) widgetList.add(widget) } callback(widgetList) @@ -81,8 +83,13 @@ abstract class BaseCardActionFragment : Fragment(), LayoutHolder { }) viewModel.seError.observe(viewLifecycleOwner, Observer { showSnackbarMessage(it) }) viewModel.seIncomingParameter.observe(viewLifecycleOwner, Observer { param -> - Log.d(this, "parameter changed from VM - name: ${param.tlvTag.name}, value:${param.data}") - widgetList.firstOrNull { it.tlvTag == param.tlvTag }?.changeParamValue(param.data) + val dataItem = param as? BaseItem ?: return@Observer + Log.d(this, "parameter changed from VM - name: ${dataItem.id}, value:${dataItem.viewModel.data}") + widgetList.firstOrNull { it.id == param.id }?.changeParamValue(param.viewModel.data) + }) + val mainActViewModel by activityViewModels() + mainActViewModel.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { isEnabled -> + widgetList.forEach { it.toggleDescriptionVisibility(isEnabled) } }) } 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 a364edad64..9df1ce1dcd 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 @@ -7,10 +7,10 @@ import androidx.lifecycle.ViewModelProvider import com.google.gson.GsonBuilder import com.tangem.CardManager import com.tangem.commands.Card -import com.tangem.common.tlv.TlvTag import com.tangem.tangemtest._arch.SingleLiveEvent +import com.tangem.tangemtest._arch.structure.Id +import com.tangem.tangemtest._arch.structure.abstraction.Item import com.tangem.tangemtest.commons.performAction -import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManager import com.tangem.tasks.ScanEvent import com.tangem.tasks.TaskError @@ -31,7 +31,7 @@ class ParamsViewModel(val paramsManager: ParamsManager) : ViewModel() { val ldParams = MutableLiveData(paramsManager.getParams()) val seError: MutableLiveData = SingleLiveEvent() - val seIncomingParameter: MutableLiveData = SingleLiveEvent() + val seIncomingParameter: MutableLiveData = SingleLiveEvent() private val notifier: Notifier = Notifier(this) private lateinit var cardManager: CardManager @@ -40,12 +40,12 @@ class ParamsViewModel(val paramsManager: ParamsManager) : ViewModel() { this.cardManager = cardManager } - fun userChangedParameter(tlvTag: TlvTag, value: Any?) { - parameterChanged(tlvTag, value) + fun userChangedParameter(id: Id, value: Any?) { + parameterChanged(id, value) } - private fun parameterChanged(tlvTag: TlvTag, value: Any?) { - paramsManager.parameterChanged(tlvTag, value) { notifier.notifyParameterChanges(it) } + private fun parameterChanged(id: Id, value: Any?) { + paramsManager.parameterChanged(id, value) { notifier.notifyParameterChanges(it) } } //invokes Scan, Sign etc... @@ -57,8 +57,8 @@ class ParamsViewModel(val paramsManager: ParamsManager) : ViewModel() { } } - fun getParameterAction(tag: TlvTag): (() -> Unit)? { - val parameterFunction = paramsManager.getActionByTag(tag, cardManager) ?: return null + fun getParameterAction(id: Id): (() -> Unit)? { + val parameterFunction = paramsManager.getActionByTag(id, cardManager) ?: return null return { parameterFunction { response, listOfChangedParams -> @@ -73,13 +73,13 @@ internal class Notifier(private val vm: ParamsViewModel) { private val gsonConverter = GsonBuilder().setPrettyPrinting().create() private var notShowedError: TaskError? = null - fun handleActionResult(response: TaskEvent<*>, list: List) { + fun handleActionResult(response: TaskEvent<*>, list: List) { notifyParameterChanges(list) handleResponse(response) } @UiThread - fun notifyParameterChanges(list: List) { + fun notifyParameterChanges(list: List) { list.forEach { vm.seIncomingParameter.postValue(it) } } 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 6aad9b7fb1..28a70434ed 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 @@ -5,14 +5,15 @@ import android.text.TextWatcher import android.view.View import android.view.ViewGroup import android.widget.Button +import android.widget.TextView import androidx.transition.AutoTransition import androidx.transition.TransitionManager import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout -import com.tangem.common.tlv.TlvTag import com.tangem.tangemtest.R -import com.tangem.tangemtest.ucase.domain.paramsManager.IncomingParameter -import com.tangem.tangemtest.ucase.resources.ActionType +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.ucase.resources.MainResourceHolder import com.tangem.tangemtest.ucase.resources.Resources import ru.dev.gbixahue.eu4d.lib.android.global.log.Log @@ -23,13 +24,13 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf */ class ParameterWidget( private val parent: ViewGroup, - private val resHolder: MainResourceHolder, - model: IncomingParameter + item: Item ) { - val tlvTag: TlvTag = model.tlvTag + val id: Id = item.id + val dataItem: BaseItem = item as BaseItem - var onValueChanged: ((TlvTag, Any?) -> Unit)? = null + var onValueChanged: ((Id, Any?) -> Unit)? = null var onActionBtnClickListener: (() -> Unit)? = null set(value) { field = value @@ -41,20 +42,24 @@ class ParameterWidget( private val btnAction: Button = parent.findViewById(R.id.btn_action) private val valueWatcher: TextWatcher by lazy { getWatcher() } + private val descriptionContainer: ViewGroup by lazy { parent.findViewById(R.id.container_description) } + private val tvDescription: TextView? by lazy { descriptionContainer.findViewById(R.id.tv_description) } + private var actionBtnVisibilityState: Int = btnAction.visibility - private var value: Any? = model.data + private var value: Any? = dataItem.viewModel.data init { - tilValue.hint = model.tlvTag.name - etValue.setText(stringOf(model.data)) + tilValue.hint = tilValue.context.getString(getResNameId()) + etValue.setText(stringOf(dataItem.viewModel.data)) etValue.addTextChangedListener(valueWatcher) btnAction.setOnClickListener { onActionBtnClickListener?.invoke() } - btnAction.text = btnAction.context.getString(getResName(tlvTag)) + btnAction.setText(getResNameId()) toggleActionBtnVisibility() + initDescriptionWidget() } fun changeParamValue(data: Any?, silent: Boolean = true) { - Log.d(this, "changeParamValue: tag: $tlvTag, value: $data") + Log.d(this, "changeParamValue: tag: $id, value: $data") value = data toggleActionBtnVisibility() if (silent) { @@ -66,13 +71,18 @@ class ParameterWidget( } } + fun toggleDescriptionVisibility(state: Boolean) { + TransitionManager.beginDelayedTransition(parent.parent as ViewGroup, AutoTransition()) + descriptionContainer.visibility = if (state) View.VISIBLE else View.GONE + } + private fun getWatcher(): TextWatcher { return object : TextWatcher { override fun afterTextChanged(editable: Editable?) { Log.d(this, "afterTextChanged $editable") value = if (editable.isNullOrEmpty()) null else editable.toString() toggleActionBtnVisibility() - onValueChanged?.invoke(tlvTag, value) + onValueChanged?.invoke(id, value) } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} @@ -81,14 +91,6 @@ class ParameterWidget( } } - private fun getResName(tag: TlvTag): Int { - val action = when (tag) { - TlvTag.CardId -> ActionType.Scan - else -> ActionType.Unknown - } - return resHolder.safeGet(action).resName - } - private fun toggleActionBtnVisibility() { fun switchVisibilityState(newState: Int) { actionBtnVisibilityState = newState @@ -104,4 +106,12 @@ class ParameterWidget( value != null && actionBtnVisibilityState != View.GONE -> switchVisibilityState(View.GONE) } } -} \ No newline at end of file + + private fun initDescriptionWidget() { + getResDescription()?.let { tvDescription?.setText(it) } + } +} + +fun ParameterWidget.getResNameId(): Int = MainResourceHolder.safeGet(id).resName + +fun ParameterWidget.getResDescription(): Int? = MainResourceHolder.safeGet(id).resDescription \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt new file mode 100644 index 0000000000..01d33a8aa4 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/Ids.kt @@ -0,0 +1,11 @@ +package com.tangem.tangemtest.ucase.variants + +import com.tangem.tangemtest._arch.structure.Id + +/** +[REDACTED_AUTHOR] + */ +enum class TlvId: Id { + CardId, + TransactionOutHash, +} \ No newline at end of file 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 23c31e2fe8..f24354de68 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 @@ -60,7 +60,7 @@ enum class Denomination : BlockItem { Denomination, } -enum class Token : Id { +enum class Token : BlockItem { ItsToken, Symbol, ContractAddress, diff --git a/tangem-demo/src/main/res/layout/w_card_incoming_param.xml b/tangem-demo/src/main/res/layout/w_card_incoming_param.xml index 3a42c30943..edc43e19d6 100644 --- a/tangem-demo/src/main/res/layout/w_card_incoming_param.xml +++ b/tangem-demo/src/main/res/layout/w_card_incoming_param.xml @@ -1,44 +1,58 @@ - + android:layout_height="wrap_content" + android:orientation="vertical"> - + + + + + + + +