diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/android/nfc/nfc.pro | 3 | ||||
-rw-r--r-- | src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java | 5 | ||||
-rw-r--r-- | src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java | 72 | ||||
-rw-r--r-- | src/bluetooth/android/androidbroadcastreceiver.cpp | 4 | ||||
-rw-r--r-- | src/bluetooth/android/lowenergynotificationhub.cpp | 2 | ||||
-rw-r--r-- | src/imports/bluetooth/plugin.cpp | 9 | ||||
-rw-r--r-- | src/imports/nfc/plugin.cpp | 9 | ||||
-rw-r--r-- | src/nfc/android/androidjninfc.cpp | 5 | ||||
-rw-r--r-- | src/nfc/android/androidjninfc_p.h | 1 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager.cpp | 49 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager.h | 9 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_android.cpp | 35 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_android_p.h | 1 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_neard.cpp | 15 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_neard_p.h | 2 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_p.h | 6 |
17 files changed, 206 insertions, 23 deletions
diff --git a/.qmake.conf b/.qmake.conf index 67c54ee6..097d8b94 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION = 5.11.1 +MODULE_VERSION = 5.12.0 diff --git a/src/android/nfc/nfc.pro b/src/android/nfc/nfc.pro index 89026b75..a725fb7d 100644 --- a/src/android/nfc/nfc.pro +++ b/src/android/nfc/nfc.pro @@ -7,7 +7,8 @@ PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/nfc JAVACLASSPATH += $$PWD/src/ JAVASOURCES += \ - $$PWD/src/org/qtproject/qt5/android/nfc/QtNfc.java + $$PWD/src/org/qtproject/qt5/android/nfc/QtNfc.java \ + $$PWD/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java \ # install target.path = $$[QT_INSTALL_PREFIX]/jar diff --git a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java index 345b87d3..6b0fbcbd 100644 --- a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java +++ b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java @@ -169,6 +169,11 @@ public class QtNfc return m_adapter.isEnabled(); } + static public boolean isSupported() + { + return (m_adapter != null); + } + static public Intent getStartIntent() { Log.d(TAG, "getStartIntent"); diff --git a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java new file mode 100644 index 00000000..ea650ede --- /dev/null +++ b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2018 Governikus GmbH & Co. KG +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtNfc module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +package org.qtproject.qt5.android.nfc; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.nfc.NfcAdapter; + + +public class QtNfcBroadcastReceiver extends BroadcastReceiver +{ + private Context qtContext; + + public QtNfcBroadcastReceiver(Context context) + { + qtContext = context; + IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); + qtContext.registerReceiver(this, filter); + } + + public void unregisterReceiver() + { + qtContext.unregisterReceiver(this); + } + + public void onReceive(Context context, Intent intent) + { + final int state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_OFF); + jniOnReceive(state); + } + + public native void jniOnReceive(int state); +} diff --git a/src/bluetooth/android/androidbroadcastreceiver.cpp b/src/bluetooth/android/androidbroadcastreceiver.cpp index 50465017..c64e61ff 100644 --- a/src/bluetooth/android/androidbroadcastreceiver.cpp +++ b/src/bluetooth/android/androidbroadcastreceiver.cpp @@ -54,9 +54,7 @@ AndroidBroadcastReceiver::AndroidBroadcastReceiver(QObject* parent) : QObject(parent), valid(false) { // get Qt Context - // TODO: replace with QtAndroidPrivate::context() introduced by Qt 5.8 - contextObject = QAndroidJniObject(QtAndroidPrivate::activity() - ? QtAndroidPrivate::activity() : QtAndroidPrivate::service()); + contextObject = QAndroidJniObject(QtAndroidPrivate::context()); broadcastReceiverObject = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver"); if (!broadcastReceiverObject.isValid()) diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index fee8ce19..b37e3e0c 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -70,7 +70,7 @@ LowEnergyNotificationHub::LowEnergyNotificationHub(const QBluetoothAddress &remo jBluetoothLe = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothLE", "(Ljava/lang/String;Landroid/content/Context;)V", address.object<jstring>(), - QtAndroidPrivate::activity() ? QtAndroidPrivate::activity() : QtAndroidPrivate::service()); + QtAndroidPrivate::context()); } if (env->ExceptionCheck() || !jBluetoothLe.isValid()) { diff --git a/src/imports/bluetooth/plugin.cpp b/src/imports/bluetooth/plugin.cpp index 07654ca9..1e9737c6 100644 --- a/src/imports/bluetooth/plugin.cpp +++ b/src/imports/bluetooth/plugin.cpp @@ -45,13 +45,6 @@ #include "qdeclarativebluetoothservice_p.h" #include "qdeclarativebluetoothsocket_p.h" -static void initResources() -{ -#ifdef QT_STATIC - Q_INIT_RESOURCE(qmake_QtBluetooth); -#endif -} - QT_USE_NAMESPACE class QBluetoothQmlPlugin : public QQmlExtensionPlugin @@ -59,7 +52,7 @@ class QBluetoothQmlPlugin : public QQmlExtensionPlugin Q_OBJECT Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) public: - QBluetoothQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); } + QBluetoothQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { } void registerTypes(const char *uri) { // @uri QtBluetooth diff --git a/src/imports/nfc/plugin.cpp b/src/imports/nfc/plugin.cpp index 749e03d7..3a6806fa 100644 --- a/src/imports/nfc/plugin.cpp +++ b/src/imports/nfc/plugin.cpp @@ -47,13 +47,6 @@ #include "qdeclarativendefurirecord_p.h" #include "qdeclarativendefmimerecord_p.h" -static void initResources() -{ -#ifdef QT_STATIC - Q_INIT_RESOURCE(qmake_QtNfc); -#endif -} - QT_USE_NAMESPACE class QNfcQmlPlugin : public QQmlExtensionPlugin @@ -62,7 +55,7 @@ class QNfcQmlPlugin : public QQmlExtensionPlugin Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) public: - QNfcQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); } + QNfcQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { } void registerTypes(const char *uri) { Q_ASSERT(uri == QStringLiteral("QtNfc")); diff --git a/src/nfc/android/androidjninfc.cpp b/src/nfc/android/androidjninfc.cpp index f21d3b08..9a1c5227 100644 --- a/src/nfc/android/androidjninfc.cpp +++ b/src/nfc/android/androidjninfc.cpp @@ -63,6 +63,11 @@ bool isAvailable() return QAndroidJniObject::callStaticMethod<jboolean>(nfcClassName,"isAvailable"); } +bool isSupported() +{ + return QAndroidJniObject::callStaticMethod<jboolean>(nfcClassName,"isSupported"); +} + bool stopDiscovery() { return QAndroidJniObject::callStaticMethod<jboolean>(nfcClassName,"stop"); diff --git a/src/nfc/android/androidjninfc_p.h b/src/nfc/android/androidjninfc_p.h index 746a93ee..60e9a107 100644 --- a/src/nfc/android/androidjninfc_p.h +++ b/src/nfc/android/androidjninfc_p.h @@ -71,6 +71,7 @@ bool startDiscovery(); bool stopDiscovery(); QAndroidJniObject getStartIntent(); bool isAvailable(); +bool isSupported(); bool registerListener(AndroidNfcListenerInterface *listener); bool unregisterListener(AndroidNfcListenerInterface *listener); QAndroidJniObject getTag(const QAndroidJniObject &intent); diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp index 099a070c..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*)), @@ -201,7 +232,10 @@ QNearFieldManager::~QNearFieldManager() } /*! - Returns true if NFC functionality is available; otherwise returns false. + Returns \c true if the device has a NFC adapter and + it is turned on; otherwise returns \c false. + + \sa isSupported() */ bool QNearFieldManager::isAvailable() const { @@ -211,6 +245,19 @@ bool QNearFieldManager::isAvailable() const } /*! + \since 5.12 + + Returns \c true if the underlying device has a NFC adapter; otherwise returns \c false. + + \sa isAvailable() +*/ +bool QNearFieldManager::isSupported() const +{ + Q_D(const QNearFieldManager); + + return d->isSupported(); +} +/*! \fn bool QNearFieldManager::startTargetDetection() Starts detecting targets and returns true if target detection is diff --git a/src/nfc/qnearfieldmanager.h b/src/nfc/qnearfieldmanager.h index 9583e01f..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, @@ -70,6 +77,7 @@ public: ~QNearFieldManager(); bool isAvailable() const; + bool isSupported() const; void setTargetAccessModes(TargetAccessModes accessModes); TargetAccessModes targetAccessModes() const; @@ -91,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 a5693218..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) @@ -176,6 +206,11 @@ bool QNearFieldManagerPrivateImpl::isAvailable() const return AndroidNfc::isAvailable(); } +bool QNearFieldManagerPrivateImpl::isSupported() const +{ + return AndroidNfc::isSupported(); +} + bool QNearFieldManagerPrivateImpl::startTargetDetection() { if (m_detecting) diff --git a/src/nfc/qnearfieldmanager_android_p.h b/src/nfc/qnearfieldmanager_android_p.h index 69c99709..563d26bc 100644 --- a/src/nfc/qnearfieldmanager_android_p.h +++ b/src/nfc/qnearfieldmanager_android_p.h @@ -76,6 +76,7 @@ public: ~QNearFieldManagerPrivateImpl(); virtual bool isAvailable() const; + bool isSupported() const override; virtual bool startTargetDetection(); virtual void stopTargetDetection(); virtual int registerNdefMessageHandler(QObject *object, const QMetaMethod &method); diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index f1758ae9..450b9b42 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -114,6 +114,21 @@ bool QNearFieldManagerPrivateImpl::isAvailable() const return false; } +bool QNearFieldManagerPrivateImpl::isSupported() const +{ + if (m_adapterPath.isEmpty()) { + qCWarning(QT_NFC_NEARD) << "no adapter found, neard daemon running?"; + return false; + } + + if (!m_neardHelper->dbusObjectManager()->isValid() || m_adapterPath.isNull()) { + qCWarning(QT_NFC_NEARD) << "dbus object manager invalid or adapter path invalid"; + return false; + } + + return true; +} + bool QNearFieldManagerPrivateImpl::startTargetDetection() { qCDebug(QT_NFC_NEARD) << "starting target detection"; diff --git a/src/nfc/qnearfieldmanager_neard_p.h b/src/nfc/qnearfieldmanager_neard_p.h index b50f947a..cf026982 100644 --- a/src/nfc/qnearfieldmanager_neard_p.h +++ b/src/nfc/qnearfieldmanager_neard_p.h @@ -75,6 +75,8 @@ public: bool isAvailable() const; + bool isSupported() const override; + bool startTargetDetection(); void stopTargetDetection(); diff --git a/src/nfc/qnearfieldmanager_p.h b/src/nfc/qnearfieldmanager_p.h index 7e461da8..351c844a 100644 --- a/src/nfc/qnearfieldmanager_p.h +++ b/src/nfc/qnearfieldmanager_p.h @@ -82,6 +82,11 @@ public: return false; } + virtual bool isSupported() const + { + return false; + } + virtual bool startTargetDetection() { return false; @@ -124,6 +129,7 @@ public: } signals: + void adapterStateChanged(QNearFieldManager::AdapterState state); void targetDetected(QNearFieldTarget *target); void targetLost(QNearFieldTarget *target); |