diff --git a/.gitignore b/.gitignore
index ae9ed9c524..39d65ab0a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,10 @@ local.properties
.idea/caches/
.idea/libraries/
.idea/*.xml
+.idea/codeStyles
+
+# LayoutInspector files
+.captures
# OS-specific files
.DS_Store
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index 681f41ae2a..0000000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- xmlns:android
-
- ^$
-
-
-
-
-
-
-
-
- xmlns:.*
-
- ^$
-
-
- BY_NAME
-
-
-
-
-
-
- .*:id
-
- http://schemas.android.com/apk/res/android
-
-
-
-
-
-
-
-
- .*:name
-
- http://schemas.android.com/apk/res/android
-
-
-
-
-
-
-
-
- name
-
- ^$
-
-
-
-
-
-
-
-
- style
-
- ^$
-
-
-
-
-
-
-
-
- .*
-
- ^$
-
-
- BY_NAME
-
-
-
-
-
-
- .*
-
- http://schemas.android.com/apk/res/android
-
-
- ANDROID_ATTRIBUTE_ORDER
-
-
-
-
-
-
- .*
-
- .*
-
-
- BY_NAME
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index a55e7a179b..0000000000
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt
index c9fc162b6a..ab604ee506 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/AppTangemDemo.kt
@@ -1,6 +1,8 @@
package com.tangem.tangemtest
import android.app.Application
+import android.content.Context
+import android.content.SharedPreferences
import com.tangem.tangemtest._arch.structure.ILog
import com.tangem.tangemtest._arch.structure.ItemLogger
import com.tangem.tangemtest.commons.TangemLogger
@@ -23,6 +25,10 @@ class AppTangemDemo : Application() {
ILog.setLogger(ItemLogger())
}
+ fun sharedPreferences(name: String = "DevKitApp", mode: Int = Context.MODE_PRIVATE): SharedPreferences {
+ return getSharedPreferences(name, mode)
+ }
+
companion object {
lateinit var appInstance: AppTangemDemo
}
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt
index 98704005f5..309309c947 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/HelpAbstracts.kt
@@ -3,10 +3,6 @@ package com.tangem.tangemtest._arch.structure
/**
[REDACTED_AUTHOR]
*/
-interface DataHolder {
- var viewModel: D
-}
-
typealias Payload = MutableMap
interface PayloadHolder {
@@ -17,12 +13,4 @@ interface PayloadHolder {
fun set(key: String, value: Any?) {
payload[key] = value
}
-}
-
-interface ItemListHolder {
- fun setItems(list: MutableList)
- fun getItems(): MutableList
- fun addItem(item: I)
- fun removeItem(item: I)
- fun clear()
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt
index 3b40edcc77..5e517808f2 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/Ids.kt
@@ -5,6 +5,10 @@ package com.tangem.tangemtest._arch.structure
*/
interface Id
+class StringId(val value: String) : Id
+
+class StringResId(val value: Int) : Id
+
enum class Additional : Id {
UNDEFINED,
JSON_INCOMING,
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt
index 71924302a3..76b43ce50a 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Extension.kt
@@ -5,11 +5,11 @@ import com.tangem.tangemtest._arch.structure.Id
/**
[REDACTED_AUTHOR]
*/
-fun List- .findDataItem(id: Id): BaseItem? {
- var foundItem: BaseItem? = null
+fun List
- .findItem(id: Id): Item? {
+ var foundItem: Item? = null
iterate {
if (it.id == id) {
- foundItem = it as? BaseItem
+ foundItem = it
return@iterate
}
}
@@ -19,8 +19,8 @@ fun List
- .findDataItem(id: Id): BaseItem? {
fun List
- .iterate(func: (Item) -> Unit) {
forEach {
when (it) {
- is BaseItem<*> -> func(it)
- is Block -> it.itemList.iterate(func)
+ is BaseItem -> func(it)
+ is ItemGroup -> it.itemList.iterate(func)
}
}
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt
index 2cfbc69173..eaf3d7afa4 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Item.kt
@@ -1,31 +1,39 @@
package com.tangem.tangemtest._arch.structure.abstraction
-import com.tangem.tangemtest._arch.structure.DataHolder
import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.Payload
-import com.tangem.tangemtest._arch.structure.PayloadHolder
/**
[REDACTED_AUTHOR]
*/
-interface Item : PayloadHolder {
+interface Item {
val id: Id
var parent: Item?
-}
+ var viewModel: ItemViewModel
-abstract class BaseItem(
- override var viewModel: ItemViewModel
-) : Item, DataHolder> {
- override var parent: Item? = null
- override val payload: Payload = mutableMapOf()
+ fun added(parent: Item) {
+ this.parent = parent
+ }
- fun getData(): D? = viewModel.data
+ fun removed(parent: Item) {
+ this.parent = null
+ }
- fun setData(value: D?) {
+ fun getData(): D? = viewModel.data as? D
+
+ fun setData(value: Any?) {
viewModel.data = value
}
- fun restoreDefaultData(){
+ fun restoreDefaultData() {
setData(viewModel.defaultData)
}
+}
+
+open class BaseItem(
+ override val id: Id,
+ override var viewModel: ItemViewModel
+) : Item {
+
+ override var parent: Item? = null
+
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Block.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemGroup.kt
similarity index 61%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Block.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemGroup.kt
index 11086e6f93..61a43a0d1c 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/Block.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemGroup.kt
@@ -2,45 +2,47 @@ package com.tangem.tangemtest._arch.structure.abstraction
import com.tangem.tangemtest._arch.structure.ILog
import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.ItemListHolder
/**
[REDACTED_AUTHOR]
*/
-interface Block : Item {
+interface ItemGroup : Item {
val itemList: MutableList
-
+
+ fun setItems(list: MutableList
- )
+ fun getItems(): MutableList
-
+ fun addItem(item: Item)
+ fun removeItem(item: Item)
+ fun clear()
}
-abstract class BaseBlock : Block {
+open class SimpleItemGroup(
+ override val id: Id,
+ override var viewModel: ItemViewModel = BaseItemViewModel()
+) : ItemGroup {
+
override var parent: Item? = null
override val itemList: MutableList
- = mutableListOf()
- override val payload: MutableMap = mutableMapOf()
-}
-
-open class ListItemBlock(
- override val id: Id
-) : BaseBlock(), ItemListHolder
- {
override fun setItems(list: MutableList
- ) {
ILog.d(this, "setItems into: $id, count: ${list.size}")
+ itemList.forEach { it.removed(this) }
itemList.clear()
- itemList.addAll(list)
- itemList.forEach { it.parent = this }
+ list.forEach { addItem(it) }
}
- override fun getItems(): MutableList
- {
- return itemList
- }
+ override fun getItems(): MutableList
- = itemList
override fun addItem(item: Item) {
ILog.d(this, "addItem into: $id, who: ${item.id}")
- item.parent = this
itemList.add(item)
+ item.added(this)
}
override fun removeItem(item: Item) {
ILog.d(this, "removeItem from: $id, which: ${item.id}")
itemList.remove(item)
+ item.removed(this)
}
override fun clear() {
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt
similarity index 63%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt
index 86d1d1b345..8c548ee17c 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ViewModel.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/abstraction/ItemViewModel.kt
@@ -11,57 +11,12 @@ import com.tangem.tangemtest._arch.structure.PayloadHolder
typealias ValueChange = (V?) -> Unit
typealias SafeValueChange = (V) -> Unit
-interface ItemViewModel : PayloadHolder {
- val viewState: ViewState
- var data: D?
- var defaultData: D?
- var onDataUpdated: ValueChange?
+class KeyValue(val key: String, val value: Any)
- fun updateDataByView(data: D?)
-}
-
-open class BaseItemViewModel : ItemViewModel {
-
- override val viewState: ViewState = ViewState()
- override val payload: Payload = mutableMapOf()
-
- // Don't update it directly from a View. Use for it updateDataByView()
- override var data: D? = null
- set(value) {
- if (handleDataUpdates(value)) field = value
- }
-
- // Data for restoring initial value
- override var defaultData: D? = null
- set(value) {
- field = value
- data = value
- }
-
- // Use it for handling data updates in View
- override var onDataUpdated: ValueChange? = null
-
- // When data updates directly it invokes onDataUpdated
- // return true = data will update
- // return false = data won't update
- protected open fun handleDataUpdates(value: D?): Boolean {
- ILog.d(this, "handleDateUpdates: $value")
- onDataUpdated?.invoke(value)
- return true
- }
-
- // Use it to update the data from a View. It disables onDataUpdated to prevent a callback loop
- override fun updateDataByView(data: D?) {
- ILog.d(this, "data changed: $data")
- val callback = onDataUpdated
- onDataUpdated = null
- this.data = data
- onDataUpdated = callback
- }
-}
-
-class ViewState {
- var isHiddenField = false
+class ViewState(
+ var isHidden: Boolean = false,
+ var backgroundColor: Int? = -1
+) {
var descriptionVisibility: Int = 0x00000008
set(value) {
@@ -70,4 +25,61 @@ class ViewState {
}
var onDescriptionVisibilityChanged: SafeValueChange? = null
-}
\ No newline at end of file
+}
+
+interface ItemViewModel : PayloadHolder {
+ val viewState: ViewState
+ var data: Any?
+ var defaultData: Any?
+ var onDataUpdated: ValueChange?
+
+ fun updateDataByView(data: Any?)
+}
+
+open class BaseItemViewModel(
+ value: Any? = null,
+ override val viewState: ViewState = ViewState()
+) : ItemViewModel {
+
+ override val payload: Payload = mutableMapOf()
+
+ // Don't update it directly from a View. Use for it updateDataByView()
+ override var data: Any? = value
+ set(value) {
+ if (handleDataUpdates(value)) field = value
+ }
+
+ // Data for restoring initial value
+ override var defaultData: Any? = value
+ set(value) {
+ field = value
+ data = value
+ }
+
+ // Use it for handling data updates in View
+ override var onDataUpdated: ValueChange? = null
+
+ // When data updates directly it invokes onDataUpdated
+ // return true = data will update
+ // return false = data won't update
+ protected open fun handleDataUpdates(value: Any?): Boolean {
+ ILog.d(this, "handleDateUpdates: $value")
+ onDataUpdated?.invoke(value)
+ return true
+ }
+
+ // Use it to update the data from a View. It disables onDataUpdated to prevent a callback loop
+ override fun updateDataByView(data: Any?) {
+ ILog.d(this, "data changed: $data")
+ val callback = onDataUpdated
+ onDataUpdated = null
+ this.data = data
+ onDataUpdated = callback
+ }
+}
+
+class ListViewModel(
+ val itemList: List,
+ var selectedItem: Any?,
+ 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 11ea5510c0..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,19 +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.*
/**
[REDACTED_AUTHOR]
*/
-class AnyItem(override val id: Id, value: Any? = null) : BaseItem(AnyViewModel(value))
-class TextItem(override val id: Id, value: String? = null) : BaseItem(StringViewModel(value))
-class EditTextItem(override val id: Id, value: String? = null) : BaseItem(StringViewModel(value))
-class NumberItem(override val id: Id, value: Number? = null) : BaseItem(NumberViewModel(value))
-class BoolItem(override val id: Id, value: Boolean? = null) : BaseItem(BoolViewModel(value))
-class ListItem(override val id: Id, value: List, selectedValue: Any?)
- : BaseItem(ListViewModel(ListValueWrapper(selectedValue, value))
-)
+open class TypedItem(id: Id, viewModel: ItemViewModel) : BaseItem(id, viewModel) {
+ open fun getTypedData(): D? = viewModel.data as? D
+}
-inline fun BaseItem.getData(): T? = viewModel.data
\ No newline at end of file
+class TextItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) {
+ constructor(id: Id, value: String? = null, viewState: ViewState = ViewState())
+ : this(id, BaseItemViewModel(value, viewState))
+}
+
+class NumberItem(id: Id, viewModel: ItemViewModel) : TypedItem(id, viewModel) {
+ constructor(id: Id, value: Number? = null, viewState: ViewState = ViewState())
+ : this(id, BaseItemViewModel(value, viewState))
+}
+
+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/structure/impl/ViewModels.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/ViewModels.kt
deleted file mode 100644
index f082577e70..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/structure/impl/ViewModels.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.tangem.tangemtest._arch.structure.impl
-
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel
-
-/**
-[REDACTED_AUTHOR]
- */
-open class TransitiveViewModel(value: D?) : BaseItemViewModel() {
- init {
- defaultData = value
- }
-}
-
-class AnyViewModel(value: Any? = null) : TransitiveViewModel(value)
-class StringViewModel(value: String? = null) : TransitiveViewModel(value)
-class NumberViewModel(value: Number? = null) : TransitiveViewModel(value)
-class BoolViewModel(value: Boolean? = null) : TransitiveViewModel(value)
-class ListViewModel(value: ListValueWrapper? = null) : TransitiveViewModel(value) {
-
- override fun handleDataUpdates(value: ListValueWrapper?): Boolean {
- val newValue = value ?: return false
- if (newValue.selectedItem == data?.selectedItem) return false
-
- return super.handleDataUpdates(value)
- }
-}
-
-class KeyValue(val key: String, val value: Any)
-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/_arch/widget/ItemWidgetBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt
new file mode 100644
index 0000000000..2ed1e1ab8f
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/ItemWidgetBuilder.kt
@@ -0,0 +1,12 @@
+package com.tangem.tangemtest._arch.widget
+
+import android.view.ViewGroup
+import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
+import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
+
+/**
+[REDACTED_AUTHOR]
+ */
+interface ItemWidgetBuilder {
+ fun build(item: BaseItem, parent: ViewGroup): ViewWidget?
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt
new file mode 100644
index 0000000000..3d9a3493a5
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/WidgetBuilder.kt
@@ -0,0 +1,36 @@
+package com.tangem.tangemtest._arch.widget
+
+import android.view.ViewGroup
+import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
+import com.tangem.tangemtest._arch.structure.abstraction.Item
+import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup
+import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
+import com.tangem.tangemtest._arch.widget.impl.LinearGroupWidget
+import com.tangem.tangemtest._arch.widget.impl.StubWidget
+
+/**
+[REDACTED_AUTHOR]
+ */
+class WidgetBuilder(
+ private val itemBuilder: ItemWidgetBuilder
+) {
+
+ fun build(item: Item, parent: ViewGroup): ViewWidget? {
+ return when (item) {
+ is ItemGroup -> buildBlock(item, parent)
+ is BaseItem -> itemBuilder.build(item, parent)
+ else -> StubWidget(item.id, parent)
+ }
+ }
+
+ private fun buildBlock(itemGroup: ItemGroup, parent: ViewGroup): ViewWidget {
+ return when (itemGroup) {
+ is ItemGroup -> {
+ val linearBlock = LinearGroupWidget(parent, itemGroup)
+ itemGroup.getItems().forEach { build(it, linearBlock.view as ViewGroup) }
+ linearBlock
+ }
+ else -> StubWidget(itemGroup.id, parent)
+ }
+ }
+}
\ 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
new file mode 100644
index 0000000000..20fcb7f37f
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/abstraction/ViewWidget.kt
@@ -0,0 +1,67 @@
+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
+
+/**
+[REDACTED_AUTHOR]
+ */
+interface ViewWidget : LayoutHolder {
+ val view: View
+ var item: Item
+
+ fun getName(): String
+ fun setBackgroundColor(@ColorRes colorId: Int?)
+}
+
+abstract class BaseViewWidget(
+ parent: ViewGroup,
+ override var item: Item
+) : ViewWidget {
+
+ override val view: View = inflate(getLayoutId(), parent)
+
+ private var defaultBackground: Drawable? = view.background
+
+ init {
+ if (item.viewModel.viewState.isHidden) {
+ view.visibility = View.GONE
+ } else {
+ setBackgroundColor(item.viewModel.viewState.backgroundColor)
+ }
+ }
+
+ override fun getName(): String {
+ return when (val id = item.id) {
+ is StringId -> id.value
+ is StringResId -> view.resources.getString(id.value)
+ 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 {
+ val layoutId = if (id <= 0) R.layout.w_empty else id
+ val inflatedView = LayoutInflater.from(parent.context).inflate(layoutId, parent, false)
+ parent.addView(inflatedView)
+ return inflatedView
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt
new file mode 100644
index 0000000000..97c8d36a35
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/LinearGroupWidget.kt
@@ -0,0 +1,18 @@
+package com.tangem.tangemtest._arch.widget.impl
+
+import android.view.ViewGroup
+import com.tangem.tangemtest.R
+import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup
+import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget
+
+/**
+[REDACTED_AUTHOR]
+ */
+class LinearGroupWidget(
+ parent: ViewGroup,
+ itemGroup: ItemGroup
+) : BaseViewWidget(parent, itemGroup) {
+
+ 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/_arch/widget/impl/StubWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt
new file mode 100644
index 0000000000..1b832e362a
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/widget/impl/StubWidget.kt
@@ -0,0 +1,15 @@
+package com.tangem.tangemtest._arch.widget.impl
+
+import android.view.ViewGroup
+import com.tangem.tangemtest.R
+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.widget.abstraction.BaseViewWidget
+
+/**
+[REDACTED_AUTHOR]
+ */
+class StubWidget(id: Id, parent: ViewGroup) : BaseViewWidget(parent, BaseItem(id, BaseItemViewModel())) {
+ override fun getLayoutId(): Int = R.layout.w_empty
+}
\ 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 4e774f0be7..92e093d2c8 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
@@ -2,7 +2,6 @@ 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
@@ -12,8 +11,9 @@ import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
-import androidx.navigation.ui.setupActionBarWithNavController
+import androidx.navigation.ui.setupWithNavController
import com.tangem.tangemtest.R
+import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
@@ -34,8 +34,8 @@ class MainActivity : AppCompatActivity() {
.findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return
val navController = host.navController
- appBarConfiguration = AppBarConfiguration(setOf(R.id.nav_entry_point))
- setupActionBarWithNavController(navController, appBarConfiguration)
+ appBarConfiguration = AppBarConfiguration(navController.graph)
+ toolbar.setupWithNavController(navController, appBarConfiguration)
navController.addOnDestinationChangedListener { _, destination, _ ->
val dest: String = try {
@@ -43,7 +43,7 @@ class MainActivity : AppCompatActivity() {
} catch (e: Resources.NotFoundException) {
destination.id.toString()
}
- Log.d("NavigationActivity", "Navigated to $dest")
+ Log.d(this, "Navigated to $dest")
}
}
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
index 17ce97d8f9..a599bcb479 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/MainViewModel.kt
@@ -2,6 +2,8 @@ package com.tangem.tangemtest._main
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
+import com.tangem.tasks.TaskEvent
+import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
@@ -9,7 +11,16 @@ import androidx.lifecycle.ViewModel
class MainViewModel : ViewModel() {
val ldDescriptionSwitch = MutableLiveData(false)
+ var responseEvent: TaskEvent<*>? = null
+
fun switchToggled(state: Boolean) {
ldDescriptionSwitch.postValue(state)
}
+
+ fun changeResponseEvent(event: TaskEvent<*>?) {
+ Log.d(this, "changeResponseEvent")
+ val reqEvent = event ?: return
+
+ responseEvent = reqEvent
+ }
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt
index 313c4aaffe..ea17194439 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_main/entryPoint/ActionListFragment.kt
@@ -1,14 +1,10 @@
package com.tangem.tangemtest._main.entryPoint
import android.os.Bundle
-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
@@ -19,21 +15,19 @@ import com.tangem.tangemtest._main.MainViewModel
import com.tangem.tangemtest.ucase.getDefaultNavigationOptions
import com.tangem.tangemtest.ucase.resources.ActionType
import com.tangem.tangemtest.ucase.resources.MainResourceHolder
+import com.tangem.tangemtest.ucase.ui.BaseFragment
import kotlinx.android.synthetic.main.fg_entry_point.*
/**
[REDACTED_AUTHOR]
*/
-class ActionListFragment : Fragment() {
+class ActionListFragment : BaseFragment() {
- 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)
- }
+ override fun getLayoutId(): Int = R.layout.fg_entry_point
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -48,7 +42,9 @@ class ActionListFragment : Fragment() {
val vhDataWrapper = VhExDataWrapper(MainResourceHolder, false)
- rvActions.adapter = RvActionsAdapter(vhDataWrapper) { type, position, data -> navigate(data) }
+ rvActions.adapter = RvActionsAdapter(vhDataWrapper) { type, position, data ->
+ navigateTo(data, options = getDefaultNavigationOptions())
+ }
mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer {
vhDataWrapper.descriptionIsVisible = it
TransitionManager.beginDelayedTransition(rvActions as ViewGroup, AutoTransition())
@@ -64,10 +60,6 @@ class ActionListFragment : Fragment() {
adapter.notifyDataSetChanged()
}
- private fun navigate(destinationId: Int) {
- navController.navigate(destinationId, null, getDefaultNavigationOptions())
- }
-
private fun getNavigateOptions(): MutableList {
return mutableListOf(
ActionType.Scan,
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt
new file mode 100644
index 0000000000..f5f02c0ace
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/Abstractions.kt
@@ -0,0 +1,9 @@
+package com.tangem.tangemtest.commons
+
+/**
+[REDACTED_AUTHOR]
+ */
+interface Store {
+ fun save(config: M)
+ fun restore(): M
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt
index 7a19cf981f..59ae0da2b9 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/GlobalFunctions.kt
@@ -3,6 +3,7 @@ package com.tangem.tangemtest.commons
/**
[REDACTED_AUTHOR]
*/
-fun performAction(a: A?, b: B?, action: (A, B) -> Unit) {
+fun performAction(a: A?, b: B?, action: (A, B) -> Unit, onFail: (() -> Unit)? = null) {
if (a != null && b != null) action(a, b)
+ else onFail?.invoke()
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt
new file mode 100644
index 0000000000..3a9205574c
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/extensions/AndroidComponents.kt
@@ -0,0 +1,22 @@
+package com.tangem.tangemtest.extensions
+
+import android.content.Intent
+import androidx.activity.ComponentActivity
+import androidx.fragment.app.Fragment
+
+/**
+[REDACTED_AUTHOR]
+ */
+fun Fragment.shareText(text: String) {
+ requireActivity().shareText(text)
+}
+
+fun ComponentActivity.shareText(text: String) {
+ val sendIntent: Intent = Intent().apply {
+ action = Intent.ACTION_SEND
+ putExtra(Intent.EXTRA_TEXT, text)
+ type = "text/plain"
+ }
+ val shareIntent = Intent.createChooser(sendIntent, null)
+ startActivity(shareIntent)
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt
index 6e05a899a0..e8358b8071 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/Action.kt
@@ -43,4 +43,6 @@ abstract class BaseAction : Action {
}
callback(commandResult, modifiedItems)
}
+
+ override fun getActionByTag(payload: PayloadHolder, id: Id, attrs: AttrForAction): ((ActionCallback) -> Unit)? = null
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt
index 2b5d0a79c1..5dd9d80fc1 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/DepersonalizeAction.kt
@@ -2,7 +2,7 @@ package com.tangem.tangemtest.ucase.domain.actions
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest._arch.structure.abstraction.findDataItem
+import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.variants.TlvId
@@ -11,7 +11,7 @@ import com.tangem.tangemtest.ucase.variants.TlvId
*/
class DepersonalizeAction : BaseAction() {
override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
- val item = attrs.itemList.findDataItem(TlvId.CardId) ?: return
+ val item = attrs.itemList.findItem(TlvId.CardId) ?: return
val cardId = item.viewModel.data as? String ?: return
attrs.tangemSdk.depersonalize(cardId) { handleResult(payload, it, null, attrs, callback) }
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt
index ab3330ca54..612b728c24 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/PersonalizeAction.kt
@@ -2,7 +2,7 @@ package com.tangem.tangemtest.ucase.domain.actions
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.findDataItem
+import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest._arch.structure.impl.EditTextItem
import com.tangem.tangemtest._arch.structure.impl.NumberItem
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
@@ -10,10 +10,10 @@ import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
import com.tangem.tangemtest.ucase.tunnel.ActionView
import com.tangem.tangemtest.ucase.tunnel.ItemError
import com.tangem.tangemtest.ucase.variants.personalize.CardNumber
-import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter
-import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.PersonalizeConfigToCardConfig
-import com.tangem.tangemtest.ucase.variants.personalize.dto.DefaultPersonalizeParams
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig
+import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter
+import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigToCardConfig
+import com.tangem.tangemtest.ucase.variants.personalize.dto.DefaultPersonalizationParams
+import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
/**
@@ -33,12 +33,12 @@ class PersonalizeAction : BaseAction() {
return
}
- val issuer = DefaultPersonalizeParams.issuer()
- val acquirer = DefaultPersonalizeParams.acquirer()
- val manufacturer = DefaultPersonalizeParams.manufacturer()
+ val issuer = DefaultPersonalizationParams.issuer()
+ val acquirer = DefaultPersonalizationParams.acquirer()
+ val manufacturer = DefaultPersonalizationParams.manufacturer()
- val personalizeConfig = PersonalizeConfigConverter().convert(itemList, PersonalizeConfig())
- val cardConfig = PersonalizeConfigToCardConfig().convert(personalizeConfig)
+ val personalizeConfig = PersonalizationConfigConverter().convert(itemList, PersonalizationConfig())
+ val cardConfig = PersonalizationConfigToCardConfig().convert(personalizeConfig)
attrs.tangemSdk.personalize(cardConfig, issuer, manufacturer, acquirer) {
handleResult(payload, it, null, attrs, callback)
@@ -46,18 +46,18 @@ class PersonalizeAction : BaseAction() {
}
private fun checkSeries(itemList: List
- ): Boolean {
- val seriesItem = itemList.findDataItem(CardNumber.Series) as? EditTextItem ?: return false
- val data = seriesItem.getData() ?: return false
+ val seriesItem = itemList.findItem(CardNumber.Series) as? EditTextItem ?: return false
+ val data = seriesItem.getData() as? String ?: return false
seriesItem.setData(data.toUpperCase())
return data.length == 2 || data.length == 4
}
private fun checkNumber(itemList: List
- ): Boolean {
- val seriesItem = itemList.findDataItem(CardNumber.Series) as? EditTextItem ?: return false
- val numberItem = itemList.findDataItem(CardNumber.Number) as? NumberItem ?: return false
- val seriesData = seriesItem.getData() ?: return false
- val numberData = stringOf(numberItem.getData())
+ val seriesItem = itemList.findItem(CardNumber.Series) as? EditTextItem ?: return false
+ val numberItem = itemList.findItem(CardNumber.Number) as? NumberItem ?: return false
+ val seriesData = seriesItem.getData() as? String ?: return false
+ val numberData = stringOf(numberItem.getData() as? Number)
return if (seriesData.length == 2 && numberData.length > 13) false
else !(seriesData.length == 4 && numberData.length > 11)
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt
index c74209099b..375c2ce9a7 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/actions/SignAction.kt
@@ -2,7 +2,7 @@ package com.tangem.tangemtest.ucase.domain.actions
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.PayloadHolder
-import com.tangem.tangemtest._arch.structure.abstraction.findDataItem
+import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.variants.TlvId
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
@@ -12,9 +12,9 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
*/
class SignAction : BaseAction() {
override fun executeMainAction(payload: PayloadHolder, attrs: AttrForAction, callback: ActionCallback) {
- val dataForHashing = attrs.itemList.findDataItem(TlvId.TransactionOutHash) ?: return
+ val dataForHashing = attrs.itemList.findItem(TlvId.TransactionOutHash) ?: return
val hash = dataForHashing.getData() as? ByteArray ?: return
- val cardId = attrs.itemList.findDataItem(TlvId.CardId)?.viewModel?.data ?: return
+ val cardId = attrs.itemList.findItem(TlvId.CardId)?.viewModel?.data ?: return
attrs.tangemSdk.sign(arrayOf(hash), stringOf(cardId)) { handleResult(payload, it, null, attrs, callback) }
}
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt
deleted file mode 100644
index 000e9a53c5..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/Factory.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager
-
-import com.tangem.tangemtest.ucase.domain.paramsManager.managers.DepersonalizeItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizeItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.managers.ScanItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.managers.SignItemsManager
-import com.tangem.tangemtest.ucase.resources.ActionType
-import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
-
-/**
-[REDACTED_AUTHOR]
- */
-class ParamsManagerFactory : BaseTypedHolder() {
-
- companion object {
- fun createFactory(): ParamsManagerFactory {
- return ParamsManagerFactory().apply {
- register(ActionType.Scan, ScanItemsManager())
- register(ActionType.Sign, SignItemsManager())
- register(ActionType.Personalize, PersonalizeItemsManager())
- register(ActionType.Depersonalize, DepersonalizeItemsManager())
- }
- }
- }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt
index 89c8011add..a43809684b 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/ItemsManager.kt
@@ -19,12 +19,12 @@ typealias ActionCallback = (ActionResponse, AffectedList) -> Unit
interface ItemsManager : PayloadHolder {
fun itemChanged(id: Id, value: Any?, callback: AffectedItemsCallback? = null)
+ fun setItems(items: List
- )
fun getItems(): List
-
+ fun setItemChangeConsequences(consequence: ItemsChangeConsequence?)
fun invokeMainAction(tangemSdk: TangemSdk, callback: ActionCallback)
fun getActionByTag(id: Id, tangemSdk: TangemSdk): ((ActionCallback) -> Unit)?
fun attachPayload(payload: Payload)
-
- val consequence: ItemsChangeConsequence?
}
interface PayloadKey {
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt
index e8461a7e69..9edef2267e 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/BaseItemsManager.kt
@@ -1,39 +1,59 @@
package com.tangem.tangemtest.ucase.domain.paramsManager.managers
+import androidx.lifecycle.LifecycleObserver
import com.tangem.TangemSdk
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.Payload
import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.findDataItem
+import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest.ucase.domain.actions.Action
import com.tangem.tangemtest.ucase.domain.actions.AttrForAction
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.domain.paramsManager.AffectedItemsCallback
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
+import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
*/
-abstract class BaseItemsManager(protected val action: Action) : ItemsManager {
+open class BaseItemsManager(protected val action: Action) : ItemsManager, LifecycleObserver {
- protected val itemList: List
- by lazy { createItemsList() }
-
- override val consequence: ItemsChangeConsequence? = null
+ init {
+ Log.d(this, "new instance created")
+ }
override val payload: MutableMap = mutableMapOf()
+ protected var changeConsequence: ItemsChangeConsequence? = null
+ protected val itemList: MutableList
- = mutableListOf()
+
override fun itemChanged(id: Id, value: Any?, callback: AffectedItemsCallback?) {
if (itemList.isEmpty()) return
- val foundItem = itemList.findDataItem(id) ?: return
+ val foundItem = itemList.findItem(id) ?: return
foundItem.setData(value)
applyChangesByAffectedItems(foundItem, callback)
}
- override fun getItems(): MutableList
- = itemList.toMutableList()
+ override fun setItems(items: List
- ) {
+ itemList.clear()
+ itemList.addAll(items)
+ }
- override fun getActionByTag(id: Id, tangemSdk: TangemSdk): ((ActionCallback) -> Unit)? = null
+ override fun getItems(): List
- = itemList
+
+ override fun setItemChangeConsequences(consequence: ItemsChangeConsequence?) {
+ this.changeConsequence = consequence
+ }
+
+ override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) {
+ action.executeMainAction(this, getAttrsForAction(cardManager), callback)
+ }
+
+ override fun getActionByTag(id: Id, tangemSdk: TangemSdk): ((ActionCallback) -> Unit)? {
+ return action.getActionByTag(this, id, getAttrsForAction(tangemSdk))
+ }
override fun attachPayload(payload: Payload) {
payload.forEach { this.payload[it.key] = it.value }
@@ -41,11 +61,9 @@ abstract class BaseItemsManager(protected val action: Action) : ItemsManager {
// Use it if current item needs to be affect any other items
protected open fun applyChangesByAffectedItems(param: Item, callback: AffectedItemsCallback?) {
- consequence?.affectChanges(this, param, itemList)?.let { callback?.invoke(it) }
+ changeConsequence?.affectChanges(this, param, itemList)?.let { callback?.invoke(it) }
}
protected fun getAttrsForAction(tangemSdk: TangemSdk)
- : AttrForAction = AttrForAction(tangemSdk, itemList, payload, consequence)
-
- abstract fun createItemsList(): List
-
+ : AttrForAction = AttrForAction(tangemSdk, itemList, payload, changeConsequence)
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeItemsManager.kt
index 3f94e7ea85..e69de29bb2 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeItemsManager.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/DepersonalizeItemsManager.kt
@@ -1,26 +0,0 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.managers
-
-import com.tangem.TangemSdk
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.impl.EditTextItem
-import com.tangem.tangemtest.ucase.domain.actions.DepersonalizeAction
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-import com.tangem.tangemtest.ucase.variants.TlvId
-
-/**
-[REDACTED_AUTHOR]
- */
-class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) {
- override fun createItemsList(): List
- {
- return listOf(EditTextItem(TlvId.CardId, null))
- }
-
- override fun invokeMainAction(tangemSdk: TangemSdk, callback: ActionCallback) {
- action.executeMainAction(this, getAttrsForAction(tangemSdk), callback)
- }
-
- override fun getActionByTag(id: Id, tangemSdk: TangemSdk): ((ActionCallback) -> Unit)? {
- return action.getActionByTag(this, id, getAttrsForAction(tangemSdk))
- }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
new file mode 100644
index 0000000000..e67e278aca
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizationItemsManager.kt
@@ -0,0 +1,35 @@
+package com.tangem.tangemtest.ucase.domain.paramsManager.managers
+
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.OnLifecycleEvent
+import com.tangem.CardManager
+import com.tangem.tangemtest.commons.Store
+import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction
+import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
+import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter
+import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
+
+/**
+[REDACTED_AUTHOR]
+ */
+class PersonalizationItemsManager(
+ private val store: Store
+) : BaseItemsManager(PersonalizeAction()) {
+
+ private val converter = PersonalizationConfigConverter()
+
+ init {
+ val config = store.restore()
+ setItems(converter.convert(config))
+ }
+
+ override fun invokeMainAction(cardManager: CardManager, callback: ActionCallback) {
+ action.executeMainAction(this, getAttrsForAction(cardManager), callback)
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ fun onDestroy() {
+ val config = converter.convert(itemList, PersonalizationConfig())
+ store.save(config)
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt
index a23e009c8c..e69de29bb2 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/PersonalizeItemsManager.kt
@@ -1,17 +0,0 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.managers
-
-import com.tangem.TangemSdk
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-
-/**
-[REDACTED_AUTHOR]
- */
-class PersonalizeItemsManager : BaseItemsManager(PersonalizeAction()) {
- override fun createItemsList(): List
- = listOf()
-
- override fun invokeMainAction(tangemSdk: TangemSdk, callback: ActionCallback) {
- action.executeMainAction(this, getAttrsForAction(tangemSdk), callback)
- }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanItemsManager.kt
index c3f8767717..e69de29bb2 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanItemsManager.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/ScanItemsManager.kt
@@ -1,17 +0,0 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.managers
-
-import com.tangem.TangemSdk
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest.ucase.domain.actions.ScanAction
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-
-/**
-[REDACTED_AUTHOR]
- */
-class ScanItemsManager : BaseItemsManager(ScanAction()) {
- override fun createItemsList(): List
- = listOf()
-
- override fun invokeMainAction(tangemSdk: TangemSdk, callback: ActionCallback) {
- action.executeMainAction(this, getAttrsForAction(tangemSdk), callback)
- }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignItemsManager.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignItemsManager.kt
index 91b6b5ba01..e69de29bb2 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignItemsManager.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SignItemsManager.kt
@@ -1,34 +0,0 @@
-package com.tangem.tangemtest.ucase.domain.paramsManager.managers
-
-import com.tangem.TangemSdk
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.impl.EditTextItem
-import com.tangem.tangemtest.ucase.domain.actions.SignAction
-import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
-import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
-import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.SignScanConsequence
-import com.tangem.tangemtest.ucase.variants.TlvId
-
-/**
-[REDACTED_AUTHOR]
- */
-class SignItemsManager : BaseItemsManager(SignAction()) {
-
- override val consequence: ItemsChangeConsequence? by lazy { SignScanConsequence() }
-
- override fun createItemsList(): List
- {
- return listOf(
- EditTextItem(TlvId.CardId, null),
- EditTextItem(TlvId.TransactionOutHash, "Data used for hashing")
- )
- }
-
- override fun invokeMainAction(tangemSdk: TangemSdk, callback: ActionCallback) {
- action.executeMainAction(this, getAttrsForAction(tangemSdk), callback)
- }
-
- override fun getActionByTag(id: Id, tangemSdk: TangemSdk): ((ActionCallback) -> Unit)? {
- return action.getActionByTag(this, id, getAttrsForAction(tangemSdk))
- }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt
new file mode 100644
index 0000000000..c892b6761b
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/managers/SimpleManagers.kt
@@ -0,0 +1,31 @@
+package com.tangem.tangemtest.ucase.domain.paramsManager.managers
+
+import com.tangem.tangemtest._arch.structure.impl.EditTextItem
+import com.tangem.tangemtest.ucase.domain.actions.DepersonalizeAction
+import com.tangem.tangemtest.ucase.domain.actions.ScanAction
+import com.tangem.tangemtest.ucase.domain.actions.SignAction
+import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.SignScanConsequence
+import com.tangem.tangemtest.ucase.variants.TlvId
+
+/**
+[REDACTED_AUTHOR]
+ */
+class ScanItemsManager : BaseItemsManager(ScanAction())
+
+class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) {
+
+ init {
+ setItems(listOf(EditTextItem(TlvId.CardId, null)))
+ }
+}
+
+class SignItemsManager : BaseItemsManager(SignAction()) {
+
+ init {
+ setItemChangeConsequences(SignScanConsequence())
+ setItems(listOf(
+ EditTextItem(TlvId.CardId, null),
+ EditTextItem(TlvId.TransactionOutHash, "Data used for hashing")
+ ))
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt
index 60464e4bb0..f63694fcc7 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/afterAction/AfterScanModifier.kt
@@ -5,7 +5,7 @@ import com.tangem.commands.CardStatus
import com.tangem.common.CompletionResult
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.findDataItem
+import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
import com.tangem.tangemtest.ucase.tunnel.ActionView
import com.tangem.tangemtest.ucase.tunnel.CardError
@@ -18,18 +18,18 @@ import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI
*/
class AfterScanModifier : AfterActionModification {
override fun modify(payload: PayloadHolder, commandResult: CompletionResult<*>, itemList: List
- ): List
- {
- val foundItem = itemList.findDataItem(TlvId.CardId) ?: return listOf()
+ val foundItem = itemList.findItem(TlvId.CardId) ?: return listOf()
val card = smartCast(commandResult) ?: return listOf()
val actionView = payload.get(PayloadKey.actionView) as? ActionView ?: return listOf()
return if (isNotPersonalized(card)) {
actionView.showSnackbar(CardError.NotPersonalized)
- postUI { actionView.showActionFab(false) }
+ postUI { actionView.enableActionFab(false) }
listOf()
} else {
payload.set(PayloadKey.card, card)
foundItem.setData(card.cardId)
- postUI { actionView.showActionFab(true) }
+ postUI { actionView.enableActionFab(true) }
listOf(foundItem)
}
}
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
index 2957d43a45..730c570be6 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/paramsManager/triggers/changeConsequence/ParamChangeConsequence.kt
@@ -6,7 +6,7 @@ import com.tangem.common.extensions.calculateSha256
import com.tangem.common.extensions.calculateSha512
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.findDataItem
+import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
import com.tangem.tangemtest.ucase.tunnel.ActionView
import com.tangem.tangemtest.ucase.variants.TlvId
@@ -22,20 +22,20 @@ interface ItemsChangeConsequence {
fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List
- ): List
- ?
}
-class SignScanConsequence: ItemsChangeConsequence {
+class SignScanConsequence : ItemsChangeConsequence {
override fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List
- ): List
- ? {
if (changedItem.id != TlvId.CardId) return null
- val hashItem = itemList.findDataItem(TlvId.TransactionOutHash) ?: return null
+ val hashItem = itemList.findItem(TlvId.TransactionOutHash) ?: return null
val affectedItems = mutableListOf(hashItem)
val card = payload.remove(PayloadKey.card) as Card?
if (card == null) {
hashItem.restoreDefaultData()
- postUI { (payload.get(PayloadKey.actionView) as? ActionView)?.showActionFab(false) }
+ postUI { (payload.get(PayloadKey.actionView) as? ActionView)?.enableActionFab(false) }
} else {
val dataForHashing = hashItem.getData() as? String ?: "Any data mother...s"
- val hashedData = when(card.curve) {
+ val hashedData = when (card.curve) {
EllipticCurve.Secp256k1 -> dataForHashing.calculateSha256()
EllipticCurve.Ed25519 -> dataForHashing.calculateSha512()
else -> return null
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/ResponseJsonConverter.kt
similarity index 87%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/ResponseJsonConverter.kt
index 32c93a7ff8..84695d90fb 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/GsonInitializer.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/domain/responses/ResponseJsonConverter.kt
@@ -6,6 +6,7 @@ import com.tangem.commands.Settings
import com.tangem.commands.SettingsMask
import com.tangem.commands.SigningMethod
import com.tangem.common.extensions.toHexString
+import com.tangem.tasks.TaskEvent
import java.lang.reflect.Type
import java.text.DateFormat
import java.util.*
@@ -13,7 +14,7 @@ import java.util.*
/**
[REDACTED_AUTHOR]
*/
-class GsonInitializer {
+class ResponseJsonConverter {
val gson: Gson by lazy { init() }
private fun init(): Gson {
@@ -27,6 +28,13 @@ class GsonInitializer {
builder.setPrettyPrinting()
return builder.create()
}
+
+ fun convertTaskEvent(task: TaskEvent<*>?): String = gson.toJson(task)
+
+ fun convertEvent(task: TaskEvent<*>?): String {
+ val event = task as? TaskEvent.Event ?: ""
+ return gson.toJson(event)
+ }
}
class ByteTypeAdapter : JsonSerializer {
@@ -57,7 +65,7 @@ class SigningMethodTypeAdapter : JsonSerializer {
}
}
-class DateTypeAdapter: JsonSerializer {
+class DateTypeAdapter : JsonSerializer {
override fun serialize(src: Date, typeOfSrc: Type, context: JsonSerializationContext): JsonElement {
val formatter = DateFormat.getDateInstance(DateFormat.DEFAULT, Locale("en_US"))
return JsonPrimitive(formatter.format(src).toString())
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt
index 90b908b742..86c7454365 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/MainResourceHolder.kt
@@ -1,9 +1,13 @@
package com.tangem.tangemtest.ucase.resources
+import com.tangem.tangemtest.AppTangemDemo
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.StringResId
import com.tangem.tangemtest.ucase.resources.initializers.ActionResources
-import com.tangem.tangemtest.ucase.resources.initializers.PersonalizeResources
+import com.tangem.tangemtest.ucase.resources.initializers.PersonalizationResources
+import com.tangem.tangemtest.ucase.resources.initializers.ResponseResources
import com.tangem.tangemtest.ucase.resources.initializers.TlvResources
import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
@@ -14,13 +18,31 @@ open class ResourceHolder : BaseTypedHolder()
object MainResourceHolder : ResourceHolder() {
init {
- PersonalizeResources().init(this)
+ PersonalizationResources().init(this)
ActionResources().init(this)
TlvResources().init(this)
+ ResponseResources().init(this)
+ }
+
+ override fun get(type: Id): Resources? {
+ return when(type) {
+ is StringId -> getResourcesFromName(type.value)
+ is StringResId -> Resources(type.value)
+ else -> super.get(type)
+ }
+ }
+
+ private fun getResourcesFromName(resName: String): Resources? {
+ val context = AppTangemDemo.appInstance.applicationContext
+ val resNameId = context.resources.getIdentifier(resName, "string", context.packageName)
+ val resInfoId = context.resources.getIdentifier("info_$resName", "string", context.packageName)
+ if (resNameId == 0) return null
+
+ return Resources(resNameId, if (resInfoId == 0) null else resInfoId)
}
inline fun safeGet(id: Id): Res {
val result = super.get(id) ?: Resources(R.string.unknown, R.string.unknown)
return result as Res
}
-}
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt
similarity index 99%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt
index fe56561030..a45bc55ed4 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizeResources.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/PersonalizationResources.kt
@@ -10,7 +10,7 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.common.TypedHolder
/**
[REDACTED_AUTHOR]
*/
-class PersonalizeResources() {
+class PersonalizationResources() {
fun init(holder: ResourceHolder) {
initBlock(holder)
initCardNumber(holder)
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt
new file mode 100644
index 0000000000..a9ad0a3d69
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/resources/initializers/ResponseResources.kt
@@ -0,0 +1,53 @@
+package com.tangem.tangemtest.ucase.resources.initializers
+
+import com.tangem.tangemtest.R
+import com.tangem.tangemtest.ucase.resources.MainResourceHolder
+import com.tangem.tangemtest.ucase.resources.Resources
+import com.tangem.tangemtest.ucase.variants.responses.CardDataId
+import com.tangem.tangemtest.ucase.variants.responses.CardId
+
+/**
+[REDACTED_AUTHOR]
+ */
+class ResponseResources {
+ fun init(holder: MainResourceHolder) {
+ initCard(holder)
+ initCardData(holder)
+ }
+
+ private fun initCard(holder: MainResourceHolder) {
+ holder.register(CardId.cardId, Resources(R.string.response_card_cid, R.string.info_response_card_cid))
+ holder.register(CardId.manufacturerName, Resources(R.string.response_card_manufacturer_name, R.string.info_response_card_manufacturer_name))
+ holder.register(CardId.status, Resources(R.string.response_card_status, R.string.info_response_card_status))
+ holder.register(CardId.firmwareVersion, Resources(R.string.response_card_firmware_version, R.string.info_response_card_firmware_version))
+ holder.register(CardId.cardPublicKey, Resources(R.string.response_card_public_key, R.string.info_response_card_public_key))
+ holder.register(CardId.settingsMask, Resources(R.string.response_card_settings_mask, R.string.info_response_card_settings_mask))
+ holder.register(CardId.cardData, Resources(R.string.response_card_card_data, R.string.info_response_card_card_data))
+ holder.register(CardId.issuerPublicKey, Resources(R.string.response_card_issuer_data_public_key, R.string.info_response_card_issuer_data_public_key))
+ holder.register(CardId.curve, Resources(R.string.response_card_curve, R.string.info_response_card_curve))
+ holder.register(CardId.maxSignatures, Resources(R.string.response_card_max_signatures, R.string.info_response_card_max_signatures))
+ holder.register(CardId.signingMethod, Resources(R.string.response_card_signing_method, R.string.response_card_signing_method))
+ holder.register(CardId.pauseBeforePin2, Resources(R.string.response_card_pause_before_pin2, R.string.info_response_card_allow_pin2))
+ holder.register(CardId.walletPublicKey, Resources(R.string.response_card_wallet_public_key, R.string.info_response_card_wallet_public_key))
+ holder.register(CardId.walletRemainingSignatures, Resources(R.string.response_card_wallet_remaining_signatures, R.string.info_response_card_wallet_remaining_signatures))
+ holder.register(CardId.walletSignedHashes, Resources(R.string.response_card_wallet_signed_hashes, R.string.info_response_card_wallet_signed_hashes))
+ holder.register(CardId.health, Resources(R.string.response_card_health, R.string.info_response_card_health))
+ holder.register(CardId.isActivated, Resources(R.string.response_card_is_activated, R.string.info_response_card_is_activated))
+ holder.register(CardId.activationSeed, Resources(R.string.response_card_activation_seed, R.string.info_response_card_activation_seed))
+ holder.register(CardId.paymentFlowVersion, Resources(R.string.response_card_payment_flow_version, R.string.info_response_card_payment_flow_version))
+ holder.register(CardId.userCounter, Resources(R.string.response_card_user_counter, R.string.info_response_card_user_counter))
+ holder.register(CardId.userProtectedCounter, Resources(R.string.response_card_user_protected_counter, R.string.info_response_card_user_protected_counter))
+ }
+
+ private fun initCardData(holder: MainResourceHolder) {
+ holder.register(CardDataId.batchId, Resources(R.string.response_card_card_data_batch_id, R.string.info_response_card_card_data_batch_id))
+ holder.register(CardDataId.manufactureDateTime, Resources(R.string.response_card_card_data_manufacture_date_time, R.string.info_response_card_card_data_manufacture_date_time))
+ holder.register(CardDataId.issuerName, Resources(R.string.response_card_card_data_issuer_name, R.string.info_response_card_card_data_issuer_name))
+ holder.register(CardDataId.blockchainName, Resources(R.string.response_card_card_data_blockchain_name, R.string.info_response_card_card_data_blockchain_name))
+ holder.register(CardDataId.manufacturerSignature, Resources(R.string.response_card_card_data_manufacturer_signature, R.string.info_response_card_card_data_manufacturer_signature))
+ holder.register(CardDataId.productMask, Resources(R.string.response_card_card_data_product_mask, R.string.info_response_card_card_data_product_mask))
+ holder.register(CardDataId.tokenSymbol, Resources(R.string.response_card_card_data_token_symbol, R.string.info_response_card_card_data_token_symbol))
+ holder.register(CardDataId.tokenContractAddress, Resources(R.string.response_card_card_data_token_contract_address, R.string.info_response_card_card_data_token_contract_address))
+ holder.register(CardDataId.tokenDecimal, Resources(R.string.response_card_card_data_token_decimal, R.string.info_response_card_card_data_token_decimal))
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt
index 7b7cb530f7..8ae2a5370a 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/Errors.kt
@@ -5,13 +5,13 @@ import com.tangem.tangemtest._arch.structure.Id
/**
[REDACTED_AUTHOR]
*/
-interface Errors: Id
+interface Errors : Id
enum class CardError : Errors {
NotPersonalized,
}
-enum class ItemError: Errors {
+enum class ItemError : Errors {
BadSeries,
BadCardNumber,
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt
index ec84ed97ba..53ab0b4883 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/tunnel/ViewScreen.kt
@@ -1,15 +1,16 @@
package com.tangem.tangemtest.ucase.tunnel
+import com.google.android.material.snackbar.Snackbar
import com.tangem.tangemtest._arch.structure.Id
+interface SnackbarHolder {
+ fun showSnackbar(message: String, length: Int = Snackbar.LENGTH_SHORT)
+ fun showSnackbar(id: Int, length: Int = Snackbar.LENGTH_SHORT)
+}
+
interface ViewScreen
-interface SnackbarHolder {
- fun showSnackbar(message: String)
- fun showSnackbar(id: Int)
- fun showSnackbar(id: Id)
-}
-
interface ActionView : ViewScreen, SnackbarHolder {
- fun showActionFab(show: Boolean)
+ fun enableActionFab(enable: Boolean)
+ fun showSnackbar(id: Id, additionalHandler: ((Id) -> Int)? = null)
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt
similarity index 74%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt
index 84c3ed915d..d8bf8829d0 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ParamsViewModel.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/ActionViewModel.kt
@@ -1,5 +1,6 @@
package com.tangem.tangemtest.ucase.ui
+import android.view.View
import androidx.annotation.UiThread
import androidx.lifecycle.*
import com.google.gson.Gson
@@ -12,9 +13,10 @@ import com.tangem.tangemtest._arch.SingleLiveEvent
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.Payload
import com.tangem.tangemtest._arch.structure.abstraction.Item
+import com.tangem.tangemtest._arch.structure.abstraction.iterate
import com.tangem.tangemtest.commons.performAction
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.responses.GsonInitializer
+import com.tangem.tangemtest.ucase.domain.responses.ResponseJsonConverter
import com.tangem.tangemtest.ucase.tunnel.ViewScreen
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
@@ -22,17 +24,16 @@ import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
[REDACTED_AUTHOR]
*/
class ActionViewModelFactory(private val manager: ItemsManager) : ViewModelProvider.NewInstanceFactory() {
- override fun create(modelClass: Class): T = ParamsViewModel(manager) as T
+ override fun create(modelClass: Class): T = ActionViewModel(manager) as T
}
-class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), LifecycleObserver {
+class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), LifecycleObserver {
- val ldCard = MutableLiveData()
- val ldIsVerified = MutableLiveData()
- val ldResponse = MutableLiveData()
- val ldReadResponse = MutableLiveData()
- val ldParams = MutableLiveData(itemsManager.getItems())
+ val seResponseEvent = SingleLiveEvent>()
+ val seReadResponse = SingleLiveEvent()
+ val seResponse = SingleLiveEvent()
+ val ldItemList = MutableLiveData(itemsManager.getItems())
val seError: MutableLiveData = SingleLiveEvent()
val seChangedItems: MutableLiveData
> = SingleLiveEvent()
@@ -43,6 +44,7 @@ class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif
this.tangemSdk = tangemSdk
}
+ @Deprecated("Events must be send directly from the Widget")
fun userChangedItem(id: Id, value: Any?) {
itemChanged(id, value)
}
@@ -53,11 +55,11 @@ class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif
//invokes Scan, Sign etc...
fun invokeMainAction() {
- performAction(itemsManager, tangemSdk) { paramsManager, cardManager ->
- paramsManager.invokeMainAction(cardManager) { response, listOfChangedParams ->
+ performAction(itemsManager, tangemSdk) { paramsManager, tangemSdk ->
+ paramsManager.invokeMainAction(tangemSdk) { response, listOfChangedParams ->
notifier.handleActionResult(response, listOfChangedParams)
}
- }
+ })
}
fun getItemAction(id: Id): (() -> Unit)? {
@@ -70,6 +72,12 @@ class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif
}
}
+ fun toggleDescriptionVisibility(state: Boolean) {
+ ldItemList.value?.iterate {
+ it.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE
+ }
+ }
+
fun attachToPayload(payload: Payload) {
itemsManager.attachPayload(payload)
}
@@ -82,10 +90,10 @@ class ParamsViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif
}
}
-internal class Notifier(private val vm: ParamsViewModel) {
+internal class Notifier(private val vm: ActionViewModel) {
private var notShowedError: SessionError? = null
- private val gson: Gson = GsonInitializer().gson
+ private val gson: Gson = ResponseJsonConverter().gson
fun handleActionResult(response: CompletionResult<*>, list: List- ) {
if (list.isNotEmpty()) notifyItemsChanged(list)
@@ -102,7 +110,10 @@ internal class Notifier(private val vm: ParamsViewModel) {
when (commandResponse) {
is CompletionResult.Failure -> handleError(commandResponse.error)
- is CompletionResult.Success -> handleDataEvent(commandResponse.data)
+ is CompletionResult.Success -> {
+ handleDataEvent(commandResponse.data)
+ vm.seResponseEvent.postValue(commandResponse)
+ }
}
}
@@ -110,9 +121,9 @@ internal class Notifier(private val vm: ParamsViewModel) {
when (data) {
is Card -> {
vm.ldCard.postValue(data)
- vm.ldReadResponse.postValue(gson.toJson(data))
+ vm.seReadResponse.postValue(gson.toJson(data))
}
- else -> vm.ldResponse.postValue(gson.toJson(data))
+ else -> vm.seResponse.postValue(gson.toJson(data))
}
}
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt
index b18588989d..36acc2c199 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseCardActionFragment.kt
@@ -4,9 +4,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.widget.LinearLayout
-import android.widget.TextView
-import androidx.fragment.app.Fragment
+import androidx.core.view.plusAssign
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
@@ -17,134 +15,127 @@ import com.tangem.TangemSdk
import com.tangem.tangem_sdk_new.extensions.init
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
import com.tangem.tangemtest._main.MainViewModel
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManagerFactory
import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
-import com.tangem.tangemtest.ucase.resources.ActionType
import com.tangem.tangemtest.ucase.tunnel.ActionView
import com.tangem.tangemtest.ucase.tunnel.CardError
import com.tangem.tangemtest.ucase.ui.widgets.ParameterWidget
+import ru.dev.gbixahue.eu4d.lib.android._android.views.enable
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
-import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
/**
[REDACTED_AUTHOR]
*/
-abstract class BaseCardActionFragment : Fragment(), LayoutHolder, ActionView {
+abstract class BaseCardActionFragment : BaseFragment(), ActionView {
- protected val incomingParamsContainer: ViewGroup by lazy {
- mainView.findViewById(R.id.ll_incoming_params_container)
- }
- protected lateinit var mainView: View
- protected val actionFab: FloatingActionButton by lazy { mainView.findViewById(R.id.fab_action) }
+ protected lateinit var itemContainer: ViewGroup
+ protected lateinit var actionFab: FloatingActionButton
- protected val paramsVM: ParamsViewModel by viewModels { ActionViewModelFactory(itemsManager) }
- protected val widgetList = mutableListOf()
+ protected abstract val itemsManager: ItemsManager
+ protected val mainActivityVM by activityViewModels()
+ protected val actionVM: ActionViewModel by viewModels { ActionViewModelFactory(itemsManager) }
+ protected val UNDEFINED = -1
- private val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(getAction())!! }
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- Log.d(this, "onCreateView")
- mainView = inflater.inflate(getLayoutId(), container, false)
- return mainView
- }
+ private val paramsWidgetList = mutableListOf()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log.d(this, "onViewCreated")
- viewLifecycleOwner.lifecycle.addObserver(paramsVM)
- paramsVM.setCardManager(TangemSdk.init(requireActivity()))
- paramsVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView))
+ bindViews()
+ viewLifecycleOwner.lifecycle.addObserver(actionVM)
+ actionVM.setCardManager(TangemSdk.init(requireActivity()))
+ actionVM.attachToPayload(mutableMapOf(PayloadKey.actionView to this as ActionView))
+
initFab()
- showActionFab(false)
createWidgets { subscribeToViewModelChanges() }
}
- private fun initFab() {
- Log.d(this, "initFab")
- actionFab.setOnClickListener { paramsVM.invokeMainAction() }
+ protected open fun bindViews() {
+ itemContainer = mainView.findViewById(R.id.ll_container)
+ actionFab = mainView.findViewById(R.id.fab_action)
}
- private fun createWidgets(widgetCreatedCallback: () -> Unit) {
+ protected open fun initFab() {
+ enableActionFab(false)
+ actionFab.setOnClickListener { actionVM.invokeMainAction() }
+ }
+
+ protected open fun createWidgets(widgetCreatedCallback: () -> Unit) {
Log.d(this, "createWidgets")
- paramsVM.ldParams.observe(viewLifecycleOwner, Observer { itemList ->
+ actionVM.ldItemList.observe(viewLifecycleOwner, Observer { itemList ->
itemList.forEach { param ->
- val widget = ParameterWidget(inflateParamView(incomingParamsContainer), param)
- widget.onValueChanged = { id, value -> paramsVM.userChangedItem(id, value) }
- widget.onActionBtnClickListener = paramsVM.getItemAction(param.id)
- widgetList.add(widget)
+ val widget = ParameterWidget(inflateParamView(itemContainer), param)
+ widget.onValueChanged = { id, value -> actionVM.userChangedItem(id, value) }
+ widget.onActionBtnClickListener = actionVM.getItemAction(param.id)
+ paramsWidgetList.add(widget)
}
widgetCreatedCallback()
})
}
- private fun subscribeToViewModelChanges() {
+ protected open fun subscribeToViewModelChanges() {
Log.d(this, "subscribeToViewModelChanges")
+ listenEvent()
+ listenReadResponse()
listenResponse()
listenError()
listenChangedItems()
listenDescriptionSwitchChanges()
}
+ protected open fun listenEvent() {
+ actionVM.seResponseEvent.observe(viewLifecycleOwner, Observer {
+ mainActivityVM.changeResponseEvent(it)
+ })
+ }
+
+ protected open fun listenReadResponse() {}
+
protected open fun listenResponse() {
- val tvResponse by lazy { mainView.findViewById(R.id.tv_action_response_json) }
- paramsVM.ldResponse.observe(viewLifecycleOwner, Observer {
- Log.d(this, "action response: ${if (it.length > 50) it.substring(0..50) else it}")
- tvResponse.text = it
+ actionVM.seResponse.observe(viewLifecycleOwner, Observer {
+ navigateTo(R.id.action_nav_card_action_to_response_screen)
})
}
protected open fun listenError() {
- paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbar(it) })
+ actionVM.seError.observe(viewLifecycleOwner, Observer { showSnackbar(it) })
}
+ @Deprecated("Start to use itemViewModel")
protected open fun listenChangedItems() {
- paramsVM.seChangedItems.observe(viewLifecycleOwner, Observer { itemList ->
+ actionVM.seChangedItems.observe(viewLifecycleOwner, Observer { itemList ->
itemList.forEach { item ->
- Log.d(this, "item changed from VM - name: ${item.id}")
- val dataItem = item as? BaseItem ?: return@Observer
- Log.d(this, "item changed from VM - name: ${dataItem.id}, value:${dataItem.viewModel.data}")
- widgetList.firstOrNull { it.id == item.id }?.changeParamValue(item.viewModel.data)
+ Log.d(this, "item changed from VM - name: ${item.id}, value:${item.viewModel.data}")
+ paramsWidgetList.firstOrNull { it.id == item.id }?.changeParamValue(item.viewModel.data)
}
})
}
protected open fun listenDescriptionSwitchChanges() {
- val mainActViewModel by activityViewModels()
- mainActViewModel.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer { isEnabled ->
- widgetList.forEach { it.toggleDescriptionVisibility(isEnabled) }
+ mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer {
+ actionVM.toggleDescriptionVisibility(it)
})
}
private fun inflateParamView(where: ViewGroup): ViewGroup {
val inflater = LayoutInflater.from(where.context)
val view = inflater.inflate(R.layout.w_card_incoming_param, where, false)
- where.addView(view)
+ where.plusAssign(view)
return view as ViewGroup
}
- override fun showActionFab(show: Boolean) {
- if (show) actionFab.show() else actionFab.hide()
+ override fun enableActionFab(enable: Boolean) {
+ actionFab.enable(enable)
}
- override fun showSnackbar(id: Id) {
-// MainResourceHolder.safeGet<>()
- when (id) {
- CardError.NotPersonalized -> showSnackbar(R.string.card_error_not_personalized)
- else -> showSnackbar(requireContext().getString(R.string.unknown))
+ override fun showSnackbar(id: Id, additionalHandler: ((Id) -> Int)?) {
+ val resourceId = when (id) {
+ CardError.NotPersonalized -> R.string.card_error_not_personalized
+ else -> additionalHandler?.invoke(id) ?: UNDEFINED
}
- }
- override fun showSnackbar(id: Int) {
- showSnackbar(requireContext().getString(id))
+ if (resourceId != UNDEFINED) showSnackbar(resourceId)
}
-
- override fun showSnackbar(message: String) {
- Snackbar.make(mainView, message, BaseTransientBottomBar.LENGTH_SHORT).show()
- }
-
- abstract fun getAction(): ActionType
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt
new file mode 100644
index 0000000000..29dfeec6be
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/BaseFragment.kt
@@ -0,0 +1,38 @@
+package com.tangem.tangemtest.ucase.ui
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.navigation.NavOptions
+import androidx.navigation.fragment.NavHostFragment.findNavController
+import com.google.android.material.snackbar.Snackbar
+import com.tangem.tangemtest.ucase.getDefaultNavigationOptions
+import com.tangem.tangemtest.ucase.tunnel.SnackbarHolder
+import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
+
+/**
+[REDACTED_AUTHOR]
+ */
+abstract class BaseFragment : Fragment(), LayoutHolder, SnackbarHolder {
+
+ protected lateinit var mainView: View
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ mainView = inflater.inflate(getLayoutId(), container, false)
+ return mainView
+ }
+
+ protected fun navigateTo(navigationId: Int, bundle: Bundle? = null, options: NavOptions? = getDefaultNavigationOptions()) {
+ findNavController(this).navigate(navigationId, bundle, options)
+ }
+
+ override fun showSnackbar(id: Int, length: Int) {
+ showSnackbar(requireContext().getString(id), length)
+ }
+
+ override fun showSnackbar(message: String, length: Int) {
+ Snackbar.make(mainView, message, length).show()
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt
index 15ba1cdcba..96037984ea 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/ui/widgets/ParameterWidget.kt
@@ -12,8 +12,8 @@ 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.Id
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
import com.tangem.tangemtest._arch.structure.abstraction.Item
+import com.tangem.tangemtest._arch.structure.impl.EditTextItem
import com.tangem.tangemtest.ucase.resources.ActionType
import com.tangem.tangemtest.ucase.resources.MainResourceHolder
import com.tangem.tangemtest.ucase.resources.Resources
@@ -29,7 +29,7 @@ class ParameterWidget(
) {
val id: Id = item.id
- val dataItem: BaseItem = item as BaseItem
+ val typedItem = item as EditTextItem
var onValueChanged: ((Id, Any?) -> Unit)? = null
var onActionBtnClickListener: (() -> Unit)? = null
@@ -47,11 +47,11 @@ class ParameterWidget(
private val tvDescription: TextView? by lazy { descriptionContainer.findViewById(R.id.tv_description) }
private var actionBtnVisibilityState: Int = btnAction.visibility
- private var value: Any? = dataItem.viewModel.data
+ private var value: Any? = typedItem.viewModel.data
init {
tilValue.hint = tilValue.context.getString(getResNameId())
- etValue.setText(stringOf(dataItem.viewModel.data))
+ etValue.setText(stringOf(typedItem.viewModel.data))
etValue.addTextChangedListener(valueWatcher)
btnAction.setOnClickListener { onActionBtnClickListener?.invoke() }
btnAction.setText(getResNameId(ActionType.Scan))
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt
index 6567e465b1..e2ae9cdbdd 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/depersonalize/ui/DepersonalizeActionFragment.kt
@@ -1,7 +1,8 @@
package com.tangem.tangemtest.ucase.variants.depersonalize.ui
import com.tangem.tangemtest.R
-import com.tangem.tangemtest.ucase.resources.ActionType
+import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
+import com.tangem.tangemtest.ucase.domain.paramsManager.managers.DepersonalizeItemsManager
import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
/**
@@ -9,8 +10,7 @@ import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
*/
class DepersonalizeActionFragment : BaseCardActionFragment() {
+ override val itemsManager: ItemsManager by lazy { DepersonalizeItemsManager() }
+
override fun getLayoutId(): Int = R.layout.fg_depersonalize
-
- override fun getAction(): ActionType = ActionType.Depersonalize
-
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt
index b8573bbdf5..6305b68975 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/Ids.kt
@@ -6,11 +6,9 @@ import com.tangem.tangemtest._arch.structure.Id
[REDACTED_AUTHOR]
*/
-interface PersonalizeId : Id
+interface PersonalizationId : Id
-interface BlockItem : PersonalizeId
-
-enum class BlockId : PersonalizeId {
+enum class BlockId : PersonalizationId {
CardNumber,
Common,
SigningMethod,
@@ -24,13 +22,13 @@ enum class BlockId : PersonalizeId {
Pins,
}
-enum class CardNumber : BlockItem {
+enum class CardNumber : PersonalizationId {
Series,
Number,
BatchId,
}
-enum class Common : BlockItem {
+enum class Common : PersonalizationId {
Curve,
Blockchain,
BlockchainCustom,
@@ -38,7 +36,7 @@ enum class Common : BlockItem {
CreateWallet,
}
-enum class SigningMethod : BlockItem {
+enum class SigningMethod : PersonalizationId {
SignTx,
SignTxRaw,
SignValidatedTx,
@@ -48,7 +46,7 @@ enum class SigningMethod : BlockItem {
SignExternal,
}
-enum class SignHashExProp : BlockItem {
+enum class SignHashExProp : PersonalizationId {
PinLessFloorLimit,
CryptoExKey,
RequireTerminalCertSig,
@@ -56,26 +54,26 @@ enum class SignHashExProp : BlockItem {
CheckPin3,
}
-enum class Denomination : BlockItem {
+enum class Denomination : PersonalizationId {
WriteOnPersonalize,
Denomination,
}
-enum class Token : BlockItem {
+enum class Token : PersonalizationId {
ItsToken,
Symbol,
ContractAddress,
Decimal
}
-enum class ProductMask : BlockItem {
+enum class ProductMask : PersonalizationId {
Note,
Tag,
IdCard,
IdIssuerCard
}
-enum class SettingsMask : BlockItem {
+enum class SettingsMask : PersonalizationId {
IsReusable,
NeedActivation,
ForbidPurge,
@@ -94,12 +92,12 @@ enum class SettingsMask : BlockItem {
RestrictOverwriteExtraIssuerData,
}
-enum class SettingsMaskProtocolEnc : BlockItem {
+enum class SettingsMaskProtocolEnc : PersonalizationId {
AllowUnencrypted,
AllowStaticEncryption
}
-enum class SettingsMaskNdef : BlockItem {
+enum class SettingsMaskNdef : PersonalizationId {
UseNdef,
DynamicNdef,
DisablePrecomputedNdef,
@@ -108,7 +106,7 @@ enum class SettingsMaskNdef : BlockItem {
Uri,
}
-enum class Pins : BlockItem {
+enum class Pins : PersonalizationId {
Pin,
Pin2,
Pin3,
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt
new file mode 100644
index 0000000000..77a68278f8
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/PersonalizationConfigStore.kt
@@ -0,0 +1,26 @@
+package com.tangem.tangemtest.ucase.variants.personalize
+
+import android.content.Context
+import android.content.SharedPreferences
+import androidx.core.content.edit
+import com.google.gson.Gson
+import com.tangem.tangemtest.AppTangemDemo
+import com.tangem.tangemtest.commons.Store
+import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
+
+class PersonalizationConfigStore(context: Context) : Store {
+
+ private val key = "personalization_config"
+
+ private val sp: SharedPreferences = (context.applicationContext as AppTangemDemo).sharedPreferences()
+ private val gson: Gson = Gson()
+
+ override fun save(config: PersonalizationConfig) {
+ sp.edit(true) { putString(key, gson.toJson(config)) }
+ }
+
+ override fun restore(): PersonalizationConfig {
+ val json = sp.getString(key, gson.toJson(PersonalizationConfig()))
+ return gson.fromJson(json, PersonalizationConfig::class.java)
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt
index 54ad12d4ab..37364a0f8a 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/DefaultValues.kt
@@ -2,18 +2,18 @@ package com.tangem.tangemtest.ucase.variants.personalize.converter
import com.tangem.commands.EllipticCurve
import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.impl.KeyValue
+import com.tangem.tangemtest._arch.structure.abstraction.KeyValue
import com.tangem.tangemtest.ucase.variants.personalize.*
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig
+import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
/**
[REDACTED_AUTHOR]
*/
-class PersonalizeConfigValuesHolder : BaseTypedHolder() {
+class ConfigValuesHolder : BaseTypedHolder() {
// All registered association values can't be objects
- fun init(default: PersonalizeConfig) {
+ fun init(default: PersonalizationConfig) {
register(CardNumber.Series, Value(default.series))
register(CardNumber.Number, Value(default.startNumber))
register(CardNumber.BatchId, Value(default.batchId))
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemTypes.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ItemTypes.kt
similarity index 99%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemTypes.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ItemTypes.kt
index 9902d38da4..238a0aeaa0 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemTypes.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/ItemTypes.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo
+package com.tangem.tangemtest.ucase.variants.personalize.converter
import com.tangem.tangemtest.ucase.variants.personalize.*
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
new file mode 100644
index 0000000000..cd0c912920
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt
@@ -0,0 +1,303 @@
+package com.tangem.tangemtest.ucase.variants.personalize.converter
+
+import com.tangem.tangemtest._arch.structure.Additional
+import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.tangemtest._arch.structure.abstraction.*
+import com.tangem.tangemtest._arch.structure.impl.*
+import com.tangem.tangemtest.ucase.variants.personalize.*
+import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
+import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
+
+/**
+[REDACTED_AUTHOR]
+ */
+class PersonalizationConfigConverter : ModelConverter {
+
+ private val toModel: ItemsToModel = ItemsToPersonalizationConfig()
+ private val toItems: ModelToItems = PersonalizationConfigToItems()
+
+ override fun convert(from: List
- , default: PersonalizationConfig): PersonalizationConfig {
+ return toModel.convert(from, default)
+ }
+
+ override fun convert(from: PersonalizationConfig): List
- {
+ return toItems.convert(from)
+ }
+}
+
+class ItemsToPersonalizationConfig : ItemsToModel {
+ protected val valuesHolder = ConfigValuesHolder()
+
+ override fun convert(from: List
- , default: PersonalizationConfig): PersonalizationConfig {
+ valuesHolder.init(default)
+ mapListItems(from)
+ return createModel()
+ }
+
+ private fun mapListItems(itemList: List
- ) {
+ itemList.iterate { item -> mapItemToHolder(item) }
+ }
+
+ private fun mapItemToHolder(item: Item) {
+ when (item) {
+ is ItemGroup -> mapListItems(item.itemList)
+ is BaseItem -> {
+ val defValue = valuesHolder.get(item.id) ?: return
+ defValue.set(item.viewModel.data)
+ }
+ }
+ }
+
+ private fun createModel(): PersonalizationConfig {
+ val export = PersonalizationConfig()
+ export.series = getTyped(CardNumber.Series)
+ export.startNumber = getTyped(CardNumber.Number)
+ export.curveID = getTyped(Common.Curve)
+ export.blockchain = getTyped(Common.Blockchain)
+ export.blockchainCustom = getTyped(Common.BlockchainCustom)
+ export.MaxSignatures = getTyped(Common.MaxSignatures)
+ export.createWallet = getTyped(Common.CreateWallet)
+ export.SigningMethod0 = getTyped(SigningMethod.SignTx)
+ export.SigningMethod1 = getTyped(SigningMethod.SignTxRaw)
+ export.SigningMethod2 = getTyped(SigningMethod.SignValidatedTx)
+ export.SigningMethod3 = getTyped(SigningMethod.SignValidatedTxRaw)
+ export.SigningMethod4 = getTyped(SigningMethod.SignValidatedTxIssuer)
+ export.SigningMethod5 = getTyped(SigningMethod.SignValidatedTxRawIssuer)
+ export.SigningMethod6 = getTyped(SigningMethod.SignExternal)
+ export.pinLessFloorLimit = getTyped(SignHashExProp.PinLessFloorLimit)
+ export.hexCrExKey = getTyped(SignHashExProp.CryptoExKey)
+ export.requireTerminalCertSignature = getTyped(SignHashExProp.RequireTerminalCertSig)
+ export.requireTerminalTxSignature = getTyped(SignHashExProp.RequireTerminalTxSig)
+ export.checkPIN3onCard = getTyped(SignHashExProp.CheckPin3)
+ export.writeOnPersonalization = getTyped(Denomination.WriteOnPersonalize)
+ export.denomination = getTyped(Denomination.Denomination)
+ export.itsToken = getTyped(Token.ItsToken)
+ export.symbol = getTyped(Token.Symbol)
+ export.contractAddress = getTyped(Token.ContractAddress)
+ export.decimal = getTyped(Token.Decimal)
+ export.cardData = export.cardData.apply { this.product_note = getTyped(ProductMask.Note) }
+ export.cardData = export.cardData.apply { this.product_tag = getTyped(ProductMask.Tag) }
+ export.cardData = export.cardData.apply { this.product_id_card = getTyped(ProductMask.IdCard) }
+ export.cardData = export.cardData.apply { this.product_id_issuer = getTyped(ProductMask.IdIssuerCard) }
+ export.isReusable = getTyped(SettingsMask.IsReusable)
+ export.useActivation = getTyped(SettingsMask.NeedActivation)
+ export.forbidPurgeWallet = getTyped(SettingsMask.ForbidPurge)
+ export.allowSelectBlockchain = getTyped(SettingsMask.AllowSelectBlockchain)
+ export.useBlock = getTyped(SettingsMask.UseBlock)
+ export.oneApdu = getTyped(SettingsMask.OneApdu)
+ export.useCVC = getTyped(SettingsMask.UseCvc)
+ export.allowSwapPIN = getTyped(SettingsMask.AllowSwapPin)
+ export.allowSwapPIN2 = getTyped(SettingsMask.AllowSwapPin2)
+ export.forbidDefaultPIN = getTyped(SettingsMask.ForbidDefaultPin)
+ export.smartSecurityDelay = getTyped(SettingsMask.SmartSecurityDelay)
+ export.protectIssuerDataAgainstReplay = getTyped(SettingsMask.ProtectIssuerDataAgainstReplay)
+ export.skipSecurityDelayIfValidatedByIssuer = getTyped(SettingsMask.SkipSecurityDelayIfValidated)
+ export.skipCheckPIN2andCVCIfValidatedByIssuer = getTyped(SettingsMask.SkipPin2CvcIfValidated)
+ export.skipSecurityDelayIfValidatedByLinkedTerminal = getTyped(SettingsMask.SkipSecurityDelayOnLinkedTerminal)
+ export.restrictOverwriteIssuerDataEx = getTyped(SettingsMask.RestrictOverwriteExtraIssuerData)
+ export.protocolAllowUnencrypted = getTyped(SettingsMaskProtocolEnc.AllowUnencrypted)
+ export.protocolAllowStaticEncryption = getTyped(SettingsMaskProtocolEnc.AllowStaticEncryption)
+ export.useNDEF = getTyped(SettingsMaskNdef.UseNdef)
+ export.useDynamicNDEF = getTyped(SettingsMaskNdef.DynamicNdef)
+ export.disablePrecomputedNDEF = getTyped(SettingsMaskNdef.DisablePrecomputedNdef)
+ export.aar = getTyped(SettingsMaskNdef.Aar)
+ export.aarCustom = getTyped(SettingsMaskNdef.AarCustom)
+ export.uri = getTyped(SettingsMaskNdef.Uri)
+ export.PIN = getTyped(Pins.Pin)
+ export.PIN2 = getTyped(Pins.Pin2)
+ export.PIN3 = getTyped(Pins.Pin3)
+ export.CVC = getTyped(Pins.Cvc)
+ export.pauseBeforePIN2 = getTyped(Pins.PauseBeforePin2)
+ return export
+ }
+
+ private inline fun getTyped(id: Id): Type {
+ return getTypedBy(valuesHolder, id)!!
+ }
+
+ private inline fun getTypedBy(holder: ConfigValuesHolder, id: Id): Type? {
+ Log.d(this, "getTyped for id: $id")
+ var typedValue = holder.get(id)?.get()
+
+ typedValue = when (typedValue) {
+ is ListViewModel -> typedValue.selectedItem as Type
+ else -> typedValue as? Type ?: null
+ }
+ return typedValue
+ }
+}
+
+class PersonalizationConfigToItems : ModelToItems {
+ private val valuesHolder = ConfigValuesHolder()
+ private val itemTypes = ItemTypes()
+
+ override fun convert(from: PersonalizationConfig): List
- {
+ valuesHolder.init(from)
+ val blocList = mutableListOf
- ()
+ blocList.add(cardNumber())
+ blocList.add(common())
+ blocList.add(signingMethod())
+ blocList.add(signHashExProperties())
+ blocList.add(denomination())
+ blocList.add(token())
+ blocList.add(productMask())
+ blocList.add(settingsMask())
+ blocList.add(settingsMaskProtocolEnc())
+ blocList.add(settingsMaskNdef())
+ blocList.add(pins())
+ blocList.iterate {
+ if (itemTypes.hiddenList.contains(it.id)) {
+ it.viewModel.viewState.isHidden = true
+ }
+ }
+ return blocList
+ }
+
+ private fun cardNumber(): ItemGroup {
+ val block = createGroup(BlockId.CardNumber)
+ mutableListOf(
+ CardNumber.Series,
+ CardNumber.Number,
+ CardNumber.BatchId
+ ).forEach { createItem(block, it as Id) }
+ return block
+ }
+
+ private fun common(): ItemGroup {
+ val block = createGroup(BlockId.Common)
+ mutableListOf(
+ Common.Curve,
+ Common.Blockchain,
+ Common.BlockchainCustom,
+ Common.MaxSignatures,
+ Common.CreateWallet
+ ).forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun signingMethod(): ItemGroup {
+ val block = createGroup(BlockId.SigningMethod)
+ mutableListOf(
+ SigningMethod.SignTx,
+ SigningMethod.SignTxRaw,
+ SigningMethod.SignValidatedTx,
+ SigningMethod.SignValidatedTxRaw,
+ SigningMethod.SignValidatedTxIssuer,
+ SigningMethod.SignValidatedTxRawIssuer,
+ SigningMethod.SignExternal
+ ).forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun signHashExProperties(): ItemGroup {
+ val block = createGroup(BlockId.SignHashExProp)
+ mutableListOf(
+ SignHashExProp.PinLessFloorLimit,
+ SignHashExProp.CryptoExKey,
+ SignHashExProp.RequireTerminalCertSig,
+ SignHashExProp.RequireTerminalTxSig,
+ SignHashExProp.CheckPin3
+ ).forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun denomination(): ItemGroup {
+ val block = createGroup(BlockId.Denomination)
+ mutableListOf(
+ Denomination.WriteOnPersonalize,
+ Denomination.Denomination
+ ).forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun token(): ItemGroup {
+ val block = createGroup(BlockId.Token)
+ mutableListOf(
+ Token.ItsToken,
+ Token.Symbol,
+ Token.ContractAddress,
+ Token.Decimal
+ ).forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun productMask(): ItemGroup {
+ val block = createGroup(BlockId.ProdMask)
+ mutableListOf(
+ ProductMask.Note,
+ ProductMask.Tag,
+ ProductMask.IdCard,
+ ProductMask.IdIssuerCard
+ ).forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun settingsMask(): ItemGroup {
+ val block = createGroup(BlockId.SettingsMask)
+ mutableListOf(
+ SettingsMask.IsReusable,
+ SettingsMask.NeedActivation,
+ SettingsMask.ForbidPurge,
+ SettingsMask.AllowSelectBlockchain,
+ SettingsMask.UseBlock,
+ SettingsMask.OneApdu,
+ SettingsMask.UseCvc,
+ SettingsMask.AllowSwapPin,
+ SettingsMask.AllowSwapPin2,
+ SettingsMask.ForbidDefaultPin,
+ SettingsMask.SmartSecurityDelay,
+ SettingsMask.ProtectIssuerDataAgainstReplay,
+ SettingsMask.SkipSecurityDelayIfValidated,
+ SettingsMask.SkipPin2CvcIfValidated,
+ SettingsMask.SkipSecurityDelayOnLinkedTerminal,
+ SettingsMask.RestrictOverwriteExtraIssuerData
+ ).forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun settingsMaskProtocolEnc(): ItemGroup {
+ val block = createGroup(BlockId.SettingsMaskProtocolEnc)
+ mutableListOf(
+ SettingsMaskProtocolEnc.AllowUnencrypted,
+ SettingsMaskProtocolEnc.AllowStaticEncryption
+ ).forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun settingsMaskNdef(): ItemGroup {
+ val block = createGroup(BlockId.SettingsMaskNdef)
+ mutableListOf(
+ SettingsMaskNdef.UseNdef,
+ SettingsMaskNdef.DynamicNdef,
+ SettingsMaskNdef.DisablePrecomputedNdef,
+ SettingsMaskNdef.Aar,
+ SettingsMaskNdef.AarCustom,
+ SettingsMaskNdef.Uri
+ ).forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun pins(): ItemGroup {
+ val block = createGroup(BlockId.Pins)
+ mutableListOf(Pins.Pin, Pins.Pin2, Pins.Pin3, Pins.Cvc, Pins.PauseBeforePin2)
+ .forEach { createItem(block, it) }
+ return block
+ }
+
+ private fun createGroup(id: Id): ItemGroup {
+ return SimpleItemGroup(id).apply { addItem(TextItem(id)) }
+ }
+
+ private fun createItem(itemGroup: ItemGroup, id: Id) {
+ val holder = valuesHolder.get(id) ?: return
+ val item = when {
+ itemTypes.blockIdList.contains(id) -> TextItem(id, holder.get() as? String)
+ itemTypes.listItemList.contains(id) -> SpinnerItem(id, holder.list as List, holder.get())
+ itemTypes.boolList.contains(id) -> BoolItem(id, holder.get() as? Boolean)
+ itemTypes.editTextList.contains(id) -> EditTextItem(id, holder.get() as? String)
+ itemTypes.numberList.contains(id) -> NumberItem(id, holder.get() as? Number)
+ else -> SimpleItemGroup(Additional.UNDEFINED)
+ }
+ itemGroup.addItem(item)
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
new file mode 100644
index 0000000000..fa79df96e0
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt
@@ -0,0 +1,113 @@
+package com.tangem.tangemtest.ucase.variants.personalize.converter
+
+import com.tangem.commands.CardData
+import com.tangem.commands.EllipticCurve
+import com.tangem.commands.ProductMaskBuilder
+import com.tangem.commands.personalization.entities.CardConfig
+import com.tangem.commands.personalization.entities.NdefRecord
+import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
+import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter
+import java.util.*
+
+class PersonalizationConfigToCardConfig : Converter {
+
+ override fun convert(from: PersonalizationConfig): CardConfig {
+ val signingMethod = com.tangem.commands.SigningMethod.build(
+ signHash = from.SigningMethod0,
+ signRaw = from.SigningMethod1,
+ signHashValidatedByIssuer = from.SigningMethod2,
+ signRawValidatedByIssuer = from.SigningMethod3,
+ signHashValidatedByIssuerAndWriteIssuerData = from.SigningMethod4,
+ signRawValidatedByIssuerAndWriteIssuerData = from.SigningMethod5,
+ signPos = from.SigningMethod6
+ )
+
+ val isNote = from.cardData.product_note
+ val isTag = from.cardData.product_tag
+ val isIdCard = from.cardData.product_id_card
+ val isIdIssuer = from.cardData.product_id_issuer
+
+ val productMaskBuilder = ProductMaskBuilder()
+ if (isNote) productMaskBuilder.add(com.tangem.commands.ProductMask.note)
+ if (isTag) productMaskBuilder.add(com.tangem.commands.ProductMask.tag)
+ if (isIdCard) productMaskBuilder.add(com.tangem.commands.ProductMask.idCard)
+ if (isIdIssuer) productMaskBuilder.add(com.tangem.commands.ProductMask.idIssuer)
+ val productMask = productMaskBuilder.build()
+
+ var tokenSymbol: String? = null
+ var tokenContractAddress: String? = null
+ var tokenDecimal: Int? = null
+ if (from.itsToken) {
+ tokenSymbol = from.symbol
+ tokenContractAddress = from.contractAddress
+ tokenDecimal = from.decimal.toInt()
+ }
+
+ val blockchain = if (from.blockchain.isNotEmpty()) from.blockchain else from.blockchainCustom
+ val cardData = CardData(
+ blockchainName = blockchain,
+ batchId = from.batchId,
+ productMask = productMask,
+ tokenSymbol = tokenSymbol,
+ tokenContractAddress = tokenContractAddress,
+ tokenDecimal = tokenDecimal,
+ issuerName = null,
+ manufactureDateTime = Calendar.getInstance().time,
+ manufacturerSignature = null)
+
+
+ val ndefs = mutableListOf()
+ if (from.uri.isNotEmpty()) {
+ ndefs.add(NdefRecord(NdefRecord.Type.URI, from.uri))
+ }
+ when (from.aar) {
+ "None" -> null
+ "--- CUSTOM ---" -> NdefRecord(NdefRecord.Type.AAR, from.aarCustom)
+ else -> NdefRecord(NdefRecord.Type.AAR, from.aar)
+ }?.let { ndefs.add(it) }
+
+ return CardConfig(
+ "Tangem",
+ "Tangem Test",
+ from.series,
+ from.startNumber,
+ 1000,
+ from.PIN,
+ from.PIN2,
+ from.PIN3,
+ from.hexCrExKey,
+ from.CVC,
+ from.pauseBeforePIN2.toInt(),
+ from.smartSecurityDelay,
+ EllipticCurve.byName(from.curveID) ?: EllipticCurve.Secp256k1,
+ signingMethod,
+ from.MaxSignatures.toInt(),
+ from.isReusable,
+ from.allowSwapPIN,
+ from.allowSwapPIN2,
+ from.useActivation,
+ from.useCVC,
+ from.useNDEF,
+ from.useDynamicNDEF,
+ from.oneApdu,
+ from.useBlock,
+ from.allowSelectBlockchain,
+ from.forbidPurgeWallet,
+ from.protocolAllowUnencrypted,
+ from.protocolAllowStaticEncryption,
+ from.protectIssuerDataAgainstReplay,
+ from.forbidDefaultPIN,
+ from.disablePrecomputedNDEF,
+ from.skipSecurityDelayIfValidatedByIssuer,
+ from.skipCheckPIN2andCVCIfValidatedByIssuer,
+ from.skipSecurityDelayIfValidatedByLinkedTerminal,
+ from.restrictOverwriteIssuerDataEx,
+ from.requireTerminalTxSignature,
+ from.requireTerminalCertSignature,
+ from.checkPIN3onCard,
+ from.createWallet,
+ cardData,
+ ndefs
+ )
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizeConfigConverter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizeConfigConverter.kt
deleted file mode 100644
index 6b9b041b49..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/PersonalizeConfigConverter.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter
-
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.ItemsToModel
-import com.tangem.tangemtest._arch.structure.abstraction.ModelConverter
-import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems
-import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.ItemsToPersonalizeConfig
-import com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo.PersonalizeConfigToItem
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig
-
-/**
-[REDACTED_AUTHOR]
- */
-class PersonalizeConfigConverter : ModelConverter {
-
- private val toModel: ItemsToModel = ItemsToPersonalizeConfig()
- private val toItems: ModelToItems = PersonalizeConfigToItem()
-
- override fun convert(from: List
- , default: PersonalizeConfig): PersonalizeConfig {
- return toModel.convert(from, default)
- }
-
- override fun convert(from: PersonalizeConfig): List
- {
- return toItems.convert(from)
- }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt
deleted file mode 100644
index 6b8083ce29..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/ItemsToPersonalizeConfig.kt
+++ /dev/null
@@ -1,118 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo
-
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.structure.abstraction.Block
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.ItemsToModel
-import com.tangem.tangemtest._arch.structure.impl.KeyValue
-import com.tangem.tangemtest._arch.structure.impl.ListValueWrapper
-import com.tangem.tangemtest.ucase.variants.personalize.*
-import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigValuesHolder
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig
-import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
-
-/**
-[REDACTED_AUTHOR]
- */
-class ItemsToPersonalizeConfig : ItemsToModel {
- protected val valuesHolder = PersonalizeConfigValuesHolder()
-
- override fun convert(from: List
- , default: PersonalizeConfig): PersonalizeConfig {
- valuesHolder.init(default)
- mapListItems(from)
- return createModel()
- }
-
- private fun mapListItems(itemList: List
- ) {
- itemList.forEach { item -> mapItemToHolder(item) }
- }
-
- private fun mapItemToHolder(item: Item) {
- when (item) {
- is Block -> mapListItems(item.itemList)
- is BaseItem<*> -> {
- val defValue = valuesHolder.get(item.id) ?: return
- defValue.set(item.viewModel.data)
- }
- }
- }
-
- private fun createModel(): PersonalizeConfig {
- val export = PersonalizeConfig()
- export.series = getTyped(CardNumber.Series)
- export.startNumber = getTyped(CardNumber.Number)
- export.curveID = getTyped(Common.Curve)
- export.blockchain = getTyped(Common.Blockchain)
- export.blockchainCustom = getTyped(Common.BlockchainCustom)
- export.MaxSignatures = getTyped(Common.MaxSignatures)
- export.createWallet = getTyped(Common.CreateWallet)
- export.SigningMethod0 = getTyped(SigningMethod.SignTx)
- export.SigningMethod1 = getTyped(SigningMethod.SignTxRaw)
- export.SigningMethod2 = getTyped(SigningMethod.SignValidatedTx)
- export.SigningMethod3 = getTyped(SigningMethod.SignValidatedTxRaw)
- export.SigningMethod4 = getTyped(SigningMethod.SignValidatedTxIssuer)
- export.SigningMethod5 = getTyped(SigningMethod.SignValidatedTxRawIssuer)
- export.SigningMethod6 = getTyped(SigningMethod.SignExternal)
- export.pinLessFloorLimit = getTyped(SignHashExProp.PinLessFloorLimit)
- export.hexCrExKey = getTyped(SignHashExProp.CryptoExKey)
- export.requireTerminalCertSignature = getTyped(SignHashExProp.RequireTerminalCertSig)
- export.requireTerminalTxSignature = getTyped(SignHashExProp.RequireTerminalTxSig)
- export.checkPIN3onCard = getTyped(SignHashExProp.CheckPin3)
- export.writeOnPersonalization = getTyped(Denomination.WriteOnPersonalize)
- export.denomination = getTyped(Denomination.Denomination)
- export.itsToken = getTyped(Token.ItsToken)
- export.symbol = getTyped(Token.Symbol)
- export.contractAddress = getTyped(Token.ContractAddress)
- export.decimal = getTyped(Token.Decimal)
- export.cardData = export.cardData.apply { this.product_note = getTyped(ProductMask.Note) }
- export.cardData = export.cardData.apply { this.product_tag = getTyped(ProductMask.Tag) }
- export.cardData = export.cardData.apply { this.product_id_card = getTyped(ProductMask.IdCard) }
- export.cardData = export.cardData.apply { this.product_id_issuer = getTyped(ProductMask.IdIssuerCard) }
- export.isReusable = getTyped(SettingsMask.IsReusable)
- export.useActivation = getTyped(SettingsMask.NeedActivation)
- export.forbidPurgeWallet = getTyped(SettingsMask.ForbidPurge)
- export.allowSelectBlockchain = getTyped(SettingsMask.AllowSelectBlockchain)
- export.useBlock = getTyped(SettingsMask.UseBlock)
- export.oneApdu = getTyped(SettingsMask.OneApdu)
- export.useCVC = getTyped(SettingsMask.UseCvc)
- export.allowSwapPIN = getTyped(SettingsMask.AllowSwapPin)
- export.allowSwapPIN2 = getTyped(SettingsMask.AllowSwapPin2)
- export.forbidDefaultPIN = getTyped(SettingsMask.ForbidDefaultPin)
- export.smartSecurityDelay = getTyped(SettingsMask.SmartSecurityDelay)
- export.protectIssuerDataAgainstReplay = getTyped(SettingsMask.ProtectIssuerDataAgainstReplay)
- export.skipSecurityDelayIfValidatedByIssuer = getTyped(SettingsMask.SkipSecurityDelayIfValidated)
- export.skipCheckPIN2andCVCIfValidatedByIssuer = getTyped(SettingsMask.SkipPin2CvcIfValidated)
- export.skipSecurityDelayIfValidatedByLinkedTerminal = getTyped(SettingsMask.SkipSecurityDelayOnLinkedTerminal)
- export.restrictOverwriteIssuerDataEx = getTyped(SettingsMask.RestrictOverwriteExtraIssuerData)
- export.protocolAllowUnencrypted = getTyped(SettingsMaskProtocolEnc.AllowUnencrypted)
- export.protocolAllowStaticEncryption = getTyped(SettingsMaskProtocolEnc.AllowStaticEncryption)
- export.useNDEF = getTyped(SettingsMaskNdef.UseNdef)
- export.useDynamicNDEF = getTyped(SettingsMaskNdef.DynamicNdef)
- export.disablePrecomputedNDEF = getTyped(SettingsMaskNdef.DisablePrecomputedNdef)
- export.aar = getTyped(SettingsMaskNdef.Aar)
- export.aarCustom = getTyped(SettingsMaskNdef.AarCustom)
- export.uri = getTyped(SettingsMaskNdef.Uri)
- export.PIN = getTyped(Pins.Pin)
- export.PIN2 = getTyped(Pins.Pin2)
- export.PIN3 = getTyped(Pins.Pin3)
- export.CVC = getTyped(Pins.Cvc)
- export.pauseBeforePIN2 = getTyped(Pins.PauseBeforePin2)
- return export
- }
-
- private inline fun getTyped(id: Id): Type {
- return getTypedBy(valuesHolder, id)!!
- }
-
- private inline fun getTypedBy(holder: PersonalizeConfigValuesHolder, id: Id): Type? {
- Log.d(this, "getTyped for id: $id")
- var typedValue = holder.get(id)?.get()
-
- typedValue = when (typedValue) {
- is ListValueWrapper -> (typedValue.selectedItem as KeyValue).value as Type
- else -> typedValue as? Type ?: null
- }
- return typedValue
- }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt
deleted file mode 100644
index eb560d496d..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/converter/fromTo/PersonalizeConfigTo.kt
+++ /dev/null
@@ -1,305 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.converter.fromTo
-
-import com.tangem.commands.CardData
-import com.tangem.commands.EllipticCurve
-import com.tangem.commands.ProductMaskBuilder
-import com.tangem.commands.personalization.entities.CardConfig
-import com.tangem.commands.personalization.entities.NdefRecord
-import com.tangem.tangemtest._arch.structure.Additional
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.*
-import com.tangem.tangemtest._arch.structure.impl.*
-import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
-import com.tangem.tangemtest.ucase.variants.personalize.*
-import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigValuesHolder
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig
-import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter
-import java.util.*
-
-/**
-[REDACTED_AUTHOR]
- */
-class PersonalizeConfigToItem : ModelToItems {
- private val valuesHolder = PersonalizeConfigValuesHolder()
- private val itemTypes = ItemTypes()
-
- override fun convert(from: PersonalizeConfig): List
- {
- valuesHolder.init(from)
- val blocList = mutableListOf
- ()
- blocList.add(cardNumber())
- blocList.add(common())
- blocList.add(signingMethod())
- blocList.add(signHashExProperties())
- blocList.add(denomination())
- blocList.add(token())
- blocList.add(productMask())
- blocList.add(settingsMask())
- blocList.add(settingsMaskProtocolEnc())
- blocList.add(settingsMaskNdef())
- blocList.add(pins())
- val payloadBlock = ListItemBlock(Additional.JSON_TAILS)
- addPayload(payloadBlock, from)
- blocList.add(payloadBlock)
- blocList.iterate {
- if (itemTypes.hiddenList.contains(it.id)) {
- (it as BaseItem<*>)?.viewModel.viewState.isHiddenField = true
- }
- }
- return blocList
- }
-
- private fun cardNumber(): Block {
- val block = createBlock(BlockId.CardNumber)
- mutableListOf(
- CardNumber.Series,
- CardNumber.Number,
- CardNumber.BatchId
- ).forEach { createItem(block, it as Id) }
- return block
- }
-
- private fun common(): Block {
- val block = createBlock(BlockId.Common)
- mutableListOf(
- Common.Curve,
- Common.Blockchain,
- Common.BlockchainCustom,
- Common.MaxSignatures,
- Common.CreateWallet
- ).forEach { createItem(block, it) }
- return block
- }
-
- private fun signingMethod(): Block {
- val block = createBlock(BlockId.SigningMethod)
- mutableListOf(
- SigningMethod.SignTx,
- SigningMethod.SignTxRaw,
- SigningMethod.SignValidatedTx,
- SigningMethod.SignValidatedTxRaw,
- SigningMethod.SignValidatedTxIssuer,
- SigningMethod.SignValidatedTxRawIssuer,
- SigningMethod.SignExternal
- ).forEach { createItem(block, it) }
- return block
- }
-
- private fun signHashExProperties(): Block {
- val block = createBlock(BlockId.SignHashExProp)
- mutableListOf(
- SignHashExProp.PinLessFloorLimit,
- SignHashExProp.CryptoExKey,
- SignHashExProp.RequireTerminalCertSig,
- SignHashExProp.RequireTerminalTxSig,
- SignHashExProp.CheckPin3
- ).forEach { createItem(block, it) }
- return block
- }
-
- private fun denomination(): Block {
- val block = createBlock(BlockId.Denomination)
- mutableListOf(
- Denomination.WriteOnPersonalize,
- Denomination.Denomination
- ).forEach { createItem(block, it) }
- return block
- }
-
- private fun token(): Block {
- val block = createBlock(BlockId.Token)
- mutableListOf(
- Token.ItsToken,
- Token.Symbol,
- Token.ContractAddress,
- Token.Decimal
- ).forEach { createItem(block, it) }
- return block
- }
-
- private fun productMask(): Block {
- val block = createBlock(BlockId.ProdMask)
- mutableListOf(
- ProductMask.Note,
- ProductMask.Tag,
- ProductMask.IdCard,
- ProductMask.IdIssuerCard
- ).forEach { createItem(block, it) }
- return block
- }
-
- private fun settingsMask(): Block {
- val block = createBlock(BlockId.SettingsMask)
- mutableListOf(
- SettingsMask.IsReusable,
- SettingsMask.NeedActivation,
- SettingsMask.ForbidPurge,
- SettingsMask.AllowSelectBlockchain,
- SettingsMask.UseBlock,
- SettingsMask.OneApdu,
- SettingsMask.UseCvc,
- SettingsMask.AllowSwapPin,
- SettingsMask.AllowSwapPin2,
- SettingsMask.ForbidDefaultPin,
- SettingsMask.SmartSecurityDelay,
- SettingsMask.ProtectIssuerDataAgainstReplay,
- SettingsMask.SkipSecurityDelayIfValidated,
- SettingsMask.SkipPin2CvcIfValidated,
- SettingsMask.SkipSecurityDelayOnLinkedTerminal,
- SettingsMask.RestrictOverwriteExtraIssuerData
- ).forEach { createItem(block, it) }
- return block
- }
-
- private fun settingsMaskProtocolEnc(): Block {
- val block = createBlock(BlockId.SettingsMaskProtocolEnc)
- mutableListOf(
- SettingsMaskProtocolEnc.AllowUnencrypted,
- SettingsMaskProtocolEnc.AllowStaticEncryption
- ).forEach { createItem(block, it) }
- return block
- }
-
- private fun settingsMaskNdef(): Block {
- val block = createBlock(BlockId.SettingsMaskNdef)
- mutableListOf(
- SettingsMaskNdef.UseNdef,
- SettingsMaskNdef.DynamicNdef,
- SettingsMaskNdef.DisablePrecomputedNdef,
- SettingsMaskNdef.Aar,
- SettingsMaskNdef.AarCustom,
- SettingsMaskNdef.Uri
- ).forEach { createItem(block, it) }
- return block
- }
-
- private fun pins(): Block {
- val block = createBlock(BlockId.Pins)
- mutableListOf(Pins.Pin, Pins.Pin2, Pins.Pin3, Pins.Cvc, Pins.PauseBeforePin2)
- .forEach { createItem(block, it) }
- return block
- }
-
- private fun createBlock(id: Id): ListItemBlock {
- return ListItemBlock(id).apply { addItem(TextItem(id)) }
- }
-
- private fun addPayload(block: Block, from: PersonalizeConfig) {
- block.payload[PayloadKey.incomingJson] = from
- }
-
- private fun createItem(block: ListItemBlock, id: Id) {
- val holder = valuesHolder.get(id) ?: return
- val item = when {
- itemTypes.blockIdList.contains(id) -> TextItem(id, holder.get() as? String)
- itemTypes.listItemList.contains(id) -> ListItem(id, holder.list as List, holder.get())
- itemTypes.boolList.contains(id) -> BoolItem(id, holder.get() as? Boolean)
- itemTypes.editTextList.contains(id) -> EditTextItem(id, holder.get() as? String)
- itemTypes.numberList.contains(id) -> NumberItem(id, holder.get() as? Number)
- else -> ListItemBlock(Additional.UNDEFINED)
- }
- block.addItem(item)
- }
-}
-
-class PersonalizeConfigToCardConfig : Converter {
-
- override fun convert(from: PersonalizeConfig): CardConfig {
- val signingMethod = com.tangem.commands.SigningMethod.build(
- signHash = from.SigningMethod0,
- signRaw = from.SigningMethod1,
- signHashValidatedByIssuer = from.SigningMethod2,
- signRawValidatedByIssuer = from.SigningMethod3,
- signHashValidatedByIssuerAndWriteIssuerData = from.SigningMethod4,
- signRawValidatedByIssuerAndWriteIssuerData = from.SigningMethod5,
- signPos = from.SigningMethod6
- )
-
- val isNote = from.cardData.product_note
- val isTag = from.cardData.product_tag
- val isIdCard = from.cardData.product_id_card
- val isIdIssuer = from.cardData.product_id_issuer
-
- val productMaskBuilder = ProductMaskBuilder()
- if (isNote) productMaskBuilder.add(com.tangem.commands.ProductMask.note)
- if (isTag) productMaskBuilder.add(com.tangem.commands.ProductMask.tag)
- if (isIdCard) productMaskBuilder.add(com.tangem.commands.ProductMask.idCard)
- if (isIdIssuer) productMaskBuilder.add(com.tangem.commands.ProductMask.idIssuer)
- val productMask = productMaskBuilder.build()
-
- var tokenSymbol: String? = null
- var tokenContractAddress: String? = null
- var tokenDecimal: Int? = null
- if (from.itsToken) {
- tokenSymbol = from.symbol
- tokenContractAddress = from.contractAddress
- tokenDecimal = from.decimal.toInt()
- }
-
- val blockchain = if (from.blockchain.isNotEmpty()) from.blockchain else from.blockchainCustom
- val cardData = CardData(
- blockchainName = blockchain,
- batchId = from.batchId,
- productMask = productMask,
- tokenSymbol = tokenSymbol,
- tokenContractAddress = tokenContractAddress,
- tokenDecimal = tokenDecimal,
- issuerName = null,
- manufactureDateTime = Calendar.getInstance().time,
- manufacturerSignature = null)
-
-
- val ndefs = mutableListOf()
- if (from.uri.isNotEmpty()) {
- ndefs.add(NdefRecord(NdefRecord.Type.URI, from.uri))
- }
- when (from.aar) {
- "None" -> null
- "--- CUSTOM ---" -> NdefRecord(NdefRecord.Type.AAR, from.aarCustom)
- else -> NdefRecord(NdefRecord.Type.AAR, from.aar)
- }?.let { ndefs.add(it) }
-
- return CardConfig(
- "Tangem",
- "Tangem Test",
- from.series,
- from.startNumber,
- 1000,
- from.PIN,
- from.PIN2,
- from.PIN3,
- from.hexCrExKey,
- from.CVC,
- from.pauseBeforePIN2.toInt(),
- from.smartSecurityDelay,
- EllipticCurve.byName(from.curveID) ?: EllipticCurve.Secp256k1,
- signingMethod,
- from.MaxSignatures.toInt(),
- from.isReusable,
- from.allowSwapPIN,
- from.allowSwapPIN2,
- from.useActivation,
- from.useCVC,
- from.useNDEF,
- from.useDynamicNDEF,
- from.oneApdu,
- from.useBlock,
- from.allowSelectBlockchain,
- from.forbidPurgeWallet,
- from.protocolAllowUnencrypted,
- from.protocolAllowStaticEncryption,
- from.protectIssuerDataAgainstReplay,
- from.forbidDefaultPIN,
- from.disablePrecomputedNDEF,
- from.skipSecurityDelayIfValidatedByIssuer,
- from.skipCheckPIN2andCVCIfValidatedByIssuer,
- from.skipSecurityDelayIfValidatedByLinkedTerminal,
- from.restrictOverwriteIssuerDataEx,
- from.requireTerminalTxSignature,
- from.requireTerminalCertSignature,
- from.checkPIN3onCard,
- from.createWallet,
- cardData,
- ndefs
- )
- }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizeParams.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
similarity index 97%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizeParams.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
index f6e5cdb5ce..ace112c0af 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizeParams.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/DefaultPersonalizationParams.kt
@@ -9,7 +9,7 @@ import com.tangem.commands.personalization.entities.Manufacturer
[REDACTED_AUTHOR]
*/
-interface DefaultPersonalizeParams {
+interface DefaultPersonalizationParams {
companion object {
fun issuer(): Issuer {
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizationConfig.kt
similarity index 98%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizationConfig.kt
index bc855da8b1..1b09726453 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizeConfig.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/dto/PersonalizationConfig.kt
@@ -3,7 +3,7 @@ package com.tangem.tangemtest.ucase.variants.personalize.dto
/**
[REDACTED_AUTHOR]
*/
-class PersonalizeConfig {
+class PersonalizationConfig {
// Card number
var series = "BB"
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt
new file mode 100644
index 0000000000..d0216c725b
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizationFragment.kt
@@ -0,0 +1,78 @@
+package com.tangem.tangemtest.ucase.variants.personalize.ui
+
+import android.os.Bundle
+import android.view.View
+import androidx.lifecycle.Observer
+import com.tangem.tangemtest.R
+import com.tangem.tangemtest._arch.structure.Id
+import com.tangem.tangemtest._arch.structure.abstraction.Item
+import com.tangem.tangemtest._arch.widget.WidgetBuilder
+import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
+import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
+import com.tangem.tangemtest.ucase.domain.paramsManager.managers.PersonalizationItemsManager
+import com.tangem.tangemtest.ucase.tunnel.ActionView
+import com.tangem.tangemtest.ucase.tunnel.ItemError
+import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
+import com.tangem.tangemtest.ucase.variants.personalize.PersonalizationConfigStore
+import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.PersonalizationItemBuilder
+import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
+
+/**
+[REDACTED_AUTHOR]
+ */
+class PersonalizationFragment : BaseCardActionFragment() {
+
+ override val itemsManager: ItemsManager by lazy { PersonalizationItemsManager(PersonalizationConfigStore(requireContext())) }
+
+ override fun getLayoutId(): Int = R.layout.fg_personalization
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ lifecycle.addObserver(itemsManager as PersonalizationItemsManager)
+ }
+
+ override fun initFab() {
+ actionFab.setOnClickListener { actionVM.invokeMainAction() }
+ }
+
+ override fun createWidgets(widgetCreatedCallback: () -> Unit) {
+ Log.d(this, "createWidgets")
+ val itemList = mutableListOf
- ()
+
+ actionVM.ldItemList.observe(viewLifecycleOwner, Observer { list ->
+ Log.d(this, "ldBlockList size: ${list.size}")
+ itemList.clear()
+ itemList.addAll(list)
+ itemList.forEach { WidgetBuilder(PersonalizationItemBuilder()).build(it, itemContainer) }
+ actionVM.attachToPayload(mutableMapOf(
+ PayloadKey.actionView to this as ActionView,
+ PayloadKey.itemList to itemList
+ ))
+ widgetCreatedCallback()
+ })
+ }
+
+ override fun subscribeToViewModelChanges() {
+ Log.d(this, "subscribeToViewModelChanges")
+ listenEvent()
+ listenError()
+ listenDescriptionSwitchChanges()
+ }
+
+ override fun listenEvent() {
+ actionVM.seResponseEvent.observe(viewLifecycleOwner, Observer {
+ mainActivityVM.changeResponseEvent(it)
+ navigateTo(R.id.action_nav_card_action_to_response_screen)
+ })
+ }
+
+ override fun showSnackbar(id: Id, additionalHandler: ((Id) -> Int)?) {
+ super.showSnackbar(id) {
+ when (id) {
+ ItemError.BadSeries -> R.string.card_error_bad_series
+ ItemError.BadCardNumber -> R.string.card_error_bad_series_number
+ else -> additionalHandler?.invoke(id) ?: UNDEFINED
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt
index 4561e8e59d..e69de29bb2 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeFragment.kt
@@ -1,116 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui
-
-import android.os.Bundle
-import android.view.LayoutInflater
-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.google.android.material.floatingactionbutton.FloatingActionButton
-import com.google.android.material.snackbar.BaseTransientBottomBar
-import com.google.android.material.snackbar.Snackbar
-import com.tangem.TangemSdk
-import com.tangem.tangem_sdk_new.extensions.init
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.Id
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._main.MainViewModel
-import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
-import com.tangem.tangemtest.ucase.domain.paramsManager.ParamsManagerFactory
-import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
-import com.tangem.tangemtest.ucase.resources.ActionType
-import com.tangem.tangemtest.ucase.tunnel.ActionView
-import com.tangem.tangemtest.ucase.tunnel.CardError
-import com.tangem.tangemtest.ucase.tunnel.ItemError
-import com.tangem.tangemtest.ucase.ui.ActionViewModelFactory
-import com.tangem.tangemtest.ucase.ui.ParamsViewModel
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.WidgetBuilder
-import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
-
-/**
-[REDACTED_AUTHOR]
- */
-class PersonalizeFragment : Fragment(), ActionView {
-
- private val mainActivityVM: MainViewModel by activityViewModels()
- private val personalizeVM: PersonalizeViewModel by viewModels { PersonalizeViewModelFactory(PersonalizeConfig()) }
-
- private val itemsManager: ItemsManager by lazy { ParamsManagerFactory.createFactory().get(ActionType.Personalize)!! }
- private val paramsVM: ParamsViewModel by viewModels() { ActionViewModelFactory(itemsManager) }
-
- private lateinit var mainView: View
- private val blockContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_container) }
- private val actionFab: FloatingActionButton by lazy { mainView.findViewById(R.id.fab_action) }
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- Log.d(this, "onCreateView")
- mainView = inflater.inflate(R.layout.fg_personalize, container, false)
- return mainView
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- val blockList = mutableListOf
- ()
- personalizeVM.ldBlockList.observe(viewLifecycleOwner, Observer { list ->
- blockList.clear()
- blockList.addAll(list)
- blockList.forEach { WidgetBuilder().build(it, blockContainer) }
- paramsVM.attachToPayload(mutableMapOf(
- PayloadKey.actionView to this as ActionView,
- PayloadKey.itemList to blockList
- ))
-
- })
- mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer {
- personalizeVM.toggleDescriptionVisibility(it)
- })
-
- val cardManager = TangemSdk.init(requireActivity())
- paramsVM.setCardManager(cardManager)
- paramsVM.ldResponse.observe(viewLifecycleOwner, Observer {
- Log.d(this, "action response: ${if (it.length > 50) it.substring(0..50) else it}")
- showSnackbarMessage(it)
- })
- paramsVM.seError.observe(viewLifecycleOwner, Observer { showSnackbarMessage(it) })
-
- actionFab.setOnClickListener { paramsVM.invokeMainAction() }
- }
-
- protected fun showSnackbarMessage(message: String) {
- Snackbar.make(mainView, message, BaseTransientBottomBar.LENGTH_SHORT).show()
- }
-
- override fun showActionFab(show: Boolean) {
- if (show) actionFab.show() else actionFab.hide()
- }
-
- override fun showSnackbar(id: Id) {
-// MainResourceHolder.safeGet<>()
- when (id) {
- CardError.NotPersonalized -> showSnackbar(R.string.card_error_not_personalized)
- ItemError.BadSeries -> showSnackbar(R.string.card_error_bad_series)
- ItemError.BadCardNumber -> showSnackbar(R.string.card_error_bad_series_number)
- else -> showSnackbar(requireContext().getString(R.string.unknown))
- }
- }
-
- override fun showSnackbar(id: Int) {
- showSnackbar(requireContext().getString(id))
- }
-
- override fun showSnackbar(message: String) {
- Snackbar.make(mainView, message, BaseTransientBottomBar.LENGTH_SHORT).show()
- }
-}
-
-
-
-
-
-
-
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt
deleted file mode 100644
index b2c7ec7fce..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/PersonalizeViewModel.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui
-
-import android.view.View
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.iterate
-import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizeConfigConverter
-import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizeConfig
-
-/**
-[REDACTED_AUTHOR]
- */
-class PersonalizeViewModelFactory(private val config: PersonalizeConfig) : ViewModelProvider.NewInstanceFactory() {
- override fun create(modelClass: Class): T = PersonalizeViewModel(config) as T
-}
-
-class PersonalizeViewModel(private val config: PersonalizeConfig) : ViewModel() {
-
- val ldBlockList: MutableLiveData
> by lazy { MutableLiveData(initBlockList()) }
-
- private fun initBlockList(): List- = PersonalizeConfigConverter().convert(config)
-
- fun toggleDescriptionVisibility(state: Boolean) {
- ldBlockList.value?.iterate {
- val baseItem = it as? BaseItem<*> ?: return@iterate
- baseItem.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/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt
new file mode 100644
index 0000000000..5900b5da37
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/BaseAppWidget.kt
@@ -0,0 +1,28 @@
+package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
+
+import android.view.ViewGroup
+import com.tangem.tangemtest._arch.structure.StringId
+import com.tangem.tangemtest._arch.structure.abstraction.Item
+import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget
+import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
+import com.tangem.tangemtest.ucase.resources.MainResourceHolder
+import com.tangem.tangemtest.ucase.resources.Resources
+import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom
+
+/**
+[REDACTED_AUTHOR]
+ */
+abstract class BaseAppWidget(parent: ViewGroup, item: Item) : BaseViewWidget(parent, item) {
+ override fun getName(): String {
+ val idName = if (item.id is StringId) (item.id as StringId).value else ""
+
+ val resources = getResources() ?: return idName
+ return view.stringFrom(resources.resName)
+ }
+}
+
+fun ViewWidget.getResources(): Resources? = MainResourceHolder.get(item.id)
+
+fun ViewWidget.getResNameId(): Int = MainResourceHolder.safeGet(item.id).resName
+
+fun ViewWidget.getResDescriptionId(): Int? = MainResourceHolder.get(item.id)?.resDescription
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/DescriptionWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt
similarity index 61%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/DescriptionWidget.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt
index c50a5e91dd..b1d699f972 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/DescriptionWidget.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/DescriptionWidget.kt
@@ -1,38 +1,36 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item
+package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
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.abstraction.BaseItem
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.BaseWidget
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResDescription
+import com.tangem.tangemtest._arch.structure.abstraction.Item
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
*/
-abstract class DescriptionWidget(
+abstract class DescriptionWidget(
parent: ViewGroup,
- data: BaseItem
-) : BaseWidget(parent, data) {
+ item: Item
+) : BaseAppWidget(parent, item) {
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: ${dataItem.id}")
+ Log.d(this, "init id: ${item.id}")
initDescriptionWidget()
}
private fun initDescriptionWidget() {
- dataItem.viewModel.viewState.onDescriptionVisibilityChanged = { changeDescriptionVisibility(it) }
+ item.viewModel.viewState.onDescriptionVisibilityChanged = { changeDescriptionVisibility(it) }
}
- protected fun changeDescriptionVisibility(state: Int) {
+ protected open fun changeDescriptionVisibility(state: Int) {
val tv = tvDescription ?: return
- val descriptionId = getResDescription() ?: return
+ val descriptionId = getResDescriptionId() ?: return
val description = tv.context.getString(descriptionId)
if (description.isEmpty()) return
@@ -40,15 +38,4 @@ abstract class DescriptionWidget(
TransitionManager.beginDelayedTransition(view.parent as ViewGroup, AutoTransition())
descriptionContainer.visibility = state
}
-}
-
-
-
-
-
-
-
-
-
-
-
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/EditTextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt
similarity index 74%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/EditTextWidget.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt
index c4bff5cfab..df0951947d 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/EditTextWidget.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/EditTextWidget.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item
+package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
import android.text.Editable
import android.text.TextWatcher
@@ -7,14 +7,17 @@ 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.EditTextItem
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId
import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
/**
[REDACTED_AUTHOR]
*/
-class EditTextWidget(parent: ViewGroup, data: EditTextItem) : DescriptionWidget(parent, data) {
+class EditTextWidget(
+ parent: ViewGroup,
+ private val typedItem: EditTextItem
+) : DescriptionWidget(parent, typedItem) {
+
override fun getLayoutId(): Int = R.layout.w_personalize_item_edit_text
private val tilItem = view.findViewById(R.id.til_item)
@@ -22,7 +25,7 @@ class EditTextWidget(parent: ViewGroup, data: EditTextItem) : DescriptionWidget<
private val watcher = object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
- dataItem.viewModel.updateDataByView(stringOf(s))
+ typedItem.viewModel.updateDataByView(stringOf(s))
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
@@ -30,10 +33,10 @@ class EditTextWidget(parent: ViewGroup, data: EditTextItem) : DescriptionWidget<
}
init {
- tilItem.hint = tilItem.context.getString(getResNameId())
- etItem.setText(dataItem.viewModel.data)
+ tilItem.hint = getName()
+ etItem.setText(typedItem.getTypedData())
etItem.addTextChangedListener(watcher)
- dataItem.viewModel.onDataUpdated = { silentUpdate(it) }
+ item.viewModel.onDataUpdated = { silentUpdate(it as? String) }
}
private fun silentUpdate(value: String?) {
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/TextWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/GroupTitleWidget.kt
similarity index 62%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/TextWidget.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/GroupTitleWidget.kt
index ae12a19231..27167508ad 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/TextWidget.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/GroupTitleWidget.kt
@@ -1,20 +1,19 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item
+package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
import android.view.ViewGroup
import android.widget.TextView
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.impl.TextItem
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId
/**
[REDACTED_AUTHOR]
*/
-class TextWidget(parent: ViewGroup, data: TextItem) : DescriptionWidget(parent, data) {
+class GroupTitleWidget(parent: ViewGroup, data: TextItem) : DescriptionWidget(parent, data) {
override fun getLayoutId(): Int = R.layout.w_personalize_item_text
private val tvName = view.findViewById(R.id.tv_name)
init {
- tvName?.setText(getResNameId())
+ tvName.text = getName()
}
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/NumberWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt
similarity index 74%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/NumberWidget.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt
index 794c4c1ea0..61cab1f430 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/NumberWidget.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/NumberWidget.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item
+package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
import android.text.Editable
import android.text.InputFilter
@@ -9,7 +9,6 @@ import com.google.android.material.textfield.TextInputLayout
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.impl.NumberItem
import com.tangem.tangemtest.ucase.variants.personalize.CardNumber
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId
import ru.dev.gbixahue.eu4d.lib.android._android.views.addInputFilter
import ru.dev.gbixahue.eu4d.lib.android._android.views.moveCursorToEnd
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
@@ -17,7 +16,11 @@ import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
/**
[REDACTED_AUTHOR]
*/
-class NumberWidget(parent: ViewGroup, data: NumberItem) : DescriptionWidget(parent, data) {
+class NumberWidget(
+ parent: ViewGroup,
+ private val typedItem: NumberItem
+) : DescriptionWidget(parent, typedItem) {
+
override fun getLayoutId(): Int = R.layout.w_personalize_item_number
private val tilItem = view.findViewById(R.id.til_item)
@@ -25,7 +28,7 @@ class NumberWidget(parent: ViewGroup, data: NumberItem) : DescriptionWidget GroupTitleWidget(parent, item)
+ is EditTextItem -> EditTextWidget(parent, item)
+ is NumberItem -> NumberWidget(parent, item)
+ is BoolItem -> SwitchWidget(parent, item)
+ is SpinnerItem -> SpinnerWidget(parent, item)
+ else -> null
+ }
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SpinnerWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt
similarity index 60%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SpinnerWidget.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt
index b6ec1d006c..d3e06d96cf 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SpinnerWidget.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SpinnerWidget.kt
@@ -1,4 +1,4 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item
+package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
import android.view.View
import android.view.ViewGroup
@@ -7,50 +7,52 @@ import android.widget.BaseAdapter
import android.widget.Spinner
import android.widget.TextView
import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.impl.KeyValue
-import com.tangem.tangemtest._arch.structure.impl.ListItem
-import com.tangem.tangemtest._arch.structure.impl.ListValueWrapper
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId
+import com.tangem.tangemtest._arch.structure.abstraction.KeyValue
+import com.tangem.tangemtest._arch.structure.abstraction.ListViewModel
+import com.tangem.tangemtest._arch.structure.impl.SpinnerItem
import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
/**
[REDACTED_AUTHOR]
*/
-class SpinnerWidget(parent: ViewGroup, listItem: ListItem) : DescriptionWidget(parent, listItem) {
+class SpinnerWidget(
+ parent: ViewGroup,
+ typedItem: SpinnerItem
+) : DescriptionWidget(parent, typedItem) {
+
override fun getLayoutId(): Int = R.layout.w_personalize_item_spinner
- private val data: ListValueWrapper = listItem.getData()!!
+ 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]
- dataItem.viewModel.updateDataByView(data)
+ viewModel.selectedItem = viewModel.itemList[position].value
+ item.viewModel.updateDataByView(viewModel)
}
}
init {
val name = view.findViewById(R.id.tv_name)
- name.setText(getResNameId())
- spItem.adapter = spAdapter
- spAdapter.getItemPosition(stringOf(data.selectedItem))?.let {
- spItem.setSelection(it)
+ name.text = getName()
+ spinner.adapter = spAdapter
+ spAdapter.getItemPosition(stringOf(viewModel.selectedItem))?.let {
+ spinner.setSelection(it)
}
- spItem.onItemSelectedListener = onItemSelectedListener
- dataItem.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
+ spinner.onItemSelectedListener = onItemSelectedListener
+ item.viewModel.onDataUpdated = {
+ val selectedItem = it as? String
+ spinner.onItemSelectedListener = null
+ viewModel.itemList.firstOrNull { item -> item.value == selectedItem }?.let { keyValue ->
+ val position = viewModel.itemList.indexOf(keyValue)
+ spinner.setSelection(position)
}
+ spinner.onItemSelectedListener = onItemSelectedListener
}
}
}
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SwitchWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt
similarity index 62%
rename from tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SwitchWidget.kt
rename to tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt
index 3b7d85bed0..ffa0b6879b 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/item/SwitchWidget.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/SwitchWidget.kt
@@ -1,31 +1,34 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item
+package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
import android.view.ViewGroup
import android.widget.CompoundButton
import androidx.appcompat.widget.SwitchCompat
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.impl.BoolItem
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.getResNameId
/**
[REDACTED_AUTHOR]
*/
-class SwitchWidget(parent: ViewGroup, data: BoolItem) : DescriptionWidget(parent, data) {
+class SwitchWidget(
+ parent: ViewGroup,
+ private val typedItem: BoolItem
+) : DescriptionWidget(parent, typedItem) {
+
override fun getLayoutId(): Int = R.layout.w_personalize_item_switch
private val switchItem = view.findViewById(R.id.sw_item)
private val changeListener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
- dataItem.viewModel.updateDataByView(isChecked)
+ typedItem.viewModel.updateDataByView(isChecked)
}
init {
- switchItem.setText(getResNameId())
- switchItem.isChecked = dataItem.viewModel.data ?: false
+ switchItem.text = getName()
+ switchItem.isChecked = typedItem.getTypedData() ?: false
switchItem.setOnCheckedChangeListener(changeListener)
- dataItem.viewModel.onDataUpdated = {
+ typedItem.viewModel.onDataUpdated = {
switchItem.setOnCheckedChangeListener(null)
- switchItem.isChecked = it ?: false
+ switchItem.isChecked = it as? Boolean ?: false
switchItem.setOnCheckedChangeListener(changeListener)
}
}
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/WidgetBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/WidgetBuilder.kt
deleted file mode 100644
index a9aa921bcf..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/WidgetBuilder.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets
-
-import android.view.ViewGroup
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.structure.abstraction.Block
-import com.tangem.tangemtest._arch.structure.abstraction.Item
-import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock
-import com.tangem.tangemtest._arch.structure.impl.*
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.ViewWidget
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.StubWidget
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.block.LinearBlockWidget
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.item.*
-
-/**
-[REDACTED_AUTHOR]
- */
-class WidgetBuilder {
-
- fun build(item: Item, parent: ViewGroup): ViewWidget? {
- return when (item) {
- is Block -> buildBlock(item, parent)
- is BaseItem<*> -> buildUnitItem(item, parent)
- else -> StubWidget(parent)
- }
- }
-
- private fun buildBlock(block: Block, parent: ViewGroup): ViewWidget {
- return when (block) {
- is ListItemBlock -> {
- val linearBlock = LinearBlockWidget(parent, block)
- block.getItems().forEach { build(it, linearBlock.view as ViewGroup) }
- linearBlock
- }
- else -> StubWidget(parent)
- }
- }
-
- private fun buildUnitItem(item: BaseItem<*>, parent: ViewGroup): ViewWidget? {
- return when (item) {
- is TextItem -> TextWidget(parent, item)
- is EditTextItem -> EditTextWidget(parent, item)
- is NumberItem -> NumberWidget(parent, item)
- is BoolItem -> SwitchWidget(parent, item)
- is ListItem -> SpinnerWidget(parent, item)
- else -> null
- }
- }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/abstraction/ViewWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/abstraction/ViewWidget.kt
deleted file mode 100644
index 7926c4a0cf..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/abstraction/ViewWidget.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction
-
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.DataHolder
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel
-import com.tangem.tangemtest.ucase.resources.MainResourceHolder
-import com.tangem.tangemtest.ucase.resources.Resources
-import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
-
-/**
-[REDACTED_AUTHOR]
- */
-interface ViewWidget : LayoutHolder {
- val view: View
-}
-
-interface DataWidget : ViewWidget {
- var dataItem: BaseItem
-}
-
-interface BlockViewWidget : ViewWidget, DataHolder
>>
-
-abstract class BaseWidget(
- parent: ViewGroup,
- override var dataItem: BaseItem
-) : ViewWidget, DataWidget {
-
- override val view: View = inflate(getLayoutId(), parent)
-
- init {
- if (dataItem.viewModel.viewState.isHiddenField) {
- view.visibility = View.GONE
- }
- }
-}
-
-abstract class BaseBlockWidget(parent: ViewGroup) : BlockViewWidget {
- override val view: View = inflate(getLayoutId(), parent)
-}
-
-fun DataWidget<*>.getResNameId(): Int = MainResourceHolder.safeGet(dataItem.id).resName
-
-fun DataWidget<*>.getResDescription(): Int? = MainResourceHolder.safeGet(dataItem.id).resDescription
-
-internal fun inflate(id: Int, parent: ViewGroup): View {
- val layoutId = if (id <= 0) R.layout.w_empty else id
- val inflatedView = LayoutInflater.from(parent.context).inflate(layoutId, parent, false)
- parent.addView(inflatedView)
- return inflatedView
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/StubWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/StubWidget.kt
deleted file mode 100644
index a087c6e0cb..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/StubWidget.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl
-
-import android.view.ViewGroup
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.BaseBlockWidget
-
-/**
-[REDACTED_AUTHOR]
- */
-class StubWidget(parent: ViewGroup) : BaseBlockWidget(parent) {
- override fun getLayoutId(): Int = R.layout.w_empty
- override var viewModel: List> = listOf()
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/block/LinearBlockWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/block/LinearBlockWidget.kt
deleted file mode 100644
index fb4be30444..0000000000
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/personalize/ui/widgets/impl/block/LinearBlockWidget.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.impl.block
-
-import android.view.ViewGroup
-import com.tangem.tangemtest.R
-import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
-import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel
-import com.tangem.tangemtest._arch.structure.abstraction.ListItemBlock
-import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.abstraction.BaseBlockWidget
-
-/**
-[REDACTED_AUTHOR]
- */
-class LinearBlockWidget(
- parent: ViewGroup,
- private val children: ListItemBlock
-) : BaseBlockWidget(parent) {
- override fun getLayoutId(): Int = R.layout.w_personilize_block
-
- override var viewModel: List> = listOf()
- get() = children.itemList.map { it as BaseItem<*> }.map { it.viewModel }
-}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/Ids.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/Ids.kt
new file mode 100644
index 0000000000..05e0d37d44
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/Ids.kt
@@ -0,0 +1,44 @@
+package com.tangem.tangemtest.ucase.variants.responses
+
+import com.tangem.tangemtest._arch.structure.Id
+
+/**
+[REDACTED_AUTHOR]
+ */
+interface ResponseId : Id
+
+enum class CardId : ResponseId {
+ cardId,
+ manufacturerName,
+ status,
+ firmwareVersion,
+ cardPublicKey,
+ settingsMask,
+ cardData,
+ issuerPublicKey,
+ curve,
+ maxSignatures,
+ signingMethod,
+ pauseBeforePin2,
+ walletPublicKey,
+ walletRemainingSignatures,
+ walletSignedHashes,
+ health,
+ isActivated,
+ activationSeed,
+ paymentFlowVersion,
+ userCounter,
+ userProtectedCounter,
+}
+
+enum class CardDataId : ResponseId {
+ batchId,
+ manufactureDateTime,
+ issuerName,
+ blockchainName,
+ manufacturerSignature,
+ productMask,
+ tokenSymbol,
+ tokenContractAddress,
+ tokenDecimal,
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt
new file mode 100644
index 0000000000..6216ffbddc
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ResponseViewModel.kt
@@ -0,0 +1,56 @@
+package com.tangem.tangemtest.ucase.variants.responses
+
+import android.view.View
+import androidx.lifecycle.ViewModel
+import com.tangem.commands.Card
+import com.tangem.commands.SignResponse
+import com.tangem.commands.personalization.DepersonalizeResponse
+import com.tangem.tangemtest.R
+import com.tangem.tangemtest._arch.structure.abstraction.Item
+import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems
+import com.tangem.tangemtest._arch.structure.abstraction.iterate
+import com.tangem.tangemtest.ucase.variants.responses.converter.ConvertersStore
+import com.tangem.tasks.ScanEvent
+import com.tangem.tasks.TaskEvent
+import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
+
+/**
+[REDACTED_AUTHOR]
+ */
+class ResponseViewModel : ViewModel() {
+
+ private val convertersHolder = ConvertersStore()
+ private var itemList: List- ? = null
+
+ fun createItemList(taskEvent: TaskEvent<*>?): List
- {
+ Log.d(this, "createItemList: itemList size: ${itemList?.size ?: 0}")
+
+ val event = taskEvent as? TaskEvent.Event ?: return emptyList()
+ val type = event.data::class.java
+ val converter = convertersHolder.get(type) as? ModelToItems ?: return emptyList()
+ itemList = converter.convert(event.data)
+ return itemList!!
+ }
+
+ fun toggleDescriptionVisibility(state: Boolean) {
+ itemList?.iterate {
+ it.viewModel.viewState.descriptionVisibility = if (state) View.VISIBLE else View.GONE
+ }
+ }
+
+ fun determineTitleId(taskEvent: TaskEvent<*>?): Int {
+ val event = taskEvent as? TaskEvent.Event ?: return R.string.unknown
+
+ return when (event.data) {
+ is ScanEvent.OnReadEvent -> R.string.fg_name_response_scan
+ is SignResponse -> R.string.fg_name_response_sign
+ is Card -> R.string.fg_name_response_personalization
+ is DepersonalizeResponse -> R.string.fg_name_response_depersonalization
+ else -> R.string.unknown
+ }
+ }
+}
+
+
+
+
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
new file mode 100644
index 0000000000..374cdaaf20
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/CardConverter.kt
@@ -0,0 +1,105 @@
+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.common.extensions.toHexString
+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.*
+import com.tangem.tangemtest._arch.structure.impl.BoolItem
+import com.tangem.tangemtest._arch.structure.impl.TextItem
+import com.tangem.tangemtest.ucase.variants.personalize.BlockId
+import com.tangem.tangemtest.ucase.variants.responses.CardDataId
+import com.tangem.tangemtest.ucase.variants.responses.CardId
+import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
+
+/**
+[REDACTED_AUTHOR]
+ */
+class CardConverter : ModelToItems {
+ override fun convert(from: Card): List
- {
+ val itemList = mutableListOf
- ()
+// val holder = GsonInitializer()
+// itemList.add(TextItem(Additional.JSON_INCOMING, holder.gson.toJson(from)))
+
+ itemList.add(simpleFields(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))
+ group.addItem(TextItem(CardId.manufacturerName, from.manufacturerName))
+ group.addItem(TextItem(CardId.status, stringOf(from.status)))
+ group.addItem(TextItem(CardId.firmwareVersion, from.firmwareVersion))
+ group.addItem(TextItem(CardId.cardPublicKey, from.cardPublicKey?.toHexString()))
+ group.addItem(TextItem(CardId.issuerPublicKey, from.issuerPublicKey?.toHexString()))
+ group.addItem(TextItem(CardId.curve, stringOf(from.curve)))
+ group.addItem(TextItem(CardId.maxSignatures, stringOf(from.maxSignatures)))
+ group.addItem(TextItem(CardId.signingMethod, stringOf(from.signingMethod?.rawValue)))
+ group.addItem(TextItem(CardId.pauseBeforePin2, stringOf(from.pauseBeforePin2)))
+ group.addItem(TextItem(CardId.walletPublicKey, stringOf(from.walletPublicKey)))
+ group.addItem(TextItem(CardId.walletRemainingSignatures, stringOf(from.walletRemainingSignatures)))
+ group.addItem(TextItem(CardId.walletSignedHashes, stringOf(from.walletSignedHashes)))
+ group.addItem(TextItem(CardId.health, stringOf(from.health)))
+ group.addItem(TextItem(CardId.isActivated, stringOf(from.isActivated)))
+ group.addItem(TextItem(CardId.activationSeed, stringOf(from.activationSeed)))
+ group.addItem(TextItem(CardId.paymentFlowVersion, stringOf(from.paymentFlowVersion)))
+ group.addItem(TextItem(CardId.userCounter, stringOf(from.userCounter)))
+// block.addItem(TextItem(CardId.UserProtectedCounter, stringOf(from.userProtectedCounter)))
+ 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)))
+ group.addItem(TextItem(CardDataId.issuerName, data.issuerName))
+ group.addItem(TextItem(CardDataId.blockchainName, data.blockchainName))
+ group.addItem(TextItem(CardDataId.manufacturerSignature, data.manufacturerSignature?.toHexString()))
+ group.addItem(TextItem(CardDataId.productMask, stringOf(data.productMask?.rawValue)))
+ group.addItem(TextItem(CardDataId.tokenSymbol, data.tokenSymbol))
+ group.addItem(TextItem(CardDataId.tokenContractAddress, data.tokenContractAddress))
+ group.addItem(TextItem(CardDataId.tokenDecimal, data.tokenSymbol))
+
+ return group
+ }
+
+ private fun settingsMask(from: SettingsMask?): Item {
+ 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, 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/converter/ConvertersStore.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt
new file mode 100644
index 0000000000..9b1dc76a49
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/ConvertersStore.kt
@@ -0,0 +1,17 @@
+package com.tangem.tangemtest.ucase.variants.responses.converter
+
+import com.tangem.commands.Card
+import com.tangem.commands.SignResponse
+import com.tangem.commands.personalization.DepersonalizeResponse
+import com.tangem.tasks.ScanEvent
+import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
+import java.lang.reflect.Type
+
+class ConvertersStore : BaseTypedHolder() {
+ init {
+ register(ScanEvent.OnReadEvent::class.java, ReadEventConverter())
+ register(SignResponse::class.java, SignResponseConverter())
+ register(Card::class.java, CardConverter())
+ register(DepersonalizeResponse::class.java, DepersonalizeResponseConverter())
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt
new file mode 100644
index 0000000000..a1c997465b
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/converter/SimpleConverters.kt
@@ -0,0 +1,35 @@
+package com.tangem.tangemtest.ucase.variants.responses.converter
+
+import com.tangem.commands.SignResponse
+import com.tangem.commands.personalization.DepersonalizeResponse
+import com.tangem.tangemtest._arch.structure.StringId
+import com.tangem.tangemtest._arch.structure.abstraction.Item
+import com.tangem.tangemtest._arch.structure.abstraction.ModelToItems
+import com.tangem.tangemtest._arch.structure.impl.TextItem
+import com.tangem.tasks.ScanEvent
+import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
+
+/**
+[REDACTED_AUTHOR]
+ */
+class ReadEventConverter : ModelToItems {
+ override fun convert(from: ScanEvent.OnReadEvent): List
- = CardConverter().convert(from.card)
+}
+
+class SignResponseConverter : ModelToItems {
+
+ override fun convert(from: SignResponse): List
- {
+ return listOf(
+ TextItem(StringId("CID"), from.cardId),
+ TextItem(StringId("Wallet signed hashes"), stringOf(from.walletSignedHashes)),
+ TextItem(StringId("Wallet remaining signatures"), stringOf(from.walletRemainingSignatures)),
+ TextItem(StringId("Signature"), stringOf(from.signature))
+ )
+ }
+}
+
+class DepersonalizeResponseConverter : ModelToItems {
+ override fun convert(from: DepersonalizeResponse): List
- {
+ return listOf(TextItem(StringId("Is success"), stringOf(from.success)))
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt
new file mode 100644
index 0000000000..4477f12894
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/ResponseFragment.kt
@@ -0,0 +1,75 @@
+package com.tangem.tangemtest.ucase.variants.responses.ui
+
+import android.os.Bundle
+import android.view.*
+import android.widget.LinearLayout
+import androidx.fragment.app.activityViewModels
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.Observer
+import com.tangem.tangemtest.R
+import com.tangem.tangemtest._arch.widget.WidgetBuilder
+import com.tangem.tangemtest._main.MainViewModel
+import com.tangem.tangemtest.extensions.shareText
+import com.tangem.tangemtest.ucase.domain.responses.ResponseJsonConverter
+import com.tangem.tangemtest.ucase.ui.BaseFragment
+import com.tangem.tangemtest.ucase.variants.responses.ResponseViewModel
+import com.tangem.tangemtest.ucase.variants.responses.ui.widget.ResponseItemBuilder
+
+/**
+[REDACTED_AUTHOR]
+ */
+open class ResponseFragment : BaseFragment() {
+
+ private val mainActivityVM: MainViewModel by activityViewModels()
+ private val selfVM: ResponseViewModel by viewModels()
+
+ private val itemContainer: ViewGroup by lazy { mainView.findViewById(R.id.ll_container) }
+
+ override fun getLayoutId(): Int = R.layout.fg_card_response
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setTittle()
+ }
+
+ private fun setTittle() {
+ val titleId = selfVM.determineTitleId(mainActivityVM.responseEvent)
+ activity?.setTitle(titleId)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ setHasOptionsMenu(true)
+ buildWidgets()
+ listenDescriptionSwitchChanges()
+ }
+
+ private fun buildWidgets() {
+ val builder = WidgetBuilder(ResponseItemBuilder())
+ val itemList = selfVM.createItemList(mainActivityVM.responseEvent)
+ itemList.forEach { builder.build(it, itemContainer) }
+ }
+
+ private fun listenDescriptionSwitchChanges() {
+ mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer {
+ selfVM.toggleDescriptionVisibility(it)
+ })
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
+ super.onCreateOptionsMenu(menu, inflater)
+
+ val menuItem = menu.findItem(R.id.action_share)
+ menuItem.isVisible = true
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ when (item.itemId) {
+ R.id.action_share -> {
+ shareText(ResponseJsonConverter().convertEvent(mainActivityVM.responseEvent))
+ }
+ }
+ return super.onOptionsItemSelected(item)
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt
new file mode 100644
index 0000000000..65dd1a5831
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/CheckBoxWidget.kt
@@ -0,0 +1,27 @@
+package com.tangem.tangemtest.ucase.variants.responses.ui.widget
+
+import android.view.ViewGroup
+import com.google.android.material.checkbox.MaterialCheckBox
+import com.tangem.tangemtest.R
+import com.tangem.tangemtest._arch.structure.impl.BoolItem
+import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom
+
+/**
+[REDACTED_AUTHOR]
+ */
+class CheckBoxWidget(
+ parent: ViewGroup,
+ private val typedItem: BoolItem
+) : ResponseWidget(parent, typedItem) {
+
+ override fun getLayoutId(): Int = R.layout.w_response_item_checkbox
+
+ private val switchItem = view.findViewById(R.id.sw_item)
+
+ init {
+ switchItem.text = getName()
+ switchItem.isChecked = typedItem.getData() ?: false
+ switchItem.isClickable = false
+ switchItem.setTextColor(switchItem.colorFrom(R.color.action_name))
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt
new file mode 100644
index 0000000000..051974e674
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseItemBuilder.kt
@@ -0,0 +1,21 @@
+package com.tangem.tangemtest.ucase.variants.responses.ui.widget
+
+import android.view.ViewGroup
+import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
+import com.tangem.tangemtest._arch.structure.impl.BoolItem
+import com.tangem.tangemtest._arch.structure.impl.TextItem
+import com.tangem.tangemtest._arch.widget.ItemWidgetBuilder
+import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
+
+/**
+[REDACTED_AUTHOR]
+ */
+class ResponseItemBuilder : ItemWidgetBuilder {
+ override fun build(item: BaseItem, parent: ViewGroup): ViewWidget? {
+ return when (item) {
+ is TextItem -> ResponseTextWidget(parent, item)
+ is BoolItem -> CheckBoxWidget(parent, item)
+ else -> null
+ }
+ }
+}
\ 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
new file mode 100644
index 0000000000..8859d78527
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseTextWidget.kt
@@ -0,0 +1,30 @@
+package com.tangem.tangemtest.ucase.variants.responses.ui.widget
+
+import android.view.ViewGroup
+import android.widget.TextView
+import com.tangem.tangemtest.R
+import com.tangem.tangemtest._arch.structure.impl.TextItem
+
+/**
+[REDACTED_AUTHOR]
+ */
+class ResponseTextWidget(
+ parent: ViewGroup,
+ private val typedItem: TextItem
+) : ResponseWidget(parent, typedItem) {
+
+ override fun getLayoutId(): Int = R.layout.w_response_item
+
+ private val tvName: TextView = view.findViewById(R.id.tv_name)
+ private val tvValue: TextView = view.findViewById(R.id.tv_value)
+
+ init {
+ initWidgets()
+ }
+
+ private fun initWidgets() {
+ val data = typedItem.getData() as? String
+ tvName.text = getName()
+ tvValue.text = data
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt
new file mode 100644
index 0000000000..054ab81dbc
--- /dev/null
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/responses/ui/widget/ResponseWidget.kt
@@ -0,0 +1,33 @@
+package com.tangem.tangemtest.ucase.variants.responses.ui.widget
+
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
+import android.view.ViewGroup
+import com.tangem.tangemtest.R
+import com.tangem.tangemtest._arch.structure.abstraction.Item
+import com.tangem.tangemtest.ucase.variants.personalize.ui.widgets.DescriptionWidget
+import ru.dev.gbixahue.eu4d.lib.android._android.views.stringFrom
+import ru.dev.gbixahue.eu4d.lib.android._android.views.toast
+import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
+
+/**
+[REDACTED_AUTHOR]
+ */
+abstract class ResponseWidget(parent: ViewGroup, item: Item): DescriptionWidget(parent, item) {
+
+ init {
+ view.setOnClickListener {
+ val data = stringOf(item.getData())
+ val clipboard = view.context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager
+ ?: return@setOnClickListener
+
+ val clipboardData = "${getName()} - $data"
+ val clip: ClipData = ClipData.newPlainText("FieldValue", clipboardData)
+ clipboard.setPrimaryClip(clip)
+
+ val copyMessage = view.stringFrom(R.string.copy_to_clipboard)
+ view.toast("$copyMessage\n$clipboardData")
+ }
+ }
+}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt
index ef5e6d8f01..1e5ed5eb9b 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/scan/ui/ScanActionFragment.kt
@@ -2,36 +2,29 @@ package com.tangem.tangemtest.ucase.variants.scan.ui
import android.os.Bundle
import android.view.View
-import android.widget.TextView
import androidx.lifecycle.Observer
import com.tangem.tangemtest.R
-import com.tangem.tangemtest.ucase.resources.ActionType
+import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
+import com.tangem.tangemtest.ucase.domain.paramsManager.managers.ScanItemsManager
import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
-import ru.dev.gbixahue.eu4d.lib.android._android.views.show
-import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
*/
class ScanActionFragment : BaseCardActionFragment() {
- override fun getLayoutId(): Int = R.layout.fg_action_card_scan
+ override val itemsManager: ItemsManager by lazy { ScanItemsManager() }
- override fun getAction(): ActionType = ActionType.Scan
+ override fun getLayoutId(): Int = R.layout.fg_action_card_scan
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
-
- showActionFab(true)
+ enableActionFab(true)
}
- override fun listenResponse() {
- val tvStub = mainView.findViewById(R.id.tv_screen_stub)
- val tvResponse by lazy { mainView.findViewById(R.id.tv_action_response_json) }
- paramsVM.ldReadResponse.observe(viewLifecycleOwner, Observer {
- Log.d(this, "action response: ${if (it.length > 50) it.substring(0..50) else it}")
- tvStub.show(false)
- tvResponse.text = it
+ override fun listenReadResponse() {
+ actionVM.seReadResponse.observe(viewLifecycleOwner, Observer {
+ navigateTo(R.id.action_nav_card_action_to_response_screen)
})
}
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt
index 9ce99ee075..1699672834 100644
--- a/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt
+++ b/tangem-demo/src/main/java/com/tangem/tangemtest/ucase/variants/sign/ui/SignActionFragment.kt
@@ -1,7 +1,8 @@
package com.tangem.tangemtest.ucase.variants.sign.ui
import com.tangem.tangemtest.R
-import com.tangem.tangemtest.ucase.resources.ActionType
+import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
+import com.tangem.tangemtest.ucase.domain.paramsManager.managers.SignItemsManager
import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
/**
@@ -9,7 +10,7 @@ import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
*/
class SignActionFragment : BaseCardActionFragment() {
- override fun getLayoutId(): Int = R.layout.fg_action_card_sign
+ override val itemsManager: ItemsManager by lazy { SignItemsManager() }
- override fun getAction(): ActionType = ActionType.Sign
+ override fun getLayoutId(): Int = R.layout.fg_action_card_sign
}
\ No newline at end of file
diff --git a/tangem-demo/src/main/res/drawable/ic_share_white_18dp.xml b/tangem-demo/src/main/res/drawable/ic_share_white_18dp.xml
new file mode 100644
index 0000000000..0075e4b78c
--- /dev/null
+++ b/tangem-demo/src/main/res/drawable/ic_share_white_18dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/tangem-demo/src/main/res/layout/fg_action_card_scan.xml b/tangem-demo/src/main/res/layout/fg_action_card_scan.xml
index aa343731bc..8b2deca0e8 100644
--- a/tangem-demo/src/main/res/layout/fg_action_card_scan.xml
+++ b/tangem-demo/src/main/res/layout/fg_action_card_scan.xml
@@ -15,7 +15,7 @@
android:orientation="vertical">
diff --git a/tangem-demo/src/main/res/layout/fg_action_card_sign.xml b/tangem-demo/src/main/res/layout/fg_action_card_sign.xml
index 45978494a3..8013659452 100644
--- a/tangem-demo/src/main/res/layout/fg_action_card_sign.xml
+++ b/tangem-demo/src/main/res/layout/fg_action_card_sign.xml
@@ -15,7 +15,7 @@
android:orientation="vertical">
diff --git a/tangem-demo/src/main/res/layout/fg_card_response.xml b/tangem-demo/src/main/res/layout/fg_card_response.xml
new file mode 100644
index 0000000000..357f9c82c6
--- /dev/null
+++ b/tangem-demo/src/main/res/layout/fg_card_response.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tangem-demo/src/main/res/layout/fg_depersonalize.xml b/tangem-demo/src/main/res/layout/fg_depersonalize.xml
index 45978494a3..8013659452 100644
--- a/tangem-demo/src/main/res/layout/fg_depersonalize.xml
+++ b/tangem-demo/src/main/res/layout/fg_depersonalize.xml
@@ -15,7 +15,7 @@
android:orientation="vertical">
diff --git a/tangem-demo/src/main/res/layout/fg_personalize.xml b/tangem-demo/src/main/res/layout/fg_personalization.xml
similarity index 100%
rename from tangem-demo/src/main/res/layout/fg_personalize.xml
rename to tangem-demo/src/main/res/layout/fg_personalization.xml
diff --git a/tangem-demo/src/main/res/layout/w_response_item.xml b/tangem-demo/src/main/res/layout/w_response_item.xml
new file mode 100644
index 0000000000..c0f3b1e887
--- /dev/null
+++ b/tangem-demo/src/main/res/layout/w_response_item.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tangem-demo/src/main/res/layout/w_response_item_checkbox.xml b/tangem-demo/src/main/res/layout/w_response_item_checkbox.xml
new file mode 100644
index 0000000000..2102af0305
--- /dev/null
+++ b/tangem-demo/src/main/res/layout/w_response_item_checkbox.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tangem-demo/src/main/res/menu/main_menu.xml b/tangem-demo/src/main/res/menu/main_menu.xml
index 6241fdec1d..7f4be83642 100644
--- a/tangem-demo/src/main/res/menu/main_menu.xml
+++ b/tangem-demo/src/main/res/menu/main_menu.xml
@@ -2,9 +2,17 @@
\ 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 42db9c6d1c..7209eb2e22 100644
--- a/tangem-demo/src/main/res/navigation/navigation.xml
+++ b/tangem-demo/src/main/res/navigation/navigation.xml
@@ -4,6 +4,10 @@
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@+id/nav_entry_point">
+
+
+ tools:layout="@layout/fg_personalization" />
+
+
diff --git a/tangem-demo/src/main/res/values/colors.xml b/tangem-demo/src/main/res/values/colors.xml
index 20e2693328..1c183064f5 100644
--- a/tangem-demo/src/main/res/values/colors.xml
+++ b/tangem-demo/src/main/res/values/colors.xml
@@ -8,7 +8,14 @@
#E6959595
#2B2B2B
- #888888
+
+ #888888
+ #303030
+ @color/field_info
+
+ #D7E4F3
+ #D7F3E6
+
#C6C6C6
#FFE391
diff --git a/tangem-demo/src/main/res/values/strings.xml b/tangem-demo/src/main/res/values/strings.xml
index 5cb0f4053a..064c3a64c8 100644
--- a/tangem-demo/src/main/res/values/strings.xml
+++ b/tangem-demo/src/main/res/values/strings.xml
@@ -1,10 +1,14 @@
- Tangem Demo
+ Tangem Development Kit
@string/app_name
- "Current card ID: "
+ Scan response
+ Sign response
+ Personalization response
+ Depersonalization response
unknown
+ Copy to clipboard
Docs
Your card hasn\'t been personalized yet. You need to run personalize command first.
diff --git a/tangem-demo/src/main/res/values/strings_response.xml b/tangem-demo/src/main/res/values/strings_response.xml
new file mode 100644
index 0000000000..c0086d1186
--- /dev/null
+++ b/tangem-demo/src/main/res/values/strings_response.xml
@@ -0,0 +1,138 @@
+
+
+
+
+
+ CID
+ Manufacturer_Name
+ Status
+ Firmware_Version
+ Card_PublicKey
+ Settings_Mask
+ Is_Reusable
+ Use_Activation
+ Prohibit_Purge_Wallet
+ Use_Block
+ Allow_SET_PIN1
+ Allow_SET_PIN2
+ Use_CVC
+ Prohibit_Default_PIN1
+ Use_One_CommandAtTime
+ Use_NDEF
+ Use_Dynamic_NDEF
+ Smart_Security_Delay
+ Allow_Unencrypted
+ Allow_Fast_Encryption
+ Protect_Issuer_Data_Against_Replay
+ Allow_Select_Blockchain
+ Disable_Precomputed_NDEF
+ Skip_Security_Delay_If_Validated_By_Issuer
+ Skip_Check_PIN2_and_CVC_If_Validated_By_Issuer
+ Skip_Security_Delay_If_Validated_By_Linked_Terminal
+ Restrict_Overwrite_Issuer_Extra_Data
+ 1 – prohibit overwriting Issuer_Extra_Data
+ Require_Term_Tx_Signature
+ Require_Term_Cert_Signature
+ Check_PIN3_on_Card
+ Card_Data
+ Issuer_Data_PublicKey
+ Curve_ID
+ Max_Signatures
+ Signing_Method
+ Pause_Before_PIN2
+ Wallet_PublicKey
+ Wallet_Remaining_Signatures
+ Wallet_Signed_Hashes
+ Health
+ Is_Activated
+ Activation_Seed
+ Payment_Flow_Version
+ User_Counter
+ User_Protected_Counter
+
+
+ Unique Tangem card ID number
+ Name of Tangem card manufacturer
+ Current status of the card
+ Version of Tangem COS
+ Public key that is used to authenticate the card against manufacturer’s database. It is generated one time during card manufacturing. See Security section for more details.
+ Card settings defined by personalization (bit mask: 0 – Enabled, 1 – Disabled):
+ Defines what happens when user calls PURGE_WALLET command:
+ \n0 - Card will switch to Purged state
+ \n1 - Card will switch to Empty state and let create a new wallet again
+
+ 0 – Card will accept PURGE_WALLET command
+ \n1 – Card will reject PURGE_WALLET command
+
+ Is user allowed to change PIN1 with SET_PIN command
+ Is user allowed to change PIN2 with SET_PIN command
+ All commands requiring PIN2 will also require additional CVC code printed on the card
+ SET_PIN commands will not change PIN1 to default value (‘000000’).
+ Card will execute only one command during one communication session, thus requiring user to physically take the card away from the host after each action (all commands except for READ_CARD).
+ Whether the card should emulate NDEF. In default configuration, two NDEF records are loaded during personalization: (1) Tangem web site address, (2) name of Android App package in Google Play Store.
+ 0 – Disable dynamic generation of NDEF for iOS. See Dynamic NDEF section for more details.
+ /n1 – Enable dynamic NDEF for iOS.
+ Security delay Pause_Before_PIN2 will not be applied if PIN2 is not default.
+ Whether the card supports unencrypted NFC communication. See NFC communication section for more details.
+ Whether the card supports fast encrypted NFC communication. See NFC communication section for more details.
+ 0 – No replay protection on write issuer data
+ /n1 – Enable replay protection on write issuer data (card will require additional Issuer_Data_Counter incremented on each write)
+ 0 – Wallet elliptic curve and blockchain information stored during PERSONALIZE command and never change
+ /n1 – Wallet elliptic curve and blockchain information can be changed on CREATE_WALLET command
+ 0 – Enable precomputed dynamic NDEF to work around iPhone 7+ NFC bug.
+ /n1 – Disable precomputed dynamic NDEF. See Dynamic NDEF section for more details.
+ 0 – Enforce security delay in SIGN command if the issuer validates the transaction (for signing methods 2, 3, 4 and 5).
+ /n1 – Skip security delay in SIGN command if the issuer validates the transaction (for signing methods 2, 3, 4 and 5).
+ 0 – Require and check PIN2 and CVC in SIGN command if the issuer validates the transaction (for signing method 2, 3, 4 and 5).
+ /n1 – Skip checking PIN2 and CVC in SIGN command if the issuer validates the transaction (for signing method 2, 3, 4 and 5).
+ 1 - Store Terminal_PublicKey public key of linked terminal no each SIGN command, skip security delay if valid signature of transaction is made with Terminal_PrivateKey is provided in SIGN command
+
+
+ 0 – Skip checking terminal’s signature when signing POS transaction
+ /n1 – Check terminal’s signature when signing POS transaction
+ 0 – Skip checking acquirer’s signature of terminal certificate when signing POS transaction
+ /n1 – Check acquirer’s signature of terminal certificate when signing POS transaction
+ 0 – Additionally encrypt POS transaction signature with key derived from PIN3 when the transaction amount exceeds PIN3 floor limit
+ /n1 – Require terminal to send PIN3 to card when the POS transaction amount exceeds PIN3_Floor_Limit
+ Detailed information about card contents. Format is defined by the card issuer. Cards complaint with Tangem Wallet application should have TLV format described in Personalization section.
+ Public key that is used by the card issuer to sign Issuer_Data field. See Security section for more details.
+ Explicit text name of the elliptic curve used for all wallet key operations.
+ Total number of signatures allowed for the wallet when the card was personalized.
+ Defines what data should be submitted to SIGN command.
+ Delay in seconds before COS executes commands protected by PIN2.
+ Public key of the blockchain wallet. Value returned only if the wallet has already been created by CREATE_WALLET command. See Security section for more details.
+ Remaining number of SIGN operations before the wallet will stop signing transactions. Value returned only if the wallet has already been created by CREATE_WALLET command.
+ Total number of signed single hashes returned by the card in SIGN command responses since card personalization. Sums up array elements within all SIGN commands.
+ Any non-zero value indicates that the card experiences some hardware problems. User should withdraw the value to other blockchain wallet as soon as possible. Non-zero Health tag will also appear in responses of all other commands.
+ Whether the card requires issuer’s confirmation of activation.
+ /n0 – card will require issuer’s confirmation of activation,
+ /notherwise this field will not be returned (card is activated and operational).
+ A random challenge generated by PERSONALIZE command that should be signed and returned to COS by the issuer to confirm the card has been activated. See ACTIVATE_CARD command for more details.
+ /nThis field will not be returned if the card is activated.
+ Version of POS payment scheme supported by COS ([0x02,0x01] for version 2.30)
+ /nReturned only if SigningMethod ‘6’ enabling POS transactions is supported by card.
+ This value can be initialized by App and will be increased by COS with the execution of each SIGN command. For example, this field can store blockchain “nonce” for a quick one-touch transaction on POS terminals. Returned only if SigningMethod =6.
+ This value can be initialized by App (with PIN2 confirmation) and will be increased by COS with the execution of each SIGN command. For example, this field can store blockchain “nonce” for a quick one-touch transaction on POS terminals. Returned only if SigningMethod =6.
+
+
+
+ Batch_ID
+ Manufacture_Date_Time
+ Issuer_Name
+ Blockchain_Name
+ Manufacturer_Signature
+ ProductMask
+ tokenSymbol
+ tokenContractAddress
+ tokenDecimal
+
+ Tangem internal manufacturing batch ID, should correspond with the data in Tangem’s card list (see Card attestation and UID and CID sections)
+ Timestamp of manufacturing should correspond with the data in Tangem’s card list (see Card attestation section).
+ Name of the issuer
+ Name of the blockchain (once personalized, the target blockchain is fixed for the whole life cycle)
+ Signature of CID with the MANUFACTURER_PRIVATE_KEY
+ Mask of products enabled on card
+
+
+
+
\ No newline at end of file