diff --git a/app/src/main/java/ani/dantotsu/MainActivity.kt b/app/src/main/java/ani/dantotsu/MainActivity.kt index 8a45b6e3..adf1334f 100644 --- a/app/src/main/java/ani/dantotsu/MainActivity.kt +++ b/app/src/main/java/ani/dantotsu/MainActivity.kt @@ -15,6 +15,7 @@ import android.os.Looper import android.provider.Settings import android.view.LayoutInflater import android.view.View +import android.view.View.OnClickListener import android.view.ViewGroup import android.view.animation.AnticipateInterpolator import android.widget.TextView @@ -54,6 +55,7 @@ import ani.dantotsu.others.CustomBottomDialog import ani.dantotsu.profile.ProfileActivity import ani.dantotsu.profile.activity.FeedActivity import ani.dantotsu.profile.activity.NotificationActivity +import ani.dantotsu.settings.ExtensionsActivity import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefManager.asLiveBool import ani.dantotsu.settings.saving.PrefName @@ -228,17 +230,6 @@ class MainActivity : AppCompatActivity() { } } - val preferences: SourcePreferences = Injekt.get() - if (preferences.animeExtensionUpdatesCount() - .get() > 0 || preferences.mangaExtensionUpdatesCount().get() > 0 - ) { - Toast.makeText( - this, - "You have extension updates available!", - Toast.LENGTH_LONG - ).show() - } - binding.root.isMotionEventSplittingEnabled = false lifecycleScope.launch { @@ -282,6 +273,16 @@ class MainActivity : AppCompatActivity() { binding.root.doOnAttach { initActivity(this) + val preferences: SourcePreferences = Injekt.get() + if (preferences.animeExtensionUpdatesCount() + .get() > 0 || preferences.mangaExtensionUpdatesCount().get() > 0 + ) { + snackString(R.string.extension_updates_available) + ?.setDuration(Snackbar.LENGTH_LONG) + ?.setAction(R.string.review) { + startActivity(Intent(this, ExtensionsActivity::class.java)) + } + } window.navigationBarColor = ContextCompat.getColor(this, android.R.color.transparent) selectedOption = if (fragment != null) { when (fragment) { @@ -482,7 +483,7 @@ class MainActivity : AppCompatActivity() { dialogView.findViewById(R.id.userAgentTextBox)?.hint = "Password" val subtitleTextView = dialogView.findViewById(R.id.subtitle) subtitleTextView?.visibility = View.VISIBLE - subtitleTextView?.text = "Enter your password to decrypt the file" + subtitleTextView?.text = getString(R.string.enter_password_to_decrypt_file) val dialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle("Enter Password") diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt b/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt index 804343f6..fc089716 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt @@ -7,6 +7,7 @@ import android.util.Log import androidx.browser.customtabs.CustomTabsIntent import ani.dantotsu.R import ani.dantotsu.client +import ani.dantotsu.connections.comments.CommentsAPI import ani.dantotsu.currContext import ani.dantotsu.openLinkInBrowser import ani.dantotsu.settings.saving.PrefManager @@ -117,6 +118,9 @@ object Anilist { episodesWatched = null chapterRead = null PrefManager.removeVal(PrefName.AnilistToken) + //logout from comments api + CommentsAPI.logout() + } suspend inline fun executeQuery( 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..4492c414 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){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}}}""" + } + 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}}}""" + } + 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,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}}}""" + } + 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}}}""" + } + 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}}}""" + } + 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}}}""" + } + 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/connections/comments/CommentsAPI.kt b/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt index defb5bad..9c6d473c 100644 --- a/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt +++ b/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt @@ -24,7 +24,7 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object CommentsAPI { - val address: String = "https://1224665.xyz:443" + private const val ADDRESS: String = "https://1224665.xyz:443" var authToken: String? = null var userId: String? = null var isBanned: Boolean = false @@ -33,7 +33,7 @@ object CommentsAPI { var totalVotes: Int = 0 suspend fun getCommentsForId(id: Int, page: Int = 1, tag: Int?, sort: String?): CommentResponse? { - var url = "$address/comments/$id/$page" + var url = "$ADDRESS/comments/$id/$page" val request = requestBuilder() tag?.let { url += "?tag=$it" @@ -61,7 +61,7 @@ object CommentsAPI { } suspend fun getRepliesFromId(id: Int, page: Int = 1): CommentResponse? { - val url = "$address/comments/parent/$id/$page" + val url = "$ADDRESS/comments/parent/$id/$page" val request = requestBuilder() val json = try { request.get(url) @@ -83,7 +83,7 @@ object CommentsAPI { } suspend fun getSingleComment(id: Int): Comment? { - val url = "$address/comments/$id" + val url = "$ADDRESS/comments/$id" val request = requestBuilder() val json = try { request.get(url) @@ -105,7 +105,7 @@ object CommentsAPI { } suspend fun vote(commentId: Int, voteType: Int): Boolean { - val url = "$address/comments/vote/$commentId/$voteType" + val url = "$ADDRESS/comments/vote/$commentId/$voteType" val request = requestBuilder() val json = try { request.post(url) @@ -121,7 +121,7 @@ object CommentsAPI { } suspend fun comment(mediaId: Int, parentCommentId: Int?, content: String, tag: Int?): Comment? { - val url = "$address/comments" + val url = "$ADDRESS/comments" val body = FormBody.Builder() .add("user_id", userId ?: return null) .add("media_id", mediaId.toString()) @@ -169,7 +169,7 @@ object CommentsAPI { } suspend fun deleteComment(commentId: Int): Boolean { - val url = "$address/comments/$commentId" + val url = "$ADDRESS/comments/$commentId" val request = requestBuilder() val json = try { request.delete(url) @@ -185,7 +185,7 @@ object CommentsAPI { } suspend fun editComment(commentId: Int, content: String): Boolean { - val url = "$address/comments/$commentId" + val url = "$ADDRESS/comments/$commentId" val body = FormBody.Builder() .add("content", content) .build() @@ -204,7 +204,7 @@ object CommentsAPI { } suspend fun banUser(userId: String): Boolean { - val url = "$address/ban/$userId" + val url = "$ADDRESS/ban/$userId" val request = requestBuilder() val json = try { request.post(url) @@ -225,7 +225,7 @@ object CommentsAPI { mediaTitle: String, reportedId: String ): Boolean { - val url = "$address/report/$commentId" + val url = "$ADDRESS/report/$commentId" val body = FormBody.Builder() .add("username", username) .add("mediaName", mediaTitle) @@ -247,7 +247,7 @@ object CommentsAPI { } suspend fun getNotifications(client: OkHttpClient): NotificationResponse? { - val url = "$address/notification/reply" + val url = "$ADDRESS/notification/reply" val request = requestBuilder(client) val json = try { request.get(url) @@ -268,7 +268,7 @@ object CommentsAPI { } private suspend fun getUserDetails(client: OkHttpClient? = null): User? { - val url = "$address/user" + val url = "$ADDRESS/user" val request = if (client != null) requestBuilder(client) else requestBuilder() val json = try { request.get(url) @@ -310,7 +310,7 @@ object CommentsAPI { } } - val url = "$address/authenticate" + val url = "$ADDRESS/authenticate" val token = PrefManager.getVal(PrefName.AnilistToken, null as String?) ?: return repeat(MAX_RETRIES) { try { @@ -348,6 +348,17 @@ object CommentsAPI { snackString("Failed to login after multiple attempts") } + fun logout() { + PrefManager.removeVal(PrefName.CommentAuthResponse) + PrefManager.removeVal(PrefName.CommentTokenExpiry) + authToken = null + userId = null + isBanned = false + isAdmin = false + isMod = false + totalVotes = 0 + } + private suspend fun authRequest( token: String, url: String, 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/media/comments/CommentsFragment.kt b/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt index 7e8143a4..fec27104 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt @@ -75,7 +75,7 @@ class CommentsFragment : Fragment() { super.onViewCreated(view, savedInstanceState) activity = requireActivity() as MediaDetailsActivity - binding.commentsList.setBaseline(activity.navBar, activity.binding.commentInputLayout) + binding.commentsListContainer.setBaseline(activity.navBar, activity.binding.commentInputLayout) //get the media id from the intent val mediaId = arguments?.getInt("mediaId") ?: -1 @@ -370,7 +370,6 @@ class CommentsFragment : Fragment() { override fun onResume() { super.onResume() tag = null - binding.commentsList.setBaseline(activity.navBar, activity.binding.commentInputLayout) section.groups.forEach { if (it is CommentItem && it.containsGif()) { it.notifyChanged() 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 493502f9..f18f06e8 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -492,7 +492,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 @@ -579,6 +582,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 4cb5df0c..24ac05c8 100644 --- a/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt +++ b/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt @@ -138,13 +138,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/java/eu/kanade/tachiyomi/extension/ExtensionUpdateNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionUpdateNotifier.kt index 84acd4b3..559cc35f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionUpdateNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionUpdateNotifier.kt @@ -15,7 +15,7 @@ class ExtensionUpdateNotifier(private val context: Context) { Notifications.CHANNEL_EXTENSIONS_UPDATE, ) { setContentTitle( - "Extension updates available" + context.getString(R.string.extension_updates_available) ) val extNames = names.joinToString(", ") setContentText(extNames) 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" /> - + diff --git a/app/src/main/res/layout/item_anime_page.xml b/app/src/main/res/layout/item_anime_page.xml index 2cc202a0..0ee3c01b 100644 --- a/app/src/main/res/layout/item_anime_page.xml +++ b/app/src/main/res/layout/item_anime_page.xml @@ -218,6 +218,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/app/src/main/res/layout/statistics_widget.xml b/app/src/main/res/layout/statistics_widget.xml index d4bb070f..da9376ca 100644 --- a/app/src/main/res/layout/statistics_widget.xml +++ b/app/src/main/res/layout/statistics_widget.xml @@ -1,10 +1,9 @@ - + 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 a87428a9..80cc39ee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,34 +1,30 @@ - rebelonion/Dantotsu + rebelonion/Dantotsu dantotsuprefs - Dantotsu + Dantotsu The NEW Best Anime & Manga app for Android. Login Logout - https://dantotsu.app/ - https://discord.gg/4HPZ5nAWwM - https://github.com/rebelonion/Dantotsu - https://t.me/+gzBCQExtLQo1YTNh - https://www.buymeacoffee.com/rebelonion - + https://discord.gg/4HPZ5nAWwM + https://github.com/rebelonion/Dantotsu + https://t.me/+gzBCQExtLQo1YTNh + https://anilist.co/user/%1$s/ - + https://discord.com/users/%1$s/ + Home Anime Browse Anime Manga Browse Manga - Novels Info Watch Read - Language - LANG Anime List Manga List @@ -53,10 +49,8 @@ Popular Manga Username - Chapters Read - Chapters\nRead - Episodes Watched - Episodes\nWatched + "Chapters Read " + "Episodes Watched " Continue Reading Continue Watching Recommended @@ -82,9 +76,6 @@ All - No more notifications - Followers - STATUS PLANNING @@ -125,9 +116,6 @@ Format Status Total Episodes - Episode(s) - Chapter(s) - | %1$s Total Chapters Average Duration " min" @@ -141,8 +129,6 @@ Characters Relations Staff - Favourites - Popularity Roles Details @@ -180,7 +166,7 @@ Settings Extensions Player Settings - Only show my content in \"Recently Updated\" + Only show My Shows in Recently Updated Download Manager Download in SD card No SD card was Found. @@ -249,8 +235,6 @@ Subtitle Window Color "The subtitle window is the part left and right from them. (where the background isn\'t)" Note: Changing above settings only affects Soft-Subtitles! - Subtitle Transparency - Example Subtitle Subtitle Font Subtitle Size @@ -310,7 +294,6 @@ Animations Banner Animations Layout Animations - Trending Scroller Overall Speed Looks like you don\'t like anything,\nTry liking a show to keep it here. Favourite Anime @@ -353,7 +336,12 @@ Reload Share Skip + Show Skip Time Stamp Button + Always Load Time Stamps + Time Stamps Other + Auto Skip OP / ED + Requires Time Stamps to be Enabled TOTAL REPEATS Custom Lists Want to support Dantotsu\'s Maintainer?\nConsider Donating @@ -371,8 +359,7 @@ Planned Anime Planned Manga Open image by Long Clicking - Always continue previous items - Search next available source + Always continue Shows Useful if you are getting Handshake Fails Use Proxy for Timestamps Always check for App Updates @@ -401,37 +388,18 @@ \n\n_It is not required to sync both MAL and Anilist accounts._ Show notification for Checking Subscriptions - Use Alarm Manager - Use Alarm Manager for reliable Notifications - Using Alarm Manger can help fight against battery optimization, but may consume more battery. It also requires the Alarm Manager permission. - Use + Use Alarm Manager for reliable Notifications Notification for Checking Subscriptions Subscriptions Update Frequency : %1$s Subscriptions Update Frequency Amount of time for Dantotsu to periodically check for new Episodes/Chapters\n(Less time will cause more battery consumption) Don\'t Update - Loading Chapter %1$s + Loading Next Chapter + Grid Sort by Release Date Crop Borders NOTE - - Display dantotsu in the second button - Display your AniList profile instead - Set up your own custom button - Discord Rich Presence - Stream on Dantotsu - View My AniList - Button Text - Button Link - Sample - Installing extension - Installation failed: %1$s - Installation complete - The extension has been successfully installed. - Extension installed - Error: %1$s - Step: %1$s DAMN! YOU TRULY ARE JOBLESS\nYOU REACHED THE END Couldn\'t find any File Manager to open SD card @@ -439,28 +407,21 @@ You Long Click the button to check for App Update Saved to:\n%s Setting progress to %1$d - Please Login into AniList account! + Please Login into anilist account! Congrats Vro Please Reload. Copied "%1$s" - Press BACK again to exit + Please perform BACK again to Exit No Internet Connection Seems like that wasn\'t found on Anilist. Disabled Auto Skipping OP & ED Auto Skipping OP & ED - Show Skip Time Stamp Button - Always Load Time Stamps - Auto Hide Time Stampsstring - Time Stamps - Auto Skip OP / ED - Requires Time Stamps to be Enabled - Make the skip time stamp button disappear after 5 seconds Copied to Clipboard This is the 1st Episode! You can long click List Editor button to Reset Auto Update Autoplay cancelled, no Interaction for more than 1 Hour. Couldn\'t auto select the server, Please try again! - No streams available! Try another source. + No streams available for content. Try another source. Logging in MAL Getting User Data No next Episode Found! @@ -532,21 +493,19 @@ Read on Dantotsu Watch on Dantotsu View Profile in Dantotsu - Continue : Episode %1$s%2$s\n%3$s - - Filler - Continue : %1$s\n%2$s + "Continue : Episode " + "Continue : " "Episode " "Episode %1$s" "Chapter " "Chapter %1$s" - just got released! Checking Subscriptions - %1$s\'s %2$s List Speed Auto Update progress for %1$s? Continue from %1$s? - Update progress on AniList? + Update progress on anilist? Incognito mode will still ignore progress. "Don\'t ask again for %1$s" Default Speed @@ -556,11 +515,15 @@ Outline Type Subtitle Font + Display only the first button + Display dantotsu in the second button + Display your AniList profile instead + Discord Rich Presence + Stream on Dantotsu + View My AniList Yes No - OK - Reset Close No Chapter Turn on 18+ Content from your Anilist Settings @@ -684,7 +647,6 @@ NSFW Extensions Skip loading extension icons Material You - Use App Theme Extension-specific DNS Theme: User Agent @@ -702,10 +664,9 @@ Configure Add widget This is an app widget description - Upcoming Anime Airing Image animeDownloads - Delete all Anime downloads + Delete all anime downloads Delete all Manga Downloads Delete all Novel Downloads Requires Android 12+ @@ -729,7 +690,6 @@ User has no favorite Manga Favourite Characters Favorite Staff - Stats Days watched Total Anime @@ -739,33 +699,7 @@ Manga Mean Score About me Follow - Following - Unfollow - Follows you - Mutual - Success - - Upcoming - No shows to display - Extension Name - version - Enter your password to decrypt the file - Show Rotate Button - Default Manga Settings - Use Dark Theme - Use OLED Theme - Scanlators - Exporting credentials requires a password for encryption. - Manga Queue (WIP) - Anime Queue (WIP) - No offline manga found - Sort - Download - Scanlator - Set Cookies - Open Website - - + Lorem ipsum dolor sit amet. Est consectetur sint qui internos optio nam Quis excepturi qui voluptatem animi. Qui labore quasi vel suscipit deleniti et doloremque omnis in velit suscipit et quasi eaque. Et doloribus recusandae id laudantium Quis qui natus velit in voluptatem voluptatem! @@ -785,74 +719,4 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc Anilist notifications update frequency : %1$s Comment notifications update frequency : %1$s Activities - - Incorrect password - Password cannot be empty - Unknown file type - Error importing settings - Download Manager - Enter Password - - youwu have been cuwsed :pwayge: - https://www.youtube.com/watch?v=dQw4w9WgXcQ - Are you sure you want to purge all %1$s downloads? - - Failed to delete because of… %1$s - - Hide replies - View reply - View replies - View %1$d replies - Replying to %1$s - - Delete Comment - Are you sure you want to delete this comment? - Comment Deleted - - Ban User - Are you sure you want to ban this user? - User Banned - - Report Comment - Only report comments that violate the rules. Are you sure you want to report this comment? - Comment Reported - - List - Grid - Compact - - WebView not installed - - Quality: %1$dp - Unknown Size - %1$s MB - Import… - Export… - No location selected - Enjoying the App? - Consider donating! - no moners :( - That\'s alright, you\'ll be a rich man soon :prayge: - donate :) - Do it! - Password - - Search %1$s - - Track progress directly from your home screen - Anime\nWatched - Manga\nRead - Loading… - %1$s\'s Stats - - Please - log in - or join - - Top background color - Bottom Background Color - Countdown Text Color - Title Color - Stats Text Color - Placeholder \ No newline at end of file diff --git a/app/src/main/res/xml-v31/statistics_widget_info.xml b/app/src/main/res/xml-v31/statistics_widget_info.xml index 5ede252a..db300364 100644 --- a/app/src/main/res/xml-v31/statistics_widget_info.xml +++ b/app/src/main/res/xml-v31/statistics_widget_info.xml @@ -3,10 +3,10 @@ android:description="@string/profile_stats_widget" android:initialKeyguardLayout="@layout/statistics_widget" android:initialLayout="@layout/statistics_widget" - android:targetCellWidth="3" + android:targetCellWidth="2" android:targetCellHeight="2" - android:minResizeWidth="180dp" - android:minResizeHeight="110dp" + android:minResizeWidth="130dp" + android:minResizeHeight="220dp" android:previewImage="@drawable/statistics_widget_preview" android:previewLayout="@layout/statistics_widget" android:resizeMode="horizontal|vertical" diff --git a/app/src/main/res/xml/statistics_widget_info.xml b/app/src/main/res/xml/statistics_widget_info.xml index 6dc9ec4b..bb008af0 100644 --- a/app/src/main/res/xml/statistics_widget_info.xml +++ b/app/src/main/res/xml/statistics_widget_info.xml @@ -3,10 +3,10 @@ android:description="@string/profile_stats_widget" android:initialKeyguardLayout="@layout/statistics_widget" android:initialLayout="@layout/statistics_widget" - android:minWidth="180dp" - android:minHeight="110dp" - android:minResizeWidth="180dp" - android:minResizeHeight="110dp" + android:minWidth="130dp" + android:minHeight="220dp" + android:minResizeWidth="130dp" + android:minResizeHeight="220dp" android:previewImage="@drawable/statistics_widget_preview" android:resizeMode="horizontal|vertical" android:updatePeriodMillis="86400000"