summaryrefslogtreecommitdiffstats
path: root/src/bluetooth
diff options
context:
space:
mode:
Diffstat (limited to 'src/bluetooth')
-rw-r--r--src/bluetooth/android/localdevicebroadcastreceiver.cpp41
-rw-r--r--src/bluetooth/android/localdevicebroadcastreceiver_p.h1
-rw-r--r--src/bluetooth/qbluetoothlocaldevice_android.cpp11
-rw-r--r--src/bluetooth/qbluetoothlocaldevice_p.h1
4 files changed, 54 insertions, 0 deletions
diff --git a/src/bluetooth/android/localdevicebroadcastreceiver.cpp b/src/bluetooth/android/localdevicebroadcastreceiver.cpp
index c6cb3680..2d247574 100644
--- a/src/bluetooth/android/localdevicebroadcastreceiver.cpp
+++ b/src/bluetooth/android/localdevicebroadcastreceiver.cpp
@@ -39,6 +39,7 @@
#include <QtCore/QLoggingCategory>
#include <QtCore/private/qjnihelpers_p.h>
+#include <QtCore/qrandom.h>
#include "localdevicebroadcastreceiver_p.h"
#include "android/jni_android_p.h"
@@ -186,6 +187,46 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje
switch (variant) {
case -1: //ignore -> no pairing variant set
return;
+ case 0: //BluetoothDevice.PAIRING_VARIANT_PIN
+ {
+ //generate a random key
+ const QString pin = QStringLiteral("%1").arg(QRandomGenerator::global()->bounded(1000000),
+ 6, 10, QLatin1Char('0'));
+ const QAndroidJniObject javaPin = QAndroidJniObject::fromString(pin);
+
+ //get BluetoothDevice
+ keyExtra = valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ExtraDevice);
+ QAndroidJniObject bluetoothDevice =
+ intentObject.callObjectMethod("getParcelableExtra",
+ "(Ljava/lang/String;)Landroid/os/Parcelable;",
+ keyExtra.object<jstring>());
+ if (!bluetoothDevice.isValid())
+ return;
+
+ QAndroidJniObject bytePin = QAndroidJniObject::callStaticObjectMethod("android/bluetooth/BluetoothDevice",
+ "convertPinToBytes",
+ "(Ljava/lang/String;)[B",
+ javaPin.object<jstring>());
+ if (!bytePin.isValid()) {
+ if (env->ExceptionCheck()) {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ }
+ return;
+ }
+
+ jboolean result = bluetoothDevice.callMethod<jboolean>("setPin", "([B)Z", bytePin.object<jbyteArray>());
+ if (!result) {
+ if (env->ExceptionCheck()) {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ }
+ return;
+ }
+
+ const QBluetoothAddress address(bluetoothDevice.callObjectMethod<jstring>("getAddress").toString());
+ emit pairingDisplayPinCode(address, pin);
+ }
case 2: //BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION
{
keyExtra = valueForStaticField(JavaNames::BluetoothDevice,
diff --git a/src/bluetooth/android/localdevicebroadcastreceiver_p.h b/src/bluetooth/android/localdevicebroadcastreceiver_p.h
index c6ae424d..09e50fb1 100644
--- a/src/bluetooth/android/localdevicebroadcastreceiver_p.h
+++ b/src/bluetooth/android/localdevicebroadcastreceiver_p.h
@@ -72,6 +72,7 @@ signals:
void pairingStateChanged(const QBluetoothAddress &address, QBluetoothLocalDevice::Pairing pairing);
void connectDeviceChanges(const QBluetoothAddress &address, bool isConnectEvent);
void pairingDisplayConfirmation(const QBluetoothAddress &address, const QString& pin);
+ void pairingDisplayPinCode(const QBluetoothAddress &address, const QString& pin);
private:
int previousScanMode;
QAndroidJniObject pairingDevice;
diff --git a/src/bluetooth/qbluetoothlocaldevice_android.cpp b/src/bluetooth/qbluetoothlocaldevice_android.cpp
index f36e184c..0144a5ef 100644
--- a/src/bluetooth/qbluetoothlocaldevice_android.cpp
+++ b/src/bluetooth/qbluetoothlocaldevice_android.cpp
@@ -73,6 +73,8 @@ QBluetoothLocalDevicePrivate::QBluetoothLocalDevicePrivate(
this, SLOT(processConnectDeviceChanges(QBluetoothAddress, bool)));
connect(receiver, SIGNAL(pairingDisplayConfirmation(QBluetoothAddress, QString)),
this, SLOT(processDisplayConfirmation(QBluetoothAddress, QString)));
+ connect(receiver, &LocalDeviceBroadcastReceiver::pairingDisplayPinCode,
+ this, &QBluetoothLocalDevicePrivate::processDisplayPinCode);
}
QBluetoothLocalDevicePrivate::~QBluetoothLocalDevicePrivate()
@@ -215,6 +217,15 @@ void QBluetoothLocalDevicePrivate::processDisplayConfirmation(const QBluetoothAd
return;
emit q_ptr->pairingDisplayConfirmation(address, pin);
+}
+
+void QBluetoothLocalDevicePrivate::processDisplayPinCode(const QBluetoothAddress &address, const QString &pin)
+{
+ // only send pairing notification for pairing requests issued by
+ // this QBluetoothLocalDevice instance
+ if (pendingPairing(address) == -1)
+ return;
+
emit q_ptr->pairingDisplayPinCode(address, pin);
}
diff --git a/src/bluetooth/qbluetoothlocaldevice_p.h b/src/bluetooth/qbluetoothlocaldevice_p.h
index 038effcd..8752504d 100644
--- a/src/bluetooth/qbluetoothlocaldevice_p.h
+++ b/src/bluetooth/qbluetoothlocaldevice_p.h
@@ -113,6 +113,7 @@ private slots:
QBluetoothLocalDevice::Pairing pairing);
void processConnectDeviceChanges(const QBluetoothAddress &address, bool isConnectEvent);
void processDisplayConfirmation(const QBluetoothAddress &address, const QString &pin);
+ void processDisplayPinCode(const QBluetoothAddress &address, const QString &pin);
private:
QBluetoothLocalDevice *q_ptr;