summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAssam Boudjelthia <[email protected]>2025-01-06 17:15:23 +0200
committerAssam Boudjelthia <[email protected]>2025-01-22 20:33:18 +0200
commitd25064b04d52efa39ac7415e7d48e8f64fd5e7c1 (patch)
treea6e2d40c562790139821e12d758337145ce108cb
parent65c41c6be663b5e028430600641490c556492494 (diff)
Android: don't pass x/y dpi values to setDisplayMetrics()
Those values are only used to calculate the final value for the screen size, which means we can simply do the calculation first and pass the final values anyway and avoid carrying those params and making things harder to read, and since those values are tied to the screen, we can deffer calculating the physical size to the screen itself. Dpi values are at least DisplayMetrics.DENSITY_LOW, if the xdpi/ydpi returned metrics values are below that. Task-number: QTBUG-132720 Change-Id: Idd6a4db24a460aeb66e626cd93d52b87566ce69c Reviewed-by: Petri Virkkunen <[email protected]>
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java11
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java4
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp13
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.cpp10
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.h3
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.cpp14
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.h5
7 files changed, 24 insertions, 36 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java b/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java
index bd1c5e50c14..9f9c67aafdf 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java
@@ -34,8 +34,7 @@ class QtDisplayManager {
// screen methods
static native void setDisplayMetrics(int screenWidthPixels, int screenHeightPixels,
- int availableWidthPixels, int availableHeightPixels,
- double XDpi, double YDpi);
+ int availableWidthPixels, int availableHeightPixels);
static native void handleOrientationChanged(int newRotation, int nativeOrientation);
static native void handleRefreshRateChanged(float refreshRate);
static native void handleUiDarkModeChanged(int newUiMode);
@@ -285,20 +284,18 @@ class QtDisplayManager {
if (activity == null)
return;
- final DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics();
-
Size displaySize = getDisplaySize(activity, QtDisplayManager.getDisplay(activity));
- setDisplayMetrics(displaySize.getWidth(), displaySize.getHeight(),
- width, height,
- getXDpi(displayMetrics), getYDpi(displayMetrics));
+ setDisplayMetrics(displaySize.getWidth(), displaySize.getHeight(), width, height);
}
+ @UsedFromNativeCode
static float getXDpi(final DisplayMetrics metrics) {
if (metrics.xdpi < android.util.DisplayMetrics.DENSITY_LOW)
return android.util.DisplayMetrics.DENSITY_LOW;
return metrics.xdpi;
}
+ @UsedFromNativeCode
static float getYDpi(final DisplayMetrics metrics) {
if (metrics.ydpi < android.util.DisplayMetrics.DENSITY_LOW)
return android.util.DisplayMetrics.DENSITY_LOW;
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java
index 86d6f2a80d1..2b2bdb33335 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java
@@ -42,9 +42,7 @@ class QtServiceEmbeddedDelegate implements QtEmbeddedViewInterface, QtNative.App
final int maxWidth = metrics.widthPixels;
final int maxHeight = metrics.heightPixels;
- QtDisplayManager.setDisplayMetrics(
- maxWidth, maxHeight, maxWidth, maxHeight,
- QtDisplayManager.getXDpi(metrics), QtDisplayManager.getYDpi(metrics));
+ QtDisplayManager.setDisplayMetrics(maxWidth, maxHeight, maxWidth, maxHeight);
QtDisplayManager.updateRefreshRate(m_service);
QtDisplayManager.handleScreenDensityChanged(metrics.density);
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index 67cedb048ea..f2c317ad1bf 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -567,8 +567,7 @@ static void terminateQt(JNIEnv *env, jclass /*clazz*/)
static void setDisplayMetrics(JNIEnv * /*env*/, jclass /*clazz*/,
jint screenWidthPixels, jint screenHeightPixels,
- jint availableWidthPixels, jint availableHeightPixels,
- jdouble xdpi, jdouble ydpi)
+ jint availableWidthPixels, jint availableHeightPixels)
{
m_availableWidthPixels = availableWidthPixels;
m_availableHeightPixels = availableHeightPixels;
@@ -576,16 +575,12 @@ static void setDisplayMetrics(JNIEnv * /*env*/, jclass /*clazz*/,
const QSize screenSize(screenWidthPixels, screenHeightPixels);
// available geometry always starts from top left
const QRect availableGeometry(0, 0, availableWidthPixels, availableHeightPixels);
- const QSize physicalSize(qRound(double(screenWidthPixels) / xdpi * 25.4),
- qRound(double(screenHeightPixels) / ydpi * 25.4));
QMutexLocker lock(&m_platformMutex);
- if (m_androidPlatformIntegration) {
- m_androidPlatformIntegration->setScreenSizeParameters(
- physicalSize, screenSize, availableGeometry);
- } else if (QAndroidPlatformScreen::defaultAvailableGeometry().isNull()) {
+ if (m_androidPlatformIntegration)
+ m_androidPlatformIntegration->setScreenSizeParameters(screenSize, availableGeometry);
+ else if (QAndroidPlatformScreen::defaultAvailableGeometry().isNull())
QAndroidPlatformScreen::defaultAvailableGeometry() = availableGeometry;
- }
}
Q_DECLARE_JNI_NATIVE_METHOD(setDisplayMetrics)
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp
index 497b5329227..8cd67b27b51 100644
--- a/src/plugins/platforms/android/qandroidplatformintegration.cpp
+++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp
@@ -500,8 +500,8 @@ void QAndroidPlatformIntegration::setScreenOrientation(Qt::ScreenOrientation cur
void QAndroidPlatformIntegration::flushPendingUpdates()
{
if (m_primaryScreen) {
- m_primaryScreen->setSizeParameters(m_primaryScreen->physicalSize().toSize(),
- m_primaryScreen->geometry().size(), m_primaryScreen->availableGeometry());
+ m_primaryScreen->setSizeParameters(
+ m_primaryScreen->geometry().size(), m_primaryScreen->availableGeometry());
}
}
@@ -542,14 +542,12 @@ void QAndroidPlatformIntegration::updateColorScheme(Qt::ColorScheme colorScheme)
[] () { QAndroidPlatformTheme::instance()->updateColorScheme();});
}
-void QAndroidPlatformIntegration::setScreenSizeParameters(const QSize &physicalSize,
- const QSize &screenSize,
+void QAndroidPlatformIntegration::setScreenSizeParameters(const QSize &screenSize,
const QRect &availableGeometry)
{
if (m_primaryScreen) {
QMetaObject::invokeMethod(m_primaryScreen, "setSizeParameters", Qt::AutoConnection,
- Q_ARG(QSize, physicalSize), Q_ARG(QSize, screenSize),
- Q_ARG(QRect, availableGeometry));
+ Q_ARG(QSize, screenSize), Q_ARG(QRect, availableGeometry));
}
}
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.h b/src/plugins/platforms/android/qandroidplatformintegration.h
index 343c71b4991..b42727cd699 100644
--- a/src/plugins/platforms/android/qandroidplatformintegration.h
+++ b/src/plugins/platforms/android/qandroidplatformintegration.h
@@ -70,8 +70,7 @@ public:
// a better control over "geometry changed" event handling. Technically
// they are no longer used and can be removed. Not doing it now, because
// I'm not sure if it might be helpful to have them or not.
- void setScreenSizeParameters(const QSize &physicalSize, const QSize &screenSize,
- const QRect &availableGeometry);
+ void setScreenSizeParameters(const QSize &screenSize, const QRect &availableGeometry);
void setRefreshRate(qreal refreshRate);
bool isVirtualDesktop() { return true; }
diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp
index bb8e6ecf376..65c50103623 100644
--- a/src/plugins/platforms/android/qandroidplatformscreen.cpp
+++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp
@@ -92,14 +92,14 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject)
const auto resources = context.callMethod<QtJniTypes::Resources>("getResources");
const auto metrics = resources.callMethod<QtJniTypes::DisplayMetrics>("getDisplayMetrics");
- const float xdpi = metrics.getField<float>("xdpi");
- const float ydpi = metrics.getField<float>("ydpi");
+ m_xdpi = QtJniTypes::QtDisplayManager::callStaticMethod<jfloat>("getXDpi", metrics);
+ m_ydpi = QtJniTypes::QtDisplayManager::callStaticMethod<jfloat>("getYDpi", metrics);
// Potentially densityDpi could be used instead of xpdi/ydpi to do the calculation,
// but the results are not consistent with devices specs.
// (https://issuetracker.google.com/issues/194120500)
- m_physicalSize.setWidth(qRound(m_size.width() / xdpi * 25.4));
- m_physicalSize.setHeight(qRound(m_size.height() / ydpi * 25.4));
+ m_physicalSize.setWidth(qRound(m_size.width() / m_xdpi * 25.4));
+ m_physicalSize.setHeight(qRound(m_size.height() / m_ydpi * 25.4));
if (QNativeInterface::QAndroidApplication::sdkVersion() >= 23) {
const QJniObject currentMode = displayObject.callObjectMethod<QtJniTypes::DisplayMode>("getMode");
@@ -219,13 +219,13 @@ void QAndroidPlatformScreen::setSize(const QSize &size)
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), geometry(), availableGeometry());
}
-void QAndroidPlatformScreen::setSizeParameters(const QSize &physicalSize, const QSize &size,
- const QRect &availableGeometry)
+void QAndroidPlatformScreen::setSizeParameters(const QSize &size, const QRect &availableGeometry)
{
// The goal of this method is to set all geometry-related parameters
// at the same time and generate only one screen geometry change event.
- m_physicalSize = physicalSize;
m_size = size;
+ m_physicalSize = QSize(qRound(double(size.width()) / m_xdpi * 25.4),
+ qRound(double(size.height()) / m_ydpi * 25.4));
// If available geometry has changed, the event will be handled in
// setAvailableGeometry. Otherwise we need to explicitly handle it to
// retain the behavior, because setSize() does the handling unconditionally.
diff --git a/src/plugins/platforms/android/qandroidplatformscreen.h b/src/plugins/platforms/android/qandroidplatformscreen.h
index 93291be0e94..d77d53ede5d 100644
--- a/src/plugins/platforms/android/qandroidplatformscreen.h
+++ b/src/plugins/platforms/android/qandroidplatformscreen.h
@@ -54,8 +54,7 @@ public slots:
void setPhysicalSize(const QSize &size);
void setAvailableGeometry(const QRect &rect);
void setSize(const QSize &size);
- void setSizeParameters(const QSize &physicalSize, const QSize &size,
- const QRect &availableGeometry);
+ void setSizeParameters(const QSize &size, const QRect &availableGeometry);
void setRefreshRate(qreal refreshRate);
void setOrientation(Qt::ScreenOrientation orientation);
@@ -71,6 +70,8 @@ protected:
QList<Mode> m_modes;
int m_currentMode = 0;
int m_displayId = -1;
+ int m_xdpi;
+ int m_ydpi;
private:
QDpi logicalDpi() const override;