kunfei 3 лет назад
Родитель
Сommit
675640cc64

+ 3 - 16
app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt

@@ -44,6 +44,7 @@ import io.legado.app.ui.book.toc.TocActivityResult
 import io.legado.app.ui.document.HandleFileContract
 import io.legado.app.ui.login.SourceLoginActivity
 import io.legado.app.ui.widget.dialog.PhotoDialog
+import io.legado.app.ui.widget.dialog.VariableDialog
 import io.legado.app.ui.widget.dialog.WaitDialog
 import io.legado.app.utils.*
 import io.legado.app.utils.viewbindingdelegate.viewBinding
@@ -419,22 +420,8 @@ class BookInfoActivity :
                 toastOnUi("书源不存在")
                 return@launch
             }
-            val variable = withContext(IO) { source.getVariable() }
-            alert(R.string.set_source_variable) {
-                setMessage(source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取"))
-                val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
-                    editView.hint = "source variable"
-                    editView.setText(variable)
-                }
-                customView { alertBinding.root }
-                okButton {
-                    viewModel.bookSource?.setVariable(alertBinding.editView.text?.toString())
-                }
-                cancelButton()
-                neutralButton(R.string.delete) {
-                    viewModel.bookSource?.setVariable(null)
-                }
-            }
+            val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取")
+            showDialogFragment(VariableDialog(source.getKey(), comment))
         }
     }
 

+ 7 - 23
app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt

@@ -17,7 +17,6 @@ import io.legado.app.data.appDb
 import io.legado.app.data.entities.BookSource
 import io.legado.app.data.entities.rule.*
 import io.legado.app.databinding.ActivityBookSourceEditBinding
-import io.legado.app.databinding.DialogEditTextBinding
 import io.legado.app.help.config.LocalConfig
 import io.legado.app.lib.dialogs.SelectItem
 import io.legado.app.lib.dialogs.alert
@@ -31,6 +30,7 @@ import io.legado.app.ui.login.SourceLoginActivity
 import io.legado.app.ui.qrcode.QrCodeResult
 import io.legado.app.ui.widget.dialog.TextDialog
 import io.legado.app.ui.widget.dialog.UrlOptionDialog
+import io.legado.app.ui.widget.dialog.VariableDialog
 import io.legado.app.ui.widget.keyboard.KeyboardToolPop
 import io.legado.app.ui.widget.text.EditEntity
 import io.legado.app.utils.*
@@ -593,29 +593,13 @@ class BookSourceEditActivity :
     }
 
     private fun setSourceVariable() {
-        launch {
-            val source = viewModel.bookSource
-            if (source == null) {
-                toastOnUi("先保存书源")
-                return@launch
-            }
-            val variable = withContext(IO) { source.getVariable() }
-            alert(R.string.set_source_variable) {
-                setMessage(source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取"))
-                val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
-                    editView.hint = "source variable"
-                    editView.setText(variable)
-                }
-                customView { alertBinding.root }
-                okButton {
-                    viewModel.bookSource?.setVariable(alertBinding.editView.text?.toString())
-                }
-                cancelButton()
-                neutralButton(R.string.delete) {
-                    viewModel.bookSource?.setVariable(null)
-                }
-            }
+        val source = viewModel.bookSource
+        if (source == null) {
+            toastOnUi("先保存书源")
+            return
         }
+        val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取")
+        showDialogFragment(VariableDialog(source.getKey(), comment))
     }
 
 }

+ 7 - 26
app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt

@@ -12,17 +12,14 @@ import androidx.fragment.app.FragmentStatePagerAdapter
 import io.legado.app.R
 import io.legado.app.base.VMBaseActivity
 import io.legado.app.databinding.ActivityRssArtivlesBinding
-import io.legado.app.databinding.DialogEditTextBinding
 import io.legado.app.help.source.sortUrls
-import io.legado.app.lib.dialogs.alert
 import io.legado.app.lib.theme.accentColor
 import io.legado.app.ui.login.SourceLoginActivity
 import io.legado.app.ui.rss.source.edit.RssSourceEditActivity
+import io.legado.app.ui.widget.dialog.VariableDialog
 import io.legado.app.utils.*
 import io.legado.app.utils.viewbindingdelegate.viewBinding
