diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 2dba024592..42d4f687f4 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt @@ -582,7 +582,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean() && !BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT.getBoolean()) { fragment.handler.removeCallbacksAndMessages(null) - fragment.showOverlay() + fragment.toggleOverlay(true) } } MotionEvent.ACTION_UP -> { 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 1bac1bd1ed..0503c3edba 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 @@ -105,7 +105,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private var socUpdater: (() -> Unit)? = null val handler = Handler(Looper.getMainLooper()) - private var isOverlayVisible = true + private var controllerInputReceived = false private var _binding: FragmentEmulationBinding? = null @@ -133,6 +133,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private var isAmiiboPickerOpen = false private var amiiboLoadJob: Job? = null + private var wasInputOverlayAutoHidden = false + private val loadAmiiboLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri -> isAmiiboPickerOpen = false @@ -712,11 +714,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { updateQuickOverlayMenuEntry(newState) binding.surfaceInputOverlay.refreshControls() // Sync view visibility with the setting - if (newState) { - showOverlay() - } else { - hideOverlay() - } + toggleOverlay(newState) NativeConfig.saveGlobalConfig() true } @@ -1164,7 +1162,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { @SuppressLint("DefaultLocale") private fun updateShowStatsOverlay() { - val showOverlay = BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean() + val showPerfOverlay = BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean() binding.showStatsOverlayText.apply { setTextColor( MaterialColors.getColor( @@ -1173,8 +1171,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { ) ) } - binding.showStatsOverlayText.setVisible(showOverlay) - if (showOverlay) { + binding.showStatsOverlayText.setVisible(showPerfOverlay) + if (showPerfOverlay) { val SYSTEM_FPS = 0 val FPS = 1 val FRAMETIME = 2 @@ -1351,7 +1349,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } private fun updateSocOverlay() { - val showOverlay = BooleanSetting.SHOW_SOC_OVERLAY.getBoolean() + val showSOCOverlay = BooleanSetting.SHOW_SOC_OVERLAY.getBoolean() binding.showSocOverlayText.apply { setTextColor( MaterialColors.getColor( @@ -1360,9 +1358,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { ) ) } - binding.showSocOverlayText.setVisible(showOverlay) + binding.showSocOverlayText.setVisible(showSOCOverlay) - if (showOverlay) { + if (showSOCOverlay) { val sb = StringBuilder() socUpdater = { @@ -1674,9 +1672,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { R.id.menu_show_overlay -> { it.isChecked = !it.isChecked - BooleanSetting.SHOW_INPUT_OVERLAY.setBoolean(it.isChecked) - updateQuickOverlayMenuEntry(it.isChecked) - binding.surfaceInputOverlay.refreshControls() + toggleOverlay(it.isChecked) true } @@ -2000,34 +1996,32 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private fun startOverlayAutoHideTimer(seconds: Int) { handler.removeCallbacksAndMessages(null) + val showInputOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() handler.postDelayed({ - if (isOverlayVisible && isAdded && _binding != null) { - hideOverlay() + if (showInputOverlay && isAdded && _binding != null) { + autoHideOverlay() } }, seconds * 1000L) } fun handleScreenTap(isLongTap: Boolean) { - if (binding.surfaceInputOverlay.isGamelessMode()) { - return - } - val autoHideSeconds = IntSetting.INPUT_OVERLAY_AUTO_HIDE.getInt() - val shouldProceed = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() && BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean() + if (binding.surfaceInputOverlay.isGamelessMode()) return - if (!shouldProceed) { - return - } + val shouldProceed = BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean() + if (!shouldProceed) return // failsafe + val autoHideSeconds = IntSetting.INPUT_OVERLAY_AUTO_HIDE.getInt() if (autoHideSeconds == 0) { - showOverlay() + toggleOverlay(true) return } - if (!isOverlayVisible && !isLongTap) { - showOverlay() + val showInputOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() + if (!showInputOverlay && !isLongTap && wasInputOverlayAutoHidden) { + toggleOverlay(true) } startOverlayAutoHideTimer(autoHideSeconds) @@ -2040,28 +2034,31 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { val autoHideSeconds = IntSetting.INPUT_OVERLAY_AUTO_HIDE.getInt() val autoHideEnabled = BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean() - val showOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() + val showInputOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() - if (autoHideEnabled && showOverlay) { - showOverlay() + if (autoHideEnabled && showInputOverlay) { + toggleOverlay(true) startOverlayAutoHideTimer(autoHideSeconds) } } - - fun showOverlay() { - if (!isOverlayVisible) { - isOverlayVisible = true - // Reset controller input flag so controller can hide overlay again - controllerInputReceived = false - ViewUtils.showView(binding.surfaceInputOverlay, 500) - } + private fun autoHideOverlay() { + toggleOverlay(false) + wasInputOverlayAutoHidden = true } - private fun hideOverlay() { - if (isOverlayVisible) { - isOverlayVisible = false - ViewUtils.hideView(binding.surfaceInputOverlay) + fun toggleOverlay(enable: Boolean) { + if (enable == !BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) { + // Reset controller input flag so controller can hide overlay again + if (!enable) { + controllerInputReceived = false + } + if (enable) { + wasInputOverlayAutoHidden = false + } + BooleanSetting.SHOW_INPUT_OVERLAY.setBoolean(enable) + updateQuickOverlayMenuEntry(enable) + binding.surfaceInputOverlay.refreshControls() } } @@ -2070,7 +2067,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { if (!BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) return if (controllerInputReceived) return controllerInputReceived = true - hideOverlay() + autoHideOverlay() } fun onControllerConnected() { @@ -2081,6 +2078,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { if (!BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT.getBoolean()) return if (!BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) return controllerInputReceived = false - showOverlay() + toggleOverlay(true) } }