diff options
Diffstat (limited to 'src/android/jar/src/org')
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; |