aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/platform/android/qandroidquickviewembedding.cpp
diff options
context:
space:
mode:
authorSoheil Armin <soheil.armin@qt.io>2023-12-04 15:16:33 +0200
committerSoheil Armin <soheil.armin@qt.io>2024-02-15 10:07:14 +0200
commit2023c1664bc3b439edbb0da871e14000ec1c148a (patch)
tree9b70bf2d31b19d40f438eccae724eec49f4e141d /src/quick/platform/android/qandroidquickviewembedding.cpp
parent9ca6eede194d7039180c2b39099c8688f1160b44 (diff)
Android: Add getProperty() to QtQuickView
Add getProperty() to QtQuickView to read QML property values of the root object of QQuickView and convert them to Java types. Currently Boolean, Int, Double, Float and String types are covered. The return type of getProperty() is generic. Pick-to: 6.7 Task-number: QTBUG-119342 Change-Id: I799b4768a7e252daa048c024911ddae9e99b0504 Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/quick/platform/android/qandroidquickviewembedding.cpp')
-rw-r--r--src/quick/platform/android/qandroidquickviewembedding.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/quick/platform/android/qandroidquickviewembedding.cpp b/src/quick/platform/android/qandroidquickviewembedding.cpp
index 2ef7355262..007a14f694 100644
--- a/src/quick/platform/android/qandroidquickviewembedding.cpp
+++ b/src/quick/platform/android/qandroidquickviewembedding.cpp
@@ -87,11 +87,70 @@ namespace QtAndroidQuickViewEmbedding
qWarning("Setting the property type of %s is not supported.", valueClassname.data());
}
+ jobject getRootObjectProperty(JNIEnv *env, jobject object, jlong windowReference,
+ jstring propertyName)
+ {
+ Q_UNUSED(object);
+ Q_ASSERT(env);
+
+ const QString property = QJniObject(propertyName).toString();
+ QQuickView *view = reinterpret_cast<QQuickView *>(windowReference);
+ QQuickItem *rootObject = view->rootObject();
+ if (!rootObject) {
+ qWarning("Cannot read property %s as the QtQuickView instance (%s)"
+ "does not own a root object.",
+ qPrintable(property),
+ qPrintable(view->source().toString()));
+ return nullptr;
+ }
+
+ const QMetaObject *rootMetaObject = rootObject->metaObject();
+ int propertyIndex = rootMetaObject->indexOfProperty(property.toUtf8().constData());
+ if (propertyIndex < 0) {
+ qWarning("Cannot read property %s as it does not exist in the root QML object.",
+ qPrintable(property));
+ return nullptr;
+ }
+
+ QMetaProperty metaProperty = rootMetaObject->property(propertyIndex);
+ QVariant propertyValue = metaProperty.read(rootObject);
+ const int propertyTypeId = propertyValue.typeId();
+
+ switch (propertyTypeId) {
+ case QMetaType::Type::Int:
+ return env->NewLocalRef(
+ QJniObject::construct<QtJniTypes::Integer>(get<int>(std::move(propertyValue)))
+ .object());
+ case QMetaType::Type::Double:
+ return env->NewLocalRef(
+ QJniObject::construct<QtJniTypes::Double>(get<double>(std::move(propertyValue)))
+ .object());
+ case QMetaType::Type::Float:
+ return env->NewLocalRef(
+ QJniObject::construct<QtJniTypes::Float>(get<float>(std::move(propertyValue)))
+ .object());
+ case QMetaType::Type::Bool:
+ return env->NewLocalRef(
+ QJniObject::construct<QtJniTypes::Boolean>(get<bool>(std::move(propertyValue)))
+ .object());
+ case QMetaType::Type::QString:
+ return env->NewLocalRef(
+ QJniObject::fromString(get<QString>(std::move(propertyValue))).object());
+ default:
+ qWarning("Property %s cannot be converted to a supported Java data type.",
+ qPrintable(property));
+ }
+
+ return nullptr;
+ }
+
bool registerNatives(QJniEnvironment& env) {
return env.registerNativeMethods(QtJniTypes::Traits<QtJniTypes::QtQuickView>::className(),
{Q_JNI_NATIVE_SCOPED_METHOD(createQuickView,
QtAndroidQuickViewEmbedding),
Q_JNI_NATIVE_SCOPED_METHOD(setRootObjectProperty,
+ QtAndroidQuickViewEmbedding),
+ Q_JNI_NATIVE_SCOPED_METHOD(getRootObjectProperty,
QtAndroidQuickViewEmbedding)});
}
}