From 6b15d76be6ab5fbf75dd9e0886ec7c8341d40767 Mon Sep 17 00:00:00 2001 From: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:55:49 +0700 Subject: [PATCH] chore: Replace deprecated usages with Locale, LocalResources, Bitmap and toColorInt (#1316) * Replace deprecated usages with Locale, LocalResources, Bitmap and toColorInt; remove FlagKit class * remember(resources) --- .../components/BrowseSourceComfortableGrid.kt | 11 +- .../components/BrowseSourceCompactGrid.kt | 11 +- .../browse/components/BrowseSourceList.kt | 11 +- .../manga/components/MangaCoverDialog.kt | 10 +- .../settings/screen/SettingsAdvancedScreen.kt | 8 +- .../settings/screen/SettingsMangadexScreen.kt | 8 +- app/src/main/java/exh/util/SourceTagsUtil.kt | 84 ++--- .../core/common/util/system/ImageUtil.kt | 22 +- .../java/com/murgupluoglu/flagkit/FlagKit.kt | 298 ------------------ 9 files changed, 82 insertions(+), 381 deletions(-) delete mode 100644 flagkit/src/main/java/com/murgupluoglu/flagkit/FlagKit.kt diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt index 545a98d59..88d5f9463 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt @@ -10,7 +10,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastAny import androidx.paging.LoadState @@ -116,11 +116,10 @@ internal fun BrowseSourceComfortableGridItem( coverBadgeEnd = { if (metadata is MangaDexSearchMetadata) { metadata.followStatus?.let { followStatus -> - val text = LocalContext.current - .resources - .let { - remember { - it.getStringArray(R.array.md_follows_options) + val text = LocalResources.current + .let { resources -> + remember(resources, followStatus) { + resources.getStringArray(R.array.md_follows_options) .getOrNull(followStatus) } } diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt index bc675dd3f..635889369 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt @@ -10,7 +10,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastAny import androidx.paging.LoadState @@ -111,11 +111,10 @@ internal fun BrowseSourceCompactGridItem( coverBadgeEnd = { if (metadata is MangaDexSearchMetadata) { metadata.followStatus?.let { followStatus -> - val text = LocalContext.current - .resources - .let { - remember { - it.getStringArray(R.array.md_follows_options) + val text = LocalResources.current + .let { resources -> + remember(resources, followStatus) { + resources.getStringArray(R.array.md_follows_options) .getOrNull(followStatus) } } diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt index f518eaa1a..94f9a3a45 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt @@ -7,7 +7,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastAny import androidx.paging.LoadState @@ -102,11 +102,10 @@ internal fun BrowseSourceListItem( // SY --> if (metadata is MangaDexSearchMetadata) { metadata.followStatus?.let { followStatus -> - val text = LocalContext.current - .resources - .let { - remember { - it.getStringArray(R.array.md_follows_options) + val text = LocalResources.current + .let { resources -> + remember(resources, followStatus) { + resources.getStringArray(R.array.md_follows_options) .getOrNull(followStatus) } } diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaCoverDialog.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaCoverDialog.kt index 23ddfe600..c2daa01d5 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaCoverDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaCoverDialog.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties +import androidx.core.graphics.drawable.toDrawable import androidx.core.view.updatePadding import coil3.asDrawable import coil3.imageLoader @@ -211,12 +212,9 @@ fun MangaCoverDialog( // Copy bitmap in case it came from memory cache // Because SSIV needs to thoroughly read the image - val copy = (drawable as? BitmapDrawable)?.let { - BitmapDrawable( - view.context.resources, - it.bitmap.copy(Bitmap.Config.HARDWARE, false), - ) - } ?: drawable + val copy = (drawable as? BitmapDrawable)?.bitmap?.copy(Bitmap.Config.HARDWARE, false) + ?.toDrawable(view.context.resources) + ?: drawable view.setImage(copy, ReaderPageImageView.Config(zoomDuration = 500)) } .build() diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt index ab9c9dc26..4015f6cf4 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.window.DialogProperties import androidx.core.content.ContextCompat @@ -103,6 +104,7 @@ import uy.kohesive.injekt.api.get import java.io.File object SettingsAdvancedScreen : SearchableSettings { + @Suppress("unused") private fun readResolve(): Any = SettingsAdvancedScreen @ReadOnlyComposable @@ -210,7 +212,7 @@ object SettingsAdvancedScreen : SearchableSettings { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } context.startActivity(intent) - } catch (e: ActivityNotFoundException) { + } catch (_: ActivityNotFoundException) { context.toast(MR.strings.battery_optimization_setting_activity_not_found) } } else { @@ -527,8 +529,8 @@ object SettingsAdvancedScreen : SearchableSettings { onDismissRequest: () -> Unit, onCleanupDownloads: (removeRead: Boolean, removeNonFavorite: Boolean) -> Unit, ) { - val context = LocalContext.current - val options = remember { context.resources.getStringArray(R.array.clean_up_downloads).toList() } + val resources = LocalResources.current + val options = remember(resources) { resources.getStringArray(R.array.clean_up_downloads).toList() } val selection = remember { options.toMutableStateList() } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt index a31026338..73c9f392c 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt @@ -26,6 +26,7 @@ import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.unit.dp import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.track.service.TrackPreferences @@ -55,6 +56,7 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object SettingsMangadexScreen : SearchableSettings { + @Suppress("unused") private fun readResolve(): Any = SettingsMangadexScreen @ReadOnlyComposable @@ -193,9 +195,9 @@ object SettingsMangadexScreen : SearchableSettings { onDismissRequest: () -> Unit, onSelectionConfirmed: (List) -> Unit, ) { - val context = LocalContext.current - val items = remember { - context.resources.getStringArray(R.array.md_follows_options) + val resources = LocalResources.current + val items = remember(resources) { + resources.getStringArray(R.array.md_follows_options) .drop(1) } val selection = remember { diff --git a/app/src/main/java/exh/util/SourceTagsUtil.kt b/app/src/main/java/exh/util/SourceTagsUtil.kt index 446d0d459..826f177d7 100644 --- a/app/src/main/java/exh/util/SourceTagsUtil.kt +++ b/app/src/main/java/exh/util/SourceTagsUtil.kt @@ -1,12 +1,12 @@ package exh.util -import android.graphics.Color import androidx.annotation.ColorInt import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview +import androidx.core.graphics.toColorInt import exh.metadata.metadata.base.RaisedTag import exh.source.EH_SOURCE_ID import exh.source.EXH_SOURCE_ID @@ -108,40 +108,40 @@ object SourceTagsUtil { MISC_COLOR("#f36594"), ; - constructor(color: String) : this(Color.parseColor(color)) + constructor(color: String) : this(color.toColorInt()) } @ColorInt fun genreTextColor(genre: GenreColor): Int { return when (genre) { - GenreColor.DOUJINSHI_COLOR -> Color.parseColor("#000000") - GenreColor.MANGA_COLOR -> Color.parseColor("#000000") - GenreColor.ARTIST_CG_COLOR -> Color.parseColor("#000000") - GenreColor.GAME_CG_COLOR -> Color.parseColor("#000000") - GenreColor.WESTERN_COLOR -> Color.parseColor("#000000") - GenreColor.NON_H_COLOR -> Color.parseColor("#000000") - GenreColor.IMAGE_SET_COLOR -> Color.parseColor("#FFFFFF") - GenreColor.COSPLAY_COLOR -> Color.parseColor("#FFFFFF") - GenreColor.ASIAN_PORN_COLOR -> Color.parseColor("#000000") - GenreColor.MISC_COLOR -> Color.parseColor("#000000") + GenreColor.DOUJINSHI_COLOR -> "#000000".toColorInt() + GenreColor.MANGA_COLOR -> "#000000".toColorInt() + GenreColor.ARTIST_CG_COLOR -> "#000000".toColorInt() + GenreColor.GAME_CG_COLOR -> "#000000".toColorInt() + GenreColor.WESTERN_COLOR -> "#000000".toColorInt() + GenreColor.NON_H_COLOR -> "#000000".toColorInt() + GenreColor.IMAGE_SET_COLOR -> "#FFFFFF".toColorInt() + GenreColor.COSPLAY_COLOR -> "#FFFFFF".toColorInt() + GenreColor.ASIAN_PORN_COLOR -> "#000000".toColorInt() + GenreColor.MISC_COLOR -> "#000000".toColorInt() } } fun getLocaleSourceUtil(language: String?) = when (language) { - "english", "eng" -> Locale("en") - "japanese" -> Locale("ja") - "chinese" -> Locale("zh") - "spanish" -> Locale("es") - "korean" -> Locale("ko") - "russian" -> Locale("ru") - "french" -> Locale("fr") - "portuguese" -> Locale("pt") - "thai" -> Locale("th") - "german" -> Locale("de") - "italian" -> Locale("it") - "vietnamese" -> Locale("vi") - "polish" -> Locale("pl") - "hungarian" -> Locale("hu") - "dutch" -> Locale("nl") + "english", "eng" -> Locale.forLanguageTag("en") + "japanese" -> Locale.forLanguageTag("ja") + "chinese" -> Locale.forLanguageTag("zh") + "spanish" -> Locale.forLanguageTag("es") + "korean" -> Locale.forLanguageTag("ko") + "russian" -> Locale.forLanguageTag("ru") + "french" -> Locale.forLanguageTag("fr") + "portuguese" -> Locale.forLanguageTag("pt") + "thai" -> Locale.forLanguageTag("th") + "german" -> Locale.forLanguageTag("de") + "italian" -> Locale.forLanguageTag("it") + "vietnamese" -> Locale.forLanguageTag("vi") + "polish" -> Locale.forLanguageTag("pl") + "hungarian" -> Locale.forLanguageTag("hu") + "dutch" -> Locale.forLanguageTag("nl") else -> null } @@ -154,21 +154,21 @@ object SourceTagsUtil { @Composable private fun LanguageFlagPreview() { val locales = listOf( - Locale("en"), - Locale("ja"), - Locale("zh"), - Locale("es"), - Locale("ko"), - Locale("ru"), - Locale("fr"), - Locale("pt"), - Locale("th"), - Locale("de"), - Locale("it"), - Locale("vi"), - Locale("pl"), - Locale("hu"), - Locale("nl"), + Locale.forLanguageTag("en"), + Locale.forLanguageTag("ja"), + Locale.forLanguageTag("zh"), + Locale.forLanguageTag("es"), + Locale.forLanguageTag("ko"), + Locale.forLanguageTag("ru"), + Locale.forLanguageTag("fr"), + Locale.forLanguageTag("pt"), + Locale.forLanguageTag("th"), + Locale.forLanguageTag("de"), + Locale.forLanguageTag("it"), + Locale.forLanguageTag("vi"), + Locale.forLanguageTag("pl"), + Locale.forLanguageTag("hu"), + Locale.forLanguageTag("nl"), ) Column { FlowRow { diff --git a/core/common/src/main/kotlin/tachiyomi/core/common/util/system/ImageUtil.kt b/core/common/src/main/kotlin/tachiyomi/core/common/util/system/ImageUtil.kt index 97a0380f8..67df073a2 100644 --- a/core/common/src/main/kotlin/tachiyomi/core/common/util/system/ImageUtil.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/util/system/ImageUtil.kt @@ -10,7 +10,6 @@ import android.graphics.Canvas import android.graphics.Color import android.graphics.Matrix import android.graphics.Rect -import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.os.Build @@ -19,6 +18,7 @@ import androidx.core.graphics.alpha import androidx.core.graphics.applyCanvas import androidx.core.graphics.blue import androidx.core.graphics.createBitmap +import androidx.core.graphics.drawable.toDrawable import androidx.core.graphics.get import androidx.core.graphics.green import androidx.core.graphics.red @@ -66,7 +66,7 @@ object ImageUtil { Format.Webp -> ImageType.WEBP else -> null } - } catch (e: Exception) { + } catch (_: Exception) { null } } @@ -88,7 +88,7 @@ object ImageUtil { Format.Heif -> type.isAnimated && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R else -> false } - } catch (e: Exception) { + } catch (_: Exception) { false } } @@ -386,9 +386,9 @@ object ImageUtil { decoder?.recycle() val whiteColor = Color.WHITE - if (image == null) return ColorDrawable(whiteColor) + if (image == null) return whiteColor.toDrawable() if (image.width < 50 || image.height < 50) { - return ColorDrawable(whiteColor) + return whiteColor.toDrawable() } val top = 5 @@ -429,7 +429,7 @@ object ImageUtil { !color.isWhite() && color.isCloseTo(other) } if (isNotWhiteAndCloseTo.all { it }) { - return ColorDrawable(topLeftPixel) + return topLeftPixel.toDrawable() } val cornerPixels = listOf(topLeftPixel, topRightPixel, botLeftPixel, botRightPixel) @@ -544,8 +544,8 @@ object ImageUtil { val isLandscape = context.resources.configuration?.orientation == Configuration.ORIENTATION_LANDSCAPE if (isLandscape) { return when { - darkBG -> ColorDrawable(blackColor) - else -> ColorDrawable(whiteColor) + darkBG -> blackColor.toDrawable() + else -> whiteColor.toDrawable() } } @@ -566,7 +566,7 @@ object ImageUtil { intArrayOf(whiteColor, whiteColor, blackColor, blackColor) } darkBG -> { - return ColorDrawable(blackColor) + return blackColor.toDrawable() } topIsBlackStreak || ( @@ -585,7 +585,7 @@ object ImageUtil { intArrayOf(whiteColor, whiteColor, blackColor, blackColor) } else -> { - return ColorDrawable(whiteColor) + return whiteColor.toDrawable() } } @@ -772,7 +772,7 @@ object ImageUtil { val maxHeight = max(height, height2) - val result = Bitmap.createBitmap(width + width2 + centerMargin, max(height, height2), Bitmap.Config.ARGB_8888) + val result = createBitmap(width + width2 + centerMargin, max(height, height2)) val canvas = Canvas(result) canvas.drawColor(background) val upperPart = Rect( diff --git a/flagkit/src/main/java/com/murgupluoglu/flagkit/FlagKit.kt b/flagkit/src/main/java/com/murgupluoglu/flagkit/FlagKit.kt deleted file mode 100644 index ada4a379b..000000000 --- a/flagkit/src/main/java/com/murgupluoglu/flagkit/FlagKit.kt +++ /dev/null @@ -1,298 +0,0 @@ -package com.murgupluoglu.flagkit - -import android.content.Context -import android.content.res.Resources -import android.graphics.drawable.Drawable -import androidx.core.content.ContextCompat -import java.util.Locale - -/* -* Created by Mustafa Ürgüplüoğlu on 06.01.2021. -* Copyright © 2021 Mustafa Ürgüplüoğlu. All rights reserved. -*/ - -object FlagKit { - - fun getResId(context: Context, flagName: String): Int { - return context.resources.getIdentifier(fixResId(flagName), "drawable", context.packageName) - } - - fun getDrawable(context: Context, flagName: String): Drawable? { - val resourceId = - context.resources.getIdentifier(fixResId(flagName), "drawable", context.packageName) - return try { - ContextCompat.getDrawable(context, resourceId)!! - } catch (e: Resources.NotFoundException) { - null - } - } - - private fun fixResId(resId: String): String { - var resourceId = resId.lowercase(Locale.ENGLISH) - - // do is not a valid resource name (reserved Java keyword) - if (resourceId == "do") { - resourceId = "do_" - } - return resourceId - } - - fun getAllAvailableCodes(): List { - return listOf( - "ad", - "ae", - "af", - "ag", - "ai", - "al", - "am", - "ao", - "ar", - "as", - "at", - "au", - "aw", - "ax", - "az", - "ba", - "bb", - "bd", - "be", - "bf", - "bg", - "bh", - "bi", - "bj", - "bl", - "bm", - "bn", - "bo", - "br", - "bs", - "bt", - "bv", - "bw", - "by", - "bz", - "ca", - "cc", - "cd", - "cf", - "cg", - "ch", - "ci", - "ck", - "cl", - "cm", - "cn", - "co", - "cr", - "cu", - "cv", - "cw", - "cx", - "cy", - "cz", - "de", - "dj", - "dk", - "dm", - "do", - "dz", - "ec", - "ee", - "eg", - "er", - "es", - "et", - "eu", - "fi", - "fj", - "fk", - "fm", - "fo", - "fr", - "ga", - "gb", - "gb_eng", - "gb_nir", - "gb_sct", - "gb_wls", - "gb_zet", - "gd", - "ge", - "gf", - "gg", - "gh", - "gi", - "gl", - "gm", - "gn", - "gp", - "gq", - "gr", - "gs", - "gt", - "gu", - "gw", - "gy", - "hk", - "hm", - "hn", - "hr", - "ht", - "hu", - "id", - "ie", - "il", - "im", - "in", - "io", - "iq", - "ir", - "is", - "it", - "je", - "jm", - "jo", - "jp", - "ke", - "kg", - "kh", - "ki", - "km", - "kn", - "kp", - "kr", - "kw", - "ky", - "kz", - "la", - "lb", - "lc", - "li", - "lk", - "lr", - "ls", - "lt", - "lu", - "lv", - "ly", - "ma", - "mc", - "md", - "me", - "mf", - "mg", - "mh", - "mk", - "ml", - "mm", - "mn", - "mo", - "mp", - "mq", - "mr", - "ms", - "mt", - "mu", - "mv", - "mw", - "mx", - "my", - "mz", - "na", - "nc", - "ne", - "nf", - "ng", - "ni", - "nl", - "no", - "np", - "nr", - "nu", - "nz", - "om", - "pa", - "pe", - "pf", - "pg", - "ph", - "pk", - "pl", - "pm", - "pn", - "pr", - "ps", - "pt", - "pw", - "py", - "qa", - "re", - "ro", - "rs", - "ru", - "rw", - "sa", - "sb", - "sc", - "sd", - "se", - "sg", - "sh", - "si", - "sj", - "sk", - "sl", - "sm", - "sn", - "so", - "sr", - "ss", - "st", - "sv", - "sx", - "sy", - "sz", - "tc", - "td", - "tf", - "tg", - "th", - "tj", - "tk", - "tl", - "tm", - "tn", - "to", - "tr", - "tt", - "tv", - "tw", - "tz", - "ua", - "ug", - "um", - "us", - "us_ca", - "uy", - "uz", - "va", - "vc", - "ve", - "vg", - "vi", - "vn", - "vu", - "wf", - "ws", - "xk", - "ye", - "yt", - "za", - "zm", - "zw", - ) - } -}