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 | 78 |
1 files changed, 52 insertions, 26 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 e94ce60248..123c5bc248 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,16 +42,35 @@ package org.qtproject.qt5.android; import android.app.Activity; import android.content.Context; +import android.os.Build; import android.util.AttributeSet; import android.util.DisplayMetrics; +import android.view.Display; import android.view.View; import android.view.ViewGroup; -import android.graphics.Rect; public class QtLayout extends ViewGroup { private Runnable m_startApplicationRunnable; - private int m_bottomDisplayFrame = -1; + + 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) { @@ -69,31 +88,40 @@ public class QtLayout extends ViewGroup super(context, attrs, defStyle); } - private void handleSizeChanged (int w, int h, int oldw, int oldh) + @Override + protected void onSizeChanged (int w, int h, int oldw, int oldh) { DisplayMetrics metrics = new DisplayMetrics(); - ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics); - - Rect r = new Rect(); - ((Activity) getContext()).getWindow().getDecorView().getWindowVisibleDisplayFrame(r); - - if (m_bottomDisplayFrame != r.bottom || oldh == -1) { - m_bottomDisplayFrame = r.bottom; - QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, w, h, - metrics.xdpi, - metrics.ydpi, - metrics.scaledDensity, - metrics.density, - ((metrics.heightPixels == h) - || (metrics.heightPixels == h + r.top) - || (m_bottomDisplayFrame > metrics.heightPixels + r.top))); + Display display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) + ? ((Activity)getContext()).getWindowManager().getDefaultDisplay() + : ((Activity)getContext()).getDisplay(); + display.getMetrics(metrics); + + if ((metrics.widthPixels > metrics.heightPixels) != (w > h)) { + // This is an intermediate state during display rotation. + // The new size is still reported for old orientation, while + // metrics contain sizes for new orientation. Setting + // such parameters will produce inconsistent results, so + // we just skip them. + // We will have another onSizeChanged() with normal values + // a bit later. + return; } - } - @Override - protected void onSizeChanged (int w, int h, int oldw, int oldh) - { - handleSizeChanged (w, h, oldw, oldh); + QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, w, h, + metrics.xdpi, metrics.ydpi, metrics.scaledDensity, + metrics.density, display.getRefreshRate()); + + 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(); @@ -172,8 +200,6 @@ public class QtLayout extends ViewGroup } } - - handleSizeChanged (r, b, 0, -1); } // Override to allow type-checking of LayoutParams. |