From 3327f181bdc91980f6bceed887a5dbb789a56c4d Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Wed, 27 Aug 2025 03:44:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=95=8C=E9=9D=A2=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=90=9C=E7=B4=A2=E8=BF=9B=E5=BA=A6=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=9D=E6=AC=A1=E4=BD=BF=E7=94=A8=E5=BC=95?= =?UTF-8?q?=E5=AF=BC=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kazusa/model/webBook/SearchModel.kt | 7 ++-- .../kazusa/ui/book/search/SearchActivity.kt | 12 +++++-- .../kazusa/ui/book/search/SearchViewModel.kt | 8 ++++- .../kazusa/web/socket/BookSearchWebSocket.kt | 6 +++- .../main/res/layout/activity_book_search.xml | 35 ++++++++++++++++--- 5 files changed, 57 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legato/kazusa/model/webBook/SearchModel.kt b/app/src/main/java/io/legato/kazusa/model/webBook/SearchModel.kt index 34e8dc23e..053301050 100644 --- a/app/src/main/java/io/legato/kazusa/model/webBook/SearchModel.kt +++ b/app/src/main/java/io/legato/kazusa/model/webBook/SearchModel.kt @@ -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) + fun onSearchSuccess(searchBooks: List, processedSources: Int, totalSources: Int) fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean) fun onSearchCancel(exception: Throwable? = null) } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/search/SearchActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/search/SearchActivity.kt index 24c8fd99f..193e1a0bf 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/search/SearchActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/search/SearchActivity.kt @@ -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 onCompatOptionsItemSelected(item) } @@ -429,6 +429,7 @@ class SearchActivity : VMBaseActivity + 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("搜索结果为空") { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/search/SearchViewModel.kt b/app/src/main/java/io/legato/kazusa/ui/book/search/SearchViewModel.kt index 098dc8378..bfd179dee 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/search/SearchViewModel.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/search/SearchViewModel.kt @@ -29,6 +29,9 @@ class SearchViewModel(application: Application) : BaseViewModel(application) { val searchScope: SearchScope = SearchScope(AppConfig.searchScope) var searchFinishLiveData = MutableLiveData() var isSearchLiveData = MutableLiveData() + + val searchProgressLiveData = MutableLiveData>() + 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) { + override fun onSearchSuccess( + searchBooks: List, processedSources: Int, totalSources: Int + ) { searchBookLiveData.postValue(searchBooks) + searchProgressLiveData.postValue(Pair(processedSources, totalSources)) } override fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean) { diff --git a/app/src/main/java/io/legato/kazusa/web/socket/BookSearchWebSocket.kt b/app/src/main/java/io/legato/kazusa/web/socket/BookSearchWebSocket.kt index 9b99a779f..b61fe77be 100644 --- a/app/src/main/java/io/legato/kazusa/web/socket/BookSearchWebSocket.kt +++ b/app/src/main/java/io/legato/kazusa/web/socket/BookSearchWebSocket.kt @@ -86,7 +86,11 @@ class BookSearchWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : } - override fun onSearchSuccess(searchBooks: List) { + override fun onSearchSuccess( + searchBooks: List, + processedSources: Int, + totalSources: Int + ) { send(GSON.toJson(searchBooks)) } diff --git a/app/src/main/res/layout/activity_book_search.xml b/app/src/main/res/layout/activity_book_search.xml index c123f5f09..ef42e3c19 100644 --- a/app/src/main/res/layout/activity_book_search.xml +++ b/app/src/main/res/layout/activity_book_search.xml @@ -33,13 +33,38 @@ android:id="@+id/refresh_progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:waveAmplitude="8dp" - app:wavelength="80dp" - android:indeterminate="true" - android:visibility="gone"> + android:visibility="gone" + app:waveAmplitude="2dp" + app:waveSpeed="50dp" + app:wavelength="40dp" /> - + + + +