浏览代码

Fix library search query being lost when returning (closes #3473)

arkon 4 年之前
父节点
当前提交
f762598c5c

+ 1 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt

@@ -38,10 +38,7 @@ class LibraryCategoryAdapter(view: LibraryCategoryView) :
     }
 
     fun performFilter() {
-        var s = getFilter(String::class.java)
-        if (s == null) {
-            s = ""
-        }
+        val s = getFilter(String::class.java) ?: ""
         updateDataSet(mangas.filter { it.filter(s) })
     }
 }

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt

@@ -168,7 +168,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
      *
      * @param event the event received.
      */
-    fun onNextLibraryManga(event: LibraryMangaEvent) {
+    private fun onNextLibraryManga(event: LibraryMangaEvent) {
         // Get the manga list for this category.
         val mangaForCategory = event.getMangaForCategory(category).orEmpty()
 

+ 14 - 15
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt

@@ -38,8 +38,9 @@ import eu.kanade.tachiyomi.ui.manga.MangaController
 import eu.kanade.tachiyomi.util.system.getResourceColor
 import eu.kanade.tachiyomi.util.system.toast
 import kotlinx.android.synthetic.main.main_activity.tabs
-import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.drop
+import kotlinx.coroutines.flow.dropWhile
+import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.onEach
 import reactivecircus.flowbinding.android.view.clicks
@@ -72,7 +73,7 @@ class LibraryController(
     /**
      * Library search query.
      */
-    private var query: String? = ""
+    private var query: String = ""
 
     /**
      * Currently selected mangas.
@@ -367,19 +368,20 @@ class LibraryController(
         searchView.maxWidth = Int.MAX_VALUE
         searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() })
 
-        if (!query.isNullOrEmpty()) {
+        if (query.isNotEmpty()) {
             searchItem.expandActionView()
             searchView.setQuery(query, true)
             searchView.clearFocus()
 
-            // If we re-enter the controller with a prior search still active
-            view?.post {
-                performSearch()
-            }
+            performSearch()
         }
 
         searchView.queryTextChanges()
-            .distinctUntilChanged()
+            // Ignore events if this controller isn't at the top to avoid query being reset
+            .filter { router.backstack.lastOrNull()?.controller() == this }
+            // If we re-enter the controller with a prior search still active, but searchview
+            // content sometimes appears empty.
+            .dropWhile { query.isNotEmpty() && query != it.toString() }
             .onEach {
                 query = it.toString()
                 performSearch()
@@ -390,17 +392,14 @@ class LibraryController(
         menu.findItem(R.id.action_filter).icon.mutate()
     }
 
-    fun search(query: String?) {
-        // Delay to let contents load first for searches from manga info
-        view?.post {
-            this.query = query
-            performSearch()
-        }
+    fun search(query: String) {
+        this.query = query
+        performSearch()
     }
 
     private fun performSearch() {
         searchRelay.call(query)
-        if (!query.isNullOrEmpty()) {
+        if (query.isNotEmpty()) {
             binding.btnGlobalSearch.isVisible = true
             binding.btnGlobalSearch.text =
                 resources?.getString(R.string.action_global_search_query, query)