Actually fix library search properly

This commit is contained in:
arkon 2020-07-31 12:54:23 -04:00
parent f762598c5c
commit 98a4d1e763

View File

@ -39,7 +39,6 @@ import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import kotlinx.android.synthetic.main.main_activity.tabs import kotlinx.android.synthetic.main.main_activity.tabs
import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.dropWhile
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
@ -374,19 +373,13 @@ class LibraryController(
searchView.clearFocus() searchView.clearFocus()
performSearch() performSearch()
}
searchView.queryTextChanges() // Workaround for weird behavior where searchview gets empty text change despite
// Ignore events if this controller isn't at the top to avoid query being reset // query being set already
.filter { router.backstack.lastOrNull()?.controller() == this } searchView.postDelayed({ initSearchHandler(searchView) }, 500)
// If we re-enter the controller with a prior search still active, but searchview } else {
// content sometimes appears empty. initSearchHandler(searchView)
.dropWhile { query.isNotEmpty() && query != it.toString() }
.onEach {
query = it.toString()
performSearch()
} }
.launchIn(scope)
// Mutate the filter icon because it needs to be tinted and the resource is shared. // Mutate the filter icon because it needs to be tinted and the resource is shared.
menu.findItem(R.id.action_filter).icon.mutate() menu.findItem(R.id.action_filter).icon.mutate()
@ -394,8 +387,18 @@ class LibraryController(
fun search(query: String) { fun search(query: String) {
this.query = query this.query = query
}
private fun initSearchHandler(searchView: SearchView) {
searchView.queryTextChanges()
// Ignore events if this controller isn't at the top to avoid query being reset
.filter { router.backstack.lastOrNull()?.controller() == this }
.onEach {
query = it.toString()
performSearch() performSearch()
} }
.launchIn(scope)
}
private fun performSearch() { private fun performSearch() {
searchRelay.call(query) searchRelay.call(query)