diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 5ac7669d74..410e98afe5 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -234,7 +234,7 @@ dependencies { implementation("com.google.android.material:material:1.13.0") implementation("androidx.preference:preference-ktx:1.2.1") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.10.0") - implementation("io.coil-kt:coil:2.7.0") + implementation("io.coil-kt.coil3:coil:3.1.0") implementation("androidx.core:core-splashscreen:1.2.0") implementation("androidx.window:window:1.5.1") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.2.0") diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt index d05020560a..63a8c58468 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt @@ -12,15 +12,21 @@ import androidx.core.graphics.drawable.IconCompat import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toDrawable import androidx.lifecycle.LifecycleOwner -import coil.ImageLoader -import coil.decode.DataSource -import coil.fetch.DrawableResult -import coil.fetch.FetchResult -import coil.fetch.Fetcher -import coil.key.Keyer -import coil.memory.MemoryCache -import coil.request.ImageRequest -import coil.request.Options +import coil3.ImageLoader +import coil3.asImage +import coil3.decode.DataSource +import coil3.fetch.FetchResult +import coil3.fetch.Fetcher +import coil3.fetch.ImageFetchResult +import coil3.key.Keyer +import coil3.memory.MemoryCache +import coil3.request.ImageRequest +import coil3.request.Options +import coil3.request.SuccessResult +import coil3.request.error +import coil3.request.lifecycle +import coil3.request.target +import coil3.toBitmap import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.YuzuApplication import org.yuzu.yuzu_emu.model.Game @@ -30,8 +36,11 @@ class GameIconFetcher( private val options: Options ) : Fetcher { override suspend fun fetch(): FetchResult { - return DrawableResult( - drawable = decodeGameIcon(game.path)!!.toDrawable(options.context.resources), + val bitmap = decodeGameIcon(game.path)!! + val image = bitmap.asImage() + + return ImageFetchResult( + image = image, isSampled = false, dataSource = DataSource.DISK ) @@ -64,8 +73,8 @@ object GameIconUtils { add(GameIconFetcher.Factory()) } .memoryCache { - MemoryCache.Builder(YuzuApplication.appContext) - .maxSizePercent(0.25) + MemoryCache.Builder() + .maxSizePercent(YuzuApplication.appContext, 0.25) .build() } .build() @@ -85,8 +94,19 @@ object GameIconUtils { .lifecycle(lifecycleOwner) .error(R.drawable.default_icon) .build() - return imageLoader.execute(request) - .drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888) + + val result = imageLoader.execute(request) + + return if (result is SuccessResult) { + result.image.toBitmap() + } else { + val default = ResourcesCompat.getDrawable( + YuzuApplication.appContext.resources, + R.drawable.default_icon, + null + ) + default!!.toBitmap() + } } suspend fun getShortcutIcon(lifecycleOwner: LifecycleOwner, game: Game): IconCompat { @@ -95,9 +115,12 @@ object GameIconUtils { R.drawable.shortcut, null ) as LayerDrawable + + val iconBitmap = getGameIcon(lifecycleOwner, game) + layerDrawable.setDrawableByLayerId( R.id.shortcut_foreground, - getGameIcon(lifecycleOwner, game).toDrawable(YuzuApplication.appContext.resources) + iconBitmap.toDrawable(YuzuApplication.appContext.resources) ) val inset = YuzuApplication.appContext.resources .getDimensionPixelSize(R.dimen.icon_inset)