Android: refactor tst_Android::testFullScreenDimensions()

Pick-to: 6.5
Change-Id: Iea06638d1c8eebf36ae010dad23fbeab4b890597
Reviewed-by: Petri Virkkunen <petri.virkkunen@qt.io>
(cherry picked from commit ebdc01c1861667116aa09914b46df1ac8504baf9)
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Assam Boudjelthia 2024-10-30 04:15:00 +02:00
parent 133af018d5
commit 8e2209f3b0

View File

@ -17,6 +17,13 @@
using namespace Qt::StringLiterals; using namespace Qt::StringLiterals;
Q_DECLARE_JNI_CLASS(Display, "android/view/Display")
Q_DECLARE_JNI_CLASS(Point, "android/graphics/Point")
Q_DECLARE_JNI_CLASS(View, "android/view/View")
Q_DECLARE_JNI_CLASS(Window, "android/view/Window")
Q_DECLARE_JNI_CLASS(WindowInsets, "android/view/WindowInsets")
Q_DECLARE_JNI_CLASS(WindowManager, "android/view/WindowManager")
class tst_Android : public QObject class tst_Android : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -203,103 +210,97 @@ void tst_Android::testRunOnAndroidMainThread()
} }
} }
Q_DECLARE_JNI_CLASS(QtActivityDelegateBase, "org/qtproject/qt/android/QtActivityDelegateBase")
void setSystemUiVisibility(int visibility)
{
QNativeInterface::QAndroidApplication::runOnAndroidMainThread([visibility] {
auto context = QNativeInterface::QAndroidApplication::context();
auto activityDelegate = context.callMethod<QtJniTypes::QtActivityDelegateBase>("getActivityDelegate");
activityDelegate.callMethod<void>("setSystemUiVisibility", jint(visibility));
}).waitForFinished();
}
// QTBUG-107604 // QTBUG-107604
void tst_Android::testFullScreenDimensions() 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(); QJniObject activity = QNativeInterface::QAndroidApplication::context();
QVERIFY(activity.isValid()); QVERIFY(activity.isValid());
QJniObject windowManager = QJniObject windowManager = activity.callMethod<QtJniTypes::WindowManager>("getWindowManager");
activity.callObjectMethod("getWindowManager", "()Landroid/view/WindowManager;");
QVERIFY(windowManager.isValid()); QVERIFY(windowManager.isValid());
QJniObject display = windowManager.callObjectMethod("getDefaultDisplay", "()Landroid/view/Display;"); QJniObject display = windowManager.callMethod<QtJniTypes::Display>("getDefaultDisplay");
QVERIFY(display.isValid()); QVERIFY(display.isValid());
QJniObject appSize("android/graphics/Point"); QtJniTypes::Point appSize{};
QVERIFY(appSize.isValid()); QVERIFY(appSize.isValid());
display.callMethod<void>("getSize", appSize);
display.callMethod<void>("getSize", "(Landroid/graphics/Point;)V", appSize.object()); QtJniTypes::Point realSize{};
QJniObject realSize("android/graphics/Point");
QVERIFY(realSize.isValid()); QVERIFY(realSize.isValid());
display.callMethod<void>("getRealSize", realSize);
display.callMethod<void>("getRealSize", "(Landroid/graphics/Point;)V", realSize.object()); QWidget widget;
QPlatformScreen *screen = QGuiApplication::primaryScreen()->handle(); QPlatformScreen *screen = QGuiApplication::primaryScreen()->handle();
{ {
// Normal - // Normal -
// available geometry == app size (system bars visible and removed from available geometry) // available geometry == app size (system bars visible and removed from available geometry)
widget.showNormal();
QCoreApplication::processEvents(); QCoreApplication::processEvents();
QJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;"); QJniObject window = activity.callMethod<QtJniTypes::Window>("getWindow");
QVERIFY(window.isValid()); QVERIFY(window.isValid());
QJniObject decorView = window.callObjectMethod("getDecorView", "()Landroid/view/View;"); QJniObject decorView = window.callMethod<QtJniTypes::View>("getDecorView");
QVERIFY(decorView.isValid()); QVERIFY(decorView.isValid());
QJniObject insets = QJniObject insets = decorView.callMethod<QtJniTypes::WindowInsets>("getRootWindowInsets");
decorView.callObjectMethod("getRootWindowInsets", "()Landroid/view/WindowInsets;");
QVERIFY(insets.isValid()); QVERIFY(insets.isValid());
int insetsWidth = insets.callMethod<jint>("getSystemWindowInsetRight") int insetRight = insets.callMethod<jint>("getSystemWindowInsetRight");
+ insets.callMethod<jint>("getSystemWindowInsetLeft"); int insetLeft = insets.callMethod<jint>("getSystemWindowInsetLeft");
int insetsWidth = insetRight + insetLeft;
int insetsHeight = insets.callMethod<jint>("getSystemWindowInsetTop") int insetTop = insets.callMethod<jint>("getSystemWindowInsetTop");
+ insets.callMethod<jint>("getSystemWindowInsetBottom"); int insetBottom = insets.callMethod<jint>("getSystemWindowInsetBottom");
int insetsHeight = insetTop + insetBottom;
QTRY_COMPARE(screen->availableGeometry().width(), int expectedWidth = appSize.getField<jint>("x") - insetsWidth;
int(appSize.getField<jint>("x")) - insetsWidth); QTRY_COMPARE(screen->availableGeometry().width(), expectedWidth);
QTRY_COMPARE(screen->availableGeometry().height(),
int(appSize.getField<jint>("y")) - insetsHeight);
QTRY_COMPARE(screen->geometry().width(), int(realSize.getField<jint>("x"))); int expectedHeight = appSize.getField<jint>("y") - insetsHeight;
QTRY_COMPARE(screen->geometry().height(), int(realSize.getField<jint>("y"))); QTRY_COMPARE(screen->availableGeometry().height(), expectedHeight);
QTRY_COMPARE(screen->geometry().width(), realSize.getField<jint>("x"));
QTRY_COMPARE(screen->geometry().height(), realSize.getField<jint>("y"));
} }
{ {
setSystemUiVisibility(SYSTEM_UI_VISIBILITY_FULLSCREEN);
// Fullscreen // Fullscreen
// available geometry == full display size (system bars hidden) // available geometry == full display size (system bars hidden)
widget.showFullScreen();
QCoreApplication::processEvents(); QCoreApplication::processEvents();
QTRY_COMPARE(screen->availableGeometry().width(), int(realSize.getField<jint>("x"))); QTRY_COMPARE(screen->availableGeometry().width(), realSize.getField<jint>("x"));
QTRY_COMPARE(screen->availableGeometry().height(), int(realSize.getField<jint>("y"))); QTRY_COMPARE(screen->availableGeometry().height(), realSize.getField<jint>("y"));
QTRY_COMPARE(screen->geometry().width(), int(realSize.getField<jint>("x"))); QTRY_COMPARE(screen->geometry().width(), realSize.getField<jint>("x"));
QTRY_COMPARE(screen->geometry().height(), int(realSize.getField<jint>("y"))); QTRY_COMPARE(screen->geometry().height(), realSize.getField<jint>("y"));
widget.showNormal();
} }
{ {
setSystemUiVisibility(SYSTEM_UI_VISIBILITY_TRANSLUCENT);
// Translucent // Translucent
// available geometry == full display size (system bars visible but drawable under) // available geometry == full display size (system bars visible but drawable under)
widget.setWindowFlags(widget.windowFlags() | Qt::MaximizeUsingFullscreenGeometryHint);
widget.show();
QCoreApplication::processEvents(); QCoreApplication::processEvents();
QTRY_COMPARE(screen->availableGeometry().width(), int(realSize.getField<jint>("x"))); QTRY_COMPARE(screen->availableGeometry().width(), realSize.getField<jint>("x"));
QTRY_COMPARE(screen->availableGeometry().height(), int(realSize.getField<jint>("y"))); QTRY_COMPARE(screen->availableGeometry().height(), realSize.getField<jint>("y"));
QTRY_COMPARE(screen->geometry().width(), int(realSize.getField<jint>("x"))); QTRY_COMPARE(screen->geometry().width(), realSize.getField<jint>("x"));
QTRY_COMPARE(screen->geometry().height(), int(realSize.getField<jint>("y"))); QTRY_COMPARE(screen->geometry().height(), realSize.getField<jint>("y"));
widget.showNormal();
}
{
// Translucent
// available geometry == full display size (system bars visible but drawable under)
widget.showMaximized();
QCoreApplication::processEvents();
QTRY_COMPARE(screen->availableGeometry().width(), realSize.getField<jint>("x"));
QTRY_COMPARE(screen->availableGeometry().height(), realSize.getField<jint>("y"));
QTRY_COMPARE(screen->geometry().width(), realSize.getField<jint>("x"));
QTRY_COMPARE(screen->geometry().height(), realSize.getField<jint>("y"));
} }
} }