summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Mira <samuel.mira@qt.io>2022-07-06 19:50:14 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-09-27 11:12:26 +0000
commit3fbee34058d6ee81b9ca2ffabcbc96c6de33a520 (patch)
tree25812a62bf15183e3dcd87564989e12755a0100e
parent8b3c48920574f1ec82133feabfe7a6b8e28c357b (diff)
Android: Fix Display.getRealMetrics deprecation
In latest Android versions some functions related with Display metrics were deprecated. This patch changes some instances of that code to use the Resources.getDisplayMetrics or WindowManager.getMaximumWindowMetrics depending on the situation. Fixes: QTBUG-99543 Change-Id: Id9846efa877f704ef7f58c1b0820ad1527b53f09 Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io> (cherry picked from commit 413593183bbb1137fdc784d98c171d67a167bb32) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/CursorHandle.java3
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java16
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtLayout.java119
3 files changed, 102 insertions, 36 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/CursorHandle.java b/src/android/jar/src/org/qtproject/qt/android/CursorHandle.java
index d754b3b620..c15a654b79 100644
--- a/src/android/jar/src/org/qtproject/qt/android/CursorHandle.java
+++ b/src/android/jar/src/org/qtproject/qt/android/CursorHandle.java
@@ -124,8 +124,7 @@ public class CursorHandle implements ViewTreeObserver.OnPreDrawListener
m_id = id;
m_attr = attr;
m_layout = layout;
- DisplayMetrics metrics = new DisplayMetrics();
- activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
+ DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
m_yShift = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 1f, metrics);
tolerance = Math.min(1, (int)(m_yShift / 2f));
m_lastX = m_lastY = -1 - tolerance;
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java b/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java
index 6cf1aca5bf..a6930e4d97 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java
@@ -41,6 +41,8 @@
package org.qtproject.qt.android;
import android.content.Context;
+import android.os.Build;
+import android.view.WindowMetrics;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.ExtractedText;
@@ -94,9 +96,17 @@ class HideKeyboardRunnable implements Runnable {
Activity activity = QtNative.activity();
Rect r = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
- DisplayMetrics metrics = new DisplayMetrics();
- activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
- final int kbHeight = metrics.heightPixels - r.bottom;
+
+ int screenHeight = 0;
+ if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+ DisplayMetrics metrics = new DisplayMetrics();
+ activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
+ screenHeight = metrics.heightPixels;
+ } else {
+ final WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();
+ screenHeight = maximumWindowMetrics.getBounds().height();
+ }
+ final int kbHeight = screenHeight - r.bottom;
if (kbHeight < 100)
QtNative.activityDelegate().setKeyboardVisibility(false, m_hideTimeStamp);
}
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