From b2d24dc3475906d4f46c917f129fd98e883569a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Thu, 9 Jul 2015 16:32:44 +0200 Subject: Android: Add opt-in high-dpi support Opt-in by setting android.app.auto_screen_scale_factor to true in AndroidManifest.xml. This will enable devicePixelRatio scaling in QtGui using a scale factor provided by Android DisplayMetrics. Note that the Android style is not currently supported: it already accounts for different display densities which results in incorrect visual sizes when enabling devicePixelRatio scaling. Implementation: Bring DisplayMetrics::density through to setDisplayMetrics in androidjnimain.cpp, similar to what is done for "scaledDensity". Override QPlatformScreen::pixelDensity(), which forwards the scale factor to QtGui. [The difference between "density" and "scaledDensity" is that the former is a physical display density factor which corresponds closely to devicePixelRatio in Qt, while the latter also includes the Android global font scale factor.] Scale the global font pixel size in qandroidplatformtheme.cpp to keep the visual font size constant. Based on an initial patch from Daiwei Li Task-number: QTBUG-46615 Change-Id: Ia51f99bf6dda485a57413949246c7b32cb47e8dd Reviewed-by: BogDan Vatra --- .../jar/src/org/qtproject/qt5/android/QtLayout.java | 4 ++-- .../jar/src/org/qtproject/qt5/android/QtNative.java | 14 ++++++++++---- .../src/org/qtproject/qt5/android/bindings/QtActivity.java | 6 ++++++ src/android/templates/AndroidManifest.xml | 4 ++++ 4 files changed, 22 insertions(+), 6 deletions(-) (limited to 'src/android') diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java index 4d7ca47dde..b11396aeaf 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java @@ -65,8 +65,8 @@ public class QtLayout extends ViewGroup { DisplayMetrics metrics = new DisplayMetrics(); ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics); - QtNative.setApplicationDisplayMetrics(metrics.widthPixels, - metrics.heightPixels, w, h, metrics.xdpi, metrics.ydpi, metrics.scaledDensity); + QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, w, h, + metrics.xdpi, metrics.ydpi, metrics.scaledDensity, metrics.density); if (m_startApplicationRunnable != null) { m_startApplicationRunnable.run(); m_startApplicationRunnable = null; diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 07ef6d657d..371e4e4a61 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -77,6 +77,7 @@ public class QtNative private static double m_displayMetricsXDpi = .0; private static double m_displayMetricsYDpi = .0; private static double m_displayMetricsScaledDensity = 1.0; + private static double m_displayMetricsDensity = 1.0; private static int m_oldx, m_oldy; private static final int m_moveThreshold = 0; private static ClipboardManager m_clipboardManager = null; @@ -229,7 +230,8 @@ public class QtNative m_displayMetricsDesktopHeightPixels, m_displayMetricsXDpi, m_displayMetricsYDpi, - m_displayMetricsScaledDensity); + m_displayMetricsScaledDensity, + m_displayMetricsDensity); if (params.length() > 0 && !params.startsWith("\t")) params = "\t" + params; startQtApplication(f.getAbsolutePath() + params, environment); @@ -244,7 +246,8 @@ public class QtNative int desktopHeightPixels, double XDpi, double YDpi, - double scaledDensity) + double scaledDensity, + double density) { /* Fix buggy dpi report */ if (XDpi < android.util.DisplayMetrics.DENSITY_LOW) @@ -260,7 +263,8 @@ public class QtNative desktopHeightPixels, XDpi, YDpi, - scaledDensity); + scaledDensity, + density); } else { m_displayMetricsScreenWidthPixels = screenWidthPixels; m_displayMetricsScreenHeightPixels = screenHeightPixels; @@ -269,6 +273,7 @@ public class QtNative m_displayMetricsXDpi = XDpi; m_displayMetricsYDpi = YDpi; m_displayMetricsScaledDensity = scaledDensity; + m_displayMetricsDensity = density; } } } @@ -621,7 +626,8 @@ public class QtNative int desktopHeightPixels, double XDpi, double YDpi, - double scaledDensity); + double scaledDensity, + double density); public static native void handleOrientationChanged(int newRotation, int nativeOrientation); // screen methods diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java index e5ed690f07..146d6b34f2 100644 --- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java +++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java @@ -897,6 +897,12 @@ public class QtActivity extends Activity } else { ENVIRONMENT_VARIABLES += "QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED=1\t"; } + + if (m_activityInfo.metaData.containsKey("android.app.auto_screen_scale_factor") + && m_activityInfo.metaData.getBoolean("android.app.auto_screen_scale_factor")) { + ENVIRONMENT_VARIABLES += "QT_AUTO_SCREEN_SCALE_FACTOR=1\t"; + } + startApp(true); } } diff --git a/src/android/templates/AndroidManifest.xml b/src/android/templates/AndroidManifest.xml index ad240956ef..262a5f6dba 100644 --- a/src/android/templates/AndroidManifest.xml +++ b/src/android/templates/AndroidManifest.xml @@ -44,6 +44,10 @@ signal is sent! --> + + + + -- cgit v1.2.3