diff options
| author | 2023-06-12 22:17:15 -0400 | |
|---|---|---|
| committer | 2023-06-14 16:35:56 -0400 | |
| commit | 724823c193e9c3aaa630547fc9f5ae562ea33077 (patch) | |
| tree | 7f28035c09fe4f8f9d480683401968c43055d0e6 /src/android | |
| parent | android: Set layout by fragment, not view (diff) | |
| download | yuzu-724823c193e9c3aaa630547fc9f5ae562ea33077.tar.gz yuzu-724823c193e9c3aaa630547fc9f5ae562ea33077.tar.xz yuzu-724823c193e9c3aaa630547fc9f5ae562ea33077.zip | |
android: Remove PiP reliance on fragment
Diffstat (limited to 'src/android')
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 | ||
| 594 | jboolean 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 | |||
| 586 | jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isHandheldOnly([[maybe_unused]] JNIEnv* env, | 599 | jboolean 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> |