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)
This commit is contained in:
Cuong-Tran 2025-12-09 14:55:49 +07:00 committed by GitHub
parent b648afb889
commit 6b15d76be6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 82 additions and 381 deletions

View file

@ -10,7 +10,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember 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.unit.dp
import androidx.compose.ui.util.fastAny import androidx.compose.ui.util.fastAny
import androidx.paging.LoadState import androidx.paging.LoadState
@ -116,11 +116,10 @@ internal fun BrowseSourceComfortableGridItem(
coverBadgeEnd = { coverBadgeEnd = {
if (metadata is MangaDexSearchMetadata) { if (metadata is MangaDexSearchMetadata) {
metadata.followStatus?.let { followStatus -> metadata.followStatus?.let { followStatus ->
val text = LocalContext.current val text = LocalResources.current
.resources .let { resources ->
.let { remember(resources, followStatus) {
remember { resources.getStringArray(R.array.md_follows_options)
it.getStringArray(R.array.md_follows_options)
.getOrNull(followStatus) .getOrNull(followStatus)
} }
} }

View file

@ -10,7 +10,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember 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.unit.dp
import androidx.compose.ui.util.fastAny import androidx.compose.ui.util.fastAny
import androidx.paging.LoadState import androidx.paging.LoadState
@ -111,11 +111,10 @@ internal fun BrowseSourceCompactGridItem(
coverBadgeEnd = { coverBadgeEnd = {
if (metadata is MangaDexSearchMetadata) { if (metadata is MangaDexSearchMetadata) {
metadata.followStatus?.let { followStatus -> metadata.followStatus?.let { followStatus ->
val text = LocalContext.current val text = LocalResources.current
.resources .let { resources ->
.let { remember(resources, followStatus) {
remember { resources.getStringArray(R.array.md_follows_options)
it.getStringArray(R.array.md_follows_options)
.getOrNull(followStatus) .getOrNull(followStatus)
} }
} }

View file

@ -7,7 +7,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember 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.unit.dp
import androidx.compose.ui.util.fastAny import androidx.compose.ui.util.fastAny
import androidx.paging.LoadState import androidx.paging.LoadState
@ -102,11 +102,10 @@ internal fun BrowseSourceListItem(
// SY --> // SY -->
if (metadata is MangaDexSearchMetadata) { if (metadata is MangaDexSearchMetadata) {
metadata.followStatus?.let { followStatus -> metadata.followStatus?.let { followStatus ->
val text = LocalContext.current val text = LocalResources.current
.resources .let { resources ->
.let { remember(resources, followStatus) {
remember { resources.getStringArray(R.array.md_follows_options)
it.getStringArray(R.array.md_follows_options)
.getOrNull(followStatus) .getOrNull(followStatus)
} }
} }

View file

@ -38,6 +38,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import androidx.core.graphics.drawable.toDrawable
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import coil3.asDrawable import coil3.asDrawable
import coil3.imageLoader import coil3.imageLoader
@ -211,12 +212,9 @@ fun MangaCoverDialog(
// Copy bitmap in case it came from memory cache // Copy bitmap in case it came from memory cache
// Because SSIV needs to thoroughly read the image // Because SSIV needs to thoroughly read the image
val copy = (drawable as? BitmapDrawable)?.let { val copy = (drawable as? BitmapDrawable)?.bitmap?.copy(Bitmap.Config.HARDWARE, false)
BitmapDrawable( ?.toDrawable(view.context.resources)
view.context.resources, ?: drawable
it.bitmap.copy(Bitmap.Config.HARDWARE, false),
)
} ?: drawable
view.setImage(copy, ReaderPageImageView.Config(zoomDuration = 500)) view.setImage(copy, ReaderPageImageView.Config(zoomDuration = 500))
} }
.build() .build()

View file

@ -23,6 +23,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.runtime.toMutableStateList import androidx.compose.runtime.toMutableStateList
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalResources
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -103,6 +104,7 @@ import uy.kohesive.injekt.api.get
import java.io.File import java.io.File
object SettingsAdvancedScreen : SearchableSettings { object SettingsAdvancedScreen : SearchableSettings {
@Suppress("unused")
private fun readResolve(): Any = SettingsAdvancedScreen private fun readResolve(): Any = SettingsAdvancedScreen
@ReadOnlyComposable @ReadOnlyComposable
@ -210,7 +212,7 @@ object SettingsAdvancedScreen : SearchableSettings {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
} }
context.startActivity(intent) context.startActivity(intent)
} catch (e: ActivityNotFoundException) { } catch (_: ActivityNotFoundException) {
context.toast(MR.strings.battery_optimization_setting_activity_not_found) context.toast(MR.strings.battery_optimization_setting_activity_not_found)
} }
} else { } else {
@ -527,8 +529,8 @@ object SettingsAdvancedScreen : SearchableSettings {
onDismissRequest: () -> Unit, onDismissRequest: () -> Unit,
onCleanupDownloads: (removeRead: Boolean, removeNonFavorite: Boolean) -> Unit, onCleanupDownloads: (removeRead: Boolean, removeNonFavorite: Boolean) -> Unit,
) { ) {
val context = LocalContext.current val resources = LocalResources.current
val options = remember { context.resources.getStringArray(R.array.clean_up_downloads).toList() } val options = remember(resources) { resources.getStringArray(R.array.clean_up_downloads).toList() }
val selection = remember { val selection = remember {
options.toMutableStateList() options.toMutableStateList()
} }

View file

@ -26,6 +26,7 @@ import androidx.compose.runtime.toMutableStateList
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalResources
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.domain.track.service.TrackPreferences
@ -55,6 +56,7 @@ import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
object SettingsMangadexScreen : SearchableSettings { object SettingsMangadexScreen : SearchableSettings {
@Suppress("unused")
private fun readResolve(): Any = SettingsMangadexScreen private fun readResolve(): Any = SettingsMangadexScreen
@ReadOnlyComposable @ReadOnlyComposable
@ -193,9 +195,9 @@ object SettingsMangadexScreen : SearchableSettings {
onDismissRequest: () -> Unit, onDismissRequest: () -> Unit,
onSelectionConfirmed: (List<String>) -> Unit, onSelectionConfirmed: (List<String>) -> Unit,
) { ) {
val context = LocalContext.current val resources = LocalResources.current
val items = remember { val items = remember(resources) {
context.resources.getStringArray(R.array.md_follows_options) resources.getStringArray(R.array.md_follows_options)
.drop(1) .drop(1)
} }
val selection = remember { val selection = remember {

View file

@ -1,12 +1,12 @@
package exh.util package exh.util
import android.graphics.Color
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.FlowRow
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.core.graphics.toColorInt
import exh.metadata.metadata.base.RaisedTag import exh.metadata.metadata.base.RaisedTag
import exh.source.EH_SOURCE_ID import exh.source.EH_SOURCE_ID
import exh.source.EXH_SOURCE_ID import exh.source.EXH_SOURCE_ID
@ -108,40 +108,40 @@ object SourceTagsUtil {
MISC_COLOR("#f36594"), MISC_COLOR("#f36594"),
; ;
constructor(color: String) : this(Color.parseColor(color)) constructor(color: String) : this(color.toColorInt())
} }
@ColorInt fun genreTextColor(genre: GenreColor): Int { @ColorInt fun genreTextColor(genre: GenreColor): Int {
return when (genre) { return when (genre) {
GenreColor.DOUJINSHI_COLOR -> Color.parseColor("#000000") GenreColor.DOUJINSHI_COLOR -> "#000000".toColorInt()
GenreColor.MANGA_COLOR -> Color.parseColor("#000000") GenreColor.MANGA_COLOR -> "#000000".toColorInt()
GenreColor.ARTIST_CG_COLOR -> Color.parseColor("#000000") GenreColor.ARTIST_CG_COLOR -> "#000000".toColorInt()
GenreColor.GAME_CG_COLOR -> Color.parseColor("#000000") GenreColor.GAME_CG_COLOR -> "#000000".toColorInt()
GenreColor.WESTERN_COLOR -> Color.parseColor("#000000") GenreColor.WESTERN_COLOR -> "#000000".toColorInt()
GenreColor.NON_H_COLOR -> Color.parseColor("#000000") GenreColor.NON_H_COLOR -> "#000000".toColorInt()
GenreColor.IMAGE_SET_COLOR -> Color.parseColor("#FFFFFF") GenreColor.IMAGE_SET_COLOR -> "#FFFFFF".toColorInt()
GenreColor.COSPLAY_COLOR -> Color.parseColor("#FFFFFF") GenreColor.COSPLAY_COLOR -> "#FFFFFF".toColorInt()
GenreColor.ASIAN_PORN_COLOR -> Color.parseColor("#000000") GenreColor.ASIAN_PORN_COLOR -> "#000000".toColorInt()
GenreColor.MISC_COLOR -> Color.parseColor("#000000") GenreColor.MISC_COLOR -> "#000000".toColorInt()
} }
} }
fun getLocaleSourceUtil(language: String?) = when (language) { fun getLocaleSourceUtil(language: String?) = when (language) {
"english", "eng" -> Locale("en") "english", "eng" -> Locale.forLanguageTag("en")
"japanese" -> Locale("ja") "japanese" -> Locale.forLanguageTag("ja")
"chinese" -> Locale("zh") "chinese" -> Locale.forLanguageTag("zh")
"spanish" -> Locale("es") "spanish" -> Locale.forLanguageTag("es")
"korean" -> Locale("ko") "korean" -> Locale.forLanguageTag("ko")
"russian" -> Locale("ru") "russian" -> Locale.forLanguageTag("ru")
"french" -> Locale("fr") "french" -> Locale.forLanguageTag("fr")
"portuguese" -> Locale("pt") "portuguese" -> Locale.forLanguageTag("pt")
"thai" -> Locale("th") "thai" -> Locale.forLanguageTag("th")
"german" -> Locale("de") "german" -> Locale.forLanguageTag("de")
"italian" -> Locale("it") "italian" -> Locale.forLanguageTag("it")
"vietnamese" -> Locale("vi") "vietnamese" -> Locale.forLanguageTag("vi")
"polish" -> Locale("pl") "polish" -> Locale.forLanguageTag("pl")
"hungarian" -> Locale("hu") "hungarian" -> Locale.forLanguageTag("hu")
"dutch" -> Locale("nl") "dutch" -> Locale.forLanguageTag("nl")
else -> null else -> null
} }
@ -154,21 +154,21 @@ object SourceTagsUtil {
@Composable @Composable
private fun LanguageFlagPreview() { private fun LanguageFlagPreview() {
val locales = listOf( val locales = listOf(
Locale("en"), Locale.forLanguageTag("en"),
Locale("ja"), Locale.forLanguageTag("ja"),
Locale("zh"), Locale.forLanguageTag("zh"),
Locale("es"), Locale.forLanguageTag("es"),
Locale("ko"), Locale.forLanguageTag("ko"),
Locale("ru"), Locale.forLanguageTag("ru"),
Locale("fr"), Locale.forLanguageTag("fr"),
Locale("pt"), Locale.forLanguageTag("pt"),
Locale("th"), Locale.forLanguageTag("th"),
Locale("de"), Locale.forLanguageTag("de"),
Locale("it"), Locale.forLanguageTag("it"),
Locale("vi"), Locale.forLanguageTag("vi"),
Locale("pl"), Locale.forLanguageTag("pl"),
Locale("hu"), Locale.forLanguageTag("hu"),
Locale("nl"), Locale.forLanguageTag("nl"),
) )
Column { Column {
FlowRow { FlowRow {

View file

@ -10,7 +10,6 @@ import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
import android.graphics.Matrix import android.graphics.Matrix
import android.graphics.Rect import android.graphics.Rect
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
import android.os.Build import android.os.Build
@ -19,6 +18,7 @@ import androidx.core.graphics.alpha
import androidx.core.graphics.applyCanvas import androidx.core.graphics.applyCanvas
import androidx.core.graphics.blue import androidx.core.graphics.blue
import androidx.core.graphics.createBitmap import androidx.core.graphics.createBitmap
import androidx.core.graphics.drawable.toDrawable
import androidx.core.graphics.get import androidx.core.graphics.get
import androidx.core.graphics.green import androidx.core.graphics.green
import androidx.core.graphics.red import androidx.core.graphics.red
@ -66,7 +66,7 @@ object ImageUtil {
Format.Webp -> ImageType.WEBP Format.Webp -> ImageType.WEBP
else -> null else -> null
} }
} catch (e: Exception) { } catch (_: Exception) {
null null
} }
} }
@ -88,7 +88,7 @@ object ImageUtil {
Format.Heif -> type.isAnimated && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R Format.Heif -> type.isAnimated && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
else -> false else -> false
} }
} catch (e: Exception) { } catch (_: Exception) {
false false
} }
} }
@ -386,9 +386,9 @@ object ImageUtil {
decoder?.recycle() decoder?.recycle()
val whiteColor = Color.WHITE val whiteColor = Color.WHITE
if (image == null) return ColorDrawable(whiteColor) if (image == null) return whiteColor.toDrawable()
if (image.width < 50 || image.height < 50) { if (image.width < 50 || image.height < 50) {
return ColorDrawable(whiteColor) return whiteColor.toDrawable()
} }
val top = 5 val top = 5
@ -429,7 +429,7 @@ object ImageUtil {
!color.isWhite() && color.isCloseTo(other) !color.isWhite() && color.isCloseTo(other)
} }
if (isNotWhiteAndCloseTo.all { it }) { if (isNotWhiteAndCloseTo.all { it }) {
return ColorDrawable(topLeftPixel) return topLeftPixel.toDrawable()
} }
val cornerPixels = listOf(topLeftPixel, topRightPixel, botLeftPixel, botRightPixel) val cornerPixels = listOf(topLeftPixel, topRightPixel, botLeftPixel, botRightPixel)
@ -544,8 +544,8 @@ object ImageUtil {
val isLandscape = context.resources.configuration?.orientation == Configuration.ORIENTATION_LANDSCAPE val isLandscape = context.resources.configuration?.orientation == Configuration.ORIENTATION_LANDSCAPE
if (isLandscape) { if (isLandscape) {
return when { return when {
darkBG -> ColorDrawable(blackColor) darkBG -> blackColor.toDrawable()
else -> ColorDrawable(whiteColor) else -> whiteColor.toDrawable()
} }
} }
@ -566,7 +566,7 @@ object ImageUtil {
intArrayOf(whiteColor, whiteColor, blackColor, blackColor) intArrayOf(whiteColor, whiteColor, blackColor, blackColor)
} }
darkBG -> { darkBG -> {
return ColorDrawable(blackColor) return blackColor.toDrawable()
} }
topIsBlackStreak || topIsBlackStreak ||
( (
@ -585,7 +585,7 @@ object ImageUtil {
intArrayOf(whiteColor, whiteColor, blackColor, blackColor) intArrayOf(whiteColor, whiteColor, blackColor, blackColor)
} }
else -> { else -> {
return ColorDrawable(whiteColor) return whiteColor.toDrawable()
} }
} }
@ -772,7 +772,7 @@ object ImageUtil {
val maxHeight = max(height, height2) 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) val canvas = Canvas(result)
canvas.drawColor(background) canvas.drawColor(background)
val upperPart = Rect( val upperPart = Rect(

View file

@ -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<String> {
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",
)
}
}