From 9e371778b7ac9b2bb49fd3ae65e2e250f8dc8b93 Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Thu, 14 Mar 2024 15:51:40 -0500 Subject: [PATCH] feat: filter lists by genre --- .../connections/anilist/AnilistQueries.kt | 2 +- app/src/main/java/ani/dantotsu/media/Media.kt | 1 + .../ani/dantotsu/media/user/ListActivity.kt | 15 +++++++++++++ .../ani/dantotsu/media/user/ListViewModel.kt | 21 ++++++++++++++++++- app/src/main/res/layout/activity_list.xml | 9 ++++++++ 5 files changed, 46 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt index 2fc07b75..f92a7f1b 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -646,7 +646,7 @@ class AnilistQueries { sortOrder: String? = null ): MutableMap> { val response = - executeQuery("""{ MediaListCollection(userId: $userId, type: ${if (anime) "ANIME" else "MANGA"}) { lists { name isCustomList entries { status progress private score(format:POINT_100) updatedAt media { id idMal isAdult type status chapters episodes nextAiringEpisode {episode} bannerImage meanScore isFavourite format coverImage{large} startDate{year month day} title {english romaji userPreferred } } } } user { id mediaListOptions { rowOrder animeList { sectionOrder } mangaList { sectionOrder } } } } }""") + executeQuery("""{ MediaListCollection(userId: $userId, type: ${if (anime) "ANIME" else "MANGA"}) { lists { name isCustomList entries { status progress private score(format:POINT_100) updatedAt media { id idMal isAdult type status chapters episodes nextAiringEpisode {episode} bannerImage genres meanScore isFavourite format coverImage{large} startDate{year month day} title {english romaji userPreferred } } } } user { id mediaListOptions { rowOrder animeList { sectionOrder } mangaList { sectionOrder } } } } }""") val sorted = mutableMapOf>() val unsorted = mutableMapOf>() val all = arrayListOf() diff --git a/app/src/main/java/ani/dantotsu/media/Media.kt b/app/src/main/java/ani/dantotsu/media/Media.kt index ea8273ec..d26a5048 100644 --- a/app/src/main/java/ani/dantotsu/media/Media.kt +++ b/app/src/main/java/ani/dantotsu/media/Media.kt @@ -109,6 +109,7 @@ data class Media( this.userScore = mediaList.score?.toInt() ?: 0 this.userStatus = mediaList.status?.toString() this.userUpdatedAt = mediaList.updatedAt?.toLong() + this.genres = mediaList.media?.genres?.toMutableList() as? ArrayList? ?: arrayListOf() } constructor(mediaEdge: MediaEdge) : this(mediaEdge.node!!) { diff --git a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt index bdc5cb09..7ce2f136 100644 --- a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt @@ -170,6 +170,21 @@ class ListActivity : AppCompatActivity() { popup.show() } + binding.filter.setOnClickListener { + val genres = PrefManager.getVal>(PrefName.GenresList).toMutableSet().sorted() + val popup = PopupMenu(this, it) + popup.menu.add("All") + genres.forEach { genre -> + popup.menu.add(genre) + } + popup.setOnMenuItemClickListener { menuItem -> + val selectedGenre = menuItem.title.toString() + model.filterLists(selectedGenre) + true + } + popup.show() + } + binding.random.setOnClickListener { //get the current tab val currentTab = diff --git a/app/src/main/java/ani/dantotsu/media/user/ListViewModel.kt b/app/src/main/java/ani/dantotsu/media/user/ListViewModel.kt index 06fd29a9..d415b432 100644 --- a/app/src/main/java/ani/dantotsu/media/user/ListViewModel.kt +++ b/app/src/main/java/ani/dantotsu/media/user/ListViewModel.kt @@ -13,10 +13,29 @@ class ListViewModel : ViewModel() { var grid = MutableLiveData(PrefManager.getVal(PrefName.ListGrid)) private val lists = MutableLiveData>>() + private val unfilteredLists = MutableLiveData>>() fun getLists(): LiveData>> = lists suspend fun loadLists(anime: Boolean, userId: Int, sortOrder: String? = null) { tryWithSuspend { - lists.postValue(Anilist.query.getMediaLists(anime, userId, sortOrder)) + val res = Anilist.query.getMediaLists(anime, userId, sortOrder) + lists.postValue(res) + unfilteredLists.postValue(res) } } + + fun filterLists(genre: String) { + if (genre == "All") { + lists.postValue(unfilteredLists.value) + return + } + val currentLists = unfilteredLists.value ?: return + val filteredLists = currentLists.mapValues { entry -> + entry.value.filter { media -> + genre in media.genres + } as ArrayList + }.toMutableMap() + + lists.postValue(filteredLists) + } + } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_list.xml b/app/src/main/res/layout/activity_list.xml index 05ee3363..d3b42df9 100644 --- a/app/src/main/res/layout/activity_list.xml +++ b/app/src/main/res/layout/activity_list.xml @@ -55,6 +55,15 @@ app:srcCompat="@drawable/ic_shuffle_24" app:tint="?attr/colorOnBackground" /> + +