summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--config.tests/winrt_bt/main.cpp4
-rw-r--r--src/android/nfc/nfc.pro3
-rw-r--r--src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java5
-rw-r--r--src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java72
-rw-r--r--src/bluetooth/android/androidbroadcastreceiver.cpp4
-rw-r--r--src/bluetooth/android/lowenergynotificationhub.cpp2
-rw-r--r--src/bluetooth/qlowenergycontroller_winrt.cpp5
-rw-r--r--src/imports/bluetooth/plugin.cpp9
-rw-r--r--src/imports/nfc/plugin.cpp9
-rw-r--r--src/nfc/android/androidjninfc.cpp5
-rw-r--r--src/nfc/android/androidjninfc_p.h1
-rw-r--r--src/nfc/neard/neard_helper.cpp8
-rw-r--r--src/nfc/qllcpsocket_android_p.cpp6
-rw-r--r--src/nfc/qnearfieldmanager.cpp65
-rw-r--r--src/nfc/qnearfieldmanager.h9
-rw-r--r--src/nfc/qnearfieldmanager_android.cpp67
-rw-r--r--src/nfc/qnearfieldmanager_android_p.h1
-rw-r--r--src/nfc/qnearfieldmanager_emulator.cpp4
-rw-r--r--src/nfc/qnearfieldmanager_neard.cpp23
-rw-r--r--src/nfc/qnearfieldmanager_neard_p.h2
-rw-r--r--src/nfc/qnearfieldmanager_p.h6
-rw-r--r--src/nfc/qnearfieldtagtype1.cpp8
-rw-r--r--src/nfc/qnearfieldtarget.cpp13
-rw-r--r--src/nfc/qnearfieldtarget.h2
-rw-r--r--src/nfc/qnearfieldtarget_android.cpp36
-rw-r--r--src/nfc/qnearfieldtarget_emulator.cpp20
-rw-r--r--src/nfc/qnearfieldtarget_neard_p.h8
28 files changed, 283 insertions, 116 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/config.tests/winrt_bt/main.cpp b/config.tests/winrt_bt/main.cpp
index 2e0eb276..85c26bf7 100644
--- a/config.tests/winrt_bt/main.cpp
+++ b/config.tests/winrt_bt/main.cpp
@@ -30,6 +30,10 @@
#include <windows.devices.enumeration.h>
#include <windows.devices.bluetooth.h>
+#if defined(_WIN32) && defined(__INTEL_COMPILER)
+#error "Windows ICC fails to build the WinRT backend (QTBUG-68026)."
+#endif
+
int main()
{
Microsoft::WRL::ComPtr<ABI::Windows::Devices::Enumeration::IDeviceInformationStatics> deviceInformationStatics;
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/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp
index 628f1195..917f3790 100644
--- a/src/bluetooth/qlowenergycontroller_winrt.cpp
+++ b/src/bluetooth/qlowenergycontroller_winrt.cpp
@@ -937,7 +937,7 @@ void QLowEnergyControllerPrivateWinRT::writeCharacteristic(const QSharedPointer<
GattWriteOption option = writeWithResponse ? GattWriteOption_WriteWithResponse : GattWriteOption_WriteWithoutResponse;
hr = characteristic->WriteValueWithOptionAsync(buffer.Get(), option, &writeOp);
Q_ASSERT_SUCCEEDED(hr);
- auto writeCompletedLambda =[charData, charHandle, newValue, service, this]
+ auto writeCompletedLambda =[charData, charHandle, newValue, service, writeWithResponse, this]
(IAsyncOperation<GattCommunicationStatus> *op, AsyncStatus status)
{
if (status == AsyncStatus::Canceled || status == AsyncStatus::Error) {
@@ -963,7 +963,8 @@ void QLowEnergyControllerPrivateWinRT::writeCharacteristic(const QSharedPointer<
// empty.
if (charData.properties & QLowEnergyCharacteristic::Read)
updateValueOfCharacteristic(charHandle, newValue, false);
- emit service->characteristicWritten(QLowEnergyCharacteristic(service, charHandle), newValue);
+ if (writeWithResponse)
+ emit service->characteristicWritten(QLowEnergyCharacteristic(service, charHandle), newValue);
return S_OK;
};
hr = writeOp->put_Completed(Callback<IAsyncOperationCompletedHandler<GattCommunicationStatus>>(writeCompletedLambda).Get());
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/neard/neard_helper.cpp b/src/nfc/neard/neard_helper.cpp
index ef0447a0..9922c1a8 100644
--- a/src/nfc/neard/neard_helper.cpp
+++ b/src/nfc/neard/neard_helper.cpp
@@ -62,10 +62,10 @@ NeardHelper::NeardHelper(QObject *parent) :
return;
}
- connect(m_dbusObjectManager, SIGNAL(InterfacesAdded(QDBusObjectPath,InterfaceList)),
- this, SLOT(interfacesAdded(QDBusObjectPath,InterfaceList)));
- connect(m_dbusObjectManager, SIGNAL(InterfacesRemoved(QDBusObjectPath,QStringList)),
- this, SLOT(interfacesRemoved(QDBusObjectPath,QStringList)));
+ connect(m_dbusObjectManager, &OrgFreedesktopDBusObjectManagerInterface::InterfacesAdded,
+ this, &NeardHelper::interfacesAdded);
+ connect(m_dbusObjectManager, &OrgFreedesktopDBusObjectManagerInterface::InterfacesRemoved,
+ this, &NeardHelper::interfacesRemoved);
}
NeardHelper *NeardHelper::instance()
diff --git a/src/nfc/qllcpsocket_android_p.cpp b/src/nfc/qllcpsocket_android_p.cpp
index e29634d4..26b50c34 100644
--- a/src/nfc/qllcpsocket_android_p.cpp
+++ b/src/nfc/qllcpsocket_android_p.cpp
@@ -71,7 +71,7 @@ void QLlcpSocketPrivate::connectToService(QNearFieldTarget *target, const QStrin
QNXNFCManager::instance()->registerLLCPConnection(m_conListener, this);
qQNXNFCDebug() << "Connecting client socket" << serviceUri << m_conListener;
- connect(QNXNFCManager::instance(), SIGNAL(llcpDisconnected()), this, SLOT(disconnectFromService()));*/
+ connect(QNXNFCManager::instance(), &QNXNFCManager::llcpDisconnected, this, &QLlcpSocketPrivate::disconnectFromService);*/
}
void QLlcpSocketPrivate::disconnectFromService()
@@ -83,7 +83,7 @@ void QLlcpSocketPrivate::disconnectFromService()
qWarning() << Q_FUNC_INFO << "Error when trying to close LLCP socket";
}
QNXNFCManager::instance()->unregisterLLCPConnection(m_conListener);
- disconnect(QNXNFCManager::instance(), SIGNAL(llcpDisconnected()), this, SLOT(disconnectFromService()));
+ disconnect(QNXNFCManager::instance(), &QNXNFCManager::llcpDisconnected, this, &QLlcpSocketPrivate::disconnectFromService);
q->disconnected();
m_conListener = 0;
@@ -96,7 +96,7 @@ bool QLlcpSocketPrivate::bind(quint8 port)
/*m_state = QLlcpSocket::ConnectedState;
m_server = true;
- connect(QNXNFCManager::instance(), SIGNAL(llcpDisconnected()), this, SLOT(disconnectFromService()));
+ connect(QNXNFCManager::instance(), &QNXNFCManager::llcpDisconnected, this, &QLlcpSocketPrivate::disconnectFromService);
connected(QNXNFCManager::instance()->getLastTarget());*/
return true;
diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp
index 099a070c..02e4d918 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,10 +192,14 @@ QT_BEGIN_NAMESPACE
QNearFieldManager::QNearFieldManager(QObject *parent)
: QObject(parent), d_ptr(new QNearFieldManagerPrivateImpl)
{
- connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)),
- this, SIGNAL(targetDetected(QNearFieldTarget*)));
- connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)),
- this, SIGNAL(targetLost(QNearFieldTarget*)));
+ qRegisterMetaType<AdapterState>();
+
+ connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged,
+ this, &QNearFieldManager::adapterStateChanged);
+ connect(d_ptr, &QNearFieldManagerPrivate::targetDetected,
+ this, &QNearFieldManager::targetDetected);
+ connect(d_ptr, &QNearFieldManagerPrivate::targetLost,
+ this, &QNearFieldManager::targetLost);
}
/*!
@@ -186,10 +213,14 @@ QNearFieldManager::QNearFieldManager(QObject *parent)
QNearFieldManager::QNearFieldManager(QNearFieldManagerPrivate *backend, QObject *parent)
: QObject(parent), d_ptr(backend)
{
- connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)),
- this, SIGNAL(targetDetected(QNearFieldTarget*)));
- connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)),
- this, SIGNAL(targetLost(QNearFieldTarget*)));
+ qRegisterMetaType<AdapterState>();
+
+ connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged,
+ this, &QNearFieldManager::adapterStateChanged);
+ connect(d_ptr, &QNearFieldManagerPrivate::targetDetected,
+ this, &QNearFieldManager::targetDetected);
+ connect(d_ptr, &QNearFieldManagerPrivate::targetLost,
+ this, &QNearFieldManager::targetLost);
}
/*!
@@ -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..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);
}
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_emulator.cpp b/src/nfc/qnearfieldmanager_emulator.cpp
index 3186bae5..c2c037f6 100644
--- a/src/nfc/qnearfieldmanager_emulator.cpp
+++ b/src/nfc/qnearfieldmanager_emulator.cpp
@@ -53,8 +53,8 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl()
tagActivator->initialize();
- connect(tagActivator, SIGNAL(tagActivated(TagBase*)), this, SLOT(tagActivated(TagBase*)));
- connect(tagActivator, SIGNAL(tagDeactivated(TagBase*)), this, SLOT(tagDeactivated(TagBase*)));
+ connect(tagActivator, &TagActivator::tagActivated, this, &QNearFieldManagerPrivateImpl::tagActivated);
+ connect(tagActivator, &TagActivator::tagDeactivated, this, &QNearFieldManagerPrivateImpl::tagDeactivated);
}
QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl()
diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp
index f1758ae9..7c1c6e05 100644
--- a/src/nfc/qnearfieldmanager_neard.cpp
+++ b/src/nfc/qnearfieldmanager_neard.cpp
@@ -80,10 +80,10 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl()
if (!found) {
qCWarning(QT_NFC_NEARD) << "no adapter found, neard daemon running?";
} else {
- connect(m_neardHelper, SIGNAL(tagFound(QDBusObjectPath)),
- this, SLOT(handleTagFound(QDBusObjectPath)));
- connect(m_neardHelper, SIGNAL(tagRemoved(QDBusObjectPath)),
- this, SLOT(handleTagRemoved(QDBusObjectPath)));
+ connect(m_neardHelper, &NeardHelper::tagFound,
+ this, &QNearFieldManagerPrivateImpl::handleTagFound);
+ connect(m_neardHelper, &NeardHelper::tagRemoved,
+ this, &QNearFieldManagerPrivateImpl::handleTagRemoved);
}
}
@@ -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);
diff --git a/src/nfc/qnearfieldtagtype1.cpp b/src/nfc/qnearfieldtagtype1.cpp
index 34f2c8b8..7f27fbe9 100644
--- a/src/nfc/qnearfieldtagtype1.cpp
+++ b/src/nfc/qnearfieldtagtype1.cpp
@@ -440,9 +440,7 @@ QNearFieldTarget::RequestId QNearFieldTagType1::readNdefMessages()
if (d->m_readNdefMessageState == QNearFieldTagType1Private::NotReadingNdefMessage) {
d->progressToNextNdefReadMessageState();
} else {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, NdefReadError),
- Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId));
+ reportError(QNearFieldTarget::NdefReadError, d->m_readNdefRequestId);
}
return d->m_readNdefRequestId;
@@ -462,9 +460,7 @@ QNearFieldTarget::RequestId QNearFieldTagType1::writeNdefMessages(const QList<QN
d->m_ndefWriteMessages = messages;
d->progressToNextNdefWriteMessageState();
} else {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, NdefWriteError),
- Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId));
+ reportError(QNearFieldTarget::NdefWriteError, d->m_readNdefRequestId);
}
return d->m_writeNdefRequestId;
diff --git a/src/nfc/qnearfieldtarget.cpp b/src/nfc/qnearfieldtarget.cpp
index e642824b..e9a6fa11 100644
--- a/src/nfc/qnearfieldtarget.cpp
+++ b/src/nfc/qnearfieldtarget.cpp
@@ -530,4 +530,17 @@ bool QNearFieldTarget::handleResponse(const QNearFieldTarget::RequestId &id,
return true;
}
+/*!
+ \since 5.12
+
+ Reports the \a error for the request \a id by appending the signal emission to the event queue.
+*/
+void QNearFieldTarget::reportError(QNearFieldTarget::Error error,
+ const QNearFieldTarget::RequestId &id)
+{
+ QMetaObject::invokeMethod(this, [this, error, id]() {
+ Q_EMIT this->error(error, id);
+ }, Qt::QueuedConnection);
+}
+
QT_END_NAMESPACE
diff --git a/src/nfc/qnearfieldtarget.h b/src/nfc/qnearfieldtarget.h
index e51960f7..868b52d5 100644
--- a/src/nfc/qnearfieldtarget.h
+++ b/src/nfc/qnearfieldtarget.h
@@ -153,6 +153,8 @@ protected:
Q_INVOKABLE virtual bool handleResponse(const QNearFieldTarget::RequestId &id,
const QByteArray &response);
+ void reportError(QNearFieldTarget::Error error, const QNearFieldTarget::RequestId &id);
+
Q_SIGNALS:
void disconnected();
diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp
index e656996e..78da6ac2 100644
--- a/src/nfc/qnearfieldtarget_android.cpp
+++ b/src/nfc/qnearfieldtarget_android.cpp
@@ -147,25 +147,19 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages()
// Making sure that target is still in range
QNearFieldTarget::RequestId requestId(new QNearFieldTarget::RequestIdPrivate);
if (!m_intent.isValid()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, requestId);
return requestId;
}
// Getting Ndef technology object
if (!setTagTechnology({NDEFTECHNOLOGY})) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnsupportedError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::UnsupportedError, requestId);
return requestId;
}
// Connect
if (!connect()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, requestId);
return requestId;
}
@@ -174,9 +168,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages()
if (catchJavaExceptions())
ndefMessage = QAndroidJniObject();
if (!ndefMessage.isValid()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefReadError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::NdefReadError, requestId);
return requestId;
}
@@ -249,9 +241,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma
// Connecting
QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate());
if (!connect()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, requestId);
return requestId;
}
@@ -263,9 +253,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma
// Writing
QAndroidJniObject myNewVal = m_tagTech.callObjectMethod("transceive", "([B)[B", jba);
if (catchJavaExceptions()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::CommandError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::CommandError, requestId);
return requestId;
}
QByteArray result = jbyteArrayToQByteArray(myNewVal.object<jbyteArray>());
@@ -315,9 +303,7 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QList<QNdef
// Connecting
QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate());
if (!connect()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, requestId);
return requestId;
}
@@ -328,18 +314,14 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QList<QNdef
env->SetByteArrayRegion(jba.object<jbyteArray>(), 0, ba.size(), reinterpret_cast<jbyte*>(ba.data()));
QAndroidJniObject jmessage = QAndroidJniObject("android/nfc/NdefMessage", "([B)V", jba.object<jbyteArray>());
if (catchJavaExceptions()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::UnknownError, requestId);
return requestId;
}
// Writing
m_tagTech.callMethod<void>(writeMethod, "(Landroid/nfc/NdefMessage;)V", jmessage.object<jobject>());
if (catchJavaExceptions()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefWriteError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::NdefWriteError, requestId);
return requestId;
}
diff --git a/src/nfc/qnearfieldtarget_emulator.cpp b/src/nfc/qnearfieldtarget_emulator.cpp
index 29b1f74d..030718cc 100644
--- a/src/nfc/qnearfieldtarget_emulator.cpp
+++ b/src/nfc/qnearfieldtarget_emulator.cpp
@@ -82,9 +82,7 @@ QNearFieldTarget::RequestId TagType1::sendCommand(const QByteArray &command)
// tag not in proximity
if (!tagMap.value(m_tag)) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, id);
return id;
}
@@ -93,17 +91,13 @@ QNearFieldTarget::RequestId TagType1::sendCommand(const QByteArray &command)
QByteArray response = m_tag->processCommand(command + char(crc & 0xff) + char(crc >> 8));
if (response.isEmpty()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, NoResponseError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::NoResponseError, id);
return id;
}
// check crc
if (qChecksum(response.constData(), response.length(), Qt::ChecksumItuV41) != 0) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, ChecksumMismatchError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::ChecksumMismatchError, id);
return id;
}
@@ -152,9 +146,7 @@ QNearFieldTarget::RequestId TagType2::sendCommand(const QByteArray &command)
// tag not in proximity
if (!tagMap.value(m_tag)) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, id);
return id;
}
@@ -168,9 +160,7 @@ QNearFieldTarget::RequestId TagType2::sendCommand(const QByteArray &command)
if (response.length() > 1) {
// check crc
if (qChecksum(response.constData(), response.length(), Qt::ChecksumItuV41) != 0) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, ChecksumMismatchError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::ChecksumMismatchError, id);
return id;
}
diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h
index 053df141..625cee67 100644
--- a/src/nfc/qnearfieldtarget_neard_p.h
+++ b/src/nfc/qnearfieldtarget_neard_p.h
@@ -359,9 +359,7 @@ private:
Q_EMIT this->requestCompleted(this->m_currentReadRequestId);
}, Qt::QueuedConnection);
} else {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError),
- Q_ARG(QNearFieldTarget::RequestId, m_currentReadRequestId));
+ this->reportError(QNearFieldTarget::UnknownError, m_currentReadRequestId);
}
m_readRequested = false;
@@ -389,9 +387,7 @@ private:
reply.waitForFinished();
if (reply.isError()) {
qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error();
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError),
- Q_ARG(QNearFieldTarget::RequestId, m_currentWriteRequestId));
+ this->reportError(QNearFieldTarget::UnknownError, m_currentWriteRequestId);
}
QMetaObject::invokeMethod(this, "ndefMessagesWritten", Qt::QueuedConnection);