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:
parent
1cdc197664
commit
60dd3b71bb
@ -53,6 +53,7 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
Q_DECLARE_JNI_CLASS(Display, "android/view/Display")
|
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;")
|
Q_DECLARE_JNI_TYPE(DisplayMode, "Landroid/view/Display$Mode;")
|
||||||
|
|
||||||
@ -79,12 +80,21 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject)
|
|||||||
if (!displayObject.isValid())
|
if (!displayObject.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_size = QSize(displayObject.callMethod<jint>("getWidth"), displayObject.callMethod<jint>("getHeight"));
|
|
||||||
m_name = displayObject.callObjectMethod<jstring>("getName").toString();
|
m_name = displayObject.callObjectMethod<jstring>("getName").toString();
|
||||||
m_refreshRate = displayObject.callMethod<jfloat>("getRefreshRate");
|
m_refreshRate = displayObject.callMethod<jfloat>("getRefreshRate");
|
||||||
m_displayId = displayObject.callMethod<jint>("getDisplayId");
|
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) {
|
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 QJniObject currentMode = displayObject.callObjectMethod<QtJniTypes::DisplayMode>("getMode");
|
||||||
const jint currentModeId = currentMode.callMethod<jint>("getModeId");
|
const jint currentModeId = currentMode.callMethod<jint>("getModeId");
|
||||||
|
|
||||||
@ -96,8 +106,9 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject)
|
|||||||
const auto size = env->GetArrayLength(modeArray);
|
const auto size = env->GetArrayLength(modeArray);
|
||||||
for (jsize i = 0; i < size; ++i) {
|
for (jsize i = 0; i < size; ++i) {
|
||||||
const auto mode = QJniObject::fromLocalRef(env->GetObjectArrayElement(modeArray, i));
|
const auto mode = QJniObject::fromLocalRef(env->GetObjectArrayElement(modeArray, i));
|
||||||
const int physicalWidth = mode.callMethod<jint>("getPhysicalWidth");
|
// Physical sizes in millimeters
|
||||||
const int physicalHeight = mode.callMethod<jint>("getPhysicalHeight");
|
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")) {
|
if (currentModeId == mode.callMethod<jint>("getModeId")) {
|
||||||
m_currentMode = i;
|
m_currentMode = i;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user