Merge branch 'dev' into zephyr

This commit is contained in:
ibo
2024-03-30 01:29:26 +01:00
committed by GitHub
26 changed files with 744 additions and 257 deletions

View File

@@ -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<TextInputEditText>(R.id.userAgentTextBox)?.hint = "Password"
val subtitleTextView = dialogView.findViewById<TextView>(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")

View File

@@ -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 <reified T : Any> executeQuery(

View File

@@ -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<Query.AnimeList>(
"""{
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<Query.MangaList>(
"""{
trendingManga:${trendingManga()}
trendingManhwa:${trendingManhwa()}
topRated:${topRatedManga()}
mostFav:${mostFavManga()}
}""".trimIndent(), force = true
)
}
suspend fun recentlyUpdated(
smaller: Boolean = true,
greater: Long = 0,

View File

@@ -156,6 +156,7 @@ class AnilistAnimeViewModel : ViewModel() {
suspend fun loadUpdated() = updated.postValue(Anilist.query.recentlyUpdated())
private val animePopular = MutableLiveData<SearchResults?>(null)
fun getPopular(): LiveData<SearchResults?> = animePopular
suspend fun loadPopular(
type: String,
@@ -192,6 +193,30 @@ class AnilistAnimeViewModel : ViewModel() {
)
var loaded: Boolean = false
private val popularMovies: MutableLiveData<MutableList<Media>> =
MutableLiveData<MutableList<Media>>(null)
fun getMovies(): LiveData<MutableList<Media>> = popularMovies
private val topRated: MutableLiveData<MutableList<Media>> =
MutableLiveData<MutableList<Media>>(null)
fun getTopRated(): LiveData<MutableList<Media>> = topRated
private val mostFav: MutableLiveData<MutableList<Media>> =
MutableLiveData<MutableList<Media>>(null)
fun getMostFav(): LiveData<MutableList<Media>> = 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<MutableList<Media>> =
MutableLiveData<MutableList<Media>>(null)
fun getPopularManga(): LiveData<MutableList<Media>> = popularManga
private val popularManhwa: MutableLiveData<MutableList<Media>> =
MutableLiveData<MutableList<Media>>(null)
fun getPopularManhwa(): LiveData<MutableList<Media>> = popularManhwa
private val topRated: MutableLiveData<MutableList<Media>> =
MutableLiveData<MutableList<Media>>(null)
fun getTopRated(): LiveData<MutableList<Media>> = topRated
private val mostFav: MutableLiveData<MutableList<Media>> =
MutableLiveData<MutableList<Media>>(null)
fun getMostFav(): LiveData<MutableList<Media>> = 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() {

View File

@@ -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")

View File

@@ -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,

View File

@@ -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

View File

@@ -212,7 +212,55 @@ class AnimePageAdapter : RecyclerView.Adapter<AnimePageAdapter.AnimePageViewHold
binding.animePopular.visibility = View.VISIBLE
binding.animePopular.startAnimation(setSlideUp())
}
fun updateMovies(adaptor: MediaAdaptor) {
binding.animeMoviesProgressBar.visibility = View.GONE
binding.animeMoviesRecyclerView.adapter = adaptor
binding.animeMoviesRecyclerView.layoutManager =
LinearLayoutManager(
binding.animeMoviesRecyclerView.context,
LinearLayoutManager.HORIZONTAL,
false
)
binding.animeMoviesRecyclerView.visibility = View.VISIBLE
binding.animeMovies.visibility = View.VISIBLE
binding.animeMovies.startAnimation(setSlideUp())
binding.animeMoviesRecyclerView.layoutAnimation =
LayoutAnimationController(setSlideIn(), 0.25f)
}
fun updateTopRated(adaptor: MediaAdaptor) {
binding.animeTopRatedProgressBar.visibility = View.GONE
binding.animeTopRatedRecyclerView.adapter = adaptor
binding.animeTopRatedRecyclerView.layoutManager =
LinearLayoutManager(
binding.animeTopRatedRecyclerView.context,
LinearLayoutManager.HORIZONTAL,
false
)
binding.animeTopRatedRecyclerView.visibility = View.VISIBLE
binding.animeTopRated.visibility = View.VISIBLE
binding.animeTopRated.startAnimation(setSlideUp())
binding.animeTopRatedRecyclerView.layoutAnimation =
LayoutAnimationController(setSlideIn(), 0.25f)
}
fun updateMostFav(adaptor: MediaAdaptor) {
binding.animeMostFavProgressBar.visibility = View.GONE
binding.animeMostFavRecyclerView.adapter = adaptor
binding.animeMostFavRecyclerView.layoutManager =
LinearLayoutManager(
binding.animeMostFavRecyclerView.context,
LinearLayoutManager.HORIZONTAL,
false
)
binding.animeMostFavRecyclerView.visibility = View.VISIBLE
binding.animeMostFav.visibility = View.VISIBLE
binding.animeMostFav.startAnimation(setSlideUp())
binding.animeMostFavRecyclerView.layoutAnimation =
LayoutAnimationController(setSlideIn(), 0.25f)
}
fun updateAvatar() {
if (Anilist.avatar != null && ready.value == true) {
trendingBinding.userAvatar.loadImage(Anilist.avatar)

View File

@@ -165,6 +165,26 @@ class MangaFragment : Fragment() {
mangaPageAdapter.updateNovel(MediaAdaptor(0, it, requireActivity()))
}
}
model.getPopularManga().observe(viewLifecycleOwner) {
if (it != null) {
mangaPageAdapter.updateTrendingManga(MediaAdaptor(0, it, requireActivity()))
}
}
model.getPopularManhwa().observe(viewLifecycleOwner) {
if (it != null) {
mangaPageAdapter.updateTrendingManhwa(MediaAdaptor(0, it, requireActivity()))
}
}
model.getTopRated().observe(viewLifecycleOwner) {
if (it != null) {
mangaPageAdapter.updateTopRated(MediaAdaptor(0, it, requireActivity()))
}
}
model.getMostFav().observe(viewLifecycleOwner) {
if (it != null) {
mangaPageAdapter.updateMostFav(MediaAdaptor(0, it, requireActivity()))
}
}
if (mangaPageAdapter.trendingViewPager != null) {
mangaPageAdapter.updateHeight()
model.getTrending().observe(viewLifecycleOwner) {
@@ -238,6 +258,7 @@ class MangaFragment : Fragment() {
model.loaded = true
model.loadTrending()
model.loadTrendingNovel()
model.loadAll()
model.loadPopular(
"MANGA", sort = Anilist.sortBy[1], onList = PrefManager.getVal(
PrefName.PopularMangaList

View File

@@ -178,8 +178,73 @@ class MangaPageAdapter : RecyclerView.Adapter<MangaPageAdapter.MangaPageViewHold
trendingBinding.titleContainer.startAnimation(setSlideUp())
binding.mangaListContainer.layoutAnimation =
LayoutAnimationController(setSlideIn(), 0.25f)
}
fun updateTrendingManga(adaptor: MediaAdaptor) {
binding.mangaTrendingMangaProgressBar.visibility = View.GONE
binding.mangaTrendingMangaRecyclerView.adapter = adaptor
binding.mangaTrendingMangaRecyclerView.layoutManager =
LinearLayoutManager(
binding.mangaTrendingMangaRecyclerView.context,
LinearLayoutManager.HORIZONTAL,
false
)
binding.mangaTrendingMangaRecyclerView.visibility = View.VISIBLE
binding.mangaTrendingManga.visibility = View.VISIBLE
binding.mangaTrendingManga.startAnimation(setSlideUp())
binding.mangaTrendingMangaRecyclerView.layoutAnimation =
LayoutAnimationController(setSlideIn(), 0.25f)
}
fun updateTrendingManhwa(adaptor: MediaAdaptor) {
binding.mangaTrendingManhwaProgressBar.visibility = View.GONE
binding.mangaTrendingManhwaRecyclerView.adapter = adaptor
binding.mangaTrendingManhwaRecyclerView.layoutManager =
LinearLayoutManager(
binding.mangaNovelRecyclerView.context,
LinearLayoutManager.HORIZONTAL,
false
)
binding.mangaTrendingManhwaRecyclerView.visibility = View.VISIBLE
binding.mangaTrendingManhwa.visibility = View.VISIBLE
binding.mangaTrendingManhwa.startAnimation(setSlideUp())
binding.mangaTrendingManhwaRecyclerView.layoutAnimation =
LayoutAnimationController(setSlideIn(), 0.25f)
}
fun updateTopRated(adaptor: MediaAdaptor) {
binding.mangaTopRatedProgressBar.visibility = View.GONE
binding.mangaTopRatedRecyclerView.adapter = adaptor
binding.mangaTopRatedRecyclerView.layoutManager =
LinearLayoutManager(
binding.mangaTopRatedRecyclerView.context,
LinearLayoutManager.HORIZONTAL,
false
)
binding.mangaTopRatedRecyclerView.visibility = View.VISIBLE
binding.mangaTopRated.visibility = View.VISIBLE
binding.mangaTopRated.startAnimation(setSlideUp())
binding.mangaTopRatedRecyclerView.layoutAnimation =
LayoutAnimationController(setSlideIn(), 0.25f)
}
fun updateMostFav(adaptor: MediaAdaptor) {
binding.mangaMostFavProgressBar.visibility = View.GONE
binding.mangaMostFavRecyclerView.adapter = adaptor
binding.mangaMostFavRecyclerView.layoutManager =
LinearLayoutManager(
binding.mangaMostFavRecyclerView.context,
LinearLayoutManager.HORIZONTAL,
false
)
binding.mangaMostFavRecyclerView.visibility = View.VISIBLE
binding.mangaMostFav.visibility = View.VISIBLE
binding.mangaMostFav.startAnimation(setSlideUp())
binding.mangaMostFavRecyclerView.layoutAnimation =
LayoutAnimationController(setSlideIn(), 0.25f)
}
fun updateNovel(adaptor: MediaAdaptor) {
binding.mangaNovelProgressBar.visibility = View.GONE
binding.mangaNovelRecyclerView.adapter = adaptor

View File

@@ -52,7 +52,7 @@ class AnimeWatchAdapter(
private val fragment: AnimeWatchFragment,
private val watchSources: WatchSources
) : RecyclerView.Adapter<AnimeWatchAdapter.ViewHolder>() {
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

View File

@@ -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()

View File

@@ -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) {

View File

@@ -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<Int>(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 {

View File

@@ -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)),

View File

@@ -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(

View File

@@ -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)

View File

@@ -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" />
<com.google.android.material.materialswitch.MaterialSwitch
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"
android:elegantTextHeight="true"
android:fontFamily="@font/poppins_bold"
android:minHeight="64dp"
android:text="@string/include_list"
android:textAlignment="viewStart"
android:textColor="?attr/colorOnBackground"
app:cornerRadius="0dp"
app:drawableTint="?attr/colorPrimary"
app:showText="false"
app:thumbTint="@color/button_switch_track" />
</ani.dantotsu.others.Xpandable>
</merge>

View File

@@ -158,7 +158,23 @@
app:iconPadding="16dp"
app:iconSize="24dp"
app:iconTint="?attr/colorPrimary" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/settingsIncludeMangaList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="true"
android:drawableStart="@drawable/ic_round_movie_filter_24"
android:drawablePadding="16dp"
android:elegantTextHeight="true"
android:fontFamily="@font/poppins_bold"
android:minHeight="64dp"
android:text="@string/include_list"
android:textAlignment="viewStart"
android:textColor="?attr/colorOnBackground"
app:cornerRadius="0dp"
app:drawableTint="?attr/colorPrimary"
app:showText="false"
app:thumbTint="@color/button_switch_track" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"

View File

@@ -59,6 +59,7 @@
tools:visibility="gone"/>
<FrameLayout
android:id="@+id/commentsListContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content">

View File

@@ -218,6 +218,126 @@
</FrameLayout>
<TextView
android:id="@+id/animeMovies"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/trending_movies"
android:textSize="16sp"
android:visibility="invisible"
tools:visibility="visible" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="250dp">
<ProgressBar
android:id="@+id/animeMoviesProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center" />
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/animeMoviesRecyclerView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:clipToPadding="false"
android:nestedScrollingEnabled="true"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:requiresFadingEdge="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_media_compact"
tools:orientation="horizontal" />
</FrameLayout>
<TextView
android:id="@+id/animeTopRated"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/top_rated"
android:textSize="16sp"
android:visibility="invisible"
tools:visibility="visible" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="250dp">
<ProgressBar
android:id="@+id/animeTopRatedProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center" />
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/animeTopRatedRecyclerView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:clipToPadding="false"
android:nestedScrollingEnabled="true"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:requiresFadingEdge="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_media_compact"
tools:orientation="horizontal" />
</FrameLayout>
<TextView
android:id="@+id/animeMostFav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/most_favourite"
android:textSize="16sp"
android:visibility="invisible"
tools:visibility="visible" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="250dp">
<ProgressBar
android:id="@+id/animeMostFavProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center" />
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/animeMostFavRecyclerView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:clipToPadding="false"
android:nestedScrollingEnabled="true"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:requiresFadingEdge="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_media_compact"
tools:orientation="horizontal" />
</FrameLayout>
<LinearLayout
android:id="@+id/animePopular"
android:layout_width="match_parent"

View File

@@ -125,6 +125,84 @@
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/mangaTrendingManga"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/trending_manga"
android:visibility="invisible"
android:textSize="16sp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="250dp">
<ProgressBar
android:id="@+id/mangaTrendingMangaProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center" />
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/mangaTrendingMangaRecyclerView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:clipToPadding="false"
android:nestedScrollingEnabled="true"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:requiresFadingEdge="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_media_compact"
tools:orientation="horizontal" />
</FrameLayout>
<TextView
android:id="@+id/mangaTrendingManhwa"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/trending_manhwa"
android:visibility="invisible"
android:textSize="16sp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="250dp">
<ProgressBar
android:id="@+id/mangaTrendingManhwaProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center" />
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/mangaTrendingManhwaRecyclerView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:clipToPadding="false"
android:nestedScrollingEnabled="true"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:requiresFadingEdge="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_media_compact"
tools:orientation="horizontal" />
</FrameLayout>
<TextView
android:id="@+id/mangaNovel"
android:layout_width="match_parent"
@@ -133,6 +211,7 @@
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/trending_novel"
android:visibility="invisible"
android:textSize="16sp" />
<FrameLayout
@@ -163,6 +242,84 @@
</FrameLayout>
<TextView
android:id="@+id/mangaTopRated"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/top_rated"
android:visibility="invisible"
android:textSize="16sp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="250dp">
<ProgressBar
android:id="@+id/mangaTopRatedProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center" />
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/mangaTopRatedRecyclerView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:clipToPadding="false"
android:nestedScrollingEnabled="true"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:requiresFadingEdge="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_media_compact"
tools:orientation="horizontal" />
</FrameLayout>
<TextView
android:id="@+id/mangaMostFav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/most_favourite"
android:visibility="invisible"
android:textSize="16sp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="250dp">
<ProgressBar
android:id="@+id/mangaMostFavProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center" />
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/mangaMostFavRecyclerView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:clipToPadding="false"
android:nestedScrollingEnabled="true"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:requiresFadingEdge="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_media_compact"
tools:orientation="horizontal" />
</FrameLayout>
<LinearLayout
android:id="@+id/mangaPopular"
android:layout_width="match_parent"
@@ -180,6 +337,7 @@
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/popular_manga"
android:visibility="invisible"
android:textSize="16sp" />
<com.google.android.material.materialswitch.MaterialSwitch
@@ -191,7 +349,6 @@
android:text="@string/include_media_in_list"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>

View File

@@ -1,10 +1,9 @@
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:theme="@style/Theme.Dantotsu.AppWidgetContainer"
android:orientation="vertical">
android:orientation="vertical"
android:theme="@style/Theme.Dantotsu.AppWidgetContainer">
<ImageView
android:id="@+id/backgroundView"
@@ -12,24 +11,26 @@
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/widget_stats_rounded"
tools:ignore="ContentDescription"/>
tools:ignore="ContentDescription" />
<LinearLayout
android:id="@+id/headerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:layout_margin="4dp"
android:orientation="horizontal"
android:baselineAligned="false">
android:baselineAligned="false"
android:gravity="center_horizontal"
android:orientation="horizontal">
<ImageView
android:id="@+id/userAvatar"
android:layout_width="32dp"
android:layout_height="32dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_dantotsu_round"
tools:ignore="ContentDescription"/>
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/userLabel"
android:layout_width="wrap_content"
@@ -37,26 +38,28 @@
android:layout_gravity="center"
android:layout_marginStart="8dp"
android:fontFamily="@font/poppins_bold"
android:textSize="18sp"
android:text="@string/loading"/>
android:text="@string/loading"
android:textSize="18sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/headerLayout"
android:layout_gravity="center"
android:gravity="center"
android:padding="4dp"
android:orientation="vertical"
android:background="@drawable/widget_stats_rounded"
android:layout_below="@id/headerLayout">
android:gravity="center"
android:orientation="vertical"
android:padding="4dp">
<LinearLayout
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">
<LinearLayout
android:id="@+id/topLeft"
android:layout_width="match_parent"
@@ -65,20 +68,22 @@
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="NestedWeights">
<TextView
android:id="@+id/topLeftItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="@font/poppins_bold"
android:text="@string/loading"/>
android:text="@string/loading" />
<TextView
android:id="@+id/topLeftLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:fontFamily="@font/poppins_semi_bold"
android:gravity="center"
android:text="@string/anime_watched" />
</LinearLayout>
@@ -96,21 +101,23 @@
android:layout_gravity="center"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/topRightItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="@font/poppins_bold"
android:text="@string/loading"/>
android:text="@string/loading" />
<TextView
android:id="@+id/topRightLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:fontFamily="@font/poppins_semi_bold"
android:text="@string/episodes_watched_n"/>
android:gravity="center"
android:text="@string/episodes_watched_n" />
</LinearLayout>
</LinearLayout>
@@ -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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -136,21 +144,23 @@
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="NestedWeights">
<TextView
android:id="@+id/bottomLeftItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="@font/poppins_bold"
android:text="@string/loading"/>
android:text="@string/loading" />
<TextView
android:id="@+id/bottomLeftLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/poppins_semi_bold"
android:text="@string/manga_read"
android:layout_gravity="center"
android:gravity="center"/>
android:fontFamily="@font/poppins_semi_bold"
android:gravity="center"
android:text="@string/manga_read" />
</LinearLayout>
<RelativeLayout
@@ -167,21 +177,23 @@
android:layout_gravity="center"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/bottomRightItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="@font/poppins_bold"
android:text="@string/loading"/>
android:text="@string/loading" />
<TextView
android:id="@+id/bottomRightLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:fontFamily="@font/poppins_semi_bold"
android:text="@string/chapters_read_n"/>
android:gravity="center"
android:text="@string/chapters_read_n" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@@ -1,34 +1,30 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en-rUS">
<string name="repo" translatable="false">rebelonion/Dantotsu</string>
<string name="repo">rebelonion/Dantotsu</string>
<string name="preference_file_key" translatable="false">dantotsuprefs</string>
<string name="app_name" translatable="false">Dantotsu</string>
<string name="app_name">Dantotsu</string>
<string name="slogan">The NEW Best Anime &amp; Manga app for Android.</string>
<string name="login">Login</string>
<string name="logout">Logout</string>
<string name="dantotsu" translatable="false">https://dantotsu.app/</string>
<string name="discord" translatable="false">https://discord.gg/4HPZ5nAWwM</string>
<string name="github" translatable="false">https://github.com/rebelonion/Dantotsu</string>
<string name="telegram" translatable="false" tools:ignore="Typos">https://t.me/+gzBCQExtLQo1YTNh </string>
<string name="coffee" translatable="false">https://www.buymeacoffee.com/rebelonion</string>
<string name="discord">https://discord.gg/4HPZ5nAWwM</string>
<string name="github">https://github.com/rebelonion/Dantotsu</string>
<string name="telegram" tools:ignore="Typos">https://t.me/+gzBCQExtLQo1YTNh </string>
<string name="anilist_link">https://anilist.co/user/%1$s/</string>
<string name="discord_link">https://discord.com/users/%1$s/</string>
<string name="home">Home</string>
<string name="anime">Anime</string>
<string name="browse_anime">Browse Anime</string>
<string name="manga">Manga</string>
<string name="browse_manga">Browse Manga</string>
<string name="novels">Novels</string>
<string name="info">Info</string>
<string name="watch">Watch</string>
<string name="read">Read</string>
<string name="language">Language</string>
<string name="language_code" translatable="false">LANG</string>
<string name="anime_list">Anime List</string>
<string name="manga_list">Manga List</string>
@@ -53,10 +49,8 @@
<string name="popular_manga">Popular Manga</string>
<string name="username">Username</string>
<string name="chapters_read">Chapters Read</string>
<string name="chapters_read_n">Chapters\nRead</string>
<string name="episodes_watched">Episodes Watched</string>
<string name="episodes_watched_n">Episodes\nWatched</string>
<string name="chapters_read">"Chapters Read "</string>
<string name="episodes_watched">"Episodes Watched "</string>
<string name="continue_reading">Continue Reading</string>
<string name="continue_watching">Continue Watching</string>
<string name="recommended">Recommended</string>
@@ -82,9 +76,6 @@
<item>All</item>
</string-array>
<string name="no_notifications">No more notifications</string>
<string name="followers">Followers</string>
<string name="status">STATUS</string>
<string-array name="status" translatable="false">
<item>PLANNING</item>
@@ -125,9 +116,6 @@
<string name="format">Format</string>
<string name="status_title">Status</string>
<string name="total_eps">Total Episodes</string>
<string name="episodes"> Episode(s)</string>
<string name="chapters"> Chapter(s)</string>
<string name="total_divider"> | %1$s</string>
<string name="total_chaps">Total Chapters</string>
<string name="ep_duration">Average Duration</string>
<string name="min">" min"</string>
@@ -141,8 +129,6 @@
<string name="characters">Characters</string>
<string name="relations">Relations</string>
<string name="staff">Staff</string>
<string name="favourites">Favourites</string>
<string name="popularity">Popularity</string>
<string name="roles">Roles</string>
<string name="details">Details</string>
@@ -180,7 +166,7 @@
<string name="settings">Settings</string>
<string name="extensions">Extensions</string>
<string name="player_settings">Player Settings</string>
<string name="recentlyListOnly">Only show my content in \"Recently Updated\"</string>
<string name="recentlyListOnly">Only show My Shows in Recently Updated</string>
<string name="download_manager_select">Download Manager</string>
<string name="downloadInSd">Download in SD card</string>
<string name="noSdFound">No SD card was Found.</string>
@@ -249,8 +235,6 @@
<string name="sub_window_color_select">Subtitle Window Color</string>
<string name="sub_window_color_info">"The subtitle window is the part left and right from them. (where the background isn\'t)"</string>
<string name="sub_color_info"><b>Note:</b> Changing above settings only affects Soft-Subtitles!</string>
<string name="sub_alpha">Subtitle Transparency</string>
<string name="sub_text_example">Example Subtitle</string>
<string name="sub_font_select">Subtitle Font</string>
<string name="subtitle_font_size">Subtitle Size</string>
@@ -310,7 +294,6 @@
<string name="animations">Animations</string>
<string name="banner_animations">Banner Animations</string>
<string name="layout_animations">Layout Animations</string>
<string name="trending_scroller">Trending Scroller</string>
<string name="animation_speed">Overall Speed</string>
<string name="empty_fav">Looks like you don\'t like anything,\nTry liking a show to keep it here.</string>
<string name="fav_anime">Favourite Anime</string>
@@ -353,7 +336,12 @@
<string name="reload">Reload</string>
<string name="share">Share</string>
<string name="skip">Skip</string>
<string name="show_skip_time_stamp_button">Show Skip Time Stamp Button</string>
<string name="always_load_time_stamps">Always Load Time Stamps</string>
<string name="timestamps">Time Stamps</string>
<string name="other">Other</string>
<string name="auto_skip_op_ed">Auto Skip OP / ED</string>
<string name="requires_time_stamps_to_be_enabled">Requires Time Stamps to be Enabled</string>
<string name="total_repeats">TOTAL REPEATS</string>
<string name="custom_lists">Custom Lists</string>
<string name="donate_desc">Want to support Dantotsu\'s Maintainer?\nConsider Donating</string>
@@ -371,8 +359,7 @@
<string name="planned_anime">Planned Anime</string>
<string name="planned_manga">Planned Manga</string>
<string name="image_long_clicking">Open image by Long Clicking</string>
<string name="always_continue_content">Always continue previous items</string>
<string name="search_source_list">Search next available source</string>
<string name="always_continue_shows">Always continue Shows</string>
<string name="timestamp_proxy_desc">Useful if you are getting Handshake Fails</string>
<string name="timestamp_proxy">Use Proxy for Timestamps</string>
<string name="check_app_updates">Always check for App Updates</string>
@@ -401,37 +388,18 @@
\n\n_It is not required to sync both MAL and Anilist accounts._
</string>
<string name="notification_for_checking_subscriptions">Show notification for Checking Subscriptions</string>
<string name="use_alarm_manager">Use Alarm Manager</string>
<string name="use_alarm_manager_reliable">Use Alarm Manager for reliable Notifications</string>
<string name="use_alarm_manager_confirm">Using Alarm Manger can help fight against battery optimization, but may consume more battery. It also requires the Alarm Manager permission.</string>
<string name="use">Use</string>
<string name="use_alarm_manager">Use Alarm Manager for reliable Notifications</string>
<string name="checking_subscriptions">Notification for Checking Subscriptions</string>
<string name="subscriptions_checking_time_s">Subscriptions Update Frequency : %1$s</string>
<string name="subscriptions_checking_time">Subscriptions Update Frequency</string>
<string name="subscriptions_info">Amount of time for Dantotsu to periodically check for new Episodes/Chapters\n(Less time will cause more battery consumption)</string>
<string name="do_not_update">Don\'t Update</string>
<string name="loading_chap_number">Loading Chapter %1$s</string>
<string name="loading_next_chap">Loading Next Chapter</string>
<string name="grid">Grid</string>
<string name="sort_by_release_date">Sort by Release Date</string>
<string name="crop_borders">Crop Borders</string>
<string name="note">NOTE</string>
<string name="discord_dantotsu_button">Display dantotsu in the second button</string>
<string name="discord_anilist_button">Display your AniList profile instead</string>
<string name="discord_custom_button">Set up your own custom button</string>
<string name="discord_rich_presence">Discord Rich Presence</string>
<string name="stream_on_dantotsu">Stream on Dantotsu</string>
<string name="view_my_anilist">View My AniList</string>
<string name="button_text">Button Text</string>
<string name="button_link">Button Link</string>
<string name="discord_custom_sample">Sample</string>
<string name="installing_extension">Installing extension</string>
<string name="installation_failed">Installation failed: %1$s</string>
<string name="installation_complete">Installation complete</string>
<string name="extension_has_been_installed">The extension has been successfully installed.</string>
<string name="extension_installed">Extension installed</string>
<string name="error_message">Error: %1$s</string>
<string name="install_step">Step: %1$s</string>
<string name="jobless_message">DAMN! YOU TRULY ARE JOBLESS\nYOU REACHED THE END</string>
<string name="file_manager_not_found">Couldn\'t find any File Manager to open SD card</string>
@@ -439,28 +407,21 @@
<string name="long_click_to_check_update">You Long Click the button to check for App Update</string>
<string name="saved_to_path">Saved to:\n%s</string>
<string name="setting_progress">Setting progress to %1$d</string>
<string name="login_anilist_account">Please Login into AniList account!</string>
<string name="login_anilist_account">Please Login into anilist account!</string>
<string name="congrats_vro">Congrats Vro</string>
<string name="please_reload">Please Reload.</string>
<string name="copied_text">Copied "%1$s"</string>
<string name="back_to_exit">Press BACK again to exit</string>
<string name="back_to_exit">Please perform BACK again to Exit</string>
<string name="no_internet_connection">No Internet Connection</string>
<string name="anilist_not_found">Seems like that wasn\'t found on Anilist.</string>
<string name="disabled_auto_skip">Disabled Auto Skipping OP &amp; ED</string>
<string name="auto_skip">Auto Skipping OP &amp; ED</string>
<string name="show_skip_time_stamp_button">Show Skip Time Stamp Button</string>
<string name="always_load_time_stamps">Always Load Time Stamps</string>
<string name="auto_hide_time_stamps">Auto Hide Time Stamps</string>string
<string name="timestamps">Time Stamps</string>
<string name="auto_skip_op_ed">Auto Skip OP / ED</string>
<string name="requires_time_stamps_to_be_enabled">Requires Time Stamps to be Enabled</string>
<string name="hide_skip_button">Make the skip time stamp button disappear after 5 seconds</string>
<string name="copied_to_clipboard">Copied to Clipboard</string>
<string name="first_episode">This is the 1st Episode!</string>
<string name="reset_auto_update">You can long click List Editor button to Reset Auto Update</string>
<string name="autoplay_cancelled">Autoplay cancelled, no Interaction for more than 1 Hour.</string>
<string name="auto_select_server_error">Couldn\'t auto select the server, Please try again!</string>
<string name="stream_selection_empty">No streams available! Try another source.</string>
<string name="stream_selection_empty">No streams available for content. Try another source.</string>
<string name="logging_in_mal">Logging in MAL</string>
<string name="getting_user_data">Getting User Data</string>
<string name="no_next_episode">No next Episode Found!</string>
@@ -532,21 +493,19 @@
<string name="read_on_dantotsu">Read on Dantotsu</string>
<string name="watch_on_dantotsu">Watch on Dantotsu</string>
<string name="view_profile_in_dantotsu">View Profile in Dantotsu</string>
<string name="continue_episode">Continue : Episode %1$s%2$s\n%3$s</string>
<string name="filler_tag"> - Filler</string>
<string name="continue_chapter">Continue : %1$s\n%2$s</string>
<string name="continue_episode">"Continue : Episode "</string>
<string name="continue_chapter">"Continue : "</string>
<string name="episode">"Episode "</string>
<string name="episode_num">"Episode %1$s"</string>
<string name="chapter">"Chapter "</string>
<string name="chapter_num">"Chapter %1$s"</string>
<string name="just_released">- just got released!</string>
<string name="checking_subscriptions_title">Checking Subscriptions</string>
<string name="user_list">%1$s\'s %2$s List</string>
<string name="speed">Speed</string>
<string name="auto_update">Auto Update progress for %1$s?</string>
<string name="continue_from">Continue from %1$s?</string>
<string name="title_update_progress">Update progress on AniList?</string>
<string name="title_update_progress">Update progress on anilist?</string>
<string name="incognito_will_not_update">Incognito mode will still ignore progress.</string>
<string name="dont_ask_again">"Don\'t ask again for %1$s"</string>
<string name="default_speed">Default Speed</string>
@@ -556,11 +515,15 @@
<string name="outline_type">Outline Type</string>
<string name="subtitle_font">Subtitle Font</string>
<string name="discord_nothing_button">Display only the first button</string>
<string name="discord_dantotsu_button">Display dantotsu in the second button</string>
<string name="discord_anilist_button">Display your AniList profile instead</string>
<string name="discord_rich_presence">Discord Rich Presence</string>
<string name="stream_on_dantotsu">Stream on Dantotsu</string>
<string name="view_my_anilist">View My AniList</string>
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="ok">OK</string>
<string name="reset">Reset</string>
<string name="close">Close</string>
<string name="no_chapter">No Chapter</string>
<string name="content_18">Turn on 18+ Content from your Anilist Settings</string>
@@ -684,7 +647,6 @@
<string name="NSFWExtention">NSFW Extensions</string>
<string name="skip_loading_extension_icons">Skip loading extension icons</string>
<string name="use_material_you">Material You</string>
<string name="use_app_theme">Use App Theme</string>
<string name="extension_specific_dns">Extension-specific DNS</string>
<string name="theme_">Theme:</string>
<string name="user_agent">User Agent</string>
@@ -702,10 +664,9 @@
<string name="configure">Configure</string>
<string name="add_widget">Add widget</string>
<string name="app_widget_description">This is an app widget description</string>
<string name="upcoming_anime">Upcoming Anime</string>
<string name="airing_image">Airing Image</string>
<string name="anime_downloads">animeDownloads</string>
<string name="purge_anime_downloads">Delete all Anime downloads</string>
<string name="purge_anime_downloads">Delete all anime downloads</string>
<string name="purge_manga_downloads">Delete all Manga Downloads</string>
<string name="purge_novel_downloads">Delete all Novel Downloads</string>
<string name="requires_android_12">Requires Android 12+</string>
@@ -729,7 +690,6 @@
<string name="no_fav_manga">User has no favorite Manga</string>
<string name="fav_character">Favourite Characters</string>
<string name="fav_staff">Favorite Staff</string>
<string name="stats">Stats</string>
<string name="days_watched">Days watched</string>
<string name="total_anime">Total Anime</string>
@@ -739,33 +699,7 @@
<string name="manga_mean_score">Manga Mean Score</string>
<string name="about_me">About me</string>
<string name="follow">Follow</string>
<string name="following">Following</string>
<string name="unfollow">Unfollow</string>
<string name="follows_you">Follows you</string>
<string name="mutual">Mutual</string>
<string name="success">Success</string>
<string name="upcoming">Upcoming</string>
<string name="no_shows_to_display">No shows to display</string>
<string name="extension_name">Extension Name</string>
<string name="extension_version">version</string>
<string name="enter_password_to_decrypt_file">Enter your password to decrypt the file</string>
<string name="show_rotate_button">Show Rotate Button</string>
<string name="default_manga_settings">Default Manga Settings</string>
<string name="use_dark_theme">Use Dark Theme</string>
<string name="use_oled_theme">Use OLED Theme</string>
<string name="scanlators">Scanlators</string>
<string name="exporting_requires_encryption">Exporting credentials requires a password for encryption.</string>
<string name="manga_queue">Manga Queue (WIP)</string>
<string name="anime_queue">Anime Queue (WIP)</string>
<string name="no_offline_manga_found">No offline manga found</string>
<string name="sort">Sort</string>
<string name="download">Download</string>
<string name="scanlator">Scanlator</string>
<string name="set_cookies">Set Cookies</string>
<string name="open_website">Open Website</string>
<string name="lorem_ipsum" translatable="false">
<string name="lorem_ipsum">
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
<string name="anilist_notifications_checking_time">Anilist notifications update frequency : %1$s</string>
<string name="comment_notification_checking_time">Comment notifications update frequency : %1$s</string>
<string name="activities">Activities</string>
<string name="incorrect_password">Incorrect password</string>
<string name="password_cannot_be_empty">Password cannot be empty</string>
<string name="unknown_file_type">Unknown file type</string>
<string name="error_importing_settings">Error importing settings</string>
<string name="download_manager">Download Manager</string>
<string name="enter_password">Enter Password</string>
<string name="you_cursed">youwu have been cuwsed :pwayge:</string>
<string name="cursed_yt" translatable="false">https://www.youtube.com/watch?v=dQw4w9WgXcQ</string>
<string name="purge_confirm">Are you sure you want to purge all %1$s downloads?</string>
<string name="delete_fail_reason">Failed to delete because of… %1$s</string>
<string name="hide_replies">Hide replies</string>
<string name="view_reply">View reply</string>
<string name="view_replies">View replies</string>
<string name="view_replies_count">View %1$d replies</string>
<string name="replying_to">Replying to %1$s</string>
<string name="delete_comment">Delete Comment</string>
<string name="delete_comment_confirm">Are you sure you want to delete this comment?</string>
<string name="comment_deleted">Comment Deleted</string>
<string name="ban_user">Ban User</string>
<string name="ban_user_confirm">Are you sure you want to ban this user?</string>
<string name="user_banned">User Banned</string>
<string name="report_comment">Report Comment</string>
<string name="report_comment_confirm">Only report comments that violate the rules. Are you sure you want to report this comment?</string>
<string name="comment_reported">Comment Reported</string>
<string name="list">List</string>
<string name="grid">Grid</string>
<string name="compact">Compact</string>
<string name="webview_not_installed">WebView not installed</string>
<string name="video_quality">Quality: %1$dp</string>
<string name="size_unknown">Unknown Size</string>
<string name="mb_size">%1$s MB</string>
<string name="button_import">Import…</string>
<string name="button_export">Export…</string>
<string name="no_location_selected">No location selected</string>
<string name="enjoying_app">Enjoying the App?</string>
<string name="consider_donating">Consider donating!</string>
<string name="no_moners">no moners :(</string>
<string name="you_be_rich">That\'s alright, you\'ll be a rich man soon :prayge:</string>
<string name="donate">donate :)</string>
<string name="do_it">Do it!</string>
<string name="password">Password</string>
<string name="search_title">Search %1$s</string>
<string name="profile_stats_widget">Track progress directly from your home screen</string>
<string name="anime_watched">Anime\nWatched</string>
<string name="manga_read">Manga\nRead</string>
<string name="loading">Loading…</string>
<string name="user_stats">%1$s\'s Stats</string>
<string name="please">Please</string>
<string name="log_in">log in</string>
<string name="or_join">or join</string>
<string name="top_background_color">Top background color</string>
<string name="bottom_background_color">Bottom Background Color</string>
<string name="countdown_text_color">Countdown Text Color</string>
<string name="title_color">Title Color</string>
<string name="stat_text_color">Stats Text Color</string>
<string name="placeholder">Placeholder</string>
</resources>

View File

@@ -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"

View File

@@ -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"