From c12da6d650ef0beeebb3b6c9df988b3e8757046c Mon Sep 17 00:00:00 2001
From: Emmanuel Hansen <emmausssss@gmail.com>
Date: Sun, 24 Dec 2023 21:34:10 +0000
Subject: [PATCH] android - add option to swap button layouts to nintendo style

---
 .../android/PhysicalControllerManager.kt      | 10 ++++++----
 .../android/viewmodels/QuickSettings.kt       |  3 +++
 .../android/viewmodels/SettingsViewModel.kt   |  5 ++++-
 .../org/ryujinx/android/views/SettingViews.kt | 19 +++++++++++++++++++
 4 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/PhysicalControllerManager.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/PhysicalControllerManager.kt
index 12f7a1e43..45517e672 100644
--- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/PhysicalControllerManager.kt
+++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/PhysicalControllerManager.kt
@@ -2,6 +2,7 @@ package org.ryujinx.android
 
 import android.view.KeyEvent
 import android.view.MotionEvent
+import org.ryujinx.android.viewmodels.QuickSettings
 
 class PhysicalControllerManager(val activity: MainActivity) {
     private var controllerId: Int = -1
@@ -54,11 +55,12 @@ class PhysicalControllerManager(val activity: MainActivity) {
     }
 
     private fun getGamePadButtonInputId(keycode: Int): GamePadButtonInputId {
+        val quickSettings = QuickSettings(activity)
         return when (keycode) {
-            KeyEvent.KEYCODE_BUTTON_A -> GamePadButtonInputId.B
-            KeyEvent.KEYCODE_BUTTON_B -> GamePadButtonInputId.A
-            KeyEvent.KEYCODE_BUTTON_X -> GamePadButtonInputId.X
-            KeyEvent.KEYCODE_BUTTON_Y -> GamePadButtonInputId.Y
+            KeyEvent.KEYCODE_BUTTON_A -> if (!quickSettings.useSwitchLayout) GamePadButtonInputId.A else GamePadButtonInputId.B
+            KeyEvent.KEYCODE_BUTTON_B -> if (!quickSettings.useSwitchLayout) GamePadButtonInputId.B else GamePadButtonInputId.A
+            KeyEvent.KEYCODE_BUTTON_X -> if (!quickSettings.useSwitchLayout) GamePadButtonInputId.X else GamePadButtonInputId.Y
+            KeyEvent.KEYCODE_BUTTON_Y -> if (!quickSettings.useSwitchLayout) GamePadButtonInputId.Y else GamePadButtonInputId.X
             KeyEvent.KEYCODE_BUTTON_L1 -> GamePadButtonInputId.LeftShoulder
             KeyEvent.KEYCODE_BUTTON_L2 -> GamePadButtonInputId.LeftTrigger
             KeyEvent.KEYCODE_BUTTON_R1 -> GamePadButtonInputId.RightShoulder
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 49ece0b3c..0c2d0925d 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
@@ -16,6 +16,7 @@ class QuickSettings(val activity: Activity) {
     var enableTextureRecompression: Boolean
     var resScale : Float
     var isGrid : Boolean
+    var useSwitchLayout : Boolean
 
     // Logs
     var enableDebugLogs: Boolean
@@ -41,6 +42,7 @@ class QuickSettings(val activity: Activity) {
         resScale = sharedPref.getFloat("resScale", 1f)
         useVirtualController = sharedPref.getBoolean("useVirtualController", true)
         isGrid = sharedPref.getBoolean("isGrid", true)
+        useSwitchLayout = sharedPref.getBoolean("useSwitchLayout", true)
 
         enableDebugLogs = sharedPref.getBoolean("enableDebugLogs", false)
         enableStubLogs = sharedPref.getBoolean("enableStubLogs", false)
@@ -66,6 +68,7 @@ class QuickSettings(val activity: Activity) {
         editor.putFloat("resScale", resScale)
         editor.putBoolean("useVirtualController", useVirtualController)
         editor.putBoolean("isGrid", isGrid)
+        editor.putBoolean("useSwitchLayout", useSwitchLayout)
 
         editor.putBoolean("enableDebugLogs", enableDebugLogs)
         editor.putBoolean("enableStubLogs", enableStubLogs)
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 1dd73fd54..f81489060 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
@@ -54,6 +54,7 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main
         resScale: MutableState<Float>,
         useVirtualController: MutableState<Boolean>,
         isGrid: MutableState<Boolean>,
+        useSwitchLayout: MutableState<Boolean>,
         enableDebugLogs: MutableState<Boolean>,
         enableStubLogs: MutableState<Boolean>,
         enableInfoLogs: MutableState<Boolean>,
@@ -76,6 +77,7 @@ 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)
+        useSwitchLayout.value = sharedPref.getBoolean("useSwitchLayout", true)
 
         enableDebugLogs.value = sharedPref.getBoolean("enableDebugLogs", false)
         enableStubLogs.value = sharedPref.getBoolean("enableStubLogs", false)
@@ -99,6 +101,7 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main
         resScale: MutableState<Float>,
         useVirtualController: MutableState<Boolean>,
         isGrid: MutableState<Boolean>,
+        useSwitchLayout: MutableState<Boolean>,
         enableDebugLogs: MutableState<Boolean>,
         enableStubLogs: MutableState<Boolean>,
         enableInfoLogs: MutableState<Boolean>,
@@ -121,7 +124,7 @@ class SettingsViewModel(var navController: NavHostController, val activity: Main
         editor.putFloat("resScale", resScale.value)
         editor.putBoolean("useVirtualController", useVirtualController.value)
         editor.putBoolean("isGrid", isGrid.value)
-
+        editor.putBoolean("useSwitchLayout", useSwitchLayout.value)
 
         editor.putBoolean("enableDebugLogs", enableDebugLogs.value)
         editor.putBoolean("enableStubLogs", enableStubLogs.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 b8cfac9af..832dab8be 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
@@ -120,6 +120,7 @@ class SettingViews {
                 mutableStateOf(mainViewModel.firmwareVersion)
             }
             val isGrid = remember { mutableStateOf(true) }
+            val useSwitchLayout = remember { mutableStateOf(true) }
 
             val enableDebugLogs = remember { mutableStateOf(true) }
             val enableStubLogs = remember { mutableStateOf(true) }
@@ -140,6 +141,7 @@ class SettingViews {
                     resScale,
                     useVirtualController,
                     isGrid,
+                    useSwitchLayout,
                     enableDebugLogs,
                     enableStubLogs,
                     enableInfoLogs,
@@ -171,6 +173,7 @@ class SettingViews {
                                     resScale,
                                     useVirtualController,
                                     isGrid,
+                                    useSwitchLayout,
                                     enableDebugLogs,
                                     enableStubLogs,
                                     enableInfoLogs,
@@ -854,6 +857,21 @@ class SettingViews {
                                     useVirtualController.value = !useVirtualController.value
                                 })
                             }
+                            Row(
+                                modifier = Modifier
+                                    .fillMaxWidth()
+                                    .padding(8.dp),
+                                horizontalArrangement = Arrangement.SpaceBetween,
+                                verticalAlignment = Alignment.CenterVertically
+                            ) {
+                                Text(
+                                    text = "Use Switch Controller Layout",
+                                    modifier = Modifier.align(Alignment.CenterVertically)
+                                )
+                                Switch(checked = useSwitchLayout.value, onCheckedChange = {
+                                    useSwitchLayout.value = !useSwitchLayout.value
+                                })
+                            }
                         }
                     }
                     ExpandableView(onCardArrowClick = { }, title = "Log") {
@@ -1004,6 +1022,7 @@ class SettingViews {
                         resScale,
                         useVirtualController,
                         isGrid,
+                        useSwitchLayout,
                         enableDebugLogs,
                         enableStubLogs,
                         enableInfoLogs,