This commit is contained in:
kunfei
2023-02-20 15:16:49 +08:00
parent 0f8899f996
commit 10049639a8
18 changed files with 175 additions and 52 deletions

View File

@@ -284,6 +284,11 @@
android:name=".ui.about.ReadRecordActivity"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true" />
<!-- 字典管理 -->
<activity
android:name=".ui.dict.rule.DictRuleActivity"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true" />
<!-- 选择文件 -->
<activity
android:name=".ui.document.HandleFileActivity"

View File

@@ -11,13 +11,13 @@ import kotlinx.coroutines.flow.Flow
@Dao
interface DictRuleDao {
@get:Query("select * from dictRules")
@get:Query("select * from dictRules order by sortNumber")
val all: List<DictRule>
@get:Query("select * from dictRules where enabled = 1")
@get:Query("select * from dictRules where enabled = 1 order by sortNumber")
val enabled: List<DictRule>
@Query("select * from dictRules where enabled = 1")
@Query("select * from dictRules where enabled = 1 order by sortNumber")
fun flowAll(): Flow<List<DictRule>>
@Upsert

View File

@@ -12,7 +12,7 @@ import io.legado.app.model.analyzeRule.AnalyzeUrl
@Entity(tableName = "dictRules")
data class DictRule(
@PrimaryKey
val name: String,
var name: String,
var urlRule: String,
var showRule: String,
@ColumnInfo(defaultValue = "1")

View File

@@ -1,6 +1,7 @@
package io.legado.app.ui.dict.rule
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.activity.viewModels
import androidx.appcompat.widget.PopupMenu
@@ -36,6 +37,11 @@ class DictRuleActivity : VMBaseActivity<ActivityDictRuleBinding, DictRuleViewMod
observeDictRuleData()
}
override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.dict_rule, menu)
return super.onCompatCreateOptionsMenu(menu)
}
private fun initRecyclerView() {
binding.recyclerView.setEdgeEffectColor(primaryColor)
binding.recyclerView.layoutManager = LinearLayoutManager(this)
@@ -53,6 +59,7 @@ class DictRuleActivity : VMBaseActivity<ActivityDictRuleBinding, DictRuleViewMod
ItemTouchHelper(itemTouchCallback).attachToRecyclerView(binding.recyclerView)
}
private fun initSelectActionView() {
binding.selectActionBar.setMainActionText(R.string.delete)
binding.selectActionBar.inflateMenu(R.menu.replace_rule_sel)
@@ -68,12 +75,11 @@ class DictRuleActivity : VMBaseActivity<ActivityDictRuleBinding, DictRuleViewMod
}
}
override fun selectAll(selectAll: Boolean) {
adapter.selectAll()
}
override fun revertSelection() {
adapter.revertSelection()
override fun onContextItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_create -> {}
}
return super.onContextItemSelected(item)
}
override fun onMenuItemClick(item: MenuItem): Boolean {
@@ -83,6 +89,18 @@ class DictRuleActivity : VMBaseActivity<ActivityDictRuleBinding, DictRuleViewMod
return true
}
override fun selectAll(selectAll: Boolean) {
if (selectAll) {
adapter.revertSelection()
} else {
adapter.selectAll()
}
}
override fun revertSelection() {
adapter.revertSelection()
}
override fun update(vararg rule: DictRule) {
viewModel.upsert(*rule)
}
@@ -92,19 +110,11 @@ class DictRuleActivity : VMBaseActivity<ActivityDictRuleBinding, DictRuleViewMod
}
override fun edit(rule: DictRule) {
TODO("Not yet implemented")
}
override fun toTop(rule: DictRule) {
TODO("Not yet implemented")
}
override fun toBottom(rule: DictRule) {
TODO("Not yet implemented")
}
override fun upOrder() {
TODO("Not yet implemented")
viewModel.upSortNumber()
}
override fun upCountView() {

View File

@@ -2,17 +2,14 @@ package io.legado.app.ui.dict.rule
import android.content.Context
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.PopupMenu
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.RecyclerAdapter
import io.legado.app.data.entities.DictRule
import io.legado.app.databinding.ItemReplaceRuleBinding
import io.legado.app.databinding.ItemDictRuleBinding
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.ui.widget.recycler.DragSelectTouchHelper
import io.legado.app.ui.widget.recycler.ItemTouchCallback
@@ -20,7 +17,7 @@ import io.legado.app.utils.ColorUtils
class DictRuleAdapter(context: Context, var callBack: CallBack) :
RecyclerAdapter<DictRule, ItemReplaceRuleBinding>(context),
RecyclerAdapter<DictRule, ItemDictRuleBinding>(context),
ItemTouchCallback.Callback {
private val selected = linkedSetOf<DictRule>()
@@ -83,8 +80,8 @@ class DictRuleAdapter(context: Context, var callBack: CallBack) :
callBack.upCountView()
}
override fun getViewBinding(parent: ViewGroup): ItemReplaceRuleBinding {
return ItemReplaceRuleBinding.inflate(inflater, parent, false)
override fun getViewBinding(parent: ViewGroup): ItemDictRuleBinding {
return ItemDictRuleBinding.inflate(inflater, parent, false)
}
override fun onCurrentListChanged() {
@@ -93,7 +90,7 @@ class DictRuleAdapter(context: Context, var callBack: CallBack) :
override fun convert(
holder: ItemViewHolder,
binding: ItemReplaceRuleBinding,
binding: ItemDictRuleBinding,
item: DictRule,
payloads: MutableList<Any>
) {
@@ -116,7 +113,7 @@ class DictRuleAdapter(context: Context, var callBack: CallBack) :
}
}
override fun registerListener(holder: ItemViewHolder, binding: ItemReplaceRuleBinding) {
override fun registerListener(holder: ItemViewHolder, binding: ItemDictRuleBinding) {
binding.apply {
swtEnabled.setOnCheckedChangeListener { buttonView, isChecked ->
if (buttonView.isPressed) {
@@ -126,11 +123,6 @@ class DictRuleAdapter(context: Context, var callBack: CallBack) :
}
}
}
ivEdit.setOnClickListener {
getItem(holder.layoutPosition)?.let {
callBack.edit(it)
}
}
cbName.setOnClickListener {
getItem(holder.layoutPosition)?.let {
if (cbName.isChecked) {
@@ -141,27 +133,19 @@ class DictRuleAdapter(context: Context, var callBack: CallBack) :
}
callBack.upCountView()
}
ivMenuMore.setOnClickListener {
showMenu(ivMenuMore, holder.layoutPosition)
ivEdit.setOnClickListener {
getItem(holder.layoutPosition)?.let {
callBack.edit(it)
}
}
ivDelete.setOnClickListener {
getItem(holder.layoutPosition)?.let {
callBack.delete(it)
}
}
}
}
private fun showMenu(view: View, position: Int) {
val item = getItem(position) ?: return
val popupMenu = PopupMenu(context, view)
popupMenu.inflate(R.menu.replace_rule_item)
popupMenu.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.menu_top -> callBack.toTop(item)
R.id.menu_bottom -> callBack.toBottom(item)
R.id.menu_del -> callBack.delete(item)
}
true
}
popupMenu.show()
}
override fun swap(srcPosition: Int, targetPosition: Int): Boolean {
val srcItem = getItem(srcPosition)
val targetItem = getItem(targetPosition)
@@ -218,8 +202,6 @@ class DictRuleAdapter(context: Context, var callBack: CallBack) :
fun update(vararg rule: DictRule)
fun delete(rule: DictRule)
fun edit(rule: DictRule)
fun toTop(rule: DictRule)
fun toBottom(rule: DictRule)
fun upOrder()
fun upCountView()
}

View File

@@ -20,4 +20,14 @@ class DictRuleViewModel(application: Application) : BaseViewModel(application) {
}
}
fun upSortNumber() {
execute {
val rules = appDb.dictRuleDao.all
for ((index, rule) in rules.withIndex()) {
rule.sortNumber = index + 1
}
appDb.dictRuleDao.upsert(*rules.toTypedArray())
}
}
}

