// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "android/servicediscoverybroadcastreceiver_p.h" #include #include #include #include #include #include "android/jni_android_p.h" QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) ServiceDiscoveryBroadcastReceiver::ServiceDiscoveryBroadcastReceiver(QObject* parent): AndroidBroadcastReceiver(parent) { addAction(valueForStaticField()); } void ServiceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobject intent) { Q_UNUSED(context); Q_UNUSED(env); QJniObject intentObject(intent); const QString action = intentObject.callMethod("getAction").toString(); qCDebug(QT_BT_ANDROID) << "ServiceDiscoveryBroadcastReceiver::onReceive() - event:" << action; if (action == valueForStaticField().toString()) { QJniObject keyExtra = valueForStaticField(); QJniObject parcelableUuids = intentObject.callMethod( "getParcelableArrayExtra", keyExtra.object()); if (!parcelableUuids.isValid()) { emit uuidFetchFinished(QBluetoothAddress(), QList()); return; } const QList result = ServiceDiscoveryBroadcastReceiver::convertParcelableArray(parcelableUuids); keyExtra = valueForStaticField(); QJniObject bluetoothDevice = intentObject.callMethod("getParcelableExtra", keyExtra.object()); QBluetoothAddress address; if (bluetoothDevice.isValid()) { address = QBluetoothAddress(bluetoothDevice.callMethod("getAddress").toString()); emit uuidFetchFinished(address, result); } else { emit uuidFetchFinished(QBluetoothAddress(), QList()); } } } QList ServiceDiscoveryBroadcastReceiver::convertParcelableArray(const QJniObject &parcelUuidArray) { QList result; QJniEnvironment env; jobjectArray parcels = parcelUuidArray.object(); if (!parcels) return result; jint size = env->GetArrayLength(parcels); for (jint i = 0; i < size; ++i) { auto p = QJniObject::fromLocalRef(env->GetObjectArrayElement(parcels, i)); QBluetoothUuid uuid(p.callMethod("toString").toString()); //qCDebug(QT_BT_ANDROID) << uuid.toString(); result.append(uuid); } return result; } QT_END_NAMESPACE