diff options
5 files changed, 69 insertions, 63 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt index 4be9ade14..22f0a2646 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt @@ -283,6 +283,11 @@ object NativeLibrary { external fun isRunning(): Boolean /** + * Returns true if emulation is paused. + */ + external fun isPaused(): Boolean + + /** * Returns the performance stats for the current game */ external fun getPerfStats(): DoubleArray 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 e2eab3105..36cc27a05 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 @@ -271,8 +271,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { val pictureInPictureActions : MutableList<RemoteAction> = mutableListOf() val pendingFlags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - val isEmulationPaused = emulationFragment?.isEmulationStatePaused() ?: false - if (isEmulationPaused) { + if (NativeLibrary.isPaused()) { val playIcon = Icon.createWithResource(this@EmulationActivity, R.drawable.ic_pip_play) val playPendingIntent = PendingIntent.getBroadcast( this@EmulationActivity, R.drawable.ic_pip_play, Intent(actionPlay), pendingFlags @@ -303,9 +302,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { private var pictureInPictureReceiver = object : BroadcastReceiver() { override fun onReceive(context : Context?, intent : Intent) { if (intent.action == actionPlay) { - emulationFragment?.onPictureInPicturePlay() + if (NativeLibrary.isPaused()) NativeLibrary.unPauseEmulation() } else if (intent.action == actionPause) { - emulationFragment?.onPictureInPicturePause() + if (!NativeLibrary.isPaused()) NativeLibrary.pauseEmulation() } buildPictureInPictureParams() } @@ -320,12 +319,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { }.also { registerReceiver(pictureInPictureReceiver, it) } - emulationFragment?.onPictureInPictureEnter() } else { try { unregisterReceiver(pictureInPictureReceiver) } catch (ignored : Exception) { } - emulationFragment?.onPictureInPictureLeave() } } 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 5e37db46f..2f1a16f00 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 @@ -77,6 +77,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { emulationActivity = context NativeLibrary.setEmulationActivity(context) + lifecycleScope.launch(Dispatchers.Main) { + lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { + WindowInfoTracker.getOrCreate(context) + .windowLayoutInfo(context) + .collect { updateFoldableLayout(context, it) } + } + } + onReturnFromSettings = context.activityResultRegistry.register( "SettingsResult", ActivityResultContracts.StartActivityForResult() ) { @@ -198,14 +206,28 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - if (!isInFoldableLayout) { - if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { - binding.surfaceInputOverlay.setOrientation(InputOverlay.PORTRAIT) - } else { - binding.surfaceInputOverlay.setOrientation(InputOverlay.LANDSCAPE) + if (emulationActivity?.isInPictureInPictureMode == true) { + if (binding.drawerLayout.isOpen) { + binding.drawerLayout.close() + } + if (EmulationMenuSettings.showOverlay) { + binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.isVisible = false } + } + } else { + if (EmulationMenuSettings.showOverlay) { + binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.isVisible = true } + } + if (!isInFoldableLayout) { + if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + binding.surfaceInputOverlay.setOrientation(InputOverlay.PORTRAIT) + } else { + binding.surfaceInputOverlay.setOrientation(InputOverlay.LANDSCAPE) + } + } + if (!binding.surfaceInputOverlay.isInEditMode) { + refreshInputOverlay() } } - if (!binding.surfaceInputOverlay.isInEditMode) refreshInputOverlay() } override fun onResume() { @@ -247,37 +269,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { super.onDetach() } - fun isEmulationStatePaused() : Boolean { - return this::emulationState.isInitialized && emulationState.isPaused - } - - fun onPictureInPictureEnter() { - if (binding.drawerLayout.isOpen) { - binding.drawerLayout.close() - } - if (EmulationMenuSettings.showOverlay) { - binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.isVisible = false } - } - } - - fun onPictureInPicturePause() { - if (!emulationState.isPaused) { - emulationState.pause() - } - } - - fun onPictureInPicturePlay() { - if (emulationState.isPaused) { - emulationState.run(false) - } - } - - fun onPictureInPictureLeave() { - if (EmulationMenuSettings.showOverlay) { - binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.isVisible = true } - } - } - private fun refreshInputOverlay() { binding.surfaceInputOverlay.refreshControls() } @@ -338,7 +329,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private val Number.toPx get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt() - fun updateFoldableLayout(emulationActivity: EmulationActivity, newLayoutInfo: WindowLayoutInfo) { + private fun updateFoldableLayout(emulationActivity: EmulationActivity, newLayoutInfo: WindowLayoutInfo) { val isFolding = (newLayoutInfo.displayFeatures.find { it is FoldingFeature } as? FoldingFeature)?.let { if (it.isSeparating) { emulationActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 4091c23d1..f9617202b 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -202,6 +202,11 @@ public: return m_is_running; } + bool IsPaused() const { + std::scoped_lock lock(m_mutex); + return m_is_running && m_is_paused; + } + const Core::PerfStatsResults& PerfStats() const { std::scoped_lock m_perf_stats_lock(m_perf_stats_mutex); return m_perf_stats; @@ -287,11 +292,13 @@ public: void PauseEmulation() { std::scoped_lock lock(m_mutex); m_system.Pause(); + m_is_paused = true; } void UnPauseEmulation() { std::scoped_lock lock(m_mutex); m_system.Run(); + m_is_paused = false; } void HaltEmulation() { @@ -473,6 +480,7 @@ private: std::shared_ptr<FileSys::VfsFilesystem> m_vfs; Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized}; bool m_is_running{}; + bool m_is_paused{}; SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{}; std::unique_ptr<Service::Account::ProfileManager> m_profile_manager; @@ -583,6 +591,11 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isRunning([[maybe_unused]] JNIEnv return static_cast<jboolean>(EmulationSession::GetInstance().IsRunning()); } +jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isPaused([[maybe_unused]] JNIEnv* env, + [[maybe_unused]] jclass clazz) { + return static_cast<jboolean>(EmulationSession::GetInstance().IsPaused()); +} + jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isHandheldOnly([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) { return EmulationSession::GetInstance().IsHandheldOnly(); diff --git a/src/android/app/src/main/res/values/integers.xml b/src/android/app/src/main/res/values/integers.xml index 04280fae2..2dbe881e3 100644 --- a/src/android/app/src/main/res/values/integers.xml +++ b/src/android/app/src/main/res/values/integers.xml @@ -59,43 +59,43 @@ <integer name="SWITCH_BUTTON_MINUS_PORTRAIT_Y">950</integer> <integer name="SWITCH_BUTTON_PLUS_PORTRAIT_X">560</integer> <integer name="SWITCH_BUTTON_PLUS_PORTRAIT_Y">950</integer> - <integer name="SWITCH_BUTTON_HOME_PORTRAIT_X">600</integer> + <integer name="SWITCH_BUTTON_HOME_PORTRAIT_X">660</integer> <integer name="SWITCH_BUTTON_HOME_PORTRAIT_Y">950</integer> - <integer name="SWITCH_BUTTON_CAPTURE_PORTRAIT_X">400</integer> + <integer name="SWITCH_BUTTON_CAPTURE_PORTRAIT_X">320</integer> <integer name="SWITCH_BUTTON_CAPTURE_PORTRAIT_Y">950</integer> <integer name="SWITCH_BUTTON_DPAD_PORTRAIT_X">240</integer> <integer name="SWITCH_BUTTON_DPAD_PORTRAIT_Y">820</integer> <!-- Default SWITCH foldable layout --> <integer name="SWITCH_BUTTON_A_FOLDABLE_X">840</integer> - <integer name="SWITCH_BUTTON_A_FOLDABLE_Y">420</integer> + <integer name="SWITCH_BUTTON_A_FOLDABLE_Y">340</integer> <integer name="SWITCH_BUTTON_B_FOLDABLE_X">740</integer> - <integer name="SWITCH_BUTTON_B_FOLDABLE_Y">460</integer> + <integer name="SWITCH_BUTTON_B_FOLDABLE_Y">380</integer> <integer name="SWITCH_BUTTON_X_FOLDABLE_X">740</integer> - <integer name="SWITCH_BUTTON_X_FOLDABLE_Y">380</integer> + <integer name="SWITCH_BUTTON_X_FOLDABLE_Y">300</integer> <integer name="SWITCH_BUTTON_Y_FOLDABLE_X">640</integer> - <integer name="SWITCH_BUTTON_Y_FOLDABLE_Y">420</integer> + <integer name="SWITCH_BUTTON_Y_FOLDABLE_Y">340</integer> <integer name="SWITCH_STICK_L_FOLDABLE_X">180</integer> - <integer name="SWITCH_STICK_L_FOLDABLE_Y">240</integer> + <integer name="SWITCH_STICK_L_FOLDABLE_Y">200</integer> <integer name="SWITCH_STICK_R_FOLDABLE_X">820</integer> - <integer name="SWITCH_STICK_R_FOLDABLE_Y">240</integer> + <integer name="SWITCH_STICK_R_FOLDABLE_Y">200</integer> <integer name="SWITCH_TRIGGER_L_FOLDABLE_X">140</integer> - <integer name="SWITCH_TRIGGER_L_FOLDABLE_Y">100</integer> + <integer name="SWITCH_TRIGGER_L_FOLDABLE_Y">80</integer> <integer name="SWITCH_TRIGGER_R_FOLDABLE_X">860</integer> - <integer name="SWITCH_TRIGGER_R_FOLDABLE_Y">100</integer> + <integer name="SWITCH_TRIGGER_R_FOLDABLE_Y">80</integer> <integer name="SWITCH_TRIGGER_ZL_FOLDABLE_X">140</integer> - <integer name="SWITCH_TRIGGER_ZL_FOLDABLE_Y">40</integer> + <integer name="SWITCH_TRIGGER_ZL_FOLDABLE_Y">20</integer> <integer name="SWITCH_TRIGGER_ZR_FOLDABLE_X">860</integer> - <integer name="SWITCH_TRIGGER_ZR_FOLDABLE_Y">40</integer> + <integer name="SWITCH_TRIGGER_ZR_FOLDABLE_Y">20</integer> <integer name="SWITCH_BUTTON_MINUS_FOLDABLE_X">440</integer> - <integer name="SWITCH_BUTTON_MINUS_FOLDABLE_Y">550</integer> + <integer name="SWITCH_BUTTON_MINUS_FOLDABLE_Y">420</integer> <integer name="SWITCH_BUTTON_PLUS_FOLDABLE_X">560</integer> - <integer name="SWITCH_BUTTON_PLUS_FOLDABLE_Y">550</integer> - <integer name="SWITCH_BUTTON_HOME_FOLDABLE_X">600</integer> - <integer name="SWITCH_BUTTON_HOME_FOLDABLE_Y">550</integer> - <integer name="SWITCH_BUTTON_CAPTURE_FOLDABLE_X">400</integer> - <integer name="SWITCH_BUTTON_CAPTURE_FOLDABLE_Y">550</integer> + <integer name="SWITCH_BUTTON_PLUS_FOLDABLE_Y">420</integer> + <integer name="SWITCH_BUTTON_HOME_FOLDABLE_X">680</integer> + <integer name="SWITCH_BUTTON_HOME_FOLDABLE_Y">420</integer> + <integer name="SWITCH_BUTTON_CAPTURE_FOLDABLE_X">320</integer> + <integer name="SWITCH_BUTTON_CAPTURE_FOLDABLE_Y">420</integer> <integer name="SWITCH_BUTTON_DPAD_FOLDABLE_X">240</integer> - <integer name="SWITCH_BUTTON_DPAD_FOLDABLE_Y">420</integer> + <integer name="SWITCH_BUTTON_DPAD_FOLDABLE_Y">340</integer> </resources> |