From 7bcc01b94ea9d17ce4bf5f132d803985551bebf9 Mon Sep 17 00:00:00 2001 From: TwistedUmbrellaX <1173913+AbandonedCart@users.noreply.github.com> Date: Wed, 27 Mar 2024 18:45:01 -0400 Subject: [PATCH] Merging stuff. Cleaning up code. The usual (#297) * chore: merge core extension view * fix: clean up a sloppy fix * chore: merge name adapters * fix: offset the indentation of example --- .../ani/dantotsu/media/MediaNameAdapter.kt | 146 ++++++++++++++++++ .../dantotsu/media/anime/AnimeNameAdapter.kt | 127 --------------- .../dantotsu/media/anime/AnimeWatchAdapter.kt | 3 +- .../media/anime/AnimeWatchFragment.kt | 3 +- .../dantotsu/media/anime/EpisodeAdapters.kt | 3 +- .../ani/dantotsu/media/anime/ExoplayerView.kt | 3 +- .../media/manga/MangaChapterAdapter.kt | 11 +- .../dantotsu/media/manga/MangaNameAdapter.kt | 29 ---- .../dantotsu/media/manga/MangaReadAdapter.kt | 7 +- .../dantotsu/media/manga/MangaReadFragment.kt | 3 +- .../manga/mangareader/MangaReaderActivity.kt | 8 +- .../subscription/SubscriptionHelper.kt | 6 +- .../ani/dantotsu/parsers/AniyomiAdapter.kt | 30 ++-- .../java/ani/dantotsu/parsers/MangaParser.kt | 6 +- .../dantotsu/parsers/OfflineAnimeParser.kt | 4 +- .../dantotsu/parsers/OfflineMangaParser.kt | 4 +- .../dantotsu/parsers/OfflineNovelParser.kt | 4 +- .../dantotsu/profile/activity/FeedFragment.kt | 31 ++-- .../settings/AnimeExtensionsFragment.kt | 30 ++-- .../InstalledAnimeExtensionsFragment.kt | 8 +- .../InstalledMangaExtensionsFragment.kt | 8 +- .../settings/MangaExtensionsFragment.kt | 30 ++-- .../res/layout/activity_player_settings.xml | 3 +- .../res/layout/fragment_anime_extensions.xml | 15 -- ...extensions.xml => fragment_extensions.xml} | 2 +- app/src/main/res/values/strings.xml | 7 + 26 files changed, 259 insertions(+), 272 deletions(-) create mode 100644 app/src/main/java/ani/dantotsu/media/MediaNameAdapter.kt delete mode 100644 app/src/main/java/ani/dantotsu/media/anime/AnimeNameAdapter.kt delete mode 100644 app/src/main/java/ani/dantotsu/media/manga/MangaNameAdapter.kt delete mode 100644 app/src/main/res/layout/fragment_anime_extensions.xml rename app/src/main/res/layout/{fragment_manga_extensions.xml => fragment_extensions.xml} (89%) diff --git a/app/src/main/java/ani/dantotsu/media/MediaNameAdapter.kt b/app/src/main/java/ani/dantotsu/media/MediaNameAdapter.kt new file mode 100644 index 00000000..07d151a0 --- /dev/null +++ b/app/src/main/java/ani/dantotsu/media/MediaNameAdapter.kt @@ -0,0 +1,146 @@ +package ani.dantotsu.media + +import java.util.Locale +import java.util.regex.Matcher +import java.util.regex.Pattern + +object MediaNameAdapter { + + private const val REGEX_ITEM = "[\\s:.\\-]*(\\d+\\.?\\d*)[\\s:.\\-]*" + private const val REGEX_PART_NUMBER = "(? "sub" + SubDubType.DUB -> "dub" + SubDubType.NULL -> "" + } + val toggledCasePreserved = + if (subdub?.get(0)?.isUpperCase() == true || soft?.get(0) + ?.isUpperCase() == true + ) toggled.replaceFirstChar { + if (it.isLowerCase()) it.titlecase( + Locale.ROOT + ) else it.toString() + } else toggled + + subdubMatcher.replaceFirst(toggledCasePreserved + bed) + } else { + null + } + } + + fun getSubDub(text: String): SubDubType { + val subdubPattern: Pattern = Pattern.compile(REGEX_SUBDUB, Pattern.CASE_INSENSITIVE) + val subdubMatcher: Matcher = subdubPattern.matcher(text) + + return if (subdubMatcher.find()) { + val subdub = subdubMatcher.group(2)?.lowercase(Locale.ROOT) + when (subdub) { + "sub" -> SubDubType.SUB + "dub" -> SubDubType.DUB + else -> SubDubType.NULL + } + } else { + SubDubType.NULL + } + } + + enum class SubDubType { + SUB, DUB, NULL + } + + fun findSeasonNumber(text: String): Int? { + val seasonPattern: Pattern = Pattern.compile(REGEX_SEASON, Pattern.CASE_INSENSITIVE) + val seasonMatcher: Matcher = seasonPattern.matcher(text) + + return if (seasonMatcher.find()) { + seasonMatcher.group(2)?.toInt() + } else { + null + } + } + + fun findEpisodeNumber(text: String): Float? { + val episodePattern: Pattern = Pattern.compile(REGEX_EPISODE, Pattern.CASE_INSENSITIVE) + val episodeMatcher: Matcher = episodePattern.matcher(text) + + return if (episodeMatcher.find()) { + if (episodeMatcher.group(2) != null) { + episodeMatcher.group(2)?.toFloat() + } else { + val failedEpisodeNumberPattern: Pattern = + Pattern.compile(REGEX_PART_NUMBER, Pattern.CASE_INSENSITIVE) + val failedEpisodeNumberMatcher: Matcher = + failedEpisodeNumberPattern.matcher(text) + if (failedEpisodeNumberMatcher.find()) { + failedEpisodeNumberMatcher.group(1)?.toFloat() + } else { + null + } + } + } else { + null + } + } + + fun removeEpisodeNumber(text: String): String { + val regexPattern = Regex(REGEX_EPISODE, RegexOption.IGNORE_CASE) + val removedNumber = text.replace(regexPattern, "").ifEmpty { + text + } + val letterPattern = Regex("[a-zA-Z]") + return if (letterPattern.containsMatchIn(removedNumber)) { + removedNumber + } else { + text + } + } + + + fun removeEpisodeNumberCompletely(text: String): String { + val regexPattern = Regex(REGEX_EPISODE, RegexOption.IGNORE_CASE) + val removedNumber = text.replace(regexPattern, "") + return if (removedNumber.equals(text, true)) { // if nothing was removed + val failedEpisodeNumberPattern = + Regex(REGEX_PART_NUMBER, RegexOption.IGNORE_CASE) + failedEpisodeNumberPattern.replace(removedNumber) { mr -> + mr.value.replaceFirst(mr.groupValues[1], "") + } + } else { + removedNumber + } + } + + fun findChapterNumber(text: String): Float? { + val pattern: Pattern = Pattern.compile(REGEX_CHAPTER, Pattern.CASE_INSENSITIVE) + val matcher: Matcher = pattern.matcher(text) + + return if (matcher.find()) { + matcher.group(2)?.toFloat() + } else { + val failedChapterNumberPattern: Pattern = + Pattern.compile(REGEX_PART_NUMBER, Pattern.CASE_INSENSITIVE) + val failedChapterNumberMatcher: Matcher = + failedChapterNumberPattern.matcher(text) + if (failedChapterNumberMatcher.find()) { + failedChapterNumberMatcher.group(1)?.toFloat() + } else { + null + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeNameAdapter.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeNameAdapter.kt deleted file mode 100644 index 16142902..00000000 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeNameAdapter.kt +++ /dev/null @@ -1,127 +0,0 @@ -package ani.dantotsu.media.anime - -import java.util.Locale -import java.util.regex.Matcher -import java.util.regex.Pattern - -class AnimeNameAdapter { - companion object { - const val episodeRegex = - "(episode|episodio|ep|e)[\\s:.\\-]*(\\d+\\.?\\d*)[\\s:.\\-]*\\(?\\s*(sub|subbed|dub|dubbed)*\\s*\\)?\\s*" - const val failedEpisodeNumberRegex = - "(? "sub" - SubDubType.DUB -> "dub" - SubDubType.NULL -> "" - } - val toggledCasePreserved = - if (subdub?.get(0)?.isUpperCase() == true || soft?.get(0) - ?.isUpperCase() == true - ) toggled.replaceFirstChar { - if (it.isLowerCase()) it.titlecase( - Locale.ROOT - ) else it.toString() - } else toggled - - subdubMatcher.replaceFirst(toggledCasePreserved + bed) - } else { - null - } - } - - fun getSubDub(text: String): SubDubType { - val subdubPattern: Pattern = Pattern.compile(subdubRegex, Pattern.CASE_INSENSITIVE) - val subdubMatcher: Matcher = subdubPattern.matcher(text) - - return if (subdubMatcher.find()) { - val subdub = subdubMatcher.group(2)?.lowercase(Locale.ROOT) - when (subdub) { - "sub" -> SubDubType.SUB - "dub" -> SubDubType.DUB - else -> SubDubType.NULL - } - } else { - SubDubType.NULL - } - } - - enum class SubDubType { - SUB, DUB, NULL - } - - fun findSeasonNumber(text: String): Int? { - val seasonPattern: Pattern = Pattern.compile(seasonRegex, Pattern.CASE_INSENSITIVE) - val seasonMatcher: Matcher = seasonPattern.matcher(text) - - return if (seasonMatcher.find()) { - seasonMatcher.group(2)?.toInt() - } else { - null - } - } - - fun findEpisodeNumber(text: String): Float? { - val episodePattern: Pattern = Pattern.compile(episodeRegex, Pattern.CASE_INSENSITIVE) - val episodeMatcher: Matcher = episodePattern.matcher(text) - - return if (episodeMatcher.find()) { - if (episodeMatcher.group(2) != null) { - episodeMatcher.group(2)?.toFloat() - } else { - val failedEpisodeNumberPattern: Pattern = - Pattern.compile(failedEpisodeNumberRegex, Pattern.CASE_INSENSITIVE) - val failedEpisodeNumberMatcher: Matcher = - failedEpisodeNumberPattern.matcher(text) - if (failedEpisodeNumberMatcher.find()) { - failedEpisodeNumberMatcher.group(1)?.toFloat() - } else { - null - } - } - } else { - null - } - } - - fun removeEpisodeNumber(text: String): String { - val regexPattern = Regex(episodeRegex, RegexOption.IGNORE_CASE) - val removedNumber = text.replace(regexPattern, "").ifEmpty { - text - } - val letterPattern = Regex("[a-zA-Z]") - return if (letterPattern.containsMatchIn(removedNumber)) { - removedNumber - } else { - text - } - } - - - fun removeEpisodeNumberCompletely(text: String): String { - val regexPattern = Regex(episodeRegex, RegexOption.IGNORE_CASE) - val removedNumber = text.replace(regexPattern, "") - return if (removedNumber.equals(text, true)) { // if nothing was removed - val failedEpisodeNumberPattern = - Regex(failedEpisodeNumberRegex, RegexOption.IGNORE_CASE) - failedEpisodeNumberPattern.replace(removedNumber) { mr -> - mr.value.replaceFirst(mr.groupValues[1], "") - } - } else { - removedNumber - } - } - } -} diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt index 792a687c..14c73770 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt @@ -26,6 +26,7 @@ import ani.dantotsu.isOnline import ani.dantotsu.loadImage import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsActivity +import ani.dantotsu.media.MediaNameAdapter import ani.dantotsu.media.SourceSearchDialogFragment import ani.dantotsu.openSettings import ani.dantotsu.others.LanguageMapper @@ -403,7 +404,7 @@ class AnimeWatchAdapter( } val ep = media.anime.episodes!![continueEp]!! - val cleanedTitle = ep.title?.let { AnimeNameAdapter.removeEpisodeNumber(it) } + val cleanedTitle = ep.title?.let { MediaNameAdapter.removeEpisodeNumber(it) } binding.itemEpisodeImage.loadImage( ep.thumb ?: FileUrl[media.banner ?: media.cover], 0 diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt index f02a556d..8298318c 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt @@ -41,6 +41,7 @@ import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.media.MediaDetailsViewModel import ani.dantotsu.media.MediaType +import ani.dantotsu.media.MediaNameAdapter import ani.dantotsu.navBarHeight import ani.dantotsu.notifications.subscription.SubscriptionHelper import ani.dantotsu.notifications.subscription.SubscriptionHelper.Companion.saveSubscription @@ -224,7 +225,7 @@ class AnimeWatchFragment : Fragment() { if (media.anime!!.kitsuEpisodes!!.containsKey(i)) { episode.desc = media.anime!!.kitsuEpisodes!![i]?.desc ?: episode.desc - episode.title = if (AnimeNameAdapter.removeEpisodeNumberCompletely( + episode.title = if (MediaNameAdapter.removeEpisodeNumberCompletely( episode.title ?: "" ).isBlank() ) media.anime!!.kitsuEpisodes!![i]?.title diff --git a/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt b/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt index 21f3e439..68d3aabd 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt @@ -21,6 +21,7 @@ import ani.dantotsu.databinding.ItemEpisodeListBinding import ani.dantotsu.download.anime.AnimeDownloaderService import ani.dantotsu.download.video.Helper import ani.dantotsu.media.Media +import ani.dantotsu.media.MediaNameAdapter import ani.dantotsu.setAnimation import ani.dantotsu.settings.saving.PrefManager import com.bumptech.glide.Glide @@ -102,7 +103,7 @@ class EpisodeAdapter( override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { val ep = arr[position] val title = if (!ep.title.isNullOrEmpty() && ep.title != "null") { - ep.title?.let { AnimeNameAdapter.removeEpisodeNumber(it) } + ep.title?.let { MediaNameAdapter.removeEpisodeNumber(it) } } else { ep.number } ?: "" diff --git a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt index 259cfb89..1833ada8 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -113,6 +113,7 @@ import ani.dantotsu.isOnline import ani.dantotsu.logError import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsViewModel +import ani.dantotsu.media.MediaNameAdapter import ani.dantotsu.media.SubtitleDownloader import ani.dantotsu.okHttpClient import ani.dantotsu.others.AniSkip @@ -998,7 +999,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL episodeTitleArr = arrayListOf() episodes.forEach { val episode = it.value - val cleanedTitle = AnimeNameAdapter.removeEpisodeNumberCompletely(episode.title ?: "") + val cleanedTitle = MediaNameAdapter.removeEpisodeNumberCompletely(episode.title ?: "") episodeTitleArr.add("Episode ${episode.number}${if (episode.filler) " [Filler]" else ""}${if (cleanedTitle.isNotBlank() && cleanedTitle != "null") ": $cleanedTitle" else ""}") } diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt index 19d039f5..393d87b9 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt @@ -15,6 +15,7 @@ import ani.dantotsu.currContext import ani.dantotsu.databinding.ItemChapterListBinding import ani.dantotsu.databinding.ItemEpisodeCompactBinding import ani.dantotsu.media.Media +import ani.dantotsu.media.MediaNameAdapter import ani.dantotsu.setAnimation import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -267,10 +268,10 @@ class MangaChapterAdapter( val binding = holder.binding setAnimation(fragment.requireContext(), holder.binding.root) val ep = arr[position] - val parsedNumber = MangaNameAdapter.findChapterNumber(ep.number)?.toInt() + val parsedNumber = MediaNameAdapter.findChapterNumber(ep.number)?.toInt() binding.itemEpisodeNumber.text = parsedNumber?.toString() ?: ep.number if (media.userProgress != null) { - if ((MangaNameAdapter.findChapterNumber(ep.number) + if ((MediaNameAdapter.findChapterNumber(ep.number) ?: 9999f) <= media.userProgress!!.toFloat() ) binding.itemEpisodeViewedCover.visibility = View.VISIBLE @@ -279,7 +280,7 @@ class MangaChapterAdapter( binding.itemEpisodeCont.setOnLongClickListener { updateProgress( media, - MangaNameAdapter.findChapterNumber(ep.number).toString() + MediaNameAdapter.findChapterNumber(ep.number).toString() ) true } @@ -315,7 +316,7 @@ class MangaChapterAdapter( } else binding.itemChapterTitle.visibility = View.VISIBLE if (media.userProgress != null) { - if ((MangaNameAdapter.findChapterNumber(ep.number) + if ((MediaNameAdapter.findChapterNumber(ep.number) ?: 9999f) <= media.userProgress!!.toFloat() ) { binding.itemEpisodeViewedCover.visibility = View.VISIBLE @@ -326,7 +327,7 @@ class MangaChapterAdapter( binding.root.setOnLongClickListener { updateProgress( media, - MangaNameAdapter.findChapterNumber(ep.number).toString() + MediaNameAdapter.findChapterNumber(ep.number).toString() ) true } diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaNameAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaNameAdapter.kt deleted file mode 100644 index d265b69a..00000000 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaNameAdapter.kt +++ /dev/null @@ -1,29 +0,0 @@ -package ani.dantotsu.media.manga - -import java.util.regex.Matcher -import java.util.regex.Pattern - -class MangaNameAdapter { - companion object { - private const val chapterRegex = "(chapter|chap|ch|c)[\\s:.\\-]*(\\d+\\.?\\d*)[\\s:.\\-]*" - private const val filedChapterNumberRegex = "(? - return when (AnimeNameAdapter.getSubDub(value.value.toString())) { - AnimeNameAdapter.Companion.SubDubType.SUB -> false - AnimeNameAdapter.Companion.SubDubType.DUB -> true - AnimeNameAdapter.Companion.SubDubType.NULL -> false + return when (MediaNameAdapter.getSubDub(value.value.toString())) { + MediaNameAdapter.SubDubType.SUB -> false + MediaNameAdapter.SubDubType.DUB -> true + MediaNameAdapter.SubDubType.NULL -> false } } } @@ -92,8 +92,8 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { val configurableSource = extension.sources[sourceLanguage] as? ConfigurableAnimeSource ?: return val type = when (setDub) { - true -> AnimeNameAdapter.Companion.SubDubType.DUB - false -> AnimeNameAdapter.Companion.SubDubType.SUB + true -> MediaNameAdapter.SubDubType.DUB + false -> MediaNameAdapter.SubDubType.SUB } currContext()?.let { context -> val sharedPreferences = @@ -101,9 +101,9 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { configurableSource.getPreferenceKey(), Context.MODE_PRIVATE ) - sharedPreferences.all.filterValues { AnimeNameAdapter.getSubDub(it.toString()) != AnimeNameAdapter.Companion.SubDubType.NULL } + sharedPreferences.all.filterValues { MediaNameAdapter.getSubDub(it.toString()) != MediaNameAdapter.SubDubType.NULL } .forEach { value -> - val setValue = AnimeNameAdapter.setSubDub(value.value.toString(), type) + val setValue = MediaNameAdapter.setSubDub(value.value.toString(), type) if (setValue != null) { sharedPreferences.edit().putString(value.key, setValue).apply() } @@ -122,9 +122,9 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { Context.MODE_PRIVATE ) sharedPreferences.all.filterValues { - AnimeNameAdapter.setSubDub( + MediaNameAdapter.setSubDub( it.toString(), - AnimeNameAdapter.Companion.SubDubType.NULL + MediaNameAdapter.SubDubType.NULL ) != null } .forEach { _ -> return true } @@ -150,7 +150,7 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { val sortedEpisodes = if (res[0].episode_number == -1f) { // Find the number in the string and sort by that number val sortedByStringNumber = res.sortedBy { - val matchResult = AnimeNameAdapter.findEpisodeNumber(it.name) + val matchResult = MediaNameAdapter.findEpisodeNumber(it.name) val number = matchResult ?: Float.MAX_VALUE it.episode_number = number // Store the found number in episode_number number @@ -171,13 +171,13 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { var episodeCounter = 1f // Group by season, sort within each season, and then renumber while keeping episode number 0 as is val seasonGroups = - res.groupBy { AnimeNameAdapter.findSeasonNumber(it.name) ?: 0 } + res.groupBy { MediaNameAdapter.findSeasonNumber(it.name) ?: 0 } seasonGroups.keys.sortedBy { it } .flatMap { season -> seasonGroups[season]?.sortedBy { it.episode_number }?.map { episode -> if (episode.episode_number != 0f) { // Skip renumbering for episode number 0 val potentialNumber = - AnimeNameAdapter.findEpisodeNumber(episode.name) + MediaNameAdapter.findEpisodeNumber(episode.name) if (potentialNumber != null) { episode.episode_number = potentialNumber } else { diff --git a/app/src/main/java/ani/dantotsu/parsers/MangaParser.kt b/app/src/main/java/ani/dantotsu/parsers/MangaParser.kt index cd757307..bf67a8ca 100644 --- a/app/src/main/java/ani/dantotsu/parsers/MangaParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/MangaParser.kt @@ -1,7 +1,7 @@ package ani.dantotsu.parsers import ani.dantotsu.FileUrl -import ani.dantotsu.media.manga.MangaNameAdapter +import ani.dantotsu.media.MediaNameAdapter import com.bumptech.glide.load.resource.bitmap.BitmapTransformation import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter @@ -33,9 +33,9 @@ abstract class MangaParser : BaseParser() { ): MangaChapter? { val chapter = loadChapters(mangaLink, extra, sManga) val max = chapter - .maxByOrNull { MangaNameAdapter.findChapterNumber(it.number) ?: 0f } + .maxByOrNull { MediaNameAdapter.findChapterNumber(it.number) ?: 0f } return max - ?.takeIf { latest < (MangaNameAdapter.findChapterNumber(it.number) ?: 0.001f) } + ?.takeIf { latest < (MediaNameAdapter.findChapterNumber(it.number) ?: 0.001f) } } /** diff --git a/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt index 57098894..582419c9 100644 --- a/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt @@ -5,7 +5,7 @@ import android.os.Environment import ani.dantotsu.currContext import ani.dantotsu.download.DownloadsManager import ani.dantotsu.media.MediaType -import ani.dantotsu.media.anime.AnimeNameAdapter +import ani.dantotsu.media.MediaNameAdapter import ani.dantotsu.tryWithSuspend import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode @@ -54,7 +54,7 @@ class OfflineAnimeParser : AnimeParser() { episodes.add(episode) } } - episodes.sortBy { AnimeNameAdapter.findEpisodeNumber(it.number) } + episodes.sortBy { MediaNameAdapter.findEpisodeNumber(it.number) } return episodes } return emptyList() diff --git a/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt index 29149873..983a53ec 100644 --- a/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt @@ -3,7 +3,7 @@ package ani.dantotsu.parsers import android.os.Environment import ani.dantotsu.currContext import ani.dantotsu.download.DownloadsManager -import ani.dantotsu.media.manga.MangaNameAdapter +import ani.dantotsu.media.MediaNameAdapter import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga @@ -43,7 +43,7 @@ class OfflineMangaParser : MangaParser() { chapters.add(chapter) } } - chapters.sortBy { MangaNameAdapter.findChapterNumber(it.number) } + chapters.sortBy { MediaNameAdapter.findChapterNumber(it.number) } return chapters } return emptyList() diff --git a/app/src/main/java/ani/dantotsu/parsers/OfflineNovelParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineNovelParser.kt index 534c3ac5..11009aed 100644 --- a/app/src/main/java/ani/dantotsu/parsers/OfflineNovelParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/OfflineNovelParser.kt @@ -3,7 +3,7 @@ package ani.dantotsu.parsers import android.os.Environment import ani.dantotsu.currContext import ani.dantotsu.download.DownloadsManager -import ani.dantotsu.media.manga.MangaNameAdapter +import ani.dantotsu.media.MediaNameAdapter import me.xdrop.fuzzywuzzy.FuzzySearch import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -38,7 +38,7 @@ class OfflineNovelParser : NovelParser() { chapters.add(chapter) } } - chapters.sortBy { MangaNameAdapter.findChapterNumber(it.name) } + chapters.sortBy { MediaNameAdapter.findChapterNumber(it.name) } return chapters.first() } return Book( 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 cd11a3d3..40c96829 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt @@ -50,22 +50,21 @@ class FeedFragment : Fragment() { super.onViewCreated(view, savedInstanceState) activity = requireActivity() - - - binding.listRecyclerView.adapter = adapter - binding.listRecyclerView.layoutManager = - LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) - binding.listProgressBar.visibility = ViewGroup.VISIBLE userId = arguments?.getInt("userId", -1) activityId = arguments?.getInt("activityId", -1) ?: -1 if (userId == -1) userId = null global = arguments?.getBoolean("global", false) ?: false - if (userId != null) { - binding.listRecyclerView.setBaseline((activity as ProfileActivity).navBar) - }else{ - binding.listRecyclerView.setBaseline((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) + binding.listProgressBar.visibility = ViewGroup.VISIBLE } @SuppressLint("ClickableViewAccessibility") @@ -73,11 +72,11 @@ class FeedFragment : Fragment() { super.onResume() if (this::binding.isInitialized) { binding.root.requestLayout() - if (userId != null) { - binding.listRecyclerView.setBaseline((activity as ProfileActivity).navBar) - }else{ - binding.listRecyclerView.setBaseline((activity as FeedActivity).navBar) - } + val navBar = if (userId != null) + (activity as ProfileActivity).navBar + else + (activity as FeedActivity).navBar + binding.listRecyclerView.setBaseline(navBar) if (!loadedFirstTime) { activity.lifecycleScope.launch(Dispatchers.IO) { val nulledId = if (activityId == -1) null else activityId diff --git a/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt index a6d6c39e..fe7b81d2 100644 --- a/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt @@ -13,7 +13,7 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface -import ani.dantotsu.databinding.FragmentAnimeExtensionsBinding +import ani.dantotsu.databinding.FragmentExtensionsBinding import ani.dantotsu.settings.paging.AnimeExtensionAdapter import ani.dantotsu.settings.paging.AnimeExtensionsViewModel import ani.dantotsu.settings.paging.AnimeExtensionsViewModelFactory @@ -30,7 +30,7 @@ import uy.kohesive.injekt.api.get class AnimeExtensionsFragment : Fragment(), SearchQueryHandler, OnAnimeInstallClickListener { - private var _binding: FragmentAnimeExtensionsBinding? = null + private var _binding: FragmentExtensionsBinding? = null private val binding get() = _binding!! private val viewModel: AnimeExtensionsViewModel by viewModels { @@ -48,12 +48,12 @@ class AnimeExtensionsFragment : Fragment(), container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentAnimeExtensionsBinding.inflate(inflater, container, false) + _binding = FragmentExtensionsBinding.inflate(inflater, container, false) - binding.allAnimeExtensionsRecyclerView.isNestedScrollingEnabled = false - binding.allAnimeExtensionsRecyclerView.adapter = adapter - binding.allAnimeExtensionsRecyclerView.layoutManager = LinearLayoutManager(context) - (binding.allAnimeExtensionsRecyclerView.layoutManager as LinearLayoutManager).isItemPrefetchEnabled = + binding.allExtensionsRecyclerView.isNestedScrollingEnabled = false + binding.allExtensionsRecyclerView.adapter = adapter + binding.allExtensionsRecyclerView.layoutManager = LinearLayoutManager(context) + (binding.allExtensionsRecyclerView.layoutManager as LinearLayoutManager).isItemPrefetchEnabled = true lifecycleScope.launch { @@ -91,8 +91,8 @@ class AnimeExtensionsFragment : Fragment(), Notifications.CHANNEL_DOWNLOADER_PROGRESS ) .setSmallIcon(R.drawable.ic_round_sync_24) - .setContentTitle("Installing extension") - .setContentText("Step: $installStep") + .setContentTitle(getString(R.string.installing_extension)) + .setContentText(getString(R.string.install_step, installStep)) .setPriority(NotificationCompat.PRIORITY_LOW) notificationManager.notify(1, builder.build()) }, @@ -103,11 +103,11 @@ class AnimeExtensionsFragment : Fragment(), Notifications.CHANNEL_DOWNLOADER_ERROR ) .setSmallIcon(R.drawable.ic_round_info_24) - .setContentTitle("Installation failed: ${error.message}") - .setContentText("Error: ${error.message}") + .setContentTitle(getString(R.string.installation_failed, error.message)) + .setContentText(getString(R.string.error_message, error.message)) .setPriority(NotificationCompat.PRIORITY_HIGH) notificationManager.notify(1, builder.build()) - snackString("Installation failed: ${error.message}") + snackString(getString(R.string.installation_failed, error.message)) }, { val builder = NotificationCompat.Builder( @@ -115,12 +115,12 @@ class AnimeExtensionsFragment : Fragment(), Notifications.CHANNEL_DOWNLOADER_PROGRESS ) .setSmallIcon(R.drawable.ic_download_24) - .setContentTitle("Installation complete") - .setContentText("The extension has been successfully installed.") + .setContentTitle(getString(R.string.installation_complete)) + .setContentText(getString(R.string.extension_has_been_installed)) .setPriority(NotificationCompat.PRIORITY_LOW) notificationManager.notify(1, builder.build()) viewModel.invalidatePager() - snackString("Extension installed") + snackString(getString(R.string.extension_installed)) } ) } diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt index e25fb822..3f1a3c49 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt @@ -24,7 +24,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface -import ani.dantotsu.databinding.FragmentAnimeExtensionsBinding +import ani.dantotsu.databinding.FragmentExtensionsBinding import ani.dantotsu.others.LanguageMapper import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.settings.extensionprefs.AnimeSourcePreferencesFragment @@ -49,7 +49,7 @@ import java.util.Locale class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler { - private var _binding: FragmentAnimeExtensionsBinding? = null + private var _binding: FragmentExtensionsBinding? = null private val binding get() = _binding!! private lateinit var extensionsRecyclerView: RecyclerView private val skipIcons: Boolean = PrefManager.getVal(PrefName.SkipExtensionIcons) @@ -183,9 +183,9 @@ class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler { container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentAnimeExtensionsBinding.inflate(inflater, container, false) + _binding = FragmentExtensionsBinding.inflate(inflater, container, false) - extensionsRecyclerView = binding.allAnimeExtensionsRecyclerView + extensionsRecyclerView = binding.allExtensionsRecyclerView extensionsRecyclerView.layoutManager = LinearLayoutManager(requireContext()) extensionsRecyclerView.adapter = extensionsAdapter diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt index 24780ef5..90bfa771 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt @@ -26,7 +26,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface -import ani.dantotsu.databinding.FragmentMangaExtensionsBinding +import ani.dantotsu.databinding.FragmentExtensionsBinding import ani.dantotsu.others.LanguageMapper import ani.dantotsu.parsers.MangaSources import ani.dantotsu.settings.extensionprefs.MangaSourcePreferencesFragment @@ -48,7 +48,7 @@ import java.util.Collections import java.util.Locale class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler { - private var _binding: FragmentMangaExtensionsBinding? = null + private var _binding: FragmentExtensionsBinding? = null private val binding get() = _binding!! private lateinit var extensionsRecyclerView: RecyclerView private val skipIcons: Boolean = PrefManager.getVal(PrefName.SkipExtensionIcons) @@ -181,9 +181,9 @@ class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler { container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentMangaExtensionsBinding.inflate(inflater, container, false) + _binding = FragmentExtensionsBinding.inflate(inflater, container, false) - extensionsRecyclerView = binding.allMangaExtensionsRecyclerView + extensionsRecyclerView = binding.allExtensionsRecyclerView extensionsRecyclerView.layoutManager = LinearLayoutManager(requireContext()) extensionsRecyclerView.adapter = extensionsAdapter diff --git a/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt index 6f7276ad..c5118096 100644 --- a/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt @@ -13,7 +13,7 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface -import ani.dantotsu.databinding.FragmentMangaExtensionsBinding +import ani.dantotsu.databinding.FragmentExtensionsBinding import ani.dantotsu.settings.paging.MangaExtensionAdapter import ani.dantotsu.settings.paging.MangaExtensionsViewModel import ani.dantotsu.settings.paging.MangaExtensionsViewModelFactory @@ -30,7 +30,7 @@ import uy.kohesive.injekt.api.get class MangaExtensionsFragment : Fragment(), SearchQueryHandler, OnMangaInstallClickListener { - private var _binding: FragmentMangaExtensionsBinding? = null + private var _binding: FragmentExtensionsBinding? = null private val binding get() = _binding!! private val viewModel: MangaExtensionsViewModel by viewModels { @@ -49,12 +49,12 @@ class MangaExtensionsFragment : Fragment(), container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentMangaExtensionsBinding.inflate(inflater, container, false) + _binding = FragmentExtensionsBinding.inflate(inflater, container, false) - binding.allMangaExtensionsRecyclerView.isNestedScrollingEnabled = false - binding.allMangaExtensionsRecyclerView.adapter = adapter - binding.allMangaExtensionsRecyclerView.layoutManager = LinearLayoutManager(context) - (binding.allMangaExtensionsRecyclerView.layoutManager as LinearLayoutManager).isItemPrefetchEnabled = + binding.allExtensionsRecyclerView.isNestedScrollingEnabled = false + binding.allExtensionsRecyclerView.adapter = adapter + binding.allExtensionsRecyclerView.layoutManager = LinearLayoutManager(context) + (binding.allExtensionsRecyclerView.layoutManager as LinearLayoutManager).isItemPrefetchEnabled = true lifecycleScope.launch { @@ -92,8 +92,8 @@ class MangaExtensionsFragment : Fragment(), Notifications.CHANNEL_DOWNLOADER_PROGRESS ) .setSmallIcon(R.drawable.ic_round_sync_24) - .setContentTitle("Installing extension") - .setContentText("Step: $installStep") + .setContentTitle(getString(R.string.installing_extension)) + .setContentText(getString(R.string.install_step, installStep)) .setPriority(NotificationCompat.PRIORITY_LOW) notificationManager.notify(1, builder.build()) }, @@ -104,11 +104,11 @@ class MangaExtensionsFragment : Fragment(), Notifications.CHANNEL_DOWNLOADER_ERROR ) .setSmallIcon(R.drawable.ic_round_info_24) - .setContentTitle("Installation failed: ${error.message}") - .setContentText("Error: ${error.message}") + .setContentTitle(getString(R.string.installation_failed, error.message)) + .setContentText(getString(R.string.error_message, error.message)) .setPriority(NotificationCompat.PRIORITY_HIGH) notificationManager.notify(1, builder.build()) - snackString("Installation failed: ${error.message}") + snackString(getString(R.string.installation_failed, error.message)) }, { val builder = NotificationCompat.Builder( @@ -116,12 +116,12 @@ class MangaExtensionsFragment : Fragment(), Notifications.CHANNEL_DOWNLOADER_PROGRESS ) .setSmallIcon(R.drawable.ic_download_24) - .setContentTitle("Installation complete") - .setContentText("The extension has been successfully installed.") + .setContentTitle(getString(R.string.installation_complete)) + .setContentText(getString(R.string.extension_has_been_installed)) .setPriority(NotificationCompat.PRIORITY_LOW) notificationManager.notify(1, builder.build()) viewModel.invalidatePager() - snackString("Extension installed") + snackString(getString(R.string.extension_installed)) } ) } diff --git a/app/src/main/res/layout/activity_player_settings.xml b/app/src/main/res/layout/activity_player_settings.xml index 729a4788..afbc7ee2 100644 --- a/app/src/main/res/layout/activity_player_settings.xml +++ b/app/src/main/res/layout/activity_player_settings.xml @@ -177,7 +177,8 @@ android:layout_height="64dp" android:fontFamily="@font/poppins_bold" android:gravity="center_vertical" - android:paddingHorizontal="32dp" + android:paddingStart="48dp" + android:paddingEnd="32dp" android:text="@string/sub_text_example" android:textColor="?attr/colorSecondary" app:drawableEndCompat="@drawable/ic_round_arrow_drop_down_24" diff --git a/app/src/main/res/layout/fragment_anime_extensions.xml b/app/src/main/res/layout/fragment_anime_extensions.xml deleted file mode 100644 index 2ccb2d42..00000000 --- a/app/src/main/res/layout/fragment_anime_extensions.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_manga_extensions.xml b/app/src/main/res/layout/fragment_extensions.xml similarity index 89% rename from app/src/main/res/layout/fragment_manga_extensions.xml rename to app/src/main/res/layout/fragment_extensions.xml index 99067aea..d51f19be 100644 --- a/app/src/main/res/layout/fragment_manga_extensions.xml +++ b/app/src/main/res/layout/fragment_extensions.xml @@ -7,7 +7,7 @@ android:paddingEnd="16dp"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6ad56211..989da759 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -409,6 +409,13 @@ Crop Borders NOTE + 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