diff options
| author | Soheil Armin <soheil.armin@qt.io> | 2024-04-20 16:49:22 +0300 |
|---|---|---|
| committer | Soheil Armin <soheil.armin@qt.io> | 2024-05-22 15:53:57 +0300 |
| commit | 9166e9ffb62a16ed94743a9080772e8f27ba0299 (patch) | |
| tree | 673490f0c948c95c027845aa3cc17d7db5b70c67 | |
| parent | 1163e6a420968508b67e803c3e1f197d5b97cc52 (diff) | |
Android: Add QAndroidQuickView class that owns QAndroidViewSignalManager
Previously QAndroidViewSignalManager was a direct child
of the QQuickView. In JNI calls that we did not have a reference
to the signal manager, we had to use findChild to get access
to the instance of it.
We add QAndroidQuickView as a QQuickView subclass that owns
the QAndroidViewSignalManager instance.
Task-number: QTBUG-124488
Change-Id: I02ad10756a4af1ac82f130f349e7c8b6f563c70c
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
3 files changed, 25 insertions, 12 deletions
diff --git a/src/quick/platform/android/qandroidquickviewembedding.cpp b/src/quick/platform/android/qandroidquickviewembedding.cpp index f6d4f04b22..925120bc09 100644 --- a/src/quick/platform/android/qandroidquickviewembedding.cpp +++ b/src/quick/platform/android/qandroidquickviewembedding.cpp @@ -53,14 +53,13 @@ namespace QtAndroidQuickViewEmbedding qmlUrl, importPaths] { QWindow *parentWindow = reinterpret_cast<QWindow *>(parentWindowReference); - QQuickView *view = new QQuickView(parentWindow); + QAndroidQuickView *view = new QAndroidQuickView(parentWindow); QQmlEngine *engine = view->engine(); - new QAndroidViewSignalManager(view); - QObject::connect(view, &QQuickView::statusChanged, - [qtViewObject](QQuickView::Status status) { + QObject::connect(view, &QAndroidQuickView::statusChanged, + [qtViewObject](QAndroidQuickView::Status status) { qtViewObject.callMethod<void>("handleStatusChange", status); }); - view->setResizeMode(QQuickView::SizeRootObjectToView); + view->setResizeMode(QAndroidQuickView::SizeRootObjectToView); view->setColor(QColor(Qt::transparent)); view->setWidth(width); view->setHeight(height); @@ -76,9 +75,9 @@ namespace QtAndroidQuickViewEmbedding }); } - std::pair<QQuickView *, QQuickItem *> getViewAndRootObject(jlong windowReference) + std::pair<QAndroidQuickView *, QQuickItem *> getViewAndRootObject(jlong windowReference) { - QQuickView *view = reinterpret_cast<QQuickView *>(windowReference); + QAndroidQuickView *view = reinterpret_cast<QAndroidQuickView *>(windowReference); QQuickItem *rootObject = Q_LIKELY(view) ? view->rootObject() : nullptr; return std::make_pair(view, rootObject); } @@ -195,7 +194,7 @@ namespace QtAndroidQuickViewEmbedding return -1; } - QAndroidViewSignalManager *signalManager = view->findChild<QAndroidViewSignalManager *>(); + QAndroidViewSignalManager *signalManager = view->signalManager(); const QByteArray javaArgClass = QJniObject(argType).className(); const char *qArgName = QMetaType(javaToQMetaType.value(javaArgClass, QMetaType::Type::UnknownType)).name(); @@ -299,7 +298,7 @@ namespace QtAndroidQuickViewEmbedding return false; } - QAndroidViewSignalManager *signalManager = view->findChild<QAndroidViewSignalManager *>(); + QAndroidViewSignalManager *signalManager = view->signalManager(); if (!signalManager->connections.contains(signalListenerId)) return false; diff --git a/src/quick/platform/android/qandroidquickviewembedding_p.h b/src/quick/platform/android/qandroidquickviewembedding_p.h index c20585c5d0..99f6e3f012 100644 --- a/src/quick/platform/android/qandroidquickviewembedding_p.h +++ b/src/quick/platform/android/qandroidquickviewembedding_p.h @@ -15,6 +15,8 @@ // We mean it. // +#include <QtQuick/private/qandroidviewsignalmanager_p.h> + #include <QtCore/qjnienvironment.h> #include <QtCore/qjnitypes.h> #include <QtQuick/qquickview.h> @@ -41,6 +43,19 @@ namespace QtAndroidQuickViewEmbedding bool removeRootObjectSignalListener(JNIEnv *env, jobject, jlong parentWindowReference, jint signalListenerId); Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(removeRootObjectSignalListener) + + class QAndroidQuickView : public QQuickView + { + Q_OBJECT + std::unique_ptr<QAndroidViewSignalManager> m_signalManager; + + public: + explicit QAndroidQuickView(QWindow *parent) + : QQuickView(parent), m_signalManager(new QAndroidViewSignalManager()) + { + } + inline QAndroidViewSignalManager *signalManager() const { return m_signalManager.get(); }; + }; }; QT_END_NAMESPACE diff --git a/src/quick/platform/android/qandroidviewsignalmanager_p.h b/src/quick/platform/android/qandroidviewsignalmanager_p.h index 80dfc823fb..54a732a57a 100644 --- a/src/quick/platform/android/qandroidviewsignalmanager_p.h +++ b/src/quick/platform/android/qandroidviewsignalmanager_p.h @@ -17,7 +17,6 @@ #include <QtCore/qobject.h> #include <QtCore/qjnitypes.h> -#include <QtQuick/qquickview.h> QT_BEGIN_NAMESPACE @@ -34,8 +33,8 @@ public: int propertyIndex{ -1 }; }; - explicit QAndroidViewSignalManager(QQuickView *parent) - : QObject(parent), connectionHandleCounter(0) + explicit QAndroidViewSignalManager() + : QObject(), connectionHandleCounter(0) { } void invokeListener(QObject *sender, int senderSignalIndex, QVariant signalValue); |
