Fix filter search not triggering when clicking genre from Manga details (#8156)

(cherry picked from commit dcd5541e964b94f0dab9bb86fe207ec41b249296)

# Conflicts:
#	app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt
#	app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt
This commit is contained in:
Andreas 2022-10-08 15:48:19 +02:00 committed by Jobobby04
parent 896bc3253e
commit 84c463d648
5 changed files with 43 additions and 49 deletions

View File

@ -97,7 +97,7 @@ fun BrowseSourceScreen(
navigateUp = navigateUp, navigateUp = navigateUp,
onWebViewClick = onWebViewClick, onWebViewClick = onWebViewClick,
onHelpClick = onHelpClick, onHelpClick = onHelpClick,
onSearch = { presenter.search() }, onSearch = { presenter.search(it) },
// SY --> // SY -->
onSettingsClick = onSettingsClick, onSettingsClick = onSettingsClick,
// SY <-- // SY <--
@ -112,7 +112,7 @@ fun BrowseSourceScreen(
FilterChip( FilterChip(
selected = presenter.currentFilter == BrowseSourcePresenter.Filter.Popular, selected = presenter.currentFilter == BrowseSourcePresenter.Filter.Popular,
onClick = { onClick = {
presenter.resetFilter() presenter.reset()
presenter.search(GetRemoteManga.QUERY_POPULAR) presenter.search(GetRemoteManga.QUERY_POPULAR)
}, },
leadingIcon = { leadingIcon = {
@ -131,7 +131,7 @@ fun BrowseSourceScreen(
FilterChip( FilterChip(
selected = presenter.currentFilter == BrowseSourcePresenter.Filter.Latest, selected = presenter.currentFilter == BrowseSourcePresenter.Filter.Latest,
onClick = { onClick = {
presenter.resetFilter() presenter.reset()
presenter.search(GetRemoteManga.QUERY_LATEST) presenter.search(GetRemoteManga.QUERY_LATEST)
}, },
leadingIcon = { leadingIcon = {

View File

@ -44,7 +44,7 @@ fun SourceSearchScreen(
placeholderText = stringResource(R.string.action_search_hint), placeholderText = stringResource(R.string.action_search_hint),
navigateUp = navigateUp, navigateUp = navigateUp,
onResetClick = { presenter.searchQuery = "" }, onResetClick = { presenter.searchQuery = "" },
onSearchClick = { presenter.search() }, onSearchClick = { presenter.search(it) },
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
) )
}, },

View File

@ -43,7 +43,7 @@ fun BrowseSourceToolbar(
navigateUp: () -> Unit, navigateUp: () -> Unit,
onWebViewClick: () -> Unit, onWebViewClick: () -> Unit,
onHelpClick: () -> Unit, onHelpClick: () -> Unit,
onSearch: () -> Unit, onSearch: (String) -> Unit,
// SY --> // SY -->
onSettingsClick: () -> Unit, onSettingsClick: () -> Unit,
// SY <-- // SY <--
@ -68,13 +68,17 @@ fun BrowseSourceToolbar(
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
) )
} else { } else {
val cancelSearch = { state.searchQuery = null }
BrowseSourceSearchToolbar( BrowseSourceSearchToolbar(
searchQuery = state.searchQuery!!, searchQuery = state.searchQuery!!,
onSearchQueryChanged = { state.searchQuery = it }, onSearchQueryChanged = { state.searchQuery = it },
placeholderText = stringResource(R.string.action_search_hint), placeholderText = stringResource(R.string.action_search_hint),
navigateUp = { state.searchQuery = null }, navigateUp = cancelSearch,
onResetClick = { state.searchQuery = "" }, onResetClick = { state.searchQuery = "" },
onSearchClick = onSearch, onSearchClick = {
onSearch(it)
cancelSearch()
},
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
) )
} }
@ -194,7 +198,7 @@ fun BrowseSourceSearchToolbar(
placeholderText: String?, placeholderText: String?,
navigateUp: () -> Unit, navigateUp: () -> Unit,
onResetClick: () -> Unit, onResetClick: () -> Unit,
onSearchClick: () -> Unit, onSearchClick: (String) -> Unit,
scrollBehavior: TopAppBarScrollBehavior?, scrollBehavior: TopAppBarScrollBehavior?,
) { ) {
val keyboardController = LocalSoftwareKeyboardController.current val keyboardController = LocalSoftwareKeyboardController.current
@ -207,7 +211,7 @@ fun BrowseSourceSearchToolbar(
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
keyboardActions = KeyboardActions( keyboardActions = KeyboardActions(
onSearch = { onSearch = {
onSearchClick() onSearchClick(searchQuery)
focusManager.clearFocus() focusManager.clearFocus()
keyboardController?.hide() keyboardController?.hide()
}, },

View File

@ -15,7 +15,6 @@ import eu.kanade.presentation.components.DuplicateMangaDialog
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.base.controller.FullComposeController import eu.kanade.tachiyomi.ui.base.controller.FullComposeController
import eu.kanade.tachiyomi.ui.base.controller.pushController import eu.kanade.tachiyomi.ui.base.controller.pushController
@ -192,7 +191,10 @@ open class BrowseSourceController(bundle: Bundle) :
private fun navigateUp() { private fun navigateUp() {
when { when {
presenter.searchQuery != null -> presenter.searchQuery = null presenter.searchQuery != null -> presenter.searchQuery = null
presenter.isUserQuery -> presenter.search() presenter.isUserQuery -> {
val (_, filters) = presenter.currentFilter as BrowseSourcePresenter.Filter.UserInput
presenter.search(query = "", filters = filters)
}
else -> router.popCurrentController() else -> router.popCurrentController()
} }
} }
@ -210,10 +212,10 @@ open class BrowseSourceController(bundle: Bundle) :
emptyList(), emptyList(),
// SY <-- // SY <--
onFilterClicked = { onFilterClicked = {
presenter.setSourceFilter(presenter.filters) presenter.search(filters = presenter.filters)
}, },
onResetClicked = { onResetClicked = {
presenter.resetFilter() presenter.reset()
filterSheet?.setFilters(presenter.filterItems) filterSheet?.setFilters(presenter.filterItems)
}, },
// EXH --> // EXH -->
@ -258,16 +260,17 @@ open class BrowseSourceController(bundle: Bundle) :
return@launchUI return@launchUI
} }
if (search.filterList != null) {
presenter.setFilter(FilterList(search.filterList))
filterSheet?.setFilters(presenter.filterItems)
}
val allDefault = search.filterList != null && presenter.filters == presenter.source!!.getFilterList() val allDefault = search.filterList != null && presenter.filters == presenter.source!!.getFilterList()
filterSheet?.dismiss() filterSheet?.dismiss()
presenter.searchQuery = search.query.nullIfBlank() presenter.searchQuery = search.query.nullIfBlank()
presenter.setSourceFilter(if (allDefault) FilterList() else presenter.filters) if (search.filterList != null) {
presenter.search() filterSheet?.setFilters(search.filterList.toItems())
}
presenter.search(
query = search.query,
filters = if (allDefault) null else search.filterList,
)
} }
}, },
onSavedSearchDeleteClicked = { idToDelete, name -> onSavedSearchDeleteClicked = { idToDelete, name ->
@ -337,10 +340,9 @@ open class BrowseSourceController(bundle: Bundle) :
} }
if (genreExists) { if (genreExists) {
filterSheet?.setFilters(presenter.filterItems) filterSheet?.setFilters(defaultFilters.toItems())
presenter.searchQuery = "" presenter.search(filters = defaultFilters)
presenter.setFilter(defaultFilters)
} else { } else {
searchWithQuery(genreName) searchWithQuery(genreName)
} }

View File

@ -210,22 +210,25 @@ open class BrowseSourcePresenter(
} }
// SY <-- // SY <--
fun setFilter(filters: FilterList) { fun reset() {
state.filters = filters
}
fun resetFilter() {
state.filters = source!!.getFilterList() state.filters = source!!.getFilterList()
if (currentFilter !is Filter.UserInput) return if (currentFilter !is Filter.UserInput) return
state.currentFilter = (currentFilter as Filter.UserInput).copy(filters = state.filters) state.currentFilter = (currentFilter as Filter.UserInput).copy(filters = state.filters)
} }
fun search(query: String? = null) { fun search(query: String? = null, filters: FilterList? = null) {
var new = Filter.valueOf(query ?: searchQuery ?: "") Filter.valueOf(query ?: "").let {
if (new is Filter.UserInput && currentFilter is Filter.UserInput) { if (it !is Filter.UserInput) {
new = new.copy(filters = currentFilter.filters) state.currentFilter = it
return
}
} }
state.currentFilter = new
val input: Filter.UserInput = if (currentFilter is Filter.UserInput) currentFilter as Filter.UserInput else Filter.UserInput()
state.currentFilter = input.copy(
query = query ?: input.query,
filters = filters ?: input.filters,
)
} }
// SY --> // SY -->
@ -245,16 +248,13 @@ open class BrowseSourcePresenter(
val savedSearch = runBlocking { getExhSavedSearch.awaitOne(savedSearchFilters) { filters } } val savedSearch = runBlocking { getExhSavedSearch.awaitOne(savedSearchFilters) { filters } }
if (savedSearch != null) { if (savedSearch != null) {
state.searchQuery = savedSearch.query.nullIfBlank() state.searchQuery = savedSearch.query.nullIfBlank()
if (savedSearch.filterList != null) { search(query = savedSearch.query, filters = savedSearch.filterList)
setSourceFilter(savedSearch.filterList)
}
search()
} }
} else if (jsonFilters != null) { } else if (jsonFilters != null) {
runCatching { runCatching {
val filters = Json.decodeFromString<JsonArray>(jsonFilters) val filters = Json.decodeFromString<JsonArray>(jsonFilters)
filterSerializer.deserialize(this.filters, filters) filterSerializer.deserialize(this.filters, filters)
setSourceFilter(this.filters) search(filters = this.filters)
} }
} }
@ -393,18 +393,6 @@ open class BrowseSourcePresenter(
} }
} }
/**
* Set the filter states for the current source.
*
* @param filters a list of active filters.
*/
fun setSourceFilter(filters: FilterList) {
state.currentFilter = when (val filter = currentFilter) {
Filter.Latest, Filter.Popular -> Filter.UserInput(filters = filters)
is Filter.UserInput -> filter.copy(filters = filters)
}
}
// SY --> // SY -->
open fun createSourcePagingSource(query: String, filters: FilterList): SourcePagingSourceType { open fun createSourcePagingSource(query: String, filters: FilterList): SourcePagingSourceType {
return getRemoteManga.subscribe(sourceId, currentFilter.query, currentFilter.filters) return getRemoteManga.subscribe(sourceId, currentFilter.query, currentFilter.filters)