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 4e02d228..acd81cff 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -1022,7 +1022,49 @@ 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, onList:${PrefManager.getVal(PrefName.IncludeAnimeList)}){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,onList:${PrefManager.getVal(PrefName.IncludeAnimeList)}){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,onList:${PrefManager.getVal(PrefName.IncludeAnimeList)}){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()} + topRated:${topRatedAnime()} + mostFav:${mostFavAnime()} + }""".trimIndent(), force = true + ) + } + + private fun trendingManga(): String{ + return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, onList:${PrefManager.getVal(PrefName.IncludeMangaList)}){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 onList:${PrefManager.getVal(PrefName.IncludeMangaList)}){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,onList:${PrefManager.getVal(PrefName.IncludeMangaList)}){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,onList:${PrefManager.getVal(PrefName.IncludeMangaList)}){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()} + topRated:${topRatedManga()} + mostFav:${mostFavManga()} + }""".trimIndent(), force = true + ) + + } suspend fun recentlyUpdated( smaller: Boolean = true, greater: Long = 0, 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 a4092b91..76689047 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -156,6 +156,7 @@ class AnilistAnimeViewModel : ViewModel() { suspend fun loadUpdated() = updated.postValue(Anilist.query.recentlyUpdated()) private val animePopular = MutableLiveData(null) + fun getPopular(): LiveData = animePopular suspend fun loadPopular( type: String, @@ -192,6 +193,30 @@ class AnilistAnimeViewModel : ViewModel() { ) var loaded: Boolean = false + + private val popularMovies: MutableLiveData> = + MutableLiveData>(null) + fun getMovies(): LiveData> = popularMovies + + private val topRated: MutableLiveData> = + MutableLiveData>(null) + fun getTopRated(): LiveData> = topRated + + private val mostFav: MutableLiveData> = + MutableLiveData>(null) + fun getMostFav(): LiveData> = mostFav + suspend fun loadAll() { + val response = Anilist.query.loadAnimeList() + + val trendingMovie = response?.data?.trendingMovie?.media?.map { Media(it) }?.toMutableList() + popularMovies.postValue(trendingMovie ?: 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()) + } } class AnilistMangaViewModel : ViewModel() { @@ -268,6 +293,37 @@ class AnilistMangaViewModel : ViewModel() { ) var loaded: Boolean = false + + private val popularManga: MutableLiveData> = + MutableLiveData>(null) + fun getPopularManga(): LiveData> = popularManga + + private val popularManhwa: MutableLiveData> = + MutableLiveData>(null) + fun getPopularManhwa(): LiveData> = popularManhwa + + private val topRated: MutableLiveData> = + MutableLiveData>(null) + fun getTopRated(): LiveData> = topRated + + private val mostFav: MutableLiveData> = + MutableLiveData>(null) + fun getMostFav(): LiveData> = mostFav + suspend fun loadAll() { + val response = Anilist.query.loadMangaList() + + 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()) + } } class AnilistSearch : ViewModel() { 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 58445406..512974ce 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 @@ -152,7 +152,31 @@ class Query { @SerialName("mangaMediaList") val mangaMediaList: ani.dantotsu.connections.anilist.api.MediaListCollection? ) } - + @Serializable + data class AnimeList( + @SerialName("data") + val data: Data? + ) { + @Serializable + data class Data( + @SerialName("trendingMovie") val trendingMovie: 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?, + ) + } + @Serializable + data class MangaList( + @SerialName("data") + val data: Data? + ) { + @Serializable + data class Data( + @SerialName("trendingManga") val trendingManga: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("trendingManhwa") val trendingManhwa: 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?, + ) + } @Serializable data class ToggleFollow( @SerialName("data") diff --git a/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt b/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt index c7434c96..3f530fde 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt @@ -207,6 +207,21 @@ class AnimeFragment : Fragment() { animePageAdapter.updateRecent(MediaAdaptor(0, it, requireActivity())) } } + model.getMovies().observe(viewLifecycleOwner) { + if (it != null) { + animePageAdapter.updateMovies(MediaAdaptor(0, it, requireActivity())) + } + } + model.getTopRated().observe(viewLifecycleOwner) { + if (it != null) { + animePageAdapter.updateTopRated(MediaAdaptor(0, it, requireActivity())) + } + } + model.getMostFav().observe(viewLifecycleOwner) { + if (it != null) { + animePageAdapter.updateMostFav(MediaAdaptor(0, it, requireActivity())) + } + } if (animePageAdapter.trendingViewPager != null) { animePageAdapter.updateHeight() model.getTrending().observe(viewLifecycleOwner) { @@ -264,6 +279,7 @@ class AnimeFragment : Fragment() { model.loaded = true model.loadTrending(1) model.loadUpdated() + model.loadAll() model.loadPopular( "ANIME", sort = Anilist.sortBy[1], onList = PrefManager.getVal( PrefName.PopularAnimeList diff --git a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt index 2aacbda4..f0cd245e 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt @@ -212,7 +212,55 @@ class AnimePageAdapter : RecyclerView.Adapter() { - + private var autoSelect = true var subscribe: MediaDetailsActivity.PopImageButton? = null private var _binding: ItemAnimeWatchBinding? = null @@ -437,7 +437,8 @@ class AnimeWatchAdapter( val sourceFound = media.anime.episodes!!.isNotEmpty() binding.animeSourceNotFound.isGone = sourceFound binding.faqbutton.isGone = sourceFound - if (!sourceFound && PrefManager.getVal(PrefName.SearchSources)) { + + if (!sourceFound && PrefManager.getVal(PrefName.SearchSources) && autoSelect) { if (binding.animeSource.adapter.count > media.selected!!.sourceIndex + 1) { val nextIndex = media.selected!!.sourceIndex + 1 binding.animeSource.setText(binding.animeSource.adapter @@ -453,6 +454,7 @@ class AnimeWatchAdapter( fragment.loadEpisodes(nextIndex, false) } } + binding.animeSource.setOnClickListener { autoSelect = false } } else { binding.animeSourceContinue.visibility = View.GONE binding.animeSourceNotFound.visibility = View.GONE diff --git a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt index 40c96829..be624b29 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt @@ -55,12 +55,12 @@ class FeedFragment : Fragment() { if (userId == -1) userId = null global = arguments?.getBoolean("global", false) ?: false - val navBar = if (userId != null) - (activity as ProfileActivity).navBar - else - (activity as FeedActivity).navBar + val navBar = if (userId != null) { + (activity as ProfileActivity).navBar + }else{ + (activity as FeedActivity).navBar + } binding.listRecyclerView.setBaseline(navBar) - binding.listRecyclerView.adapter = adapter binding.listRecyclerView.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) @@ -72,10 +72,11 @@ class FeedFragment : Fragment() { super.onResume() if (this::binding.isInitialized) { binding.root.requestLayout() - val navBar = if (userId != null) + val navBar = if (userId != null) { (activity as ProfileActivity).navBar - else + }else{ (activity as FeedActivity).navBar + } binding.listRecyclerView.setBaseline(navBar) if (!loadedFirstTime) { activity.lifecycleScope.launch(Dispatchers.IO) { diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index 8733da53..19d03161 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -454,7 +454,10 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene settingsShowYt.setOnCheckedChangeListener { _, isChecked -> PrefManager.setVal(PrefName.ShowYtButton, isChecked) } - + settingsIncludeAnimeList.isChecked = PrefManager.getVal(PrefName.IncludeAnimeList) + settingsIncludeAnimeList.setOnCheckedChangeListener { _, isChecked -> + PrefManager.setVal(PrefName.IncludeAnimeList, isChecked) + } var previousEp: View = when (PrefManager.getVal(PrefName.AnimeDefaultView)) { 0 -> settingsEpList 1 -> settingsEpGrid @@ -541,6 +544,11 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene settingsChpCompact.setOnClickListener { uiChp(1, it) } + + settingsIncludeMangaList.isChecked = PrefManager.getVal(PrefName.IncludeMangaList) + settingsIncludeMangaList.setOnCheckedChangeListener { _, isChecked -> + PrefManager.setVal(PrefName.IncludeMangaList, isChecked) + } } bindingExtensions = ActivitySettingsExtensionsBinding.bind(binding.root).apply { 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 76e80bb2..bb4b3f1e 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt @@ -77,6 +77,8 @@ 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/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt b/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt index 06202ea0..498f6739 100644 --- a/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt +++ b/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt @@ -140,13 +140,13 @@ class ProfileStatsWidget : AppWidgetProvider() { ) ) setTextColor(R.id.userLabel, titleTextColor) - setTextColor(R.id.topLeftItem, statsTextColor) + setTextColor(R.id.topLeftItem, titleTextColor) setTextColor(R.id.topLeftLabel, statsTextColor) - setTextColor(R.id.topRightItem, statsTextColor) + setTextColor(R.id.topRightItem, titleTextColor) setTextColor(R.id.topRightLabel, statsTextColor) - setTextColor(R.id.bottomLeftItem, statsTextColor) + setTextColor(R.id.bottomLeftItem, titleTextColor) setTextColor(R.id.bottomLeftLabel, statsTextColor) - setTextColor(R.id.bottomRightItem, statsTextColor) + setTextColor(R.id.bottomRightItem, titleTextColor) setTextColor(R.id.bottomRightLabel, statsTextColor) setImageViewBitmap( diff --git a/app/src/main/res/layout/activity_settings_anime.xml b/app/src/main/res/layout/activity_settings_anime.xml index c24b8114..a3193bba 100644 --- a/app/src/main/res/layout/activity_settings_anime.xml +++ b/app/src/main/res/layout/activity_settings_anime.xml @@ -181,7 +181,6 @@ android:id="@+id/settingsShowYt" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="16dp" android:checked="true" android:drawableStart="@drawable/ic_round_play_circle_24" android:drawablePadding="16dp" @@ -195,5 +194,23 @@ 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_manga.xml b/app/src/main/res/layout/activity_settings_manga.xml index 66939e74..9b955c71 100644 --- a/app/src/main/res/layout/activity_settings_manga.xml +++ b/app/src/main/res/layout/activity_settings_manga.xml @@ -158,7 +158,23 @@ app:iconPadding="16dp" app:iconSize="24dp" app:iconTint="?attr/colorPrimary" /> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:orientation="vertical" + android:theme="@style/Theme.Dantotsu.AppWidgetContainer"> + tools:ignore="ContentDescription" /> + android:baselineAligned="false" + android:gravity="center_horizontal" + android:orientation="horizontal"> + + tools:ignore="ContentDescription" /> + + android:text="@string/loading" + android:textSize="18sp" /> + android:gravity="center" + android:orientation="vertical" + android:padding="4dp"> + + android:layout_weight="1" + android:baselineAligned="false" + android:orientation="horizontal"> + + + android:text="@string/loading" /> + @@ -96,21 +101,23 @@ android:layout_gravity="center" android:layout_weight="1" android:orientation="vertical"> + + android:text="@string/loading" /> + + android:gravity="center" + android:text="@string/episodes_watched_n" /> @@ -125,10 +132,11 @@ android:id="@+id/bottomLeft" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_weight="1" android:layout_gravity="center" - android:orientation="horizontal" - android:baselineAligned="false"> + android:layout_weight="1" + android:baselineAligned="false" + android:orientation="horizontal"> + + + android:text="@string/loading" /> + + android:fontFamily="@font/poppins_semi_bold" + android:gravity="center" + android:text="@string/manga_read" /> + + android:text="@string/loading" /> + + android:gravity="center" + android:text="@string/chapters_read_n" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5f02f550..a3ade9bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -839,4 +839,9 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc Title Color Stats Text Color Placeholder + Trending Movies + Include list + Top rated + Most Favourite + Trending Manhwa