summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtLayout.java25
-rw-r--r--tests/auto/corelib/platform/android/CMakeLists.txt4
-rw-r--r--tests/auto/corelib/platform/android/tst_android.cpp102
3 files changed, 123 insertions, 8 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtLayout.java b/src/android/jar/src/org/qtproject/qt/android/QtLayout.java
index a234f921d3..3c01c76400 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtLayout.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtLayout.java
@@ -90,8 +90,16 @@ public class QtLayout extends ViewGroup
final DisplayMetrics appMetrics = new DisplayMetrics();
display.getMetrics(appMetrics);
- appWidth = appMetrics.widthPixels;
- appHeight = appMetrics.heightPixels;
+ final WindowInsets rootInsets = getRootWindowInsets();
+
+ insetLeft = rootInsets.getStableInsetLeft();
+ insetTop = rootInsets.getStableInsetTop();
+
+ int insetsWidth = rootInsets.getStableInsetRight() + rootInsets.getStableInsetLeft();
+ int insetsHeight = rootInsets.getStableInsetTop() + rootInsets.getStableInsetBottom();
+
+ appWidth = appMetrics.widthPixels - insetsWidth;
+ appHeight = appMetrics.heightPixels - insetsHeight;
final DisplayMetrics maxMetrics = new DisplayMetrics();
display.getRealMetrics(maxMetrics);
@@ -104,9 +112,6 @@ public class QtLayout extends ViewGroup
ydpi = appMetrics.ydpi;
scaledDensity = appMetrics.scaledDensity;
- final WindowInsets rootInsets = getRootWindowInsets();
- insetLeft = rootInsets.getSystemWindowInsetLeft();
- insetTop = rootInsets.getSystemWindowInsetTop();
} else {
// after API 30 use getCurrentWindowMetrics for application metrics
// getMaximumWindowMetrics for the screen metrics
@@ -115,10 +120,10 @@ public class QtLayout extends ViewGroup
display = activity.getDisplay();
final WindowMetrics appMetrics = windowManager.getCurrentWindowMetrics();
+ final WindowMetrics maxMetrics = windowManager.getMaximumWindowMetrics();
final WindowInsets windowInsets = appMetrics.getWindowInsets();
- Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()
- | WindowInsets.Type.displayCutout());
+ Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.tappableElement());
insetLeft = insets.left;
insetTop = insets.top;
@@ -126,10 +131,14 @@ public class QtLayout extends ViewGroup
int insetsWidth = insets.right + insets.left;
int insetsHeight = insets.top + insets.bottom;
+ if (h == maxMetrics.getBounds().height()){
+ //when h == maxheight the system is ignoring insets
+ insetsWidth = insetsHeight = insetLeft = insetTop = 0;
+ }
+
appWidth = appMetrics.getBounds().width() - insetsWidth;
appHeight = appMetrics.getBounds().height() - insetsHeight;
- final WindowMetrics maxMetrics = windowManager.getMaximumWindowMetrics();
maxWidth = maxMetrics.getBounds().width();
maxHeight = maxMetrics.getBounds().height();
diff --git a/tests/auto/corelib/platform/android/CMakeLists.txt b/tests/auto/corelib/platform/android/CMakeLists.txt
index c2749825ac..6c08080e6a 100644
--- a/tests/auto/corelib/platform/android/CMakeLists.txt
+++ b/tests/auto/corelib/platform/android/CMakeLists.txt
@@ -7,6 +7,10 @@
qt_internal_add_test(tst_android
SOURCES
tst_android.cpp
+ LIBRARIES
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
)
if(ANDROID)
diff --git a/tests/auto/corelib/platform/android/tst_android.cpp b/tests/auto/corelib/platform/android/tst_android.cpp
index 2fa6ec6415..49ba175c06 100644
--- a/tests/auto/corelib/platform/android/tst_android.cpp
+++ b/tests/auto/corelib/platform/android/tst_android.cpp
@@ -4,8 +4,12 @@
#include <jni.h>
#include <QTest>
+#include <QGuiApplication>
#include <QtCore/qnativeinterface.h>
#include <QtCore/qjniobject.h>
+#include <QScreen>
+#include <qpa/qplatformscreen.h>
+#include <qpa/qplatformnativeinterface.h>
class tst_Android : public QObject
{
@@ -16,6 +20,7 @@ private slots:
void testAndroidSdkVersion();
void testAndroidActivity();
void testRunOnAndroidMainThread();
+ void testFullScreenDimensions();
};
void tst_Android::assetsRead()
@@ -164,6 +169,103 @@ void tst_Android::testRunOnAndroidMainThread()
}
}
+void setSystemUiVisibility(int visibility)
+{
+ QNativeInterface::QAndroidApplication::runOnAndroidMainThread([visibility] {
+ QJniObject::callStaticMethod<void>("org/qtproject/qt/android/QtNative",
+ "setSystemUiVisibility", "(I)V", visibility);
+ }).waitForFinished();
+}
+
+// QTBUG-107604
+void tst_Android::testFullScreenDimensions()
+{
+ static int SYSTEM_UI_VISIBILITY_NORMAL = 0;
+ static int SYSTEM_UI_VISIBILITY_FULLSCREEN = 1;
+ static int SYSTEM_UI_VISIBILITY_TRANSLUCENT = 2;
+
+ // this will trigger new layout updates
+ setSystemUiVisibility(SYSTEM_UI_VISIBILITY_FULLSCREEN);
+ setSystemUiVisibility(SYSTEM_UI_VISIBILITY_NORMAL);
+
+ QJniObject activity = QNativeInterface::QAndroidApplication::context();
+ QVERIFY(activity.isValid());
+
+ QJniObject windowManager =
+ activity.callObjectMethod("getWindowManager", "()Landroid/view/WindowManager;");
+ QVERIFY(windowManager.isValid());
+
+ QJniObject display = windowManager.callObjectMethod("getDefaultDisplay", "()Landroid/view/Display;");
+ QVERIFY(display.isValid());
+
+ QJniObject appSize("android/graphics/Point");
+ QVERIFY(appSize.isValid());
+
+ display.callMethod<void>("getSize", "(Landroid/graphics/Point;)V", appSize.object());
+
+ QJniObject realSize("android/graphics/Point");
+ QVERIFY(realSize.isValid());
+
+ display.callMethod<void>("getRealSize", "(Landroid/graphics/Point;)V", realSize.object());
+
+ QPlatformScreen *screen = QGuiApplication::primaryScreen()->handle();
+
+ {
+ // Normal -
+ // available geometry == app size (system bars visible and removed from available geometry)
+ QCoreApplication::processEvents();
+ QJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;");
+ QVERIFY(window.isValid());
+
+ QJniObject decorView = window.callObjectMethod("getDecorView", "()Landroid/view/View;");
+ QVERIFY(decorView.isValid());
+
+ QJniObject insets =
+ decorView.callObjectMethod("getRootWindowInsets", "()Landroid/view/WindowInsets;");
+ QVERIFY(insets.isValid());
+
+ int insetsWidth = insets.callMethod<jint>("getSystemWindowInsetRight")
+ + insets.callMethod<jint>("getSystemWindowInsetLeft");
+
+ int insetsHeight = insets.callMethod<jint>("getSystemWindowInsetTop")
+ + insets.callMethod<jint>("getSystemWindowInsetBottom");
+
+ QTRY_COMPARE(screen->availableGeometry().width(),
+ int(appSize.getField<jint>("x")) - insetsWidth);
+ QTRY_COMPARE(screen->availableGeometry().height(),
+ int(appSize.getField<jint>("y")) - insetsHeight);
+
+ QTRY_COMPARE(screen->geometry().width(), int(realSize.getField<jint>("x")));
+ QTRY_COMPARE(screen->geometry().height(), int(realSize.getField<jint>("y")));
+ }
+
+ {
+ setSystemUiVisibility(SYSTEM_UI_VISIBILITY_FULLSCREEN);
+
+ // Fullscreen
+ // available geometry == full display size (system bars hidden)
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(screen->availableGeometry().width(), int(realSize.getField<jint>("x")));
+ QTRY_COMPARE(screen->availableGeometry().height(), int(realSize.getField<jint>("y")));
+
+ QTRY_COMPARE(screen->geometry().width(), int(realSize.getField<jint>("x")));
+ QTRY_COMPARE(screen->geometry().height(), int(realSize.getField<jint>("y")));
+ }
+
+ {
+ setSystemUiVisibility(SYSTEM_UI_VISIBILITY_TRANSLUCENT);
+
+ // Translucent
+ // available geometry == full display size (system bars visible but drawable under)
+ QCoreApplication::processEvents();
+ QTRY_COMPARE(screen->availableGeometry().width(), int(realSize.getField<jint>("x")));
+ QTRY_COMPARE(screen->availableGeometry().height(), int(realSize.getField<jint>("y")));
+
+ QTRY_COMPARE(screen->geometry().width(), int(realSize.getField<jint>("x")));
+ QTRY_COMPARE(screen->geometry().height(), int(realSize.getField<jint>("y")));
+ }
+}
+
QTEST_MAIN(tst_Android)
#include "tst_android.moc"