Android: Fix reporting of QScreen's size() and physicalSize()

The screen's DPI need to be accounted for when calculating
the size in mm from pixels. This was missing after multi-displays
support was added for Android.

Amends fbf586db2c587e7ba83cf1bfe8e5b912310d6bdb.

Fixes: QTBUG-112742
Change-Id: I31814faa8de68e5193757d52e264b8ed90ae56b6
Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
(cherry picked from commit 436923a76c4c60ad7271a66821768b06573310ce)
This commit is contained in:
Assam Boudjelthia 2023-06-05 15:42:02 +03:00 committed by Qt Cherry-pick Bot
parent 1cdc197664
commit 60dd3b71bb

View File

@ -53,6 +53,7 @@ private:
#endif
Q_DECLARE_JNI_CLASS(Display, "android/view/Display")
Q_DECLARE_JNI_CLASS(DisplayMetrics, "android/util/DisplayMetrics")
Q_DECLARE_JNI_TYPE(DisplayMode, "Landroid/view/Display$Mode;")
@ -79,12 +80,21 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject)
if (!displayObject.isValid())
return;
m_size = QSize(displayObject.callMethod<jint>("getWidth"), displayObject.callMethod<jint>("getHeight"));
m_name = displayObject.callObjectMethod<jstring>("getName").toString();
m_refreshRate = displayObject.callMethod<jfloat>("getRefreshRate");
m_displayId = displayObject.callMethod<jint>("getDisplayId");
QJniObject displayMetricsObj(QtJniTypes::className<QtJniTypes::DisplayMetrics>());
displayObject.callMethod<void>("getRealMetrics", displayMetricsObj.object<QtJniTypes::DisplayMetrics>());
const int widthPixels = displayMetricsObj.getField<int>("widthPixels");
const int heightPixels = displayMetricsObj.getField<int>("heightPixels");
m_size = QSize(widthPixels, heightPixels);
if (QNativeInterface::QAndroidApplication::sdkVersion() >= 23) {
const qreal xdpi = displayMetricsObj.getField<float>("xdpi");
const qreal ydpi = displayMetricsObj.getField<float>("ydpi");
const QJniObject currentMode = displayObject.callObjectMethod<QtJniTypes::DisplayMode>("getMode");
const jint currentModeId = currentMode.callMethod<jint>("getModeId");
@ -96,8 +106,9 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject)
const auto size = env->GetArrayLength(modeArray);
for (jsize i = 0; i < size; ++i) {
const auto mode = QJniObject::fromLocalRef(env->GetObjectArrayElement(modeArray, i));
const int physicalWidth = mode.callMethod<jint>("getPhysicalWidth");
const int physicalHeight = mode.callMethod<jint>("getPhysicalHeight");
// Physical sizes in millimeters
const int physicalWidth = qRound(mode.callMethod<jint>("getPhysicalWidth") / xdpi * 25.4);
const int physicalHeight = qRound(mode.callMethod<jint>("getPhysicalHeight") / ydpi * 25.4);
if (currentModeId == mode.callMethod<jint>("getModeId")) {
m_currentMode = i;