summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt24
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt77
2 files changed, 79 insertions, 22 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
index e91277d35..13359ef36 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
@@ -3,8 +3,6 @@
3 3
4package org.yuzu.yuzu_emu.adapters 4package org.yuzu.yuzu_emu.adapters
5 5
6import android.graphics.Bitmap
7import android.graphics.BitmapFactory
8import android.net.Uri 6import android.net.Uri
9import android.text.TextUtils 7import android.text.TextUtils
10import android.view.LayoutInflater 8import android.view.LayoutInflater
@@ -15,23 +13,20 @@ import android.widget.Toast
15import androidx.appcompat.app.AppCompatActivity 13import androidx.appcompat.app.AppCompatActivity
16import androidx.documentfile.provider.DocumentFile 14import androidx.documentfile.provider.DocumentFile
17import androidx.lifecycle.ViewModelProvider 15import androidx.lifecycle.ViewModelProvider
18import androidx.lifecycle.lifecycleScope
19import androidx.navigation.findNavController 16import androidx.navigation.findNavController
20import androidx.preference.PreferenceManager 17import androidx.preference.PreferenceManager
21import androidx.recyclerview.widget.AsyncDifferConfig 18import androidx.recyclerview.widget.AsyncDifferConfig
22import androidx.recyclerview.widget.DiffUtil 19import androidx.recyclerview.widget.DiffUtil
23import androidx.recyclerview.widget.ListAdapter 20import androidx.recyclerview.widget.ListAdapter
24import androidx.recyclerview.widget.RecyclerView 21import androidx.recyclerview.widget.RecyclerView
25import coil.load
26import kotlinx.coroutines.launch
27import org.yuzu.yuzu_emu.HomeNavigationDirections 22import org.yuzu.yuzu_emu.HomeNavigationDirections
28import org.yuzu.yuzu_emu.NativeLibrary
29import org.yuzu.yuzu_emu.R 23import org.yuzu.yuzu_emu.R
30import org.yuzu.yuzu_emu.YuzuApplication 24import org.yuzu.yuzu_emu.YuzuApplication
31import org.yuzu.yuzu_emu.adapters.GameAdapter.GameViewHolder 25import org.yuzu.yuzu_emu.adapters.GameAdapter.GameViewHolder
32import org.yuzu.yuzu_emu.databinding.CardGameBinding 26import org.yuzu.yuzu_emu.databinding.CardGameBinding
33import org.yuzu.yuzu_emu.model.Game 27import org.yuzu.yuzu_emu.model.Game
34import org.yuzu.yuzu_emu.model.GamesViewModel 28import org.yuzu.yuzu_emu.model.GamesViewModel
29import org.yuzu.yuzu_emu.utils.GameIconUtils
35 30
36class GameAdapter(private val activity: AppCompatActivity) : 31class GameAdapter(private val activity: AppCompatActivity) :
37 ListAdapter<Game, GameViewHolder>(AsyncDifferConfig.Builder(DiffCallback()).build()), 32 ListAdapter<Game, GameViewHolder>(AsyncDifferConfig.Builder(DiffCallback()).build()),
@@ -98,12 +93,7 @@ class GameAdapter(private val activity: AppCompatActivity) :
98 this.game = game 93 this.game = game
99 94
100 binding.imageGameScreen.scaleType = ImageView.ScaleType.CENTER_CROP 95 binding.imageGameScreen.scaleType = ImageView.ScaleType.CENTER_CROP
101 activity.lifecycleScope.launch { 96 GameIconUtils.loadGameIcon(game, binding.imageGameScreen)
102 val bitmap = decodeGameIcon(game.path)
103 binding.imageGameScreen.load(bitmap) {
104 error(R.drawable.default_icon)
105 }
106 }
107 97
108 binding.textGameTitle.text = game.title.replace("[\\t\\n\\r]+".toRegex(), " ") 98 binding.textGameTitle.text = game.title.replace("[\\t\\n\\r]+".toRegex(), " ")
109 99
@@ -126,14 +116,4 @@ class GameAdapter(private val activity: AppCompatActivity) :
126 return oldItem == newItem 116 return oldItem == newItem
127 } 117 }
128 } 118 }
129
130 private fun decodeGameIcon(uri: String): Bitmap? {
131 val data = NativeLibrary.getIcon(uri)
132 return BitmapFactory.decodeByteArray(
133 data,
134 0,
135 data.size,
136 BitmapFactory.Options()
137 )
138 }
139} 119}
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
new file mode 100644
index 000000000..c0fe596d7
--- /dev/null
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt
@@ -0,0 +1,77 @@
1// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4package org.yuzu.yuzu_emu.utils
5
6import android.graphics.Bitmap
7import android.graphics.BitmapFactory
8import android.widget.ImageView
9import androidx.core.graphics.drawable.toDrawable
10import coil.ImageLoader
11import coil.decode.DataSource
12import coil.fetch.DrawableResult
13import coil.fetch.FetchResult
14import coil.fetch.Fetcher
15import coil.key.Keyer
16import coil.memory.MemoryCache
17import coil.request.ImageRequest
18import coil.request.Options
19import org.yuzu.yuzu_emu.NativeLibrary
20import org.yuzu.yuzu_emu.R
21import org.yuzu.yuzu_emu.YuzuApplication
22import org.yuzu.yuzu_emu.model.Game
23
24class GameIconFetcher(
25 private val game: Game,
26 private val options: Options
27) : Fetcher {
28 override suspend fun fetch(): FetchResult {
29 return DrawableResult(
30 drawable = decodeGameIcon(game.path)!!.toDrawable(options.context.resources),
31 isSampled = false,
32 dataSource = DataSource.DISK
33 )
34 }
35
36 private fun decodeGameIcon(uri: String): Bitmap? {
37 val data = NativeLibrary.getIcon(uri)
38 return BitmapFactory.decodeByteArray(
39 data,
40 0,
41 data.size,
42 BitmapFactory.Options()
43 )
44 }
45
46 class Factory : Fetcher.Factory<Game> {
47 override fun create(data: Game, options: Options, imageLoader: ImageLoader): Fetcher =
48 GameIconFetcher(data, options)
49 }
50}
51
52class GameIconKeyer : Keyer<Game> {
53 override fun key(data: Game, options: Options): String = data.path
54}
55
56object GameIconUtils {
57 private val imageLoader = ImageLoader.Builder(YuzuApplication.appContext)
58 .components {
59 add(GameIconKeyer())
60 add(GameIconFetcher.Factory())
61 }
62 .memoryCache {
63 MemoryCache.Builder(YuzuApplication.appContext)
64 .maxSizePercent(0.25)
65 .build()
66 }
67 .build()
68
69 fun loadGameIcon(game: Game, imageView: ImageView) {
70 val request = ImageRequest.Builder(YuzuApplication.appContext)
71 .data(game)
72 .target(imageView)
73 .error(R.drawable.default_icon)
74 .build()
75 imageLoader.enqueue(request)
76 }
77}