diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/Logging.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/Logging.kt index a38c6a8da..bc8c615ab 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/Logging.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/Logging.kt @@ -52,3 +52,7 @@ class Logging(private var viewModel: MainViewModel) { File(logPath).mkdirs() } } + +internal enum class LogLevel { + Debug, Stub, Info, Warning, Error, Guest, AccessLog, Notice, Trace +} 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 1c851484d..7df186d62 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 @@ -20,6 +20,7 @@ import androidx.core.view.WindowInsetsControllerCompat import com.anggrayudi.storage.SimpleStorageHelper import org.ryujinx.android.ui.theme.RyujinxAndroidTheme import org.ryujinx.android.viewmodels.MainViewModel +import org.ryujinx.android.viewmodels.QuickSettings import org.ryujinx.android.views.MainView import kotlin.math.abs @@ -64,7 +65,17 @@ class MainActivity : BaseActivity() { return val appPath: String = AppPath - val success = RyujinxNative.instance.initialize(NativeHelpers.instance.storeStringJava(appPath), false) + + var quickSettings = QuickSettings(this) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Debug.ordinal, quickSettings.enableDebugLogs) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Info.ordinal, quickSettings.enableInfoLogs) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Stub.ordinal, quickSettings.enableStubLogs) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Warning.ordinal, quickSettings.enableWarningLogs) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Error.ordinal, quickSettings.enableErrorLogs) + RyujinxNative.instance.loggingSetEnabled(LogLevel.AccessLog.ordinal, quickSettings.enableAccessLogs) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Guest.ordinal, quickSettings.enableGuestLogs) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Trace.ordinal, quickSettings.enableTraceLogs) + val success = RyujinxNative.instance.initialize(NativeHelpers.instance.storeStringJava(appPath)) _isInit = success } override fun onCreate(savedInstanceState: Bundle?) { @@ -78,7 +89,6 @@ class MainActivity : BaseActivity() { AppPath = this.getExternalFilesDir(null)!!.absolutePath - initialize() window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 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 989226de6..3ec7d70b2 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 @@ -4,7 +4,7 @@ import org.ryujinx.android.viewmodels.GameInfo @Suppress("KotlinJniMissingFunction") class RyujinxNative { - external fun initialize(appPath: Long, enableDebugLogs : Boolean): Boolean + external fun initialize(appPath: Long): Boolean companion object { val instance: RyujinxNative = RyujinxNative() @@ -64,4 +64,5 @@ class RyujinxNative { external fun userDeleteUser(userId: String) external fun userOpenUser(userId: Long) external fun userCloseUser(userId: String) + external fun loggingSetEnabled(logLevel: Int, enabled: Boolean) } 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 e37377c09..49ece0b3c 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 @@ -17,6 +17,16 @@ class QuickSettings(val activity: Activity) { var resScale : Float var isGrid : Boolean + // Logs + var enableDebugLogs: Boolean + var enableStubLogs: Boolean + var enableInfoLogs: Boolean + var enableWarningLogs: Boolean + var enableErrorLogs: Boolean + var enableGuestLogs: Boolean + var enableAccessLogs: Boolean + var enableTraceLogs: Boolean + private var sharedPref: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity) init { @@ -31,5 +41,41 @@ class QuickSettings(val activity: Activity) { resScale = sharedPref.getFloat("resScale", 1f) useVirtualController = sharedPref.getBoolean("useVirtualController", true) isGrid = sharedPref.getBoolean("isGrid", true) + + enableDebugLogs = sharedPref.getBoolean("enableDebugLogs", false) + enableStubLogs = sharedPref.getBoolean("enableStubLogs", false) + enableInfoLogs = sharedPref.getBoolean("enableInfoLogs", true) + enableWarningLogs = sharedPref.getBoolean("enableWarningLogs", true) + enableErrorLogs = sharedPref.getBoolean("enableErrorLogs", true) + enableGuestLogs = sharedPref.getBoolean("enableGuestLogs", true) + enableAccessLogs = sharedPref.getBoolean("enableAccessLogs", false) + enableTraceLogs = sharedPref.getBoolean("enableStubLogs", false) + } + + fun save(){ + val editor = sharedPref.edit() + + editor.putBoolean("isHostMapped", isHostMapped) + editor.putBoolean("useNce", useNce) + editor.putBoolean("enableVsync", enableVsync) + editor.putBoolean("enableDocked", enableDocked) + editor.putBoolean("enablePtc", enablePtc) + editor.putBoolean("ignoreMissingServices", ignoreMissingServices) + editor.putBoolean("enableShaderCache", enableShaderCache) + editor.putBoolean("enableTextureRecompression", enableTextureRecompression) + editor.putFloat("resScale", resScale) + editor.putBoolean("useVirtualController", useVirtualController) + editor.putBoolean("isGrid", isGrid) + + editor.putBoolean("enableDebugLogs", enableDebugLogs) + editor.putBoolean("enableStubLogs", enableStubLogs) + editor.putBoolean("enableInfoLogs", enableInfoLogs) + editor.putBoolean("enableWarningLogs", enableWarningLogs) + editor.putBoolean("enableErrorLogs", enableErrorLogs) + editor.putBoolean("enableGuestLogs", enableGuestLogs) + editor.putBoolean("enableAccessLogs", enableAccessLogs) + editor.putBoolean("enableTraceLogs", enableTraceLogs) + + 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 d940b2c53..e295df5e8 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 @@ -7,7 +7,9 @@ import androidx.navigation.NavHostController import androidx.preference.PreferenceManager import com.anggrayudi.storage.file.FileFullPath import com.anggrayudi.storage.file.getAbsolutePath +import org.ryujinx.android.LogLevel import org.ryujinx.android.MainActivity +import org.ryujinx.android.RyujinxNative class SettingsViewModel(var navController: NavHostController, val activity: MainActivity) { private var previousCallback: ((requestCode: Int, folder: DocumentFile) -> Unit)? @@ -42,6 +44,14 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main resScale: MutableState<Float>, useVirtualController: MutableState<Boolean>, isGrid: MutableState<Boolean>, + enableDebugLogs: MutableState<Boolean>, + enableStubLogs: MutableState<Boolean>, + enableInfoLogs: MutableState<Boolean>, + enableWarningLogs: MutableState<Boolean>, + enableErrorLogs: MutableState<Boolean>, + enableGuestLogs: MutableState<Boolean>, + enableAccessLogs: MutableState<Boolean>, + enableTraceLogs: MutableState<Boolean> ) { @@ -56,6 +66,15 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main resScale.value = sharedPref.getFloat("resScale", 1f) useVirtualController.value = sharedPref.getBoolean("useVirtualController", true) isGrid.value = sharedPref.getBoolean("isGrid", true) + + enableDebugLogs.value = sharedPref.getBoolean("enableDebugLogs", false) + enableStubLogs.value = sharedPref.getBoolean("enableStubLogs", false) + enableInfoLogs.value = sharedPref.getBoolean("enableInfoLogs", true) + enableWarningLogs.value = sharedPref.getBoolean("enableWarningLogs", true) + enableErrorLogs.value = sharedPref.getBoolean("enableErrorLogs", true) + enableGuestLogs.value = sharedPref.getBoolean("enableGuestLogs", true) + enableAccessLogs.value = sharedPref.getBoolean("enableAccessLogs", false) + enableTraceLogs.value = sharedPref.getBoolean("enableStubLogs", false) } fun save( @@ -69,7 +88,15 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main enableTextureRecompression: MutableState<Boolean>, resScale: MutableState<Float>, useVirtualController: MutableState<Boolean>, - isGrid: MutableState<Boolean> + isGrid: MutableState<Boolean>, + enableDebugLogs: MutableState<Boolean>, + enableStubLogs: MutableState<Boolean>, + enableInfoLogs: MutableState<Boolean>, + enableWarningLogs: MutableState<Boolean>, + enableErrorLogs: MutableState<Boolean>, + enableGuestLogs: MutableState<Boolean>, + enableAccessLogs: MutableState<Boolean>, + enableTraceLogs: MutableState<Boolean> ){ val editor = sharedPref.edit() @@ -85,8 +112,27 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main editor.putBoolean("useVirtualController", useVirtualController.value) editor.putBoolean("isGrid", isGrid.value) + + editor.putBoolean("enableDebugLogs", enableDebugLogs.value) + editor.putBoolean("enableStubLogs", enableStubLogs.value) + editor.putBoolean("enableInfoLogs", enableInfoLogs.value) + editor.putBoolean("enableWarningLogs", enableWarningLogs.value) + editor.putBoolean("enableErrorLogs", enableErrorLogs.value) + editor.putBoolean("enableGuestLogs", enableGuestLogs.value) + editor.putBoolean("enableAccessLogs", enableAccessLogs.value) + editor.putBoolean("enableTraceLogs", enableTraceLogs.value) + editor.apply() activity.storageHelper!!.onFolderSelected = previousCallback + + RyujinxNative.instance.loggingSetEnabled(LogLevel.Debug.ordinal, enableDebugLogs.value) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Info.ordinal, enableInfoLogs.value) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Stub.ordinal, enableStubLogs.value) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Warning.ordinal, enableWarningLogs.value) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Error.ordinal, enableErrorLogs.value) + RyujinxNative.instance.loggingSetEnabled(LogLevel.AccessLog.ordinal, enableAccessLogs.value) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Guest.ordinal, enableGuestLogs.value) + RyujinxNative.instance.loggingSetEnabled(LogLevel.Trace.ordinal, enableTraceLogs.value) } 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 bb68d75a2..fda6570a1 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 @@ -103,9 +103,16 @@ class SettingViews { val useVirtualController = remember { mutableStateOf(true) } - val isGrid = remember { - mutableStateOf(true) - } + val isGrid = remember { mutableStateOf(true) } + + val enableDebugLogs = remember { mutableStateOf(true) } + val enableStubLogs = remember { mutableStateOf(true) } + val enableInfoLogs = remember { mutableStateOf(true) } + val enableWarningLogs = remember { mutableStateOf(true) } + val enableErrorLogs = remember { mutableStateOf(true) } + val enableGuestLogs = remember { mutableStateOf(true) } + val enableAccessLogs = remember { mutableStateOf(true) } + val enableTraceLogs = remember { mutableStateOf(true) } if (!loaded.value) { settingsViewModel.initializeState( @@ -116,7 +123,15 @@ class SettingViews { enableTextureRecompression, resScale, useVirtualController, - isGrid + isGrid, + enableDebugLogs, + enableStubLogs, + enableInfoLogs, + enableWarningLogs, + enableErrorLogs, + enableGuestLogs, + enableAccessLogs, + enableTraceLogs ) loaded.value = true } @@ -139,7 +154,15 @@ class SettingViews { enableTextureRecompression, resScale, useVirtualController, - isGrid + isGrid, + enableDebugLogs, + enableStubLogs, + enableInfoLogs, + enableWarningLogs, + enableErrorLogs, + enableGuestLogs, + enableAccessLogs, + enableTraceLogs ) settingsViewModel.navController.popBackStack() }) { @@ -637,17 +660,139 @@ class SettingViews { } } ExpandableView(onCardArrowClick = { }, title = "Log") { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(8.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Button(onClick = { - mainViewModel.logging.requestExport() - }) { - Text(text = "Send Logs") + Column(modifier = Modifier.fillMaxWidth()) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Enable Debug Logs", + modifier = Modifier.align(Alignment.CenterVertically) + ) + Switch(checked = enableDebugLogs.value, onCheckedChange = { + enableDebugLogs.value = !enableDebugLogs.value + }) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Enable Stub Logs", + modifier = Modifier.align(Alignment.CenterVertically) + ) + Switch(checked = enableStubLogs.value, onCheckedChange = { + enableStubLogs.value = !enableStubLogs.value + }) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Enable Info Logs", + modifier = Modifier.align(Alignment.CenterVertically) + ) + Switch(checked = enableInfoLogs.value, onCheckedChange = { + enableInfoLogs.value = !enableInfoLogs.value + }) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Enable Warning Logs", + modifier = Modifier.align(Alignment.CenterVertically) + ) + Switch(checked = enableWarningLogs.value, onCheckedChange = { + enableWarningLogs.value = !enableWarningLogs.value + }) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Enable Error Logs", + modifier = Modifier.align(Alignment.CenterVertically) + ) + Switch(checked = enableErrorLogs.value, onCheckedChange = { + enableErrorLogs.value = !enableErrorLogs.value + }) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Enable Guest Logs", + modifier = Modifier.align(Alignment.CenterVertically) + ) + Switch(checked = enableGuestLogs.value, onCheckedChange = { + enableGuestLogs.value = !enableGuestLogs.value + }) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Enable Access Logs", + modifier = Modifier.align(Alignment.CenterVertically) + ) + Switch(checked = enableAccessLogs.value, onCheckedChange = { + enableAccessLogs.value = !enableAccessLogs.value + }) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Enable Trace Logs", + modifier = Modifier.align(Alignment.CenterVertically) + ) + Switch(checked = enableTraceLogs.value, onCheckedChange = { + enableTraceLogs.value = !enableTraceLogs.value + }) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Button(onClick = { + mainViewModel.logging.requestExport() + }) { + Text(text = "Send Logs") + } } } } @@ -661,7 +806,15 @@ class SettingViews { enableTextureRecompression, resScale, useVirtualController, - isGrid + isGrid, + enableDebugLogs, + enableStubLogs, + enableInfoLogs, + enableWarningLogs, + enableErrorLogs, + enableGuestLogs, + enableAccessLogs, + enableTraceLogs ) settingsViewModel.navController.popBackStack() }