summaryrefslogtreecommitdiffstats
path: root/src/android/jar/src/org/qtproject/qt/android/QtLayout.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/jar/src/org/qtproject/qt/android/QtLayout.java')
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtLayout.java119
1 files changed, 88 insertions, 31 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 04a0f6c378..0a8924aaf9 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtLayout.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtLayout.java
@@ -42,7 +42,9 @@ package org.qtproject.qt.android;
import android.app.Activity;
import android.content.Context;
+import android.graphics.Rect;
import android.os.Build;
+import android.util.Log;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
@@ -51,6 +53,9 @@ import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.graphics.Insets;
+import android.view.WindowMetrics;
+import android.content.res.Configuration;
+import android.content.res.Resources;
public class QtLayout extends ViewGroup
{
@@ -98,17 +103,86 @@ public class QtLayout extends ViewGroup
if (activity == null)
return;
- Display display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
- ? activity.getWindowManager().getDefaultDisplay()
- : activity.getDisplay();
+ final WindowManager windowManager = activity.getWindowManager();
+ Display display;
- DisplayMetrics realMetrics = new DisplayMetrics();
- display.getRealMetrics(realMetrics);
+ int appWidth = 0;
+ int appHeight = 0;
- DisplayMetrics appMetrics = new DisplayMetrics();
- display.getMetrics(appMetrics);
+ int insetLeft = 0;
+ int insetTop = 0;
+
+ int maxWidth = 0;
+ int maxHeight = 0;
+
+ double xdpi = 0;
+ double ydpi = 0;
+ double scaledDensity = 0;
+ double density = 0;
+
+ if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+ display = windowManager.getDefaultDisplay();
+
+ final DisplayMetrics appMetrics = new DisplayMetrics();
+ display.getMetrics(appMetrics);
+
+ appWidth = appMetrics.widthPixels;
+ appHeight = appMetrics.heightPixels;
+
+ final DisplayMetrics maxMetrics = new DisplayMetrics();
+ display.getRealMetrics(maxMetrics);
+
+ maxWidth = maxMetrics.widthPixels;
+ maxHeight = maxMetrics.heightPixels;
+
+ density = appMetrics.density;
+ xdpi = appMetrics.xdpi;
+ 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
+ // resource configuration for density as best practice
+ // and the resource display metrics for the rest
+ display = activity.getDisplay();
+
+ final WindowMetrics appMetrics = windowManager.getCurrentWindowMetrics();
+
+ final WindowInsets windowInsets = appMetrics.getWindowInsets();
+ Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()
+ | WindowInsets.Type.displayCutout());
+
+ insetLeft = insets.left;
+ insetTop = insets.top;
+
+ int insetsWidth = insets.right + insets.left;
+ int insetsHeight = insets.top + insets.bottom;
+
+ appWidth = appMetrics.getBounds().width() - insetsWidth;
+ appHeight = appMetrics.getBounds().height() - insetsHeight;
+
+ final WindowMetrics maxMetrics = windowManager.getMaximumWindowMetrics();
+ maxWidth = maxMetrics.getBounds().width();
+ maxHeight = maxMetrics.getBounds().height();
+
+ final Resources resources = activity.getResources();
+ final Configuration configuration = resources.getConfiguration();
+ density = configuration.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT;
- if ((realMetrics.widthPixels > realMetrics.heightPixels) != (w > h)) {
+ final DisplayMetrics displayMetrics = resources.getDisplayMetrics();
+ xdpi = displayMetrics.xdpi;
+ ydpi = displayMetrics.ydpi;
+ density = displayMetrics.density;
+ scaledDensity = displayMetrics.scaledDensity;
+ }
+
+ float refreshRate = display.getRefreshRate();
+
+ if ((appWidth > appHeight) != (w > h)) {
// This is an intermediate state during display rotation.
// The new size is still reported for old orientation, while
// realMetrics contain sizes for new orientation. Setting
@@ -119,36 +193,19 @@ public class QtLayout extends ViewGroup
return;
}
- WindowInsets rootInsets = getRootWindowInsets();
-
- int insetLeft = 0;
- int insetTop = 0;
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
- Insets insets = rootInsets.getInsets(WindowInsets.Type.systemBars());
- insetLeft = insets.left;
- insetTop = insets.top;
- } else {
- insetLeft = rootInsets.getSystemWindowInsetLeft();
- insetTop = rootInsets.getSystemWindowInsetTop();
- }
-
- int appWidthPixels = appMetrics.widthPixels;
- int appHeightPixels = appMetrics.heightPixels;
-
final int flag =
activity.getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN;
if (flag == WindowManager.LayoutParams.FLAG_FULLSCREEN) {
// immersive mode uses the whole screen
- appWidthPixels = realMetrics.widthPixels;
- appHeightPixels = realMetrics.heightPixels;
+ appWidth = maxWidth;
+ appHeight = maxHeight;
}
- QtNative.setApplicationDisplayMetrics(
- realMetrics.widthPixels, realMetrics.heightPixels, insetLeft, insetTop,
- appWidthPixels, appHeightPixels, appMetrics.xdpi, appMetrics.ydpi,
- appMetrics.scaledDensity, appMetrics.density, display.getRefreshRate());
+ QtNative.setApplicationDisplayMetrics(maxWidth, maxHeight, insetLeft,
+ insetTop, appWidth, appHeight,
+ xdpi,ydpi,scaledDensity, density,
+ refreshRate);
int newRotation = display.getRotation();
if (m_ownDisplayRotation != m_activityDisplayRotation