Updated on 2026-08-14
This commit is contained in:
parent
a11c157178
commit
deee3fde59
22 changed files with 237 additions and 145 deletions
|
|
@ -10,7 +10,7 @@ import com.tangem.tangemtest._arch.structure.Payload
|
|||
typealias ValueChange<V> = (V?) -> Unit
|
||||
typealias SafeValueChange<V> = (V) -> Unit
|
||||
|
||||
interface ItemViewModel<D> : Payload {
|
||||
interface ItemViewModel<D: Any?> : Payload {
|
||||
val viewState: ViewState
|
||||
var data: D?
|
||||
var defaultData: D?
|
||||
|
|
|
|||
|
|
@ -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<IncomingParameter>,
|
||||
val paramsList: List<Item>,
|
||||
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<IncomingParameter>()
|
||||
val allModifiedParams = mutableListOf<Item>()
|
||||
modifier?.modify(taskEvent, attrs.paramsList)?.forEach { parameter ->
|
||||
allModifiedParams.add(parameter)
|
||||
attrs.consequence?.affectChanges(parameter, attrs.paramsList)?.let { allModifiedParams.addAll(it) }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<IncomingParameter>
|
||||
typealias AffectedList = List<Item>
|
||||
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<IncomingParameter>
|
||||
fun parameterChanged(id: Id, value: Any?, callback: AffectedParamsCallback? = null)
|
||||
fun getParams(): List<Item>
|
||||
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<IncomingParameter>.findParameter(tag: TlvTag): IncomingParameter? {
|
||||
return firstOrNull { it.tlvTag == tag }
|
||||
fun List<Item>.findParameter(id: Id): Item? {
|
||||
return firstOrNull { it.id == id }
|
||||
}
|
||||
|
||||
fun List<Item>.findDataParameter(id: Id): BaseItem<Any?>? {
|
||||
val item = firstOrNull { it.id == id }
|
||||
return if (item is BaseItem<*>) item as BaseItem<Any?>
|
||||
else null
|
||||
}
|
||||
|
|
@ -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<IncomingParameter> by lazy { createParamsList() }
|
||||
protected val paramsList: List<Item> by lazy { createParamsList() }
|
||||
|
||||
abstract fun createParamsList(): List<IncomingParameter>
|
||||
abstract fun createParamsList(): List<Item>
|
||||
|
||||
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<IncomingParameter> = paramsList.toMutableList()
|
||||
override fun getParams(): MutableList<Item> = 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) }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<IncomingParameter> {
|
||||
return listOf(IncomingParameter(TlvTag.CardId, null))
|
||||
override fun createParamsList(): List<Item> {
|
||||
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))
|
||||
}
|
||||
}
|
||||
|
|
@ -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<IncomingParameter> {
|
||||
override fun createParamsList(): List<Item> {
|
||||
return listOf()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<IncomingParameter> {
|
||||
return listOf(IncomingParameter(TlvTag.CardId, null))
|
||||
override fun createParamsList(): List<Item> {
|
||||
return listOf(EditTextItem(TlvId.CardId, null))
|
||||
}
|
||||
|
||||
override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) {
|
||||
|
|
|
|||
|
|
@ -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<IncomingParameter> {
|
||||
override fun createParamsList(): List<Item> {
|
||||
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))
|
||||
}
|
||||
}
|
||||
|
|
@ -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<IncomingParameter>): List<IncomingParameter>
|
||||
fun modify(taskEvent: TaskEvent<*>, paramsList: List<Item>): List<Item>
|
||||
}
|
||||
|
|
@ -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<IncomingParameter>): List<IncomingParameter> {
|
||||
val parameter = paramsList.findParameter(TlvTag.CardId) ?: return listOf()
|
||||
override fun modify(taskEvent: TaskEvent<*>, paramsList: List<Item>): List<Item> {
|
||||
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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<IncomingParameter>): List<IncomingParameter>
|
||||
fun affectChanges(changedParameter: Item, paramsList: List<Item>): List<Item>
|
||||
}
|
||||
|
||||
class ExampleConsequenceForCardId : ParamsChangeConsequence {
|
||||
override fun affectChanges(changedParameter: IncomingParameter, paramsList: List<IncomingParameter>): List<IncomingParameter> {
|
||||
if (changedParameter.tlvTag != TlvTag.CardId) return listOf()
|
||||
override fun affectChanges(changedParameter: Item, paramsList: List<Item>): List<Item> {
|
||||
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
|
||||
}
|
||||
}
|
||||
|
|
@ -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<Id>() {
|
|||
init {
|
||||
PersonalizeResources().init(this)
|
||||
ActionResources().init(this)
|
||||
TlvResources().init(this)
|
||||
}
|
||||
|
||||
inline fun <reified Res : Resources> safeGet(id: Id): Res {
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
@ -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<ParameterWidget>()
|
||||
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<Any?> ?: 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<MainViewModel>()
|
||||
mainActViewModel.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { isEnabled ->
|
||||
widgetList.forEach { it.toggleDescriptionVisibility(isEnabled) }
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<String> = SingleLiveEvent()
|
||||
val seIncomingParameter: MutableLiveData<IncomingParameter> = SingleLiveEvent()
|
||||
val seIncomingParameter: MutableLiveData<Item> = 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<IncomingParameter>) {
|
||||
fun handleActionResult(response: TaskEvent<*>, list: List<Item>) {
|
||||
notifyParameterChanges(list)
|
||||
handleResponse(response)
|
||||
}
|
||||
|
||||
@UiThread
|
||||
fun notifyParameterChanges(list: List<IncomingParameter>) {
|
||||
fun notifyParameterChanges(list: List<Item>) {
|
||||
list.forEach { vm.seIncomingParameter.postValue(it) }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<Any> = item as BaseItem<Any>
|
||||
|
||||
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<ViewGroup>(R.id.container_description) }
|
||||
private val tvDescription: TextView? by lazy { descriptionContainer.findViewById<TextView>(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<Resources>(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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun initDescriptionWidget() {
|
||||
getResDescription()?.let { tvDescription?.setText(it) }
|
||||
}
|
||||
}
|
||||
|
||||
fun ParameterWidget.getResNameId(): Int = MainResourceHolder.safeGet<Resources>(id).resName
|
||||
|
||||
fun ParameterWidget.getResDescription(): Int? = MainResourceHolder.safeGet<Resources>(id).resDescription
|
||||
|
|
@ -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,
|
||||
}
|
||||
|
|
@ -60,7 +60,7 @@ enum class Denomination : BlockItem {
|
|||
Denomination,
|
||||
}
|
||||
|
||||
enum class Token : Id {
|
||||
enum class Token : BlockItem {
|
||||
ItsToken,
|
||||
Symbol,
|
||||
ContractAddress,
|
||||
|
|
|
|||
|
|
@ -1,44 +1,58 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/til_param"
|
||||
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.Dense"
|
||||
android:layout_width="0dp"
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/til_param"
|
||||
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.Dense"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/def_indent"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginEnd="@dimen/def_indent"
|
||||
android:layout_weight="1"
|
||||
app:boxBackgroundColor="@android:color/transparent"
|
||||
app:endIconMode="clear_text">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/et_param"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="start|bottom"
|
||||
android:paddingBottom="4dp" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_action"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="@dimen/def_indent"
|
||||
android:visibility="gone"
|
||||
tools:text="Action"
|
||||
tools:visibility="visible" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<include
|
||||
layout="@layout/w_field_description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/def_indent"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginEnd="@dimen/def_indent"
|
||||
app:boxBackgroundColor="@android:color/transparent"
|
||||
app:endIconMode="clear_text"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/btn_action"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/et_param"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="start|bottom"
|
||||
android:paddingBottom="4dp" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_action"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/def_indent"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="Action"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/til_item"
|
||||
tools:visibility="visible" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</LinearLayout>
|
||||
9
tangem-demo/src/main/res/values/strings_tlv.xml
Normal file
9
tangem-demo/src/main/res/values/strings_tlv.xml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="tlv_card_id">Card Id</string>
|
||||
<string name="tlv_transaction_out_hash">Transaction out hash</string>
|
||||
|
||||
<string name="info_tlv_card_id">SomeTlvDescription</string>
|
||||
<string name="info_tlv_transaction_out_hash">SomeTlvDescription</string>
|
||||
</resources>
|
||||
Loading…
Add table
Add a link
Reference in a new issue