android: Gamepads can now control the in-game menu

This commit is contained in:
OpenSauce04 2024-06-22 20:47:54 +01:00
parent 61c4d324a9
commit 6a8fa2c402
2 changed files with 28 additions and 8 deletions

View File

@ -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.hotkeys.HotkeyUtility
import org.citra.citra_emu.features.settings.model.SettingsViewModel import org.citra.citra_emu.features.settings.model.SettingsViewModel
import org.citra.citra_emu.features.settings.model.view.InputBindingSetting 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.fragments.MessageDialogFragment
import org.citra.citra_emu.utils.ControllerMappingHelper import org.citra.citra_emu.utils.ControllerMappingHelper
import org.citra.citra_emu.utils.FileBrowserHelper import org.citra.citra_emu.utils.FileBrowserHelper
@ -47,14 +48,20 @@ class EmulationActivity : AppCompatActivity() {
private val preferences: SharedPreferences private val preferences: SharedPreferences
get() = PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext) get() = PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext)
var isActivityRecreated = false var isActivityRecreated = false
private val settingsViewModel: SettingsViewModel by viewModels()
private val emulationViewModel: EmulationViewModel by viewModels() private val emulationViewModel: EmulationViewModel by viewModels()
private val settingsViewModel: SettingsViewModel by viewModels()
private lateinit var binding: ActivityEmulationBinding private lateinit var binding: ActivityEmulationBinding
private lateinit var screenAdjustmentUtil: ScreenAdjustmentUtil private lateinit var screenAdjustmentUtil: ScreenAdjustmentUtil
private lateinit var hotkeyUtility: HotkeyUtility 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 private var isEmulationRunning: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -196,7 +203,12 @@ class EmulationActivity : AppCompatActivity() {
return false 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) { val action: Int = when (event.action) {
KeyEvent.ACTION_DOWN -> { KeyEvent.ACTION_DOWN -> {
// On some devices, the back gesture / button press is not intercepted by androidx // 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 { override fun dispatchGenericMotionEvent(event: MotionEvent): Boolean {
// TODO: Move this check into native code - prevents crash if input pressed before starting emulation // TODO: Move this check into native code - prevents crash if input pressed before starting emulation
if (!NativeLibrary.isRunning()) { if (!NativeLibrary.isRunning() ||
return super.dispatchGenericMotionEvent(event) (event.source and InputDevice.SOURCE_CLASS_JOYSTICK == 0) ||
} emulationFragment.isDrawerOpen()) {
if (event.source and InputDevice.SOURCE_CLASS_JOYSTICK == 0) {
return super.dispatchGenericMotionEvent(event) return super.dispatchGenericMotionEvent(event)
} }

View File

@ -190,10 +190,16 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
override fun onDrawerOpened(drawerView: View) { override fun onDrawerOpened(drawerView: View) {
binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
binding.surfaceInputOverlay.isClickable = false
binding.surfaceInputOverlay.isFocusable = false
binding.surfaceInputOverlay.isFocusableInTouchMode = false
} }
override fun onDrawerClosed(drawerView: View) { override fun onDrawerClosed(drawerView: View) {
binding.drawerLayout.setDrawerLockMode(EmulationMenuSettings.drawerLockMode) binding.drawerLayout.setDrawerLockMode(EmulationMenuSettings.drawerLockMode)
binding.surfaceInputOverlay.isClickable = true
binding.surfaceInputOverlay.isFocusable = true
binding.surfaceInputOverlay.isFocusableInTouchMode = true
} }
override fun onDrawerStateChanged(newState: Int) { override fun onDrawerStateChanged(newState: Int) {
@ -412,6 +418,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
setInsets() setInsets()
} }
fun isDrawerOpen(): Boolean {
return binding.drawerLayout.isOpen
}
private fun togglePause() { private fun togglePause() {
if(emulationState.isPaused) { if(emulationState.isPaused) {
emulationState.unpause() emulationState.unpause()