summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt44
1 files changed, 38 insertions, 6 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 af4ec63f2..8891705a5 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
@@ -5,17 +5,27 @@ package org.yuzu.yuzu_emu.adapters
import android.database.Cursor
import android.database.DataSetObserver
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.ImageView
+import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
+import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView
+import coil.load
import com.google.android.material.color.MaterialColors
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import org.yuzu.yuzu_emu.NativeLibrary
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.activities.EmulationActivity.Companion.launch
import org.yuzu.yuzu_emu.model.GameDatabase
import org.yuzu.yuzu_emu.utils.Log
-import org.yuzu.yuzu_emu.utils.PicassoUtils
import org.yuzu.yuzu_emu.viewholders.GameViewHolder
import java.util.*
import java.util.stream.Stream
@@ -25,7 +35,8 @@ import java.util.stream.Stream
* ContentProviders and Loaders, allows for efficient display of a limited view into a (possibly)
* large dataset.
*/
-class GameAdapter : RecyclerView.Adapter<GameViewHolder>(), View.OnClickListener {
+class GameAdapter(private val activity: AppCompatActivity) : RecyclerView.Adapter<GameViewHolder>(),
+ View.OnClickListener {
private var cursor: Cursor? = null
private val observer: GameDataSetObserver?
private var isDatasetValid = false
@@ -51,10 +62,21 @@ class GameAdapter : RecyclerView.Adapter<GameViewHolder>(), View.OnClickListener
override fun onBindViewHolder(holder: GameViewHolder, position: Int) {
if (isDatasetValid) {
if (cursor!!.moveToPosition(position)) {
- PicassoUtils.loadGameIcon(
- holder.imageIcon,
- cursor!!.getString(GameDatabase.GAME_COLUMN_PATH)
- )
+ holder.imageIcon.scaleType = ImageView.ScaleType.CENTER_CROP
+ activity.lifecycleScope.launch {
+ withContext(Dispatchers.IO) {
+ val uri =
+ Uri.parse(cursor!!.getString(GameDatabase.GAME_COLUMN_PATH)).toString()
+ val bitmap = decodeGameIcon(uri)
+ withContext(Dispatchers.Main) {
+ holder.imageIcon.load(bitmap) {
+ error(R.drawable.no_icon)
+ crossfade(true)
+ }
+ }
+ }
+ }
+
holder.textGameTitle.text =
cursor!!.getString(GameDatabase.GAME_COLUMN_TITLE)
.replace("[\\t\\n\\r]+".toRegex(), " ")
@@ -165,6 +187,16 @@ class GameAdapter : RecyclerView.Adapter<GameViewHolder>(), View.OnClickListener
}
}
+ private fun decodeGameIcon(uri: String): Bitmap {
+ val data = NativeLibrary.GetIcon(uri)
+ return BitmapFactory.decodeByteArray(
+ data,
+ 0,
+ data.size,
+ BitmapFactory.Options()
+ )
+ }
+
private inner class GameDataSetObserver : DataSetObserver() {
override fun onChanged() {
super.onChanged()