Updated on 2026-08-14

This commit is contained in:
Tangem 2020-04-08 00:50:00 +03:00
parent 1a1109d1d8
commit e6426d92f4
6 changed files with 48 additions and 27 deletions

View file

@ -2,14 +2,24 @@ package com.tangem.tangemtest._main
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.tangem.tasks.TaskEvent
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
*/
class MainViewModel : ViewModel() {
val ldDescriptionSwitch = MutableLiveData<Boolean>(false)
val ldResponseEvent = MutableLiveData<TaskEvent<*>>()
fun switchToggled(state: Boolean) {
ldDescriptionSwitch.postValue(state)
}
fun changeResponseEvent(event: TaskEvent<*>?) {
Log.d(this, "changeResponseEvent")
val reqEvent = event ?: return
ldResponseEvent.value = reqEvent
}
}

View file

@ -5,16 +5,22 @@ import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizeItem
import com.tangem.tangemtest.ucase.domain.paramsManager.managers.ScanItemsManager
import com.tangem.tangemtest.ucase.domain.paramsManager.managers.SignItemsManager
import com.tangem.tangemtest.ucase.resources.ActionType
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
/**
[REDACTED_AUTHOR]
*/
class ParamsManagerFactory : BaseTypedHolder<ActionType, ItemsManager>() {
class ItemManagersStore : BaseTypedHolder<ActionType, ItemsManager>() {
companion object {
fun createFactory(): ParamsManagerFactory {
return ParamsManagerFactory().apply {
val instance: ItemManagersStore
get() = createFactory()
private fun createFactory(): ItemManagersStore {
Log.d(this, "New instance was created")
return ItemManagersStore().apply {
register(ActionType.Scan, ScanItemsManager())
register(ActionType.Sign, SignItemsManager())
register(ActionType.Personalize, PersonalizeItemsManager())

View file

@ -24,10 +24,10 @@ import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
[REDACTED_AUTHOR]
*/
class ActionViewModelFactory(private val manager: ItemsManager) : ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel?> create(modelClass: Class<T>): T = ParamsViewModel(manager) as T
override fun <T : ViewModel?> create(modelClass: Class<T>): T = ActionViewModel(manager) as T
}
class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), LifecycleObserver {
class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), LifecycleObserver {
val seResponseEvent = SingleLiveEvent<TaskEvent<*>>()
val seReadResponse = SingleLiveEvent<String>()
@ -44,6 +44,7 @@ class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif
this.cardManager = cardManager
}
@Deprecated("Events must be send directly from the Widget")
fun userChangedItem(id: Id, value: Any?) {
itemChanged(id, value)
}
@ -90,7 +91,7 @@ class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif
}
}
internal class Notifier(private val vm: ParamsViewModel) {
internal class Notifier(private val vm: ActionViewModel) {
private var notShowedError: TaskError? = null
private val gson: Gson = GsonInitializer().gson

View file

@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.plusAssign
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
@ -14,8 +15,8 @@ import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
import com.tangem.tangemtest._main.MainViewModel
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemManagersStore
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManagerFactory
import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
import com.tangem.tangemtest.ucase.resources.ActionType
import com.tangem.tangemtest.ucase.tunnel.ActionView
@ -36,9 +37,12 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView {
get() = mainView.findViewById(R.id.fab_action)
protected val mainActivityVM by activityViewModels<MainViewModel>()
protected val paramsVM: ParamsViewModel by viewModels { ActionViewModelFactory(itemsManager) }
protected val actionVM: ActionViewModel by viewModels { ActionViewModelFactory(itemsManager) }
protected val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(getAction())!! }
protected val itemsManager: ItemsManager by lazy {
Log.d(this, "create ItemManager")
ItemManagersStore.instance.get(getAction())!!
}
private val paramsWidgetList = mutableListOf<ParameterWidget>()
@ -46,9 +50,9 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView {
super.onViewCreated(view, savedInstanceState)
Log.d(this, "onViewCreated")
viewLifecycleOwner.lifecycle.addObserver(paramsVM)
paramsVM.setCardManager(CardManager.init(requireActivity()))
paramsVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView))
viewLifecycleOwner.lifecycle.addObserver(actionVM)
actionVM.setCardManager(CardManager.init(requireActivity()))
actionVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView))
initFab()
createWidgets { subscribeToViewModelChanges() }
@ -56,16 +60,16 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView {
protected open fun initFab() {
enableActionFab(false)
actionFab.setOnClickListener { paramsVM.invokeMainAction() }
actionFab.setOnClickListener { actionVM.invokeMainAction() }
}
protected open fun createWidgets(widgetCreatedCallback: () -> Unit) {
Log.d(this, "createWidgets")
paramsVM.ldItemList.observe(viewLifecycleOwner, Observer { itemList ->
actionVM.ldItemList.observe(viewLifecycleOwner, Observer { itemList ->
itemList.forEach { param ->
val widget = ParameterWidget(inflateParamView(itemContainer), param)
widget.onValueChanged = { id, value -> paramsVM.userChangedItem(id, value) }
widget.onActionBtnClickListener = paramsVM.getItemAction(param.id)
widget.onValueChanged = { id, value -> actionVM.userChangedItem(id, value) }
widget.onActionBtnClickListener = actionVM.getItemAction(param.id)
paramsWidgetList.add(widget)
}
widgetCreatedCallback()
@ -83,7 +87,7 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView {
}
protected open fun listenEvent() {
paramsVM.seResponseEvent.observe(viewLifecycleOwner, Observer {
actionVM.seResponseEvent.observe(viewLifecycleOwner, Observer {
mainActivityVM.changeResponseEvent(it)
})
}
@ -91,18 +95,18 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView {
protected open fun listenReadResponse() {}
protected open fun listenResponse() {
paramsVM.seResponse.observe(viewLifecycleOwner, Observer {
actionVM.seResponse.observe(viewLifecycleOwner, Observer {
navigateTo(R.id.action_nav_card_action_to_response_screen)
})
}
protected open fun listenError() {
paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbar(it) })
actionVM.seError.observe(viewLifecycleOwner, Observer { showSnackbar(it) })
}
@Deprecated("Start to use itemViewModel")
protected open fun listenChangedItems() {
paramsVM.seChangedItems.observe(viewLifecycleOwner, Observer { itemList ->
actionVM.seChangedItems.observe(viewLifecycleOwner, Observer { itemList ->
itemList.forEach { item ->
Log.d(this, "item changed from VM - name: ${item.id}")
val dataItem = item as? BaseItem<Any?> ?: return@Observer
@ -114,14 +118,14 @@ abstract class BaseCardActionFragment : BaseFragment(), ActionView {
protected open fun listenDescriptionSwitchChanges() {
mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer {
paramsVM.toggleDescriptionVisibility(it)
actionVM.toggleDescriptionVisibility(it)
})
}
private fun inflateParamView(where: ViewGroup): ViewGroup {
val inflater = LayoutInflater.from(where.context)
val view = inflater.inflate(R.layout.w_card_incoming_param, where, false)
where.addView(view)
where.plusAssign(view)
return view as ViewGroup
}

View file

@ -22,19 +22,19 @@ class PersonalizeFragment : BaseCardActionFragment() {
override fun getLayoutId(): Int = R.layout.fg_personalize
override fun initFab() {
actionFab.setOnClickListener { paramsVM.invokeMainAction() }
actionFab.setOnClickListener { actionVM.invokeMainAction() }
}
override fun createWidgets(widgetCreatedCallback: () -> Unit) {
Log.d(this, "createWidgets")
val itemList = mutableListOf<Item>()
paramsVM.ldItemList.observe(viewLifecycleOwner, Observer { list ->
actionVM.ldItemList.observe(viewLifecycleOwner, Observer { list ->
Log.d(this, "ldBlockList size: ${list.size}")
itemList.clear()
itemList.addAll(list)
itemList.forEach { WidgetBuilder(PersonalizeItemBuilder()).build(it, itemContainer) }
paramsVM.attachToPayload(mutableMapOf(
actionVM.attachToPayload(mutableMapOf(
PayloadKey.actionView to this as ActionView,
PayloadKey.itemList to itemList
))
@ -50,7 +50,7 @@ class PersonalizeFragment : BaseCardActionFragment() {
}
override fun listenEvent() {
paramsVM.seResponseEvent.observe(viewLifecycleOwner, Observer {
actionVM.seResponseEvent.observe(viewLifecycleOwner, Observer {
mainActivityVM.changeResponseEvent(it)
navigateTo(R.id.action_nav_card_action_to_response_screen)
})

View file

@ -24,7 +24,7 @@ class ScanActionFragment : BaseCardActionFragment() {
}
override fun listenReadResponse() {
paramsVM.seReadResponse.observe(viewLifecycleOwner, Observer {
actionVM.seReadResponse.observe(viewLifecycleOwner, Observer {
navigateTo(
R.id.action_nav_card_action_to_response_screen,
bundleOf(Pair(BaseCardResponseFragment.response, it))