aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/platform/android/qandroidquickviewembedding.cpp
diff options
context:
space:
mode:
authorSoheil Armin <soheil.armin@qt.io>2024-04-20 16:16:01 +0300
committerSoheil Armin <soheil.armin@qt.io>2024-05-22 15:53:55 +0300
commit1163e6a420968508b67e803c3e1f197d5b97cc52 (patch)
treebddf3dd931d0d9dee97e3bcbed9354919c6071ef /src/quick/platform/android/qandroidquickviewembedding.cpp
parent7d2e12243f7d418a9bf52673c393fc60ed1b4365 (diff)
Android: Rename and split SignalHelper into new header and source files
SignalHelper renamed to QAndroidViewSignalManger SignalInfo nested struct renamed to ConnectionInfo And QAndroidViewSignalManger split into new header and source files. Task-number: QTBUG-124488 Change-Id: I77ab8bf995043993224a6c5cafce5ac57dca59d9 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.cpp154
1 files changed, 36 insertions, 118 deletions
diff --git a/src/quick/platform/android/qandroidquickviewembedding.cpp b/src/quick/platform/android/qandroidquickviewembedding.cpp
index dbe6c69767..f6d4f04b22 100644
--- a/src/quick/platform/android/qandroidquickviewembedding.cpp
+++ b/src/quick/platform/android/qandroidquickviewembedding.cpp
@@ -2,6 +2,7 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtQuick/private/qandroidquickviewembedding_p.h>
+#include <QtQuick/private/qandroidviewsignalmanager_p.h>
#include <QtCore/qcoreapplication.h>
#include <QtCore/qjnienvironment.h>
@@ -54,7 +55,7 @@ namespace QtAndroidQuickViewEmbedding
QWindow *parentWindow = reinterpret_cast<QWindow *>(parentWindowReference);
QQuickView *view = new QQuickView(parentWindow);
QQmlEngine *engine = view->engine();
- new SignalHelper(view);
+ new QAndroidViewSignalManager(view);
QObject::connect(view, &QQuickView::statusChanged,
[qtViewObject](QQuickView::Status status) {
qtViewObject.callMethod<void>("handleStatusChange", status);
@@ -194,7 +195,7 @@ namespace QtAndroidQuickViewEmbedding
return -1;
}
- SignalHelper *signalHelper = view->findChild<SignalHelper *>();
+ QAndroidViewSignalManager *signalManager = view->findChild<QAndroidViewSignalManager *>();
const QByteArray javaArgClass = QJniObject(argType).className();
const char *qArgName =
QMetaType(javaToQMetaType.value(javaArgClass, QMetaType::Type::UnknownType)).name();
@@ -233,7 +234,7 @@ namespace QtAndroidQuickViewEmbedding
if (signalIndex == -1)
return -1;
- const QMetaObject *helperMetaObject = signalHelper->metaObject();
+ const QMetaObject *helperMetaObject = signalManager->metaObject();
QByteArray helperSignalSignature = signalSignature;
helperSignalSignature.replace(0, signalSignature.indexOf('('), "forwardSignal");
int helperSlotIndex = helperMetaObject->indexOfSlot(helperSignalSignature.constData());
@@ -242,15 +243,17 @@ namespace QtAndroidQuickViewEmbedding
// Return the id if the signal is already connected to the same listener.
QJniObject listenerJniObject(listener);
- if (signalHelper->listenersMap.contains(signalSignature)) {
- auto listenerInfos = signalHelper->listenersMap.values(signalSignature);
- auto isSameListener = [listenerJniObject](const SignalHelper::ListenerInfo &listenerInfo) {
- return listenerInfo.listener == listenerJniObject;
- };
- auto iterator = std::find_if(listenerInfos.constBegin(),
- listenerInfos.constEnd(),
+ if (signalManager->connectionInfoMap.contains(signalSignature)) {
+ auto connectionInfos = signalManager->connectionInfoMap.values(signalSignature);
+ auto isSameListener =
+ [listenerJniObject](
+ const QAndroidViewSignalManager::ConnectionInfo &connectionInfo) {
+ return connectionInfo.listener == listenerJniObject;
+ };
+ auto iterator = std::find_if(connectionInfos.constBegin(),
+ connectionInfos.constEnd(),
isSameListener);
- if (iterator != listenerInfos.end()) {
+ if (iterator != connectionInfos.end()) {
qWarning("Signal listener with the ID of %i is already connected to %s signal.",
iterator->id,
signalSignature.constData());
@@ -260,30 +263,30 @@ namespace QtAndroidQuickViewEmbedding
QMetaMethod signalMethod = metaObject->method(signalIndex);
QMetaMethod signalForwarderMethod = helperMetaObject->method(helperSlotIndex);
- signalHelper->connectionHandleCounter++;
+ signalManager->connectionHandleCounter++;
QMetaObject::Connection connection;
- if (signalHelper->listenersMap.contains(signalSignature)) {
- connection = signalHelper
- ->connections[signalHelper->listenersMap.value(signalSignature).id];
+ if (signalManager->connectionInfoMap.contains(signalSignature)) {
+ const int existingId = signalManager->connectionInfoMap.value(signalSignature).id;
+ connection = signalManager->connections[existingId];
} else {
connection = QObject::connect(rootObject,
signalMethod,
- signalHelper,
+ signalManager,
signalForwarderMethod);
}
- SignalHelper::ListenerInfo listenerInfo;
- listenerInfo.listener = listenerJniObject;
- listenerInfo.javaArgType = javaArgClass;
- listenerInfo.propertyIndex = propertyIndex;
- listenerInfo.signalSignature = signalSignature;
- listenerInfo.id = signalHelper->connectionHandleCounter;
+ QAndroidViewSignalManager::ConnectionInfo connectionInfo;
+ connectionInfo.listener = listenerJniObject;
+ connectionInfo.javaArgType = javaArgClass;
+ connectionInfo.propertyIndex = propertyIndex;
+ connectionInfo.signalSignature = signalSignature;
+ connectionInfo.id = signalManager->connectionHandleCounter;
- signalHelper->listenersMap.insert(signalSignature, listenerInfo);
- signalHelper->connections.insert(listenerInfo.id, connection);
+ signalManager->connectionInfoMap.insert(signalSignature, connectionInfo);
+ signalManager->connections.insert(connectionInfo.id, connection);
- return listenerInfo.id;
+ return connectionInfo.id;
}
bool removeRootObjectSignalListener(JNIEnv *, jobject, jlong windowReference,
@@ -296,16 +299,16 @@ namespace QtAndroidQuickViewEmbedding
return false;
}
- SignalHelper *signalHelper = view->findChild<SignalHelper *>();
- if (!signalHelper->connections.contains(signalListenerId))
+ QAndroidViewSignalManager *signalManager = view->findChild<QAndroidViewSignalManager *>();
+ if (!signalManager->connections.contains(signalListenerId))
return false;
QByteArray signalSignature;
- for (auto listenerInfoIter = signalHelper->listenersMap.begin();
- listenerInfoIter != signalHelper->listenersMap.end();) {
+ for (auto listenerInfoIter = signalManager->connectionInfoMap.begin();
+ listenerInfoIter != signalManager->connectionInfoMap.end();) {
if (listenerInfoIter->id == signalListenerId) {
signalSignature = listenerInfoIter->signalSignature;
- signalHelper->listenersMap.erase(listenerInfoIter);
+ signalManager->connectionInfoMap.erase(listenerInfoIter);
break;
} else {
++listenerInfoIter;
@@ -313,98 +316,13 @@ namespace QtAndroidQuickViewEmbedding
}
// disconnect if its the last listener associated with the signal signatures
- if (!signalHelper->listenersMap.contains(signalSignature))
- rootObject->disconnect(signalHelper->connections.value(signalListenerId));
+ if (!signalManager->connectionInfoMap.contains(signalSignature))
+ rootObject->disconnect(signalManager->connections.value(signalListenerId));
- signalHelper->connections.remove(signalListenerId);
+ signalManager->connections.remove(signalListenerId);
return true;
}
- void SignalHelper::forwardSignal()
- {
- invokeListener(sender(), senderSignalIndex(), QVariant());
- }
-
- void SignalHelper::forwardSignal(int signalValue)
- {
- invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
- }
-
- void SignalHelper::forwardSignal(bool signalValue)
- {
- invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
- }
-
- void SignalHelper::forwardSignal(double signalValue)
- {
- invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
- }
-
- void SignalHelper::forwardSignal(float signalValue)
- {
- invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
- }
-
- void SignalHelper::forwardSignal(QString signalValue)
- {
- invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
- }
-
- void SignalHelper::invokeListener(QObject *sender, int senderSignalIndex, QVariant signalValue)
- {
- using namespace QtJniTypes;
-
- const QMetaObject *metaObject = sender->metaObject();
- const QMetaMethod signalMethod = metaObject->method(senderSignalIndex);
-
- for (auto listenerInfoIter = listenersMap.constFind(signalMethod.methodSignature());
- listenerInfoIter != listenersMap.constEnd() &&
- listenerInfoIter.key() == signalMethod.methodSignature();
- ++listenerInfoIter) {
- const ListenerInfo listenerInfo = *listenerInfoIter;
- const QByteArray javaArgType = listenerInfo.javaArgType;
- QJniObject jSignalMethodName =
- QJniObject::fromString(QLatin1StringView(signalMethod.name()));
-
- if (listenerInfo.propertyIndex != -1 && javaArgType != Traits<Void>::className())
- signalValue = metaObject->property(listenerInfo.propertyIndex).read(sender);
-
- int valueTypeId = signalValue.typeId();
- QJniObject jValue;
-
- switch (valueTypeId) {
- case QMetaType::Type::UnknownType:
- break;
- case QMetaType::Type::Int:
- jValue = qVariantToJniObject<Integer,jint>(signalValue);
- break;
- case QMetaType::Type::Double:
- jValue = qVariantToJniObject<Double,jdouble>(signalValue);
- break;
- case QMetaType::Type::Float:
- jValue = qVariantToJniObject<Float,jfloat>(signalValue);
- break;
- case QMetaType::Type::Bool:
- jValue = qVariantToJniObject<Boolean,jboolean>(signalValue);
- break;
- case QMetaType::Type::QString:
- jValue = QJniObject::fromString(get<QString>(std::move(signalValue)));
- break;
- default:
- qWarning("Mismatching argument types between QML signal (%s) and the Java function "
- "(%s). Sending null as argument.",
- signalMethod.methodSignature().constData(), javaArgType.constData());
- }
-
- QNativeInterface::QAndroidApplication::runOnAndroidMainThread(
- [listenerInfo, jSignalMethodName, jValue]() {
- listenerInfo.listener.callMethod<void, jstring, jobject>("onSignalEmitted",
- jSignalMethodName.object<jstring>(),
- jValue.object());
- });
- }
- }
-
bool registerNatives(QJniEnvironment& env) {
return env.registerNativeMethods(QtJniTypes::Traits<QtJniTypes::QtQuickView>::className(),
{Q_JNI_NATIVE_SCOPED_METHOD(createQuickView,