Updated on 2026-08-14

This commit is contained in:
Tangem 2020-04-29 12:04:40 +03:00
parent 675b1c418e
commit 7fb63a6a71
7 changed files with 128 additions and 41 deletions

View file

@ -12,6 +12,7 @@ data class NdefRecord(
URI, AAR, TEXT
}
@delegate:Transient
val valueInBytes: ByteArray by lazy { value.toByteArray() }
}

View file

@ -1,5 +1,8 @@
package com.tangem.devkit.extensions
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import androidx.activity.ComponentActivity
import androidx.fragment.app.Fragment
@ -7,6 +10,13 @@ import androidx.fragment.app.Fragment
/**
[REDACTED_AUTHOR]
*/
fun Context.copyToClipboard(value: Any, label: String = "") {
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager ?: return
val clip: ClipData = ClipData.newPlainText(label, value.toString())
clipboard.setPrimaryClip(clip)
}
fun Fragment.shareText(text: String) {
requireActivity().shareText(text)
}

View file

@ -2,12 +2,16 @@ package com.tangem.devkit.ucase.domain.paramsManager.managers
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.OnLifecycleEvent
import com.google.gson.Gson
import com.tangem.TangemSdk
import com.tangem.devkit.commons.Store
import com.tangem.devkit.ucase.domain.actions.PersonalizeAction
import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigConverter
import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationJsonConverter
import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationJson
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
@ -27,6 +31,27 @@ class PersonalizationItemsManager(
action.executeMainAction(this, getAttrsForAction(tangemSdk), callback)
}
fun importJsonConfig(jsonString: String) {
if (jsonString.isEmpty()) return
val jsonDto = try {
Gson().fromJson(jsonString, PersonalizationJson::class.java)
} catch (ex: Exception) {
Log.e(this, "Can't convert imported string to Json object. Error: $ex")
return
}
val config = PersonalizationJsonConverter().aToB(jsonDto)
setItems(converter.convert(config))
}
fun exportJsonConfig(): String {
val config = converter.convert(itemList, PersonalizationConfig.default())
val jsonDto = PersonalizationJsonConverter().bToA(config)
val jsonString = Gson().toJson(jsonDto)
return jsonString
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
val config = converter.convert(itemList, PersonalizationConfig.default())

View file

@ -24,6 +24,7 @@ import com.tangem.devkit._arch.widget.WidgetBuilder
import com.tangem.devkit.commons.DialogController
import com.tangem.devkit.commons.view.MultiActionView
import com.tangem.devkit.commons.view.ViewAction
import com.tangem.devkit.extensions.copyToClipboard
import com.tangem.devkit.extensions.view.beginDelayedTransition
import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
@ -38,6 +39,7 @@ import com.tangem.devkit.ucase.variants.personalize.ui.presets.PersonalizationPr
import com.tangem.devkit.ucase.variants.personalize.ui.presets.RvPresetNamesAdapter
import com.tangem.devkit.ucase.variants.personalize.ui.widgets.PersonalizationItemBuilder
import com.tangem.devkit.ucase.variants.responses.ui.ResponseFragment
import ru.dev.gbixahue.eu4d.lib.android._android.views.afterTextChanged
import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import ru.dev.gbixahue.eu4d.lib.android.global.threading.post
@ -50,7 +52,12 @@ import ru.dev.gbixahue.eu4d.lib.android.global.threading.postWork
*/
class PersonalizationFragment : BaseCardActionFragment(), PersonalizationPresetView {
override val itemsManager: ItemsManager by lazy { PersonalizationItemsManager(PersonalizationConfigStore(requireContext())) }
private lateinit var personalizationItemsManager: PersonalizationItemsManager
override val itemsManager: ItemsManager by lazy {
personalizationItemsManager = PersonalizationItemsManager(PersonalizationConfigStore(requireContext()))
personalizationItemsManager
}
override fun getLayoutId(): Int = R.layout.fg_base_action_layout
@ -106,20 +113,44 @@ class PersonalizationFragment : BaseCardActionFragment(), PersonalizationPresetV
override fun widgetsWasCreated() {
super.widgetsWasCreated()
val btnContainer = contentContainer.inflate<ViewGroup>(R.layout.view_simple_button)
val btn = btnContainer.findViewById<Button>(R.id.button)
val footerContainer = contentContainer.inflate<ViewGroup>(R.layout.fg_personalization_footer)
val show = StringId("show")
val hide = StringId("hide")
val multiAction = MultiActionView(mutableListOf(
ViewAction(show, R.string.show_rare_fields) { actionVM.showFields(ActionType.Personalize) },
ViewAction(hide, R.string.hide_rare_fields) { actionVM.hideFields(ActionType.Personalize) }
), btn)
multiAction.afterAction = {
multiAction.state = if (it == show) hide else show
fun initShowHideBtn(parent: ViewGroup) {
val btn = parent.findViewById<Button>(R.id.btn_show_hide_fields)
val show = StringId("show")
val hide = StringId("hide")
val multiAction = MultiActionView(mutableListOf(
ViewAction(show, R.string.show_rare_fields) { actionVM.showFields(ActionType.Personalize) },
ViewAction(hide, R.string.hide_rare_fields) { actionVM.hideFields(ActionType.Personalize) }
), btn)
multiAction.afterAction = {
multiAction.state = if (it == show) hide else show
}
multiAction.performAction(hide)
}
multiAction.performAction(hide)
contentContainer.addView(btnContainer)
fun initImportExportJson(parent: ViewGroup) {
val tvJsonImport = parent.findViewById<EditText>(R.id.et_json_import)
tvJsonImport.afterTextChanged { personalizationItemsManager.importJsonConfig(it) }
val tvJsonExport = parent.findViewById<TextView>(R.id.tv_json_export)
tvJsonExport.setOnClickListener {
val jsonString = tvJsonExport.text
Log.w(this, jsonString)
requireContext().copyToClipboard(jsonString, "Exported Json")
}
val btnPrepareExport = parent.findViewById<Button>(R.id.btn_prepare_export)
btnPrepareExport.setOnClickListener {
tvJsonExport.text = personalizationItemsManager.exportJsonConfig()
}
}
initShowHideBtn(footerContainer)
initImportExportJson(footerContainer)
contentContainer.addView(footerContainer)
}
override fun handleResponseCardData(card: Card) {

View file

@ -1,11 +1,9 @@
package com.tangem.devkit.ucase.variants.responses.ui.widget
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.view.ViewGroup
import com.tangem.devkit.R
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit.extensions.copyToClipboard
import com.tangem.devkit.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
@ -19,12 +17,8 @@ abstract class ResponseWidget(parent: ViewGroup, item: Item) : DescriptionWidget
init {
view.setOnClickListener {
val data = stringOf(item.getData<Any?>())
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)
view.context.copyToClipboard(clipboardData, "FieldValue")
val copyMessage = view.stringFrom(R.string.copy_to_clipboard)
view.toast("$copyMessage\n$clipboardData")

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/personalization_footer_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/exim_json_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/def_indent"
android:layout_marginEnd="@dimen/def_indent"
android:orientation="vertical"
android:visibility="visible"
tools:visibility="visible">
<EditText
android:id="@+id/et_json_import"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="@string/stub" />
<TextView
android:id="@+id/tv_json_export"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="@string/stub" />
<Button
android:id="@+id/btn_prepare_export"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Prepare json to export" />
</LinearLayout>
<Button
android:id="@+id/btn_show_hide_fields"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/def_indent"
tools:text="Show/Hide fields" />
</LinearLayout>

View file

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>