From 3efd1996a39a9088d6d734959b45c26825688ee7 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 6 Jan 2025 18:40:06 +0200 Subject: [PATCH] Android: update density on its own when it's changed Instead of doing it every time under setDisplayMetrics(). Task-number: QTBUG-132716 Change-Id: I0887c086d7f653b0170e107a86cb0115582bbc89 Reviewed-by: Petri Virkkunen --- .../qtproject/qt/android/QtActivityBase.java | 3 +++ .../qt/android/QtActivityDelegate.java | 1 + .../qtproject/qt/android/QtDisplayManager.java | 17 +++++++++++------ .../qt/android/QtEmbeddedDelegate.java | 2 +- .../qt/android/QtServiceEmbeddedDelegate.java | 4 ++-- .../platforms/android/androidjnimain.cpp | 13 +++++++++---- 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java index 291d91bb8bd..b42b3c960a1 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java @@ -179,6 +179,9 @@ public class QtActivityBase extends Activity if ((diff & ActivityInfo.CONFIG_LOCALE) != 0) QtNative.updateLocale(); + if ((diff & ActivityInfo.CONFIG_DENSITY) != 0) + QtDisplayManager.updateScreenDensity(this); + m_prevConfig = new Configuration(newConfig); } diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java index 191e3c4e520..a6948662382 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -146,6 +146,7 @@ class QtActivityDelegate extends QtActivityDelegateBase handleUiModeChange(m_activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK); QtDisplayManager.updateRefreshRate(m_activity); + QtDisplayManager.updateScreenDensity(m_activity); m_layout.getViewTreeObserver().addOnPreDrawListener(() -> { if (!m_inputDelegate.isKeyboardVisible()) 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 61adb44bc4e..d6b44a29b62 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java @@ -6,6 +6,7 @@ package org.qtproject.qt.android; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.os.Build; @@ -34,14 +35,14 @@ class QtDisplayManager { // screen methods static native void setDisplayMetrics(int screenWidthPixels, int screenHeightPixels, int availableWidthPixels, int availableHeightPixels, - double XDpi, double YDpi, - double density); + double XDpi, double YDpi); static native void handleOrientationChanged(int newRotation, int nativeOrientation); static native void handleRefreshRateChanged(float refreshRate); static native void handleUiDarkModeChanged(int newUiMode); static native void handleScreenAdded(int displayId); static native void handleScreenChanged(int displayId); static native void handleScreenRemoved(int displayId); + static native void handleScreenDensityChanged(double density); // screen methods private boolean m_isFullScreen = false; @@ -92,6 +93,13 @@ class QtDisplayManager { m_previousRotation = rotation; } + static void updateScreenDensity(Activity activity) + { + Resources resources = activity == null ? Resources.getSystem() : activity.getResources(); + double density = resources.getDisplayMetrics().density; + QtDisplayManager.handleScreenDensityChanged(density); + } + private static int getNativeOrientation(Activity activity, int rotation) { int orientation = activity.getResources().getConfiguration().orientation; @@ -278,13 +286,10 @@ class QtDisplayManager { final DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics(); - double density = displayMetrics.density; - Size displaySize = getDisplaySize(activity, QtDisplayManager.getDisplay(activity)); setDisplayMetrics(displaySize.getWidth(), displaySize.getHeight(), width, height, - getXDpi(displayMetrics), getYDpi(displayMetrics), - density); + getXDpi(displayMetrics), getYDpi(displayMetrics)); } static float getXDpi(final DisplayMetrics metrics) { diff --git a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java index 1ac7120e33f..ab75369976b 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java @@ -116,7 +116,7 @@ class QtEmbeddedDelegate extends QtActivityDelegateBase QtDisplayManager.setApplicationDisplayMetrics(m_activity, metrics.widthPixels, metrics.heightPixels); QtDisplayManager.updateRefreshRate(m_activity); - + QtDisplayManager.updateScreenDensity(m_activity); }); } } 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 a7a88343aa4..86d6f2a80d1 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java @@ -44,10 +44,10 @@ class QtServiceEmbeddedDelegate implements QtEmbeddedViewInterface, QtNative.App QtDisplayManager.setDisplayMetrics( maxWidth, maxHeight, maxWidth, maxHeight, - QtDisplayManager.getXDpi(metrics), QtDisplayManager.getYDpi(metrics), - metrics.density); + QtDisplayManager.getXDpi(metrics), QtDisplayManager.getYDpi(metrics)); 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 b7cc694d752..62348b473c0 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -568,12 +568,10 @@ 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, - jdouble density) + jdouble xdpi, jdouble ydpi) { m_availableWidthPixels = availableWidthPixels; m_availableHeightPixels = availableHeightPixels; - m_density = density; const QSize screenSize(screenWidthPixels, screenHeightPixels); // available geometry always starts from top left @@ -713,6 +711,12 @@ static void handleUiDarkModeChanged(JNIEnv */*env*/, jobject /*thiz*/, jint newU } Q_DECLARE_JNI_NATIVE_METHOD(handleUiDarkModeChanged) +static void handleScreenDensityChanged(JNIEnv */*env*/, jclass /*cls*/, jdouble density) +{ + m_density = density; +} +Q_DECLARE_JNI_NATIVE_METHOD(handleScreenDensityChanged) + static void onActivityResult(JNIEnv */*env*/, jclass /*cls*/, jint requestCode, jint resultCode, @@ -795,7 +799,8 @@ static bool registerNatives(QJniEnvironment &env) Q_JNI_NATIVE_METHOD(handleScreenAdded), Q_JNI_NATIVE_METHOD(handleScreenChanged), Q_JNI_NATIVE_METHOD(handleScreenRemoved), - Q_JNI_NATIVE_METHOD(handleUiDarkModeChanged) + Q_JNI_NATIVE_METHOD(handleUiDarkModeChanged), + Q_JNI_NATIVE_METHOD(handleScreenDensityChanged) }); success = success