diff options
-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() |