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> | 
