Browse Source

Trigger new search on source filter change

Fixes #9724
Could be cleaned more though.
arkon 1 year ago
parent
commit
c7f0a54a37

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt

@@ -27,7 +27,7 @@ class MigrateSearchScreen(private val mangaId: Long) : Screen() {
             fromSourceId = dialogState.manga?.source,
             navigateUp = navigator::pop,
             onChangeSearchQuery = screenModel::updateSearchQuery,
-            onSearch = screenModel::search,
+            onSearch = { screenModel.search() },
             getManga = { screenModel.getManga(it) },
             onChangeSearchFilter = screenModel::setSourceFilter,
             onToggleResults = screenModel::toggleFilterResults,

+ 5 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreenModel.kt

@@ -18,12 +18,13 @@ class MigrateSearchScreenModel(
     init {
         coroutineScope.launch {
             val manga = getManga.await(mangaId)!!
-
             mutableState.update {
-                it.copy(fromSourceId = manga.source, searchQuery = manga.title)
+                it.copy(
+                    fromSourceId = manga.source,
+                    searchQuery = manga.title,
+                )
             }
-
-            search(manga.title)
+            search()
         }
     }
 

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreen.kt

@@ -59,7 +59,7 @@ class GlobalSearchScreen(
                 state = state,
                 navigateUp = navigator::pop,
                 onChangeSearchQuery = screenModel::updateSearchQuery,
-                onSearch = screenModel::search,
+                onSearch = { screenModel.search() },
                 getManga = { screenModel.getManga(it) },
                 onChangeSearchFilter = screenModel::setSourceFilter,
                 onToggleResults = screenModel::toggleFilterResults,

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreenModel.kt

@@ -10,7 +10,7 @@ class GlobalSearchScreenModel(
     init {
         extensionFilter = initialExtensionFilter
         if (initialQuery.isNotBlank() || !initialExtensionFilter.isNullOrBlank()) {
-            search(initialQuery)
+            search()
         }
     }
 

+ 39 - 43
app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt

@@ -39,10 +39,11 @@ abstract class SearchScreenModel(
     private val coroutineDispatcher = Executors.newFixedThreadPool(5).asCoroutineDispatcher()
     private var searchJob: Job? = null
 
-    protected var query: String? = null
-    protected var extensionFilter: String? = null
-
     private val sources by lazy { getSelectedSources() }
+    private var lastQuery: String? = null
+    private var lastSourceFilter: SourceFilter? = null
+
+    protected var extensionFilter: String? = null
     protected val pinnedSources = sourcePreferences.pinnedSources().get()
 
     private val sortComparator = { map: Map<CatalogueSource, SearchItemResult> ->
@@ -95,72 +96,67 @@ abstract class SearchScreenModel(
     }
 
     fun updateSearchQuery(query: String?) {
-        mutableState.update {
-            it.copy(searchQuery = query)
-        }
-    }
-
-    fun getItems(): Map<CatalogueSource, SearchItemResult> {
-        return mutableState.value.items
+        mutableState.update { it.copy(searchQuery = query) }
     }
 
     fun setSourceFilter(filter: SourceFilter) {
         mutableState.update { it.copy(sourceFilter = filter) }
+        search()
     }
 
     fun toggleFilterResults() {
-        mutableState.update {
-            it.copy(onlyShowHasResults = !it.onlyShowHasResults)
-        }
+        mutableState.update { it.copy(onlyShowHasResults = !it.onlyShowHasResults) }
     }
 
-    fun search(query: String) {
-        if (this.query == query) return
+    fun search() {
+        val query = state.value.searchQuery
+        val sourceFilter = state.value.sourceFilter
 
-        this.query = query
+        if (query.isNullOrBlank()) return
+        if (this.lastQuery == query && this.lastSourceFilter == sourceFilter) return
+
+        this.lastQuery = query
+        this.lastSourceFilter = sourceFilter
 
         searchJob?.cancel()
         val initialItems = getSelectedSources().associateWith { SearchItemResult.Loading }
         updateItems(initialItems)
         searchJob = ioCoroutineScope.launch {
-            sources
-                .map { source ->
-                    async {
-                        try {
-                            val page = withContext(coroutineDispatcher) {
-                                source.fetchSearchManga(1, query, source.getFilterList()).awaitSingle()
-                            }
-
-                            val titles = page.mangas.map {
-                                networkToLocalManga.await(it.toDomainManga(source.id))
-                            }
-
-                            getAndUpdateItems { items ->
-                                val mutableMap = items.toMutableMap()
-                                mutableMap[source] = SearchItemResult.Success(titles)
-                                mutableMap.toSortedMap(sortComparator(mutableMap))
-                            }
-                        } catch (e: Exception) {
-                            getAndUpdateItems { items ->
-                                val mutableMap = items.toMutableMap()
-                                mutableMap[source] = SearchItemResult.Error(e)
-                                mutableMap.toSortedMap(sortComparator(mutableMap))
-                            }
+            sources.map { source ->
+                async {
+                    try {
+                        val page = withContext(coroutineDispatcher) {
+                            source.fetchSearchManga(1, query, source.getFilterList()).awaitSingle()
+                        }
+
+                        val titles = page.mangas.map {
+                            networkToLocalManga.await(it.toDomainManga(source.id))
+                        }
+
+                        getAndUpdateItems { items ->
+                            val mutableMap = items.toMutableMap()
+                            mutableMap[source] = SearchItemResult.Success(titles)
+                            mutableMap.toSortedMap(sortComparator(mutableMap))
+                        }
+                    } catch (e: Exception) {
+                        getAndUpdateItems { items ->
+                            val mutableMap = items.toMutableMap()
+                            mutableMap[source] = SearchItemResult.Error(e)
+                            mutableMap.toSortedMap(sortComparator(mutableMap))
                         }
                     }
                 }
+            }
                 .awaitAll()
         }
     }
 
     private fun updateItems(items: Map<CatalogueSource, SearchItemResult>) {
-        mutableState.update {
-            it.copy(items = items)
-        }
+        mutableState.update { it.copy(items = items) }
     }
 
     private fun getAndUpdateItems(function: (Map<CatalogueSource, SearchItemResult>) -> Map<CatalogueSource, SearchItemResult>) {
-        updateItems(function(getItems()))
+        updateItems(function(state.value.items))
     }
 
     @Immutable