1
0
forked from MeloNX/MeloNX

android - add option to clear all cache for a game

This commit is contained in:
Emmanuel Hansen 2024-06-01 17:55:01 +00:00
parent 3ff7b1d32d
commit 330dfdc131
8 changed files with 81 additions and 22 deletions

View File

@ -271,21 +271,22 @@ namespace LibRyujinx
var stream = OpenFile(descriptor); var stream = OpenFile(descriptor);
IntPtr stringHandle = 0; IntPtr stringHandle = 0;
string? version = "0.0";
try try
{ {
var version = VerifyFirmware(stream, isXci); version = VerifyFirmware(stream, isXci)?.VersionString;
if (version != null)
{
stringHandle = Marshal.StringToHGlobalAnsi(version.VersionString);
}
} }
catch(Exception _) catch (Exception _)
{ {
Logger.Error?.Print(LogClass.Service, $"Unable to verify firmware. Exception: {_}"); Logger.Error?.Print(LogClass.Service, $"Unable to verify firmware. Exception: {_}");
} }
if (version != null)
{
stringHandle = Marshal.StringToHGlobalAnsi(version);
}
return stringHandle; return stringHandle;
} }
@ -304,15 +305,8 @@ namespace LibRyujinx
{ {
Logger.Trace?.Print(LogClass.Application, "Jni Function Call"); Logger.Trace?.Print(LogClass.Application, "Jni Function Call");
var version = GetInstalledFirmwareVersion(); var version = GetInstalledFirmwareVersion() ?? "0.0";
IntPtr stringHandle = 0; return Marshal.StringToHGlobalAnsi(version);
if (version != String.Empty)
{
stringHandle = Marshal.StringToHGlobalAnsi(version);
}
return stringHandle;
} }
[UnmanagedCallersOnly(EntryPoint = "graphicsInitialize")] [UnmanagedCallersOnly(EntryPoint = "graphicsInitialize")]
@ -438,13 +432,18 @@ namespace LibRyujinx
RunLoop(); RunLoop();
} }
[UnmanagedCallersOnly(EntryPoint = "loggingSetEnabled")] [UnmanagedCallersOnly(EntryPoint = "loggingSetEnabled")]
public static void JniSetLoggingEnabledNative(int logLevel, bool enabled) public static void JniSetLoggingEnabledNative(int logLevel, bool enabled)
{ {
Logger.SetEnable((LogLevel)logLevel, enabled); Logger.SetEnable((LogLevel)logLevel, enabled);
} }
[UnmanagedCallersOnly(EntryPoint = "loggingEnabledGraphicsLog")]
public static void JniSetLoggingEnabledGraphicsLog(bool enabled)
{
_enableGraphicsLogging = enabled;
}
[UnmanagedCallersOnly(EntryPoint = "deviceGetGameInfo")] [UnmanagedCallersOnly(EntryPoint = "deviceGetGameInfo")]
public unsafe static void JniGetGameInfo(int fileDescriptor, IntPtr extension, IntPtr infoPtr) public unsafe static void JniGetGameInfo(int fileDescriptor, IntPtr extension, IntPtr infoPtr)
{ {

View File

@ -97,6 +97,9 @@ class MainActivity : BaseActivity() {
LogLevel.Trace.ordinal, LogLevel.Trace.ordinal,
quickSettings.enableTraceLogs quickSettings.enableTraceLogs
) )
RyujinxNative.jnaInstance.loggingEnabledGraphicsLog(
quickSettings.enableTraceLogs
)
val success = val success =
RyujinxNative.jnaInstance.javaInitialize(appPath) RyujinxNative.jnaInstance.javaInitialize(appPath)

View File

@ -80,6 +80,7 @@ interface RyujinxNativeJna : Library {
fun deviceGetGameInfo(fileDescriptor: Int, extension: String, info: GameInfo) fun deviceGetGameInfo(fileDescriptor: Int, extension: String, info: GameInfo)
fun userGetAllUsers(): Array<String> fun userGetAllUsers(): Array<String>
fun deviceGetDlcContentList(path: String, titleId: Long): Array<String> fun deviceGetDlcContentList(path: String, titleId: Long): Array<String>
fun loggingEnabledGraphicsLog(enabled: Boolean)
} }
class RyujinxNative { class RyujinxNative {

View File

@ -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( fun setStatStates(
fifo: MutableState<Double>, fifo: MutableState<Double>,
gameFps: MutableState<Double>, gameFps: MutableState<Double>,

View File

@ -29,6 +29,7 @@ class QuickSettings(val activity: Activity) {
var enableGuestLogs: Boolean var enableGuestLogs: Boolean
var enableAccessLogs: Boolean var enableAccessLogs: Boolean
var enableTraceLogs: Boolean var enableTraceLogs: Boolean
var enableGraphicsLogs: Boolean
private var sharedPref: SharedPreferences = private var sharedPref: SharedPreferences =
PreferenceManager.getDefaultSharedPreferences(activity) PreferenceManager.getDefaultSharedPreferences(activity)
@ -57,6 +58,7 @@ class QuickSettings(val activity: Activity) {
enableGuestLogs = sharedPref.getBoolean("enableGuestLogs", true) enableGuestLogs = sharedPref.getBoolean("enableGuestLogs", true)
enableAccessLogs = sharedPref.getBoolean("enableAccessLogs", false) enableAccessLogs = sharedPref.getBoolean("enableAccessLogs", false)
enableTraceLogs = sharedPref.getBoolean("enableStubLogs", false) enableTraceLogs = sharedPref.getBoolean("enableStubLogs", false)
enableGraphicsLogs = sharedPref.getBoolean("enableGraphicsLogs", false)
} }
fun save() { fun save() {
@ -85,6 +87,7 @@ class QuickSettings(val activity: Activity) {
editor.putBoolean("enableGuestLogs", enableGuestLogs) editor.putBoolean("enableGuestLogs", enableGuestLogs)
editor.putBoolean("enableAccessLogs", enableAccessLogs) editor.putBoolean("enableAccessLogs", enableAccessLogs)
editor.putBoolean("enableTraceLogs", enableTraceLogs) editor.putBoolean("enableTraceLogs", enableTraceLogs)
editor.putBoolean("enableGraphicsLogs", enableGraphicsLogs)
editor.apply() editor.apply()
} }

View File

@ -63,7 +63,8 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main
enableErrorLogs: MutableState<Boolean>, enableErrorLogs: MutableState<Boolean>,
enableGuestLogs: MutableState<Boolean>, enableGuestLogs: MutableState<Boolean>,
enableAccessLogs: MutableState<Boolean>, enableAccessLogs: MutableState<Boolean>,
enableTraceLogs: MutableState<Boolean> enableTraceLogs: MutableState<Boolean>,
enableGraphicsLogs: MutableState<Boolean>
) { ) {
isHostMapped.value = sharedPref.getBoolean("isHostMapped", true) isHostMapped.value = sharedPref.getBoolean("isHostMapped", true)
@ -90,6 +91,7 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main
enableGuestLogs.value = sharedPref.getBoolean("enableGuestLogs", true) enableGuestLogs.value = sharedPref.getBoolean("enableGuestLogs", true)
enableAccessLogs.value = sharedPref.getBoolean("enableAccessLogs", false) enableAccessLogs.value = sharedPref.getBoolean("enableAccessLogs", false)
enableTraceLogs.value = sharedPref.getBoolean("enableStubLogs", false) enableTraceLogs.value = sharedPref.getBoolean("enableStubLogs", false)
enableGraphicsLogs.value = sharedPref.getBoolean("enableGraphicsLogs", false)
} }
fun save( fun save(
@ -114,7 +116,8 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main
enableErrorLogs: MutableState<Boolean>, enableErrorLogs: MutableState<Boolean>,
enableGuestLogs: MutableState<Boolean>, enableGuestLogs: MutableState<Boolean>,
enableAccessLogs: MutableState<Boolean>, enableAccessLogs: MutableState<Boolean>,
enableTraceLogs: MutableState<Boolean> enableTraceLogs: MutableState<Boolean>,
enableGraphicsLogs: MutableState<Boolean>
) { ) {
val editor = sharedPref.edit() val editor = sharedPref.edit()
@ -141,6 +144,7 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main
editor.putBoolean("enableGuestLogs", enableGuestLogs.value) editor.putBoolean("enableGuestLogs", enableGuestLogs.value)
editor.putBoolean("enableAccessLogs", enableAccessLogs.value) editor.putBoolean("enableAccessLogs", enableAccessLogs.value)
editor.putBoolean("enableTraceLogs", enableTraceLogs.value) editor.putBoolean("enableTraceLogs", enableTraceLogs.value)
editor.putBoolean("enableGraphicsLogs", enableGraphicsLogs.value)
editor.apply() editor.apply()
activity.storageHelper!!.onFolderSelected = previousFolderCallback 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.Guest.ordinal, enableGuestLogs.value)
RyujinxNative.jnaInstance.loggingSetEnabled(LogLevel.Trace.ordinal, enableTraceLogs.value) RyujinxNative.jnaInstance.loggingSetEnabled(LogLevel.Trace.ordinal, enableTraceLogs.value)
RyujinxNative.jnaInstance.loggingEnabledGraphicsLog(enableGraphicsLogs.value)
} }
fun openGameFolder() { fun openGameFolder() {

View File

@ -488,6 +488,14 @@ class HomeViews {
viewModel.mainViewModel.selected?.titleId ?: "" viewModel.mainViewModel.selected?.titleId ?: ""
) )
}) })
DropdownMenuItem(text = {
Text(text = "Delete All Cache")
}, onClick = {
showAppMenu.value = false
viewModel.mainViewModel?.deleteCache(
viewModel.mainViewModel.selected?.titleId ?: ""
)
})
DropdownMenuItem(text = { DropdownMenuItem(text = {
Text(text = "Manage Updates") Text(text = "Manage Updates")
}, onClick = { }, onClick = {

View File

@ -134,6 +134,7 @@ class SettingViews {
val enableGuestLogs = remember { mutableStateOf(true) } val enableGuestLogs = remember { mutableStateOf(true) }
val enableAccessLogs = remember { mutableStateOf(true) } val enableAccessLogs = remember { mutableStateOf(true) }
val enableTraceLogs = remember { mutableStateOf(true) } val enableTraceLogs = remember { mutableStateOf(true) }
val enableGraphicsLogs = remember { mutableStateOf(true) }
if (!loaded.value) { if (!loaded.value) {
settingsViewModel.initializeState( settingsViewModel.initializeState(
@ -155,7 +156,8 @@ class SettingViews {
enableErrorLogs, enableErrorLogs,
enableGuestLogs, enableGuestLogs,
enableAccessLogs, enableAccessLogs,
enableTraceLogs enableTraceLogs,
enableGraphicsLogs
) )
loaded.value = true loaded.value = true
} }
@ -189,7 +191,8 @@ class SettingViews {
enableErrorLogs, enableErrorLogs,
enableGuestLogs, enableGuestLogs,
enableAccessLogs, enableAccessLogs,
enableTraceLogs enableTraceLogs,
enableGraphicsLogs
) )
settingsViewModel.navController.popBackStack() settingsViewModel.navController.popBackStack()
}) { }) {
@ -1047,6 +1050,21 @@ class SettingViews {
enableTraceLogs.value = !enableTraceLogs.value 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( Row(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
@ -1083,7 +1101,8 @@ class SettingViews {
enableErrorLogs, enableErrorLogs,
enableGuestLogs, enableGuestLogs,
enableAccessLogs, enableAccessLogs,
enableTraceLogs enableTraceLogs,
enableGraphicsLogs
) )
settingsViewModel.navController.popBackStack() settingsViewModel.navController.popBackStack()
} }