This commit is contained in:
kunfei
2023-03-18 12:10:30 +08:00
parent 22b56b542c
commit 5675dda1bd
6 changed files with 128 additions and 75 deletions
@@ -23,6 +23,14 @@ interface BaseBook : RuleDataInterface {
return true
}
fun putCustomVariable(value: String?) {
putVariable("custom", value)
}
fun getCustomVariable(): String? {
return getVariable("custom")
}
override fun putBigVariable(key: String, value: String?) {
RuleBigDataHelp.putBookVariable(bookUrl, key, value)
}
@@ -18,7 +18,6 @@ import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.BookSource
import io.legado.app.databinding.ActivityBookInfoBinding
import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.AppWebDav
import io.legado.app.help.book.*
@@ -56,7 +55,8 @@ class BookInfoActivity :
VMBaseActivity<ActivityBookInfoBinding, BookInfoViewModel>(toolBarTheme = Theme.Dark),
GroupSelectDialog.CallBack,
ChangeBookSourceDialog.CallBack,
ChangeCoverDialog.CallBack {
ChangeCoverDialog.CallBack,
VariableDialog.Callback {
private val tocActivityResult = registerForActivityResult(TocActivityResult()) {
it?.let {
@@ -421,7 +421,15 @@ class BookInfoActivity :
return@launch
}
val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取")
showDialogFragment(VariableDialog(source.getKey(), comment))
val variable = withContext(IO) { source.getVariable() }
showDialogFragment(
VariableDialog(
getString(R.string.set_source_variable),
source.getKey(),
variable,
comment
)
)
}
}
@@ -432,27 +440,28 @@ class BookInfoActivity :
toastOnUi("书源不存在")
return@launch
}
val variable = withContext(IO) { viewModel.bookData.value?.getVariable("custom") }
alert(R.string.set_source_variable) {
setMessage(source.getDisplayVariableComment("""书籍变量可在js中通过book.getVariable("custom")获取"""))
val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
editView.hint = "book variable"
editView.setText(variable)
}
customView { alertBinding.root }
okButton {
viewModel.bookData.value?.let { book ->
book.putVariable("custom", alertBinding.editView.text?.toString())
viewModel.saveBook(book)
}
}
cancelButton()
neutralButton(R.string.delete) {
viewModel.bookData.value?.let { book ->
book.putVariable("custom", null)
viewModel.saveBook(book)
}
}
val book = viewModel.bookData.value
if (book == null) {
toastOnUi("书籍不存在")
return@launch
}
val variable = withContext(IO) { book.getCustomVariable() }
val comment = source.getDisplayVariableComment("""书籍变量可在js中通过book.getVariable("custom")获取""")
showDialogFragment(VariableDialog(
getString(R.string.set_book_variable),
book.bookUrl,
variable,
comment
))
}
}
override fun setVariable(key: String, variable: String?) {
when(key) {
viewModel.bookSource?.getKey() -> viewModel.bookSource?.setVariable(variable)
viewModel.bookData.value?.bookUrl -> viewModel.bookData.value?.let {
it.putCustomVariable(variable)
viewModel.saveBook(it)
}
}
}
@@ -41,7 +41,8 @@ import kotlinx.coroutines.withContext
class BookSourceEditActivity :
VMBaseActivity<ActivityBookSourceEditBinding, BookSourceEditViewModel>(false),
KeyboardToolPop.CallBack {
KeyboardToolPop.CallBack,
VariableDialog.Callback {
override val binding by viewBinding(ActivityBookSourceEditBinding::inflate)
override val viewModel by viewModels<BookSourceEditViewModel>()
@@ -593,13 +594,27 @@ class BookSourceEditActivity :
}
private fun setSourceVariable() {
val source = viewModel.bookSource
if (source == null) {
toastOnUi("先保存书源")
return
launch {
val source = viewModel.bookSource
if (source == null) {
toastOnUi("先保存书源")
return@launch
}
val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取")
val variable = withContext(IO) { source.getVariable() }
showDialogFragment(
VariableDialog(
getString(R.string.set_source_variable),
source.getKey(),
variable,
comment
)
)
}
val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取")
showDialogFragment(VariableDialog(source.getKey(), comment))
}
override fun setVariable(key: String, variable: String?) {
viewModel.bookSource?.setVariable(variable)
}
}
@@ -19,9 +19,12 @@ 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>() {
class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewModel>(),
VariableDialog.Callback {
override val binding by viewBinding(ActivityRssArtivlesBinding::inflate)
override val viewModel by viewModels<RssSortViewModel>()
@@ -103,13 +106,27 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
}
private fun setSourceVariable() {
val source = viewModel.rssSource
if (source == null) {
toastOnUi("源不存在")
return
launch {
val source = viewModel.rssSource
if (source == null) {
toastOnUi("源不存在")
return@launch
}
val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取")
val variable = withContext(Dispatchers.IO) { source.getVariable() }
showDialogFragment(
VariableDialog(
getString(R.string.set_source_variable),
source.getKey(),
variable,
comment
)
)
}
val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取")
showDialogFragment(VariableDialog(source.getKey(), comment))
}
override fun setVariable(key: String, variable: String?) {
viewModel.rssSource?.setVariable(variable)
}
private inner class TabFragmentPageAdapter :
@@ -11,7 +11,6 @@ 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
@@ -23,9 +22,11 @@ class VariableDialog() : BaseDialogFragment(R.layout.dialog_variable, true),
private val binding by viewBinding(DialogVariableBinding::bind)
private val viewModel by viewModels<ViewModel>()
constructor(key: String, comment: String) : this() {
constructor(title: String, key: String, variable: String?, comment: String) : this() {
arguments = Bundle().apply {
putString("title", title)
putString("key", key)
putString("variable", variable)
putString("comment", comment)
}
}
@@ -38,10 +39,14 @@ class VariableDialog() : BaseDialogFragment(R.layout.dialog_variable, true),
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
binding.toolBar.setBackgroundColor(primaryColor)
arguments?.let {
binding.toolBar.title = it.getString("title")
viewModel.init(it) {
binding.tvComment.text = viewModel.comment
binding.tvVariable.setText(viewModel.mVariable)
binding.tvVariable.setText(viewModel.variable)
}
} ?: let {
dismiss()
return
}
binding.toolBar.inflateMenu(R.menu.save)
binding.toolBar.menu.applyTint(requireContext())
@@ -50,37 +55,31 @@ class VariableDialog() : BaseDialogFragment(R.layout.dialog_variable, true),
override fun onMenuItemClick(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.menu_save -> viewModel.save(binding.tvVariable.text?.toString()) {
dismiss()
R.id.menu_save -> {
callback?.setVariable(
viewModel.key ?: "",
binding.tvVariable.text?.toString()
)
dismissAllowingStateLoss()
}
}
return true
}
val callback get() = (parentFragment as? Callback) ?: (activity as? Callback)
class ViewModel(application: Application) : BaseViewModel(application) {
var key: String? = null
var comment: String? = null
var mVariable: String? = null
var variable: 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)
}
variable = arguments.getString("variable")
}.onFinally {
onFinally.invoke()
}
@@ -88,4 +87,10 @@ class VariableDialog() : BaseDialogFragment(R.layout.dialog_variable, true),
}
interface Callback {
fun setVariable(key: String, variable: String?)
}
}
+17 -18
View File
@@ -23,14 +23,27 @@
android:theme="?attr/actionBarStyle"
app:displayHomeAsUp="false"
app:fitStatusBar="false"
app:title="Set variable"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/set_source_variable"
app:titleTextAppearance="@style/ToolbarTitle" />
<io.legado.app.ui.widget.text.AccentTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="3dp"
android:text="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" />
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="6dp"
android:overScrollMode="ifContentScrolls">
<LinearLayout
@@ -38,20 +51,6 @@
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"
@@ -63,8 +62,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="3dp"
android:textIsSelectable="true"
android:textColor="@color/secondaryText"/>
android:textColor="@color/secondaryText"
android:textIsSelectable="true" />
</LinearLayout>