|
|
@@ -0,0 +1,156 @@
|
|
|
+package io.legado.app.ui.widget.keyboard
|
|
|
+
|
|
|
+import android.content.Context
|
|
|
+import android.os.Bundle
|
|
|
+import android.view.MenuItem
|
|
|
+import android.view.View
|
|
|
+import android.view.ViewGroup
|
|
|
+import androidx.appcompat.widget.Toolbar
|
|
|
+import androidx.recyclerview.widget.ItemTouchHelper
|
|
|
+import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
+import androidx.recyclerview.widget.RecyclerView
|
|
|
+import io.legado.app.R
|
|
|
+import io.legado.app.base.BaseDialogFragment
|
|
|
+import io.legado.app.base.adapter.ItemViewHolder
|
|
|
+import io.legado.app.base.adapter.RecyclerAdapter
|
|
|
+import io.legado.app.data.appDb
|
|
|
+import io.legado.app.data.entities.KeyboardAssist
|
|
|
+import io.legado.app.databinding.DialogMultipleEditTextBinding
|
|
|
+import io.legado.app.databinding.DialogRecyclerViewBinding
|
|
|
+import io.legado.app.databinding.Item1lineTextAndDelBinding
|
|
|
+import io.legado.app.lib.dialogs.alert
|
|
|
+import io.legado.app.lib.theme.primaryColor
|
|
|
+import io.legado.app.ui.widget.recycler.ItemTouchCallback
|
|
|
+import io.legado.app.ui.widget.recycler.VerticalDivider
|
|
|
+import io.legado.app.utils.applyTint
|
|
|
+import io.legado.app.utils.setLayout
|
|
|
+import io.legado.app.utils.viewbindingdelegate.viewBinding
|
|
|
+import io.legado.app.utils.visible
|
|
|
+import kotlinx.coroutines.Dispatchers.IO
|
|
|
+import kotlinx.coroutines.launch
|
|
|
+
|
|
|
+class KeyboardAssistsConfig : BaseDialogFragment(R.layout.dialog_recycler_view),
|
|
|
+ Toolbar.OnMenuItemClickListener {
|
|
|
+
|
|
|
+ private val binding by viewBinding(DialogRecyclerViewBinding::bind)
|
|
|
+ private val adapter by lazy { KeyAdapter(requireContext()) }
|
|
|
+
|
|
|
+ override fun onStart() {
|
|
|
+ super.onStart()
|
|
|
+ setLayout(0.9f, 0.9f)
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
+ binding.toolBar.setBackgroundColor(primaryColor)
|
|
|
+ binding.toolBar.setTitle(R.string.assists_key_config)
|
|
|
+ initView()
|
|
|
+ initMenu()
|
|
|
+ initData()
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun initView() {
|
|
|
+ binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
|
|
|
+ binding.recyclerView.addItemDecoration(VerticalDivider(requireContext()))
|
|
|
+ binding.recyclerView.adapter = adapter
|
|
|
+ val itemTouchCallback = ItemTouchCallback(adapter)
|
|
|
+ itemTouchCallback.isCanDrag = true
|
|
|
+ ItemTouchHelper(itemTouchCallback).attachToRecyclerView(binding.recyclerView)
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun initMenu() {
|
|
|
+ binding.toolBar.setOnMenuItemClickListener(this)
|
|
|
+ binding.toolBar.inflateMenu(R.menu.keyboard_assists_config)
|
|
|
+ binding.toolBar.menu.applyTint(requireContext())
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun initData() {
|
|
|
+ launch {
|
|
|
+ appDb.keyboardAssistsDao.flowAll.collect {
|
|
|
+ adapter.setItems(it)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onMenuItemClick(item: MenuItem?): Boolean {
|
|
|
+ when (item?.itemId) {
|
|
|
+ R.id.menu_add -> editKey(null)
|
|
|
+ }
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun editKey(keyboardAssist: KeyboardAssist?) {
|
|
|
+ alert {
|
|
|
+ setTitle("辅助按键")
|
|
|
+ val alertBinding = DialogMultipleEditTextBinding.inflate(layoutInflater).apply {
|
|
|
+ layout1.hint = "key"
|
|
|
+ layout2.hint = "value"
|
|
|
+ layout2.visible()
|
|
|
+ }
|
|
|
+ setCustomView(alertBinding.root)
|
|
|
+ cancelButton()
|
|
|
+ okButton {
|
|
|
+ launch(IO) {
|
|
|
+ val newKeyboardAssist = KeyboardAssist(
|
|
|
+ key = alertBinding.edit1.text.toString(),
|
|
|
+ value = alertBinding.edit2.text.toString()
|
|
|
+ )
|
|
|
+ if (keyboardAssist == null) {
|
|
|
+ newKeyboardAssist.serialNo = appDb.keyboardAssistsDao.maxSerialNo + 1
|
|
|
+ appDb.keyboardAssistsDao.insert(newKeyboardAssist)
|
|
|
+ } else {
|
|
|
+ newKeyboardAssist.serialNo = keyboardAssist.serialNo
|
|
|
+ appDb.keyboardAssistsDao.delete(keyboardAssist)
|
|
|
+ appDb.keyboardAssistsDao.insert(newKeyboardAssist)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private inner class KeyAdapter(context: Context) :
|
|
|
+ RecyclerAdapter<KeyboardAssist, Item1lineTextAndDelBinding>(context),
|
|
|
+ ItemTouchCallback.Callback {
|
|
|
+
|
|
|
+ private var isMoved = false
|
|
|
+
|
|
|
+ override fun getViewBinding(parent: ViewGroup): Item1lineTextAndDelBinding {
|
|
|
+ return Item1lineTextAndDelBinding.inflate(inflater, parent, false)
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun convert(
|
|
|
+ holder: ItemViewHolder,
|
|
|
+ binding: Item1lineTextAndDelBinding,
|
|
|
+ item: KeyboardAssist,
|
|
|
+ payloads: MutableList<Any>
|
|
|
+ ) {
|
|
|
+ binding.textView.text = item.key
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun registerListener(holder: ItemViewHolder, binding: Item1lineTextAndDelBinding) {
|
|
|
+ binding.ivDelete.setOnClickListener {
|
|
|
+ getItemByLayoutPosition(holder.layoutPosition)?.let { keyboardAssist ->
|
|
|
+ editKey(keyboardAssist)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun swap(srcPosition: Int, targetPosition: Int): Boolean {
|
|
|
+ swapItem(srcPosition, targetPosition)
|
|
|
+ isMoved = true
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onClearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
|
|
|
+ if (isMoved) {
|
|
|
+ for ((index, item) in getItems().withIndex()) {
|
|
|
+ item.serialNo = index + 1
|
|
|
+ }
|
|
|
+ launch(IO) {
|
|
|
+ appDb.keyboardAssistsDao.update(*getItems().toTypedArray())
|
|
|
+ }
|
|
|
+ }
|
|
|
+ isMoved = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|