aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSoheil Armin <soheil.armin@qt.io>2024-04-20 16:49:22 +0300
committerSoheil Armin <soheil.armin@qt.io>2024-05-22 15:53:57 +0300
commit9166e9ffb62a16ed94743a9080772e8f27ba0299 (patch)
tree673490f0c948c95c027845aa3cc17d7db5b70c67
parent1163e6a420968508b67e803c3e1f197d5b97cc52 (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>
-rw-r--r--src/quick/platform/android/qandroidquickviewembedding.cpp17
-rw-r--r--src/quick/platform/android/qandroidquickviewembedding_p.h15
-rw-r--r--src/quick/platform/android/qandroidviewsignalmanager_p.h5
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);