-import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 
 class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewModel>() {
 
@@ -106,29 +103,13 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
     }
 
     private fun setSourceVariable() {
-        launch {
-            val source = viewModel.rssSource
-            if (source == null) {
-                toastOnUi("源不存在")
-                return@launch
-            }
-            val variable = withContext(Dispatchers.IO) { source.getVariable() }
-            alert(R.string.set_source_variable) {
-                setMessage(source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取"))
-                val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
-                    editView.hint = "source variable"
-                    editView.setText(variable)
-                }
-                customView { alertBinding.root }
-                okButton {
-                    viewModel.rssSource?.setVariable(alertBinding.editView.text?.toString())
-                }
-                cancelButton()
-                neutralButton(R.string.delete) {
-                    viewModel.rssSource?.setVariable(null)
-                }
-            }
+        val source = viewModel.rssSource
+        if (source == null) {
+            toastOnUi("源不存在")
+            return
         }
+        val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取")
+        showDialogFragment(VariableDialog(source.getKey(), comment))
     }
 
     private inner class TabFragmentPageAdapter :

+ 91 - 0
app/src/main/java/io/legado/app/ui/widget/dialog/VariableDialog.kt

@@ -0,0 +1,91 @@
+package io.legado.app.ui.widget.dialog
+
+import android.app.Application
+import android.os.Bundle
+import android.view.MenuItem
+import android.view.View
+import android.view.ViewGroup
+import androidx.appcompat.widget.Toolbar
+import androidx.fragment.app.viewModels
+import io.legado.app.R
+import io.legado.app.base.BaseDialogFragment
+import io.legado.app.base.BaseViewModel
+import io.legado.app.databinding.DialogVariableBinding
+import io.legado.app.help.CacheManager
+import io.legado.app.lib.theme.primaryColor
+import io.legado.app.utils.applyTint
+import io.legado.app.utils.setLayout
+import io.legado.app.utils.viewbindingdelegate.viewBinding
+
+class VariableDialog() : BaseDialogFragment(R.layout.dialog_variable, true),
+    Toolbar.OnMenuItemClickListener {
+
+    private val binding by viewBinding(DialogVariableBinding::bind)
+    private val viewModel by viewModels<ViewModel>()
+
+    constructor(key: String, comment: String) : this() {
+        arguments = Bundle().apply {
+            putString("key", key)
+            putString("comment", comment)
+        }
+    }
+
+    override fun onStart() {
+        super.onStart()
+        setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
+    }
+
+    override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
+        binding.toolBar.setBackgroundColor(primaryColor)
+        arguments?.let {
+            viewModel.init(it) {
+                binding.tvComment.text = viewModel.comment
+                binding.tvVariable.setText(viewModel.mVariable)
+            }
+        }
+        binding.toolBar.inflateMenu(R.menu.save)
+        binding.toolBar.menu.applyTint(requireContext())
+        binding.toolBar.setOnMenuItemClickListener(this)
+    }
+
+    override fun onMenuItemClick(item: MenuItem?): Boolean {
+        when (item?.itemId) {
+            R.id.menu_save -> viewModel.save(binding.tvVariable.text?.toString()) {
+                dismiss()
+            }
+        }
+        return true
+    }
+
+    class ViewModel(application: Application) : BaseViewModel(application) {
+
+        var key: String? = null
+        var comment: String? = null
+        var mVariable: String? = null
+
+        fun init(arguments: Bundle, onFinally: () -> Unit) {
+            if (key != null) return
+            execute {
+                key = arguments.getString("key")
+                comment = arguments.getString("comment")
+                mVariable = CacheManager.get("sourceVariable_${key}")
+            }.onFinally {
+                onFinally.invoke()
+            }
+        }
+
+        fun save(variable: String?, onFinally: () -> Unit) {
+            execute {
+                if (variable == null) {
+                    CacheManager.delete("sourceVariable_${key}")
+                } else {
+                    CacheManager.put("sourceVariable_${key}", variable)
+                }
+            }.onFinally {
+                onFinally.invoke()
+            }
+        }
+
+    }
+
+}

+ 75 - 0
app/src/main/res/layout/dialog_variable.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="16dp">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:background="@drawable/shape_card_view"
+        android:orientation="vertical"
+        tools:ignore="UselessParent">
+
+        <androidx.appcompat.widget.Toolbar
+            android:id="@+id/tool_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/background_menu"
+            android:elevation="5dp"
+            android:theme="?attr/actionBarStyle"
+            app:displayHomeAsUp="false"
+            app:fitStatusBar="false"
+            app:popupTheme="@style/AppTheme.PopupOverlay"
+            app:title="@string/set_source_variable"
+            app:titleTextAppearance="@style/ToolbarTitle" />
+
+        <androidx.core.widget.NestedScrollView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingTop="6dp"
+            android:overScrollMode="ifContentScrolls">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+                <io.legado.app.ui.widget.text.TextInputLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:hint="source variable"
+                    tools:ignore="HardcodedText">
+
+                    <io.legado.app.lib.theme.view.ThemeEditText
+                        android:id="@+id/tv_variable"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
+
+                </io.legado.app.ui.widget.text.TextInputLayout>
+
+                <io.legado.app.ui.widget.text.AccentTextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:padding="3dp"
+                    android:text="@string/variable_comment" />
+
+                <TextView
+                    android:id="@+id/tv_comment"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:padding="3dp"
+                    android:textIsSelectable="true"
+                    android:textColor="@color/secondaryText"/>
+
+            </LinearLayout>
+
+        </androidx.core.widget.NestedScrollView>
+
+    </LinearLayout>
+
+</FrameLayout>

+ 13 - 0
app/src/main/res/menu/save.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:tools="http://schemas.android.com/tools"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    tools:ignore="AlwaysShowAction">
+
+    <item
+        android:id="@+id/menu_save"
+        android:icon="@drawable/ic_save"
+        android:title="@string/action_save"
+        app:showAsAction="always" />
+
+</menu>