mobile UI: rescan button on DC Download page rescans BT/BLE/USB

This way even if a USB device wasn't added through an Android intent, we
still have a way to scan for it and select it. This is especially
important in case a user has a cable that we haven't seen yet (i.e. with
a VID/PID that we haven't added to Subsurface-mobile), but that
nevertheless works with the android usb serial drivers.

This also makes the flow a little more logical / consistent when
deciding which connections to show.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2020-03-14 18:52:45 -07:00
parent 274dbc2ebf
commit ff2f199eed
3 changed files with 38 additions and 18 deletions

View file

@ -353,7 +353,7 @@ Kirigami.Page {
text: qsTr("Rescan")
enabled: manager.btEnabled
onClicked: {
manager.btRescan()
manager.rescanConnections()
}
}

View file

@ -155,6 +155,23 @@ void QMLManager::btRescan()
BTDiscovery::instance()->BTDiscoveryReDiscover();
}
void QMLManager::rescanConnections()
{
connectionListModel.removeAllAddresses();
btRescan();
usbRescan();
#if defined(SERIAL_FTDI)
connectionListModel.addAddress("FTDI");
#endif
}
void QMLManager::usbRescan()
{
#if defined(Q_OS_ANDROID)
androidUsbPopoulateConnections();
#endif
}
QMLManager::QMLManager() : m_locationServiceEnabled(false),
m_verboseEnabled(false),
alreadySaving(false),
@ -2086,6 +2103,20 @@ QString QMLManager::getProductVendorConnectionIdx(android_usb_serial_device_desc
return QString("%1;%2;%3").arg(vendIdx).arg(prodIdx).arg(connIdx);
}
void QMLManager::androidUsbPopoulateConnections()
{
// let's understand what devices are available
androidSerialDevices = serial_usb_android_get_devices();
appendTextToLog(QString("rescanning USB: %1 devices reported").arg(androidSerialDevices.size()));
// list all USB devices, this will include the one that triggered the intent
for (unsigned int i = 0; i < androidSerialDevices.size(); i++) {
QString uiString = QString::fromStdString(androidSerialDevices[i].uiRepresentation);
appendTextToLog(QString("found USB device with ui string %1").arg(uiString));
connectionListModel.addAddress(uiString);
}
}
void QMLManager::showDownloadPage(QAndroidJniObject usbDevice)
{
if (!usbDevice.isValid()) {
@ -2093,26 +2124,12 @@ void QMLManager::showDownloadPage(QAndroidJniObject usbDevice)
// if that happens, just make sure the DownloadPage is reopened
m_pluggedInDeviceName = QString("reopen");
} else {
// repopulate the connection list
rescanConnections();
// parse the usbDevice
android_usb_serial_device_descriptor usbDeviceDescriptor = getDescriptor(usbDevice);
// let's understand what devices are available
androidSerialDevices = serial_usb_android_get_devices();
appendTextToLog(QString("entered showDownloadPage with %1 devices reported").arg(androidSerialDevices.size()));
// list all USB devices, this will include the one that triggered the intent
for (unsigned int i = 0; i < androidSerialDevices.size(); i++) {
// the expected case -- does this match the deviceString we got from the intent?
QString uiString = QString::fromStdString(androidSerialDevices[i].uiRepresentation);
//QString deviceName = uiString.left(uiString.indexOf(QString(" (")) + 1);
appendTextToLog(QString("looking at USB device with ui representation %1").arg(uiString));
if (androidSerialDevices[i].uiRepresentation == usbDeviceDescriptor.uiRepresentation) {
appendTextToLog("matches the information we received from the intent");
} else {
appendTextToLog("doesn't match the device received from the intent");
}
connectionListModel.addAddress(QString::fromStdString(androidSerialDevices[i].uiRepresentation));
}
// inform the QML UI that it should show the download page
m_pluggedInDeviceName = getProductVendorConnectionIdx(usbDeviceDescriptor);
}

View file

@ -231,8 +231,11 @@ public slots:
void quit();
void hasLocationSourceChanged();
void btRescan();
void usbRescan();
void rescanConnections();
#if defined(Q_OS_ANDROID)
void showDownloadPage(QAndroidJniObject usbDevice);
void androidUsbPopoulateConnections();
QString getProductVendorConnectionIdx(android_usb_serial_device_descriptor descriptor);
#endif
void divesChanged(const QVector<dive *> &dives, DiveField field);