summaryrefslogtreecommitdiffstats
path: root/src/nfc/qnearfieldmanager_android.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/nfc/qnearfieldmanager_android.cpp')
-rw-r--r--src/nfc/qnearfieldmanager_android.cpp67
1 files changed, 51 insertions, 16 deletions
diff --git a/src/nfc/qnearfieldmanager_android.cpp b/src/nfc/qnearfieldmanager_android.cpp
index a5693218..297f8ef8 100644
--- a/src/nfc/qnearfieldmanager_android.cpp
+++ b/src/nfc/qnearfieldmanager_android.cpp
@@ -48,22 +48,52 @@
#include "qdebug.h"
#include "qlist.h"
+#include <QScopedPointer>
#include <QtCore/QMetaType>
#include <QtCore/QMetaMethod>
+#include <QtCore/private/qjnihelpers_p.h>
QT_BEGIN_NAMESPACE
+Q_GLOBAL_STATIC(QAndroidJniObject, broadcastReceiver)
+Q_GLOBAL_STATIC(QList<QNearFieldManagerPrivateImpl *>, broadcastListener)
+
+extern "C"
+{
+ JNIEXPORT void JNICALL Java_org_qtproject_qt5_android_nfc_QtNfcBroadcastReceiver_jniOnReceive(
+ JNIEnv */*env*/, jobject /*javaObject*/, jint state)
+ {
+ QNearFieldManager::AdapterState adapterState = static_cast<QNearFieldManager::AdapterState>((int) state);
+
+ for (const auto listener : *broadcastListener) {
+ Q_EMIT listener->adapterStateChanged(adapterState);
+ }
+ }
+}
+
QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() :
m_detecting(false), m_handlerID(0)
{
qRegisterMetaType<QAndroidJniObject>("QAndroidJniObject");
qRegisterMetaType<QNdefMessage>("QNdefMessage");
- connect(this, SIGNAL(targetDetected(QNearFieldTarget*)), this, SLOT(handlerTargetDetected(QNearFieldTarget*)));
- connect(this, SIGNAL(targetLost(QNearFieldTarget*)), this, SLOT(handlerTargetLost(QNearFieldTarget*)));
+
+ if (!broadcastReceiver->isValid()) {
+ *broadcastReceiver = QAndroidJniObject("org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver",
+ "(Landroid/content/Context;)V", QtAndroidPrivate::context());
+ }
+ broadcastListener->append(this);
+
+ connect(this, &QNearFieldManagerPrivateImpl::targetDetected, this, &QNearFieldManagerPrivateImpl::handlerTargetDetected);
+ connect(this, &QNearFieldManagerPrivateImpl::targetLost, this, &QNearFieldManagerPrivateImpl::handlerTargetLost);
}
QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl()
{
+ broadcastListener->removeOne(this);
+ if (broadcastListener->isEmpty()) {
+ broadcastReceiver->callMethod<void>("unregisterReceiver");
+ *broadcastReceiver = QAndroidJniObject();
+ }
}
void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *target)
@@ -71,12 +101,12 @@ void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *targe
if (ndefMessageHandlers.count() == 0 && ndefFilterHandlers.count() == 0) // if no handler is registered
return;
if (target->hasNdefMessage()) {
- connect(target, SIGNAL(ndefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerNdefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)));
- connect(target, SIGNAL(requestCompleted(const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerRequestCompleted(const QNearFieldTarget::RequestId &)));
- connect(target, SIGNAL(error(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerError(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)));
+ connect(reinterpret_cast<NearFieldTarget *>(target), &NearFieldTarget::ndefMessageRead,
+ this, &QNearFieldManagerPrivateImpl::handlerNdefMessageRead);
+ connect(target, &QNearFieldTarget::requestCompleted,
+ this, &QNearFieldManagerPrivateImpl::handlerRequestCompleted);
+ connect(target, &QNearFieldTarget::error,
+ this, &QNearFieldManagerPrivateImpl::handlerError);
QNearFieldTarget::RequestId id = target->readNdefMessages();
m_idToTarget.insert(id, target);
@@ -85,12 +115,12 @@ void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *targe
void QNearFieldManagerPrivateImpl::handlerTargetLost(QNearFieldTarget *target)
{
- disconnect(target, SIGNAL(ndefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerNdefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)));
- disconnect(target, SIGNAL(requestCompleted(const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerRequestCompleted(const QNearFieldTarget::RequestId &)));
- disconnect(target, SIGNAL(error(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerError(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)));
+ disconnect(reinterpret_cast<NearFieldTarget *>(target), &NearFieldTarget::ndefMessageRead,
+ this, &QNearFieldManagerPrivateImpl::handlerNdefMessageRead);
+ disconnect(target, &QNearFieldTarget::requestCompleted,
+ this, &QNearFieldManagerPrivateImpl::handlerRequestCompleted);
+ disconnect(target, &QNearFieldTarget::error,
+ this, &QNearFieldManagerPrivateImpl::handlerError);
m_idToTarget.remove(m_idToTarget.key(target));
}
@@ -176,6 +206,11 @@ bool QNearFieldManagerPrivateImpl::isAvailable() const
return AndroidNfc::isAvailable();
}
+bool QNearFieldManagerPrivateImpl::isSupported() const
+{
+ return AndroidNfc::isSupported();
+}
+
bool QNearFieldManagerPrivateImpl::startTargetDetection()
{
if (m_detecting)
@@ -282,8 +317,8 @@ void QNearFieldManagerPrivateImpl::onTargetDiscovered(QAndroidJniObject intent)
target->setIntent(intent); // Updating existing target
} else {
target = new NearFieldTarget(intent, uid, this);
- connect(target, SIGNAL(targetDestroyed(QByteArray)), this, SLOT(onTargetDestroyed(QByteArray)));
- connect(target, SIGNAL(targetLost(QNearFieldTarget*)), this, SIGNAL(targetLost(QNearFieldTarget*)));
+ connect(target, &NearFieldTarget::targetDestroyed, this, &QNearFieldManagerPrivateImpl::onTargetDestroyed);
+ connect(target, &NearFieldTarget::targetLost, this, &QNearFieldManagerPrivateImpl::targetLost);
}
emit targetDetected(target);
}