aboutsummaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorxbzk <xbzk@eden-emu.dev>2026-01-18 16:11:31 +0100
committercrueter <crueter@eden-emu.dev>2026-01-18 16:11:31 +0100
commitd72553f519b99a56eeeeaa894cf304136d2b758e (patch)
tree9ad9cb898b4e745ccbf942a5d2ef8bf77bb7a076 /src/android
parent291b5febecdee943a630aaa884f25c5d4d6688d1 (diff)
fixes joypad overlay autohide during holding actions (#3337)
fixes joypad overlay autohide during holding actions suppose holding right to move character. that wouldn't clear autohide countdown, and it also would deny other touches to do so. i guess this was buried coz those who truly use joypad overlay don't use autohide. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3337 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Co-authored-by: xbzk <xbzk@eden-emu.dev> Co-committed-by: xbzk <xbzk@eden-emu.dev>
Diffstat (limited to 'src/android')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt60
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt7
2 files changed, 47 insertions, 20 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
index 0503c3edba..8ef85a6ff9 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
@@ -134,6 +134,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
private var amiiboLoadJob: Job? = null
private var wasInputOverlayAutoHidden = false
+ private var overlayTouchActive = false
private val loadAmiiboLauncher =
registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri ->
@@ -1123,6 +1124,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
super.onDestroyView()
amiiboLoadJob?.cancel()
amiiboLoadJob = null
+ _binding?.surfaceInputOverlay?.touchEventListener = null
_binding = null
isAmiiboPickerOpen = false
}
@@ -1173,10 +1175,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
}
binding.showStatsOverlayText.setVisible(showPerfOverlay)
if (showPerfOverlay) {
- val SYSTEM_FPS = 0
+ //val SYSTEM_FPS = 0
val FPS = 1
val FRAMETIME = 2
- val SPEED = 3
+ //val SPEED = 3
val sb = StringBuilder()
perfStatsUpdater = {
if (emulationViewModel.emulationStarted.value &&
@@ -2000,46 +2002,63 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
handler.postDelayed({
if (showInputOverlay && isAdded && _binding != null) {
- autoHideOverlay()
+ if (overlayTouchActive) {
+ startOverlayAutoHideTimer(seconds)
+ } else {
+ autoHideOverlay()
+ }
}
}, seconds * 1000L)
}
fun handleScreenTap(isLongTap: Boolean) {
-
+ if (!isAdded || _binding == null) return
if (binding.surfaceInputOverlay.isGamelessMode()) return
-
- val shouldProceed = BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean()
- if (!shouldProceed) return
-
+ if (!BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean()) return
// failsafe
val autoHideSeconds = IntSetting.INPUT_OVERLAY_AUTO_HIDE.getInt()
if (autoHideSeconds == 0) {
toggleOverlay(true)
- return
- }
-
- val showInputOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()
- if (!showInputOverlay && !isLongTap && wasInputOverlayAutoHidden) {
- toggleOverlay(true)
+ } else {
+ val showInputOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()
+ if (!showInputOverlay && !isLongTap && wasInputOverlayAutoHidden) {
+ toggleOverlay(true)
+ }
+ startOverlayAutoHideTimer(autoHideSeconds)
}
-
- startOverlayAutoHideTimer(autoHideSeconds)
}
private fun initializeOverlayAutoHide() {
- if (binding.surfaceInputOverlay.isGamelessMode()) {
- return
- }
+ if (!isAdded || _binding == null) return
+ if (binding.surfaceInputOverlay.isGamelessMode()) return
val autoHideSeconds = IntSetting.INPUT_OVERLAY_AUTO_HIDE.getInt()
val autoHideEnabled = BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean()
val showInputOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()
-
if (autoHideEnabled && showInputOverlay) {
toggleOverlay(true)
startOverlayAutoHideTimer(autoHideSeconds)
}
+
+ binding.surfaceInputOverlay.touchEventListener = { event ->
+ when (event.actionMasked) {
+ MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN -> {
+ overlayTouchActive = true
+ handler.removeCallbacksAndMessages(null)
+ }
+ MotionEvent.ACTION_UP, MotionEvent.ACTION_POINTER_UP -> {
+ overlayTouchActive = event.pointerCount > 1
+ if (!overlayTouchActive) handleScreenTap(isLongTap = false)
+ }
+ MotionEvent.ACTION_CANCEL -> {
+ overlayTouchActive = false
+ handleScreenTap(isLongTap = false)
+ }
+ MotionEvent.ACTION_MOVE -> {
+ overlayTouchActive = true
+ }
+ }
+ }
}
private fun autoHideOverlay() {
@@ -2048,6 +2067,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
}
fun toggleOverlay(enable: Boolean) {
+ if (!isAdded || _binding == null) return
if (enable == !BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) {
// Reset controller input flag so controller can hide overlay again
if (!enable) {
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
index d1252fc3c4..e18077c673 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
@@ -73,6 +73,9 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
var layout = OverlayLayout.Landscape
+ // External listener for EmulationFragment joypad overlay auto-hide
+ var touchEventListener: ((MotionEvent) -> Unit)? = null
+
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
@@ -138,6 +141,10 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
}
override fun onTouch(v: View, event: MotionEvent): Boolean {
+ try {
+ touchEventListener?.invoke(event)
+ } catch (e: Exception) {}
+
if (inEditMode) {
return onTouchWhileEditing(event)
}