换源添加分组选择

pull/540/head
gedoor 5 years ago
parent f8bda2deda
commit dad0679a74
  1. 13
      app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt
  2. 56
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt
  3. 13
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt
  4. 5
      app/src/main/res/menu/change_source.xml

@ -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<SearchBook>
fun getChangeSourceSearch(name: String, author: String, sourceGroup: String): List<SearchBook>
@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<SearchBook>
fun getChangeSourceSearch(
name: String,
author: String,
key: String,
sourceGroup: String
): List<SearchBook>
@Query(
"""

@ -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<String>()
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<BookSourceActivity>()
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)

@ -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<SearchBook>()
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()
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()

@ -18,6 +18,11 @@
app:showAsAction="always"
tools:ignore="AlwaysShowAction" />
<item
android:id="@+id/book_source_manage"
android:title="@string/book_source_manage"
app:showAsAction="never" />
<item
android:id="@+id/menu_load_info"
android:title="@string/load_info"

Loading…
Cancel
Save