mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
QML UI: move BT handling into core code
This shouldn't be part of the UI (qmlmanager), but part of our overall handling of dive computers and BT devices. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
3b993fbaad
commit
b14a522f4f
8 changed files with 305 additions and 199 deletions
|
@ -94,28 +94,9 @@ QMLManager::QMLManager() : m_locationServiceEnabled(false),
|
|||
alreadySaving(false)
|
||||
{
|
||||
#if defined(BT_SUPPORT)
|
||||
if (localBtDevice.isValid() &&
|
||||
localBtDevice.hostMode() == QBluetoothLocalDevice::HostConnectable) {
|
||||
btPairedDevices.clear();
|
||||
QString localDeviceName = "localDevice " + localBtDevice.name() + " is valid, starting discovery";
|
||||
appendTextToLog(localDeviceName.toUtf8().data());
|
||||
#if defined(Q_OS_LINUX)
|
||||
discoveryAgent = new QBluetoothDeviceDiscoveryAgent(this);
|
||||
connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &QMLManager::btDeviceDiscovered);
|
||||
discoveryAgent->start();
|
||||
#endif
|
||||
#if defined(Q_OS_ANDROID)
|
||||
getBluetoothDevices();
|
||||
#endif
|
||||
for (int i = 0; i < btPairedDevices.length(); i++) {
|
||||
qDebug() << "Paired =" << btPairedDevices[i].name << btPairedDevices[i].address.toString();
|
||||
}
|
||||
#if defined(Q_OS_LINUX)
|
||||
discoveryAgent->stop();
|
||||
#endif
|
||||
} else {
|
||||
appendTextToLog("localBtDevice isn't valid");
|
||||
}
|
||||
// ensure that we start the BTDiscovery - this should be triggered by the export of the class
|
||||
// to QML, but that doesn't seem to always work
|
||||
BTDiscovery *btDiscovery = BTDiscovery::instance();
|
||||
#endif
|
||||
m_instance = this;
|
||||
m_lastDevicePixelRatio = qApp->devicePixelRatio();
|
||||
|
@ -217,78 +198,6 @@ void QMLManager::mergeLocalRepo()
|
|||
process_dives(true, false);
|
||||
}
|
||||
|
||||
#if defined(BT_SUPPORT)
|
||||
|
||||
extern void addBtUuid(QBluetoothUuid uuid);
|
||||
|
||||
void QMLManager::btDeviceDiscovered(const QBluetoothDeviceInfo &device)
|
||||
{
|
||||
btPairedDevice this_d;
|
||||
this_d.address = device.address();
|
||||
this_d.name = device.name();
|
||||
btPairedDevices.append(this_d);
|
||||
|
||||
QString newDevice = device.name();
|
||||
|
||||
// all the HW OSTC BT computers show up as "OSTC" + some other text, depending on model
|
||||
if (newDevice.startsWith("OSTC"))
|
||||
newDevice = "OSTC 3";
|
||||
QList<QBluetoothUuid> serviceUuids = device.serviceUuids();
|
||||
foreach (QBluetoothUuid id, serviceUuids) {
|
||||
addBtUuid(id);
|
||||
qDebug() << id.toByteArray();
|
||||
}
|
||||
appendTextToLog("Found new device " + newDevice + " (" + device.address().toString() + ")");
|
||||
QString vendor, product;
|
||||
foreach (vendor, productList.keys()) {
|
||||
if (productList[vendor].contains(newDevice)) {
|
||||
appendTextToLog("this could be a " + vendor + " " +
|
||||
(newDevice == "OSTC 3" ? "OSTC family" : newDevice));
|
||||
struct btVendorProduct btVP;
|
||||
btVP.btdi = device;
|
||||
btVP.vendorIdx = vendorList.indexOf(vendor);
|
||||
btVP.productIdx = productList[vendor].indexOf(newDevice);
|
||||
qDebug() << "adding new btDCs entry" << newDevice << btVP.vendorIdx << btVP.productIdx;
|
||||
btDCs << btVP;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int QMLManager::getVendorIndex()
|
||||
{
|
||||
#if defined(BT_SUPPORT)
|
||||
if (!btDCs.isEmpty()) {
|
||||
qDebug() << "getVendorIdx" << btDCs.first().vendorIdx;
|
||||
return btDCs.first().vendorIdx;
|
||||
}
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
int QMLManager::getProductIndex()
|
||||
{
|
||||
#if defined(BT_SUPPORT)
|
||||
if (!btDCs.isEmpty()) {
|
||||
qDebug() << "getProductIdx" << btDCs.first().productIdx;
|
||||
return btDCs.first().productIdx;
|
||||
}
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
QString QMLManager::getBtAddress()
|
||||
{
|
||||
#if BT_SUPPORT
|
||||
if (!btDCs.isEmpty()) {
|
||||
QString btAddr = btDCs.first().btdi.address().toString();
|
||||
qDebug() << "getBtAddress" << btAddr;
|
||||
return btAddr;
|
||||
}
|
||||
return QString();
|
||||
#endif
|
||||
}
|
||||
|
||||
void QMLManager::finishSetup()
|
||||
{
|
||||
// Initialize cloud credentials.
|
||||
|
@ -1611,74 +1520,3 @@ void QMLManager::setShowPin(bool enable)
|
|||
m_showPin = enable;
|
||||
emit showPinChanged();
|
||||
}
|
||||
|
||||
QStringList QMLManager::getDCListFromVendor(const QString& vendor)
|
||||
{
|
||||
return productList[vendor];
|
||||
}
|
||||
|
||||
// Android: As Qt is not able to pull the pairing data from a device, i
|
||||
// a lengthy discovery process is needed to see what devices are paired. On
|
||||
// https://forum.qt.io/topic/46075/solved-bluetooth-list-paired-devices
|
||||
// user s.frings74 does, however, present a solution to this using JNI.
|
||||
// Currently, this code is taken "as is".
|
||||
|
||||
void QMLManager::getBluetoothDevices()
|
||||
{
|
||||
#if defined(Q_OS_ANDROID) && defined(BT_SUPPORT)
|
||||
struct QMLManager::btPairedDevice result;
|
||||
// Query via Android Java API.
|
||||
|
||||
// returns a BluetoothAdapter
|
||||
QAndroidJniObject adapter=QAndroidJniObject::callStaticObjectMethod("android/bluetooth/BluetoothAdapter","getDefaultAdapter","()Landroid/bluetooth/BluetoothAdapter;");
|
||||
if (checkException("BluetoothAdapter.getDefaultAdapter()", &adapter)) {
|
||||
return;
|
||||
}
|
||||
// returns a Set<BluetoothDevice>
|
||||
QAndroidJniObject pairedDevicesSet=adapter.callObjectMethod("getBondedDevices","()Ljava/util/Set;");
|
||||
if (checkException("BluetoothAdapter.getBondedDevices()", &pairedDevicesSet)) {
|
||||
return;
|
||||
}
|
||||
jint size=pairedDevicesSet.callMethod<jint>("size");
|
||||
checkException("Set<BluetoothDevice>.size()", &pairedDevicesSet);
|
||||
if (size > 0) {
|
||||
// returns an Iterator<BluetoothDevice>
|
||||
QAndroidJniObject iterator=pairedDevicesSet.callObjectMethod("iterator","()Ljava/util/Iterator;");
|
||||
if (checkException("Set<BluetoothDevice>.iterator()", &iterator)) {
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < size; i++) {
|
||||
// returns a BluetoothDevice
|
||||
QAndroidJniObject dev=iterator.callObjectMethod("next","()Ljava/lang/Object;");
|
||||
if (checkException("Iterator<BluetoothDevice>.next()", &dev)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
result.address = QBluetoothAddress(dev.callObjectMethod("getAddress","()Ljava/lang/String;").toString());
|
||||
result.name = dev.callObjectMethod("getName", "()Ljava/lang/String;").toString();
|
||||
|
||||
btPairedDevices.append(result);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(Q_OS_ANDROID)
|
||||
bool QMLManager::checkException(const char* method, const QAndroidJniObject *obj)
|
||||
{
|
||||
static QAndroidJniEnvironment env;
|
||||
bool result = false;
|
||||
|
||||
if (env->ExceptionCheck()) {
|
||||
qCritical("Exception in %s", method);
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
result=true;
|
||||
}
|
||||
if (!(obj == NULL || obj->isValid())) {
|
||||
qCritical("Invalid object returned by %s", method);
|
||||
result=true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue