Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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"
8#include "qcoreapplication.h"
9
10#include <QtCore/QMetaType>
11
13
14extern "C"
15{
17 JNIEnv */*env*/, jobject /*javaObject*/, jlong qtObject, jint state)
18 {
21 auto obj = reinterpret_cast<QNearFieldManagerPrivateImpl *>(qtObject);
22 Q_ASSERT(obj != nullptr);
23 obj->adapterStateChanged(adapterState);
24 }
25}
26
28
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
44void QNearFieldManagerPrivateImpl::onTargetDetected(QNearFieldTargetPrivateImpl *target)
45{
46 if (target->q_ptr) {
48 return;
49 }
50
52}
53
54void QNearFieldManagerPrivateImpl::onTargetLost(QNearFieldTargetPrivateImpl *target)
55{
56 Q_EMIT targetLost(target->q_ptr);
57}
58
63
65{
66 if (accessMethod == QNearFieldTarget::UnknownAccess)
67 return false;
68
69 return QtNfc::isSupported();
70}
71
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
87{
88 detecting = false;
89 if (newIntentListener.exists())
90 newIntentListener->unregisterListener(this);
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);
100}
101
103{
104 if (!intent.isValid())
105 return QByteArray();
106
107 QJniObject tag = QtNfc::getTag(intent);
108 return getUidforTag(tag);
109}
110
111void QNearFieldManagerPrivateImpl::onTargetDiscovered(QJniObject intent)
112{
113 // Getting UID
114 QByteArray uid = getUid(intent);
115
116 // Accepting all targets but only sending signal of requested types.
117 QNearFieldTargetPrivateImpl *&target = detectedTargets[uid];
118 if (target) {
119 target->setIntent(intent); // Updating existing target
120 } else {
121 target = new QNearFieldTargetPrivateImpl(intent, uid);
122
123 if (target->accessMethods() & requestedMethod) {
124 connect(target, &QNearFieldTargetPrivateImpl::targetDestroyed, this, &QNearFieldManagerPrivateImpl::onTargetDestroyed);
125 connect(target, &QNearFieldTargetPrivateImpl::targetLost, this, &QNearFieldManagerPrivateImpl::onTargetLost);
126 onTargetDetected(target);
127 } else {
128 delete target;
129 detectedTargets.remove(uid);
130 }
131 }
132}
133
134void QNearFieldManagerPrivateImpl::onTargetDestroyed(const QByteArray &uid)
135{
136 detectedTargets.remove(uid);
137}
138
140{
141 if (!tag.isValid())
142 return QByteArray();
143
144 QJniEnvironment env;
145 QJniObject tagId = tag.callMethod<jbyteArray>("getId");
146 QByteArray uid;
147 jsize len = env->GetArrayLength(tagId.object<jbyteArray>());
148 uid.resize(len);
149 env->GetByteArrayRegion(tagId.object<jbyteArray>(), 0, len, reinterpret_cast<jbyte*>(uid.data()));
150 return uid;
151}
152
\inmodule QtCore
Definition qbytearray.h:57
bool remove(const Key &key)
Removes the item that has the key from the hash.
Definition qhash.h:958
\inmodule QtCore
\inmodule QtCore
QByteArray getUid(const QJniObject &intent)
bool isSupported(QNearFieldTarget::AccessMethod accessMethod) const override
bool startTargetDetection(QNearFieldTarget::AccessMethod accessMethod) override
void newIntent(QJniObject intent) override
static QByteArray getUidforTag(const QJniObject &tag)
void stopTargetDetection(const QString &errorMessage) override
void targetDetected(QNearFieldTarget *target)
void targetLost(QNearFieldTarget *target)
void targetDestroyed(const QByteArray &tagId)
void targetLost(QNearFieldTargetPrivateImpl *target)
The QNearFieldTarget class provides an interface for communicating with a target device.
AccessMethod
This enum describes the access methods a near field target supports.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
else opt state
[0]
Combined button and popup list for selecting options.
bool isEnabled()
QJniObject getTag(const QJniObject &intent)
bool isSupported()
@ QueuedConnection
AudioChannelLayoutTag tag
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
QT_BEGIN_NAMESPACE JNIEXPORT void JNICALL Java_org_qtproject_qt_android_nfc_QtNfcBroadcastReceiver_jniOnReceive(JNIEnv *, jobject, jlong qtObject, jint state)
GLenum target
GLhandleARB obj
[2]
GLint tagId
GLenum GLsizei len
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define Q_EMIT
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...