summaryrefslogtreecommitdiffstats
path: root/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
diff options
context:
space:
mode:
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.java78
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.