diff options
Diffstat (limited to 'src/android/jar/src/org/qtproject/qt5/android/QtLayout.java')
-rw-r--r-- | src/android/jar/src/org/qtproject/qt5/android/QtLayout.java | 85 |
1 files changed, 80 insertions, 5 deletions
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 f22b8176c8..e59ac39d9f 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org> ** Contact: https://www.qt.io/licensing/ ** @@ -42,14 +42,44 @@ 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 { private Runnable m_startApplicationRunnable; + + private int m_activityDisplayRotation = -1; + private int m_ownDisplayRotation = -1; + private int m_nativeOrientation = -1; + + public void setActivityDisplayRotation(int rotation) + { + m_activityDisplayRotation = rotation; + } + + public void setNativeOrientation(int orientation) + { + m_nativeOrientation = orientation; + } + + public int displayRotation() + { + return m_ownDisplayRotation; + } + public QtLayout(Context context, Runnable startRunnable) { super(context); @@ -69,10 +99,55 @@ public class QtLayout extends ViewGroup @Override protected void onSizeChanged (int w, int h, int oldw, int oldh) { - DisplayMetrics metrics = new DisplayMetrics(); - ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics); - QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, w, h, - metrics.xdpi, metrics.ydpi, metrics.scaledDensity, metrics.density); + Activity activity = (Activity)getContext(); + if (activity == null) + return; + + final WindowManager windowManager = activity.getWindowManager(); + Display display; + + final WindowInsets rootInsets = getRootWindowInsets(); + + int maxWidth = 0; + int maxHeight = 0; + + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + display = windowManager.getDefaultDisplay(); + + final DisplayMetrics maxMetrics = new DisplayMetrics(); + display.getRealMetrics(maxMetrics); + maxWidth = maxMetrics.widthPixels; + maxHeight = maxMetrics.heightPixels; + } else { + display = activity.getDisplay(); + + final WindowMetrics maxMetrics = windowManager.getMaximumWindowMetrics(); + maxWidth = maxMetrics.getBounds().width(); + maxHeight = maxMetrics.getBounds().height(); + } + + final DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics(); + double xdpi = displayMetrics.xdpi; + double ydpi = displayMetrics.ydpi; + double density = displayMetrics.density; + double scaledDensity = displayMetrics.scaledDensity; + float refreshRate = display.getRefreshRate(); + + QtNative.setApplicationDisplayMetrics(maxWidth, maxHeight, w, h, + xdpi,ydpi,scaledDensity, density, + refreshRate); + + int newRotation = display.getRotation(); + if (m_ownDisplayRotation != m_activityDisplayRotation + && newRotation == m_activityDisplayRotation) { + // If the saved rotation value does not match the one from the + // activity, it means that we got orientation change before size + // change, and the value was cached. So we need to notify about + // orientation change now. + QtNative.handleOrientationChanged(newRotation, m_nativeOrientation); + } + + m_ownDisplayRotation = newRotation; if (m_startApplicationRunnable != null) { m_startApplicationRunnable.run(); m_startApplicationRunnable = null; |