/* * 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)); }
void AndroidCameraPrivate::setFocusAreas(const QList<QRect> &areas) { if (QtAndroidPrivate::androidSdkVersion() < 14) return; QMutexLocker parametersLocker(&m_parametersMutex); if (!m_parameters.isValid()) return; QJNIObjectPrivate list; if (!areas.isEmpty()) { QJNIEnvironmentPrivate env; QJNIObjectPrivate arrayList("java/util/ArrayList", "(I)V", areas.size()); for (int i = 0; i < areas.size(); ++i) { arrayList.callMethod<jboolean>("add", "(Ljava/lang/Object;)Z", rectToArea(areas.at(i)).object()); exceptionCheckAndClear(env); } list = arrayList; } m_parameters.callMethod<void>("setFocusAreas", "(Ljava/util/List;)V", list.object()); applyParameters(); }
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; }
QString AndroidNetworkInfo::getTypeName() const { QJNIObjectPrivate typeName = m_networkInfo.callObjectMethod<jstring>("getTypeName"); if (!typeName.isValid()) return QString(); return typeName.toString(); }
QByteArray QAndroidTimeZonePrivate::systemTimeZoneId() const { QJNIObjectPrivate androidSystemTimeZone = QJNIObjectPrivate::callStaticObjectMethod("java.util.TimeZone", "getDefault", "()Ljava/util/TimeZone;"); QJNIObjectPrivate systemTZIdAndroid = androidSystemTimeZone.callObjectMethod<jstring>("getID"); QByteArray systemTZid = systemTZIdAndroid.toString().toUtf8(); return systemTZid; }
QString AndroidMultimediaUtils::getDefaultMediaDirectory(MediaType type) { QJNIObjectPrivate path = QJNIObjectPrivate::callStaticObjectMethod("org/qtproject/qt5/android/multimedia/QtMultimediaUtils", "getDefaultMediaDirectory", "(I)Ljava/lang/String;", jint(type)); return path.toString(); }
QString AndroidNetworkInfo::getReason() const { QJNIObjectPrivate reason = m_networkInfo.callObjectMethod<jstring>("getReason"); if (!reason.isValid()) return QString(); return reason.toString(); }
int AndroidConnectivityManager::stopUsingNetworkFeature(int networkType, const QString &feature) { QJNIObjectPrivate jfeature = QJNIObjectPrivate::fromString(feature); return m_connectivityManager.callMethod<jint>("stopUsingNetworkFeature", "(ILjava/lang/String;)I", networkType, jfeature.object()); }
QString AndroidNetworkInfo::getExtraInfo() const { QJNIObjectPrivate extraInfo = m_networkInfo.callObjectMethod<jstring>("getExtraInfo"); if (!extraInfo.isValid()) return QString(); return extraInfo.toString(); }
static inline QString getAbsolutePath(const QJNIObjectPrivate &file) { QJNIObjectPrivate path = file.callObjectMethod("getAbsolutePath", "()Ljava/lang/String;"); if (!path.isValid()) return QString(); return path.toString(); }
AndroidNetworkInfo::NetworkState AndroidNetworkInfo::getState() const { QJNIObjectPrivate enumObject = m_networkInfo.callObjectMethod("getState", "()Landroid/net/NetworkInfo$State;"); if (!enumObject.isValid()) return UnknownState; QJNIObjectPrivate enumName = enumObject.callObjectMethod<jstring>("name"); if (!enumName.isValid()) return UnknownState; return stateForName(enumName.toString()); }
/* * The root of the external storage * */ static QString getExternalStorageDirectory() { QString &path = (*androidDirCache)[QStringLiteral("EXT_ROOT")]; if (!path.isEmpty()) return path; QJNIObjectPrivate file = QJNIObjectPrivate::callStaticObjectMethod("android/os/Environment", "getExternalStorageDirectory", "()Ljava/io/File;"); if (!file.isValid()) return QString(); return (path = getAbsolutePath(file)); }
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; }
QString AndroidCameraPrivate::getFocusMode() { QMutexLocker parametersLocker(&m_parametersMutex); QString value; if (m_parameters.isValid()) { QJNIObjectPrivate focusMode = m_parameters.callObjectMethod("getFocusMode", "()Ljava/lang/String;"); if (focusMode.isValid()) value = focusMode.toString(); } return value; }
QString AndroidCameraPrivate::getWhiteBalance() { QMutexLocker parametersLocker(&m_parametersMutex); QString value; if (m_parameters.isValid()) { QJNIObjectPrivate wb = m_parameters.callObjectMethod("getWhiteBalance", "()Ljava/lang/String;"); if (wb.isValid()) value = wb.toString(); } return value; }
void AndroidCameraPrivate::startPreview() { //We need to clear preview buffers queue here, but there is no method to do it //Though just resetting preview callback do the trick m_camera.callMethod<void>("setPreviewCallbackWithBuffer", "(Landroid/hardware/Camera$PreviewCallback;)V", jobject(0)); m_cameraListener.callMethod<void>("preparePreviewBuffer", "(Landroid/hardware/Camera;)V", m_camera.object()); QJNIObjectPrivate buffer = m_cameraListener.callObjectMethod<jbyteArray>("callbackBuffer"); m_camera.callMethod<void>("addCallbackBuffer", "([B)V", buffer.object()); m_camera.callMethod<void>("setPreviewCallbackWithBuffer", "(Landroid/hardware/Camera$PreviewCallback;)V", m_cameraListener.object()); m_camera.callMethod<void>("startPreview"); emit previewStarted(); }
/* * 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)); }
void AndroidCameraPrivate::fetchLastPreviewFrame() { QJNIEnvironmentPrivate env; QJNIObjectPrivate data = m_cameraListener.callObjectMethod("lockAndFetchPreviewBuffer", "()[B"); if (!data.isValid()) { m_cameraListener.callMethod<void>("unlockPreviewBuffer"); return; } const int arrayLength = env->GetArrayLength(static_cast<jbyteArray>(data.object())); QByteArray bytes(arrayLength, Qt::Uninitialized); env->GetByteArrayRegion(static_cast<jbyteArray>(data.object()), 0, arrayLength, reinterpret_cast<jbyte *>(bytes.data())); m_cameraListener.callMethod<void>("unlockPreviewBuffer"); emit previewFetched(bytes); }
QList<QByteArray> QAndroidTimeZonePrivate::availableTimeZoneIds() const { QList<QByteArray> availableTimeZoneIdList; QJNIObjectPrivate androidAvailableIdList = QJNIObjectPrivate::callStaticObjectMethod("java.util.TimeZone", "getAvailableIDs", "()[Ljava/lang/String;"); QJNIEnvironmentPrivate jniEnv; int androidTZcount = jniEnv->GetArrayLength( static_cast<jarray>(androidAvailableIdList.object()) ); // need separate jobject and QAndroidJniObject here so that we can delete (DeleteLocalRef) the reference to the jobject // (or else the JNI reference table fills after 512 entries from GetObjectArrayElement) jobject androidTZobject; QJNIObjectPrivate androidTZ; for (int i=0; i<androidTZcount; i++ ) { androidTZobject = jniEnv->GetObjectArrayElement( static_cast<jobjectArray>( androidAvailableIdList.object() ), i ); androidTZ = androidTZobject; availableTimeZoneIdList.append( androidTZ.toString().toUtf8() ); jniEnv->DeleteLocalRef(androidTZobject); } return availableTimeZoneIdList; }
/* * Locations where applications can place user files (public). * E.g., /storage/Music */ static QString getExternalStoragePublicDirectory(const char *directoryField) { QString &path = (*androidDirCache)[QLatin1String(directoryField)]; if (!path.isEmpty()) return path; QJNIObjectPrivate dirField = QJNIObjectPrivate::getStaticObjectField("android/os/Environment", directoryField, "Ljava/lang/String;"); if (!dirField.isValid()) return QString(); QJNIObjectPrivate file = QJNIObjectPrivate::callStaticObjectMethod("android/os/Environment", "getExternalStoragePublicDirectory", "(Ljava/lang/String;)Ljava/io/File;", dirField.object()); 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; }
QString QAndroidTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType, const QLocale &locale) const { QString name; if (androidTimeZone.isValid()) { jboolean daylightTime = (timeType == QTimeZone::DaylightTime); // treat QTimeZone::GenericTime as QTimeZone::StandardTime // treat all NameTypes as java TimeZone style LONG (value 1), except of course QTimeZone::ShortName which is style SHORT (value 0); jint style = (nameType == QTimeZone::ShortName ? 0 : 1); QJNIObjectPrivate jlanguage = QJNIObjectPrivate::fromString(QLocale::languageToString(locale.language())); QJNIObjectPrivate jcountry = QJNIObjectPrivate::fromString(QLocale::countryToString(locale.country())); QJNIObjectPrivate jvariant = QJNIObjectPrivate::fromString(QLocale::scriptToString(locale.script())); QJNIObjectPrivate jlocale("java.util.Locale", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", static_cast<jstring>(jlanguage.object()), static_cast<jstring>(jcountry.object()), static_cast<jstring>(jvariant.object())); QJNIObjectPrivate jname = androidTimeZone.callObjectMethod("getDisplayName", "(ZILjava/util/Locale;)Ljava/lang/String;", daylightTime, style, jlocale.object()); name = jname.toString(); } return name; }
QList<AndroidNetworkInfo> AndroidConnectivityManager::getAllNetworkInfo() const { QJNIEnvironmentPrivate env; QJNIObjectPrivate objArray = m_connectivityManager.callObjectMethod("getAllNetworkInfo", "()[Landroid/net/NetworkInfo;"); QList<AndroidNetworkInfo> list; if (!objArray.isValid()) return list; const jsize length = env->GetArrayLength(static_cast<jarray>(objArray.object())); if (exceptionCheckAndClear(env)) return list; for (int i = 0; i != length; ++i) { jobject lref = env->GetObjectArrayElement(static_cast<jobjectArray>(objArray.object()), i); if (exceptionCheckAndClear(env)) break; list << AndroidNetworkInfo(lref); env->DeleteLocalRef(lref); } return list; }
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); } } }
void AndroidMediaRecorder::setCamera(AndroidCamera *camera) { QJNIObjectPrivate cam = camera->getCameraObject(); m_mediaRecorder.callMethod<void>("setCamera", "(Landroid/hardware/Camera;)V", cam.object()); }