1
0
Fork 0

Merge pull request #102802 from syntaxerror247/fix_orientation_handling

Android Editor: Fix embed mode orientation handling
This commit is contained in:
Rémi Verschelde 2025-02-13 23:35:12 +01:00
commit 3787cc4901
No known key found for this signature in database
GPG Key ID: C3336907360768E1
1 changed files with 27 additions and 4 deletions

View File

@ -30,6 +30,7 @@
package org.godotengine.editor.embed package org.godotengine.editor.embed
import android.content.pm.ActivityInfo
import android.os.Bundle import android.os.Bundle
import android.view.Gravity import android.view.Gravity
import android.view.MotionEvent import android.view.MotionEvent
@ -63,6 +64,9 @@ class EmbeddedGodotGame : GodotGame() {
private var layoutWidthInPx = 0 private var layoutWidthInPx = 0
private var layoutHeightInPx = 0 private var layoutHeightInPx = 0
private var gameRequestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
private var isFullscreen = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -81,15 +85,28 @@ class EmbeddedGodotGame : GodotGame() {
window.attributes = layoutParams window.attributes = layoutParams
} }
override fun setRequestedOrientation(requestedOrientation: Int) {
// Allow orientation change only if fullscreen mode is active
// or if the requestedOrientation is landscape (i.e switching to default).
if (isFullscreen || requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE) {
super.setRequestedOrientation(requestedOrientation)
} else {
// Cache the requestedOrientation to apply when switching to fullscreen.
gameRequestedOrientation = requestedOrientation
}
}
override fun dispatchTouchEvent(event: MotionEvent): Boolean { override fun dispatchTouchEvent(event: MotionEvent): Boolean {
when (event.actionMasked) { when (event.actionMasked) {
MotionEvent.ACTION_OUTSIDE -> { MotionEvent.ACTION_OUTSIDE -> {
if (!isFullscreen) {
if (gameMenuFragment?.isAlwaysOnTop() == true) { if (gameMenuFragment?.isAlwaysOnTop() == true) {
enterPiPMode() enterPiPMode()
} else { } else {
minimizeGameWindow() minimizeGameWindow()
} }
} }
}
MotionEvent.ACTION_MOVE -> { MotionEvent.ACTION_MOVE -> {
// val layoutParams = window.attributes // val layoutParams = window.attributes
@ -127,12 +144,18 @@ class EmbeddedGodotGame : GodotGame() {
override fun onFullScreenUpdated(enabled: Boolean) { override fun onFullScreenUpdated(enabled: Boolean) {
godot?.enableImmersiveMode(enabled) godot?.enableImmersiveMode(enabled)
isFullscreen = enabled
if (enabled) { if (enabled) {
layoutWidthInPx = FULL_SCREEN_WIDTH layoutWidthInPx = FULL_SCREEN_WIDTH
layoutHeightInPx = FULL_SCREEN_HEIGHT layoutHeightInPx = FULL_SCREEN_HEIGHT
requestedOrientation = gameRequestedOrientation
} else { } else {
layoutWidthInPx = defaultWidthInPx layoutWidthInPx = defaultWidthInPx
layoutHeightInPx = defaultHeightInPx layoutHeightInPx = defaultHeightInPx
// Cache the last used orientation in fullscreen to reapply when re-entering fullscreen.
gameRequestedOrientation = requestedOrientation
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE
} }
updateWindowDimensions(layoutWidthInPx, layoutHeightInPx) updateWindowDimensions(layoutWidthInPx, layoutHeightInPx)
} }