/* * Locations where applications can place persistent files it owns. * E.g., /storage/org.app/Music */ static QString getExternalFilesDir(const char *directoryField = 0) { QString &path = (*androidDirCache)[QString(QLatin1String("APPNAME_%1")).arg(QLatin1String(directoryField))]; if (!path.isEmpty()) return path; QJNIObjectPrivate activity = QtAndroidPrivate::activity(); if (!activity.isValid()) return QString(); QJNIObjectPrivate appCtx = applicationContext(); if (!appCtx.isValid()) return QString(); QJNIObjectPrivate dirField = QJNIObjectPrivate::fromString(QLatin1String("")); if (directoryField) { dirField = QJNIObjectPrivate::getStaticObjectField("android/os/Environment", directoryField, "Ljava/lang/String;"); if (!dirField.isValid()) return QString(); } QJNIObjectPrivate file = appCtx.callObjectMethod("getExternalFilesDir", "(Ljava/lang/String;)Ljava/io/File;", dirField.object()); if (!file.isValid()) return QString(); return (path = getAbsolutePath(file)); }
QList<QRect> AndroidCameraPrivate::getFocusAreas() { QList<QRect> areas; if (QtAndroidPrivate::androidSdkVersion() < 14) return areas; QMutexLocker parametersLocker(&m_parametersMutex); if (m_parameters.isValid()) { QJNIObjectPrivate list = m_parameters.callObjectMethod("getFocusAreas", "()Ljava/util/List;"); if (list.isValid()) { int count = list.callMethod<jint>("size"); for (int i = 0; i < count; ++i) { QJNIObjectPrivate area = list.callObjectMethod("get", "(I)Ljava/lang/Object;", i); areas.append(areaToRect(area.object())); } } } return areas; }
static inline QString getAbsolutePath(const QJNIObjectPrivate &file) { QJNIObjectPrivate path = file.callObjectMethod("getAbsolutePath", "()Ljava/lang/String;"); if (!path.isValid()) return QString(); return path.toString(); }
static QJNIObjectPrivate applicationContext() { static QJNIObjectPrivate appCtx; if (appCtx.isValid()) return appCtx; QJNIObjectPrivate activity = QtAndroidPrivate::activity(); if (!activity.isValid()) return appCtx; appCtx = activity.callObjectMethod("getApplicationContext", "()Landroid/content/Context;"); return appCtx; }
/* * Directory where applications can store cache files it owns (private). */ static QString getCacheDir() { QString &path = (*androidDirCache)[QStringLiteral("APPROOT_CACHE")]; if (!path.isEmpty()) return path; QJNIObjectPrivate appCtx = applicationContext(); if (!appCtx.isValid()) return QString(); QJNIObjectPrivate file = appCtx.callObjectMethod("getCacheDir", "()Ljava/io/File;"); if (!file.isValid()) return QString(); return (path = getAbsolutePath(file)); }
QList<int> AndroidCameraPrivate::getZoomRatios() { QMutexLocker parametersLocker(&m_parametersMutex); QList<int> ratios; if (m_parameters.isValid()) { QJNIObjectPrivate ratioList = m_parameters.callObjectMethod("getZoomRatios", "()Ljava/util/List;"); int count = ratioList.callMethod<jint>("size"); for (int i = 0; i < count; ++i) { QJNIObjectPrivate zoomRatio = ratioList.callObjectMethod("get", "(I)Ljava/lang/Object;", i); ratios.append(zoomRatio.callMethod<jint>("intValue")); } } return ratios; }
QList<QSize> AndroidCameraPrivate::getSupportedPreviewSizes() { QList<QSize> list; QMutexLocker parametersLocker(&m_parametersMutex); if (m_parameters.isValid()) { QJNIObjectPrivate sizeList = m_parameters.callObjectMethod("getSupportedPreviewSizes", "()Ljava/util/List;"); int count = sizeList.callMethod<jint>("size"); for (int i = 0; i < count; ++i) { QJNIObjectPrivate size = sizeList.callObjectMethod("get", "(I)Ljava/lang/Object;", i); list.append(QSize(size.getField<jint>("width"), size.getField<jint>("height"))); } qSort(list.begin(), list.end(), qt_sizeLessThan); } return list; }
QStringList AndroidCameraPrivate::callParametersStringListMethod(const QByteArray &methodName) { QMutexLocker parametersLocker(&m_parametersMutex); QStringList stringList; if (m_parameters.isValid()) { QJNIObjectPrivate list = m_parameters.callObjectMethod(methodName.constData(), "()Ljava/util/List;"); if (list.isValid()) { int count = list.callMethod<jint>("size"); for (int i = 0; i < count; ++i) { QJNIObjectPrivate string = list.callObjectMethod("get", "(I)Ljava/lang/Object;", i); stringList.append(string.toString()); } } } return stringList; }
QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList ¶mList) : m_touchDevice(0) #ifndef QT_NO_ACCESSIBILITY , m_accessibility(0) #endif { Q_UNUSED(paramList); m_androidPlatformNativeInterface = new QAndroidPlatformNativeInterface(); m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (m_eglDisplay == EGL_NO_DISPLAY) qFatal("Could not open egl display"); EGLint major, minor; if (!eglInitialize(m_eglDisplay, &major, &minor)) qFatal("Could not initialize egl display"); if (!eglBindAPI(EGL_OPENGL_ES_API)) qFatal("Could not bind GL_ES API"); m_primaryScreen = new QAndroidPlatformScreen(); screenAdded(m_primaryScreen); m_primaryScreen->setPhysicalSize(QSize(m_defaultPhysicalSizeWidth, m_defaultPhysicalSizeHeight)); m_primaryScreen->setSize(QSize(m_defaultScreenWidth, m_defaultScreenHeight)); m_primaryScreen->setAvailableGeometry(QRect(0, 0, m_defaultGeometryWidth, m_defaultGeometryHeight)); m_mainThread = QThread::currentThread(); QtAndroid::setAndroidPlatformIntegration(this); m_androidFDB = new QAndroidPlatformFontDatabase(); m_androidPlatformServices = new QAndroidPlatformServices(); #ifndef QT_NO_CLIPBOARD m_androidPlatformClipboard = new QAndroidPlatformClipboard(); #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); } } }