From 6a8fa2c40265774af3eb45c6dcd206c82fcc75c0 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Sat, 22 Jun 2024 20:47:54 +0100 Subject: [PATCH] android: Gamepads can now control the in-game menu --- .../citra_emu/activities/EmulationActivity.kt | 26 +++++++++++++------ .../citra_emu/fragments/EmulationFragment.kt | 10 +++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt index ef271b09b..f6b0cf4d0 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt @@ -35,6 +35,7 @@ import org.citra.citra_emu.display.ScreenAdjustmentUtil import org.citra.citra_emu.features.hotkeys.HotkeyUtility import org.citra.citra_emu.features.settings.model.SettingsViewModel import org.citra.citra_emu.features.settings.model.view.InputBindingSetting +import org.citra.citra_emu.fragments.EmulationFragment import org.citra.citra_emu.fragments.MessageDialogFragment import org.citra.citra_emu.utils.ControllerMappingHelper import org.citra.citra_emu.utils.FileBrowserHelper @@ -47,14 +48,20 @@ class EmulationActivity : AppCompatActivity() { private val preferences: SharedPreferences get() = PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext) var isActivityRecreated = false - - private val settingsViewModel: SettingsViewModel by viewModels() private val emulationViewModel: EmulationViewModel by viewModels() + private val settingsViewModel: SettingsViewModel by viewModels() private lateinit var binding: ActivityEmulationBinding private lateinit var screenAdjustmentUtil: ScreenAdjustmentUtil private lateinit var hotkeyUtility: HotkeyUtility + private val emulationFragment: EmulationFragment + get() { + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment + return navHostFragment.getChildFragmentManager().fragments.last() as EmulationFragment + } + private var isEmulationRunning: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { @@ -196,7 +203,12 @@ class EmulationActivity : AppCompatActivity() { return false } - val button = preferences.getInt(InputBindingSetting.getInputButtonKey(event), event.scanCode) + if (emulationFragment.isDrawerOpen()) { + return super.dispatchKeyEvent(event) + } + + val button = + preferences.getInt(InputBindingSetting.getInputButtonKey(event.keyCode), event.keyCode) val action: Int = when (event.action) { KeyEvent.ACTION_DOWN -> { // On some devices, the back gesture / button press is not intercepted by androidx @@ -233,11 +245,9 @@ class EmulationActivity : AppCompatActivity() { override fun dispatchGenericMotionEvent(event: MotionEvent): Boolean { // TODO: Move this check into native code - prevents crash if input pressed before starting emulation - if (!NativeLibrary.isRunning()) { - return super.dispatchGenericMotionEvent(event) - } - - if (event.source and InputDevice.SOURCE_CLASS_JOYSTICK == 0) { + if (!NativeLibrary.isRunning() || + (event.source and InputDevice.SOURCE_CLASS_JOYSTICK == 0) || + emulationFragment.isDrawerOpen()) { return super.dispatchGenericMotionEvent(event) } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt index b6f9772d7..509c7ebb6 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt @@ -190,10 +190,16 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram override fun onDrawerOpened(drawerView: View) { binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) + binding.surfaceInputOverlay.isClickable = false + binding.surfaceInputOverlay.isFocusable = false + binding.surfaceInputOverlay.isFocusableInTouchMode = false } override fun onDrawerClosed(drawerView: View) { binding.drawerLayout.setDrawerLockMode(EmulationMenuSettings.drawerLockMode) + binding.surfaceInputOverlay.isClickable = true + binding.surfaceInputOverlay.isFocusable = true + binding.surfaceInputOverlay.isFocusableInTouchMode = true } override fun onDrawerStateChanged(newState: Int) { @@ -412,6 +418,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram setInsets() } + fun isDrawerOpen(): Boolean { + return binding.drawerLayout.isOpen + } + private fun togglePause() { if(emulationState.isPaused) { emulationState.unpause()