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 44290fd4b6..d01bf81ce5 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 @@ -246,6 +246,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager nfcReader.startScanning() startMotionSensorListener() InputHandler.updateControllerData() + notifyPhysicalControllerState() buildPictureInPictureParams() } @@ -469,29 +470,30 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager override fun onInputDeviceAdded(deviceId: Int) { if (isGameController(deviceId)) { InputHandler.updateControllerData() - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment - val emulationFragment = - navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment - emulationFragment?.onControllerConnected() + notifyPhysicalControllerState() } } override fun onInputDeviceRemoved(deviceId: Int) { InputHandler.updateControllerData() - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment - val emulationFragment = - navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment - emulationFragment?.onControllerDisconnected() + notifyPhysicalControllerState() } override fun onInputDeviceChanged(deviceId: Int) { if (isGameController(deviceId)) { InputHandler.updateControllerData() + notifyPhysicalControllerState() } } + private fun notifyPhysicalControllerState() { + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment + val emulationFragment = + navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment + emulationFragment?.onPhysicalControllerStateChanged(InputHandler.androidControllers.isNotEmpty()) + } + override fun onSensorChanged(event: SensorEvent) { if (!NativeLibrary.isRunning() || NativeLibrary.isPaused()) { return 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 3d3749d4b3..a4c9eb9039 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 @@ -90,6 +90,7 @@ import org.yuzu.yuzu_emu.utils.FileUtil import org.yuzu.yuzu_emu.utils.GameHelper import org.yuzu.yuzu_emu.utils.GameIconUtils import org.yuzu.yuzu_emu.utils.GpuDriverHelper +import org.yuzu.yuzu_emu.utils.InputHandler import org.yuzu.yuzu_emu.utils.Log import org.yuzu.yuzu_emu.utils.NativeConfig import org.yuzu.yuzu_emu.utils.NativeFreedrenoConfig @@ -114,6 +115,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { val handler = Handler(Looper.getMainLooper()) private var controllerInputReceived = false + private var hasPhysicalControllerConnected = false + private var overlayHiddenByPhysicalController = false private var _binding: FragmentEmulationBinding? = null @@ -666,6 +669,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { driverInUse = driverViewModel.selectedDriverVersion.value updateQuickOverlayMenuEntry(BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) + onPhysicalControllerStateChanged(InputHandler.androidControllers.isNotEmpty()) binding.surfaceEmulation.holder.addCallback(this) binding.doneControlConfig.setOnClickListener { stopConfiguringControls() } @@ -760,11 +764,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { R.id.menu_quick_overlay -> { val newState = !BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() - BooleanSetting.SHOW_INPUT_OVERLAY.setBoolean(newState) - updateQuickOverlayMenuEntry(newState) - binding.surfaceInputOverlay.refreshControls() - // Sync view visibility with the setting toggleOverlay(newState) + updateQuickOverlayMenuEntry(BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) NativeConfig.saveGlobalConfig() true } @@ -1053,7 +1054,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { val shouldShowOverlay = if (args.overlayGamelessEditMode) { true } else { - showInputOverlay && emulationViewModel.emulationStarted.value + showInputOverlay && emulationViewModel.emulationStarted.value && + !hasPhysicalControllerConnected } b.surfaceInputOverlay.setVisible(shouldShowOverlay) if (!isInFoldableLayout) { @@ -2497,6 +2499,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { fun toggleOverlay(enable: Boolean) { if (!isAdded || _binding == null) return + if (enable && hasPhysicalControllerConnected && !args.overlayGamelessEditMode) return if (enable == !BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) { // Reset controller input flag so controller can hide overlay again if (!enable) { @@ -2520,13 +2523,30 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } fun onControllerConnected() { - controllerInputReceived = false + onPhysicalControllerStateChanged(InputHandler.androidControllers.isNotEmpty()) } fun onControllerDisconnected() { - if (!BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT.getBoolean()) return - if (!BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) return + onPhysicalControllerStateChanged(InputHandler.androidControllers.isNotEmpty()) + } + + fun onPhysicalControllerStateChanged(hasConnectedControllers: Boolean) { + hasPhysicalControllerConnected = hasConnectedControllers controllerInputReceived = false - toggleOverlay(true) + if (!isAdded || _binding == null) return + if (binding.surfaceInputOverlay.isGamelessMode()) return + + if (hasConnectedControllers) { + if (BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) { + overlayHiddenByPhysicalController = true + toggleOverlay(false) + } + return + } + + if (overlayHiddenByPhysicalController) { + overlayHiddenByPhysicalController = false + toggleOverlay(true) + } } }