diff options
author | Lars Schmertmann <Lars.Schmertmann@governikus.de> | 2018-04-27 14:30:14 +0200 |
---|---|---|
committer | Lars Schmertmann <lars.schmertmann@governikus.de> | 2018-05-30 17:28:59 +0000 |
commit | c8e6dae2d9749179327df460755282cf5102e902 (patch) | |
tree | 27cccae4d5975163ec65019b67df479ab95232de /src/nfc | |
parent | 7ecded9968550011fb4d4d2e2dd02dd29c1054b3 (diff) |
Use Android broadcast ACTION_ADAPTER_STATE_CHANGED
To avoid polling of the NFC adapter state
a signal is added to the QNearFieldManager.
Change-Id: If9e1e8025cca2deb1338fa7db255ebe171cab823
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/nfc')
-rw-r--r-- | src/nfc/qnearfieldmanager.cpp | 31 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager.h | 8 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_android.cpp | 30 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_p.h | 1 |
4 files changed, 70 insertions, 0 deletions
diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp index 8b46d420..73b0c360 100644 --- a/src/nfc/qnearfieldmanager.cpp +++ b/src/nfc/qnearfieldmanager.cpp @@ -119,6 +119,19 @@ QT_BEGIN_NAMESPACE */ /*! + \enum QNearFieldManager::AdapterState + + \since 5.12 + + This enum describes the different states a NFC adapter can have. + + \value Offline The nfc adapter is offline. + \value TurningOn The nfc adapter is turning on. + \value Online The nfc adapter is online. + \value TurningOff The nfc adapter is turning off. +*/ + +/*! \enum QNearFieldManager::TargetAccessMode This enum describes the different access modes an application can have. @@ -133,6 +146,16 @@ QT_BEGIN_NAMESPACE */ /*! + \fn void QNearFieldManager::adapterStateChanged(AdapterState state) + + \since 5.12 + + This signal is emitted whenever the state of the NFC adapter changed. + + \note Currently, this signal is only emitted on Android. +*/ + +/*! \fn void QNearFieldManager::targetDetected(QNearFieldTarget *target) This signal is emitted whenever a target is detected. The \a target parameter represents the @@ -169,6 +192,10 @@ QT_BEGIN_NAMESPACE QNearFieldManager::QNearFieldManager(QObject *parent) : QObject(parent), d_ptr(new QNearFieldManagerPrivateImpl) { + qRegisterMetaType<AdapterState>(); + + connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged, + this, &QNearFieldManager::adapterStateChanged); connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)), this, SIGNAL(targetDetected(QNearFieldTarget*))); connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)), @@ -186,6 +213,10 @@ QNearFieldManager::QNearFieldManager(QObject *parent) QNearFieldManager::QNearFieldManager(QNearFieldManagerPrivate *backend, QObject *parent) : QObject(parent), d_ptr(backend) { + qRegisterMetaType<AdapterState>(); + + connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged, + this, &QNearFieldManager::adapterStateChanged); connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)), this, SIGNAL(targetDetected(QNearFieldTarget*))); connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)), diff --git a/src/nfc/qnearfieldmanager.h b/src/nfc/qnearfieldmanager.h index 1dcb3485..500b9631 100644 --- a/src/nfc/qnearfieldmanager.h +++ b/src/nfc/qnearfieldmanager.h @@ -56,6 +56,13 @@ class Q_NFC_EXPORT QNearFieldManager : public QObject Q_DECLARE_PRIVATE(QNearFieldManager) public: + enum class AdapterState { + Offline = 1, + TurningOn = 2, + Online = 3, + TurningOff = 4 + }; + Q_ENUM(AdapterState) enum TargetAccessMode { NoTargetAccess = 0x00, NdefReadTargetAccess = 0x01, @@ -92,6 +99,7 @@ public: bool unregisterNdefMessageHandler(int handlerId); Q_SIGNALS: + void adapterStateChanged(AdapterState state); void targetDetected(QNearFieldTarget *target); void targetLost(QNearFieldTarget *target); diff --git a/src/nfc/qnearfieldmanager_android.cpp b/src/nfc/qnearfieldmanager_android.cpp index dd814787..ecefa801 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"); + + if (!broadcastReceiver->isValid()) { + *broadcastReceiver = QAndroidJniObject("org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver", + "(Landroid/content/Context;)V", QtAndroidPrivate::context()); + } + broadcastListener->append(this); + connect(this, SIGNAL(targetDetected(QNearFieldTarget*)), this, SLOT(handlerTargetDetected(QNearFieldTarget*))); connect(this, SIGNAL(targetLost(QNearFieldTarget*)), this, SLOT(handlerTargetLost(QNearFieldTarget*))); } QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl() { + broadcastListener->removeOne(this); + if (broadcastListener->isEmpty()) { + broadcastReceiver->callMethod<void>("unregisterReceiver"); + *broadcastReceiver = QAndroidJniObject(); + } } void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *target) diff --git a/src/nfc/qnearfieldmanager_p.h b/src/nfc/qnearfieldmanager_p.h index 8e86ce4b..351c844a 100644 --- a/src/nfc/qnearfieldmanager_p.h +++ b/src/nfc/qnearfieldmanager_p.h @@ -129,6 +129,7 @@ public: } signals: + void adapterStateChanged(QNearFieldManager::AdapterState state); void targetDetected(QNearFieldTarget *target); void targetLost(QNearFieldTarget *target); |