From dad0679a74bc28739b9b3465aa7b32f782a180c1 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 12 Dec 2020 21:31:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8D=A2=E6=BA=90=E6=B7=BB=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E7=BB=84=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/data/dao/SearchBookDao.kt | 13 +++-- .../book/changesource/ChangeSourceDialog.kt | 56 ++++++++++++++++--- .../changesource/ChangeSourceViewModel.kt | 15 ++++- app/src/main/res/menu/change_source.xml | 5 ++ 4 files changed, 74 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt b/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt index e2586e3e0..74d33dfeb 100644 --- a/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt @@ -27,22 +27,27 @@ interface SearchBookDao { select t1.name, t1.author, t1.origin, t1.originName, t1.coverUrl, t1.bookUrl, t1.type, t1.time, t1.intro, t1.kind, t1.latestChapterTitle, t1.tocUrl, t1.variable, t1.wordCount, t2.customOrder as originOrder from searchBooks as t1 inner join book_sources as t2 on t1.origin = t2.bookSourceUrl - where t1.name = :name and t1.author = :author and t2.enabled = 1 + where t1.name = :name and t1.author = :author and t2.enabled = 1 and t2.bookSourceGroup like '%'||:sourceGroup||'%' order by t2.customOrder """ ) - fun getByNameAuthorEnable(name: String, author: String): List + fun getChangeSourceSearch(name: String, author: String, sourceGroup: String): List @Query( """ select t1.name, t1.author, t1.origin, t1.originName, t1.coverUrl, t1.bookUrl, t1.type, t1.time, t1.intro, t1.kind, t1.latestChapterTitle, t1.tocUrl, t1.variable, t1.wordCount, t2.customOrder as originOrder from searchBooks as t1 inner join book_sources as t2 on t1.origin = t2.bookSourceUrl - where t1.name = :name and t1.author = :author and originName like '%'||:key||'%' and t2.enabled = 1 + where t1.name = :name and t1.author = :author and originName like '%'||:key||'%' and t2.enabled = 1 and t2.bookSourceGroup like '%'||:sourceGroup||'%' order by t2.customOrder """ ) - fun getChangeSourceSearch(name: String, author: String, key: String): List + fun getChangeSourceSearch( + name: String, + author: String, + key: String, + sourceGroup: String + ): List @Query( """ diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt index 4a2865a54..59348ac86 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt @@ -1,29 +1,26 @@ package io.legado.app.ui.book.changesource import android.os.Bundle -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment +import io.legado.app.constant.AppPattern import io.legado.app.constant.PreferKey import io.legado.app.data.entities.Book import io.legado.app.data.entities.SearchBook import io.legado.app.databinding.DialogChangeSourceBinding import io.legado.app.help.AppConfig import io.legado.app.lib.theme.primaryColor +import io.legado.app.ui.book.source.manage.BookSourceActivity import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.applyTint -import io.legado.app.utils.getSize -import io.legado.app.utils.getViewModel -import io.legado.app.utils.putPrefBoolean +import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding @@ -47,6 +44,7 @@ class ChangeSourceDialog : BaseDialogFragment(), } private val binding by viewBinding(DialogChangeSourceBinding::bind) + private val groups = linkedSetOf() private var callBack: CallBack? = null private lateinit var viewModel: ChangeSourceViewModel lateinit var adapter: ChangeSourceAdapter @@ -90,6 +88,7 @@ class ChangeSourceDialog : BaseDialogFragment(), binding.toolBar.menu.findItem(R.id.menu_load_info)?.isChecked = AppConfig.changeSourceLoadInfo binding.toolBar.menu.findItem(R.id.menu_load_toc)?.isChecked = AppConfig.changeSourceLoadToc + } private fun initRecyclerView() { @@ -150,6 +149,13 @@ class ChangeSourceDialog : BaseDialogFragment(), adapter.setItems(it) diffResult.dispatchUpdatesTo(adapter) }) + App.db.bookSourceDao.liveGroupEnabled().observe(this, { + groups.clear() + it.map { group -> + groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) + } + upGroupMenu() + }) } private val stopMenuItem: MenuItem? @@ -166,6 +172,18 @@ class ChangeSourceDialog : BaseDialogFragment(), item.isChecked = !item.isChecked } R.id.menu_stop -> viewModel.stopSearch() + R.id.menu_source_manage -> startActivity() + else -> if (item?.groupId == R.id.source_group) { + if (!item.isChecked) { + item.isChecked = true + if (item.title.toString() == getString(R.string.all_source)) { + putPrefString("searchGroup", "") + } else { + putPrefString("searchGroup", item.title.toString()) + } + viewModel.stopSearch() + } + } } return false } @@ -184,6 +202,28 @@ class ChangeSourceDialog : BaseDialogFragment(), viewModel.disableSource(searchBook) } + /** + * 更新分组菜单 + */ + private fun upGroupMenu() { + val menu: Menu = binding.toolBar.menu + val selectedGroup = getPrefString("searchGroup") ?: "" + menu.removeGroup(R.id.source_group) + var item = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source) + if (selectedGroup == "") { + item?.isChecked = true + } + groups.sortedWith { o1, o2 -> + o1.cnCompare(o2) + }.map { + item = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it) + if (it == selectedGroup) { + item.isChecked = true + } + } + menu.setGroupCheckable(R.id.source_group, true, true) + } + interface CallBack { val oldBook: Book? fun changeTo(book: Book) diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt index 20a3a159f..f52ad89d5 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt @@ -17,6 +17,7 @@ import io.legado.app.help.AppConfig import io.legado.app.help.coroutine.CompositeCoroutine import io.legado.app.model.webBook.WebBook import io.legado.app.utils.getPrefBoolean +import io.legado.app.utils.getPrefString import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.ExecutorCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher @@ -38,6 +39,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio private val searchBooks = CopyOnWriteArraySet() private var postTime = 0L private val sendRunnable = Runnable { upAdapter() } + private val searchGroup get() = App.INSTANCE.getPrefString("searchGroup") ?: "" @Volatile private var searchIndex = -1 @@ -60,7 +62,9 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio fun loadDbSearchBook() { execute { - App.db.searchBookDao.getByNameAuthorEnable(name, author).let { + searchBooks.clear() + upAdapter() + App.db.searchBookDao.getChangeSourceSearch(name, author, searchGroup).let { searchBooks.addAll(it) if (it.size <= 1) { upAdapter() @@ -98,7 +102,11 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio private fun startSearch() { execute { bookSourceList.clear() - bookSourceList.addAll(App.db.bookSourceDao.allEnabled) + if (searchGroup.isNullOrBlank()) { + bookSourceList.addAll(App.db.bookSourceDao.allEnabled) + } else { + bookSourceList.addAll(App.db.bookSourceDao.getEnabledByGroup(searchGroup)) + } searchStateData.postValue(true) initSearchPool() for (i in 0 until threadCount) { @@ -191,7 +199,8 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio if (key.isNullOrEmpty()) { loadDbSearchBook() } else { - val items = App.db.searchBookDao.getChangeSourceSearch(name, author, screenKey) + val items = + App.db.searchBookDao.getChangeSourceSearch(name, author, screenKey, searchGroup) searchBooks.clear() searchBooks.addAll(items) upAdapter() diff --git a/app/src/main/res/menu/change_source.xml b/app/src/main/res/menu/change_source.xml index 277f93911..c4ed28e6c 100644 --- a/app/src/main/res/menu/change_source.xml +++ b/app/src/main/res/menu/change_source.xml @@ -18,6 +18,11 @@ app:showAsAction="always" tools:ignore="AlwaysShowAction" /> + +