更新界面

增加搜索进度
增加初次使用引导界面
This commit is contained in:
HapeLee
2025-08-27 03:44:43 +08:00
parent 50abb9b552
commit 3327f181bd
5 changed files with 57 additions and 11 deletions
@@ -74,6 +74,8 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
private fun startSearch() {
val precision = appCtx.getPrefBoolean(PreferKey.precisionSearch)
var hasMore = false
val totalParts = bookSourceParts.size
var processedParts = 0
searchJob = scope.launch(searchPool!!) {
flow {
for (bs in bookSourceParts) {
@@ -100,7 +102,8 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
appDb.searchBookDao.insert(*items.toTypedArray())
mergeItems(items, precision)
currentCoroutineContext().ensureActive()
callBack.onSearchSuccess(searchBooks)
processedParts++
callBack.onSearchSuccess(searchBooks, processedParts, totalParts)
}.onCompletion {
if (it == null) callBack.onSearchFinish(searchBooks.isEmpty(), hasMore)
}.catch {
@@ -191,7 +194,7 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
interface CallBack {
fun getSearchScope(): SearchScope
fun onSearchStart()
fun onSearchSuccess(searchBooks: List<SearchBook>)
fun onSearchSuccess(searchBooks: List<SearchBook>, processedSources: Int, totalSources: Int)
fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean)
fun onSearchCancel(exception: Throwable? = null)
}
@@ -1,5 +1,6 @@
package io.legato.kazusa.ui.book.search
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.os.Bundle
@@ -199,7 +200,6 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
)
}
searchBar.setOnMenuItemClickListener { item ->
onCompatOptionsItemSelected(item)
}
@@ -429,6 +429,7 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
*/
private fun startSearch() {
binding.refreshProgressBar.visible()
binding.cdProgress.gone()
//binding.refreshProgressBar.isAutoLoading = true
binding.fbStartStop.setImageResource(R.drawable.ic_stop_black_24dp)
binding.fbStartStop.visible()
@@ -438,7 +439,8 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
* 搜索结束
*/
private fun searchFinally() {
binding.refreshProgressBar.gone()
binding.refreshProgressBar.invisible()
binding.cdProgress.gone()
if (!isManualStopSearch && viewModel.hasMore) {
binding.fbStartStop.setImageResource(R.drawable.ic_play_24dp)
} else {
@@ -446,10 +448,16 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
}
}
@SuppressLint("SetTextI18n")
override fun observeLiveBus() {
viewModel.upAdapterLiveData.observe(this) {
adapter.notifyItemRangeChanged(0, adapter.itemCount, bundleOf(it to null))
}
viewModel.searchProgressLiveData.observe(this) { (processed, total) ->
val progress = (processed * 100 / total).coerceAtMost(100)
binding.refreshProgressBar.setProgress(progress, true)
binding.tvProgress.text = "$processed / $total"
}
viewModel.searchFinishLiveData.observe(this) { isEmpty ->
if (!isEmpty || viewModel.searchScope.isAll()) return@observe
alert("搜索结果为空") {
@@ -29,6 +29,9 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
val searchScope: SearchScope = SearchScope(AppConfig.searchScope)
var searchFinishLiveData = MutableLiveData<Boolean>()
var isSearchLiveData = MutableLiveData<Boolean>()
val searchProgressLiveData = MutableLiveData<Pair<Int, Int>>()
var searchKey: String = ""
var hasMore = true
private var searchID = 0L
@@ -42,8 +45,11 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
isSearchLiveData.postValue(true)
}
override fun onSearchSuccess(searchBooks: List<SearchBook>) {
override fun onSearchSuccess(
searchBooks: List<SearchBook>, processedSources: Int, totalSources: Int
) {
searchBookLiveData.postValue(searchBooks)
searchProgressLiveData.postValue(Pair(processedSources, totalSources))
}
override fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean) {
@@ -86,7 +86,11 @@ class BookSearchWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) :
}
override fun onSearchSuccess(searchBooks: List<SearchBook>) {
override fun onSearchSuccess(
searchBooks: List<SearchBook>,
processedSources: Int,
totalSources: Int
) {
send(GSON.toJson(searchBooks))
}