1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtQuick/private/qandroidtypeconverter_p.h>
#include <QtQuick/private/qandroidviewsignalmanager_p.h>
QT_BEGIN_NAMESPACE
void QAndroidViewSignalManager::forwardSignal()
{
invokeListener(sender(), senderSignalIndex(), QVariant());
}
void QAndroidViewSignalManager::forwardSignal(int signalValue)
{
invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
}
void QAndroidViewSignalManager::forwardSignal(bool signalValue)
{
invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
}
void QAndroidViewSignalManager::forwardSignal(double signalValue)
{
invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
}
void QAndroidViewSignalManager::forwardSignal(float signalValue)
{
invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
}
void QAndroidViewSignalManager::forwardSignal(QString signalValue)
{
invokeListener(sender(), senderSignalIndex(), QVariant(signalValue));
}
void QAndroidViewSignalManager::invokeListener(QObject *sender, int senderSignalIndex,
QVariant signalValue)
{
using namespace QtJniTypes;
const QMetaObject *metaObject = sender->metaObject();
const QMetaMethod signalMethod = metaObject->method(senderSignalIndex);
for (auto connectionInfoIter = connectionInfoMap.constFind(signalMethod.methodSignature());
connectionInfoIter != connectionInfoMap.constEnd()
&& connectionInfoIter.key() == signalMethod.methodSignature();
++connectionInfoIter) {
const ConnectionInfo connectionInfo = *connectionInfoIter;
const QByteArray javaArgType = connectionInfo.javaArgType;
QJniObject jSignalMethodName =
QJniObject::fromString(QLatin1StringView(signalMethod.name()));
if (connectionInfo.propertyIndex != -1 && javaArgType != Traits<Void>::className())
signalValue = metaObject->property(connectionInfo.propertyIndex).read(sender);
QJniObject jValue(
QAndroidTypeConverter::toJavaObject(signalValue, QJniEnvironment::getJniEnv()));
if (!jValue.isValid()) {
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(
[connectionInfo, jSignalMethodName, jValue]() {
connectionInfo.listener.callMethod<void, jstring, jobject>(
"onSignalEmitted", jSignalMethodName.object<jstring>(),
jValue.object());
});
}
}
QT_END_NAMESPACE
|