Explorar o código

更新界面
增加搜索进度
增加初次使用引导界面

HapeLee hai 1 ano
pai
achega
3327f181bd

+ 5 - 2
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() {
     private fun startSearch() {
         val precision = appCtx.getPrefBoolean(PreferKey.precisionSearch)
         val precision = appCtx.getPrefBoolean(PreferKey.precisionSearch)
         var hasMore = false
         var hasMore = false
+        val totalParts = bookSourceParts.size
+        var processedParts = 0
         searchJob = scope.launch(searchPool!!) {
         searchJob = scope.launch(searchPool!!) {
             flow {
             flow {
                 for (bs in bookSourceParts) {
                 for (bs in bookSourceParts) {
@@ -100,7 +102,8 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
                 appDb.searchBookDao.insert(*items.toTypedArray())
                 appDb.searchBookDao.insert(*items.toTypedArray())
                 mergeItems(items, precision)
                 mergeItems(items, precision)
                 currentCoroutineContext().ensureActive()
                 currentCoroutineContext().ensureActive()
-                callBack.onSearchSuccess(searchBooks)
+                processedParts++
+                callBack.onSearchSuccess(searchBooks, processedParts, totalParts)
             }.onCompletion {
             }.onCompletion {
                 if (it == null) callBack.onSearchFinish(searchBooks.isEmpty(), hasMore)
                 if (it == null) callBack.onSearchFinish(searchBooks.isEmpty(), hasMore)
             }.catch {
             }.catch {
@@ -191,7 +194,7 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
     interface CallBack {
     interface CallBack {
         fun getSearchScope(): SearchScope
         fun getSearchScope(): SearchScope
         fun onSearchStart()
         fun onSearchStart()
-        fun onSearchSuccess(searchBooks: List<SearchBook>)
+        fun onSearchSuccess(searchBooks: List<SearchBook>, processedSources: Int, totalSources: Int)
         fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean)
         fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean)
         fun onSearchCancel(exception: Throwable? = null)
         fun onSearchCancel(exception: Throwable? = null)
     }
     }

+ 10 - 2
app/src/main/java/io/legato/kazusa/ui/book/search/SearchActivity.kt

@@ -1,5 +1,6 @@
 package io.legato.kazusa.ui.book.search
 package io.legato.kazusa.ui.book.search
 
 
+import android.annotation.SuppressLint
 import android.content.Context
 import android.content.Context
 import android.content.Intent
 import android.content.Intent
 import android.os.Bundle
 import android.os.Bundle
@@ -199,7 +200,6 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
             )
             )
         }
         }
 
 
-
         searchBar.setOnMenuItemClickListener { item ->
         searchBar.setOnMenuItemClickListener { item ->
             onCompatOptionsItemSelected(item)
             onCompatOptionsItemSelected(item)
         }
         }
@@ -429,6 +429,7 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
      */
      */
     private fun startSearch() {
     private fun startSearch() {
         binding.refreshProgressBar.visible()
         binding.refreshProgressBar.visible()
+        binding.cdProgress.gone()
         //binding.refreshProgressBar.isAutoLoading = true
         //binding.refreshProgressBar.isAutoLoading = true
         binding.fbStartStop.setImageResource(R.drawable.ic_stop_black_24dp)
         binding.fbStartStop.setImageResource(R.drawable.ic_stop_black_24dp)
         binding.fbStartStop.visible()
         binding.fbStartStop.visible()
@@ -438,7 +439,8 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
      * 搜索结束
      * 搜索结束
      */
      */
     private fun searchFinally() {
     private fun searchFinally() {
-        binding.refreshProgressBar.gone()
+        binding.refreshProgressBar.invisible()
+        binding.cdProgress.gone()
         if (!isManualStopSearch && viewModel.hasMore) {
         if (!isManualStopSearch && viewModel.hasMore) {
             binding.fbStartStop.setImageResource(R.drawable.ic_play_24dp)
             binding.fbStartStop.setImageResource(R.drawable.ic_play_24dp)
         } else {
         } else {
@@ -446,10 +448,16 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
         }
         }
     }
     }
 
 
+    @SuppressLint("SetTextI18n")
     override fun observeLiveBus() {
     override fun observeLiveBus() {
         viewModel.upAdapterLiveData.observe(this) {
         viewModel.upAdapterLiveData.observe(this) {
             adapter.notifyItemRangeChanged(0, adapter.itemCount, bundleOf(it to null))
             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 ->
         viewModel.searchFinishLiveData.observe(this) { isEmpty ->
             if (!isEmpty || viewModel.searchScope.isAll()) return@observe
             if (!isEmpty || viewModel.searchScope.isAll()) return@observe
             alert("搜索结果为空") {
             alert("搜索结果为空") {

+ 7 - 1
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)
     val searchScope: SearchScope = SearchScope(AppConfig.searchScope)
     var searchFinishLiveData = MutableLiveData<Boolean>()
     var searchFinishLiveData = MutableLiveData<Boolean>()
     var isSearchLiveData = MutableLiveData<Boolean>()
     var isSearchLiveData = MutableLiveData<Boolean>()
+
+    val searchProgressLiveData = MutableLiveData<Pair<Int, Int>>()
+
     var searchKey: String = ""
     var searchKey: String = ""
     var hasMore = true
     var hasMore = true
     private var searchID = 0L
     private var searchID = 0L
@@ -42,8 +45,11 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
             isSearchLiveData.postValue(true)
             isSearchLiveData.postValue(true)
         }
         }
 
 
-        override fun onSearchSuccess(searchBooks: List<SearchBook>) {
+        override fun onSearchSuccess(
+            searchBooks: List<SearchBook>, processedSources: Int, totalSources: Int
+        ) {
             searchBookLiveData.postValue(searchBooks)
             searchBookLiveData.postValue(searchBooks)
+            searchProgressLiveData.postValue(Pair(processedSources, totalSources))
         }
         }
 
 
         override fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean) {
         override fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean) {

+ 5 - 1
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<SearchBook>) {
+    override fun onSearchSuccess(
+        searchBooks: List<SearchBook>,
+        processedSources: Int,
+        totalSources: Int
+    ) {
         send(GSON.toJson(searchBooks))
         send(GSON.toJson(searchBooks))
     }
     }
 
 

+ 30 - 5
app/src/main/res/layout/activity_book_search.xml

@@ -33,13 +33,38 @@
                 android:id="@+id/refresh_progress_bar"
                 android:id="@+id/refresh_progress_bar"
                 android:layout_width="match_parent"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 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" />
 
 
-            </com.google.android.material.progressindicator.LinearProgressIndicator>
+            <com.google.android.material.card.MaterialCardView
+                android:id="@+id/cd_progress"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentStart="true"
+                android:layout_centerVertical="true"
+                android:layout_marginHorizontal="16dp"
+                android:layout_marginVertical="4dp"
+                android:scaleType="centerCrop"
+                android:visibility="gone"
+                app:cardBackgroundColor="?attr/colorTertiaryContainer"
+                app:cardCornerRadius="4dp"
+                app:strokeWidth="0dp">
 
 
+                <TextView
+                    android:id="@+id/tv_progress"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:paddingHorizontal="4dp"
+                    android:paddingVertical="2dp"
+                    android:text="进度"
+                    android:textColor="?attr/colorTertiary"
+                    android:textSize="10sp"
+                    android:textStyle="bold"
+                    tools:ignore="SmallSp" />
+
+            </com.google.android.material.card.MaterialCardView>
         </com.google.android.material.appbar.AppBarLayout>
         </com.google.android.material.appbar.AppBarLayout>
 
 
         <LinearLayout
         <LinearLayout