From 63a5150cea066c40ad7b774387ed71345ceeabcf Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Fri, 29 Mar 2024 18:10:41 -0500 Subject: [PATCH 01/11] fix: home screen number spacing --- app/src/main/res/layout/fragment_home.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index c3caeff4..7fe73e42 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -94,6 +94,7 @@ android:id="@+id/homeUserEpisodesWatched" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginStart="4dp" android:fontFamily="@font/poppins_bold" android:textColor="?attr/colorPrimaryVariant" android:textSize="12sp" /> @@ -117,6 +118,7 @@ android:id="@+id/homeUserChaptersRead" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginStart="4dp" android:fontFamily="@font/poppins_bold" android:textColor="?attr/colorPrimaryVariant" android:textSize="12sp" /> From 51beac2d033d8114df31a443c8adb271c9760005 Mon Sep 17 00:00:00 2001 From: TwistedUmbrellaX <1173913+AbandonedCart@users.noreply.github.com> Date: Fri, 29 Mar 2024 22:53:49 -0400 Subject: [PATCH 02/11] Revert (some of) "Just some quality of life garbage (#304)" (#306) This reverts (some of) commit c29147a6817e01c3d0284b50d4ff428735792681. --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7da65ce2..bb7cac92 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,9 +49,9 @@ Popular Manga Username - Chapters Read + Chapters Read Chapters\nRead - Episodes Watched + Episodes Watched Episodes\nWatched Continue Reading Continue Watching From c0bccc027f30d5d46f0834b15782cd449da0301a Mon Sep 17 00:00:00 2001 From: aayush262 Date: Sat, 30 Mar 2024 15:43:37 +0530 Subject: [PATCH 03/11] feat: combined queries --- .../connections/anilist/AnilistQueries.kt | 47 +++++------ .../connections/anilist/AnilistViewModel.kt | 84 +++++++++---------- .../dantotsu/connections/anilist/api/Data.kt | 4 +- 3 files changed, 62 insertions(+), 73 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 4492c414..510e5cd9 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -1022,43 +1022,53 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: } return null } - private fun trendingMovie(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: ANIME, format: MOVIE){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + private val onListAnime = (if(PrefManager.getVal(PrefName.IncludeAnimeList)) "" else "onList:false").replace("\"", "") + private val isAdult = (if (PrefManager.getVal(PrefName.AdultOnly)) "isAdult:true" else "").replace("\"", "") + private fun recentAnimeUpdates(): String{ + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}airingSchedules(airingAt_greater:0 airingAt_lesser:${System.currentTimeMillis() / 1000 - 10000} sort:TIME_DESC){episode airingAt media{id idMal status chapters episodes nextAiringEpisode{episode} isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large} title{english romaji userPreferred} mediaListEntry{progress private score(format:POINT_100) status}}}}""" + } + private fun trendingMovies(): String{ + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: ANIME, format: MOVIE, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } private fun topRatedAnime(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: ANIME){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: ANIME, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } private fun mostFavAnime(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: ANIME){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: ANIME, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } suspend fun loadAnimeList(): Query.AnimeList?{ return executeQuery( """{ - trendingMovie:${trendingMovie()} + recentUpdates:${recentAnimeUpdates()} + trendingMovies:${trendingMovies()} topRated:${topRatedAnime()} mostFav:${mostFavAnime()} }""".trimIndent(), force = true ) } - + private val onListManga = (if(PrefManager.getVal(PrefName.IncludeMangaList)) "" else "onList:false").replace("\"", "") private fun trendingManga(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA,countryOfOrigin:JP){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA,countryOfOrigin:JP, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } private fun trendingManhwa(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, countryOfOrigin:KR){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, countryOfOrigin:KR, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + } + private fun trendingNovel(): String{ + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, format: NOVEL, countryOfOrigin:JP, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } private fun topRatedManga(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: MANGA){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: MANGA, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } private fun mostFavManga(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: MANGA){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: MANGA, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } suspend fun loadMangaList(): Query.MangaList?{ return executeQuery( """{ trendingManga:${trendingManga()} trendingManhwa:${trendingManhwa()} + trendingNovel:${trendingNovel()} topRated:${topRatedManga()} mostFav:${mostFavManga()} }""".trimIndent(), force = true @@ -1066,7 +1076,6 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: } suspend fun recentlyUpdated( - smaller: Boolean = true, greater: Long = 0, lesser: Long = System.currentTimeMillis() / 1000 - 10000 ): MutableList? { @@ -1116,21 +1125,6 @@ Page(page:$page,perPage:50) { }""".replace("\n", " ").replace(""" """, "") return executeQuery(query, force = true)?.data?.page } - if (smaller) { - val response = execute()?.airingSchedules ?: return null - val idArr = mutableListOf() - val listOnly: Boolean = PrefManager.getVal(PrefName.RecentlyListOnly) - return response.mapNotNull { i -> - i.media?.let { - if (!idArr.contains(it.id)) - if (!listOnly && (it.countryOfOrigin == "JP" && (if (!Anilist.adult) it.isAdult == false else true)) || (listOnly && it.mediaListEntry != null)) { - idArr.add(it.id) - Media(it) - } else null - else null - } - }.toMutableList() - } else { var i = 1 val list = mutableListOf() var res: Page? = null @@ -1150,7 +1144,6 @@ Page(page:$page,perPage:50) { i++ } return list.reversed().toMutableList() - } } suspend fun getCharacterDetails(character: Character): Character { diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt index 76689047..220f2f18 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -149,11 +149,6 @@ class AnilistAnimeViewModel : ViewModel() { ) } - private val updated: MutableLiveData> = - MutableLiveData>(null) - - fun getUpdated(): LiveData> = updated - suspend fun loadUpdated() = updated.postValue(Anilist.query.recentlyUpdated()) private val animePopular = MutableLiveData(null) @@ -193,29 +188,41 @@ class AnilistAnimeViewModel : ViewModel() { ) var loaded: Boolean = false + private val updated: MutableLiveData> = + MutableLiveData>(null) + fun getUpdated(): LiveData> = updated private val popularMovies: MutableLiveData> = MutableLiveData>(null) fun getMovies(): LiveData> = popularMovies - private val topRated: MutableLiveData> = + private val topRatedAnime: MutableLiveData> = MutableLiveData>(null) - fun getTopRated(): LiveData> = topRated + fun getTopRated(): LiveData> = topRatedAnime - private val mostFav: MutableLiveData> = + private val mostFavAnime: MutableLiveData> = MutableLiveData>(null) - fun getMostFav(): LiveData> = mostFav + fun getMostFav(): LiveData> = mostFavAnime suspend fun loadAll() { - val response = Anilist.query.loadAnimeList() + val res = Anilist.query.loadAnimeList()?.data - val trendingMovie = response?.data?.trendingMovie?.media?.map { Media(it) }?.toMutableList() - popularMovies.postValue(trendingMovie ?: arrayListOf()) + val listOnly: Boolean = PrefManager.getVal(PrefName.RecentlyListOnly) - val topRatedList = response?.data?.topRated?.media?.map { Media(it) }?.toMutableList() - topRated.postValue(topRatedList ?: arrayListOf()) + res?.apply{ + updated.postValue(recentUpdates?.airingSchedules?.mapNotNull {i -> + i.media?.let { + if (!listOnly && (it.countryOfOrigin == "JP" && (if (!Anilist.adult) it.isAdult == false else true)) || (listOnly && it.mediaListEntry != null)){ + Media(it) + }else{ + null + } + } + }?.toMutableList() ?: arrayListOf()) + popularMovies.postValue(trendingMovies?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) + topRatedAnime.postValue(topRated?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) + mostFavAnime.postValue(mostFav?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) + } - val mostFavList = response?.data?.mostFav?.media?.map { Media(it) }?.toMutableList() - mostFav.postValue(mostFavList ?: arrayListOf()) } } @@ -238,19 +245,6 @@ class AnilistMangaViewModel : ViewModel() { )?.results ) - private val updated: MutableLiveData> = - MutableLiveData>(null) - - fun getTrendingNovel(): LiveData> = updated - suspend fun loadTrendingNovel() = - updated.postValue( - Anilist.query.search( - type, - perPage = 10, - sort = Anilist.sortBy[2], - format = "NOVEL" - )?.results - ) private val mangaPopular = MutableLiveData(null) fun getPopular(): LiveData = mangaPopular @@ -302,27 +296,27 @@ class AnilistMangaViewModel : ViewModel() { MutableLiveData>(null) fun getPopularManhwa(): LiveData> = popularManhwa - private val topRated: MutableLiveData> = + private val popularNovel: MutableLiveData> = MutableLiveData>(null) - fun getTopRated(): LiveData> = topRated + fun getPopularNovel(): LiveData> = popularNovel - private val mostFav: MutableLiveData> = + private val topRatedManga: MutableLiveData> = MutableLiveData>(null) - fun getMostFav(): LiveData> = mostFav + fun getTopRated(): LiveData> = topRatedManga + + private val mostFavManga: MutableLiveData> = + MutableLiveData>(null) + fun getMostFav(): LiveData> = mostFavManga suspend fun loadAll() { - val response = Anilist.query.loadMangaList() + val response = Anilist.query.loadMangaList()?.data - val trendingManga = response?.data?.trendingManga?.media?.map { Media(it) }?.toMutableList() - popularManga.postValue(trendingManga ?: arrayListOf()) - - val trendingManhwa = response?.data?.trendingManhwa?.media?.map { Media(it) }?.toMutableList() - popularManhwa.postValue(trendingManhwa ?: arrayListOf()) - - val topRatedList = response?.data?.topRated?.media?.map { Media(it) }?.toMutableList() - topRated.postValue(topRatedList ?: arrayListOf()) - - val mostFavList = response?.data?.mostFav?.media?.map { Media(it) }?.toMutableList() - mostFav.postValue(mostFavList ?: arrayListOf()) + response?.apply { + popularManga.postValue(trendingManga?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) + popularManhwa.postValue(trendingManhwa?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) + popularNovel.postValue(trendingNovel?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) + topRatedManga.postValue(topRated?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) + mostFavManga.postValue(mostFav?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) + } } } diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt b/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt index 512974ce..7d71af32 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt @@ -159,7 +159,8 @@ class Query { ) { @Serializable data class Data( - @SerialName("trendingMovie") val trendingMovie: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("recentUpdates") val recentUpdates: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("trendingMovies") val trendingMovies: ani.dantotsu.connections.anilist.api.Page?, @SerialName("topRated") val topRated: ani.dantotsu.connections.anilist.api.Page?, @SerialName("mostFav") val mostFav: ani.dantotsu.connections.anilist.api.Page?, ) @@ -173,6 +174,7 @@ class Query { data class Data( @SerialName("trendingManga") val trendingManga: ani.dantotsu.connections.anilist.api.Page?, @SerialName("trendingManhwa") val trendingManhwa: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("trendingNovel") val trendingNovel: ani.dantotsu.connections.anilist.api.Page?, @SerialName("topRated") val topRated: ani.dantotsu.connections.anilist.api.Page?, @SerialName("mostFav") val mostFav: ani.dantotsu.connections.anilist.api.Page?, ) From 99b3bbaaad8cb3b2ef44a0d898b85a9c1f6d636f Mon Sep 17 00:00:00 2001 From: aayush262 Date: Sat, 30 Mar 2024 15:44:29 +0530 Subject: [PATCH 04/11] feat: adult only media option --- .../java/ani/dantotsu/home/AnimeFragment.kt | 1 - .../ani/dantotsu/home/AnimePageAdapter.kt | 91 ++++++------- .../java/ani/dantotsu/home/MangaFragment.kt | 3 +- .../ani/dantotsu/home/MangaPageAdapter.kt | 124 ++++++++---------- .../dantotsu/media/OtherDetailsViewModel.kt | 2 +- .../ani/dantotsu/settings/SettingsActivity.kt | 9 +- .../dantotsu/settings/saving/Preferences.kt | 6 +- app/src/main/res/layout/activity_profile.xml | 8 +- .../res/layout/activity_settings_anime.xml | 3 +- .../res/layout/activity_settings_common.xml | 18 +++ .../res/layout/activity_settings_manga.xml | 2 +- app/src/main/res/layout/item_manga_page.xml | 4 +- app/src/main/res/values/strings.xml | 1 + 13 files changed, 137 insertions(+), 135 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt b/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt index 3f530fde..0be7a3e2 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt @@ -278,7 +278,6 @@ class AnimeFragment : Fragment() { } model.loaded = true model.loadTrending(1) - model.loadUpdated() model.loadAll() model.loadPopular( "ANIME", sort = Anilist.sortBy[1], onList = PrefManager.getVal( diff --git a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt index f0cd245e..d6b8d7f6 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt @@ -195,70 +195,61 @@ class AnimePageAdapter : RecyclerView.Adapter if (i == true) { - model.getTrendingNovel().observe(viewLifecycleOwner) { + model.getPopularNovel().observe(viewLifecycleOwner) { if (it != null) { mangaPageAdapter.updateNovel(MediaAdaptor(0, it, requireActivity())) } @@ -257,7 +257,6 @@ class MangaFragment : Fragment() { } model.loaded = true model.loadTrending() - model.loadTrendingNovel() model.loadAll() model.loadPopular( "MANGA", sort = Anilist.sortBy[1], onList = PrefManager.getVal( diff --git a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt index 213c61d2..27f4c8ea 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt @@ -182,86 +182,72 @@ class MangaPageAdapter : RecyclerView.Adapter>> = calendar suspend fun loadCalendar() { val curr = System.currentTimeMillis() / 1000 - val res = Anilist.query.recentlyUpdated(false, curr - 86400, curr + (86400 * 6)) + val res = Anilist.query.recentlyUpdated(curr - 86400, curr + (86400 * 6)) val df = DateFormat.getDateInstance(DateFormat.FULL) val map = mutableMapOf>() val idMap = mutableMapOf>() diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index 19d03161..7950d282 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -457,7 +457,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene settingsIncludeAnimeList.isChecked = PrefManager.getVal(PrefName.IncludeAnimeList) settingsIncludeAnimeList.setOnCheckedChangeListener { _, isChecked -> PrefManager.setVal(PrefName.IncludeAnimeList, isChecked) + restartApp(binding.root) } + var previousEp: View = when (PrefManager.getVal(PrefName.AnimeDefaultView)) { 0 -> settingsEpList 1 -> settingsEpGrid @@ -548,6 +550,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene settingsIncludeMangaList.isChecked = PrefManager.getVal(PrefName.IncludeMangaList) settingsIncludeMangaList.setOnCheckedChangeListener { _, isChecked -> PrefManager.setVal(PrefName.IncludeMangaList, isChecked) + restartApp(binding.root) } } @@ -721,7 +724,11 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene settingsRecentlyListOnly.setOnCheckedChangeListener { _, isChecked -> PrefManager.setVal(PrefName.RecentlyListOnly, isChecked) } - + settingsAdultAnimeOnly.isChecked = PrefManager.getVal(PrefName.AdultOnly) + settingsAdultAnimeOnly.setOnCheckedChangeListener { _, isChecked -> + PrefManager.setVal(PrefName.AdultOnly, isChecked) + restartApp(binding.root) + } var previousStart: View = when (PrefManager.getVal(PrefName.DefaultStartUpTab)) { 0 -> uiSettingsAnime 1 -> uiSettingsHome diff --git a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt index bb4b3f1e..aebc894a 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt @@ -40,6 +40,9 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files LastAnilistNotificationId(Pref(Location.General, Int::class, 0)), AnilistFilteredTypes(Pref(Location.General, Set::class, setOf())), UseAlarmManager(Pref(Location.General, Boolean::class, false)), + IncludeAnimeList(Pref(Location.General, Boolean::class, true)), + IncludeMangaList(Pref(Location.General, Boolean::class, true)), + AdultOnly(Pref(Location.General, Boolean::class, false)), //User Interface UseOLED(Pref(Location.UI, Boolean::class, false)), @@ -77,8 +80,7 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files MangaListSortOrder(Pref(Location.UI, String::class, "score")), CommentSortOrder(Pref(Location.UI, String::class, "newest")), FollowerLayout(Pref(Location.UI, Int::class, 0)), - IncludeAnimeList(Pref(Location.UI, Boolean::class, true)), - IncludeMangaList(Pref(Location.UI, Boolean::class, true)), + //Player DefaultSpeed(Pref(Location.Player, Int::class, 5)), diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 87d79dcb..dcde0a9a 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -150,7 +150,7 @@ android:id="@+id/profileFollowerCountContainer" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginVertical="8dp" + android:layout_marginVertical="4dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> @@ -180,7 +180,7 @@ android:id="@+id/profileFollowingCountContainer" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginVertical="8dp" + android:layout_marginVertical="4dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> @@ -210,7 +210,7 @@ android:id="@+id/profileAnimeCountContainer" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginVertical="8dp" + android:layout_marginVertical="4dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> @@ -240,7 +240,7 @@ android:id="@+id/profileMangaCountContainer" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginVertical="8dp" + android:layout_marginVertical="4dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> diff --git a/app/src/main/res/layout/activity_settings_anime.xml b/app/src/main/res/layout/activity_settings_anime.xml index a3193bba..49793f34 100644 --- a/app/src/main/res/layout/activity_settings_anime.xml +++ b/app/src/main/res/layout/activity_settings_anime.xml @@ -198,7 +198,6 @@ android:id="@+id/settingsIncludeAnimeList" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="16dp" android:checked="true" android:drawableStart="@drawable/ic_round_movie_filter_24" android:drawablePadding="16dp" @@ -212,5 +211,7 @@ app:drawableTint="?attr/colorPrimary" app:showText="false" app:thumbTint="@color/button_switch_track" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings_common.xml b/app/src/main/res/layout/activity_settings_common.xml index acee97cd..3eab0449 100644 --- a/app/src/main/res/layout/activity_settings_common.xml +++ b/app/src/main/res/layout/activity_settings_common.xml @@ -2,6 +2,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings_manga.xml b/app/src/main/res/layout/activity_settings_manga.xml index 9b955c71..7bc6b84c 100644 --- a/app/src/main/res/layout/activity_settings_manga.xml +++ b/app/src/main/res/layout/activity_settings_manga.xml @@ -162,7 +162,7 @@ android:id="@+id/settingsIncludeMangaList" android:layout_width="match_parent" android:layout_height="wrap_content" - android:checked="true" + android:checked="false" android:drawableStart="@drawable/ic_round_movie_filter_24" android:drawablePadding="16dp" android:elegantTextHeight="true" diff --git a/app/src/main/res/layout/item_manga_page.xml b/app/src/main/res/layout/item_manga_page.xml index e711f136..a85d1208 100644 --- a/app/src/main/res/layout/item_manga_page.xml +++ b/app/src/main/res/layout/item_manga_page.xml @@ -327,8 +327,7 @@ android:layout_marginStart="24dp" android:layout_marginEnd="24dp" android:orientation="horizontal" - android:visibility="invisible" - tools:visibility="visible"> + android:visibility="invisible"> Top rated Most Favourite Trending Manhwa + Adult only content From 04f2034dd156ca35b51d940517f0d4802e061881 Mon Sep 17 00:00:00 2001 From: aayush262 Date: Sun, 31 Mar 2024 09:08:54 +0530 Subject: [PATCH 05/11] fix: duplicate media --- .../connections/anilist/AnilistViewModel.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt index 220f2f18..acbc4f8c 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -209,20 +209,21 @@ class AnilistAnimeViewModel : ViewModel() { val listOnly: Boolean = PrefManager.getVal(PrefName.RecentlyListOnly) res?.apply{ + val idArr = mutableListOf() updated.postValue(recentUpdates?.airingSchedules?.mapNotNull {i -> i.media?.let { - if (!listOnly && (it.countryOfOrigin == "JP" && (if (!Anilist.adult) it.isAdult == false else true)) || (listOnly && it.mediaListEntry != null)){ - Media(it) - }else{ - null - } + if (!idArr.contains(it.id)) + if (!listOnly && (it.countryOfOrigin == "JP" && (if (!Anilist.adult) it.isAdult == false else true)) || (listOnly && it.mediaListEntry != null)) { + idArr.add(it.id) + Media(it) + } else null + else null } }?.toMutableList() ?: arrayListOf()) popularMovies.postValue(trendingMovies?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) topRatedAnime.postValue(topRated?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) mostFavAnime.postValue(mostFav?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) } - } } From f30e6b7809763c9ef603022fba440a7c6af3adc5 Mon Sep 17 00:00:00 2001 From: aayush262 Date: Sun, 31 Mar 2024 12:23:17 +0530 Subject: [PATCH 06/11] fix: banner animation --- app/src/main/java/ani/dantotsu/home/HomeFragment.kt | 5 +++-- app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt | 5 +++-- .../java/ani/dantotsu/profile/ProfileActivity.kt | 7 +++++-- app/src/main/res/layout/activity_profile.xml | 10 +++++++++- app/src/main/res/layout/fragment_home.xml | 12 ++++++++++-- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt index c3a154a2..b9b6862a 100644 --- a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt @@ -80,8 +80,8 @@ class HomeFragment : Fragment() { binding.homeUserEpisodesWatched.text = Anilist.episodesWatched.toString() binding.homeUserChaptersRead.text = Anilist.chapterRead.toString() binding.homeUserAvatar.loadImage(Anilist.avatar) - if (!(PrefManager.getVal(PrefName.BannerAnimations) as Boolean)) binding.homeUserBg.pause() - blurImage(binding.homeUserBg, Anilist.bg) + val bannerAnimations: Boolean = PrefManager.getVal(PrefName.BannerAnimations) + blurImage(if (bannerAnimations) binding.homeUserBg else binding.homeUserBgNoKen, Anilist.bg) binding.homeUserDataProgressBar.visibility = View.GONE binding.homeNotificationCount.isVisible = Anilist.unreadNotificationCount > 0 binding.homeNotificationCount.text = Anilist.unreadNotificationCount.toString() @@ -137,6 +137,7 @@ class HomeFragment : Fragment() { bottomMargin = navBarHeight } binding.homeUserBg.updateLayoutParams { height += statusBarHeight } + binding.homeUserBgNoKen.updateLayoutParams { height += statusBarHeight } binding.homeTopContainer.updatePadding(top = statusBarHeight) var reached = false diff --git a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt index 78d264ee..8fa4e1fa 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt @@ -173,6 +173,7 @@ class MediaAdaptor( val b = (holder as MediaPageViewHolder).binding val media = mediaList?.get(position) if (media != null) { + val bannerAnimations: Boolean = PrefManager.getVal(PrefName.BannerAnimations) b.itemCompactImage.loadImage(media.cover) if (bannerAnimations) @@ -182,7 +183,7 @@ class MediaAdaptor( AccelerateDecelerateInterpolator() ) ) - blurImage(b.itemCompactBanner, media.banner ?: media.cover) + blurImage(if (bannerAnimations) b.itemCompactBanner else b.itemCompactBannerNoKen , media.banner ?: media.cover) b.itemCompactOngoing.isVisible = media.status == currActivity()!!.getString(R.string.status_releasing) b.itemCompactTitle.text = media.userPreferredName @@ -231,7 +232,7 @@ class MediaAdaptor( AccelerateDecelerateInterpolator() ) ) - blurImage(b.itemCompactBanner, media.banner ?: media.cover) + blurImage(if (bannerAnimations) b.itemCompactBanner else b.itemCompactBannerNoKen , media.banner ?: media.cover) b.itemCompactOngoing.isVisible = media.status == currActivity()!!.getString(R.string.status_releasing) b.itemCompactTitle.text = media.userPreferredName diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index abbe26e5..90fd0278 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -6,6 +6,7 @@ import android.content.res.Configuration import android.os.Bundle import android.view.View import android.view.ViewGroup +import android.widget.ImageView import android.widget.PopupMenu import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat @@ -189,9 +190,11 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene val userLevelText = "${user.name} $userLevel" binding.profileUserName.text = userLevelText - if (!(PrefManager.getVal(PrefName.BannerAnimations) as Boolean)) binding.profileBannerImage.pause() - blurImage(binding.profileBannerImage, user.bannerImage ?: user.avatar?.medium) + val bannerAnimations: Boolean = PrefManager.getVal(PrefName.BannerAnimations) + + blurImage(if (bannerAnimations) binding.profileBannerImage else binding.profileBannerImageNoKen as ImageView, user.bannerImage ?: user.avatar?.medium) binding.profileBannerImage.updateLayoutParams { height += statusBarHeight } + binding.profileBannerImageNoKen?.updateLayoutParams { height += statusBarHeight } binding.profileBannerGradient.updateLayoutParams { height += statusBarHeight } binding.profileMenuButton.updateLayoutParams { topMargin += statusBarHeight } binding.profileButtonContainer.updateLayoutParams { topMargin += statusBarHeight } diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index dcde0a9a..10efe6e4 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -46,6 +46,14 @@ tools:ignore="ContentDescription" tools:src="@tools:sample/backgrounds/scenic" /> + + + + + android:padding="32dp"> Date: Sun, 31 Mar 2024 16:18:38 +0530 Subject: [PATCH 07/11] fix: adult only in recent too --- .../connections/anilist/AnilistViewModel.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt index acbc4f8c..fd892c5f 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -5,6 +5,8 @@ import androidx.fragment.app.FragmentActivity import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.webkit.internal.ApiFeature.P +import androidx.webkit.internal.StartupApiFeature import ani.dantotsu.BuildConfig import ani.dantotsu.R import ani.dantotsu.connections.discord.Discord @@ -207,16 +209,22 @@ class AnilistAnimeViewModel : ViewModel() { val res = Anilist.query.loadAnimeList()?.data val listOnly: Boolean = PrefManager.getVal(PrefName.RecentlyListOnly) - + val adultOnly: Boolean = PrefManager.getVal(PrefName.AdultOnly) res?.apply{ val idArr = mutableListOf() updated.postValue(recentUpdates?.airingSchedules?.mapNotNull {i -> i.media?.let { if (!idArr.contains(it.id)) - if (!listOnly && (it.countryOfOrigin == "JP" && (if (!Anilist.adult) it.isAdult == false else true)) || (listOnly && it.mediaListEntry != null)) { + if (!listOnly && it.countryOfOrigin == "JP" && Anilist.adult && adultOnly && it.isAdult == true) { idArr.add(it.id) Media(it) - } else null + }else if (!listOnly && !adultOnly && (it.countryOfOrigin == "JP" && it.isAdult == false)){ + idArr.add(it.id) + Media(it) + }else if ((listOnly && it.mediaListEntry != null)) { + idArr.add(it.id) + Media(it) + }else null else null } }?.toMutableList() ?: arrayListOf()) From 76e11e5a3e58a2743f20683972c07e7fe54f6eec Mon Sep 17 00:00:00 2001 From: aayush262 Date: Sun, 31 Mar 2024 16:43:55 +0530 Subject: [PATCH 08/11] fix: removed unused banners --- .../connections/anilist/AnilistQueries.kt | 5 --- .../connections/anilist/AnilistViewModel.kt | 35 +------------------ .../dantotsu/connections/anilist/api/Data.kt | 5 +-- 3 files changed, 2 insertions(+), 43 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 510e5cd9..8e83a9e5 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -1429,15 +1429,10 @@ Page(page:$page,perPage:50) { """{ favoriteAnime:${userFavMediaQuery(true, 1, id)} favoriteManga:${userFavMediaQuery(false, 1, id)} - animeMediaList:${bannerImageQuery("ANIME", id)} - mangaMediaList:${bannerImageQuery("MANGA", id)} }""".trimIndent(), force = true ) } - private fun bannerImageQuery(type: String, id: Int?): String { - return """MediaListCollection(userId: ${id}, type: $type, chunk:1,perChunk:25, sort: [SCORE_DESC,UPDATED_TIME_DESC]) { lists { entries{ media { id bannerImage } } } }""" - } suspend fun getNotifications(id: Int, page: Int = 1, resetNotification: Boolean = true): NotificationResponse? { val reset = if (resetNotification) "true" else "false" diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt index fd892c5f..243e2792 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -60,45 +60,36 @@ class AnilistHomeViewModel : ViewModel() { MutableLiveData>(null) fun getAnimeContinue(): LiveData> = animeContinue - suspend fun setAnimeContinue() = animeContinue.postValue(Anilist.query.continueMedia("ANIME")) private val animeFav: MutableLiveData> = MutableLiveData>(null) fun getAnimeFav(): LiveData> = animeFav - suspend fun setAnimeFav() = animeFav.postValue(Anilist.query.favMedia(true)) private val animePlanned: MutableLiveData> = MutableLiveData>(null) fun getAnimePlanned(): LiveData> = animePlanned - suspend fun setAnimePlanned() = - animePlanned.postValue(Anilist.query.continueMedia("ANIME", true)) private val mangaContinue: MutableLiveData> = MutableLiveData>(null) fun getMangaContinue(): LiveData> = mangaContinue - suspend fun setMangaContinue() = mangaContinue.postValue(Anilist.query.continueMedia("MANGA")) private val mangaFav: MutableLiveData> = MutableLiveData>(null) fun getMangaFav(): LiveData> = mangaFav - suspend fun setMangaFav() = mangaFav.postValue(Anilist.query.favMedia(false)) private val mangaPlanned: MutableLiveData> = MutableLiveData>(null) fun getMangaPlanned(): LiveData> = mangaPlanned - suspend fun setMangaPlanned() = - mangaPlanned.postValue(Anilist.query.continueMedia("MANGA", true)) private val recommendation: MutableLiveData> = MutableLiveData>(null) fun getRecommendation(): LiveData> = recommendation - suspend fun setRecommendation() = recommendation.postValue(Anilist.query.recommendations()) suspend fun initHomePage() { val res = Anilist.query.initHomePage() @@ -406,11 +397,6 @@ class ProfileViewModel : ViewModel() { fun getAnimeFav(): LiveData> = animeFav - private val listImages: MutableLiveData> = - MutableLiveData>(arrayListOf()) - - fun getListImages(): LiveData> = listImages - suspend fun setData(id: Int) { val res = Anilist.query.initProfilePage(id) val mangaList = res?.data?.favoriteManga?.favourites?.manga?.edges?.mapNotNull { @@ -426,30 +412,11 @@ class ProfileViewModel : ViewModel() { } animeFav.postValue(ArrayList(animeList ?: arrayListOf())) - val bannerImages = arrayListOf(null, null) - val animeRandom = res?.data?.animeMediaList?.lists?.mapNotNull { - it.entries?.mapNotNull { entry -> - val imageUrl = entry.media?.bannerImage - if (imageUrl != null && imageUrl != "null") imageUrl - else null - } - }?.flatten()?.randomOrNull() - bannerImages[0] = animeRandom - val mangaRandom = res?.data?.mangaMediaList?.lists?.mapNotNull { - it.entries?.mapNotNull { entry -> - val imageUrl = entry.media?.bannerImage - if (imageUrl != null && imageUrl != "null") imageUrl - else null - } - }?.flatten()?.randomOrNull() - bannerImages[1] = mangaRandom - listImages.postValue(bannerImages) - } fun refresh() { mangaFav.postValue(mangaFav.value) animeFav.postValue(animeFav.value) - listImages.postValue(listImages.value) + } } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt b/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt index 7d71af32..20f35035 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt @@ -147,10 +147,7 @@ class Query { @Serializable data class Data( @SerialName("favoriteAnime") val favoriteAnime: ani.dantotsu.connections.anilist.api.User?, - @SerialName("favoriteManga") val favoriteManga: ani.dantotsu.connections.anilist.api.User?, - @SerialName("animeMediaList") val animeMediaList: ani.dantotsu.connections.anilist.api.MediaListCollection?, - @SerialName("mangaMediaList") val mangaMediaList: ani.dantotsu.connections.anilist.api.MediaListCollection? - ) + @SerialName("favoriteManga") val favoriteManga: ani.dantotsu.connections.anilist.api.User?) } @Serializable data class AnimeList( From 95b293953297349fcdcb50d1a7e84dc5ec688c4d Mon Sep 17 00:00:00 2001 From: aayush262 Date: Sun, 31 Mar 2024 16:44:27 +0530 Subject: [PATCH 09/11] fix: hide recent if its empty --- .../ani/dantotsu/home/AnimePageAdapter.kt | 6 +- app/src/main/res/layout/item_anime_page.xml | 75 ++++++++++--------- 2 files changed, 46 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt index d6b8d7f6..9861113a 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt @@ -203,8 +203,12 @@ class AnimePageAdapter : RecyclerView.Adapter - + android:orientation="horizontal"> - - - - - + android:layout_height="wrap_content" + android:layout_marginStart="24dp" + android:fontFamily="@font/poppins_bold" + android:padding="8dp" + android:text="@string/updated" + android:textSize="16sp" + android:visibility="invisible" + tools:visibility="visible" /> - + + + + + + + + Date: Sun, 31 Mar 2024 18:23:29 +0530 Subject: [PATCH 10/11] feat: Download subs --- .../media/anime/SelectorDialogFragment.kt | 42 +++++++++++++++++++ app/src/main/res/layout/item_anime_page.xml | 2 +- app/src/main/res/layout/item_url.xml | 14 ++++++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt index 292a9660..5ecd8af7 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt @@ -30,10 +30,13 @@ import ani.dantotsu.currActivity import ani.dantotsu.databinding.BottomSheetSelectorBinding import ani.dantotsu.databinding.ItemStreamBinding import ani.dantotsu.databinding.ItemUrlBinding +import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.video.Helper import ani.dantotsu.hideSystemBars import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsViewModel +import ani.dantotsu.media.MediaType +import ani.dantotsu.media.SubtitleDownloader import ani.dantotsu.navBarHeight import ani.dantotsu.others.Download.download import ani.dantotsu.parsers.Subtitle @@ -376,6 +379,45 @@ class SelectorDialogFragment : BottomSheetDialogFragment() { } else { binding.urlDownload.visibility = View.GONE } + val subtitles = extractor.subtitles + if (subtitles.isNotEmpty()) { + binding.urlSub.visibility = View.VISIBLE + } else { + binding.urlSub.visibility = View.GONE + } + binding.urlSub.setOnClickListener { + if (subtitles.isNotEmpty()) { + val subtitleNames = subtitles.map { it.language } + var subtitleToDownload: Subtitle? = null + val alertDialog = AlertDialog.Builder(context, R.style.MyPopup) + .setTitle("Download Subtitle") + .setSingleChoiceItems( + subtitleNames.toTypedArray(), + -1 + ) { _, which -> + subtitleToDownload = subtitles[which] + } + .setPositiveButton("Download") { dialog, _ -> + scope.launch { + if (subtitleToDownload != null) { + SubtitleDownloader.downloadSubtitle( + requireContext(), + subtitleToDownload!!.file.url, + DownloadedType(media!!.mainName(), media!!.anime!!.episodes!![media!!.anime!!.selectedEpisode!!]!!.number, MediaType.ANIME) + ) + } + } + dialog.dismiss() + } + .setNegativeButton("Cancel") { dialog, _ -> + dialog.dismiss() + } + .show() + alertDialog.window?.setDimAmount(0.8f) + } else { + snackString("No Subtitles Available") + } + } binding.urlDownload.setSafeOnClickListener { media!!.anime!!.episodes!![media!!.anime!!.selectedEpisode!!]!!.selectedExtractor = extractor.server.name diff --git a/app/src/main/res/layout/item_anime_page.xml b/app/src/main/res/layout/item_anime_page.xml index f9d3c673..13cc155c 100644 --- a/app/src/main/res/layout/item_anime_page.xml +++ b/app/src/main/res/layout/item_anime_page.xml @@ -182,7 +182,7 @@ android:id="@+id/animeRecentlyContainer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal"> + android:orientation="vertical"> - + Date: Mon, 1 Apr 2024 11:15:24 +0600 Subject: [PATCH 11/11] Add CommitHash to Version Name :prayge: (#307) --- app/build.gradle | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b4ab706b..12fc9b90 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,6 +6,10 @@ plugins { id 'com.google.devtools.ksp' } +def gitCommitHash = providers.exec { + commandLine("git", "rev-parse", "--verify", "--short", "HEAD") +}.standardOutput.asText.get().trim() + android { compileSdk 34 @@ -38,7 +42,7 @@ android { buildTypes { alpha { applicationIdSuffix ".beta" // keep as beta by popular request - versionNameSuffix "-alpha01" + versionNameSuffix "-alpha01-" + gitCommitHash manifestPlaceholders.icon_placeholder = "@mipmap/ic_launcher_alpha" manifestPlaceholders.icon_placeholder_round = "@mipmap/ic_launcher_alpha_round" debuggable System.getenv("CI") == null