summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/android/qandroidplatformintegration.cpp
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kde.org>2014-03-27 09:14:53 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-27 17:51:21 +0100
commit13b38ac661f936c9cbd7af1f7851f82afb2634b9 (patch)
tree4a7666064effa672ca2b1d9e021a5359f6ecdbc8 /src/plugins/platforms/android/qandroidplatformintegration.cpp
parent18d031fb1896001a9edbd42edfa8b2b7a6ba9825 (diff)
Android: registerTouchDevice at startup
I'd like to keep registerTouchDevice from androidjniinput.cpp, touchEnd as a backup for buggy Android devices that are not setting Configurations.touchscreen field correctly. Task-number: QTBUG-36007 Change-Id: Ib8f107474baa278b2d82d9ca14913512dfff01c2 Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
Diffstat (limited to 'src/plugins/platforms/android/qandroidplatformintegration.cpp')
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp
index a06f69b8d5..6395f71398 100644
--- a/src/plugins/platforms/android/qandroidplatformintegration.cpp
+++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp
@@ -41,6 +41,7 @@
#include "qandroidplatformintegration.h"
+#include <QtCore/private/qjni_p.h>
#include <QGuiApplication>
#include <QOpenGLContext>
#include <QThread>
@@ -130,6 +131,38 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList &para
#endif
m_androidSystemLocale = new QAndroidSystemLocale;
+
+ QJNIObjectPrivate javaActivity(QtAndroid::activity());
+ if (javaActivity.isValid()) {
+ QJNIObjectPrivate resources = javaActivity.callObjectMethod("getResources", "()Landroid/content/res/Resources;");
+ QJNIObjectPrivate configuration = resources.callObjectMethod("getConfiguration", "()Landroid/content/res/Configuration;");
+
+ int touchScreen = configuration.getField<jint>("touchscreen");
+ if (touchScreen == QJNIObjectPrivate::getStaticField<jint>("android/content/res/Configuration", "TOUCHSCREEN_FINGER")
+ || touchScreen == QJNIObjectPrivate::getStaticField<jint>("android/content/res/Configuration", "TOUCHSCREEN_STYLUS"))
+ {
+ m_touchDevice = new QTouchDevice;
+ m_touchDevice->setType(QTouchDevice::TouchScreen);
+ m_touchDevice->setCapabilities(QTouchDevice::Position
+ | QTouchDevice::Area
+ | QTouchDevice::Pressure
+ | QTouchDevice::NormalizedPosition);
+
+ QJNIObjectPrivate pm = javaActivity.callObjectMethod("getPackageManager", "()Landroid/content/pm/PackageManager;");
+ Q_ASSERT(pm.isValid());
+ if (pm.callMethod<jboolean>("hasSystemFeature","(Ljava/lang/String;)Z",
+ QJNIObjectPrivate::getStaticObjectField("android/content/pm/PackageManager", "FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND", "Ljava/lang/String;").object())) {
+ m_touchDevice->setMaximumTouchPoints(10);
+ } else if (pm.callMethod<jboolean>("hasSystemFeature","(Ljava/lang/String;)Z",
+ QJNIObjectPrivate::getStaticObjectField("android/content/pm/PackageManager", "FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT", "Ljava/lang/String;").object())) {
+ m_touchDevice->setMaximumTouchPoints(4);
+ } else if (pm.callMethod<jboolean>("hasSystemFeature","(Ljava/lang/String;)Z",
+ QJNIObjectPrivate::getStaticObjectField("android/content/pm/PackageManager", "FEATURE_TOUCHSCREEN_MULTITOUCH", "Ljava/lang/String;").object())) {
+ m_touchDevice->setMaximumTouchPoints(2);
+ }
+ QWindowSystemInterface::registerTouchDevice(m_touchDevice);
+ }
+ }
}
bool QAndroidPlatformIntegration::needsBasicRenderloopWorkaround()