From 330dfdc1315790db922dca8e8a7efd476cb49664 Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Sat, 1 Jun 2024 17:55:01 +0000 Subject: [PATCH] android - add option to clear all cache for a game --- src/LibRyujinx/Android/JniExportedMethods.cs | 33 +++++++++---------- .../java/org/ryujinx/android/MainActivity.kt | 3 ++ .../java/org/ryujinx/android/RyujinxNative.kt | 1 + .../android/viewmodels/MainViewModel.kt | 21 ++++++++++++ .../android/viewmodels/QuickSettings.kt | 3 ++ .../android/viewmodels/SettingsViewModel.kt | 9 +++-- .../org/ryujinx/android/views/HomeViews.kt | 8 +++++ .../org/ryujinx/android/views/SettingViews.kt | 25 ++++++++++++-- 8 files changed, 81 insertions(+), 22 deletions(-) diff --git a/src/LibRyujinx/Android/JniExportedMethods.cs b/src/LibRyujinx/Android/JniExportedMethods.cs index b1ba17ab6..99a3bced5 100644 --- a/src/LibRyujinx/Android/JniExportedMethods.cs +++ b/src/LibRyujinx/Android/JniExportedMethods.cs @@ -271,21 +271,22 @@ namespace LibRyujinx var stream = OpenFile(descriptor); IntPtr stringHandle = 0; + string? version = "0.0"; try { - var version = VerifyFirmware(stream, isXci); - - if (version != null) - { - stringHandle = Marshal.StringToHGlobalAnsi(version.VersionString); - } + version = VerifyFirmware(stream, isXci)?.VersionString; } - catch(Exception _) + catch (Exception _) { Logger.Error?.Print(LogClass.Service, $"Unable to verify firmware. Exception: {_}"); } + if (version != null) + { + stringHandle = Marshal.StringToHGlobalAnsi(version); + } + return stringHandle; } @@ -304,15 +305,8 @@ namespace LibRyujinx { Logger.Trace?.Print(LogClass.Application, "Jni Function Call"); - var version = GetInstalledFirmwareVersion(); - IntPtr stringHandle = 0; - - if (version != String.Empty) - { - stringHandle = Marshal.StringToHGlobalAnsi(version); - } - - return stringHandle; + var version = GetInstalledFirmwareVersion() ?? "0.0"; + return Marshal.StringToHGlobalAnsi(version); } [UnmanagedCallersOnly(EntryPoint = "graphicsInitialize")] @@ -438,13 +432,18 @@ namespace LibRyujinx RunLoop(); } - [UnmanagedCallersOnly(EntryPoint = "loggingSetEnabled")] public static void JniSetLoggingEnabledNative(int logLevel, bool enabled) { Logger.SetEnable((LogLevel)logLevel, enabled); } + [UnmanagedCallersOnly(EntryPoint = "loggingEnabledGraphicsLog")] + public static void JniSetLoggingEnabledGraphicsLog(bool enabled) + { + _enableGraphicsLogging = enabled; + } + [UnmanagedCallersOnly(EntryPoint = "deviceGetGameInfo")] public unsafe static void JniGetGameInfo(int fileDescriptor, IntPtr extension, IntPtr infoPtr) { diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt index 477656e44..1c365b5d5 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt @@ -97,6 +97,9 @@ class MainActivity : BaseActivity() { LogLevel.Trace.ordinal, quickSettings.enableTraceLogs ) + RyujinxNative.jnaInstance.loggingEnabledGraphicsLog( + quickSettings.enableTraceLogs + ) val success = RyujinxNative.jnaInstance.javaInitialize(appPath) diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt index bcb32efa4..13df592a0 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/RyujinxNative.kt @@ -80,6 +80,7 @@ interface RyujinxNativeJna : Library { fun deviceGetGameInfo(fileDescriptor: Int, extension: String, info: GameInfo) fun userGetAllUsers(): Array fun deviceGetDlcContentList(path: String, titleId: Long): Array + fun loggingEnabledGraphicsLog(enabled: Boolean) } class RyujinxNative { diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/MainViewModel.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/MainViewModel.kt index aa6b5320c..9b4563242 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/MainViewModel.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/MainViewModel.kt @@ -319,6 +319,27 @@ class MainViewModel(val activity: MainActivity) { } } + fun deleteCache(titleId: String) { + fun deleteDirectory(directory: File) { + if (directory.exists() && directory.isDirectory) { + directory.listFiles()?.forEach { file -> + if (file.isDirectory) { + deleteDirectory(file) + } else { + file.delete() + } + } + directory.delete() + } + } + if (titleId.isNotEmpty()) { + val basePath = MainActivity.AppPath + "/games/$titleId/cache" + if (File(basePath).exists()) { + deleteDirectory(File(basePath)) + } + } + } + fun setStatStates( fifo: MutableState, gameFps: MutableState, diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/QuickSettings.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/QuickSettings.kt index b4fa9eecf..6af7052ae 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/QuickSettings.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/QuickSettings.kt @@ -29,6 +29,7 @@ class QuickSettings(val activity: Activity) { var enableGuestLogs: Boolean var enableAccessLogs: Boolean var enableTraceLogs: Boolean + var enableGraphicsLogs: Boolean private var sharedPref: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity) @@ -57,6 +58,7 @@ class QuickSettings(val activity: Activity) { enableGuestLogs = sharedPref.getBoolean("enableGuestLogs", true) enableAccessLogs = sharedPref.getBoolean("enableAccessLogs", false) enableTraceLogs = sharedPref.getBoolean("enableStubLogs", false) + enableGraphicsLogs = sharedPref.getBoolean("enableGraphicsLogs", false) } fun save() { @@ -85,6 +87,7 @@ class QuickSettings(val activity: Activity) { editor.putBoolean("enableGuestLogs", enableGuestLogs) editor.putBoolean("enableAccessLogs", enableAccessLogs) editor.putBoolean("enableTraceLogs", enableTraceLogs) + editor.putBoolean("enableGraphicsLogs", enableGraphicsLogs) editor.apply() } diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/SettingsViewModel.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/SettingsViewModel.kt index 5e4fd5c07..58b73546b 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/SettingsViewModel.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/viewmodels/SettingsViewModel.kt @@ -63,7 +63,8 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main enableErrorLogs: MutableState, enableGuestLogs: MutableState, enableAccessLogs: MutableState, - enableTraceLogs: MutableState + enableTraceLogs: MutableState, + enableGraphicsLogs: MutableState ) { isHostMapped.value = sharedPref.getBoolean("isHostMapped", true) @@ -90,6 +91,7 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main enableGuestLogs.value = sharedPref.getBoolean("enableGuestLogs", true) enableAccessLogs.value = sharedPref.getBoolean("enableAccessLogs", false) enableTraceLogs.value = sharedPref.getBoolean("enableStubLogs", false) + enableGraphicsLogs.value = sharedPref.getBoolean("enableGraphicsLogs", false) } fun save( @@ -114,7 +116,8 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main enableErrorLogs: MutableState, enableGuestLogs: MutableState, enableAccessLogs: MutableState, - enableTraceLogs: MutableState + enableTraceLogs: MutableState, + enableGraphicsLogs: MutableState ) { val editor = sharedPref.edit() @@ -141,6 +144,7 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main editor.putBoolean("enableGuestLogs", enableGuestLogs.value) editor.putBoolean("enableAccessLogs", enableAccessLogs.value) editor.putBoolean("enableTraceLogs", enableTraceLogs.value) + editor.putBoolean("enableGraphicsLogs", enableGraphicsLogs.value) editor.apply() activity.storageHelper!!.onFolderSelected = previousFolderCallback @@ -159,6 +163,7 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main ) RyujinxNative.jnaInstance.loggingSetEnabled(LogLevel.Guest.ordinal, enableGuestLogs.value) RyujinxNative.jnaInstance.loggingSetEnabled(LogLevel.Trace.ordinal, enableTraceLogs.value) + RyujinxNative.jnaInstance.loggingEnabledGraphicsLog(enableGraphicsLogs.value) } fun openGameFolder() { diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/HomeViews.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/HomeViews.kt index 51cba4fcc..70d21ea5a 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/HomeViews.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/HomeViews.kt @@ -488,6 +488,14 @@ class HomeViews { viewModel.mainViewModel.selected?.titleId ?: "" ) }) + DropdownMenuItem(text = { + Text(text = "Delete All Cache") + }, onClick = { + showAppMenu.value = false + viewModel.mainViewModel?.deleteCache( + viewModel.mainViewModel.selected?.titleId ?: "" + ) + }) DropdownMenuItem(text = { Text(text = "Manage Updates") }, onClick = { diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/SettingViews.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/SettingViews.kt index b841efb10..b268e84e3 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/SettingViews.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/SettingViews.kt @@ -134,6 +134,7 @@ class SettingViews { val enableGuestLogs = remember { mutableStateOf(true) } val enableAccessLogs = remember { mutableStateOf(true) } val enableTraceLogs = remember { mutableStateOf(true) } + val enableGraphicsLogs = remember { mutableStateOf(true) } if (!loaded.value) { settingsViewModel.initializeState( @@ -155,7 +156,8 @@ class SettingViews { enableErrorLogs, enableGuestLogs, enableAccessLogs, - enableTraceLogs + enableTraceLogs, + enableGraphicsLogs ) loaded.value = true } @@ -189,7 +191,8 @@ class SettingViews { enableErrorLogs, enableGuestLogs, enableAccessLogs, - enableTraceLogs + enableTraceLogs, + enableGraphicsLogs ) settingsViewModel.navController.popBackStack() }) { @@ -1047,6 +1050,21 @@ class SettingViews { enableTraceLogs.value = !enableTraceLogs.value }) } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Enable Graphics Debug Logs", + modifier = Modifier.align(Alignment.CenterVertically) + ) + Switch(checked = enableGraphicsLogs.value, onCheckedChange = { + enableGraphicsLogs.value = !enableGraphicsLogs.value + }) + } Row( modifier = Modifier .fillMaxWidth() @@ -1083,7 +1101,8 @@ class SettingViews { enableErrorLogs, enableGuestLogs, enableAccessLogs, - enableTraceLogs + enableTraceLogs, + enableGraphicsLogs ) settingsViewModel.navController.popBackStack() }