summaryrefslogtreecommitdiffstats
path: root/src/android/jar/src/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/jar/src/org')
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/CursorHandle.java3
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java9
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtInputConnection.java16
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtLayout.java116
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java3
5 files changed, 124 insertions, 23 deletions
diff --git a/src/android/jar/src/org/qtproject/qt5/android/CursorHandle.java b/src/android/jar/src/org/qtproject/qt5/android/CursorHandle.java
index bba114767d..7dbac0412b 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/CursorHandle.java
+++ b/src/android/jar/src/org/qtproject/qt5/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/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
index 33f4f77360..1218164d05 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
@@ -1325,7 +1325,14 @@ public class QtActivityDelegate
public void setSurfaceGeometry(int id, int x, int y, int w, int h) {
if (m_surfaces.containsKey(id)) {
QtSurface surface = m_surfaces.get(id);
- surface.setLayoutParams(new QtLayout.LayoutParams(w, h, x, y));
+ QtLayout.LayoutParams params = new QtLayout.LayoutParams(w, h, x, y);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ if (m_activity.isInMultiWindowMode()) {
+ params.width = ViewGroup.LayoutParams.MATCH_PARENT;
+ params.height = ViewGroup.LayoutParams.MATCH_PARENT;
+ }
+ }
+ surface.setLayoutParams(params);
} else if (m_nativeViews.containsKey(id)) {
View view = m_nativeViews.get(id);
view.setLayoutParams(new QtLayout.LayoutParams(w, h, x, y));
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtInputConnection.java b/src/android/jar/src/org/qtproject/qt5/android/QtInputConnection.java
index b5f6af8701..729c244b2c 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtInputConnection.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtInputConnection.java
@@ -41,6 +41,8 @@
package org.qtproject.qt5.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/qt5/android/QtLayout.java b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
index c4864f91c1..5bf1b2ff4b 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
@@ -42,13 +42,20 @@ package org.qtproject.qt5.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;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
+import android.view.WindowMetrics;
+import android.view.WindowInsets;
+import android.graphics.Insets;
+import android.content.res.Configuration;
+import android.content.res.Resources;
public class QtLayout extends ViewGroup
{
@@ -96,16 +103,95 @@ 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);
- DisplayMetrics appMetrics = new DisplayMetrics();
- display.getMetrics(appMetrics);
+ int appWidth = 0;
+ int appHeight = 0;
- if ((realMetrics.widthPixels > realMetrics.heightPixels) != (w > h)) {
+ 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);
+
+ 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);
+
+ maxWidth = maxMetrics.widthPixels;
+ maxHeight = maxMetrics.heightPixels;
+
+ density = appMetrics.density;
+ xdpi = appMetrics.xdpi;
+ ydpi = appMetrics.ydpi;
+ scaledDensity = appMetrics.scaledDensity;
+ } 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 WindowMetrics maxMetrics = windowManager.getMaximumWindowMetrics();
+
+ 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;
+
+ 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;
+
+ 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;
+
+ 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
@@ -116,21 +202,17 @@ public class QtLayout extends ViewGroup
return;
}
- 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,
- appWidthPixels, appHeightPixels, appMetrics.xdpi, appMetrics.ydpi,
- appMetrics.scaledDensity, appMetrics.density, display.getRefreshRate());
+ QtNative.setApplicationDisplayMetrics(maxWidth, maxHeight, appWidth, appHeight,
+ xdpi,ydpi,scaledDensity, density,
+ refreshRate);
int newRotation = display.getRotation();
if (m_ownDisplayRotation != m_activityDisplayRotation
diff --git a/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
index 68ae9806ab..b316583d5f 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
@@ -57,6 +57,7 @@ import android.view.MotionEvent;
import android.view.View.OnHoverListener;
import android.content.Context;
+import android.system.Os;
import java.util.LinkedList;
import java.util.List;
@@ -124,6 +125,8 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
@Override
public void onAccessibilityStateChanged(boolean enabled)
{
+ if (Os.getenv("QT_ANDROID_DISABLE_ACCESSIBILITY") != null)
+ return;
if (enabled) {
try {
View view = m_view;