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)
QtNative.updateLocale();
if ((diff & ActivityInfo.CONFIG_DENSITY) != 0)
QtDisplayManager.updateScreenDensity(this);
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);
QtDisplayManager.updateRefreshRate(m_activity);
QtDisplayManager.updateScreenDensity(m_activity);
m_layout.getViewTreeObserver().addOnPreDrawListener(() -> {
if (!m_inputDelegate.isKeyboardVisible())

View File

@ -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) {

View File

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

View File

@ -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);
});
}
}

View File

@ -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