mobile: enable switching BT on/off during session.

This commit implements possible switching BT on and off during a session,
so not needing a restart of the app when the user forgot to switch
it on when starting the app.

For this, the following needed to be done: 1) create a handler that
reacts on local BT device status changes. 2) repopulate the connection
list in the download screen when a BT status change is detected.

Notice the subtile change of the Q_INVOKABLE btEnabled() function
to a Q_PROPERTY. This gives a nice dynamic behaviour when
switching BT on/off with the app open.

Fixes: #556

Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
This commit is contained in:
Jan Mulder 2017-10-12 09:43:40 +02:00
parent fa5e685279
commit ba4058667a
5 changed files with 41 additions and 5 deletions

View file

@ -60,6 +60,12 @@ BTDiscovery::BTDiscovery(QObject *parent)
} }
m_instance = this; m_instance = this;
#if defined(BT_SUPPORT) #if defined(BT_SUPPORT)
BTDiscoveryReDiscover();
#endif
}
void BTDiscovery::BTDiscoveryReDiscover()
{
#if !defined(Q_OS_IOS) #if !defined(Q_OS_IOS)
if (localBtDevice.isValid() && if (localBtDevice.isValid() &&
localBtDevice.hostMode() == QBluetoothLocalDevice::HostConnectable) { localBtDevice.hostMode() == QBluetoothLocalDevice::HostConnectable) {
@ -100,7 +106,6 @@ BTDiscovery::BTDiscovery(QObject *parent)
m_btValid = false; m_btValid = false;
} }
#endif #endif
#endif
} }
BTDiscovery::~BTDiscovery() BTDiscovery::~BTDiscovery()

View file

@ -46,6 +46,8 @@ public:
void getBluetoothDevices(); void getBluetoothDevices();
#endif #endif
QList<btVendorProduct> getBtDcs(); QList<btVendorProduct> getBtDcs();
QBluetoothLocalDevice localBtDevice;
void BTDiscoveryReDiscover();
private: private:
static BTDiscovery *m_instance; static BTDiscovery *m_instance;
@ -59,7 +61,6 @@ private:
#endif #endif
QList<struct btPairedDevice> btPairedDevices; QList<struct btPairedDevice> btPairedDevices;
QBluetoothLocalDevice localBtDevice;
QBluetoothDeviceDiscoveryAgent *discoveryAgent; QBluetoothDeviceDiscoveryAgent *discoveryAgent;
signals: signals:

View file

@ -17,8 +17,8 @@ Kirigami.Page {
property alias dcImportModel: importModel property alias dcImportModel: importModel
property bool divesDownloaded: false property bool divesDownloaded: false
property bool btEnabled: manager.btEnabled() property bool btEnabled: manager.btEnabled
property string btMessage: manager.btEnabled() ? "" : qsTr("Bluetooth is not enabled") property string btMessage: manager.btEnabled ? "" : qsTr("Bluetooth is not enabled")
DCDownloadThread { DCDownloadThread {
id: downloadThread id: downloadThread

View file

@ -12,6 +12,7 @@
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QTimer> #include <QTimer>
#include <QDateTime> #include <QDateTime>
#include <QBluetoothLocalDevice>
#include "qt-models/divelistmodel.h" #include "qt-models/divelistmodel.h"
#include "qt-models/gpslistmodel.h" #include "qt-models/gpslistmodel.h"
@ -77,6 +78,23 @@ extern "C" int gitProgressCB(const char *text)
return 0; return 0;
} }
void QMLManager::btHostModeChange(QBluetoothLocalDevice::HostMode state)
{
BTDiscovery *btDiscovery = BTDiscovery::instance();
qDebug() << "btHostModeChange to " << state;
if (state != QBluetoothLocalDevice::HostPoweredOff) {
connectionListModel.removeAllAddresses();
btDiscovery->BTDiscoveryReDiscover();
m_btEnabled = btDiscovery->btAvailable();
} else {
connectionListModel.removeAllAddresses();
set_non_bt_addresses();
m_btEnabled = false;
}
emit btEnabledChanged();
}
QMLManager::QMLManager() : m_locationServiceEnabled(false), QMLManager::QMLManager() : m_locationServiceEnabled(false),
m_verboseEnabled(false), m_verboseEnabled(false),
reply(0), reply(0),
@ -117,6 +135,8 @@ QMLManager::QMLManager() : m_locationServiceEnabled(false),
// to QML, but that doesn't seem to always work // to QML, but that doesn't seem to always work
BTDiscovery *btDiscovery = BTDiscovery::instance(); BTDiscovery *btDiscovery = BTDiscovery::instance();
m_btEnabled = btDiscovery->btAvailable(); m_btEnabled = btDiscovery->btAvailable();
connect(&btDiscovery->localBtDevice, &QBluetoothLocalDevice::hostModeStateChanged,
this, &QMLManager::btHostModeChange);
#else #else
m_btEnabled = false; m_btEnabled = false;
#endif #endif
@ -1659,6 +1679,11 @@ bool QMLManager::btEnabled() const
return m_btEnabled; return m_btEnabled;
} }
void QMLManager::setBtEnabled(bool value)
{
m_btEnabled = value;
}
#if defined (Q_OS_ANDROID) #if defined (Q_OS_ANDROID)
void writeToAppLogFile(QString logText) void writeToAppLogFile(QString logText)

View file

@ -45,6 +45,7 @@ class QMLManager : public QObject {
Q_PROPERTY(QString progressMessage READ progressMessage WRITE setProgressMessage NOTIFY progressMessageChanged) Q_PROPERTY(QString progressMessage READ progressMessage WRITE setProgressMessage NOTIFY progressMessageChanged)
Q_PROPERTY(bool libdcLog READ libdcLog WRITE setLibdcLog NOTIFY libdcLogChanged) Q_PROPERTY(bool libdcLog READ libdcLog WRITE setLibdcLog NOTIFY libdcLogChanged)
Q_PROPERTY(bool developer READ developer WRITE setDeveloper NOTIFY developerChanged) Q_PROPERTY(bool developer READ developer WRITE setDeveloper NOTIFY developerChanged)
Q_PROPERTY(bool btEnabled READ btEnabled WRITE setBtEnabled NOTIFY btEnabledChanged)
public: public:
QMLManager(); QMLManager();
@ -124,6 +125,9 @@ public:
bool developer() const; bool developer() const;
void setDeveloper(bool value); void setDeveloper(bool value);
bool btEnabled() const;
void setBtEnabled(bool value);
typedef void (QMLManager::*execute_function_type)(); typedef void (QMLManager::*execute_function_type)();
DiveListSortModel *dlSortModel; DiveListSortModel *dlSortModel;
@ -134,7 +138,7 @@ public:
bool showPin() const; bool showPin() const;
void setShowPin(bool enable); void setShowPin(bool enable);
Q_INVOKABLE void setStatusbarColor(QColor color); Q_INVOKABLE void setStatusbarColor(QColor color);
Q_INVOKABLE bool btEnabled() const; void btHostModeChange(QBluetoothLocalDevice::HostMode state);
#if defined(Q_OS_ANDROID) #if defined(Q_OS_ANDROID)
void writeToAppLogFile(QString logText); void writeToAppLogFile(QString logText);
@ -258,6 +262,7 @@ signals:
void progressMessageChanged(); void progressMessageChanged();
void libdcLogChanged(); void libdcLogChanged();
void developerChanged(); void developerChanged();
void btEnabledChanged();
}; };
#endif #endif