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.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)
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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