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 <petri.virkkunen@qt.io>
This commit is contained in:
Assam Boudjelthia 2025-01-06 18:40:06 +02:00
parent 3305eb10da
commit 3efd1996a3
6 changed files with 27 additions and 13 deletions

View File

@ -179,6 +179,9 @@ public class QtActivityBase extends Activity
if ((diff & ActivityInfo.CONFIG_LOCALE) != 0) if ((diff & ActivityInfo.CONFIG_LOCALE) != 0)
QtNative.updateLocale(); QtNative.updateLocale();
if ((diff & ActivityInfo.CONFIG_DENSITY) != 0)
QtDisplayManager.updateScreenDensity(this);
m_prevConfig = new Configuration(newConfig); m_prevConfig = new Configuration(newConfig);
} }

View File

@ -146,6 +146,7 @@ class QtActivityDelegate extends QtActivityDelegateBase
handleUiModeChange(m_activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK); handleUiModeChange(m_activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK);
QtDisplayManager.updateRefreshRate(m_activity); QtDisplayManager.updateRefreshRate(m_activity);
QtDisplayManager.updateScreenDensity(m_activity);
m_layout.getViewTreeObserver().addOnPreDrawListener(() -> { m_layout.getViewTreeObserver().addOnPreDrawListener(() -> {
if (!m_inputDelegate.isKeyboardVisible()) if (!m_inputDelegate.isKeyboardVisible())

View File

@ -6,6 +6,7 @@ package org.qtproject.qt.android;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Rect; import android.graphics.Rect;
import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager;
import android.os.Build; import android.os.Build;
@ -34,14 +35,14 @@ class QtDisplayManager {
// screen methods // screen methods
static native void setDisplayMetrics(int screenWidthPixels, int screenHeightPixels, static native void setDisplayMetrics(int screenWidthPixels, int screenHeightPixels,
int availableWidthPixels, int availableHeightPixels, int availableWidthPixels, int availableHeightPixels,
double XDpi, double YDpi, double XDpi, double YDpi);
double density);
static native void handleOrientationChanged(int newRotation, int nativeOrientation); static native void handleOrientationChanged(int newRotation, int nativeOrientation);
static native void handleRefreshRateChanged(float refreshRate); static native void handleRefreshRateChanged(float refreshRate);
static native void handleUiDarkModeChanged(int newUiMode); static native void handleUiDarkModeChanged(int newUiMode);
static native void handleScreenAdded(int displayId); static native void handleScreenAdded(int displayId);
static native void handleScreenChanged(int displayId); static native void handleScreenChanged(int displayId);
static native void handleScreenRemoved(int displayId); static native void handleScreenRemoved(int displayId);
static native void handleScreenDensityChanged(double density);
// screen methods // screen methods
private boolean m_isFullScreen = false; private boolean m_isFullScreen = false;
@ -92,6 +93,13 @@ class QtDisplayManager {
m_previousRotation = rotation; 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) private static int getNativeOrientation(Activity activity, int rotation)
{ {
int orientation = activity.getResources().getConfiguration().orientation; int orientation = activity.getResources().getConfiguration().orientation;
@ -278,13 +286,10 @@ class QtDisplayManager {
final DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics(); final DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics();
double density = displayMetrics.density;
Size displaySize = getDisplaySize(activity, QtDisplayManager.getDisplay(activity)); Size displaySize = getDisplaySize(activity, QtDisplayManager.getDisplay(activity));
setDisplayMetrics(displaySize.getWidth(), displaySize.getHeight(), setDisplayMetrics(displaySize.getWidth(), displaySize.getHeight(),
width, height, width, height,
getXDpi(displayMetrics), getYDpi(displayMetrics), getXDpi(displayMetrics), getYDpi(displayMetrics));
density);
} }
static float getXDpi(final DisplayMetrics metrics) { static float getXDpi(final DisplayMetrics metrics) {

View File

@ -116,7 +116,7 @@ class QtEmbeddedDelegate extends QtActivityDelegateBase
QtDisplayManager.setApplicationDisplayMetrics(m_activity, metrics.widthPixels, QtDisplayManager.setApplicationDisplayMetrics(m_activity, metrics.widthPixels,
metrics.heightPixels); metrics.heightPixels);
QtDisplayManager.updateRefreshRate(m_activity); QtDisplayManager.updateRefreshRate(m_activity);
QtDisplayManager.updateScreenDensity(m_activity);
}); });
} }
} }

View File

@ -44,10 +44,10 @@ class QtServiceEmbeddedDelegate implements QtEmbeddedViewInterface, QtNative.App
QtDisplayManager.setDisplayMetrics( QtDisplayManager.setDisplayMetrics(
maxWidth, maxHeight, maxWidth, maxHeight, maxWidth, maxHeight, maxWidth, maxHeight,
QtDisplayManager.getXDpi(metrics), QtDisplayManager.getYDpi(metrics), QtDisplayManager.getXDpi(metrics), QtDisplayManager.getYDpi(metrics));
metrics.density);
QtDisplayManager.updateRefreshRate(m_service); QtDisplayManager.updateRefreshRate(m_service);
QtDisplayManager.handleScreenDensityChanged(metrics.density);
}); });
} }
} }

View File

@ -568,12 +568,10 @@ static void terminateQt(JNIEnv *env, jclass /*clazz*/)
static void setDisplayMetrics(JNIEnv * /*env*/, jclass /*clazz*/, static void setDisplayMetrics(JNIEnv * /*env*/, jclass /*clazz*/,
jint screenWidthPixels, jint screenHeightPixels, jint screenWidthPixels, jint screenHeightPixels,
jint availableWidthPixels, jint availableHeightPixels, jint availableWidthPixels, jint availableHeightPixels,
jdouble xdpi, jdouble ydpi, jdouble xdpi, jdouble ydpi)
jdouble density)
{ {
m_availableWidthPixels = availableWidthPixels; m_availableWidthPixels = availableWidthPixels;
m_availableHeightPixels = availableHeightPixels; m_availableHeightPixels = availableHeightPixels;
m_density = density;
const QSize screenSize(screenWidthPixels, screenHeightPixels); const QSize screenSize(screenWidthPixels, screenHeightPixels);
// available geometry always starts from top left // 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) 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*/, static void onActivityResult(JNIEnv */*env*/, jclass /*cls*/,
jint requestCode, jint requestCode,
jint resultCode, jint resultCode,
@ -795,7 +799,8 @@ static bool registerNatives(QJniEnvironment &env)
Q_JNI_NATIVE_METHOD(handleScreenAdded), Q_JNI_NATIVE_METHOD(handleScreenAdded),
Q_JNI_NATIVE_METHOD(handleScreenChanged), Q_JNI_NATIVE_METHOD(handleScreenChanged),
Q_JNI_NATIVE_METHOD(handleScreenRemoved), Q_JNI_NATIVE_METHOD(handleScreenRemoved),
Q_JNI_NATIVE_METHOD(handleUiDarkModeChanged) Q_JNI_NATIVE_METHOD(handleUiDarkModeChanged),
Q_JNI_NATIVE_METHOD(handleScreenDensityChanged)
}); });
success = success success = success