Updated on 2026-08-14
This commit is contained in:
parent
675b1c418e
commit
7fb63a6a71
7 changed files with 128 additions and 41 deletions
|
|
@ -12,6 +12,7 @@ data class NdefRecord(
|
|||
URI, AAR, TEXT
|
||||
}
|
||||
|
||||
@delegate:Transient
|
||||
val valueInBytes: ByteArray by lazy { value.toByteArray() }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
Loading…
Add table
Add a link
Reference in a new issue