mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
* 修复一些bug
|
||||
* webDav书籍排序
|
||||
* 更新一些库
|
||||
* web端支持自定义字体 by qianfanguojin
|
||||
|
||||
**2022/06/23**
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,3 +1,3 @@
|
||||
<!DOCTYPE html><html lang="zh-CN" style="padding: 0;height:100%"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"><link rel="icon" href="../favicon.ico" type="image/x-icon"><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon"><title>Legado Bookshelf</title><link href="css/about.4f195837.css" rel="prefetch"><link href="css/detail.c0f21c6a.css" rel="prefetch"><link href="js/about.f487d340.js" rel="prefetch"><link href="js/detail.42f382aa.js" rel="prefetch"><link href="css/app.e4c919b7.css" rel="preload" as="style"><link href="css/chunk-vendors.bd1373b6.css" rel="preload" as="style"><link href="js/app.ee9eb4c0.js" rel="preload" as="script"><link href="js/chunk-vendors.df82d22c.js" rel="preload" as="script"><link href="css/chunk-vendors.bd1373b6.css" rel="stylesheet"><link href="css/app.e4c919b7.css" rel="stylesheet"></head><style>body::-webkit-scrollbar {
|
||||
<!DOCTYPE html><html lang="zh-CN" style="padding: 0;height:100%"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"><link rel="icon" href="../favicon.ico" type="image/x-icon"><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon"><title>Legado Bookshelf</title><link href="css/about.4f195837.css" rel="prefetch"><link href="css/detail.155c6df5.css" rel="prefetch"><link href="js/about.08e76f2a.js" rel="prefetch"><link href="js/detail.dd732add.js" rel="prefetch"><link href="css/app.e4c919b7.css" rel="preload" as="style"><link href="css/chunk-vendors.57f380c8.css" rel="preload" as="style"><link href="js/app.ca73b4d5.js" rel="preload" as="script"><link href="js/chunk-vendors.3b68c70a.js" rel="preload" as="script"><link href="css/chunk-vendors.57f380c8.css" rel="stylesheet"><link href="css/app.e4c919b7.css" rel="stylesheet"></head><style>body::-webkit-scrollbar {
|
||||
display: none;
|
||||
}</style><body style="margin: 0;height:100%"><noscript><strong>We're sorry but yd-web-tool doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.df82d22c.js"></script><script src="js/app.ee9eb4c0.js"></script></body></html>
|
||||
}</style><body style="margin: 0;height:100%"><noscript><strong>We're sorry but yd-web-tool doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.3b68c70a.js"></script><script src="js/app.ca73b4d5.js"></script></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -16,7 +16,7 @@ import splitties.init.appCtx
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.math.min
|
||||
|
||||
class SearchModel(private val scope: CoroutineScope) {
|
||||
class SearchModel(private val scope: CoroutineScope, private val callBack: CallBack) {
|
||||
val threadCount = AppConfig.threadCount
|
||||
private var searchPool: ExecutorCoroutineDispatcher? = null
|
||||
private var mSearchId = 0L
|
||||
@@ -25,19 +25,10 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
private var tasks = CompositeCoroutine()
|
||||
private var bookSourceList = arrayListOf<BookSource>()
|
||||
private var searchBooks = arrayListOf<SearchBook>()
|
||||
private var callBack: CallBack? = null
|
||||
|
||||
@Volatile
|
||||
private var searchIndex = -1
|
||||
|
||||
fun registerCallback(callBack: CallBack) {
|
||||
this.callBack = callBack
|
||||
}
|
||||
|
||||
fun unRegisterCallback() {
|
||||
this.callBack = null
|
||||
}
|
||||
|
||||
private fun initSearchPool() {
|
||||
searchPool?.close()
|
||||
searchPool = Executors
|
||||
@@ -45,10 +36,10 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
}
|
||||
|
||||
fun search(searchId: Long, key: String) {
|
||||
callBack?.onSearchStart()
|
||||
callBack.onSearchStart()
|
||||
if (searchId != mSearchId) {
|
||||
if (key.isEmpty()) {
|
||||
callBack?.onSearchCancel()
|
||||
callBack.onSearchCancel()
|
||||
return
|
||||
} else {
|
||||
this.searchKey = key
|
||||
@@ -62,7 +53,7 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
val searchGroup = AppConfig.searchGroup
|
||||
bookSourceList.clear()
|
||||
searchBooks.clear()
|
||||
callBack?.onSearchSuccess(searchBooks)
|
||||
callBack.onSearchSuccess(searchBooks)
|
||||
if (searchGroup.isBlank()) {
|
||||
bookSourceList.addAll(appDb.bookSourceDao.allEnabled)
|
||||
} else {
|
||||
@@ -114,7 +105,7 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
appDb.searchBookDao.insert(*items.toTypedArray())
|
||||
val precision = appCtx.getPrefBoolean(PreferKey.precisionSearch)
|
||||
mergeItems(scope, items, precision)
|
||||
callBack?.onSearchSuccess(searchBooks)
|
||||
callBack.onSearchSuccess(searchBooks)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +119,7 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
if (searchIndex >= bookSourceList.lastIndex
|
||||
+ min(bookSourceList.size, threadCount)
|
||||
) {
|
||||
callBack?.onSearchFinish(searchBooks.isEmpty())
|
||||
callBack.onSearchFinish(searchBooks.isEmpty())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,7 +192,7 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
|
||||
fun cancelSearch() {
|
||||
close()
|
||||
callBack?.onSearchCancel()
|
||||
callBack.onSearchCancel()
|
||||
}
|
||||
|
||||
fun close() {
|
||||
|
||||
@@ -86,12 +86,12 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
||||
|
||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
binding.llHistory.setBackgroundColor(backgroundColor)
|
||||
viewModel.searchFinishCallback = searchFinishCallback
|
||||
initRecyclerView()
|
||||
initSearchView()
|
||||
initOtherView()
|
||||
initData()
|
||||
receiptIntent(intent)
|
||||
viewModel.searchFinishCallback = searchFinishCallback
|
||||
}
|
||||
|
||||
override fun onNewIntent(data: Intent?) {
|
||||
@@ -219,6 +219,13 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
||||
}
|
||||
|
||||
private fun initData() {
|
||||
viewModel.isSearchLiveData.observe(this) {
|
||||
if (it) {
|
||||
startSearch()
|
||||
} else {
|
||||
searchFinally()
|
||||
}
|
||||
}
|
||||
lifecycleScope.launchWhenStarted {
|
||||
viewModel.searchDataFlow.conflate().collect {
|
||||
adapter.setItems(it)
|
||||
@@ -234,13 +241,6 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
||||
upGroupMenu()
|
||||
}
|
||||
}
|
||||
viewModel.isSearchLiveData.observe(this) {
|
||||
if (it) {
|
||||
startSearch()
|
||||
} else {
|
||||
searchFinally()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun receiptIntent(intent: Intent? = null) {
|
||||
|
||||
@@ -14,37 +14,37 @@ import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
|
||||
class SearchViewModel(application: Application) : BaseViewModel(application) {
|
||||
private val searchModel = SearchModel(viewModelScope)
|
||||
private val searchModel = SearchModel(viewModelScope, object : SearchModel.CallBack {
|
||||
override fun onSearchStart() {
|
||||
isSearchLiveData.postValue(true)
|
||||
}
|
||||
|
||||
override fun onSearchSuccess(searchBooks: ArrayList<SearchBook>) {
|
||||
searchFlowCallBack?.invoke(searchBooks)
|
||||
}
|
||||
|
||||
override fun onSearchFinish(isEmpty: Boolean) {
|
||||
isSearchLiveData.postValue(false)
|
||||
searchFinishCallback?.invoke(isEmpty)
|
||||
}
|
||||
|
||||
override fun onSearchCancel() {
|
||||
isSearchLiveData.postValue(false)
|
||||
}
|
||||
})
|
||||
var searchFinishCallback: ((isEmpty: Boolean) -> Unit)? = null
|
||||
var isSearchLiveData = MutableLiveData<Boolean>()
|
||||
var searchKey: String = ""
|
||||
private var searchID = 0L
|
||||
|
||||
private var searchFlowCallBack: ((searchBooks: ArrayList<SearchBook>) -> Unit)? = null
|
||||
val searchDataFlow = callbackFlow {
|
||||
|
||||
val callback = object : SearchModel.CallBack {
|
||||
override fun onSearchStart() {
|
||||
isSearchLiveData.postValue(true)
|
||||
}
|
||||
|
||||
override fun onSearchSuccess(searchBooks: ArrayList<SearchBook>) {
|
||||
trySend(ArrayList(searchBooks))
|
||||
}
|
||||
|
||||
override fun onSearchFinish(isEmpty: Boolean) {
|
||||
isSearchLiveData.postValue(false)
|
||||
searchFinishCallback?.invoke(isEmpty)
|
||||
}
|
||||
|
||||
override fun onSearchCancel() {
|
||||
isSearchLiveData.postValue(false)
|
||||
}
|
||||
searchFlowCallBack = {
|
||||
trySend(ArrayList(it))
|
||||
}
|
||||
|
||||
searchModel.registerCallback(callback)
|
||||
|
||||
awaitClose {
|
||||
searchModel.unRegisterCallback()
|
||||
searchFlowCallBack = null
|
||||
}
|
||||
}.flowOn(IO)
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package io.legado.app.ui.widget.recycler
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
||||
@Suppress("unused")
|
||||
internal class HeaderAdapterDataObserver(
|
||||
private var adapterDataObserver: RecyclerView.AdapterDataObserver,
|
||||
private var headerCount: Int
|
||||
|
||||
Reference in New Issue
Block a user