diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt index a81a493a9..7aa990627 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt @@ -31,6 +31,7 @@ import eu.kanade.tachiyomi.databinding.SourceControllerBinding import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.LocalSource +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.LoginSource @@ -502,6 +503,54 @@ open class BrowseSourceController(bundle: Bundle) : presenter.restartPager(newQuery) } + /** + * Attempts to restart the request with a new genre-filtered query. + * If the genre name can't be found the filters, + * the standard searchWithQuery search method is used instead. + * + * @param genreName the name of the genre + */ + fun searchWithGenre(genreName: String) { + presenter.sourceFilters = presenter.source.getFilterList() + + var filterList: FilterList? = null + + filter@ for (sourceFilter in presenter.sourceFilters) { + if (sourceFilter is Filter.Group<*>) { + for (filter in sourceFilter.state) { + if (filter is Filter<*> && filter.name.equals(genreName, true)) { + when (filter) { + is Filter.TriState -> filter.state = 1 + is Filter.CheckBox -> filter.state = true + } + filterList = presenter.sourceFilters + break@filter + } + } + } else if (sourceFilter is Filter.Select<*>) { + val index = sourceFilter.values.filterIsInstance() + .indexOfFirst { it.equals(genreName, true) } + + if (index != -1) { + sourceFilter.state = index + filterList = presenter.sourceFilters + break + } + } + } + + if (filterList != null) { + filterSheet?.setFilters(presenter.filterItems) + + showProgressBar() + + adapter?.clear() + presenter.restartPager("", filterList) + } else { + searchWithQuery(genreName) + } + } + /** * Called from the presenter when the network request is received. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index 619553a9c..bfdb249b7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -987,6 +987,29 @@ class MangaController : } } + /** + * Performs a genre search using the provided genre name. + * + * @param genreName the search genre to the parent controller + */ + fun performGenreSearch(genreName: String) { + if (router.backstackSize < 2) { + return + } + + val previousController = router.backstack[router.backstackSize - 2].controller + val presenterSource = presenter.source + + if (previousController is BrowseSourceController && + presenterSource is HttpSource + ) { + router.handleBack() + previousController.searchWithGenre(genreName) + } else { + performSearch(genreName) + } + } + private fun shareCover() { try { val activity = activity!! diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoItemAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoItemAdapter.kt index 47ba13e11..376ce4560 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoItemAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoItemAdapter.kt @@ -170,8 +170,8 @@ class MangaInfoItemAdapter( } mangaTagsInfoAdapter?.updateDataSet(namespaceTags) } - binding.mangaGenresTagsFullChips.setChipsExtended(manga.getGenres(), controller::performSearch, controller::performGlobalSearch, source?.id ?: 0) - binding.mangaGenresTagsCompactChips.setChipsExtended(manga.getGenres(), controller::performSearch, controller::performGlobalSearch, source?.id ?: 0) + binding.mangaGenresTagsFullChips.setChipsExtended(manga.getGenres(), controller::performGenreSearch, controller::performGlobalSearch, source?.id ?: 0) + binding.mangaGenresTagsCompactChips.setChipsExtended(manga.getGenres(), controller::performGenreSearch, controller::performGlobalSearch, source?.id ?: 0) // SY <-- } else { binding.mangaGenresTagsCompactChips.isVisible = false