Updated on 2026-08-14

This commit is contained in:
Tangem 2020-03-26 23:13:15 +03:00
parent a11c157178
commit deee3fde59
22 changed files with 237 additions and 145 deletions

View file

@ -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?

View file

@ -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) }

View file

@ -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
}
}

View file

@ -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
}
}

View file

@ -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
}

View file

@ -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) }
}

View file

@ -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))
}
}

View file

@ -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()
}

View file

@ -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) {

View file

@ -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))
}
}

View file

@ -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>
}

View file

@ -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()
}

View file

@ -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
}
}

View file

@ -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 {

View file

@ -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))
}
}

View file

@ -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) }
})
}

View file

@ -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) }
}

View file

@ -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

View file

@ -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,
}

View file

@ -60,7 +60,7 @@ enum class Denomination : BlockItem {
Denomination,
}
enum class Token : Id {
enum class Token : BlockItem {
ItsToken,
Symbol,
ContractAddress,

View file

@ -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>

View 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>