From 7f7c0b24ce07e8e3be9191bfb234ef081383d59f Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 24 Mar 2020 23:52:05 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../_arch/structure/base/unit_block.kt | 9 +- .../_arch/structure/base/unit_model.kt | 50 ++- .../tangemtest/_arch/structure/impl/items.kt | 9 +- .../_arch/structure/impl/view_models.kt | 25 +- .../tangem/tangemtest/_main/MainActivity.kt | 14 + .../tangem/tangemtest/_main/MainViewModel.kt | 15 + .../_main/entry_point/EntryPointFragment.kt | 17 +- .../BaseCardActionFragment.kt | 8 +- .../card/actions}/ParamsViewModel.kt | 2 +- .../actions}/ScanActionFragment.kt | 3 +- .../actions}/SignActionFragment.kt | 3 +- .../actions}/widgets/ParameterWidget.kt | 2 +- .../ui/personalize/PersonalizeFragment.kt | 16 +- .../ui/personalize/PersonalizeResources.kt | 339 ++++++++++++++++++ .../{view_model => }/PersonalizeViewModel.kt | 21 +- .../ui/personalize/UnitInfoHolder.kt | 339 ------------------ .../json_test => converter}/encode_decode.kt | 2 +- .../json_test => converter}/json_dto.kt | 2 +- .../json_test => converter}/to_block.kt | 2 +- .../json_test => converter}/to_json.kt | 2 +- .../{block_widget.kt => WidgetBuilder.kt} | 27 +- .../widgets/base/AbstractionBlockWidget.kt | 18 + .../widgets/base/AbstractionUnitWidget.kt | 36 ++ .../personalize/widgets/impl/BlockWidgets.kt | 17 + .../personalize/widgets/impl/UnitWidgets.kt | 205 +++++++++++ .../ui/personalize/widgets/unit_widget.kt | 59 --- .../ui/personalize/widgets/widgets.kt | 148 -------- .../res/color/menu_switch_color_thumb.xml | 5 + .../res/color/menu_switch_color_track.xml | 5 + .../res/color/mtrl_fab_bg_color_selector.xml | 4 +- .../mtrl_fab_icon_text_color_selector.xml | 4 +- .../src/main/res/layout/fg_entry_point.xml | 10 - .../src/main/res/layout/menu_item_switch.xml | 8 + .../main/res/layout/w_field_description.xml | 18 +- .../layout/w_personalize_item_edit_text.xml | 10 +- .../res/layout/w_personalize_item_number.xml | 11 +- .../res/layout/w_personalize_item_spinner.xml | 8 + .../res/layout/w_personalize_item_switch.xml | 13 +- .../res/layout/w_personalize_item_text.xml | 11 +- tangem-demo/src/main/res/menu/main_menu.xml | 10 + .../src/main/res/navigation/navigation.xml | 6 +- tangem-demo/src/main/res/values/colors.xml | 6 + tangem-demo/src/main/res/values/dimens.xml | 26 +- .../res/values/string_personalization.xml | 143 ++++++++ tangem-demo/src/main/res/values/strings.xml | 72 +--- tangem-demo/src/main/res/values/styles.xml | 16 +- 46 files changed, 1013 insertions(+), 763 deletions(-) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/{card_action => card}/BaseCardActionFragment.kt (93%) rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/{view_models => ui/card/actions}/ParamsViewModel.kt (98%) rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/{card_action => card/actions}/ScanActionFragment.kt (68%) rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/{card_action => card/actions}/SignActionFragment.kt (68%) rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/{card_action => card/actions}/widgets/ParameterWidget.kt (98%) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeResources.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/{view_model => }/PersonalizeViewModel.kt (52%) delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/UnitInfoHolder.kt rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/{personalize_converter/json_test => converter}/encode_decode.kt (84%) rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/{personalize_converter/json_test => converter}/json_dto.kt (96%) rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/{personalize_converter/json_test => converter}/to_block.kt (99%) rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/{personalize_converter/json_test => converter}/to_json.kt (73%) rename tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/{block_widget.kt => WidgetBuilder.kt} (67%) create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/base/AbstractionBlockWidget.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/base/AbstractionUnitWidget.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/impl/BlockWidgets.kt create mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/impl/UnitWidgets.kt delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/unit_widget.kt delete mode 100644 tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/widgets.kt create mode 100644 tangem-demo/src/main/res/color/menu_switch_color_thumb.xml create mode 100644 tangem-demo/src/main/res/color/menu_switch_color_track.xml create mode 100644 tangem-demo/src/main/res/layout/menu_item_switch.xml create mode 100644 tangem-demo/src/main/res/menu/main_menu.xml create mode 100644 tangem-demo/src/main/res/values/string_personalization.xml diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/base/unit_block.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/base/unit_block.kt index 4f596a5a6c..95b57c29d5 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/base/unit_block.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/base/unit_block.kt @@ -22,7 +22,7 @@ open class ListUnitBlock( ) : BaseBlock(), ItemListHolder { override fun setItems(list: MutableList) { - ULog.d(this, "setUnits: $id, ${list.size}") + ULog.d(this, "setItems into: $id, count: ${list.size}") unitList.clear() unitList.addAll(list) unitList.forEach { it.parent = this } @@ -30,25 +30,24 @@ open class ListUnitBlock( } override fun getItems(): MutableList { - ULog.d(this, "getUnits: $id, ${unitList.size}") return unitList } override fun addItem(item: Unit) { - ULog.d(this, "addUnit: $id, ${unitList.size}") + ULog.d(this, "addIte into: $id, who: ${item.id}") item.parent = this unitList.add(item) blockModified?.invoke() } override fun removeItem(item: Unit) { - ULog.d(this, "removeUnit $item") + ULog.d(this, "removeItem from: $id, which: ${item.id}") unitList.remove(item) blockModified?.invoke() } override fun clear() { - ULog.d(this, "clear") + ULog.d(this, "clear $id") unitList.clear() blockModified?.invoke() } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/base/unit_model.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/base/unit_model.kt index 94c7aa795c..83f2547613 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/base/unit_model.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/base/unit_model.kt @@ -4,28 +4,50 @@ package com.tangem.tangemtest._arch.structure.base /** [REDACTED_AUTHOR] */ -data class ViewState( - var isEnabled: Boolean = true, - var visibility: Int = 0x00000000, - var descriptionVisibility: Int = 0x00000008 -) +typealias ValueChange = (V?) -> kotlin.Unit +typealias SafeValueChange = (V) -> kotlin.Unit interface UnitViewModel : Payload { - var viewState: ViewState? + val viewState: ViewState var data: D? + var onDataUpdated: ValueChange? - fun updateData(data: D?) + fun updateDataByView(data: D?) } -open class BaseUnitViewModel( - override var data: D? = null -) : UnitViewModel { +open class BaseUnitViewModel : UnitViewModel { - override var viewState: ViewState? = ViewState() + override val viewState: ViewState = ViewState() override val payload: MutableMap = mutableMapOf() - override fun updateData(data: D?) { - ULog.d(this, "data changed: $data") - this.data = data + override var data: D? = null + set(value) { + if (handleDataUpdates(value)) field = value + } + + override var onDataUpdated: ValueChange? = null + + protected open fun handleDataUpdates(value: D?): Boolean { + ULog.d(this, "handleDateUpdates: $value") + onDataUpdated?.invoke(value) + return true } + + override fun updateDataByView(data: D?) { + ULog.d(this, "data changed: $data") + val callback = onDataUpdated + onDataUpdated = null + this.data = data + onDataUpdated = callback + } +} + +class ViewState { + var descriptionVisibility: Int = 0x00000008 + set(value) { + field = value + onDescriptionVisibilityChanged?.invoke(value) + } + + var onDescriptionVisibilityChanged: SafeValueChange? = null } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/items.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/items.kt index ae41c59a1e..fad398ae5f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/items.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/items.kt @@ -10,10 +10,5 @@ class NumberUnit(override val id: Id, value: Number? = null) : DataUnit( class BoolUnit(override val id: Id, value: Boolean? = null) : DataUnit(BoolViewModel(value)) class ListUnit(override val id: Id, value: List, selectedValue: Any) - : DataUnit(ListViewModel(ModelHelper(selectedValue, value)) -) - -fun DataUnit<*>.resName(resId: Int): DataUnit<*> { - payload["resName"] = resId - return this -} \ No newline at end of file + : DataUnit(ListViewModel(ListValueWrapper(selectedValue, value)) +) \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/view_models.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/view_models.kt index 8c96338253..ace209f94d 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/view_models.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/view_models.kt @@ -5,10 +5,25 @@ import com.tangem.tangemtest._arch.structure.base.BaseUnitViewModel /** [REDACTED_AUTHOR] */ -class StringViewModel(value: String?) : BaseUnitViewModel(value) -class NumberViewModel(value: Number?) : BaseUnitViewModel(value) -class BoolViewModel(value: Boolean?) : BaseUnitViewModel(value) -class ListViewModel(value: ModelHelper?) : BaseUnitViewModel(value) +open class TransitiveViewModel(value: D?) : BaseUnitViewModel() { + init { + data = value + } +} + +class StringViewModel(value: String?) : TransitiveViewModel(value) +class NumberViewModel(value: Number?) : TransitiveViewModel(value) +class BoolViewModel(value: Boolean?) : TransitiveViewModel(value) +class ListViewModel(value: ListValueWrapper?) : TransitiveViewModel(value) { + + override fun handleDataUpdates(value: ListValueWrapper?): Boolean { + val newValue = value ?: return false + if (newValue.selectedItem == data?.selectedItem) return false + + onDataUpdated?.invoke(value) + return true + } +} class KeyValue(val key: String, val value: Any) -class ModelHelper(var selectedItem: Any, val itemList: List) \ No newline at end of file +class ListValueWrapper(var selectedItem: Any, val itemList: List) \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt index 7be9b29f37..2b25ba86b4 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainActivity.kt @@ -3,7 +3,10 @@ package com.tangem.tangemtest._main import android.content.res.Resources import android.os.Bundle import android.util.Log +import android.view.Menu +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.SwitchCompat import androidx.appcompat.widget.Toolbar import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment @@ -16,6 +19,8 @@ import com.tangem.tangemtest.R * A simple activity demonstrating use of a NavHostFragment with a navigation drawer. */ class MainActivity : AppCompatActivity() { + + private val vm: MainViewModel by viewModels() private lateinit var appBarConfiguration: AppBarConfiguration override fun onCreate(savedInstanceState: Bundle?) { @@ -45,4 +50,13 @@ class MainActivity : AppCompatActivity() { override fun onSupportNavigateUp(): Boolean { return findNavController(R.id.nav_host_fragment).navigateUp(appBarConfiguration) } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.main_menu, menu) + val switchMenu = menu.findItem(R.id.action_favorite) + (switchMenu.actionView as? SwitchCompat)?.let { + it.setOnCheckedChangeListener { buttonView, isChecked -> vm.switchToggled(isChecked) } + } + return super.onCreateOptionsMenu(menu) + } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt new file mode 100644 index 0000000000..17ce97d8f9 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt @@ -0,0 +1,15 @@ +package com.tangem.tangemtest._main + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +/** +[REDACTED_AUTHOR] + */ +class MainViewModel : ViewModel() { + val ldDescriptionSwitch = MutableLiveData(false) + + fun switchToggled(state: Boolean) { + ldDescriptionSwitch.postValue(state) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entry_point/EntryPointFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entry_point/EntryPointFragment.kt index 31f7efc701..eb8907f312 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entry_point/EntryPointFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entry_point/EntryPointFragment.kt @@ -5,18 +5,19 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer import androidx.navigation.NavController import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.tangem.tangemtest.R +import com.tangem.tangemtest._main.MainViewModel import com.tangem.tangemtest.commons.ActionType import com.tangem.tangemtest.commons.NavigateOptions import com.tangem.tangemtest.commons.getDefaultNavigationOptions import kotlinx.android.synthetic.main.fg_entry_point.* -import ru.dev.gbixahue.eu4d.lib.android._android.views.find /** [REDACTED_AUTHOR] @@ -26,6 +27,8 @@ class EntryPointFragment : Fragment() { private val navController: NavController by lazy { findNavController() } private lateinit var rvActions: RecyclerView + private val mainActivityVM: MainViewModel by activityViewModels() + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fg_entry_point, container, false) } @@ -33,13 +36,10 @@ class EntryPointFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initRecyclerView() - initPersonalizeNagivation() - } - private fun initPersonalizeNagivation() { - view?.find(R.id.fab_personalize)?.setOnClickListener { - navigate(R.id.action_nav_entry_point_to_nav_personalize) - } + mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { + // do some thing + }) } private fun initRecyclerView() { @@ -66,6 +66,7 @@ class EntryPointFragment : Fragment() { return mutableListOf( NavigateOptions(ActionType.Scan, R.id.action_nav_entry_point_to_nav_scan), NavigateOptions(ActionType.Sign, R.id.action_nav_entry_point_to_nav_sign), + NavigateOptions(ActionType.Personalize, R.id.action_nav_entry_point_to_nav_personalize), NavigateOptions(ActionType.CreateWallet, R.id.action_nav_entry_point_to_nav_wallet_create), NavigateOptions(ActionType.PurgeWallet, R.id.action_nav_entry_point_to_nav_wallet_purge), NavigateOptions(ActionType.ReadIssuerData, R.id.action_nav_entry_point_to_nav_issuer_read_data), diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/BaseCardActionFragment.kt similarity index 93% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/BaseCardActionFragment.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/BaseCardActionFragment.kt index 6ef97001d9..082009eb10 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/BaseCardActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/BaseCardActionFragment.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.card_use_cases.ui.card_action +package com.tangem.tangemtest.card_use_cases.ui.card import android.os.Bundle import android.view.LayoutInflater @@ -17,9 +17,9 @@ import com.tangem.tangem_sdk_new.extensions.init import com.tangem.tangemtest.R import com.tangem.tangemtest.card_use_cases.domain.params_manager.ParamsManager import com.tangem.tangemtest.card_use_cases.domain.params_manager.ParamsManagerFactory -import com.tangem.tangemtest.card_use_cases.ui.card_action.widgets.ParameterWidget -import com.tangem.tangemtest.card_use_cases.view_models.ActionViewModelFactory -import com.tangem.tangemtest.card_use_cases.view_models.ParamsViewModel +import com.tangem.tangemtest.card_use_cases.ui.card.actions.ActionViewModelFactory +import com.tangem.tangemtest.card_use_cases.ui.card.actions.ParamsViewModel +import com.tangem.tangemtest.card_use_cases.ui.card.actions.widgets.ParameterWidget import com.tangem.tangemtest.commons.ActionType import ru.dev.gbixahue.eu4d.lib.android._android.views.find import ru.dev.gbixahue.eu4d.lib.android.global.log.Log diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/view_models/ParamsViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ParamsViewModel.kt similarity index 98% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/view_models/ParamsViewModel.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ParamsViewModel.kt index 974c2e0453..6576c6ae98 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/view_models/ParamsViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ParamsViewModel.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.card_use_cases.view_models +package com.tangem.tangemtest.card_use_cases.ui.card.actions import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/ScanActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ScanActionFragment.kt similarity index 68% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/ScanActionFragment.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ScanActionFragment.kt index 04586462b1..1b8a47d97b 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/ScanActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/ScanActionFragment.kt @@ -1,6 +1,7 @@ -package com.tangem.tangemtest.card_use_cases.ui.card_action +package com.tangem.tangemtest.card_use_cases.ui.card.actions import com.tangem.tangemtest.R +import com.tangem.tangemtest.card_use_cases.ui.card.BaseCardActionFragment import com.tangem.tangemtest.commons.ActionType /** diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/SignActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/SignActionFragment.kt similarity index 68% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/SignActionFragment.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/SignActionFragment.kt index fceb4cc65f..b73fa8bd05 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/SignActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/SignActionFragment.kt @@ -1,6 +1,7 @@ -package com.tangem.tangemtest.card_use_cases.ui.card_action +package com.tangem.tangemtest.card_use_cases.ui.card.actions import com.tangem.tangemtest.R +import com.tangem.tangemtest.card_use_cases.ui.card.BaseCardActionFragment import com.tangem.tangemtest.commons.ActionType /** diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/widgets/ParameterWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/widgets/ParameterWidget.kt similarity index 98% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/widgets/ParameterWidget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/widgets/ParameterWidget.kt index 24b922e097..823914c5cb 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card_action/widgets/ParameterWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/card/actions/widgets/ParameterWidget.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.card_use_cases.ui.card_action.widgets +package com.tangem.tangemtest.card_use_cases.ui.card.actions.widgets import android.text.Editable import android.text.TextWatcher diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeFragment.kt index 8a5f824bff..9915bf4cb0 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeFragment.kt @@ -7,11 +7,11 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import com.tangem.tangemtest.R -import com.tangem.tangemtest.card_use_cases.ui.personalize.view_model.PersonalizeViewModel -import com.tangem.tangemtest.card_use_cases.ui.personalize.view_model.PersonalizeViewModelFactory +import com.tangem.tangemtest._main.MainViewModel import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.WidgetBuilder import ru.dev.gbixahue.eu4d.lib.android.global.log.Log import java.io.IOException @@ -23,11 +23,13 @@ import java.nio.charset.Charset */ class PersonalizeFragment : Fragment() { - protected val blockContainer: ViewGroup by lazy { + private val mainActivityVM: MainViewModel by activityViewModels() + private val viewModel: PersonalizeViewModel by viewModels { PersonalizeViewModelFactory(getPersonalizeJson()) } + + private val blockContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_container) } - protected val viewModel: PersonalizeViewModel by viewModels { PersonalizeViewModelFactory(getPersonalizeJson()) } - protected lateinit var mainView: View + private lateinit var mainView: View override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { Log.d(this, "onCreateView") @@ -40,7 +42,9 @@ class PersonalizeFragment : Fragment() { viewModel.ldBlockList.observe(viewLifecycleOwner, Observer { blocList -> blocList.forEach { WidgetBuilder().build(it, blockContainer) } - + }) + mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { + viewModel.toggleDescriptionVisibility(it) }) } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeResources.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeResources.kt new file mode 100644 index 0000000000..0679bb24d3 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeResources.kt @@ -0,0 +1,339 @@ +package com.tangem.tangemtest.card_use_cases.ui.personalize + +import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.structure.base.* + +/** +[REDACTED_AUTHOR] + */ +data class UnitResource( + val resName: Int, + val resDescription: Int? = null +) + +object PersonalizeResources { + private val map = mutableMapOf() + + init { + InfoInitializer().init(map) + } + + fun get(id: Id): UnitResource = map[id] ?: UnitResource(R.string.unknown, R.string.unknown) +} + +internal class InfoInitializer() { + fun init(map: MutableMap) { + initBlock(map) + initCardNumber(map) + initCommon(map) + initSigningMethod(map) + initSignHashExProp(map) + initDenomination(map) + initToken(map) + initProductMask(map) + initSettingsMask(map) + initSettingsMaskProtocolEnc(map) + initSettingsMaskNde(map) + initPins(map) + } + + private fun initBlock(map: MutableMap) { + map[BlockId.CARD_NUMBER] = UnitResource( + R.string.pers_block_card_number, + R.string.info_pers_block_card_number + ) + map[BlockId.COMMON] = UnitResource( + R.string.pers_block_common, + R.string.info_pers_block_common + ) + map[BlockId.SIGNING_METHOD] = UnitResource( + R.string.pers_block_signing_method, + R.string.info_pers_block_signing_method + ) + map[BlockId.SIGN_HASH_EX_PROP] = UnitResource( + R.string.pers_block_sign_hash_ex_prop, + R.string.info_pers_block_sign_hash_ex_prop + ) + map[BlockId.DENOMINATION] = UnitResource( + R.string.pers_block_denomination, + R.string.info_pers_block_denomination + ) + map[BlockId.TOKEN] = UnitResource( + R.string.pers_block_token, + R.string.info_pers_block_token + ) + map[BlockId.PROD_MASK] = UnitResource( + R.string.pers_block_product_mask, + R.string.info_pers_block_product_mask + ) + map[BlockId.SETTINGS_MASK] = UnitResource( + R.string.pers_block_settings_mask, + R.string.info_pers_block_settings_mask + ) + map[BlockId.SETTINGS_MASK_PROTOCOL_ENC] = UnitResource( + R.string.pers_block_settings_mask_protocol_enc, + R.string.info_pers_block_settings_mask_protocol_enc + ) + map[BlockId.SETTINGS_MASK_NDEF] = UnitResource( + R.string.pers_block_settings_mask_ndef, + R.string.info_pers_block_settings_mask_ndef + ) + map[BlockId.PINS] = UnitResource( + R.string.pers_block_pins, + R.string.info_pers_block_pins + ) + } + + private fun initCardNumber(map: MutableMap) { + map[CardNumber.SERIES] = UnitResource( + R.string.pers_item_series, + R.string.info_pers_item_series + ) + map[CardNumber.NUMBER] = UnitResource( + R.string.pers_item_number, + R.string.info_pers_item_number + ) + } + + private fun initCommon(map: MutableMap) { + map[Common.CURVE] = UnitResource( + R.string.pers_item_curve, + R.string.info_pers_item_curve + ) + map[Common.BLOCKCHAIN] = UnitResource( + R.string.pers_item_blockchain, + R.string.info_pers_item_blockchain + ) + map[Common.BLOCKCHAIN_CUSTOM] = UnitResource( + R.string.pers_item_custom_blockchain, + R.string.info_pers_item_custom_blockchain + ) + map[Common.MAX_SIGNATURES] = UnitResource( + R.string.pers_item_max_signatures, + R.string.info_pers_item_max_signatures + ) + map[Common.CREATE_WALLET] = UnitResource( + R.string.pers_item_create_wallet, + R.string.info_pers_item_create_wallet + ) + } + + private fun initSigningMethod(map: MutableMap) { + map[SigningMethod.SIGN_TX] = UnitResource( + R.string.pers_item_sign_tx_hashes, + R.string.info_pers_item_sign_tx_hashes + ) + map[SigningMethod.SIGN_TX_RAW] = UnitResource( + R.string.pers_item_sign_raw_tx, + R.string.info_pers_item_sign_raw_tx + ) + map[SigningMethod.SIGN_VALIDATED_TX] = UnitResource( + R.string.pers_item_sign_validated_tx_hashes, + R.string.info_pers_item_sign_validated_tx_hashes + ) + map[SigningMethod.SIGN_VALIDATED_TX_RAW] = UnitResource( + R.string.pers_item_sign_validated_raw_tx, + R.string.info_pers_item_sign_validated_raw_tx + ) + map[SigningMethod.SIGN_VALIDATED_TX_ISSUER] = UnitResource( + R.string.pers_item_sign_validated_tx_hashes_with_iss_data, + R.string.info_pers_item_sign_validated_tx_hashes_with_iss_data + ) + map[SigningMethod.SIGN_VALIDATED_TX_RAW_ISSUER] = UnitResource( + R.string.pers_item_sign_validated_raw_tx_with_iss_data, + R.string.info_pers_item_sign_validated_raw_tx_with_iss_data + ) + map[SigningMethod.SIGN_EXTERNAL] = UnitResource( + R.string.pers_item_sign_hash_ex, + R.string.info_pers_item_sign_hash_ex + ) + } + + private fun initSignHashExProp(map: MutableMap) { + map[SignHashExProp.PIN_LESS_FLOOR_LIMIT] = UnitResource( + R.string.pers_item_pin_less_floor_limit, + R.string.info_pers_item_pin_less_floor_limit + ) + map[SignHashExProp.CRYPTO_EXTRACT_KEY] = UnitResource( + R.string.pers_item_cr_ex_key, + R.string.info_pers_item_cr_ex_key + ) + map[SignHashExProp.REQUIRE_TERMINAL_CERT_SIG] = UnitResource( + R.string.pers_item_require_terminal_cert_sig, + R.string.info_pers_item_require_terminal_cert_sig + ) + map[SignHashExProp.REQUIRE_TERMINAL_TX_SIG] = UnitResource( + R.string.pers_item_require_terminal_tx_sig, + R.string.info_pers_item_require_terminal_tx_sig + ) + map[SignHashExProp.CHECK_PIN3] = UnitResource( + R.string.pers_item_pin3, + R.string.info_pers_item_pin3 + ) + } + + private fun initDenomination(map: MutableMap) { + map[Denomination.WRITE_ON_PERSONALIZE] = UnitResource( + R.string.pers_item_write_on_personalize, + R.string.info_pers_item_write_on_personalize + ) + map[Denomination.DENOMINATION] = UnitResource( + R.string.pers_item_denomination, + R.string.info_pers_item_denomination + ) + } + + private fun initToken(map: MutableMap) { + map[Token.ITS_TOKEN] = UnitResource( + R.string.pers_item_its_token, + R.string.info_pers_item_its_token + ) + map[Token.SYMBOL] = UnitResource( + R.string.pers_item_symbol, + R.string.info_pers_item_symbol + ) + map[Token.CONTRACT_ADDRESS] = UnitResource( + R.string.pers_item_contract_address, + R.string.info_pers_item_contract_address + ) + map[Token.DECIMAL] = UnitResource( + R.string.pers_item_decimal, + R.string.info_pers_item_decimal + ) + } + + private fun initProductMask(map: MutableMap) { + map[ProductMask.NOTE] = UnitResource( + R.string.pers_item_note, + R.string.info_pers_item_note + ) + map[ProductMask.TAG] = UnitResource( + R.string.pers_item_tag, + R.string.info_pers_item_tag + ) + map[ProductMask.ID_CARD] = UnitResource( + R.string.pers_item_id_card, + R.string.info_pers_item_id_card + ) + } + + private fun initSettingsMask(map: MutableMap) { + map[SettingsMask.IS_REUSABLE] = UnitResource( + R.string.pers_item_is_reusable, + R.string.info_pers_item_is_reusable + ) + map[SettingsMask.NEED_ACTIVATION] = UnitResource( + R.string.pers_item_need_activation, + R.string.info_pers_item_need_activation + ) + map[SettingsMask.FORBID_PURGE] = UnitResource( + R.string.pers_item_forbid_purge, + R.string.info_pers_item_forbid_purge + ) + map[SettingsMask.ALLOW_SELECT_BLOCKCHAIN] = UnitResource( + R.string.pers_item_allow_select_blockchain, + R.string.info_pers_item_allow_select_blockchain + ) + map[SettingsMask.USE_BLOCK] = UnitResource( + R.string.pers_item_use_block, + R.string.info_pers_item_use_block + ) + map[SettingsMask.ONE_APDU] = UnitResource( + R.string.pers_item_one_apdu_at_once, + R.string.info_pers_item_one_apdu_at_once + ) + map[SettingsMask.USE_CVC] = UnitResource( + R.string.pers_item_use_cvc, + R.string.info_pers_item_use_cvc + ) + map[SettingsMask.ALLOW_SWAP_PIN] = UnitResource( + R.string.pers_item_allow_swap_pin, + R.string.info_pers_item_allow_swap_pin + ) + map[SettingsMask.ALLOW_SWAP_PIN2] = UnitResource( + R.string.pers_item_allow_swap_pin2, + R.string.info_pers_item_allow_swap_pin2 + ) + map[SettingsMask.FORBID_DEFAULT_PIN] = UnitResource( + R.string.pers_item_forbid_default_pin, + R.string.info_pers_item_forbid_default_pin + ) + map[SettingsMask.SMART_SECURITY_DELAY] = UnitResource( + R.string.pers_item_smart_security_delay, + R.string.info_pers_item_smart_security_delay + ) + map[SettingsMask.PROTECT_ISSUER_DATA_AGAINST_REPLAY] = UnitResource( + R.string.pers_item_protect_issuer_data_against_replay, + R.string.info_pers_item_protect_issuer_data_against_replay + ) + map[SettingsMask.SKIP_SECURITY_DELAY_IF_VALIDATED] = UnitResource( + R.string.pers_item_skip_security_delay_if_validated, + R.string.info_pers_item_skip_security_delay_if_validated + ) + map[SettingsMask.SKIP_PIN2_CVC_IF_VALIDATED] = UnitResource( + R.string.pers_item_skip_pin2_and_cvc_if_validated, + R.string.info_pers_item_skip_pin2_and_cvc_if_validated + ) + map[SettingsMask.SKIP_SECURITY_DELAY_ON_LINKED_TERMINAL] = UnitResource( + R.string.pers_item_skip_security_delay_on_linked_terminal, + R.string.info_pers_item_skip_security_delay_on_linked_terminal + ) + map[SettingsMask.RESTRICT_OVERWRITE_EXTRA_ISSUER_DATA] = UnitResource( + R.string.pers_item_restrict_overwrite_ex_issuer_data, + R.string.info_pers_item_restrict_overwrite_ex_issuer_data + ) + } + + private fun initSettingsMaskProtocolEnc(map: MutableMap) { + map[SettingsMaskProtocolEnc.ALLOW_UNENCRYPTED] = UnitResource( + R.string.pers_item_allow_unencrypted, + R.string.info_pers_item_allow_unencrypted + ) + map[SettingsMaskProtocolEnc.ALLOW_FAST_ENCRYPTION] = UnitResource( + R.string.pers_item_allow_fast_encryption, + R.string.info_pers_item_allow_fast_encryption + ) + } + + private fun initSettingsMaskNde(map: MutableMap) { + map[SettingsMaskNdef.USE_NDEF] = UnitResource( + R.string.pers_item_use_ndef, + R.string.info_pers_item_use_ndef + ) + map[SettingsMaskNdef.DYNAMIC_NDEF] = UnitResource( + R.string.pers_item_dynamic_ndef, + R.string.info_pers_item_dynamic_ndef + ) + map[SettingsMaskNdef.DISABLE_PRECOMPUTED_NDEF] = UnitResource( + R.string.pers_item_disable_precomputed_ndef, + R.string.info_pers_item_disable_precomputed_ndef + ) + map[SettingsMaskNdef.AAR] = UnitResource( + R.string.pers_item_aar, + R.string.info_pers_item_aar + ) + } + + private fun initPins(map: MutableMap) { + map[Pins.PIN] = UnitResource( + R.string.pers_item_pin, + R.string.info_pers_item_pin + ) + map[Pins.PIN2] = UnitResource( + R.string.pers_item_pin2, + R.string.info_pers_item_pin2 + ) + map[Pins.PIN3] = UnitResource( + R.string.pers_item_pin3, + R.string.info_pers_item_pin3 + ) + map[Pins.CVC] = UnitResource( + R.string.pers_item_cvc, + R.string.info_pers_item_cvc + ) + map[Pins.PAUSE_BEFORE_PIN2] = UnitResource( + R.string.pers_item_pause_before_pin2, + R.string.info_pers_item_pause_before_pin2 + ) + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/view_model/PersonalizeViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeViewModel.kt similarity index 52% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/view_model/PersonalizeViewModel.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeViewModel.kt index 14e5e6f010..84b1f0a0b0 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/view_model/PersonalizeViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/PersonalizeViewModel.kt @@ -1,14 +1,16 @@ -package com.tangem.tangemtest.card_use_cases.ui.personalize.view_model +package com.tangem.tangemtest.card_use_cases.ui.personalize +import android.view.View import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.google.gson.Gson import com.tangem.tangemtest._arch.structure.base.Block -import com.tangem.tangemtest.card_use_cases.ui.personalize.personalize_converter.json_test.BlockToJsonConverter -import com.tangem.tangemtest.card_use_cases.ui.personalize.personalize_converter.json_test.JsonBlockEnDe -import com.tangem.tangemtest.card_use_cases.ui.personalize.personalize_converter.json_test.JsonToBlockConverter -import com.tangem.tangemtest.card_use_cases.ui.personalize.personalize_converter.json_test.TestJsonDto +import com.tangem.tangemtest._arch.structure.base.DataUnit +import com.tangem.tangemtest.card_use_cases.ui.personalize.converter.BlockToJsonConverter +import com.tangem.tangemtest.card_use_cases.ui.personalize.converter.JsonBlockEnDe +import com.tangem.tangemtest.card_use_cases.ui.personalize.converter.JsonToBlockConverter +import com.tangem.tangemtest.card_use_cases.ui.personalize.converter.TestJsonDto /** [REDACTED_AUTHOR] @@ -26,4 +28,13 @@ class PersonalizeViewModel(private val jsonPersonalizeString: String) : ViewMode val jsonDto = Gson().fromJson(jsonPersonalizeString, TestJsonDto::class.java) return enDe.decode(jsonDto) } + + fun toggleDescriptionVisibility(state: Boolean) { + ldBlockList.value?.forEach { block -> + block.unitList.forEach { unit -> + val vm = unit as? DataUnit<*> ?: return@forEach + vm.viewModel?.viewState?.descriptionVisibility = if (state) View.VISIBLE else View.GONE + } + } + } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/UnitInfoHolder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/UnitInfoHolder.kt deleted file mode 100644 index e4d321173b..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/UnitInfoHolder.kt +++ /dev/null @@ -1,339 +0,0 @@ -package com.tangem.tangemtest.card_use_cases.ui.personalize - -import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.base.* - -/** -[REDACTED_AUTHOR] - */ -data class UnitInfo( - val resName: Int, - val resDescription: Int? = null -) - -object InfoHolder { - private val map = mutableMapOf() - - init { - InfoInitializer().init(map) - } - - fun getInfo(id: Id): UnitInfo = map[id] ?: UnitInfo(R.string.unknown, R.string.unknown) -} - -internal class InfoInitializer() { - fun init(map: MutableMap) { - initBlock(map) - initCardNumber(map) - initCommon(map) - initSigningMethod(map) - initSignHashExProp(map) - initDenomination(map) - initToken(map) - initProductMask(map) - initSettingsMask(map) - initSettingsMaskProtocolEnc(map) - initSettingsMaskNde(map) - initPins(map) - } - - private fun initBlock(map: MutableMap) { - map[BlockId.CARD_NUMBER] = UnitInfo( - R.string.pers_block_card_number, - R.string.info_ - ) - map[BlockId.COMMON] = UnitInfo( - R.string.pers_block_common, - R.string.info_ - ) - map[BlockId.SIGNING_METHOD] = UnitInfo( - R.string.pers_block_signing_method, - R.string.info_ - ) - map[BlockId.SIGN_HASH_EX_PROP] = UnitInfo( - R.string.pers_block_sign_hash_ex_prop, - R.string.info_ - ) - map[BlockId.DENOMINATION] = UnitInfo( - R.string.pers_block_denomination, - R.string.info_ - ) - map[BlockId.TOKEN] = UnitInfo( - R.string.pers_block_token, - R.string.info_ - ) - map[BlockId.PROD_MASK] = UnitInfo( - R.string.pers_block_product_mask, - R.string.info_ - ) - map[BlockId.SETTINGS_MASK] = UnitInfo( - R.string.pers_block_settings_mask, - R.string.info_ - ) - map[BlockId.SETTINGS_MASK_PROTOCOL_ENC] = UnitInfo( - R.string.pers_block_settings_mask_protocol_enc, - R.string.info_ - ) - map[BlockId.SETTINGS_MASK_NDEF] = UnitInfo( - R.string.pers_block_settings_mask_ndef, - R.string.info_ - ) - map[BlockId.PINS] = UnitInfo( - R.string.pers_block_pins, - R.string.info_ - ) - } - - private fun initCardNumber(map: MutableMap) { - map[CardNumber.SERIES] = UnitInfo( - R.string.pers_item_series, - R.string.info_ - ) - map[CardNumber.NUMBER] = UnitInfo( - R.string.pers_item_number, - R.string.info_ - ) - } - - private fun initCommon(map: MutableMap) { - map[Common.CURVE] = UnitInfo( - R.string.pers_item_curve, - R.string.info_ - ) - map[Common.BLOCKCHAIN] = UnitInfo( - R.string.pers_item_blockchain, - R.string.info_ - ) - map[Common.BLOCKCHAIN_CUSTOM] = UnitInfo( - R.string.pers_item_custom_blockchain, - R.string.info_ - ) - map[Common.MAX_SIGNATURES] = UnitInfo( - R.string.pers_item_max_signatures, - R.string.info_ - ) - map[Common.CREATE_WALLET] = UnitInfo( - R.string.pers_item_create_wallet, - R.string.info_ - ) - } - - private fun initSigningMethod(map: MutableMap) { - map[SigningMethod.SIGN_TX] = UnitInfo( - R.string.pers_item_sign_tx_hashes, - R.string.info_ - ) - map[SigningMethod.SIGN_TX_RAW] = UnitInfo( - R.string.pers_item_sign_raw_tx, - R.string.info_ - ) - map[SigningMethod.SIGN_VALIDATED_TX] = UnitInfo( - R.string.pers_item_sign_validated_tx_hashes, - R.string.info_ - ) - map[SigningMethod.SIGN_VALIDATED_TX_RAW] = UnitInfo( - R.string.pers_item_sign_validated_raw_tx, - R.string.info_ - ) - map[SigningMethod.SIGN_VALIDATED_TX_ISSUER] = UnitInfo( - R.string.pers_item_sign_validated_tx_hashes_with_iss_data, - R.string.info_ - ) - map[SigningMethod.SIGN_VALIDATED_TX_RAW_ISSUER] = UnitInfo( - R.string.pers_item_sign_validated_raw_tx_with_iss_data, - R.string.info_ - ) - map[SigningMethod.SIGN_EXTERNAL] = UnitInfo( - R.string.pers_item_sign_hash_ex, - R.string.info_ - ) - } - - private fun initSignHashExProp(map: MutableMap) { - map[SignHashExProp.PIN_LESS_FLOOR_LIMIT] = UnitInfo( - R.string.pers_item_pin_less_floor_limit, - R.string.info_ - ) - map[SignHashExProp.CRYPTO_EXTRACT_KEY] = UnitInfo( - R.string.pers_item_cr_ex_key, - R.string.info_ - ) - map[SignHashExProp.REQUIRE_TERMINAL_CERT_SIG] = UnitInfo( - R.string.pers_item_require_terminal_cert_sig, - R.string.info_ - ) - map[SignHashExProp.REQUIRE_TERMINAL_TX_SIG] = UnitInfo( - R.string.pers_item_require_terminal_tx_sig, - R.string.info_ - ) - map[SignHashExProp.CHECK_PIN3] = UnitInfo( - R.string.pers_item_pin3, - R.string.info_ - ) - } - - private fun initDenomination(map: MutableMap) { - map[Denomination.WRITE_ON_PERSONALIZE] = UnitInfo( - R.string.pers_item_write_on_personalize, - R.string.info_ - ) - map[Denomination.DENOMINATION] = UnitInfo( - R.string.pers_item_denomination, - R.string.info_ - ) - } - - private fun initToken(map: MutableMap) { - map[Token.ITS_TOKEN] = UnitInfo( - R.string.pers_item_its_token, - R.string.info_ - ) - map[Token.SYMBOL] = UnitInfo( - R.string.pers_item_symbol, - R.string.info_ - ) - map[Token.CONTRACT_ADDRESS] = UnitInfo( - R.string.pers_item_contract_address, - R.string.info_ - ) - map[Token.DECIMAL] = UnitInfo( - R.string.pers_item_decimal, - R.string.info_ - ) - } - - private fun initProductMask(map: MutableMap) { - map[ProductMask.NOTE] = UnitInfo( - R.string.pers_item_note, - R.string.info_ - ) - map[ProductMask.TAG] = UnitInfo( - R.string.pers_item_tag, - R.string.info_ - ) - map[ProductMask.ID_CARD] = UnitInfo( - R.string.pers_item_id_card, - R.string.info_ - ) - } - - private fun initSettingsMask(map: MutableMap) { - map[SettingsMask.IS_REUSABLE] = UnitInfo( - R.string.pers_item_is_reusable, - R.string.info_ - ) - map[SettingsMask.NEED_ACTIVATION] = UnitInfo( - R.string.pers_item_need_activation, - R.string.info_ - ) - map[SettingsMask.FORBID_PURGE] = UnitInfo( - R.string.pers_item_forbid_purge, - R.string.info_ - ) - map[SettingsMask.ALLOW_SELECT_BLOCKCHAIN] = UnitInfo( - R.string.pers_item_allow_select_blockchain, - R.string.info_ - ) - map[SettingsMask.USE_BLOCK] = UnitInfo( - R.string.pers_item_use_block, - R.string.info_ - ) - map[SettingsMask.ONE_APDU] = UnitInfo( - R.string.pers_item_one_apdu_at_once, - R.string.info_ - ) - map[SettingsMask.USE_CVC] = UnitInfo( - R.string.pers_item_use_cvc, - R.string.info_ - ) - map[SettingsMask.ALLOW_SWAP_PIN] = UnitInfo( - R.string.pers_item_allow_swap_pin, - R.string.info_ - ) - map[SettingsMask.ALLOW_SWAP_PIN2] = UnitInfo( - R.string.pers_item_allow_swap_pin2, - R.string.info_ - ) - map[SettingsMask.FORBID_DEFAULT_PIN] = UnitInfo( - R.string.pers_item_forbid_default_pin, - R.string.info_ - ) - map[SettingsMask.SMART_SECURITY_DELAY] = UnitInfo( - R.string.pers_item_smart_security_delay, - R.string.info_ - ) - map[SettingsMask.PROTECT_ISSUER_DATA_AGAINST_REPLAY] = UnitInfo( - R.string.pers_item_protect_issuer_data_against_replay, - R.string.info_ - ) - map[SettingsMask.SKIP_SECURITY_DELAY_IF_VALIDATED] = UnitInfo( - R.string.pers_item_skip_security_delay_if_validated, - R.string.info_ - ) - map[SettingsMask.SKIP_PIN2_CVC_IF_VALIDATED] = UnitInfo( - R.string.pers_item_skip_pin2_and_cvc_if_validated, - R.string.info_ - ) - map[SettingsMask.SKIP_SECURITY_DELAY_ON_LINKED_TERMINAL] = UnitInfo( - R.string.pers_item_skip_security_delay_on_linked_terminal, - R.string.info_ - ) - map[SettingsMask.RESTRICT_OVERWRITE_EXTRA_ISSUER_DATA] = UnitInfo( - R.string.pers_item_restrict_overwrite_ex_issuer_data, - R.string.info_ - ) - } - - private fun initSettingsMaskProtocolEnc(map: MutableMap) { - map[SettingsMaskProtocolEnc.ALLOW_UNENCRYPTED] = UnitInfo( - R.string.pers_item_allow_unencrypted, - R.string.info_ - ) - map[SettingsMaskProtocolEnc.ALLOW_FAST_ENCRYPTION] = UnitInfo( - R.string.pers_item_allow_fast_encryption, - R.string.info_ - ) - } - - private fun initSettingsMaskNde(map: MutableMap) { - map[SettingsMaskNdef.USE_NDEF] = UnitInfo( - R.string.pers_item_use_ndef, - R.string.info_ - ) - map[SettingsMaskNdef.DYNAMIC_NDEF] = UnitInfo( - R.string.pers_item_dynamic_ndef, - R.string.info_ - ) - map[SettingsMaskNdef.DISABLE_PRECOMPUTED_NDEF] = UnitInfo( - R.string.pers_item_disable_precomputed_ndef, - R.string.info_ - ) - map[SettingsMaskNdef.AAR] = UnitInfo( - R.string.pers_item_aar, - R.string.info_ - ) - } - - private fun initPins(map: MutableMap) { - map[Pins.PIN] = UnitInfo( - R.string.pers_item_pin, - R.string.info_ - ) - map[Pins.PIN2] = UnitInfo( - R.string.pers_item_pin2, - R.string.info_ - ) - map[Pins.PIN3] = UnitInfo( - R.string.pers_item_pin3, - R.string.info_ - ) - map[Pins.CVC] = UnitInfo( - R.string.pers_item_cvc, - R.string.info_ - ) - map[Pins.PAUSE_BEFORE_PIN2] = UnitInfo( - R.string.pers_item_pause_before_pin2, - R.string.info_ - ) - } -} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/encode_decode.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/encode_decode.kt similarity index 84% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/encode_decode.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/encode_decode.kt index 25e6588b6b..5ee5e733b4 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/encode_decode.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/encode_decode.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.card_use_cases.ui.personalize.personalize_converter.json_test +package com.tangem.tangemtest.card_use_cases.ui.personalize.converter import com.tangem.tangemtest._arch.structure.base.Block diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/json_dto.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/json_dto.kt similarity index 96% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/json_dto.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/json_dto.kt index d8da4cb477..54b44358aa 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/json_dto.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/json_dto.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.card_use_cases.ui.personalize.personalize_converter.json_test +package com.tangem.tangemtest.card_use_cases.ui.personalize.converter class TestJsonDto { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/to_block.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/to_block.kt similarity index 99% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/to_block.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/to_block.kt index b5137f5b6c..27c1b3eb21 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/to_block.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/to_block.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.card_use_cases.ui.personalize.personalize_converter.json_test +package com.tangem.tangemtest.card_use_cases.ui.personalize.converter import com.tangem.tangemtest._arch.structure.base.* import com.tangem.tangemtest._arch.structure.impl.* diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/to_json.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/to_json.kt similarity index 73% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/to_json.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/to_json.kt index 8faa616af8..6f64a55e57 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/personalize_converter/json_test/to_json.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/converter/to_json.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemtest.card_use_cases.ui.personalize.personalize_converter.json_test +package com.tangem.tangemtest.card_use_cases.ui.personalize.converter import com.tangem.tangemtest._arch.structure.base.Block import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/block_widget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/WidgetBuilder.kt similarity index 67% rename from tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/block_widget.kt rename to tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/WidgetBuilder.kt index b28527dd81..a35a97c619 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/block_widget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/WidgetBuilder.kt @@ -1,32 +1,15 @@ package com.tangem.tangemtest.card_use_cases.ui.personalize.widgets -import android.view.View import android.view.ViewGroup -import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.base.Block import com.tangem.tangemtest._arch.structure.base.DataUnit import com.tangem.tangemtest._arch.structure.base.Unit import com.tangem.tangemtest._arch.structure.impl.* -import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate - -/** -[REDACTED_AUTHOR] - */ -interface BlockWidget : ViewWidget - -class EmptyWidget(parent: ViewGroup) : BlockWidget { - override val view: View = parent.inflate(getLayoutId(), parent, false) - override fun getLayoutId(): Int = R.layout.w_empty -} - -abstract class BaseBlockWidget(parent: ViewGroup) : BaseViewWidget(parent), BlockWidget - -class LinearBlockWidget( - private val linearBlock: LinearBlock, - parent: ViewGroup -) : BaseBlockWidget>>(parent) { - override fun getLayoutId(): Int = R.layout.w_personilize_block -} +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.BlockWidget +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.EmptyWidget +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.UnitWidget +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.ViewWidget +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.impl.* class WidgetBuilder { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/base/AbstractionBlockWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/base/AbstractionBlockWidget.kt new file mode 100644 index 0000000000..03e0e319eb --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/base/AbstractionBlockWidget.kt @@ -0,0 +1,18 @@ +package com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base + +import android.view.View +import android.view.ViewGroup +import com.tangem.tangemtest.R +import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate + +/** +[REDACTED_AUTHOR] + */ +interface BlockWidget : ViewWidget + +class EmptyWidget(parent: ViewGroup) : BlockWidget { + override val view: View = parent.inflate(getLayoutId(), parent, false) + override fun getLayoutId(): Int = R.layout.w_empty +} + +abstract class BaseBlockWidget(parent: ViewGroup) : BaseViewWidget(parent), BlockWidget \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/base/AbstractionUnitWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/base/AbstractionUnitWidget.kt new file mode 100644 index 0000000000..5cd2c381b5 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/base/AbstractionUnitWidget.kt @@ -0,0 +1,36 @@ +package com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.structure.base.DataUnit +import com.tangem.tangemtest.card_use_cases.ui.personalize.PersonalizeResources +import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder + +/** +[REDACTED_AUTHOR] + */ +interface ViewWidget : LayoutHolder { + val view: View +} + +interface UnitWidget : ViewWidget { + val unit: DataUnit +} + +abstract class BaseViewWidget(parent: ViewGroup) : ViewWidget { + override val view: View = inflateView(parent) + + private fun inflateView(parent: ViewGroup): View { + var id = getLayoutId() + if (id == -1) id = R.layout.w_empty + val inflatedView = LayoutInflater.from(parent.context).inflate(id, parent, false) + parent.addView(inflatedView) + return inflatedView + } +} + +fun UnitWidget<*>.getResNameId(): Int = PersonalizeResources.get(unit.id).resName + +fun UnitWidget<*>.getResDescription(): Int? = PersonalizeResources.get(unit.id).resDescription \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/impl/BlockWidgets.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/impl/BlockWidgets.kt new file mode 100644 index 0000000000..ea53c62665 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/impl/BlockWidgets.kt @@ -0,0 +1,17 @@ +package com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.impl + +import android.view.ViewGroup +import com.tangem.tangemtest.R +import com.tangem.tangemtest._arch.structure.impl.LinearBlock +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.BaseBlockWidget +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.UnitWidget + +/** +[REDACTED_AUTHOR] + */ +class LinearBlockWidget( + private val linearBlock: LinearBlock, + parent: ViewGroup +) : BaseBlockWidget>>(parent) { + override fun getLayoutId(): Int = R.layout.w_personilize_block +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/impl/UnitWidgets.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/impl/UnitWidgets.kt new file mode 100644 index 0000000000..e0d8b6b7f6 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/impl/UnitWidgets.kt @@ -0,0 +1,205 @@ +package com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.impl + +import android.text.Editable +import android.text.TextWatcher +import android.view.View +import android.view.ViewGroup +import android.widget.* +import androidx.appcompat.widget.SwitchCompat +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.tangemtest.R +import com.tangem.tangemtest._arch.structure.base.DataUnit +import com.tangem.tangemtest._arch.structure.impl.* +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.BaseViewWidget +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.UnitWidget +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.getResDescription +import com.tangem.tangemtest.card_use_cases.ui.personalize.widgets.base.getResNameId +import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate +import ru.dev.gbixahue.eu4d.lib.android.global.log.Log +import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf + +/** +[REDACTED_AUTHOR] + */ +abstract class BaseUnitWidget( + parent: ViewGroup, + override val unit: DataUnit +) : BaseViewWidget(parent), UnitWidget { + + private val descriptionContainer: ViewGroup by lazy { view.findViewById(R.id.container_description) } + private val tvDescription: TextView? by lazy { descriptionContainer.findViewById(R.id.tv_description) } + + init { + Log.d(this, "init id: ${unit.id}") + getResDescription()?.let { tvDescription?.setText(it) } + unit.viewModel?.viewState?.onDescriptionVisibilityChanged = { changeDescriptionVisibility(it) } + } + + private fun changeDescriptionVisibility(state: Int) { + TransitionManager.beginDelayedTransition(view.parent as ViewGroup, AutoTransition()) + descriptionContainer.visibility = state + } +} + +class TextWidget(parent: ViewGroup, private val textUnit: TextUnit) : BaseUnitWidget(parent, textUnit) { + + private val tvName = view.findViewById(R.id.tv_name) + + init { + tvName.setText(getResNameId()) + } + + override fun getLayoutId(): Int = R.layout.w_personalize_item_text +} + +class EditTextWidget(parent: ViewGroup, private val editTextUnit: EditTextUnit) : BaseUnitWidget(parent, editTextUnit) { + + private val tilItem = view.findViewById(R.id.til_item) + private val etItem = view.findViewById(R.id.et_item) + + private val watcher = object : TextWatcher { + override fun afterTextChanged(s: Editable?) { + editTextUnit.viewModel?.updateDataByView(stringOf(s)) + } + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + } + + init { + tilItem.hint = tilItem.context.getString(getResNameId()) + etItem.setText(editTextUnit.viewModel?.data) + etItem.addTextChangedListener(watcher) + editTextUnit.viewModel?.onDataUpdated = { + etItem.removeTextChangedListener(watcher) + etItem.setText(it) + etItem.addTextChangedListener(watcher) + } + } + + override fun getLayoutId(): Int = R.layout.w_personalize_item_edit_text +} + +class NumberWidget(parent: ViewGroup, private val numberUnit: NumberUnit) : BaseUnitWidget(parent, numberUnit) { + + private val tilItem = view.findViewById(R.id.til_item) + private val etItem = view.findViewById(R.id.et_item) + + private val watcher = object : TextWatcher { + override fun afterTextChanged(s: Editable?) { + numberUnit.viewModel?.updateDataByView(getIntValue(stringOf(s))) + } + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + } + + init { + tilItem.hint = tilItem.context.getString(getResNameId()) + etItem.setText(stringOf(numberUnit.viewModel?.data)) + etItem.addTextChangedListener(watcher) + numberUnit.viewModel?.onDataUpdated = { + etItem.removeTextChangedListener(watcher) + etItem.setText(stringOf(it)) + etItem.addTextChangedListener(watcher) + } + } + + private fun getIntValue(value: String): Number? { + return if (value.isEmpty()) null else value.toInt() + } + + override fun getLayoutId(): Int = R.layout.w_personalize_item_number +} + +class SwitchWidget(parent: ViewGroup, private val boolUnit: BoolUnit) : BaseUnitWidget(parent, boolUnit) { + + private val switchItem = view.findViewById(R.id.sw_item) + + private val changeListener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> + boolUnit.viewModel?.updateDataByView(isChecked) + } + + init { + switchItem.setText(getResNameId()) + switchItem.isChecked = boolUnit.viewModel?.data ?: false + switchItem.setOnCheckedChangeListener(changeListener) + boolUnit.viewModel?.onDataUpdated = { + switchItem.setOnCheckedChangeListener(null) + switchItem.isChecked = it ?: false + switchItem.setOnCheckedChangeListener(changeListener) + } + } + + override fun getLayoutId(): Int = R.layout.w_personalize_item_switch +} + +class SpinnerWidget(parent: ViewGroup, private val listUnit: ListUnit) : BaseUnitWidget(parent, listUnit) { + + private val spItem = view.findViewById(R.id.sp_item) + private val spAdapter = SpItemAdapter(listUnit.viewModel?.data?.itemList) + + private val onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onNothingSelected(parent: AdapterView<*>?) {} + + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + val data = listUnit.viewModel?.data ?: return + + data.selectedItem = data.itemList[position] + listUnit.viewModel?.updateDataByView(data) + } + } + + init { + val name = view.findViewById(R.id.tv_name) + name.setText(getResNameId()) + spItem.adapter = spAdapter + spItem.onItemSelectedListener = onItemSelectedListener + listUnit.viewModel?.onDataUpdated = { + it?.apply { + spItem.onItemSelectedListener = null + this.itemList.firstOrNull { item -> item.value == selectedItem }?.let { + val position = itemList.indexOf(it) + spItem.setSelection(position) + } + spItem.onItemSelectedListener = onItemSelectedListener + } + } + } + + override fun getLayoutId(): Int = R.layout.w_personalize_item_spinner +} + +class SpItemAdapter(list: List?) : BaseAdapter() { + + private val itemList: List = list ?: listOf() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view = convertView ?: parent.inflate(R.layout.vh_sp_item) + + val tv = view.findViewById(R.id.tv_sp_item) + tv.text = extractData(itemList[position]) + + return view + } + + override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { + val view = convertView ?: parent.inflate(R.layout.vh_sp_dropdown_item) + + val tv = view.findViewById(R.id.tv_sp_item) + tv.text = extractData(itemList[position]) + + return view + } + + private fun extractData(item: KeyValue): String? = item.key + + override fun getItem(position: Int): String = stringOf(itemList[position]) + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getCount(): Int = itemList.size +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/unit_widget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/unit_widget.kt deleted file mode 100644 index 6335d5a31f..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/unit_widget.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.tangem.tangemtest.card_use_cases.ui.personalize.widgets - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.transition.AutoTransition -import androidx.transition.TransitionManager -import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.base.DataUnit -import com.tangem.tangemtest.card_use_cases.ui.personalize.InfoHolder -import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder - -/** -[REDACTED_AUTHOR] - */ -interface ViewWidget : LayoutHolder { - val view: View -} - -interface UnitWidget : ViewWidget { - val unit: DataUnit -} - -abstract class BaseViewWidget(parent: ViewGroup) : ViewWidget { - override val view: View = inflateView(parent) - - private fun inflateView(parent: ViewGroup): View { - var id = getLayoutId() - if (id == -1) id = R.layout.w_empty - val inflatedView = LayoutInflater.from(parent.context).inflate(id, parent, false) - parent.addView(inflatedView) - return inflatedView - } -} - -interface DescriptionWidget { - fun toggleDescriptionVisibility() -} - -interface ParamWidget : UnitWidget, DescriptionWidget - -abstract class BaseParamWidget( - parent: ViewGroup, - override val unit: DataUnit -) : BaseViewWidget(parent), ParamWidget { - - override fun toggleDescriptionVisibility() { - val tvDescription = view.findViewById(R.id.tv_description) ?: return - - getResDescription()?.let { tvDescription.setText(it) } - TransitionManager.beginDelayedTransition(tvDescription.parent as ViewGroup, AutoTransition()) - tvDescription.visibility = unit.viewModel?.viewState?.descriptionVisibility ?: View.GONE - } -} - -fun UnitWidget<*>.getResNameId(): Int = InfoHolder.getInfo(unit.id).resName - -fun UnitWidget<*>.getResDescription(): Int? = InfoHolder.getInfo(unit.id).resDescription \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/widgets.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/widgets.kt deleted file mode 100644 index 0e66cb2912..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/personalize/widgets/widgets.kt +++ /dev/null @@ -1,148 +0,0 @@ -package com.tangem.tangemtest.card_use_cases.ui.personalize.widgets - -import android.view.View -import android.view.ViewGroup -import android.widget.* -import com.google.android.material.textfield.TextInputEditText -import com.google.android.material.textfield.TextInputLayout -import com.tangem.tangemtest.R -import com.tangem.tangemtest._arch.structure.impl.* -import ru.dev.gbixahue.eu4d.lib.android._android.views.afterTextChanged -import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate -import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf - -/** -[REDACTED_AUTHOR] - */ - -class TextWidget(parent: ViewGroup, private val textUnit: TextUnit) : BaseParamWidget(parent, textUnit) { - - private val tvName = view.findViewById(R.id.tv_name) - - init { - bindData() - } - - private fun bindData() { - tvName.setText(getResNameId()) - } - - override fun getLayoutId(): Int = R.layout.w_personalize_item_text -} - -class EditTextWidget(parent: ViewGroup, private val editTextUnit: EditTextUnit) : BaseParamWidget(parent, editTextUnit) { - - private val tilItem = view.findViewById(R.id.til_item) - private val etItem = view.findViewById(R.id.et_item) - - init { - bindData() - } - - private fun bindData() { - tilItem.hint = tilItem.context.getString(getResNameId()) - etItem.setText(editTextUnit.viewModel?.data) - etItem.afterTextChanged { editTextUnit.viewModel?.updateData(it) } - } - - override fun getLayoutId(): Int = R.layout.w_personalize_item_edit_text -} - -class NumberWidget(parent: ViewGroup, private val numberUnit: NumberUnit) : BaseParamWidget(parent, numberUnit) { - - private val tilItem = view.findViewById(R.id.til_item) - private val etItem = view.findViewById(R.id.et_item) - - init { - bindData() - } - - private fun bindData() { - tilItem.hint = tilItem.context.getString(getResNameId()) - etItem.setText(stringOf(numberUnit.viewModel?.data)) - etItem.afterTextChanged { numberUnit.viewModel?.updateData(getIntValue(it)) } - } - - private fun getIntValue(value: String): Number? { - return if (value.isEmpty()) null else value.toInt() - } - - override fun getLayoutId(): Int = R.layout.w_personalize_item_number -} - -class SwitchWidget(parent: ViewGroup, private val boolUnit: BoolUnit) : BaseParamWidget(parent, boolUnit) { - - private val switchItem = view.findViewById(R.id.sw_item) - - init { - bindData() - } - - private fun bindData() { - switchItem.setText(getResNameId()) - switchItem.isChecked = boolUnit.viewModel?.data ?: false - switchItem.setOnCheckedChangeListener { view, isChecked -> boolUnit.viewModel?.updateData(isChecked) } - } - - override fun getLayoutId(): Int = R.layout.w_personalize_item_switch - -} - -class SpinnerWidget(parent: ViewGroup, private val listUnit: ListUnit) : BaseParamWidget(parent, listUnit) { - - private val spItem = view.findViewById(R.id.sp_item) - private val spAdapter = SpItemAdapter(listUnit.viewModel?.data?.itemList) - - init { - bindData() - } - - private fun bindData() { - val name = view.findViewById(R.id.tv_name) - name.setText(getResNameId()) - spItem.adapter = spAdapter - spItem.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onNothingSelected(parent: AdapterView<*>?) {} - - override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - val data = listUnit.viewModel?.data ?: return - - data.selectedItem = data.itemList[position] - listUnit.viewModel?.updateData(data) - } - } - } - - override fun getLayoutId(): Int = R.layout.w_personalize_item_spinner -} - -class SpItemAdapter(list: List?) : BaseAdapter() { - - private val itemList: List = list ?: listOf() - - override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - val view = convertView ?: parent.inflate(R.layout.vh_sp_item) - - val tv = view.findViewById(R.id.tv_sp_item) - tv.text = extractData(itemList[position]) - - return view - } - - override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { - val view = convertView ?: parent.inflate(R.layout.vh_sp_dropdown_item) - - val tv = view.findViewById(R.id.tv_sp_item) - tv.text = extractData(itemList[position]) - - return view - } - - private fun extractData(item: KeyValue): String? = item.key - - override fun getItem(position: Int): String = stringOf(itemList[position]) - - override fun getItemId(position: Int): Long = position.toLong() - - override fun getCount(): Int = itemList.size -} \ No newline at end of file diff --git a/tangem-demo/src/main/res/color/menu_switch_color_thumb.xml b/tangem-demo/src/main/res/color/menu_switch_color_thumb.xml new file mode 100644 index 0000000000..ad3f42fb35 --- /dev/null +++ b/tangem-demo/src/main/res/color/menu_switch_color_thumb.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/color/menu_switch_color_track.xml b/tangem-demo/src/main/res/color/menu_switch_color_track.xml new file mode 100644 index 0000000000..d3fb4ae385 --- /dev/null +++ b/tangem-demo/src/main/res/color/menu_switch_color_track.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/color/mtrl_fab_bg_color_selector.xml b/tangem-demo/src/main/res/color/mtrl_fab_bg_color_selector.xml index 50497e70d6..a6155affe9 100644 --- a/tangem-demo/src/main/res/color/mtrl_fab_bg_color_selector.xml +++ b/tangem-demo/src/main/res/color/mtrl_fab_bg_color_selector.xml @@ -1,6 +1,6 @@ - - + + diff --git a/tangem-demo/src/main/res/color/mtrl_fab_icon_text_color_selector.xml b/tangem-demo/src/main/res/color/mtrl_fab_icon_text_color_selector.xml index f02e7d7348..0e2e94a4af 100644 --- a/tangem-demo/src/main/res/color/mtrl_fab_icon_text_color_selector.xml +++ b/tangem-demo/src/main/res/color/mtrl_fab_icon_text_color_selector.xml @@ -1,6 +1,6 @@ - - + + diff --git a/tangem-demo/src/main/res/layout/fg_entry_point.xml b/tangem-demo/src/main/res/layout/fg_entry_point.xml index 03cd54ab61..8a589c5489 100644 --- a/tangem-demo/src/main/res/layout/fg_entry_point.xml +++ b/tangem-demo/src/main/res/layout/fg_entry_point.xml @@ -13,14 +13,4 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/menu_item_switch.xml b/tangem-demo/src/main/res/layout/menu_item_switch.xml new file mode 100644 index 0000000000..b1a4fdf492 --- /dev/null +++ b/tangem-demo/src/main/res/layout/menu_item_switch.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/w_field_description.xml b/tangem-demo/src/main/res/layout/w_field_description.xml index 706dd15439..83af007f53 100644 --- a/tangem-demo/src/main/res/layout/w_field_description.xml +++ b/tangem-demo/src/main/res/layout/w_field_description.xml @@ -1,18 +1,14 @@ - + android:layout_height="match_parent" + android:visibility="gone"> + android:textColor="@color/colorPrimary" /> - \ No newline at end of file + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_edit_text.xml b/tangem-demo/src/main/res/layout/w_personalize_item_edit_text.xml index a1f8f71c22..d6e74eff0b 100644 --- a/tangem-demo/src/main/res/layout/w_personalize_item_edit_text.xml +++ b/tangem-demo/src/main/res/layout/w_personalize_item_edit_text.xml @@ -1,6 +1,7 @@ @@ -30,5 +30,13 @@ + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_number.xml b/tangem-demo/src/main/res/layout/w_personalize_item_number.xml index 0a27218146..d6e74eff0b 100644 --- a/tangem-demo/src/main/res/layout/w_personalize_item_number.xml +++ b/tangem-demo/src/main/res/layout/w_personalize_item_number.xml @@ -1,6 +1,7 @@ @@ -23,7 +23,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="start|bottom" - android:inputType="number" android:paddingStart="0dp" android:paddingEnd="@dimen/def_double_indent" android:paddingBottom="4dp" @@ -31,5 +30,13 @@ + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_spinner.xml b/tangem-demo/src/main/res/layout/w_personalize_item_spinner.xml index 7c5ce21954..9439e0fc00 100644 --- a/tangem-demo/src/main/res/layout/w_personalize_item_spinner.xml +++ b/tangem-demo/src/main/res/layout/w_personalize_item_spinner.xml @@ -25,4 +25,12 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_name" /> + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_switch.xml b/tangem-demo/src/main/res/layout/w_personalize_item_switch.xml index 6cb14711fd..0df1df4279 100644 --- a/tangem-demo/src/main/res/layout/w_personalize_item_switch.xml +++ b/tangem-demo/src/main/res/layout/w_personalize_item_switch.xml @@ -2,19 +2,26 @@ - + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/layout/w_personalize_item_text.xml b/tangem-demo/src/main/res/layout/w_personalize_item_text.xml index e55ae5b07c..84709d7ee4 100644 --- a/tangem-demo/src/main/res/layout/w_personalize_item_text.xml +++ b/tangem-demo/src/main/res/layout/w_personalize_item_text.xml @@ -2,7 +2,7 @@ @@ -12,9 +12,16 @@ android:layout_height="wrap_content" android:gravity="start|bottom" android:textSize="@dimen/unit_widget_text_size_block" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/menu/main_menu.xml b/tangem-demo/src/main/res/menu/main_menu.xml new file mode 100644 index 0000000000..6241fdec1d --- /dev/null +++ b/tangem-demo/src/main/res/menu/main_menu.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/navigation/navigation.xml b/tangem-demo/src/main/res/navigation/navigation.xml index fef7fd2d61..27d20a83de 100644 --- a/tangem-demo/src/main/res/navigation/navigation.xml +++ b/tangem-demo/src/main/res/navigation/navigation.xml @@ -43,18 +43,18 @@ - + diff --git a/tangem-demo/src/main/res/values/colors.xml b/tangem-demo/src/main/res/values/colors.xml index 8f217c276b..a2934770dc 100644 --- a/tangem-demo/src/main/res/values/colors.xml +++ b/tangem-demo/src/main/res/values/colors.xml @@ -5,4 +5,10 @@ #027AFF #26000000 + + #C6C6C6 + #FFE391 + #FFFFFF + #FFA100 + diff --git a/tangem-demo/src/main/res/values/dimens.xml b/tangem-demo/src/main/res/values/dimens.xml index 7380ae7b2d..68c97b1cd4 100644 --- a/tangem-demo/src/main/res/values/dimens.xml +++ b/tangem-demo/src/main/res/values/dimens.xml @@ -1,21 +1,21 @@ - 1dp + 1dp - 8dp - 16dp - 32dp + 8dp + 16dp + 32dp - 52dp - 20sp - 16sp - 12sp - 14sp + 52dp + 20sp + 16sp + 12sp + 14sp - @dimen/def_indent - @dimen/def_indent + @dimen/def_indent + @dimen/def_indent - @dimen/def_indent - 0dp + @dimen/def_indent + 0dp \ No newline at end of file diff --git a/tangem-demo/src/main/res/values/string_personalization.xml b/tangem-demo/src/main/res/values/string_personalization.xml new file mode 100644 index 0000000000..c31b382533 --- /dev/null +++ b/tangem-demo/src/main/res/values/string_personalization.xml @@ -0,0 +1,143 @@ + + + + Personalize + Card number + Common + Signing method + Sign hash external properties + Denomination + Token + Product mask + Settings mask + Settings mask protocol encryption + Settings mask ndef + Pins + + Series + Number + Curve + Blockchain + Custom blockchain + Max signatures + Create wallet + Sign TX hashes (0) + Sign raw TX (1) + Sign validated TX hashes (2) + Sign validated raw TX (3) + Sign validated TX hashes with issuer data (4) + Sign validated raw TX with issuer data (5) + Sign hash external (6) + Pin-less floor limit + Cr(ypto)Ex(tract) key + Require terminal Cert signature + Require terminal TX signature + Check PIN3 on card + Write on personalize + Denomination + It\'s token + Symbol + Contract address + Decimal + Note + Tag + ID card + Is reusable + Need activation + Forbid purge + Allow select blockchain + Use block + One APDU at once + Use CVC + Allow swap PIN + Allow swap PIN2 + Forbid default PIN + Smart Security Delay + Protect issuer data against replay + Security delay if validated + Skip PIN2 and CVC if validated + Skip security delay on linked terminal + Restrict overwrite extra issuer data + Allow unencrypted + Allow \'FAST\' encryption + Use NDEF + Dynamic NDEF + Disable precomputed NDEF + AAR + Custom AAR package name + PIN + PIN2 + PIN3 + CVC + Pause before PIN2 + + Description for the field: Card number + Description for the field: Common + Description for the field: Signing method + Description for the field: Sign hash external properties + Description for the field: Denomination + Description for the field: Token + Description for the field: Product mask + Description for the field: Settings mask + Description for the field: Settings mask protocol encryption + Description for the field: Settings mask ndef + Description for the field: Pins + + Description for the field: Series + Description for the field: Number + Description for the field: Curve + Description for the field: Blockchain + Description for the field: Custom blockchain + Description for the field: Max signatures + Description for the field: Create wallet + Description for the field: Sign TX hashes (0) + Description for the field: Sign raw TX (1) + Description for the field: Sign validated TX hashes (2) + Description for the field: Sign validated raw TX (3) + Description for the field: Sign validated TX hashes with issuer data (4) + Description for the field: Sign validated raw TX with issuer data (5) + Description for the field: Sign hash external (6) + Description for the field: Pin-less floor limit + Description for the field: Cr(ypto)Ex(tract) key + Description for the field: Require terminal Cert signature + Description for the field: Require terminal TX signature + Description for the field: Check PIN3 on card + Description for the field: Write on personalize + Description for the field: Denomination + Description for the field: It\'s token + Description for the field: Symbol + Description for the field: Contract address + Description for the field: Decimal + Description for the field: Note + Description for the field: Tag + Description for the field: ID card + Description for the field: Is reusable + Description for the field: Need activation + Description for the field: Forbid purge + Description for the field: Allow select blockchain + Description for the field: Use block + Description for the field: One APDU at once + Description for the field: Use CVC + Description for the field: Allow swap PIN + Description for the field: Allow swap PIN2 + Description for the field: Forbid default PIN + Description for the field: Smart Security Delay + Description for the field: Protect issuer data against replay + Description for the field: Security delay if validated + Description for the field: Skip PIN2 and CVC if validated + Description for the field: Skip security delay on linked terminal + Description for the field: Restrict overwrite extra issuer data + Description for the field: Allow unencrypted + Description for the field: Allow \'FAST\' encryption + Description for the field: Use NDEF + Description for the field: Dynamic NDEF + Description for the field: Disable precomputed NDEF + Description for the field: AAR + Description for the field: Custom AAR package name + Description for the field: PIN + Description for the field: PIN2 + Description for the field: PIN3 + Description for the field: CVC + Description for the field: Pause before PIN2 + + \ No newline at end of file diff --git a/tangem-demo/src/main/res/values/strings.xml b/tangem-demo/src/main/res/values/strings.xml index 06c37117c4..7723b3af1c 100644 --- a/tangem-demo/src/main/res/values/strings.xml +++ b/tangem-demo/src/main/res/values/strings.xml @@ -4,6 +4,7 @@ @string/app_name Scan Sign + Personalize Create wallet Purge wallet Read issuer data @@ -15,75 +16,4 @@ "Current card ID: " unknown - Personalize - Card number - Common - Signing method - Sign hash external properties - Denomination - Token - Product mask - Settings mask - Settings mask protocol encryption - Settings mask ndef - Pins - - Series - Number - Curve - Blockchain - Custom blockchain - Max signatures - Create wallet - Sign TX hashes (0) - Sign raw TX (1) - Sign validated TX hashes (2) - Sign validated raw TX (3) - Sign validated TX hashes with issuer data (4) - Sign validated raw TX with issuer data (5) - Sign hash external (6) - Pin-less floor limit - Cr(ypto)Ex(tract) key - Require terminal Cert signature - Require terminal TX signature - Check PIN3 on card - Write on personalize - Denomination - It\'s token - Symbol - Contract address - Decimal - Note - Tag - ID card - Is reusable - Need activation - Forbid purge - Allow select blockchain - Use block - One APDU at once - Use CVC - Allow swap PIN - Allow swap PIN2 - Forbid default PIN - Smart Security Delay - Protect issuer data against replay - Security delay if validated - Skip PIN2 and CVC if validated - Skip security delay on linked terminal - Restrict overwrite extra issuer data - Allow unencrypted - Allow \'FAST\' encryption - Use NDEF - Dynamic NDEF - Disable precomputed NDEF - AAR - Custom AAR package name - PIN - PIN2 - PIN3 - CVC - Pause before PIN2 - - Some very useful description diff --git a/tangem-demo/src/main/res/values/styles.xml b/tangem-demo/src/main/res/values/styles.xml index 54fd2c4419..6a64c2c66d 100644 --- a/tangem-demo/src/main/res/values/styles.xml +++ b/tangem-demo/src/main/res/values/styles.xml @@ -8,19 +8,9 @@ @color/colorAccent - - - -