|
|
@@ -20,8 +20,8 @@ import kotlinx.serialization.json.Json
|
|
|
import org.yuzu.yuzu_emu.NativeLibrary
|
|
|
import org.yuzu.yuzu_emu.YuzuApplication
|
|
|
import org.yuzu.yuzu_emu.utils.GameHelper
|
|
|
-import org.yuzu.yuzu_emu.utils.GameMetadata
|
|
|
import org.yuzu.yuzu_emu.utils.NativeConfig
|
|
|
+import java.util.concurrent.atomic.AtomicBoolean
|
|
|
|
|
|
class GamesViewModel : ViewModel() {
|
|
|
val games: StateFlow<List<Game>> get() = _games
|
|
|
@@ -33,6 +33,8 @@ class GamesViewModel : ViewModel() {
|
|
|
val isReloading: StateFlow<Boolean> get() = _isReloading
|
|
|
private val _isReloading = MutableStateFlow(false)
|
|
|
|
|
|
+ private val reloading = AtomicBoolean(false)
|
|
|
+
|
|
|
val shouldSwapData: StateFlow<Boolean> get() = _shouldSwapData
|
|
|
private val _shouldSwapData = MutableStateFlow(false)
|
|
|
|
|
|
@@ -49,38 +51,8 @@ class GamesViewModel : ViewModel() {
|
|
|
// Ensure keys are loaded so that ROM metadata can be decrypted.
|
|
|
NativeLibrary.reloadKeys()
|
|
|
|
|
|
- // Retrieve list of cached games
|
|
|
- val storedGames = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
|
|
- .getStringSet(GameHelper.KEY_GAMES, emptySet())
|
|
|
-
|
|
|
- viewModelScope.launch {
|
|
|
- withContext(Dispatchers.IO) {
|
|
|
- getGameDirs()
|
|
|
- if (storedGames!!.isNotEmpty()) {
|
|
|
- val deserializedGames = mutableSetOf<Game>()
|
|
|
- storedGames.forEach {
|
|
|
- val game: Game
|
|
|
- try {
|
|
|
- game = Json.decodeFromString(it)
|
|
|
- } catch (e: Exception) {
|
|
|
- // We don't care about any errors related to parsing the game cache
|
|
|
- return@forEach
|
|
|
- }
|
|
|
-
|
|
|
- val gameExists =
|
|
|
- DocumentFile.fromSingleUri(
|
|
|
- YuzuApplication.appContext,
|
|
|
- Uri.parse(game.path)
|
|
|
- )?.exists()
|
|
|
- if (gameExists == true) {
|
|
|
- deserializedGames.add(game)
|
|
|
- }
|
|
|
- }
|
|
|
- setGames(deserializedGames.toList())
|
|
|
- }
|
|
|
- reloadGames(false)
|
|
|
- }
|
|
|
- }
|
|
|
+ getGameDirs()
|
|
|
+ reloadGames(directoriesChanged = false, firstStartup = true)
|
|
|
}
|
|
|
|
|
|
fun setGames(games: List<Game>) {
|
|
|
@@ -110,16 +82,46 @@ class GamesViewModel : ViewModel() {
|
|
|
_searchFocused.value = searchFocused
|
|
|
}
|
|
|
|
|
|
- fun reloadGames(directoriesChanged: Boolean) {
|
|
|
- if (isReloading.value) {
|
|
|
+ fun reloadGames(directoriesChanged: Boolean, firstStartup: Boolean = false) {
|
|
|
+ if (reloading.get()) {
|
|
|
return
|
|
|
}
|
|
|
+ reloading.set(true)
|
|
|
_isReloading.value = true
|
|
|
|
|
|
viewModelScope.launch {
|
|
|
withContext(Dispatchers.IO) {
|
|
|
- GameMetadata.resetMetadata()
|
|
|
+ if (firstStartup) {
|
|
|
+ // 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: Exception) {
|
|
|
+ // We don't care about any errors related to parsing the game cache
|
|
|
+ return@forEach
|
|
|
+ }
|
|
|
+
|
|
|
+ val gameExists =
|
|
|
+ DocumentFile.fromSingleUri(
|
|
|
+ YuzuApplication.appContext,
|
|
|
+ Uri.parse(game.path)
|
|
|
+ )?.exists()
|
|
|
+ if (gameExists == true) {
|
|
|
+ deserializedGames.add(game)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ setGames(deserializedGames.toList())
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
setGames(GameHelper.getGames())
|
|
|
+ reloading.set(false)
|
|
|
_isReloading.value = false
|
|
|
|
|
|
if (directoriesChanged) {
|