View File

@@ -27,6 +27,7 @@ import io.legado.app.ui.book.bookmark.AllBookmarkActivity
import io.legado.app.ui.book.source.manage.BookSourceActivity
import io.legado.app.ui.config.ConfigActivity
import io.legado.app.ui.config.ConfigTag
import io.legado.app.ui.dict.rule.DictRuleActivity
import io.legado.app.ui.replace.ReplaceRuleActivity
import io.legado.app.ui.widget.dialog.TextDialog
import io.legado.app.utils.*
@@ -136,6 +137,7 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) {
when (preference.key) {
"bookSourceManage" -> startActivity<BookSourceActivity>()
"replaceManage" -> startActivity<ReplaceRuleActivity>()
"dictRuleManage" -> startActivity<DictRuleActivity>()
"bookmark" -> startActivity<AllBookmarkActivity>()
"setting" -> startActivity<ConfigActivity> {
putExtra("configTag", ConfigTag.OTHER_CONFIG)

View File

@@ -0,0 +1,10 @@
<vector android:height="24dp"
android:tint="#000000"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<path
android:fillColor="@android:color/white"
android:pathData="M14.12,10.47L12,12.59l-2.13,-2.12 -1.41,1.41L10.59,14l-2.12,2.12 1.41,1.41L12,15.41l2.12,2.12 1.41,-1.41L13.41,14l2.12,-2.12zM15.5,4l-1,-1h-5l-1,1H5v2h14V4zM6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM8,9h8v10H8V9z" />
</vector>

View File

@@ -0,0 +1,48 @@
<?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:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="8dp">
<io.legado.app.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
tools:ignore="RtlSymmetry" />
<io.legado.app.lib.theme.view.ThemeSwitch
android:id="@+id/swt_enabled"
android:name="@string/enable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp"
android:layout_marginRight="6dp"
tools:ignore="RtlSymmetry" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_edit"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="center"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/edit"
android:padding="6dp"
android:src="@drawable/ic_edit"
android:tint="@color/primaryText" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_delete"
android:layout_width="36dp"
android:layout_height="36dp"
android:padding="6dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_outline_delete"
android:tint="@color/primaryText"
android:contentDescription="@string/delete"
tools:ignore="RtlHardcoded" />
</LinearLayout>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_create"
android:icon="@drawable/ic_add"
android:title="@string/create"
app:showAsAction="never" />
<item
android:id="@+id/menu_import_local"
android:icon="@drawable/ic_import"
android:title="@string/import_local"
app:showAsAction="never" />
<item
android:id="@+id/menu_import_onLine"
android:icon="@drawable/ic_import"
android:title="@string/import_on_line"
app:showAsAction="never" />
<item
android:id="@+id/menu_import_qr"
android:icon="@drawable/ic_import"
android:title="@string/import_by_qr_code"
app:showAsAction="never" />
<item
android:id="@+id/menu_help"
android:icon="@drawable/ic_help"
android:title="@string/help"
app:showAsAction="never" />
</menu>

View File

@@ -1073,4 +1073,6 @@
<string name="clear_webview_data_summary">清除内置浏览器所有数据</string>
<string name="source_tab_list">列表</string>
<string name="dict_rule">字典规则</string>
<string name="config_dict_rule">配置字典规则</string>
<string name="create">新建</string>
</resources>

View File

@@ -1076,4 +1076,6 @@
<string name="clear_webview_data_summary">清除内置浏览器所有数据</string>
<string name="source_tab_list">列表</string>
<string name="dict_rule">字典规则</string>
<string name="config_dict_rule">配置字典规则</string>
<string name="create">新建</string>
</resources>

View File

@@ -1076,4 +1076,6 @@
<string name="clear_webview_data_summary">清除内置浏览器所有数据</string>
<string name="source_tab_list">列表</string>
<string name="dict_rule">字典规则</string>
<string name="config_dict_rule">配置字典规则</string>
<string name="create">新建</string>
</resources>

View File

@@ -1073,4 +1073,6 @@
<string name="clear_webview_data_summary">清除内置浏览器所有数据</string>
<string name="source_tab_list">列表</string>
<string name="dict_rule">字典规则</string>
<string name="config_dict_rule">配置字典规则</string>
<string name="create">新建</string>
</resources>

View File

@@ -1075,4 +1075,6 @@
<string name="clear_webview_data_summary">清除内置浏览器所有数据</string>
<string name="source_tab_list">列表</string>
<string name="dict_rule">字典规则</string>
<string name="config_dict_rule">配置字典规则</string>
<string name="create">新建</string>
</resources>

View File

@@ -1075,4 +1075,6 @@
<string name="clear_webview_data_summary">清除内置浏览器所有数据</string>
<string name="source_tab_list">列表</string>
<string name="dict_rule">字典规则</string>
<string name="config_dict_rule">配置字典规则</string>
<string name="create">新建</string>
</resources>

View File

@@ -1076,4 +1076,6 @@
<string name="clear_webview_data_summary">清除内置浏览器所有数据</string>
<string name="source_tab_list">List</string>
<string name="dict_rule">Dict rule</string>
<string name="config_dict_rule">Config dict rule</string>
<string name="create">新建</string>
</resources>

View File

@@ -19,6 +19,13 @@
android:icon="@drawable/ic_cfg_replace"
app:iconSpaceReserved="false" />
<io.legado.app.lib.prefs.Preference
android:key="dictRuleManage"
android:title="@string/dict_rule"
android:summary="@string/config_dict_rule"
android:icon="@drawable/ic_translate"
app:iconSpaceReserved="false" />
<io.legado.app.lib.prefs.NameListPreference
android:defaultValue="0"
android:entries="@array/theme_mode"