diff --git a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt index c9aff1b65..e1f181adb 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt @@ -1,8 +1,12 @@ package io.legado.app.data.dao import androidx.room.* +import io.legado.app.constant.AppPattern import io.legado.app.data.entities.BookSource +import io.legado.app.utils.cnCompare +import io.legado.app.utils.splitNotBlank import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map @Dao interface BookSourceDao { @@ -82,7 +86,7 @@ interface BookSourceDao { fun flowGroupExplore(key: String): Flow> @Query("select distinct bookSourceGroup from book_sources where trim(bookSourceGroup) <> ''") - fun flowGroup(): Flow> + fun flowGroupsUnDeal(): Flow> @Query("select distinct bookSourceGroup from book_sources where enabled = 1 and trim(bookSourceGroup) <> ''") fun flowGroupEnabled(): Flow> @@ -127,8 +131,8 @@ interface BookSourceDao { @get:Query("select * from book_sources where enabled = 1 and bookSourceType = 0 order by customOrder") val allTextEnabled: List - @get:Query("select distinct bookSourceGroup from book_sources where trim(bookSourceGroup) <> ''") - val allGroup: List + @Query("select distinct bookSourceGroup from book_sources where trim(bookSourceGroup) <> ''") + fun getAllGroupsUnDeal(): List @Query("select * from book_sources where bookSourceUrl = :key") fun getBookSource(key: String): BookSource? @@ -153,4 +157,27 @@ interface BookSourceDao { @get:Query("select max(customOrder) from book_sources") val maxOrder: Int + + fun dealGroups(list: List): List { + val groups = linkedSetOf() + list.forEach { + it.splitNotBlank(AppPattern.splitGroupRegex).forEach { group -> + groups.add(group) + } + } + return groups.sortedWith { o1, o2 -> + o1.cnCompare(o2) + } + } + + val allGroups: List + get() { + return dealGroups(getAllGroupsUnDeal()) + } + + fun flowGroups(): Flow> { + return flowGroupsUnDeal().map { list -> + dealGroups(list) + } + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt index 3b463ab2d..1b0d00893 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt @@ -14,7 +14,6 @@ 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.constant.AppPattern import io.legado.app.constant.PreferKey import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource @@ -158,10 +157,7 @@ class ImportBookSourceDialog() : BaseDialogFragment(R.layout.dialog_recycler_vie private fun alertCustomGroup(item: MenuItem) { alert(R.string.diy_edit_source_group) { val alertBinding = DialogCustomGroupBinding.inflate(layoutInflater).apply { - val groups = linkedSetOf() - appDb.bookSourceDao.allGroup.forEach { group -> - groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) - } + val groups = appDb.bookSourceDao.allGroups textInputLayout.setHint(R.string.group_name) editView.setFilterValues(groups.toList()) editView.dropDownHeight = 180.dpToPx() diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt index b1e799e51..e62848eb0 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt @@ -12,12 +12,14 @@ import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.BookType +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.help.config.LocalConfig import io.legado.app.lib.dialogs.SelectItem import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.dialogs.selector import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.backgroundColor import io.legado.app.lib.theme.primaryColor @@ -30,6 +32,9 @@ import io.legado.app.ui.widget.dialog.UrlOptionDialog import io.legado.app.ui.widget.keyboard.KeyboardToolPop import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class BookSourceEditActivity : VMBaseActivity(false), @@ -484,21 +489,38 @@ class BookSourceEditActivity : return true } + private fun alertGroups() { + launch { + val groups = withContext(IO) { + appDb.bookSourceDao.allGroups + } + selector(groups) { _, s, _ -> + sendText(s) + } + } + } + override fun helpActions(): List> { - return arrayListOf( + val helpActions = arrayListOf( SelectItem("插入URL参数", "urlOption"), SelectItem("书源教程", "ruleHelp"), SelectItem("js教程", "jsHelp"), SelectItem("正则教程", "regexHelp"), SelectItem("选择文件", "selectFile"), ) + val view = window.decorView.findFocus() + if (view is EditText && view.getTag(R.id.tag) == "bookSourceGroup") { + helpActions.add( + SelectItem("插入分组", "addGroup") + ) + } + return helpActions } override fun onHelpActionSelect(action: String) { when (action) { - "urlOption" -> UrlOptionDialog(this) { - sendText(it) - }.show() + "addGroup" -> alertGroups() + "urlOption" -> UrlOptionDialog(this) { sendText(it) }.show() "ruleHelp" -> showHelp("ruleHelp") "jsHelp" -> showHelp("jsHelp") "regexHelp" -> showHelp("regexHelp") diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditAdapter.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditAdapter.kt index c8cc94d82..0b2c7114b 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditAdapter.kt @@ -42,6 +42,7 @@ class BookSourceEditAdapter : RecyclerView.Adapter - groupStr.splitNotBlank(AppPattern.splitGroupRegex).forEach { group -> - if (group != noGroupName) { - groups.add(group) - } - } - } + groups.addAll(it) upGroupMenu() } } @@ -453,9 +445,7 @@ class BookSourceActivity : VMBaseActivity menu.removeGroup(R.id.source_group) - groups.sortedWith { o1, o2 -> - o1.cnCompare(o2) - }.map { + groups.forEach { menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it) } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/GroupManageDialog.kt index 3b3534caa..2e2cf5860 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/GroupManageDialog.kt @@ -13,7 +13,6 @@ 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.constant.AppPattern import io.legado.app.data.appDb import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogRecyclerViewBinding @@ -22,7 +21,9 @@ import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.backgroundColor import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.* +import io.legado.app.utils.applyTint +import io.legado.app.utils.requestInputMethod +import io.legado.app.utils.setLayout import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.launch @@ -54,16 +55,8 @@ class GroupManageDialog : BaseDialogFragment(R.layout.dialog_recycler_view), private fun initData() { launch { - appDb.bookSourceDao.flowGroup().collect { - val groups = linkedSetOf() - it.map { group -> - groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) - } - adapter.setItems( - groups.sortedWith { o1, o2 -> - o1.cnCompare(o2) - } - ) + appDb.bookSourceDao.flowGroups().collect { + adapter.setItems(it) } } } diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index c80e30395..a854e3f0d 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -1,6 +1,7 @@ +