From acd023b2f540d9546af64efb6984bd7250bcc81b Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 9 Apr 2020 20:11:20 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../structure/abstraction/ItemViewModel.kt | 15 ++++--- .../tangemtest/_arch/structure/impl/Items.kt | 38 ++++++++++++------ .../_arch/widget/abstraction/ViewWidget.kt | 20 +++++++++- .../PersonalizationConfigConverter.kt | 2 +- .../personalize/ui/widgets/SpinnerWidget.kt | 32 +++++++-------- .../responses/converter/CardConverter.kt | 40 ++++++++++++++----- .../responses/ui/widget/ResponseTextWidget.kt | 6 --- tangem-demo/src/main/res/values/colors.xml | 4 ++ 8 files changed, 106 insertions(+), 51 deletions(-) diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt index d298f84f93..8c548ee17c 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt @@ -13,8 +13,10 @@ typealias SafeValueChange = (V) -> Unit class KeyValue(val key: String, val value: Any) -class ViewState { - var isHiddenField = false +class ViewState( + var isHidden: Boolean = false, + var backgroundColor: Int? = -1 +) { var descriptionVisibility: Int = 0x00000008 set(value) { @@ -34,9 +36,11 @@ interface ItemViewModel : PayloadHolder { fun updateDataByView(data: Any?) } -open class BaseItemViewModel(value: Any? = null) : ItemViewModel { +open class BaseItemViewModel( + value: Any? = null, + override val viewState: ViewState = ViewState() +) : ItemViewModel { - override val viewState: ViewState = ViewState() override val payload: Payload = mutableMapOf() // Don't update it directly from a View. Use for it updateDataByView() @@ -75,6 +79,7 @@ open class BaseItemViewModel(value: Any? = null) : ItemViewModel { } class ListViewModel( + val itemList: List, var selectedItem: Any?, - val itemList: List + override val viewState: ViewState = ViewState() ) : BaseItemViewModel(selectedItem) \ 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 923f58f94a..e402650802 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 @@ -1,25 +1,39 @@ package com.tangem.tangemtest._arch.structure.impl import com.tangem.tangemtest._arch.structure.Id -import com.tangem.tangemtest._arch.structure.abstraction.BaseItem -import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel -import com.tangem.tangemtest._arch.structure.abstraction.KeyValue -import com.tangem.tangemtest._arch.structure.abstraction.ListViewModel +import com.tangem.tangemtest._arch.structure.abstraction.* /** [REDACTED_AUTHOR] */ -open class TypedItem(id: Id, value: D? = null) : BaseItem(id, BaseItemViewModel(value)) { +open class TypedItem(id: Id, viewModel: ItemViewModel) : BaseItem(id, viewModel) { open fun getTypedData(): D? = viewModel.data as? D } -class TextItem(id: Id, value: String? = null) : TypedItem(id, value) -class NumberItem(id: Id, value: Number? = null) : TypedItem(id, value) -class BoolItem(id: Id, value: Boolean? = null) : TypedItem(id, value) +class TextItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, value: String? = null, viewState: ViewState = ViewState()) + : this(id, BaseItemViewModel(value, viewState)) +} -class EditTextItem(id: Id, value: String? = null) : TypedItem(id, value) +class NumberItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, value: Number? = null, viewState: ViewState = ViewState()) + : this(id, BaseItemViewModel(value, viewState)) +} -class SpinnerItem(id: Id, value: List, selectedValue: Any?) - : TypedItem(id, ListViewModel(selectedValue, value) -) \ No newline at end of file +class BoolItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, value: Boolean? = null, viewState: ViewState = ViewState()) + : this(id, BaseItemViewModel(value, viewState)) +} + + +class EditTextItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, value: String? = null, viewState: ViewState = ViewState()) + : this(id, BaseItemViewModel(value, viewState)) +} + + +class SpinnerItem(id: Id, viewModel: ListViewModel) : TypedItem(id, viewModel) { + constructor(id: Id, list: List, selectedValue: Any?, viewState: ViewState = ViewState()) + : this(id, ListViewModel(list, selectedValue, viewState)) +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt index 8a220c0f1a..9047cdacc1 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt @@ -1,12 +1,16 @@ package com.tangem.tangemtest._arch.widget.abstraction +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.ColorRes import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.StringId import com.tangem.tangemtest._arch.structure.StringResId import com.tangem.tangemtest._arch.structure.abstraction.Item +import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder /** @@ -17,6 +21,7 @@ interface ViewWidget : LayoutHolder { var item: Item fun getName(): String + fun setBackgroundColor(@ColorRes colorId: Int?) } abstract class BaseViewWidget( @@ -25,10 +30,14 @@ abstract class BaseViewWidget( ) : ViewWidget { override val view: View = inflate(getLayoutId(), parent) + private var defaultBackground: Drawable = view.background + init { - if (item.viewModel.viewState.isHiddenField) { + if (item.viewModel.viewState.isHidden) { view.visibility = View.GONE + } else { + setBackgroundColor(item.viewModel.viewState.backgroundColor) } } @@ -39,6 +48,15 @@ abstract class BaseViewWidget( else -> view.resources.getString(R.string.unknown) } } + + override fun setBackgroundColor(colorId: Int?) { + val background = when { + colorId == null -> null + colorId == -1 -> defaultBackground + else -> ColorDrawable(view.colorFrom(colorId)) + } + view.background = background + } } internal fun inflate(id: Int, parent: ViewGroup): View { diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt index c350690412..cd0c912920 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt @@ -147,7 +147,7 @@ class PersonalizationConfigToItems : ModelToItems { blocList.add(pins()) blocList.iterate { if (itemTypes.hiddenList.contains(it.id)) { - it.viewModel.viewState.isHiddenField = true + it.viewModel.viewState.isHidden = true } } return blocList diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt index 757634df6d..d3e06d96cf 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt @@ -18,41 +18,41 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf */ class SpinnerWidget( parent: ViewGroup, - private val typedItem: SpinnerItem + typedItem: SpinnerItem ) : DescriptionWidget(parent, typedItem) { override fun getLayoutId(): Int = R.layout.w_personalize_item_spinner - private val data: ListViewModel = typedItem.getTypedData()!! + private val viewModel: ListViewModel = typedItem.viewModel as ListViewModel - private val spItem = view.findViewById(R.id.sp_item) - private val spAdapter = SpItemAdapter(data.itemList) + private val spinner = view.findViewById(R.id.sp_item) + private val spAdapter = SpItemAdapter(viewModel.itemList) private val onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onNothingSelected(parent: AdapterView<*>?) {} override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - data.selectedItem = data.itemList[position].value - typedItem.viewModel.updateDataByView(data) + viewModel.selectedItem = viewModel.itemList[position].value + item.viewModel.updateDataByView(viewModel) } } init { val name = view.findViewById(R.id.tv_name) name.text = getName() - spItem.adapter = spAdapter - spAdapter.getItemPosition(stringOf(data.selectedItem))?.let { - spItem.setSelection(it) + spinner.adapter = spAdapter + spAdapter.getItemPosition(stringOf(viewModel.selectedItem))?.let { + spinner.setSelection(it) } - spItem.onItemSelectedListener = onItemSelectedListener - typedItem.viewModel.onDataUpdated = { + spinner.onItemSelectedListener = onItemSelectedListener + item.viewModel.onDataUpdated = { val selectedItem = it as? String - spItem.onItemSelectedListener = null - data.itemList.firstOrNull { item -> item.value == selectedItem }?.let { keyValue -> - val position = data.itemList.indexOf(keyValue) - spItem.setSelection(position) + spinner.onItemSelectedListener = null + viewModel.itemList.firstOrNull { item -> item.value == selectedItem }?.let { keyValue -> + val position = viewModel.itemList.indexOf(keyValue) + spinner.setSelection(position) } - spItem.onItemSelectedListener = onItemSelectedListener + spinner.onItemSelectedListener = onItemSelectedListener } } } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt index 007cf07543..40db39e261 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt @@ -1,14 +1,13 @@ package com.tangem.tangemtest.ucase.variants.responses.converter import com.tangem.commands.Card +import com.tangem.commands.CardData import com.tangem.commands.Settings import com.tangem.commands.SettingsMask +import com.tangem.tangemtest.R import com.tangem.tangemtest._arch.structure.Id import com.tangem.tangemtest._arch.structure.StringId -import com.tangem.tangemtest._arch.structure.abstraction.Item -import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup -import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems -import com.tangem.tangemtest._arch.structure.abstraction.SimpleItemGroup +import com.tangem.tangemtest._arch.structure.abstraction.* import com.tangem.tangemtest._arch.structure.impl.BoolItem import com.tangem.tangemtest._arch.structure.impl.TextItem import com.tangem.tangemtest.ucase.variants.personalize.BlockId @@ -26,11 +25,26 @@ class CardConverter : ModelToItems { // itemList.add(TextItem(Additional.JSON_INCOMING, holder.gson.toJson(from))) itemList.add(simpleFields(from)) - itemList.add(cardData(from)) + itemList.add(cardData(from.cardData)) itemList.add(settingsMask(from.settingsMask)) + hideEmptyNullFields(itemList) + return itemList } + private fun hideEmptyNullFields(itemList: MutableList) { + itemList.iterate { + val data = it.getData() + val isHidden = if (data == null) true + else when (data) { + is String -> data.isEmpty() + else -> false + } + + if (isHidden) it.viewModel.viewState.isHidden = true + } + } + private fun simpleFields(from: Card): Item { val group = createGroup(BlockId.Common) group.addItem(TextItem(CardId.cardId, from.cardId)) @@ -55,9 +69,11 @@ class CardConverter : ModelToItems { return group } - private fun cardData(from: Card): Item { - val group = createGroup(BlockId.Common) - val data = from.cardData ?: return group + private fun cardData(from: CardData?): Item { + val group = createGroup(BlockId.Common, R.color.group_card_data) + val data = from ?: return group + +// group.addItem(TextItem(StringResId(R.string.response_card_card_data))) group.addItem(TextItem(CardDataId.batchId, data.batchId)) // Format: Year (2 bytes) | Month (1 byte) | Day (1 byte) group.addItem(TextItem(CardDataId.manufactureDateTime, stringOf(data.manufactureDateTime))) @@ -73,12 +89,16 @@ class CardConverter : ModelToItems { } private fun settingsMask(from: SettingsMask?): Item { - val group = createGroup(CardId.settingsMask) + val group = createGroup(CardId.settingsMask, R.color.group_signing_method) val data = from ?: return group +// group.addItem(TextItem(StringResId(R.string.response_card_settings_mask))) Settings.values().forEach { group.addItem(BoolItem(StringId(it.name), data.contains(it))) } return group } - private fun createGroup(id: Id): ItemGroup = SimpleItemGroup(id).apply { addItem(TextItem(id)) } + private fun createGroup(id: Id, colorId: Int? = null): ItemGroup { + return if (colorId == null) SimpleItemGroup(id) + else SimpleItemGroup(id, BaseItemViewModel(viewState = ViewState(backgroundColor = colorId))) + } } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt index a0d546f973..9367b0bc0c 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt @@ -3,7 +3,6 @@ package com.tangem.tangemtest.ucase.variants.responses.ui.widget import android.content.ClipData import android.content.ClipboardManager import android.content.Context -import android.view.View import android.view.ViewGroup import android.widget.TextView import com.tangem.tangemtest.R @@ -29,11 +28,6 @@ class ResponseTextWidget( private fun initWidgets() { val data = typedItem.getData() as? String - if (data == null || data.isEmpty()) { - view.visibility = View.GONE - return - } - tvName.text = getName() tvValue.text = data diff --git a/tangem-demo/src/main/res/values/colors.xml b/tangem-demo/src/main/res/values/colors.xml index c72e37bcd8..1c183064f5 100644 --- a/tangem-demo/src/main/res/values/colors.xml +++ b/tangem-demo/src/main/res/values/colors.xml @@ -13,6 +13,10 @@ #303030 @color/field_info + #D7E4F3 + #D7F3E6 + + #C6C6C6 #FFE391 #FFFFFF