Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qnearfieldmanager_android.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 Centria research and development
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include "qndefmessage.h"
7#include "qbytearray.h"
9
10#include <QtCore/QMetaType>
11
13
14extern "C"
15{
16 JNIEXPORT void JNICALL Java_org_qtproject_qt_android_nfc_QtNfcBroadcastReceiver_jniOnReceive(
17 JNIEnv */*env*/, jobject /*javaObject*/, jlong qtObject, jint state)
18 {
19 QNearFieldManager::AdapterState adapterState =
20 static_cast<QNearFieldManager::AdapterState>(state);
21 auto obj = reinterpret_cast<QNearFieldManagerPrivateImpl *>(qtObject);
22 Q_ASSERT(obj != nullptr);
23 obj->adapterStateChanged(adapterState);
24 }
25}
26
27Q_GLOBAL_STATIC(QMainNfcNewIntentListener, newIntentListener)
28
29QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() :
30 detecting(false)
31{
32 qRegisterMetaType<QJniObject>("QJniObject");
33 qRegisterMetaType<QNdefMessage>("QNdefMessage");
34
35 broadcastReceiver = QJniObject::construct<QtJniTypes::QtNfcBroadcastReceiver>(
36 reinterpret_cast<jlong>(this), QNativeInterface::QAndroidApplication::context());
37}
38
40{
41 broadcastReceiver.callMethod<void>("unregisterReceiver");
42}
43
45{
46 if (target->q_ptr) {
47 Q_EMIT targetDetected(target->q_ptr);
48 return;
49 }
50
51 Q_EMIT targetDetected(new QNearFieldTarget(target, this));
52}
53
55{
56 Q_EMIT targetLost(target->q_ptr);
57}
58
60{
61 return QtNfc::isEnabled();
62}
63
64bool QNearFieldManagerPrivateImpl::isSupported(QNearFieldTarget::AccessMethod accessMethod) const
65{
66 if (accessMethod == QNearFieldTarget::UnknownAccess)
67 return false;
68
70}
71
72bool QNearFieldManagerPrivateImpl::startTargetDetection(QNearFieldTarget::AccessMethod accessMethod)
73{
74 if (detecting)
75 return false; // Already detecting targets
76
77 if (newIntentListener.isDestroyed())
78 return false;
79
80 detecting = true;
81 requestedMethod = accessMethod;
82 newIntentListener->registerListener(this);
83 return true;
84}
85
86void QNearFieldManagerPrivateImpl::stopTargetDetection(const QString &)
87{
88 detecting = false;
89 if (newIntentListener.exists())
90 newIntentListener->unregisterListener(this);
91 Q_EMIT targetDetectionStopped();
92}
93
95{
96 // This function is called from different thread and is used to move intent to main thread.
97 QMetaObject::invokeMethod(this, [this, intent] {
98 this->onTargetDiscovered(intent);
99 }, Qt::QueuedConnection);
100}
101
103{
104 if (!intent.isValid())
105 return QByteArray();
106
107 QJniObject tag = QtNfc::getTag(intent);
108 if (!tag.isValid())
109 return QByteArray();
110
111 return tag.callMethod<jbyte[]>("getId").toContainer();
112}
113
114void QNearFieldManagerPrivateImpl::onTargetDiscovered(QJniObject intent)
115{
116 // Getting UID
117 QByteArray uid = getUid(intent);
118
119 // Accepting all targets but only sending signal of requested types.
120 QNearFieldTargetPrivateImpl *&target = detectedTargets[uid];
121 if (target) {
122 target->setIntent(intent); // Updating existing target
123 } else {
124 target = new QNearFieldTargetPrivateImpl(intent, uid);
125
126 if (target->accessMethods() & requestedMethod) {
127 connect(target, &QNearFieldTargetPrivateImpl::targetDestroyed, this, &QNearFieldManagerPrivateImpl::onTargetDestroyed);
128 connect(target, &QNearFieldTargetPrivateImpl::targetLost, this, &QNearFieldManagerPrivateImpl::onTargetLost);
129 onTargetDetected(target);
130 } else {
131 delete target;
132 detectedTargets.remove(uid);
133 }
134 }
135}
136
137void QNearFieldManagerPrivateImpl::onTargetDestroyed(const QByteArray &uid)
138{
139 detectedTargets.remove(uid);
140}
141
142QT_END_NAMESPACE
QByteArray getUid(const QJniObject &intent)
bool isSupported(QNearFieldTarget::AccessMethod accessMethod) const override
bool startTargetDetection(QNearFieldTarget::AccessMethod accessMethod) override
void newIntent(QJniObject intent) override
void targetLost(QNearFieldTargetPrivateImpl *target)
bool isEnabled()
bool isSupported()