summaryrefslogtreecommitdiffstats
path: root/src/bluetooth/android
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@digia.com>2014-03-03 13:45:04 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-11 10:58:35 +0100
commitb2cd03fb14c9727e23d5ada409551ab236d1abc6 (patch)
treecf81bfc2da2a9f5148cee8e1c5a8aa96a99bc4a7 /src/bluetooth/android
parent6106ea0ebf52845a34a291a44730e81d4a3e9108 (diff)
Android: Don't directly use the action string values but refer to the fields.
This increases the robustness of the code since the field value is not an implementation detail. In addition we guard the action field lookup against fields which have been introduced later than the standard SDK version 10 supported by Qt. Task-number: QTBUG-36810 Change-Id: Ib6582e77202d40aaf116fe8dfa81562d89367ea2 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/bluetooth/android')
-rw-r--r--src/bluetooth/android/android.pri3
-rw-r--r--src/bluetooth/android/androidbroadcastreceiver.cpp7
-rw-r--r--src/bluetooth/android/androidbroadcastreceiver_p.h2
-rw-r--r--src/bluetooth/android/devicediscoverybroadcastreceiver.cpp29
-rw-r--r--src/bluetooth/android/jni_android.cpp112
-rw-r--r--src/bluetooth/android/jni_android_p.h77
-rw-r--r--src/bluetooth/android/localdevicebroadcastreceiver.cpp69
-rw-r--r--src/bluetooth/android/servicediscoverybroadcastreceiver.cpp18
8 files changed, 260 insertions, 57 deletions
diff --git a/src/bluetooth/android/android.pri b/src/bluetooth/android/android.pri
index 3c8a0380..0507894f 100644
--- a/src/bluetooth/android/android.pri
+++ b/src/bluetooth/android/android.pri
@@ -4,7 +4,8 @@ PRIVATE_HEADERS += \
android/servicediscoverybroadcastreceiver_p.h \
android/androidbroadcastreceiver_p.h \
android/localdevicebroadcastreceiver_p.h \
- android/serveracceptancethread_p.h
+ android/serveracceptancethread_p.h \
+ android/jni_android_p.h
SOURCES += \
diff --git a/src/bluetooth/android/androidbroadcastreceiver.cpp b/src/bluetooth/android/androidbroadcastreceiver.cpp
index affa7683..c07f7b81 100644
--- a/src/bluetooth/android/androidbroadcastreceiver.cpp
+++ b/src/bluetooth/android/androidbroadcastreceiver.cpp
@@ -91,13 +91,12 @@ void AndroidBroadcastReceiver::unregisterReceiver()
broadcastReceiverObject.object<jobject>());
}
-void AndroidBroadcastReceiver::addAction(const QString &action)
+void AndroidBroadcastReceiver::addAction(const QAndroidJniObject &action)
{
- if (!valid)
+ if (!valid || !action.isValid())
return;
- QAndroidJniObject actionString = QAndroidJniObject::fromString(action);
- intentFilterObject.callMethod<void>("addAction", "(Ljava/lang/String;)V", actionString.object<jstring>());
+ intentFilterObject.callMethod<void>("addAction", "(Ljava/lang/String;)V", action.object<jstring>());
activityObject.callObjectMethod(
"registerReceiver",
diff --git a/src/bluetooth/android/androidbroadcastreceiver_p.h b/src/bluetooth/android/androidbroadcastreceiver_p.h
index baae6798..303e4ae8 100644
--- a/src/bluetooth/android/androidbroadcastreceiver_p.h
+++ b/src/bluetooth/android/androidbroadcastreceiver_p.h
@@ -58,7 +58,7 @@ public:
AndroidBroadcastReceiver(QObject* parent = 0);
virtual ~AndroidBroadcastReceiver();
- void addAction(const QString &filter);
+ void addAction(const QAndroidJniObject &filter);
bool isValid() const;
protected:
diff --git a/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp b/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp
index 16a6afe4..ca62f013 100644
--- a/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp
+++ b/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp
@@ -44,6 +44,7 @@
#include <QtCore/QLoggingCategory>
#include <QtBluetooth/QBluetoothAddress>
#include <QtBluetooth/QBluetoothDeviceInfo>
+#include "android/jni_android_p.h"
QT_BEGIN_NAMESPACE
@@ -51,9 +52,9 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID)
DeviceDiscoveryBroadcastReceiver::DeviceDiscoveryBroadcastReceiver(QObject* parent): AndroidBroadcastReceiver(parent)
{
- addAction(QStringLiteral("android.bluetooth.device.action.FOUND"));
- addAction(QStringLiteral("android.bluetooth.adapter.action.DISCOVERY_STARTED"));
- addAction(QStringLiteral("android.bluetooth.adapter.action.DISCOVERY_FINISHED"));
+ addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionFound));
+ addAction(valueForStaticField(JavaNames::BluetoothAdapter, JavaNames::ActionDiscoveryStarted));
+ addAction(valueForStaticField(JavaNames::BluetoothAdapter, JavaNames::ActionDiscoveryFinished));
}
void DeviceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobject intent)
@@ -66,15 +67,18 @@ void DeviceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, j
qCDebug(QT_BT_ANDROID) << "DeviceDiscoveryBroadcastReceiver::onReceive() - event:" << action;
- if (action == QStringLiteral("android.bluetooth.adapter.action.DISCOVERY_FINISHED") ) {
+ if (action == valueForStaticField(JavaNames::BluetoothAdapter,
+ JavaNames::ActionDiscoveryFinished).toString()) {
emit finished();
- } else if (action == QStringLiteral("android.bluetooth.adapter.action.DISCOVERY_STARTED") ) {
+ } else if (action == valueForStaticField(JavaNames::BluetoothAdapter,
+ JavaNames::ActionDiscoveryStarted).toString()) {
- } else if (action == QStringLiteral("android.bluetooth.device.action.FOUND")) {
+ } else if (action == valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ActionFound).toString()) {
//get BluetoothDevice
- QAndroidJniObject keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.DEVICE"));
- QAndroidJniObject bluetoothDevice =
+ QAndroidJniObject keyExtra = valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ExtraDevice);
+ const QAndroidJniObject bluetoothDevice =
intentObject.callObjectMethod("getParcelableExtra",
"(Ljava/lang/String;)Landroid/os/Parcelable;",
keyExtra.object<jstring>());
@@ -84,13 +88,14 @@ void DeviceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, j
const QString deviceName = bluetoothDevice.callObjectMethod<jstring>("getName").toString();
const QBluetoothAddress deviceAddress(bluetoothDevice.callObjectMethod<jstring>("getAddress").toString());
- keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.RSSI"));
+ keyExtra = valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ExtraRssi);
+
int rssi = intentObject.callMethod<jshort>("getShortExtra",
"(Ljava/lang/String;S)S",
keyExtra.object<jstring>(),
0);
- QAndroidJniObject bluetoothClass = bluetoothDevice.callObjectMethod("getBluetoothClass",
+ const QAndroidJniObject bluetoothClass = bluetoothDevice.callObjectMethod("getBluetoothClass",
"()Landroid/bluetooth/BluetoothClass;");
if (!bluetoothClass.isValid())
return;
diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp
index 1e907fdd..ebc46a7c 100644
--- a/src/bluetooth/android/jni_android.cpp
+++ b/src/bluetooth/android/jni_android.cpp
@@ -44,13 +44,123 @@
#include <android/log.h>
#include <QtCore/QLoggingCategory>
#include <QtBluetooth/qbluetoothglobal.h>
-#include <QtAndroidExtras/QAndroidJniObject>
+#include "android/jni_android_p.h"
#include "android/androidbroadcastreceiver_p.h"
#include "android/serveracceptancethread_p.h"
#include "android/inputstreamthread_p.h"
Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID)
+typedef QHash<QByteArray, QAndroidJniObject> JCachedStringFields;
+Q_GLOBAL_STATIC(JCachedStringFields, cachedStringFields)
+
+//Java class names
+static const char * const javaBluetoothAdapterClassName = "android/bluetooth/BluetoothAdapter";
+static const char * const javaBluetoothDeviceClassName = "android/bluetooth/BluetoothDevice" ;
+
+//Java field names
+static const char * const javaActionAclConnected = "ACTION_ACL_CONNECTED";
+static const char * const javaActionAclDisconnected = "ACTION_ACL_DISCONNECTED";
+static const char * const javaActionBondStateChanged = "ACTION_BOND_STATE_CHANGED";
+static const char * const javaActionDiscoveryStarted = "ACTION_DISCOVERY_STARTED";
+static const char * const javaActionDiscoveryFinished = "ACTION_DISCOVERY_FINISHED";
+static const char * const javaActionFound = "ACTION_FOUND";
+static const char * const javaActionPairingRequest = "ACTION_PAIRING_REQUEST";
+static const char * const javaActionScanModeChanged = "ACTION_SCAN_MODE_CHANGED";
+static const char * const javaActionUuid = "ACTION_UUID";
+static const char * const javaExtraBondState = "EXTRA_BOND_STATE";
+static const char * const javaExtraDevice = "EXTRA_DEVICE";
+static const char * const javaExtraPairingKey = "EXTRA_PAIRING_KEY";
+static const char * const javaExtraPairingVariant = "EXTRA_PAIRING_VARIANT";
+static const char * const javaExtraRssi = "EXTRA_RSSI";
+static const char * const javaExtraScanMode = "EXTRA_SCAN_MODE";
+static const char * const javaExtraUuid = "EXTRA_UUID";
+
+/*
+ * This function operates on the assumption that each
+ * field is of type java/lang/String.
+ */
+QAndroidJniObject valueForStaticField(JavaNames javaName, JavaNames javaFieldName)
+{
+ //construct key
+ //the switch statements are used to reduce the number of duplicated strings
+ //in the library
+
+ const char* className;
+ switch (javaName) {
+ case JavaNames::BluetoothAdapter:
+ className = javaBluetoothAdapterClassName; break;
+ case JavaNames::BluetoothDevice:
+ className = javaBluetoothDeviceClassName; break;
+ default:
+ qWarning(QT_BT_ANDROID) << "Unknown java class name passed to valueForStaticField():" << javaName;
+ return QAndroidJniObject();
+ }
+
+ const char *fieldName;
+ switch (javaFieldName) {
+ case JavaNames::ActionAclConnected:
+ fieldName = javaActionAclConnected; break;
+ case JavaNames::ActionAclDisconnected:
+ fieldName = javaActionAclDisconnected; break;
+ case JavaNames::ActionBondStateChanged:
+ fieldName = javaActionBondStateChanged; break;
+ case JavaNames::ActionDiscoveryStarted:
+ fieldName = javaActionDiscoveryStarted; break;
+ case JavaNames::ActionDiscoveryFinished:
+ fieldName = javaActionDiscoveryFinished; break;
+ case JavaNames::ActionFound:
+ fieldName = javaActionFound; break;
+ case JavaNames::ActionPairingRequest:
+ fieldName = javaActionPairingRequest; break;
+ case JavaNames::ActionScanModeChanged:
+ fieldName = javaActionScanModeChanged; break;
+ case JavaNames::ActionUuid:
+ fieldName = javaActionUuid; break;
+ case JavaNames::ExtraBondState:
+ fieldName = javaExtraBondState; break;
+ case JavaNames::ExtraDevice:
+ fieldName = javaExtraDevice; break;
+ case JavaNames::ExtraPairingKey:
+ fieldName = javaExtraPairingKey; break;
+ case JavaNames::ExtraPairingVariant:
+ fieldName = javaExtraPairingVariant; break;
+ case JavaNames::ExtraRssi:
+ fieldName = javaExtraRssi; break;
+ case JavaNames::ExtraScanMode:
+ fieldName = javaExtraScanMode; break;
+ case JavaNames::ExtraUuid:
+ fieldName = javaExtraUuid; break;
+ default:
+ qWarning(QT_BT_ANDROID) << "Unknown java field name passed to valueForStaticField():" << javaFieldName;
+ return QAndroidJniObject();
+ }
+
+ int offset_class = qstrlen(className);
+ int offset_field = qstrlen(fieldName);
+ QByteArray key(offset_class + offset_field, Qt::Uninitialized);
+ memcpy(key.data(), className, offset_class);
+ memcpy(key.data()+offset_class, fieldName, offset_field);
+
+ JCachedStringFields::iterator it = cachedStringFields()->find(key);
+ if (it == cachedStringFields()->end()) {
+ QAndroidJniEnvironment env;
+ QAndroidJniObject fieldValue = QAndroidJniObject::getStaticObjectField(
+ className, fieldName, "Ljava/lang/String;");
+ if (env->ExceptionCheck()) {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ cachedStringFields()->insert(key, QAndroidJniObject());
+ return QAndroidJniObject();
+ }
+
+ cachedStringFields()->insert(key, fieldValue);
+ return fieldValue;
+ } else {
+ return it.value();
+ }
+}
+
void QtBroadcastReceiver_jniOnReceive(JNIEnv *env, jobject /*javaObject*/,
jlong qtObject, jobject context, jobject intent)
{
diff --git a/src/bluetooth/android/jni_android_p.h b/src/bluetooth/android/jni_android_p.h
new file mode 100644
index 00000000..8fe559b3
--- /dev/null
+++ b/src/bluetooth/android/jni_android_p.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtBluetooth 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 Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef JNI_ANDROID_P_H
+#define JNI_ANDROID_P_H
+
+#include <QtAndroidExtras/QAndroidJniEnvironment>
+#include <QtAndroidExtras/QAndroidJniObject>
+
+QT_BEGIN_NAMESPACE
+
+enum JavaNames {
+ BluetoothAdapter = 0,
+ BluetoothDevice,
+ ActionAclConnected,
+ ActionAclDisconnected,
+ ActionBondStateChanged,
+ ActionDiscoveryStarted,
+ ActionDiscoveryFinished,
+ ActionFound,
+ ActionPairingRequest,
+ ActionScanModeChanged,
+ ActionUuid,
+ ExtraBondState,
+ ExtraDevice,
+ ExtraPairingKey,
+ ExtraPairingVariant,
+ ExtraRssi,
+ ExtraScanMode,
+ ExtraUuid
+};
+
+QAndroidJniObject valueForStaticField(JavaNames javaName, JavaNames javaFieldName);
+
+
+
+QT_END_NAMESPACE
+
+#endif // JNI_ANDROID_P_H
diff --git a/src/bluetooth/android/localdevicebroadcastreceiver.cpp b/src/bluetooth/android/localdevicebroadcastreceiver.cpp
index 0e81ef22..c221a7cc 100644
--- a/src/bluetooth/android/localdevicebroadcastreceiver.cpp
+++ b/src/bluetooth/android/localdevicebroadcastreceiver.cpp
@@ -40,7 +40,9 @@
****************************************************************************/
#include <QtCore/QLoggingCategory>
+#include <QtCore/private/qjnihelpers_p.h>
#include "localdevicebroadcastreceiver_p.h"
+#include "android/jni_android_p.h"
QT_BEGIN_NAMESPACE
@@ -49,12 +51,12 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID)
LocalDeviceBroadcastReceiver::LocalDeviceBroadcastReceiver(QObject *parent) :
AndroidBroadcastReceiver(parent), previousScanMode(0)
{
- addAction(QStringLiteral("android.bluetooth.device.action.BOND_STATE_CHANGED"));
- addAction(QStringLiteral("android.bluetooth.adapter.action.SCAN_MODE_CHANGED"));
- addAction(QStringLiteral("android.bluetooth.device.action.ACL_CONNECTED"));
- addAction(QStringLiteral("android.bluetooth.device.action.ACL_DISCONNECTED"));
- addAction(QStringLiteral("android.bluetooth.device.action.PAIRING_REQUEST")); //API 19
-
+ addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionBondStateChanged));
+ addAction(valueForStaticField(JavaNames::BluetoothAdapter, JavaNames::ActionScanModeChanged));
+ addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionAclConnected));
+ addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionAclDisconnected));
+ if (QtAndroidPrivate::androidSdkVersion() >= 19)
+ addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionPairingRequest)); //API 19
}
void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobject intent)
@@ -66,11 +68,13 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje
const QString action = intentObject.callObjectMethod("getAction", "()Ljava/lang/String;").toString();
qCDebug(QT_BT_ANDROID) << QStringLiteral("LocalDeviceBroadcastReceiver::onReceive() - event: %1").arg(action);
- if (action == QStringLiteral("android.bluetooth.adapter.action.SCAN_MODE_CHANGED")) {
- QAndroidJniObject extrasBundle =
+ if (action == valueForStaticField(JavaNames::BluetoothAdapter,
+ JavaNames::ActionScanModeChanged).toString()) {
+
+ const QAndroidJniObject extrasBundle =
intentObject.callObjectMethod("getExtras","()Landroid/os/Bundle;");
- QAndroidJniObject keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.adapter.extra.SCAN_MODE"));
+ const QAndroidJniObject keyExtra = valueForStaticField(JavaNames::BluetoothAdapter,
+ JavaNames::ExtraScanMode);
int extra = extrasBundle.callMethod<jint>("getInt",
"(Ljava/lang/String;)I",
@@ -94,19 +98,19 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje
break;
}
}
- } else if (action == QStringLiteral("android.bluetooth.device.action.BOND_STATE_CHANGED")) {
+ } else if (action == valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ActionBondStateChanged).toString()) {
//get BluetoothDevice
- QAndroidJniObject keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.DEVICE"));
- QAndroidJniObject bluetoothDevice =
+ QAndroidJniObject keyExtra = valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ExtraDevice);
+ const QAndroidJniObject bluetoothDevice =
intentObject.callObjectMethod("getParcelableExtra",
"(Ljava/lang/String;)Landroid/os/Parcelable;",
keyExtra.object<jstring>());
//get new bond state
- keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.BOND_STATE"));
- QAndroidJniObject extrasBundle =
+ keyExtra = valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ExtraBondState);
+ const QAndroidJniObject extrasBundle =
intentObject.callObjectMethod("getExtras","()Landroid/os/Bundle;");
int bondState = extrasBundle.callMethod<jint>("getInt",
"(Ljava/lang/String;)I",
@@ -128,17 +132,20 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje
break;
default:
qCWarning(QT_BT_ANDROID) << "Unknown BOND_STATE_CHANGED value:" << bondState;
- break;
- }
- } else if (action == QStringLiteral("android.bluetooth.device.action.ACL_DISCONNECTED") ||
- action == QStringLiteral("android.bluetooth.device.action.ACL_CONNECTED")) {
+ } else if (action == valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ActionAclConnected).toString() ||
+ action == valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ActionAclDisconnected).toString()) {
+
+ const QString connectEvent = valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ActionAclConnected).toString();
const bool isConnectEvent =
- action == QStringLiteral("android.bluetooth.device.action.ACL_CONNECTED") ? true : false;
+ action == connectEvent ? true : false;
//get BluetoothDevice
- QAndroidJniObject keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.DEVICE"));
+ const QAndroidJniObject keyExtra = valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ExtraDevice);
QAndroidJniObject bluetoothDevice =
intentObject.callObjectMethod("getParcelableExtra",
"(Ljava/lang/String;)Landroid/os/Parcelable;",
@@ -149,10 +156,11 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje
return;
emit connectDeviceChanges(address, isConnectEvent);
- } else if (action == QStringLiteral("android.bluetooth.device.action.PAIRING_REQUEST")) {
+ } else if (action == valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ActionPairingRequest).toString()) {
- QAndroidJniObject keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.PAIRING_VARIANT"));
+ QAndroidJniObject keyExtra = valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ExtraPairingVariant);
int variant = intentObject.callMethod<jint>("getIntExtra",
"(Ljava/lang/String;I)I",
keyExtra.object<jstring>(),
@@ -164,8 +172,8 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje
return;
case 2: //BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION
{
- keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.PAIRING_KEY"));
+ keyExtra = valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ExtraPairingKey);
key = intentObject.callMethod<jint>("getIntExtra",
"(Ljava/lang/String;I)I",
keyExtra.object<jstring>(),
@@ -173,8 +181,7 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje
if (key == -1)
return;
- keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.DEVICE"));
+ keyExtra = valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ExtraDevice);
QAndroidJniObject bluetoothDevice =
intentObject.callObjectMethod("getParcelableExtra",
"(Ljava/lang/String;)Landroid/os/Parcelable;",
diff --git a/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp b/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp
index 341617bc..0a3f97f9 100644
--- a/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp
+++ b/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp
@@ -41,9 +41,11 @@
#include "android/servicediscoverybroadcastreceiver_p.h"
#include <QtCore/QLoggingCategory>
+#include <QtCore/private/qjnihelpers_p.h>
#include <QtAndroidExtras/QAndroidJniEnvironment>
#include <QtBluetooth/QBluetoothAddress>
#include <QtBluetooth/QBluetoothDeviceInfo>
+#include "android/jni_android_p.h"
QT_BEGIN_NAMESPACE
@@ -51,7 +53,8 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID)
ServiceDiscoveryBroadcastReceiver::ServiceDiscoveryBroadcastReceiver(QObject* parent): AndroidBroadcastReceiver(parent)
{
- addAction(QStringLiteral("android.bluetooth.device.action.UUID"));
+ if (QtAndroidPrivate::androidSdkVersion() >= 15)
+ addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionUuid)); //API 15+
}
void ServiceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobject intent)
@@ -64,19 +67,20 @@ void ServiceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context,
qCDebug(QT_BT_ANDROID) << "ServiceDiscoveryBroadcastReceiver::onReceive() - event:" << action;
- if (action == QStringLiteral("android.bluetooth.device.action.UUID")) {
- QAndroidJniObject keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.UUID"));
+ if (action == valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ActionUuid).toString()) {
+
+ QAndroidJniObject keyExtra = valueForStaticField(JavaNames::BluetoothDevice,
+ JavaNames::ExtraUuid);
QAndroidJniObject parcelableUuids = intentObject.callObjectMethod(
"getParcelableArrayExtra",
"(Ljava/lang/String;)[Landroid/os/Parcelable;",
keyExtra.object<jstring>());
if (!parcelableUuids.isValid())
return;
- QList<QBluetoothUuid> result = ServiceDiscoveryBroadcastReceiver::convertParcelableArray(parcelableUuids);
+ const QList<QBluetoothUuid> result = ServiceDiscoveryBroadcastReceiver::convertParcelableArray(parcelableUuids);
- keyExtra = QAndroidJniObject::fromString(
- QStringLiteral("android.bluetooth.device.extra.DEVICE"));
+ keyExtra = valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ExtraDevice);
QAndroidJniObject bluetoothDevice =
intentObject.callObjectMethod("getParcelableExtra",
"(Ljava/lang/String;)Landroid/os/Parcelable;",