summaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorGravatar Abandoned Cart2023-06-12 22:17:15 -0400
committerGravatar Abandoned Cart2023-06-14 16:35:56 -0400
commit724823c193e9c3aaa630547fc9f5ae562ea33077 (patch)
tree7f28035c09fe4f8f9d480683401968c43055d0e6 /src/android
parentandroid: Set layout by fragment, not view (diff)
downloadyuzu-724823c193e9c3aaa630547fc9f5ae562ea33077.tar.gz
yuzu-724823c193e9c3aaa630547fc9f5ae562ea33077.tar.xz
yuzu-724823c193e9c3aaa630547fc9f5ae562ea33077.zip
android: Remove PiP reliance on fragment
Diffstat (limited to 'src/android')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt5
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt9
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt67
-rw-r--r--src/android/app/src/main/jni/native.cpp13
-rw-r--r--src/android/app/src/main/res/values/integers.xml38
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 {
283 external fun isRunning(): Boolean 283 external fun isRunning(): Boolean
284 284
285 /** 285 /**
286 * Returns true if emulation is paused.
287 */
288 external fun isPaused(): Boolean
289
290 /**
286 * Returns the performance stats for the current game 291 * Returns the performance stats for the current game
287 */ 292 */
288 external fun getPerfStats(): DoubleArray 293 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 {
271 val pictureInPictureActions : MutableList<RemoteAction> = mutableListOf() 271 val pictureInPictureActions : MutableList<RemoteAction> = mutableListOf()
272 val pendingFlags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE 272 val pendingFlags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
273 273
274 val isEmulationPaused = emulationFragment?.isEmulationStatePaused() ?: false 274 if (NativeLibrary.isPaused()) {
275 if (isEmulationPaused) {
276 val playIcon = Icon.createWithResource(this@EmulationActivity, R.drawable.ic_pip_play) 275 val playIcon = Icon.createWithResource(this@EmulationActivity, R.drawable.ic_pip_play)
277 val playPendingIntent = PendingIntent.getBroadcast( 276 val playPendingIntent = PendingIntent.getBroadcast(
278 this@EmulationActivity, R.drawable.ic_pip_play, Intent(actionPlay), pendingFlags 277 this@EmulationActivity, R.drawable.ic_pip_play, Intent(actionPlay), pendingFlags
@@ -303,9 +302,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
303 private var pictureInPictureReceiver = object : BroadcastReceiver() { 302 private var pictureInPictureReceiver = object : BroadcastReceiver() {
304 override fun onReceive(context : Context?, intent : Intent) { 303 override fun onReceive(context : Context?, intent : Intent) {
305 if (intent.action == actionPlay) { 304 if (intent.action == actionPlay) {
306 emulationFragment?.onPictureInPicturePlay() 305 if (NativeLibrary.isPaused()) NativeLibrary.unPauseEmulation()
307 } else if (intent.action == actionPause) { 306 } else if (intent.action == actionPause) {
308 emulationFragment?.onPictureInPicturePause() 307 if (!NativeLibrary.isPaused()) NativeLibrary.pauseEmulation()
309 } 308 }
310 buildPictureInPictureParams() 309 buildPictureInPictureParams()
311 } 310 }
@@ -320,12 +319,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
320 }.also { 319 }.also {
321 registerReceiver(pictureInPictureReceiver, it) 320 registerReceiver(pictureInPictureReceiver, it)
322 } 321 }
323 emulationFragment?.onPictureInPictureEnter()
324 } else { 322 } else {
325 try { 323 try {
326 unregisterReceiver(pictureInPictureReceiver) 324 unregisterReceiver(pictureInPictureReceiver)
327 } catch (ignored : Exception) { } 325 } catch (ignored : Exception) { }
328 emulationFragment?.onPictureInPictureLeave()
329 } 326 }
330 } 327 }
331 328
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 {
77 emulationActivity = context 77 emulationActivity = context
78 NativeLibrary.setEmulationActivity(context) 78 NativeLibrary.setEmulationActivity(context)
79 79
80 lifecycleScope.launch(Dispatchers.Main) {
81 lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
82 WindowInfoTracker.getOrCreate(context)
83 .windowLayoutInfo(context)
84 .collect { updateFoldableLayout(context, it) }
85 }
86 }
87
80 onReturnFromSettings = context.activityResultRegistry.register( 88 onReturnFromSettings = context.activityResultRegistry.register(
81 "SettingsResult", ActivityResultContracts.StartActivityForResult() 89 "SettingsResult", ActivityResultContracts.StartActivityForResult()
82 ) { 90 ) {
@@ -198,14 +206,28 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
198 206
199 override fun onConfigurationChanged(newConfig: Configuration) { 207 override fun onConfigurationChanged(newConfig: Configuration) {
200 super.onConfigurationChanged(newConfig) 208 super.onConfigurationChanged(newConfig)
201 if (!isInFoldableLayout) { 209 if (emulationActivity?.isInPictureInPictureMode == true) {
202 if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 210 if (binding.drawerLayout.isOpen) {
203 binding.surfaceInputOverlay.setOrientation(InputOverlay.PORTRAIT) 211 binding.drawerLayout.close()
204 } else { 212 }
205 binding.surfaceInputOverlay.setOrientation(InputOverlay.LANDSCAPE) 213 if (EmulationMenuSettings.showOverlay) {
214 binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.isVisible = false }
215 }
216 } else {
217 if (EmulationMenuSettings.showOverlay) {
218 binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.isVisible = true }
219 }
220 if (!isInFoldableLayout) {
221 if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
222 binding.surfaceInputOverlay.setOrientation(InputOverlay.PORTRAIT)
223 } else {
224 binding.surfaceInputOverlay.setOrientation(InputOverlay.LANDSCAPE)
225 }
226 }
227 if (!binding.surfaceInputOverlay.isInEditMode) {
228 refreshInputOverlay()
206 } 229 }
207 } 230 }
208 if (!binding.surfaceInputOverlay.isInEditMode) refreshInputOverlay()
209 } 231 }
210 232
211 override fun onResume() { 233 override fun onResume() {
@@ -247,37 +269,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
247 super.onDetach() 269 super.onDetach()
248 } 270 }
249 271
250 fun isEmulationStatePaused() : Boolean {
251 return this::emulationState.isInitialized && emulationState.isPaused
252 }
253
254 fun onPictureInPictureEnter() {
255 if (binding.drawerLayout.isOpen) {
256 binding.drawerLayout.close()
257 }
258 if (EmulationMenuSettings.showOverlay) {
259 binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.isVisible = false }
260 }
261 }
262
263 fun onPictureInPicturePause() {
264 if (!emulationState.isPaused) {
265 emulationState.pause()
266 }
267 }
268
269 fun onPictureInPicturePlay() {
270 if (emulationState.isPaused) {
271 emulationState.run(false)
272 }
273 }
274
275 fun onPictureInPictureLeave() {
276 if (EmulationMenuSettings.showOverlay) {
277 binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.isVisible = true }
278 }
279 }
280
281 private fun refreshInputOverlay() { 272 private fun refreshInputOverlay() {
282 binding.surfaceInputOverlay.refreshControls() 273 binding.surfaceInputOverlay.refreshControls()
283 } 274 }
@@ -338,7 +329,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
338 329
339 private val Number.toPx get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt() 330 private val Number.toPx get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt()
340 331
341 fun updateFoldableLayout(emulationActivity: EmulationActivity, newLayoutInfo: WindowLayoutInfo) { 332 private fun updateFoldableLayout(emulationActivity: EmulationActivity, newLayoutInfo: WindowLayoutInfo) {
342 val isFolding = (newLayoutInfo.displayFeatures.find { it is FoldingFeature } as? FoldingFeature)?.let { 333 val isFolding = (newLayoutInfo.displayFeatures.find { it is FoldingFeature } as? FoldingFeature)?.let {
343 if (it.isSeparating) { 334 if (it.isSeparating) {
344 emulationActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 335 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:
202 return m_is_running; 202 return m_is_running;
203 } 203 }
204 204
205 bool IsPaused() const {
206 std::scoped_lock lock(m_mutex);
207 return m_is_running && m_is_paused;
208 }
209
205 const Core::PerfStatsResults& PerfStats() const { 210 const Core::PerfStatsResults& PerfStats() const {
206 std::scoped_lock m_perf_stats_lock(m_perf_stats_mutex); 211 std::scoped_lock m_perf_stats_lock(m_perf_stats_mutex);
207 return m_perf_stats; 212 return m_perf_stats;
@@ -287,11 +292,13 @@ public:
287 void PauseEmulation() { 292 void PauseEmulation() {
288 std::scoped_lock lock(m_mutex); 293 std::scoped_lock lock(m_mutex);
289 m_system.Pause(); 294 m_system.Pause();
295 m_is_paused = true;
290 } 296 }
291 297
292 void UnPauseEmulation() { 298 void UnPauseEmulation() {
293 std::scoped_lock lock(m_mutex); 299 std::scoped_lock lock(m_mutex);
294 m_system.Run(); 300 m_system.Run();
301 m_is_paused = false;
295 } 302 }
296 303
297 void HaltEmulation() { 304 void HaltEmulation() {
@@ -473,6 +480,7 @@ private:
473 std::shared_ptr<FileSys::VfsFilesystem> m_vfs; 480 std::shared_ptr<FileSys::VfsFilesystem> m_vfs;
474 Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized}; 481 Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized};
475 bool m_is_running{}; 482 bool m_is_running{};
483 bool m_is_paused{};
476 SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{}; 484 SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{};
477 std::unique_ptr<Service::Account::ProfileManager> m_profile_manager; 485 std::unique_ptr<Service::Account::ProfileManager> m_profile_manager;
478 486
@@ -583,6 +591,11 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isRunning([[maybe_unused]] JNIEnv
583 return static_cast<jboolean>(EmulationSession::GetInstance().IsRunning()); 591 return static_cast<jboolean>(EmulationSession::GetInstance().IsRunning());
584} 592}
585 593
594jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isPaused([[maybe_unused]] JNIEnv* env,
595 [[maybe_unused]] jclass clazz) {
596 return static_cast<jboolean>(EmulationSession::GetInstance().IsPaused());
597}
598
586jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isHandheldOnly([[maybe_unused]] JNIEnv* env, 599jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isHandheldOnly([[maybe_unused]] JNIEnv* env,
587 [[maybe_unused]] jclass clazz) { 600 [[maybe_unused]] jclass clazz) {
588 return EmulationSession::GetInstance().IsHandheldOnly(); 601 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 @@
59 <integer name="SWITCH_BUTTON_MINUS_PORTRAIT_Y">950</integer> 59 <integer name="SWITCH_BUTTON_MINUS_PORTRAIT_Y">950</integer>
60 <integer name="SWITCH_BUTTON_PLUS_PORTRAIT_X">560</integer> 60 <integer name="SWITCH_BUTTON_PLUS_PORTRAIT_X">560</integer>
61 <integer name="SWITCH_BUTTON_PLUS_PORTRAIT_Y">950</integer> 61 <integer name="SWITCH_BUTTON_PLUS_PORTRAIT_Y">950</integer>
62 <integer name="SWITCH_BUTTON_HOME_PORTRAIT_X">600</integer> 62 <integer name="SWITCH_BUTTON_HOME_PORTRAIT_X">660</integer>
63 <integer name="SWITCH_BUTTON_HOME_PORTRAIT_Y">950</integer> 63 <integer name="SWITCH_BUTTON_HOME_PORTRAIT_Y">950</integer>
64 <integer name="SWITCH_BUTTON_CAPTURE_PORTRAIT_X">400</integer> 64 <integer name="SWITCH_BUTTON_CAPTURE_PORTRAIT_X">320</integer>
65 <integer name="SWITCH_BUTTON_CAPTURE_PORTRAIT_Y">950</integer> 65 <integer name="SWITCH_BUTTON_CAPTURE_PORTRAIT_Y">950</integer>
66 <integer name="SWITCH_BUTTON_DPAD_PORTRAIT_X">240</integer> 66 <integer name="SWITCH_BUTTON_DPAD_PORTRAIT_X">240</integer>
67 <integer name="SWITCH_BUTTON_DPAD_PORTRAIT_Y">820</integer> 67 <integer name="SWITCH_BUTTON_DPAD_PORTRAIT_Y">820</integer>
68 68
69 <!-- Default SWITCH foldable layout --> 69 <!-- Default SWITCH foldable layout -->
70 <integer name="SWITCH_BUTTON_A_FOLDABLE_X">840</integer> 70 <integer name="SWITCH_BUTTON_A_FOLDABLE_X">840</integer>
71 <integer name="SWITCH_BUTTON_A_FOLDABLE_Y">420</integer> 71 <integer name="SWITCH_BUTTON_A_FOLDABLE_Y">340</integer>
72 <integer name="SWITCH_BUTTON_B_FOLDABLE_X">740</integer> 72 <integer name="SWITCH_BUTTON_B_FOLDABLE_X">740</integer>
73 <integer name="SWITCH_BUTTON_B_FOLDABLE_Y">460</integer> 73 <integer name="SWITCH_BUTTON_B_FOLDABLE_Y">380</integer>
74 <integer name="SWITCH_BUTTON_X_FOLDABLE_X">740</integer> 74 <integer name="SWITCH_BUTTON_X_FOLDABLE_X">740</integer>
75 <integer name="SWITCH_BUTTON_X_FOLDABLE_Y">380</integer> 75 <integer name="SWITCH_BUTTON_X_FOLDABLE_Y">300</integer>
76 <integer name="SWITCH_BUTTON_Y_FOLDABLE_X">640</integer> 76 <integer name="SWITCH_BUTTON_Y_FOLDABLE_X">640</integer>
77 <integer name="SWITCH_BUTTON_Y_FOLDABLE_Y">420</integer> 77 <integer name="SWITCH_BUTTON_Y_FOLDABLE_Y">340</integer>
78 <integer name="SWITCH_STICK_L_FOLDABLE_X">180</integer> 78 <integer name="SWITCH_STICK_L_FOLDABLE_X">180</integer>
79 <integer name="SWITCH_STICK_L_FOLDABLE_Y">240</integer> 79 <integer name="SWITCH_STICK_L_FOLDABLE_Y">200</integer>
80 <integer name="SWITCH_STICK_R_FOLDABLE_X">820</integer> 80 <integer name="SWITCH_STICK_R_FOLDABLE_X">820</integer>
81 <integer name="SWITCH_STICK_R_FOLDABLE_Y">240</integer> 81 <integer name="SWITCH_STICK_R_FOLDABLE_Y">200</integer>
82 <integer name="SWITCH_TRIGGER_L_FOLDABLE_X">140</integer> 82 <integer name="SWITCH_TRIGGER_L_FOLDABLE_X">140</integer>
83 <integer name="SWITCH_TRIGGER_L_FOLDABLE_Y">100</integer> 83 <integer name="SWITCH_TRIGGER_L_FOLDABLE_Y">80</integer>
84 <integer name="SWITCH_TRIGGER_R_FOLDABLE_X">860</integer> 84 <integer name="SWITCH_TRIGGER_R_FOLDABLE_X">860</integer>
85 <integer name="SWITCH_TRIGGER_R_FOLDABLE_Y">100</integer> 85 <integer name="SWITCH_TRIGGER_R_FOLDABLE_Y">80</integer>
86 <integer name="SWITCH_TRIGGER_ZL_FOLDABLE_X">140</integer> 86 <integer name="SWITCH_TRIGGER_ZL_FOLDABLE_X">140</integer>
87 <integer name="SWITCH_TRIGGER_ZL_FOLDABLE_Y">40</integer> 87 <integer name="SWITCH_TRIGGER_ZL_FOLDABLE_Y">20</integer>
88 <integer name="SWITCH_TRIGGER_ZR_FOLDABLE_X">860</integer> 88 <integer name="SWITCH_TRIGGER_ZR_FOLDABLE_X">860</integer>
89 <integer name="SWITCH_TRIGGER_ZR_FOLDABLE_Y">40</integer> 89 <integer name="SWITCH_TRIGGER_ZR_FOLDABLE_Y">20</integer>
90 <integer name="SWITCH_BUTTON_MINUS_FOLDABLE_X">440</integer> 90 <integer name="SWITCH_BUTTON_MINUS_FOLDABLE_X">440</integer>
91 <integer name="SWITCH_BUTTON_MINUS_FOLDABLE_Y">550</integer> 91 <integer name="SWITCH_BUTTON_MINUS_FOLDABLE_Y">420</integer>
92 <integer name="SWITCH_BUTTON_PLUS_FOLDABLE_X">560</integer> 92 <integer name="SWITCH_BUTTON_PLUS_FOLDABLE_X">560</integer>
93 <integer name="SWITCH_BUTTON_PLUS_FOLDABLE_Y">550</integer> 93 <integer name="SWITCH_BUTTON_PLUS_FOLDABLE_Y">420</integer>
94 <integer name="SWITCH_BUTTON_HOME_FOLDABLE_X">600</integer> 94 <integer name="SWITCH_BUTTON_HOME_FOLDABLE_X">680</integer>
95 <integer name="SWITCH_BUTTON_HOME_FOLDABLE_Y">550</integer> 95 <integer name="SWITCH_BUTTON_HOME_FOLDABLE_Y">420</integer>
96 <integer name="SWITCH_BUTTON_CAPTURE_FOLDABLE_X">400</integer> 96 <integer name="SWITCH_BUTTON_CAPTURE_FOLDABLE_X">320</integer>
97 <integer name="SWITCH_BUTTON_CAPTURE_FOLDABLE_Y">550</integer> 97 <integer name="SWITCH_BUTTON_CAPTURE_FOLDABLE_Y">420</integer>
98 <integer name="SWITCH_BUTTON_DPAD_FOLDABLE_X">240</integer> 98 <integer name="SWITCH_BUTTON_DPAD_FOLDABLE_X">240</integer>
99 <integer name="SWITCH_BUTTON_DPAD_FOLDABLE_Y">420</integer> 99 <integer name="SWITCH_BUTTON_DPAD_FOLDABLE_Y">340</integer>
100 100
101</resources> 101</resources>