diff options
author | BogDan Vatra <bogdan@kde.org> | 2014-03-27 09:14:53 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-27 17:51:21 +0100 |
commit | 13b38ac661f936c9cbd7af1f7851f82afb2634b9 (patch) | |
tree | 4a7666064effa672ca2b1d9e021a5359f6ecdbc8 /src/plugins/platforms/android/qandroidplatformintegration.cpp | |
parent | 18d031fb1896001a9edbd42edfa8b2b7a6ba9825 (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.cpp | 33 |
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 ¶ #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() |