From 25815900236c45a340feb7654b6d49792c10c4f4 Mon Sep 17 00:00:00 2001
From: Charles Lombardo <clombardo169@gmail.com>
Date: Sun, 29 Oct 2023 14:15:37 -0400
Subject: [PATCH] android: Move game deserialization to another thread

Deserializing games from the cache in shared preferences was done on the main thread and could cause a stutter on startup.
---
 .../org/yuzu/yuzu_emu/model/GamesViewModel.kt | 39 +++++++++++--------
 1 file changed, 23 insertions(+), 16 deletions(-)

diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt
index 6e09fa81d..004b25b04 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt
@@ -49,26 +49,33 @@ class GamesViewModel : ViewModel() {
         // Retrieve list of cached games
         val storedGames = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
             .getStringSet(GameHelper.KEY_GAMES, emptySet())
-        if (storedGames!!.isNotEmpty()) {
-            val deserializedGames = mutableSetOf<Game>()
-            storedGames.forEach {
-                val game: Game
-                try {
-                    game = Json.decodeFromString(it)
-                } catch (e: MissingFieldException) {
-                    return@forEach
-                }
 
-                val gameExists =
-                    DocumentFile.fromSingleUri(YuzuApplication.appContext, Uri.parse(game.path))
-                        ?.exists()
-                if (gameExists == true) {
-                    deserializedGames.add(game)
+        viewModelScope.launch {
+            withContext(Dispatchers.IO) {
+                if (storedGames!!.isNotEmpty()) {
+                    val deserializedGames = mutableSetOf<Game>()
+                    storedGames.forEach {
+                        val game: Game
+                        try {
+                            game = Json.decodeFromString(it)
+                        } catch (e: MissingFieldException) {
+                            return@forEach
+                        }
+
+                        val gameExists =
+                            DocumentFile.fromSingleUri(
+                                YuzuApplication.appContext,
+                                Uri.parse(game.path)
+                            )?.exists()
+                        if (gameExists == true) {
+                            deserializedGames.add(game)
+                        }
+                    }
+                    setGames(deserializedGames.toList())
                 }
+                reloadGames(false)
             }
-            setGames(deserializedGames.toList())
         }
-        reloadGames(false)
     }
 
     fun setGames(games: List<Game>) {