aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/platform/android/qandroidquickviewembedding.cpp
diff options
context:
space:
mode:
authorSoheil Armin <soheil.armin@qt.io>2023-12-04 12:13:34 +0200
committerSoheil Armin <soheil.armin@qt.io>2024-02-15 10:07:11 +0200
commit9ca6eede194d7039180c2b39099c8688f1160b44 (patch)
tree91aab3a762f81df1fa5974b1117cf11d5ccf5067 /src/quick/platform/android/qandroidquickviewembedding.cpp
parent1d1ba46f54bcec6449d285c8f1f71540cdb02015 (diff)
Android: Add setProperty() to QtQuickView
Add setProperty() function to QtQuickView to set the property values from Java basic types including String, Int, Double and Boolean on the root object of underlying QQuickView. Pick-to: 6.7 Task-number: QTBUG-119341 Change-Id: I84e9d8a42bd6f2aa126255c206b0238cae8ab199 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.cpp52
1 files changed, 50 insertions, 2 deletions
diff --git a/src/quick/platform/android/qandroidquickviewembedding.cpp b/src/quick/platform/android/qandroidquickviewembedding.cpp
index 2a1bd81b83..2ef7355262 100644
--- a/src/quick/platform/android/qandroidquickviewembedding.cpp
+++ b/src/quick/platform/android/qandroidquickviewembedding.cpp
@@ -6,6 +6,7 @@
#include <QtCore/qjnienvironment.h>
#include <QtCore/qjniobject.h>
#include <QtCore/qjnitypes.h>
+#include <QtQuick/qquickitem.h>
QT_BEGIN_NAMESPACE
@@ -14,6 +15,13 @@ Q_DECLARE_JNI_CLASS(QtQuickView, "org/qtproject/qt/android/QtQuickView");
Q_DECLARE_JNI_CLASS(QtWindow, "org/qtproject/qt/android/QtWindow");
Q_DECLARE_JNI_CLASS(View, "android/view/View");
+Q_DECLARE_JNI_CLASS(Void, "java/lang/Void");
+Q_DECLARE_JNI_CLASS(Integer, "java/lang/Integer");
+Q_DECLARE_JNI_CLASS(Double, "java/lang/Double");
+Q_DECLARE_JNI_CLASS(Float, "java/lang/Float");
+Q_DECLARE_JNI_CLASS(Boolean, "java/lang/Boolean");
+Q_DECLARE_JNI_CLASS(String, "java/lang/String");
+
namespace QtAndroidQuickViewEmbedding
{
void createQuickView(JNIEnv*, jobject nativeWindow, jstring qmlUri, jint width, jint height,
@@ -41,10 +49,50 @@ namespace QtAndroidQuickViewEmbedding
});
}
+ void setRootObjectProperty(JNIEnv *env, jobject object, jlong windowReference,
+ jstring propertyName, jobject value)
+ {
+ Q_UNUSED(env);
+ Q_UNUSED(object);
+
+ QQuickItem *rootObject = reinterpret_cast<QQuickView *>(windowReference)->rootObject();
+ if (!rootObject) {
+ qWarning() << "QtQuickView instance does not own a root object.";
+ return;
+ }
+
+ const QString property = QJniObject(propertyName).toString();
+ const QMetaObject *rootMetaObject = rootObject->metaObject();
+ int propertyIndex = rootMetaObject->indexOfProperty(qPrintable(property));
+ if (propertyIndex < 0) {
+ qWarning("Property %s does not exist in the root QML object.", qPrintable(property));
+ return;
+ }
+
+ QMetaProperty metaProperty = rootMetaObject->property(propertyIndex);
+ const QJniObject propertyValue(value);
+ const QByteArray valueClassname = propertyValue.className();
+
+ if (valueClassname == QtJniTypes::Traits<QtJniTypes::String>::className())
+ metaProperty.write(rootObject, propertyValue.toString());
+ else if (valueClassname == QtJniTypes::Traits<QtJniTypes::Integer>::className())
+ metaProperty.write(rootObject, propertyValue.callMethod<jint>("intValue"));
+ else if (valueClassname == QtJniTypes::Traits<QtJniTypes::Double>::className())
+ metaProperty.write(rootObject, propertyValue.callMethod<jdouble>("doubleValue"));
+ else if (valueClassname == QtJniTypes::Traits<QtJniTypes::Float>::className())
+ metaProperty.write(rootObject, propertyValue.callMethod<jfloat>("floatValue"));
+ else if (valueClassname == QtJniTypes::Traits<QtJniTypes::Boolean>::className())
+ metaProperty.write(rootObject, propertyValue.callMethod<jboolean>("booleanValue"));
+ else
+ qWarning("Setting the property type of %s is not supported.", valueClassname.data());
+ }
+
bool registerNatives(QJniEnvironment& env) {
return env.registerNativeMethods(QtJniTypes::Traits<QtJniTypes::QtQuickView>::className(),
- {Q_JNI_NATIVE_SCOPED_METHOD(createQuickView,
- QtAndroidQuickViewEmbedding)});
+ {Q_JNI_NATIVE_SCOPED_METHOD(createQuickView,
+ QtAndroidQuickViewEmbedding),
+ Q_JNI_NATIVE_SCOPED_METHOD(setRootObjectProperty,
+ QtAndroidQuickViewEmbedding)});
}
}