diff --git a/app/src/main/java/ani/dantotsu/App.kt b/app/src/main/java/ani/dantotsu/App.kt index 37024e27..257bc6dd 100644 --- a/app/src/main/java/ani/dantotsu/App.kt +++ b/app/src/main/java/ani/dantotsu/App.kt @@ -151,7 +151,10 @@ class App : MultiDexApplication() { } companion object { - private var instance: App? = null + /** Reference to the application context. + * + * USE WITH EXTREME CAUTION!**/ + var instance: App? = null var context: Context? = null fun currentContext(): Context? { return instance?.mFTActivityLifecycleCallbacks?.currentActivity ?: context diff --git a/app/src/main/java/ani/dantotsu/Functions.kt b/app/src/main/java/ani/dantotsu/Functions.kt index 446a97b9..4b6300c6 100644 --- a/app/src/main/java/ani/dantotsu/Functions.kt +++ b/app/src/main/java/ani/dantotsu/Functions.kt @@ -401,7 +401,6 @@ class InputFilterMinMax( return "" } - @SuppressLint("SetTextI18n") private fun isInRange(a: Double, b: Double, c: Double): Boolean { val statusStrings = currContext()!!.resources.getStringArray(R.array.status_manga)[2] @@ -904,9 +903,9 @@ fun copyToClipboard(string: String, toast: Boolean = true) { } } -@SuppressLint("SetTextI18n") fun countDown(media: Media, view: ViewGroup) { - if (media.anime?.nextAiringEpisode != null && media.anime.nextAiringEpisodeTime != null && (media.anime.nextAiringEpisodeTime!! - System.currentTimeMillis() / 1000) <= 86400 * 28.toLong()) { + if (media.anime?.nextAiringEpisode != null && media.anime.nextAiringEpisodeTime != null + && (media.anime.nextAiringEpisodeTime!! - System.currentTimeMillis() / 1000) <= 86400 * 28.toLong()) { val v = ItemCountDownBinding.inflate(LayoutInflater.from(view.context), view, false) view.addView(v.root, 0) v.mediaCountdownText.text = @@ -1007,6 +1006,10 @@ class EmptyAdapter(private val count: Int) : RecyclerView.Adapter(context: Context, layoutId: Int, items: List) : ArrayAdapter(context, layoutId, items) { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { diff --git a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt index 63cc384a..3ab53d55 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt @@ -1,7 +1,6 @@ package ani.dantotsu.download.anime -import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -38,7 +37,6 @@ class OfflineAnimeAdapter( return position.toLong() } - @SuppressLint("SetTextI18n") override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view: View = convertView ?: when (style) { @@ -61,14 +59,14 @@ class OfflineAnimeAdapter( if (style == 0) { val bannerView = view.findViewById(R.id.itemCompactBanner) // for large view val episodes = view.findViewById(R.id.itemTotal) - episodes.text = " Episodes" + episodes.text = context.getString(R.string.episodes) bannerView.setImageURI(item.banner ?: item.image) totalepisodes.text = item.totalEpisodeList } else if (style == 1) { val watchedEpisodes = view.findViewById(R.id.itemCompactUserProgress) // for compact view watchedEpisodes.text = item.watchedEpisode - totalepisodes.text = " | " + item.totalEpisode + totalepisodes.text = context.getString(R.string.total_divider, item.totalEpisode) } // Bind item data to the views diff --git a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt index 0bc9ef08..8c6aef99 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt @@ -37,7 +37,6 @@ class OfflineMangaAdapter( return position.toLong() } - @SuppressLint("SetTextI18n") override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view: View = convertView ?: when (style) { @@ -60,14 +59,14 @@ class OfflineMangaAdapter( if (style == 0) { val bannerView = view.findViewById(R.id.itemCompactBanner) // for large view val chapters = view.findViewById(R.id.itemTotal) - chapters.text = " Chapters" + chapters.text = context.getString(R.string.chapters) bannerView.setImageURI(item.banner ?: item.image) totalChapter.text = item.totalChapter } else if (style == 1) { val readChapter = view.findViewById(R.id.itemCompactUserProgress) // for compact view readChapter.text = item.readChapter - totalChapter.text = " | " + item.totalChapter + totalChapter.text = context.getString(R.string.total_divider, item.totalChapter) } // Bind item data to the views diff --git a/app/src/main/java/ani/dantotsu/media/AuthorAdapter.kt b/app/src/main/java/ani/dantotsu/media/AuthorAdapter.kt index 35195960..431c5ddd 100644 --- a/app/src/main/java/ani/dantotsu/media/AuthorAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/AuthorAdapter.kt @@ -24,7 +24,6 @@ class AuthorAdapter( return AuthorViewHolder(binding) } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder:AuthorViewHolder, position: Int) { val binding = holder.binding setAnimation(binding.root.context, holder.binding.root) diff --git a/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt b/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt index bbe66477..df4acb7f 100644 --- a/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt @@ -34,7 +34,6 @@ class CalendarActivity : AppCompatActivity() { private var selectedTabIdx = 1 private val model: OtherDetailsViewModel by viewModels() - @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/ani/dantotsu/media/CharacterAdapter.kt b/app/src/main/java/ani/dantotsu/media/CharacterAdapter.kt index d8c4961c..78eeb273 100644 --- a/app/src/main/java/ani/dantotsu/media/CharacterAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/CharacterAdapter.kt @@ -24,12 +24,12 @@ class CharacterAdapter( return CharacterViewHolder(binding) } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: CharacterViewHolder, position: Int) { val binding = holder.binding setAnimation(binding.root.context, holder.binding.root) val character = characterList[position] - binding.itemCompactRelation.text = character.role + " " + val whitespace = "${character.role} " + binding.itemCompactRelation.text = whitespace binding.itemCompactImage.loadImage(character.image) binding.itemCompactTitle.text = character.name } diff --git a/app/src/main/java/ani/dantotsu/media/CharacterDetailsAdapter.kt b/app/src/main/java/ani/dantotsu/media/CharacterDetailsAdapter.kt index 2e419492..5c78feb0 100644 --- a/app/src/main/java/ani/dantotsu/media/CharacterDetailsAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/CharacterDetailsAdapter.kt @@ -20,15 +20,16 @@ class CharacterDetailsAdapter(private val character: Character, private val acti return GenreViewHolder(binding) } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: GenreViewHolder, position: Int) { val binding = holder.binding val desc = - (if (character.age != "null") currActivity()!!.getString(R.string.age) + " " + character.age else "") + - (if (character.dateOfBirth.toString() != "") currActivity()!!.getString(R.string.birthday) + " " + character.dateOfBirth.toString() else "") + - (if (character.gender != "null") currActivity()!!.getString(R.string.gender) + " " + when (character.gender) { - "Male" -> currActivity()!!.getString(R.string.male) - "Female" -> currActivity()!!.getString(R.string.female) + (if (character.age != "null") "${currActivity()!!.getString(R.string.age)} ${character.age}" else "") + + (if (character.dateOfBirth.toString() != "") + "${currActivity()!!.getString(R.string.birthday)} ${character.dateOfBirth.toString()}" else "") + + (if (character.gender != "null") + currActivity()!!.getString(R.string.gender) + " " + when (character.gender) { + currActivity()!!.getString(R.string.male) -> currActivity()!!.getString(R.string.male) + currActivity()!!.getString(R.string.female) -> currActivity()!!.getString(R.string.female) else -> character.gender } else "") + "\n" + character.description diff --git a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt index d8b86e86..aebd8dbf 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt @@ -86,7 +86,7 @@ class MediaAdaptor( } - @SuppressLint("SetTextI18n", "ClickableViewAccessibility") + @SuppressLint("ClickableViewAccessibility") override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (type) { 0 -> { diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index 58fdf121..a781326a 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -77,7 +77,7 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi var anime = true private var adult = false - @SuppressLint("SetTextI18n", "ClickableViewAccessibility") + @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) var media: Media = intent.getSerialized("media") ?: mediaSingleton ?: emptyMedia() @@ -85,8 +85,7 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi if (id != -1) { runBlocking { withContext(Dispatchers.IO) { - media = - Anilist.query.getMedia(id, false) ?: emptyMedia() + media = Anilist.query.getMedia(id, false) ?: emptyMedia() } } } @@ -152,9 +151,10 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi binding.mediaCoverImage.loadImage(media.cover) binding.mediaCoverImage.setOnLongClickListener { + val coverTitle = "${media.userPreferredName}[Cover]" ImageViewDialog.newInstance( this, - media.userPreferredName + "[Cover]", + coverTitle, media.cover ) } @@ -171,9 +171,10 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi } override fun onLongClick(event: MotionEvent) { + val bannerTitle = "${media.userPreferredName}[Banner]" ImageViewDialog.newInstance( this@MediaDetailsActivity, - media.userPreferredName + "[Banner]", + bannerTitle, media.banner ?: media.cover ) banner.performClick() @@ -181,7 +182,8 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi }) banner.setOnTouchListener { _, motionEvent -> gestureDetector.onTouchEvent(motionEvent);true } if (PrefManager.getVal(PrefName.Incognito)) { - binding.mediaTitle.text = " ${media.userPreferredName}" + val mediaTitle = " ${media.userPreferredName}" + binding.mediaTitle.text = mediaTitle binding.incognito.visibility = View.VISIBLE } else { binding.mediaTitle.text = media.userPreferredName diff --git a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt index 27520c72..ecd0e537 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt @@ -39,7 +39,7 @@ import java.io.Serializable import java.net.URLEncoder -@SuppressLint("SetTextI18n") + class MediaInfoFragment : Fragment() { private var _binding: FragmentMediaInfoBinding? = null private val binding get() = _binding!! @@ -48,6 +48,8 @@ class MediaInfoFragment : Fragment() { private var type = "ANIME" private val genreModel: GenresViewModel by activityViewModels() + private val tripleTab = "\t\t\t" + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -80,14 +82,16 @@ class MediaInfoFragment : Fragment() { binding.mediaInfoProgressBar.visibility = View.GONE binding.mediaInfoContainer.visibility = View.VISIBLE - binding.mediaInfoName.text = "\t\t\t" + (media.name ?: media.nameRomaji) + val infoName = tripleTab + (media.name ?: media.nameRomaji) + binding.mediaInfoName.text = infoName binding.mediaInfoName.setOnLongClickListener { copyToClipboard(media.name ?: media.nameRomaji) true } if (media.name != null) binding.mediaInfoNameRomajiContainer.visibility = View.VISIBLE - binding.mediaInfoNameRomaji.text = "\t\t\t" + media.nameRomaji + val infoNameRomanji = tripleTab + media.nameRomaji + binding.mediaInfoNameRomaji.text = infoNameRomanji binding.mediaInfoNameRomaji.setOnLongClickListener { copyToClipboard(media.nameRomaji) true @@ -129,8 +133,9 @@ class MediaInfoFragment : Fragment() { } binding.mediaInfoDurationContainer.visibility = View.VISIBLE binding.mediaInfoSeasonContainer.visibility = View.VISIBLE - binding.mediaInfoSeason.text = - (media.anime.season ?: "??") + " " + (media.anime.seasonYear ?: "??") + val seasonInfo = "${(media.anime.season ?: "??")} ${(media.anime.seasonYear ?: "??")}" + binding.mediaInfoSeason.text = seasonInfo + if (media.anime.mainStudio != null) { binding.mediaInfoStudioContainer.visibility = View.VISIBLE binding.mediaInfoStudio.text = media.anime.mainStudio!!.name @@ -164,9 +169,12 @@ class MediaInfoFragment : Fragment() { } } binding.mediaInfoTotalTitle.setText(R.string.total_eps) - binding.mediaInfoTotal.text = - if (media.anime.nextAiringEpisode != null) (media.anime.nextAiringEpisode.toString() + " | " + (media.anime.totalEpisodes - ?: "~").toString()) else (media.anime.totalEpisodes ?: "~").toString() + val infoTotal = if (media.anime.nextAiringEpisode != null) + "${media.anime.nextAiringEpisode} | ${media.anime.totalEpisodes ?: "~"}" + else + (media.anime.totalEpisodes ?: "~").toString() + binding.mediaInfoTotal.text = infoTotal + } else if (media.manga != null) { type = "MANGA" binding.mediaInfoTotalTitle.setText(R.string.total_chaps) @@ -193,8 +201,9 @@ class MediaInfoFragment : Fragment() { (media.description ?: "null").replace("\\n", "
").replace("\\\"", "\""), HtmlCompat.FROM_HTML_MODE_LEGACY ) - binding.mediaInfoDescription.text = - "\t\t\t" + if (desc.toString() != "null") desc else getString(R.string.no_description_available) + val infoDesc = tripleTab + if (desc.toString() != "null") desc else getString(R.string.no_description_available) + binding.mediaInfoDescription.text = infoDesc + binding.mediaInfoDescription.setOnClickListener { if (binding.mediaInfoDescription.maxLines == 5) { ObjectAnimator.ofInt(binding.mediaInfoDescription, "maxLines", 100) diff --git a/app/src/main/java/ani/dantotsu/media/MediaListDialogFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaListDialogFragment.kt index 0430709b..e8c15685 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaListDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaListDialogFragment.kt @@ -36,7 +36,6 @@ class MediaListDialogFragment : BottomSheetDialogFragment() { return binding.root } - @SuppressLint("SetTextI18n") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { binding.mediaListContainer.updateLayoutParams { bottomMargin += navBarHeight } var media: Media? @@ -168,9 +167,10 @@ class MediaListDialogFragment : BottomSheetDialogFragment() { val init = if (binding.mediaListProgress.text.toString() != "") binding.mediaListProgress.text.toString() .toInt() else 0 - if (init < (total - ?: 5000) - ) binding.mediaListProgress.setText((init + 1).toString()) + if (init < (total ?: 5000)) { + val progressText = "${init + 1}" + binding.mediaListProgress.setText(progressText) + } if (init + 1 == (total ?: 5000)) { binding.mediaListStatus.setText(statusStrings[2], false) onComplete() diff --git a/app/src/main/java/ani/dantotsu/media/MediaListDialogSmallFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaListDialogSmallFragment.kt index 982eca8e..8848c125 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaListDialogSmallFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaListDialogSmallFragment.kt @@ -54,7 +54,6 @@ class MediaListDialogSmallFragment : BottomSheetDialogFragment() { } - @SuppressLint("SetTextI18n") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { binding.mediaListContainer.updateLayoutParams { bottomMargin += navBarHeight } val scope = viewLifecycleOwner.lifecycleScope @@ -68,7 +67,7 @@ class MediaListDialogSmallFragment : BottomSheetDialogFragment() { MAL.query.deleteList(media.anime != null, media.idMAL) } catch (e: Exception) { withContext(Dispatchers.Main) { - snackString("Failed to delete because of... ${e.message}") + snackString(getString(R.string.delete_fail_reason, e.message)) } return@withContext } @@ -154,7 +153,10 @@ class MediaListDialogSmallFragment : BottomSheetDialogFragment() { val init = if (binding.mediaListProgress.text.toString() != "") binding.mediaListProgress.text.toString() .toInt() else 0 - if (init < (total ?: 5000)) binding.mediaListProgress.setText((init + 1).toString()) + if (init < (total ?: 5000)) { + val progressText = "${init + 1}" + binding.mediaListProgress.setText(progressText) + } if (init + 1 == (total ?: 5000)) { binding.mediaListStatus.setText(statusStrings[2], false) } diff --git a/app/src/main/java/ani/dantotsu/media/ProgressAdapter.kt b/app/src/main/java/ani/dantotsu/media/ProgressAdapter.kt index 081d47fc..eb11c29f 100644 --- a/app/src/main/java/ani/dantotsu/media/ProgressAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/ProgressAdapter.kt @@ -27,7 +27,7 @@ class ProgressAdapter(private val horizontal: Boolean = true, searched: Boolean) return ProgressViewHolder(binding) } - @SuppressLint("SetTextI18n", "ClickableViewAccessibility") + @SuppressLint("ClickableViewAccessibility") override fun onBindViewHolder(holder: ProgressViewHolder, position: Int) { val progressBar = holder.binding.root bar = progressBar diff --git a/app/src/main/java/ani/dantotsu/media/SourceAdapter.kt b/app/src/main/java/ani/dantotsu/media/SourceAdapter.kt index c1dd18b2..e56adde6 100644 --- a/app/src/main/java/ani/dantotsu/media/SourceAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/SourceAdapter.kt @@ -1,6 +1,5 @@ package ani.dantotsu.media -import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView @@ -22,7 +21,6 @@ abstract class SourceAdapter( return SourceViewHolder(binding) } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: SourceViewHolder, position: Int) { val binding = holder.binding val character = sources[position] 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 560736f9..3b69477f 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt @@ -56,7 +56,6 @@ class AnimeWatchAdapter( private var nestedDialog: AlertDialog? = null - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: ViewHolder, position: Int) { val binding = holder.binding _binding = binding @@ -219,9 +218,9 @@ class AnimeWatchAdapter( else -> dialogBinding.animeSourceList } when (style) { - 0 -> dialogBinding.layoutText.text = "List" - 1 -> dialogBinding.layoutText.text = "Grid" - 2 -> dialogBinding.layoutText.text = "Compact" + 0 -> dialogBinding.layoutText.setText(R.string.list) + 1 -> dialogBinding.layoutText.setText(R.string.grid) + 2 -> dialogBinding.layoutText.setText(R.string.compact) else -> dialogBinding.animeSourceList } selected.alpha = 1f @@ -233,24 +232,24 @@ class AnimeWatchAdapter( dialogBinding.animeSourceList.setOnClickListener { selected(it as ImageButton) style = 0 - dialogBinding.layoutText.text = "List" + dialogBinding.layoutText.setText(R.string.list) run = true } dialogBinding.animeSourceGrid.setOnClickListener { selected(it as ImageButton) style = 1 - dialogBinding.layoutText.text = "Grid" + dialogBinding.layoutText.setText(R.string.grid) run = true } dialogBinding.animeSourceCompact.setOnClickListener { selected(it as ImageButton) style = 2 - dialogBinding.layoutText.text = "Compact" + dialogBinding.layoutText.setText(R.string.compact) run = true } dialogBinding.animeWebviewContainer.setOnClickListener { if (!WebViewUtil.supportsWebView(fragment.requireContext())) { - toast("WebView not installed") + toast(R.string.webview_not_installed) } //start CookieCatcher activity if (watchSources.names.isNotEmpty() && source in 0 until watchSources.names.size) { @@ -303,7 +302,6 @@ class AnimeWatchAdapter( } //Chips - @SuppressLint("SetTextI18n") fun updateChips(limit: Int, names: Array, arr: Array, selected: Int = 0) { val binding = _binding if (binding != null) { @@ -325,7 +323,8 @@ class AnimeWatchAdapter( 0 ) } - chip.text = "${names[limit * (position)]} - ${names[last - 1]}" + val chipText = "${names[limit * (position)]} - ${names[last - 1]}" + chip.text = chipText chip.setTextColor( ContextCompat.getColorStateList( fragment.requireContext(), @@ -359,7 +358,6 @@ class AnimeWatchAdapter( _binding?.animeSourceChipGroup?.removeAllViews() } - @SuppressLint("SetTextI18n") fun handleEpisodes() { val binding = _binding if (binding != null) { @@ -367,9 +365,9 @@ class AnimeWatchAdapter( val episodes = media.anime.episodes!!.keys.toTypedArray() val anilistEp = (media.userProgress ?: 0).plus(1) - val appEp = - PrefManager.getCustomVal("${media.id}_current_ep", "")?.toIntOrNull() - ?: 1 + val appEp = PrefManager.getCustomVal( + "${media.id}_current_ep", "" + )?.toIntOrNull() ?: 1 var continueEp = (if (anilistEp > appEp) anilistEp else appEp).toString() if (episodes.contains(continueEp)) { @@ -405,15 +403,19 @@ class AnimeWatchAdapter( ep.thumb ?: FileUrl[media.banner ?: media.cover], 0 ) if (ep.filler) binding.itemEpisodeFillerView.visibility = View.VISIBLE + binding.animeSourceContinueText.text = - currActivity()!!.getString(R.string.continue_episode) + "${ep.number}${if (ep.filler) " - Filler" else ""}${"\n$cleanedTitle"}" + currActivity()!!.getString(R.string.continue_episode, ep.number, if (ep.filler) + currActivity()!!.getString(R.string.filler_tag) + else + "", cleanedTitle) binding.animeSourceContinue.setOnClickListener { fragment.onEpisodeClick(continueEp) } if (fragment.continueEp) { - if ((binding.itemEpisodeProgress.layoutParams as LinearLayout.LayoutParams).weight < PrefManager.getVal( - PrefName.WatchPercentage - ) + if ( + (binding.itemEpisodeProgress.layoutParams as LinearLayout.LayoutParams) + .weight < PrefManager.getVal(PrefName.WatchPercentage) ) { binding.animeSourceContinue.performClick() fragment.continueEp = false 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 dcd6c91f..1f543319 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt @@ -98,7 +98,6 @@ class EpisodeAdapter( return type } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { val ep = arr[position] val title = if (!ep.title.isNullOrEmpty() && ep.title != "null") { 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 16c51475..17f858e8 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -110,7 +110,7 @@ import kotlin.math.min import kotlin.math.roundToInt @UnstableApi -@SuppressLint("SetTextI18n", "ClickableViewAccessibility") +@SuppressLint("ClickableViewAccessibility") class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityListener { private val resumeWindow = "resumeWindow" @@ -703,11 +703,13 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL fun seek(forward: Boolean, event: MotionEvent? = null) { val seekTime = PrefManager.getVal(PrefName.SeekTime) val (card, text) = if (forward) { - forwardText.text = "+${seekTime * ++seekTimesF}" + val text = "+${seekTime * ++seekTimesF}" + forwardText.text = text handler.post { exoPlayer.seekTo(exoPlayer.currentPosition + seekTime * 1000) } fastForwardCard to forwardText } else { - rewindText.text = "-${seekTime * ++seekTimesR}" + val text = "-${seekTime * ++seekTimesR}" + rewindText.text = text handler.post { exoPlayer.seekTo(exoPlayer.currentPosition - seekTime * 1000) } fastRewindCard to rewindText } @@ -1659,7 +1661,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL aspectRatio = Rational(width, height) - videoInfo.text = "Quality: ${height}p" + videoInfo.text = getString(R.string.video_quality, height) if (exoPlayer.duration < playbackPosition) exoPlayer.seekTo(0) diff --git a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt index db488f58..22a7e097 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt @@ -303,7 +303,6 @@ class SelectorDialogFragment : BottomSheetDialogFragment() { ) } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: UrlViewHolder, position: Int) { val binding = holder.binding val video = extractor.videos[position] @@ -403,11 +402,11 @@ class SelectorDialogFragment : BottomSheetDialogFragment() { } if (video.format == VideoType.CONTAINER) { binding.urlSize.isVisible = video.size != null - binding.urlSize.text = - // if video size is null or 0, show "Unknown Size" else show the size in MB - (if (video.extraNote != null) " : " else "") + (if (video.size == 0.0) "Unknown Size" else (DecimalFormat( - "#.##" - ).format(video.size ?: 0).toString() + " MB")) + // if video size is null or 0, show "Unknown Size" else show the size in MB + val sizeText = getString(R.string.mb_size, "${if (video.extraNote != null) " : " else ""}${ + if (video.size == 0.0) getString(R.string.size_unknown) else DecimalFormat("#.##").format(video.size ?: 0) + }") + binding.urlSize.text = sizeText } binding.urlNote.visibility = View.VISIBLE binding.urlNote.text = video.format.name diff --git a/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt b/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt index b78d4dce..c45c274a 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt @@ -11,6 +11,7 @@ import ani.dantotsu.connections.comments.Comment import ani.dantotsu.connections.comments.CommentsAPI import ani.dantotsu.copyToClipboard import ani.dantotsu.databinding.ItemCommentsBinding +import ani.dantotsu.getAppString import ani.dantotsu.loadImage import ani.dantotsu.others.ImageViewDialog import ani.dantotsu.profile.ProfileActivity @@ -52,7 +53,6 @@ class CommentItem(val comment: Comment, adapter.add(repliesSection) } - @SuppressLint("SetTextI18n") override fun bind(viewBinding: ItemCommentsBinding, position: Int) { binding = viewBinding setAnimation(binding.root.context, binding.root) @@ -76,8 +76,15 @@ class CommentItem(val comment: Comment, if ((comment.replyCount ?: 0) > 0) { viewBinding.commentTotalReplies.visibility = View.VISIBLE viewBinding.commentRepliesDivider.visibility = View.VISIBLE - viewBinding.commentTotalReplies.text = if(repliesVisible) "Hide Replies" else - "View ${comment.replyCount} repl${if (comment.replyCount == 1) "y" else "ies"}" + viewBinding.commentTotalReplies.context.run { + viewBinding.commentTotalReplies.text = if (repliesVisible) + getString(R.string.hide_replies) + else + if (comment.replyCount == 1) + getString(R.string.view_reply) + else + getString(R.string.view_replies_count, comment.replyCount) + } } else { viewBinding.commentTotalReplies.visibility = View.GONE viewBinding.commentRepliesDivider.visibility = View.GONE @@ -87,10 +94,15 @@ class CommentItem(val comment: Comment, if (repliesVisible) { repliesSection.clear() removeSubCommentIds() - viewBinding.commentTotalReplies.text = "View ${comment.replyCount} repl${if (comment.replyCount == 1) "y" else "ies"}" + viewBinding.commentTotalReplies.context.run { + viewBinding.commentTotalReplies.text = if (comment.replyCount == 1) + getString(R.string.view_reply) + else + getString(R.string.view_replies_count, comment.replyCount) + } repliesVisible = false } else { - viewBinding.commentTotalReplies.text = "Hide Replies" + viewBinding.commentTotalReplies.setText(R.string.hide_replies) repliesSection.clear() commentsFragment.viewReplyCallback(this) repliesVisible = true @@ -128,35 +140,37 @@ class CommentItem(val comment: Comment, viewBinding.modBadge.visibility = if (comment.isMod == true) View.VISIBLE else View.GONE viewBinding.adminBadge.visibility = if (comment.isAdmin == true) View.VISIBLE else View.GONE viewBinding.commentDelete.setOnClickListener { - dialogBuilder("Delete Comment", "Are you sure you want to delete this comment?") { - val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) - scope.launch { + dialogBuilder(getAppString(R.string.delete_comment), getAppString(R.string.delete_comment_confirm)) { + CoroutineScope(Dispatchers.Main + SupervisorJob()).launch { val success = CommentsAPI.deleteComment(comment.commentId) if (success) { - snackString("Comment Deleted") + snackString(R.string.comment_deleted) parentSection.remove(this@CommentItem) } } } } viewBinding.commentBanUser.setOnClickListener { - dialogBuilder("Ban User", "Are you sure you want to ban this user?") { - val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) - scope.launch { + dialogBuilder(getAppString(R.string.ban_user), getAppString(R.string.ban_user_confirm)) { + CoroutineScope(Dispatchers.Main + SupervisorJob()).launch { val success = CommentsAPI.banUser(comment.userId) if (success) { - snackString("User Banned") + snackString(R.string.user_banned) } } } } viewBinding.commentReport.setOnClickListener { - dialogBuilder("Report Comment", "Only report comments that violate the rules. Are you sure you want to report this comment?") { - val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) - scope.launch { - val success = CommentsAPI.reportComment(comment.commentId, comment.username, commentsFragment.mediaName, comment.userId) + dialogBuilder(getAppString(R.string.report_comment), getAppString(R.string.report_comment_confirm)) { + CoroutineScope(Dispatchers.Main + SupervisorJob()).launch { + val success = CommentsAPI.reportComment( + comment.commentId, + comment.username, + commentsFragment.mediaName, + comment.userId + ) if (success) { - snackString("Comment Reported") + snackString(R.string.comment_reported) } } } @@ -210,7 +224,8 @@ class CommentItem(val comment: Comment, } comment.profilePictureUrl?.let { viewBinding.commentUserAvatar.loadImage(it) } viewBinding.commentUserName.text = comment.username - viewBinding.commentUserLevel.text = "[${levelColor.second}]" + val userColor = "[${levelColor.second}]" + viewBinding.commentUserLevel.text = userColor viewBinding.commentUserLevel.setTextColor(levelColor.first) viewBinding.commentUserTime.text = formatTimestamp(comment.timestamp) } @@ -272,6 +287,7 @@ class CommentItem(val comment: Comment, } } + @SuppressLint("SimpleDateFormat") private fun formatTimestamp(timestamp: String): String { return try { val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") @@ -297,6 +313,7 @@ class CommentItem(val comment: Comment, } companion object { + @SuppressLint("SimpleDateFormat") fun timestampToMillis(timestamp: String): Long { val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") dateFormat.timeZone = TimeZone.getTimeZone("UTC") diff --git a/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt b/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt index 5e699799..0ec2d3bf 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt @@ -523,11 +523,10 @@ class CommentsFragment : Fragment() { } - @SuppressLint("SetTextI18n") fun replyTo(comment: CommentItem, username: String) { if (comment.isReplying) { activity.binding.commentReplyToContainer.visibility = View.VISIBLE - activity.binding.commentReplyTo.text = "Replying to $username" + activity.binding.commentReplyTo.text = getString(R.string.replying_to, username) activity.binding.commentReplyToCancel.setOnClickListener { comment.replying(false) replyCallback(comment) 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 d19aa011..67d9a696 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt @@ -262,7 +262,6 @@ class MangaChapterAdapter( } } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is ChapterCompactViewHolder -> { diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt index 08bec961..16cd3ed0 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt @@ -60,7 +60,6 @@ class MangaReadAdapter( private var nestedDialog: AlertDialog? = null - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: ViewHolder, position: Int) { val binding = holder.binding _binding = binding @@ -188,8 +187,8 @@ class MangaReadAdapter( else -> dialogBinding.animeSourceList } when (style) { - 0 -> dialogBinding.layoutText.text = "List" - 1 -> dialogBinding.layoutText.text = "Compact" + 0 -> dialogBinding.layoutText.setText(R.string.list) + 1 -> dialogBinding.layoutText.setText(R.string.compact) else -> dialogBinding.animeSourceList } selected.alpha = 1f @@ -201,18 +200,18 @@ class MangaReadAdapter( dialogBinding.animeSourceList.setOnClickListener { selected(it as ImageButton) style = 0 - dialogBinding.layoutText.text = "List" + dialogBinding.layoutText.setText(R.string.list) run = true } dialogBinding.animeSourceCompact.setOnClickListener { selected(it as ImageButton) style = 1 - dialogBinding.layoutText.text = "Compact" + dialogBinding.layoutText.setText(R.string.compact) run = true } dialogBinding.animeWebviewContainer.setOnClickListener { if (!WebViewUtil.supportsWebView(fragment.requireContext())) { - toast("WebView not installed") + toast(R.string.webview_not_installed) } //start CookieCatcher activity if (mangaReadSources.names.isNotEmpty() && source in 0 until mangaReadSources.names.size) { @@ -358,7 +357,6 @@ class MangaReadAdapter( } //Chips - @SuppressLint("SetTextI18n") fun updateChips(limit: Int, names: Array, arr: Array, selected: Int = 0) { val binding = _binding if (binding != null) { @@ -394,7 +392,8 @@ class MangaReadAdapter( names[last - 1] } //chip.text = "${names[limit * (position)]} - ${names[last - 1]}" - chip.text = "$startChapterString - $endChapterString" + val chipText = "$startChapterString - $endChapterString" + chip.text = chipText chip.setTextColor( ContextCompat.getColorStateList( fragment.requireContext(), @@ -428,7 +427,6 @@ class MangaReadAdapter( _binding?.animeSourceChipGroup?.removeAllViews() } - @SuppressLint("SetTextI18n") fun handleChapters() { val binding = _binding @@ -465,7 +463,7 @@ class MangaReadAdapter( val ep = media.manga.chapters!![continueEp]!! binding.itemEpisodeImage.loadImage(media.banner ?: media.cover) binding.animeSourceContinueText.text = - currActivity()!!.getString(R.string.continue_chapter) + "${ep.number}${if (!ep.title.isNullOrEmpty()) "\n${ep.title}" else ""}" + currActivity()!!.getString(R.string.continue_chapter, ep.number, if (!ep.title.isNullOrEmpty()) ep.title else "") binding.animeSourceContinue.setOnClickListener { fragment.onMangaChapterClick(continueEp) } diff --git a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt index 3d5997cb..5ae6e5a1 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt @@ -70,7 +70,6 @@ import java.util.* import kotlin.math.min import kotlin.properties.Delegates -@SuppressLint("SetTextI18n") class MangaReaderActivity : AppCompatActivity() { private val mangaCache = Injekt.get() diff --git a/app/src/main/java/ani/dantotsu/media/novel/UrlAdapter.kt b/app/src/main/java/ani/dantotsu/media/novel/UrlAdapter.kt index 96e9bcf8..dabd635c 100644 --- a/app/src/main/java/ani/dantotsu/media/novel/UrlAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/novel/UrlAdapter.kt @@ -31,7 +31,6 @@ class UrlAdapter( ) } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: UrlViewHolder, position: Int) { val binding = holder.binding val url = urls[position] diff --git a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt index 7ce2f136..bd2536d1 100644 --- a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt @@ -33,7 +33,6 @@ class ListActivity : AppCompatActivity() { private val scope = lifecycleScope private var selectedTabIdx = 0 - @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -83,8 +82,8 @@ class ListActivity : AppCompatActivity() { setContentView(binding.root) val anime = intent.getBooleanExtra("anime", true) - binding.listTitle.text = - intent.getStringExtra("username") + "'s " + (if (anime) "Anime" else "Manga") + " List" + binding.listTitle.text = getString(R.string.user_list, intent.getStringExtra("username"), + if (anime) getString(R.string.anime) else getString(R.string.manga)) binding.listTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { this@ListActivity.selectedTabIdx = tab?.position ?: 0 diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index be0a0a70..5dac823a 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -49,7 +49,6 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene private var selected: Int = 0 private lateinit var navBar: AnimatedBottomBar - @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ThemeManager(this).applyTheme() @@ -113,20 +112,30 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene val userLevel = intent.getStringExtra("userLVL") ?: "" binding.followButton.visibility = if (user.id == Anilist.userid || Anilist.userid == null) View.GONE else View.VISIBLE - binding.followButton.text = - if (user.isFollowing) "Unfollow" else if (user.isFollower) "Follows you" else "Follow" - if (user.isFollowing && user.isFollower) binding.followButton.text = "Mutual" + binding.followButton.text = getString( + when { + user.isFollowing -> R.string.unfollow + user.isFollower -> R.string.follows_you + else -> R.string.follow + } + ) + if (user.isFollowing && user.isFollower) binding.followButton.text = getString(R.string.mutual) binding.followButton.setOnClickListener { lifecycleScope.launch(Dispatchers.IO) { val res = Anilist.query.toggleFollow(user.id) if (res?.data?.toggleFollow != null) { withContext(Dispatchers.Main) { - snackString("Success") + snackString(R.string.success) user.isFollowing = res.data.toggleFollow.isFollowing - binding.followButton.text = - if (user.isFollowing) "Unfollow" else if (user.isFollower) "Follows you" else "Follow" - if (user.isFollowing && user.isFollower) binding.followButton.text = - "Mutual" + binding.followButton.text = getString( + when { + user.isFollowing -> R.string.unfollow + user.isFollower -> R.string.follows_you + else -> R.string.follow + } + ) + if (user.isFollowing && user.isFollower) + binding.followButton.text = getString(R.string.mutual) } } } @@ -180,7 +189,8 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene ) } - binding.profileUserName.text = "${user.name} $userLevel" + val userLevelText = "${user.name} $userLevel" + binding.profileUserName.text = userLevelText if (!(PrefManager.getVal(PrefName.BannerAnimations) as Boolean)) binding.profileBannerImage.pause() blurImage(binding.profileBannerImage, user.bannerImage ?: user.avatar?.medium) binding.profileBannerImage.updateLayoutParams { height += statusBarHeight } @@ -204,7 +214,7 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene ContextCompat.startActivity( this@ProfileActivity, Intent(this@ProfileActivity, FollowActivity::class.java) - .putExtra("title", "Followers") + .putExtra("title", getString(R.string.followers)) .putExtra("userId", user.id), null ) diff --git a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt index 26dc5a7b..0f9ed865 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt @@ -39,7 +39,6 @@ class ActivityItem( private lateinit var binding: ItemActivityBinding private lateinit var repliesAdapter: GroupieAdapter - @SuppressLint("SetTextI18n") override fun bind(viewBinding: ItemActivityBinding, position: Int) { binding = viewBinding setAnimation(binding.root.context, binding.root) @@ -73,13 +72,13 @@ class ActivityItem( } ?: emptyList() repliesAdapter.addAll(replyItems) binding.activityReplies.visibility = View.VISIBLE - binding.commentTotalReplies.text = "Hide replies" + binding.commentTotalReplies.setText(R.string.hide_replies) } else -> { repliesAdapter.clear() binding.activityReplies.visibility = View.GONE - binding.commentTotalReplies.text = "View replies" + binding.commentTotalReplies.setText(R.string.view_replies) } } @@ -127,7 +126,9 @@ class ActivityItem( binding.activityContent.visibility = View.GONE binding.activityBannerContainer.visibility = View.VISIBLE binding.activityMediaName.text = activity.media?.title?.userPreferred - binding.activityText.text = "${activity.user!!.name} ${activity.status} ${activity.progress ?: activity.media?.title?.userPreferred}" + val activityText = "${activity.user!!.name} ${activity.status} ${activity.progress + ?: activity.media?.title?.userPreferred}" + binding.activityText.text = activityText binding.activityCover.loadImage(cover) blurImage(binding.activityBannerImage, banner ?: cover) binding.activityAvatarContainer.setOnClickListener { diff --git a/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt b/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt index 9b68f377..c8f5141c 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt @@ -11,6 +11,7 @@ import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import ani.dantotsu.R import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.api.Notification import ani.dantotsu.databinding.ActivityFollowBinding @@ -37,14 +38,14 @@ class NotificationActivity : AppCompatActivity() { private var currentPage: Int = 1 private var hasNextPage: Boolean = true - @SuppressLint("SetTextI18n", "ClickableViewAccessibility") + @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ThemeManager(this).applyTheme() initActivity(this) binding = ActivityFollowBinding.inflate(layoutInflater) setContentView(binding.root) - binding.listTitle.text = "Notifications" + binding.listTitle.text = getString(R.string.notifications) binding.listToolbar.updateLayoutParams { topMargin = statusBarHeight } diff --git a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt index a97a644d..6c10242d 100644 --- a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt @@ -29,7 +29,6 @@ import com.google.android.material.tabs.TabLayoutMediator class ExtensionsActivity : AppCompatActivity() { lateinit var binding: ActivityExtensionsBinding - @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt index 028c4b21..0149b8ba 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt @@ -294,13 +294,13 @@ class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler { return ViewHolder(view) } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: ViewHolder, position: Int) { val extension = getItem(position) val nsfw = if (extension.isNsfw) "(18+)" else "" val lang = LanguageMapper.mapLanguageCodeToName(extension.lang) holder.extensionNameTextView.text = extension.name - holder.extensionVersionTextView.text = "$lang ${extension.versionName} $nsfw" + val versionText = "$lang ${extension.versionName} $nsfw" + holder.extensionVersionTextView.text = versionText if (!skipIcons) { holder.extensionIconImageView.setImageDrawable(extension.icon) } diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt index 62a4aca5..12ee40be 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt @@ -290,13 +290,14 @@ class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler { MangaSources.performReorderMangaSources() } - @SuppressLint("SetTextI18n", "ClickableViewAccessibility") + @SuppressLint("ClickableViewAccessibility") override fun onBindViewHolder(holder: ViewHolder, position: Int) { val extension = getItem(position) // Use getItem() from ListAdapter val nsfw = if (extension.isNsfw) "(18+)" else "" val lang = LanguageMapper.mapLanguageCodeToName(extension.lang) holder.extensionNameTextView.text = extension.name - holder.extensionVersionTextView.text = "$lang ${extension.versionName} $nsfw" + val versionText = "$lang ${extension.versionName} $nsfw" + holder.extensionVersionTextView.text = versionText if (!skipIcons) { holder.extensionIconImageView.setImageDrawable(extension.icon) } diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt index 5c46a5c9..05314985 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt @@ -221,13 +221,13 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler { return ViewHolder(view) } - @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: ViewHolder, position: Int) { val extension = getItem(position) // Use getItem() from ListAdapter val nsfw = "" val lang = LanguageMapper.mapLanguageCodeToName("all") holder.extensionNameTextView.text = extension.name - holder.extensionVersionTextView.text = "$lang ${extension.versionName} $nsfw" + val versionText = "$lang ${extension.versionName} $nsfw" + holder.extensionVersionTextView.text = versionText if (!skipIcons) { holder.extensionIconImageView.setImageDrawable(extension.icon) } diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index 721188a5..3897835b 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -340,9 +340,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene bindingAnime.purgeAnimeDownloads.setOnClickListener { val dialog = AlertDialog.Builder(this, R.style.MyPopup) - .setTitle("Purge Anime Downloads") - .setMessage("Are you sure you want to purge all anime downloads?") - .setPositiveButton("Yes") { dialog, _ -> + .setTitle(R.string.purge_anime_downloads) + .setMessage(getString(R.string.purge_confirm, getString(R.string.anime))) + .setPositiveButton(R.string.yes) { dialog, _ -> val downloadsManager = Injekt.get() downloadsManager.purgeDownloads(DownloadedType.Type.ANIME) DownloadService.sendRemoveAllDownloads( @@ -362,9 +362,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene bindingManga.purgeMangaDownloads.setOnClickListener { val dialog = AlertDialog.Builder(this, R.style.MyPopup) - .setTitle("Purge Manga Downloads") - .setMessage("Are you sure you want to purge all manga downloads?") - .setPositiveButton("Yes") { dialog, _ -> + .setTitle(R.string.purge_manga_downloads) + .setMessage(getString(R.string.purge_confirm, getString(R.string.manga))) + .setPositiveButton(R.string.yes) { dialog, _ -> val downloadsManager = Injekt.get() downloadsManager.purgeDownloads(DownloadedType.Type.MANGA) dialog.dismiss() @@ -379,9 +379,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene bindingManga.purgeNovelDownloads.setOnClickListener { val dialog = AlertDialog.Builder(this, R.style.MyPopup) - .setTitle("Purge Novel Downloads") - .setMessage("Are you sure you want to purge all novel downloads?") - .setPositiveButton("Yes") { dialog, _ -> + .setTitle(R.string.purge_novel_downloads) + .setMessage(getString(R.string.purge_confirm, getString(R.string.novels))) + .setPositiveButton(R.string.yes) { dialog, _ -> val downloadsManager = Injekt.get() downloadsManager.purgeDownloads(DownloadedType.Type.NOVEL) dialog.dismiss() diff --git a/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt b/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt index 53fe43cb..1d7d5f92 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt @@ -202,12 +202,12 @@ class AnimeExtensionAdapter(private val clickListener: OnAnimeInstallClickListen val extensionIconImageView: ImageView = binding.extensionIconImageView - @SuppressLint("SetTextI18n") fun bind(extension: AnimeExtension.Available) { val nsfw = if (extension.isNsfw) "(18+)" else "" val lang = LanguageMapper.mapLanguageCodeToName(extension.lang) binding.extensionNameTextView.text = extension.name - binding.extensionVersionTextView.text = "$lang ${extension.versionName} $nsfw" + val versionText = "$lang ${extension.versionName} $nsfw" + binding.extensionVersionTextView.text = versionText } fun clear() { diff --git a/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt b/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt index 140eb549..1227d667 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt @@ -199,12 +199,12 @@ class MangaExtensionAdapter(private val clickListener: OnMangaInstallClickListen val extensionIconImageView: ImageView = binding.extensionIconImageView - @SuppressLint("SetTextI18n") fun bind(extension: MangaExtension.Available) { val nsfw = if (extension.isNsfw) "(18+)" else "" val lang = LanguageMapper.mapLanguageCodeToName(extension.lang) binding.extensionNameTextView.text = extension.name - binding.extensionVersionTextView.text = "$lang ${extension.versionName} $nsfw" + val versionText = "$lang ${extension.versionName} $nsfw" + binding.extensionVersionTextView.text = versionText } fun clear() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9b0ec0f3..b3718b8e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,6 +17,7 @@ Browse Anime Manga Browse Manga + Novels Info Watch Read @@ -71,6 +72,9 @@ All + No more notifications + Followers + STATUS PLANNING @@ -111,6 +115,9 @@ Format Status Total Episodes + Episode(s) + Chapter(s) + | %1$s Total Chapters Average Duration " min" @@ -392,7 +399,6 @@ Amount of time for Dantotsu to periodically check for new Episodes/Chapters\n(Less time will cause more battery consumption) Don\'t Update Loading Next Chapter - Grid Sort by Release Date Crop Borders NOTE @@ -490,14 +496,16 @@ Read on Dantotsu Watch on Dantotsu View Profile in Dantotsu - "Continue : Episode " - "Continue : " + Continue : Episode %1$s%2$s\n%3$s + - Filler + Continue : %1$s\n%2$s "Episode " "Episode %1$s" "Chapter " "Chapter %1$s" - just got released! Checking Subscriptions + %1$s\'s %2$s List Speed Auto Update progress for %1$s? @@ -657,7 +665,7 @@ This is an app widget description Airing Image animeDownloads - Delete all anime downloads + Delete all Anime downloads Delete all Manga Downloads Delete all Novel Downloads Requires Android 12+ @@ -690,6 +698,10 @@ Manga Mean Score About me Follow + Unfollow + Follows you + Mutual + Success 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! @@ -710,4 +722,36 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc Anilist notifications update frequency : %1$s Comment notifications update frequency : %1$s Activities + + Are you sure you want to purge all %1$s downloads? + + Failed to delete because of… %1$s + + Hide replies + View reply + View replies + View %1$d replies + Replying to %1$s + + Delete Comment + Are you sure you want to delete this comment? + Comment Deleted + + Ban User + Are you sure you want to ban this user? + User Banned + + Report Comment + Only report comments that violate the rules. Are you sure you want to report this comment? + Comment Reported + + List + Grid + Compact + + WebView not installed + + Quality: %1$dp + Unknown Size + %1$s MB diff --git a/lint.xml b/lint.xml index 652f2203..bc62ec86 100644 --- a/lint.xml +++ b/lint.xml @@ -2,4 +2,6 @@ + + \ No newline at end of file