From cd21878cbaefb056742dbdecd3e0061d86f89c6b Mon Sep 17 00:00:00 2001 From: Auki Date: Sun, 9 Nov 2025 10:58:05 +0300 Subject: [PATCH 1/6] Android: Fix white bars by enabling immersive with WindowInsetsController (API 30+) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem ------- After upgrading to Qt 6.10 / NDK 27, Android started reserving system UI space again (navigation/status bars), leaving a visible white strip outside the Qt window. Previous builds implicitly/explicitly hid bars, but no immersive flags were applied in the current tree. Cause ----- Qt now defaults to edge-to-edge without hiding system bars. Since we weren’t requesting immersive mode, Android kept the nav/status areas visible, appearing as white gaps on tablets. Fix --- Use the modern WindowInsetsController API (API 30+) to enter immersive mode and allow swipe-to-reveal of system bars: - Added goImmersive(): * getWindow().setDecorFitsSystemWindows(false) * insetsController.hide(Type.statusBars | Type.navigationBars) * setSystemBarsBehavior(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) - Call goImmersive() from onCreate() and onWindowFocusChanged(true) Notes ----- - This change only applies on API 30+ (guarded by Build.VERSION.SDK_INT). Older devices keep current behavior (no legacy flags added in this commit). - No theme or color changes included; this strictly restores full screen usage by hiding system bars on Android 11+. Result ------ QGC launches fully immersive on API 30+ devices (no white bars at top or bottom). Users can swipe from the edge to transiently reveal system bars, per Android guidelines. --- .../mavlink/qgroundcontrol/QGCActivity.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java index bf6c39597dd9..27d9b5f75ecf 100644 --- a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java +++ b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java @@ -47,6 +47,21 @@ public static QGCActivity getInstance() { return m_instance; } + private void goImmersive() { + if (Build.VERSION.SDK_INT >= 30) { + // Modern way + getWindow().setDecorFitsSystemWindows(false); // content goes edge-to-edge + + final WindowInsetsController c = getWindow().getInsetsController(); + if (c != null) { + c.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); + c.setSystemBarsBehavior( + WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + ); + } + } + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -55,10 +70,17 @@ public void onCreate(Bundle savedInstanceState) { acquireWakeLock(); keepScreenOn(); setupMulticastLock(); + goImmersive(); QGCUsbSerialManager.initialize(this); } + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (hasFocus) goImmersive(); // <-- re-apply when regaining focus + } + @Override protected void onDestroy() { try { From 0b95ca38586606924d2b68e2e06fe2f3d3143ad6 Mon Sep 17 00:00:00 2001 From: Auki Date: Sun, 9 Nov 2025 11:53:00 +0300 Subject: [PATCH 2/6] import fix --- android/src/org/mavlink/qgroundcontrol/QGCActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java index 27d9b5f75ecf..d2fb187fb168 100644 --- a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java +++ b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java @@ -4,6 +4,7 @@ import java.util.List; import java.lang.reflect.Method; + import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; From 6fdd6236e0129d61fe8c76ad1defb8e25a6dbf99 Mon Sep 17 00:00:00 2001 From: Auki Date: Sun, 9 Nov 2025 11:55:47 +0300 Subject: [PATCH 3/6] import fix --- android/src/org/mavlink/qgroundcontrol/QGCActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java index d2fb187fb168..84e4f9214713 100644 --- a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java +++ b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java @@ -4,7 +4,8 @@ import java.util.List; import java.lang.reflect.Method; - +import android.view.WindowInsets; +import android.view.WindowInsetsController; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; From ba723c810849df3573efffe49936e4efa9b30d28 Mon Sep 17 00:00:00 2001 From: Auki Date: Thu, 13 Nov 2025 12:21:43 +0300 Subject: [PATCH 4/6] Used build in QtDisplayManager.java --- .../mavlink/qgroundcontrol/QGCActivity.java | 24 ------------------- src/UI/MainWindow.qml | 3 +++ 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java index 84e4f9214713..bf6c39597dd9 100644 --- a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java +++ b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java @@ -4,8 +4,6 @@ import java.util.List; import java.lang.reflect.Method; -import android.view.WindowInsets; -import android.view.WindowInsetsController; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -49,21 +47,6 @@ public static QGCActivity getInstance() { return m_instance; } - private void goImmersive() { - if (Build.VERSION.SDK_INT >= 30) { - // Modern way - getWindow().setDecorFitsSystemWindows(false); // content goes edge-to-edge - - final WindowInsetsController c = getWindow().getInsetsController(); - if (c != null) { - c.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); - c.setSystemBarsBehavior( - WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - ); - } - } - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -72,17 +55,10 @@ public void onCreate(Bundle savedInstanceState) { acquireWakeLock(); keepScreenOn(); setupMulticastLock(); - goImmersive(); QGCUsbSerialManager.initialize(this); } - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - if (hasFocus) goImmersive(); // <-- re-apply when regaining focus - } - @Override protected void onDestroy() { try { diff --git a/src/UI/MainWindow.qml b/src/UI/MainWindow.qml index 2cab330f54bc..fe0a7bfb06fd 100644 --- a/src/UI/MainWindow.qml +++ b/src/UI/MainWindow.qml @@ -27,6 +27,9 @@ ApplicationWindow { id: mainWindow visible: true + visibility: Qt.platform.os === "android" + ? Window.FullScreen + : Window.Automatic property bool _utmspSendActTrigger Component.onCompleted: { From 20abfb17d719576a64cb789d05c95b4a1f4e9170 Mon Sep 17 00:00:00 2001 From: Auki Date: Thu, 13 Nov 2025 14:37:50 +0300 Subject: [PATCH 5/6] flag way --- src/UI/MainWindow.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/UI/MainWindow.qml b/src/UI/MainWindow.qml index fe0a7bfb06fd..0d776c122b5a 100644 --- a/src/UI/MainWindow.qml +++ b/src/UI/MainWindow.qml @@ -27,9 +27,9 @@ ApplicationWindow { id: mainWindow visible: true - visibility: Qt.platform.os === "android" - ? Window.FullScreen - : Window.Automatic + flags: Qt.platform.os === "android" + ? Qt.Window | Qt.ExpandedClientAreaHint + : Qt.Window property bool _utmspSendActTrigger Component.onCompleted: { From 83c1a18bb272796295292736eff0ff842dd9b7ef Mon Sep 17 00:00:00 2001 From: Auki Date: Sat, 15 Nov 2025 12:47:05 +0300 Subject: [PATCH 6/6] Update MainWindow.qml --- src/UI/MainWindow.qml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/UI/MainWindow.qml b/src/UI/MainWindow.qml index 0d776c122b5a..2d851839ae40 100644 --- a/src/UI/MainWindow.qml +++ b/src/UI/MainWindow.qml @@ -27,9 +27,8 @@ ApplicationWindow { id: mainWindow visible: true - flags: Qt.platform.os === "android" - ? Qt.Window | Qt.ExpandedClientAreaHint - : Qt.Window + flags: Qt.Window | Qt.ExpandedClientAreaHint | Qt.NoTitleBarBackgroundHint + property bool _utmspSendActTrigger Component.onCompleted: {