diff options
author | Teemu Holappa <teemu.holappa@theqtcompany.com> | 2015-11-09 16:39:08 +0200 |
---|---|---|
committer | Teemu Holappa <teemu.holappa@theqtcompany.com> | 2016-01-22 14:04:19 +0000 |
commit | ccbfa0884072c26979a6475de71635c19a474cca (patch) | |
tree | 288fe756bef423237931023973a91ca469643e11 /src/qtdevicesettings/bluetoothsettingsplugin | |
parent | 887c8bffd05a3784d83e8280f8c725eead4c7a5c (diff) |
Device settings UI.
Implemented settings application for changing device settings.
There are implemented settings UI for network, time and date, locale, bluetooth, audio and display.
Change-Id: I26077ce1f2356eb8520fad61cf07407c6a0f98c1
Reviewed-by: Kimmo Ollila <kimmo.ollila@theqtcompany.com>
Reviewed-by: Risto Avila <risto.avila@theqtcompany.com>
Diffstat (limited to 'src/qtdevicesettings/bluetoothsettingsplugin')
17 files changed, 1267 insertions, 0 deletions
diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/Bluetooth.qml b/src/qtdevicesettings/bluetoothsettingsplugin/Bluetooth.qml new file mode 100644 index 0000000..88a7d7c --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/Bluetooth.qml @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles.Flat 1.0 as Flat +import com.theqtcompany.settings.common 1.0 +import com.theqtcompany.settings.bluetooth 1.0 + +Item { + id: root + property string title: qsTr("Bluetooth Settings") + + Column { + id: content + anchors.fill: parent + anchors.margins: Math.round(40 * Flat.FlatStyle.scaleFactor) + + GroupBox { + id: groupBox + width: parent.width + title: qsTr("Bluetooth status") + Layout.fillWidth: true + + ColumnLayout { + spacing: Math.round(10 * Flat.FlatStyle.scaleFactor) + width: parent.width + Layout.fillWidth: true + + Row { + spacing: Math.round(10 * Flat.FlatStyle.scaleFactor) + TextLabel { + id: off + text: qsTr("Off") + } + + Switch { + checked: BtDevice.powered + onCheckedChanged: BtDevice.powered = checked + } + + TextLabel { + text: qsTr("On") + } + } + } + } + + Discovery { + id: discovery + visible: BtDevice.powered + width: parent.width + height: Math.round(content.height - 100 * Flat.FlatStyle.scaleFactor) + } + } +} diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/Discovery.qml b/src/qtdevicesettings/bluetoothsettingsplugin/Discovery.qml new file mode 100644 index 0000000..d40ccbe --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/Discovery.qml @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.4 +import QtBluetooth 5.2 +import QtQuick.Controls.Styles.Flat 1.0 as Flat +import com.theqtcompany.settings.common 1.0 +import com.theqtcompany.settings.bluetooth 1.0 + +Item { + id: top + property BluetoothService currentService + + GroupBox { + id: groupBox + title: qsTr("Devices") + width: parent.width + + ListView { + id: mainList + width: parent.width + height: top.height + + function getIcon(deviceType) { + switch (deviceType) { + case BtDeviceItem.Computer: + return "../icons/Laptop_qt_1x.png" + case BtDeviceItem.Headphones: + return "../icons/Headphones_qt_1x.png" + case BtDeviceItem.Microphone: + return "../icons/Microphone_qt_1x.png" + case BtDeviceItem.Mouse: + return "../icons/Mouse_qt_1x.png" + case BtDeviceItem.Keyboard: + return "../icons/Keyboard_qt_1x.png" + default: + return "../icons/Bluetooth_qt_1x.png" + } + } + + model: BtDevice.deviceModel + delegate: Rectangle { + id: btDelegate + width: parent.width + height: Math.round(column.height + 10 * Flat.FlatStyle.scaleFactor) + + property bool expended: false; + clip: true + + MouseArea { + anchors.fill: parent + onClicked: btDelegate.expended = !btDelegate.expended + } + + RowLayout { + anchors.top: parent.top + anchors.left: parent.left + spacing: Math.round(10 * Flat.FlatStyle.scaleFactor) + + Image { + id: bticon + source: mainList.getIcon(type) + } + + Column { + id: column + TextLabel { + id: bttext + text: name + } + + TextLabel { + id: details + opacity: btDelegate.expended ? 1 : 0.0 + text: address + Behavior on opacity { + NumberAnimation { duration: 200} + } + } + } + } + + Button { + anchors.right: parent.right + anchors.rightMargin: Math.round(10 * Flat.FlatStyle.scaleFactor) + visible: !BtDevice.scanning + text: connected ? qsTr("Disconnect") : qsTr("Connect") + + onClicked : connected ? BtDevice.requestDisconnect(address) : BtDevice.requestPairing(address); + } + + Behavior on height { NumberAnimation { duration: 200} } + + } + focus: true + } + } + + BusyIndicator { + anchors.right: groupBox.right + anchors.top: groupBox.top + anchors.topMargin: Math.round(40 * Flat.FlatStyle.scaleFactor) + anchors.rightMargin: Math.round(10 * Flat.FlatStyle.scaleFactor) + height: Math.round(20 * Flat.FlatStyle.scaleFactor) + width: Math.round(20 * Flat.FlatStyle.scaleFactor) + running: BtDevice.scanning + } +} diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/bluetoothdevice.cpp b/src/qtdevicesettings/bluetoothsettingsplugin/bluetoothdevice.cpp new file mode 100644 index 0000000..65a7422 --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/bluetoothdevice.cpp @@ -0,0 +1,169 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <discoverymodel.h> +#include "bluetoothdevice.h" +#include "bluez/bluetoothdevice_p.h" + +BluetoothDevice::BluetoothDevice(QObject *parent) : QObject(parent) + ,m_localDevice(new QBluetoothLocalDevice(this)) + ,m_deviceModel(new DiscoveryModel(this)) + ,m_powered(false) + ,m_scanning(true) +{ + m_powered = m_localDevice->hostMode() != QBluetoothLocalDevice::HostPoweredOff; + + connect(m_localDevice, &QBluetoothLocalDevice::hostModeStateChanged, this, &BluetoothDevice::deviceStateChanged); + connect(m_localDevice, &QBluetoothLocalDevice::deviceConnected, this, &BluetoothDevice::deviceConnected); + connect(m_localDevice, &QBluetoothLocalDevice::deviceDisconnected, this, &BluetoothDevice::deviceDisconnected); + connect(m_deviceModel, &DiscoveryModel::scanFinished, this, &BluetoothDevice::scanFinished); + + if (m_powered) { + m_deviceModel->scanDevices(); + } + +} + +void BluetoothDevice::deviceStateChanged(QBluetoothLocalDevice::HostMode state) +{ + m_powered = state != QBluetoothLocalDevice::HostPoweredOff; + emit poweredChanged(); +} + +bool BluetoothDevice::powered() const +{ + return m_powered; +} + +void BluetoothDevice::setPowered(const bool& aPowered) +{ + if (aPowered) { + m_localDevice->powerOn(); + } + else { + m_localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff); + } +} + +QObject* BluetoothDevice::deviceModel() const +{ + return static_cast<QObject*>(m_deviceModel); +} + +void BluetoothDevice::scanFinished() +{ + m_scanning = false; + emit scanningChanged(); + updateConnectionStatuses(); +} + +bool BluetoothDevice::scanning() const +{ + return m_scanning; +} + +void BluetoothDevice::setScanning(const bool& aScan) +{ + if (m_scanning && !aScan) { + //TODO m_deviceModel->cancel(); + } + else if (aScan && !m_scanning) { + m_deviceModel->scanDevices(); + m_scanning = true; + emit scanningChanged(); + } +} + +void BluetoothDevice::updateConnectionStatuses() +{ + QList<QBluetoothAddress> connectedDevices = + m_localDevice->connectedDevices(); + + foreach (QBluetoothAddress addr, connectedDevices) { + m_deviceModel->setConnected(addr.toString(), true); + } +} + +void BluetoothDevice::requestPairing(const QString& address) +{ + QBluetoothAddress addr(address); + m_localDevice->requestPairing(addr, QBluetoothLocalDevice::Paired); + connect(m_localDevice, &QBluetoothLocalDevice::pairingDisplayConfirmation, this, &BluetoothDevice::pairingDisplayConfirmation); + + connect(m_localDevice, &QBluetoothLocalDevice::pairingDisplayPinCode, this, &BluetoothDevice::pairingDisplayPinCode); + + connect(m_localDevice, &QBluetoothLocalDevice::pairingFinished, this, &BluetoothDevice::pairingFinished); +} + +void BluetoothDevice::requestConnect(const QString &address) +{ + QScopedPointer<BluetoothDevicePrivate> connectionHandler(new BluetoothDevicePrivate(address)); + connectionHandler->connectDevice(); +} + +void BluetoothDevice::requestDisconnect(const QString& address) +{ + QScopedPointer<BluetoothDevicePrivate> connectionHandler(new BluetoothDevicePrivate(address)); + connectionHandler->disconnectDevice(); +} + +void BluetoothDevice::pairingDisplayConfirmation(const QBluetoothAddress & address, QString pin) +{ + Q_UNUSED(address); + Q_UNUSED(pin); +} + +void BluetoothDevice::pairingDisplayPinCode(const QBluetoothAddress & address, QString pin) +{ + Q_UNUSED(address); + Q_UNUSED(pin); +} + +void BluetoothDevice::pairingFinished(const QBluetoothAddress & address, QBluetoothLocalDevice::Pairing pairing) +{ + if (pairing == QBluetoothLocalDevice::Paired) { + requestConnect(address.toString()); + } +} + +void BluetoothDevice::deviceConnected(const QBluetoothAddress & address) +{ + m_deviceModel->setConnected(address.toString(), true); +} + +void BluetoothDevice::deviceDisconnected(const QBluetoothAddress & address) +{ + m_deviceModel->setConnected(address.toString(), false); +} diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/bluetoothdevice.h b/src/qtdevicesettings/bluetoothsettingsplugin/bluetoothdevice.h new file mode 100644 index 0000000..370b2bc --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/bluetoothdevice.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef BLUETOOTHDEVICE_H +#define BLUETOOTHDEVICE_H + +#include <QObject> +#include <QBluetoothLocalDevice> + +class DiscoveryModel; + +class BluetoothDevice : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool scanning READ scanning WRITE setScanning NOTIFY scanningChanged) + Q_PROPERTY(bool powered READ powered WRITE setPowered NOTIFY poweredChanged) + Q_PROPERTY(QObject* deviceModel READ deviceModel CONSTANT) +public: + explicit BluetoothDevice(QObject *parent = 0); + bool powered() const; + void setPowered(const bool& aPowered); + QObject* deviceModel() const; + bool scanning() const; + void setScanning(const bool& aScan); + Q_INVOKABLE void requestPairing(const QString& address); + Q_INVOKABLE void requestConnect(const QString& address); + Q_INVOKABLE void requestDisconnect(const QString& address); +signals: + void poweredChanged(); + void scanningChanged(); + +public slots: + void deviceStateChanged(QBluetoothLocalDevice::HostMode state); + void scanFinished(); + //These are not yet signaled + //See bug https://bugreports.qt.io/browse/QTBUG-38401 + void pairingDisplayConfirmation(const QBluetoothAddress & address, QString pin); + void pairingDisplayPinCode(const QBluetoothAddress & address, QString pin); + void pairingFinished(const QBluetoothAddress & address, QBluetoothLocalDevice::Pairing pairing); + void deviceConnected(const QBluetoothAddress & address); + void deviceDisconnected(const QBluetoothAddress & address); + +private: + void updateConnectionStatuses(); + +private: + QBluetoothLocalDevice* m_localDevice; + DiscoveryModel *m_deviceModel; + bool m_powered; + bool m_scanning; +}; + +#endif // BLUETOOTHDEVICE_H diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/bluetoothsettingsplugin.pro b/src/qtdevicesettings/bluetoothsettingsplugin/bluetoothsettingsplugin.pro new file mode 100644 index 0000000..5ca0add --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/bluetoothsettingsplugin.pro @@ -0,0 +1,32 @@ +TEMPLATE = lib +CONFIG += plugin +QT += qml bluetooth +uri = com.theqtcompany.settings.bluetooth + +TARGET = btsettingsplugin + +include(bluez/bluez.pri) + +HEADERS = \ + bluetoothdevice.h \ + discoverymodel.h + +SOURCES += plugin.cpp \ + bluetoothdevice.cpp \ + discoverymodel.cpp + + +pluginfiles.files += \ + qmldir \ + +installPath = $$[QT_INSTALL_QML]/$$replace(uri, \\., /) + +target.path = $$installPath +pluginfiles.path += $$installPath +INSTALLS += target pluginfiles + + +RESOURCES += \ + icons.qrc \ + qml.qrc + diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/bluez/bluetoothdevice_p.cpp b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/bluetoothdevice_p.cpp new file mode 100644 index 0000000..ded84f2 --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/bluetoothdevice_p.cpp @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "bluetoothdevice_p.h" +#include "datatypes.h" +#include "objectmanager_interface.cpp" +#include "moc_objectmanager_interface.cpp" +#include "device1_interface.h" + + +BluetoothDevicePrivate::BluetoothDevicePrivate(const QString& address, QObject *parent) + :QObject(parent) + ,m_address(address) +{ + +} + +OrgBluezDevice1Interface* BluetoothDevicePrivate::findDevice() +{ + OrgFreedesktopDBusObjectManagerInterface manager(QStringLiteral("org.bluez"), + QStringLiteral("/"), + QDBusConnection::systemBus()); + QDBusPendingReply<ManagedObjectList> reply = manager.GetManagedObjects(); + reply.waitForFinished(); + if (reply.isError()) { + qWarning() << "Failed to get objects"; + return NULL; + } + + ManagedObjectList managedObjectList = reply.value(); + for (ManagedObjectList::const_iterator it = managedObjectList.constBegin(); it != managedObjectList.constEnd(); ++it) { + const QDBusObjectPath &path = it.key(); + + const InterfaceList &ifaceList = it.value(); + for (InterfaceList::const_iterator jt = ifaceList.constBegin(); jt != ifaceList.constEnd(); ++jt) { + const QString &iface = jt.key(); + const QVariantMap &ifaceValues = jt.value(); + if (iface == QStringLiteral("org.bluez.Device1")) { + if (ifaceValues["Address"] == m_address) { + OrgBluezDevice1Interface *devIf = new OrgBluezDevice1Interface("org.bluez", path.path(), QDBusConnection::systemBus()); + return devIf; + } + } + } + } + return NULL; +} + + +void BluetoothDevicePrivate::connectDevice() +{ + OrgBluezDevice1Interface *dev = findDevice(); + if (dev) { + dev->Connect(); + dev->deleteLater(); + } +} + +void BluetoothDevicePrivate::disconnectDevice() +{ + OrgBluezDevice1Interface *dev = findDevice(); + if (dev) { + dev->Disconnect(); + dev->deleteLater(); + } +} diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/bluez/bluetoothdevice_p.h b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/bluetoothdevice_p.h new file mode 100644 index 0000000..0bd9599 --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/bluetoothdevice_p.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utils module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef BLUETOOTHDEVICE__P_H +#define BLUETOOTHDEVICE__P_H + +#include <QObject> +#include <bluetooth/bluetooth.h> + +class OrgBluezDevice1Interface; + +class BluetoothDevicePrivate : public QObject +{ +public: + explicit BluetoothDevicePrivate(const QString& address, QObject *parent=0); + void connectDevice(); + void disconnectDevice(); + +private: + OrgBluezDevice1Interface* findDevice(); + QString m_address; +}; + +#endif // BLUETOOTHDEVICE__P_H diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/bluez/bluez.pri b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/bluez.pri new file mode 100644 index 0000000..f20be87 --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/bluez.pri @@ -0,0 +1,21 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2015-11-03T13:52:45 +# +#------------------------------------------------- + +QT += core dbus + +INCLUDEPATH += $${PWD} +INCLUDEPATH += $${PWD}/bluez + +DBUS_INTERFACES = \ + $${PWD}/objectmanager.xml \ + $${PWD}/device1.xml \ + +HEADERS += \ + $$PWD/bluetoothdevice_p.h \ + $$PWD/dbusdatatypes.h + +SOURCES += \ + $$PWD/bluetoothdevice_p.cpp diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/bluez/datatypes.h b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/datatypes.h new file mode 100644 index 0000000..b794c47 --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/datatypes.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utils module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef DATATYPES_H +#define DATATYPES_H + +#include <QObject> +#include <QtDBus> +#include <QMap> +#include <QVariantMap> +#include <QtDBus/QDBusObjectPath> +#include <QtCore/QMetaType> + +typedef QMap<QString, QVariantMap> InterfaceList; +typedef QMap<QDBusObjectPath, InterfaceList> ManagedObjectList; + +Q_DECLARE_METATYPE(InterfaceList) +Q_DECLARE_METATYPE(ManagedObjectList) + + +#endif // DATATYPES_H diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/bluez/device1.xml b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/device1.xml new file mode 100644 index 0000000..5b16992 --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/device1.xml @@ -0,0 +1,31 @@ +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node> + <interface name="org.bluez.Device1"> + <method name="Disconnect"></method> + <method name="Connect"></method> + <method name="ConnectProfile"> + <arg name="UUID" type="s" direction="in"/> + </method> + <method name="DisconnectProfile"> + <arg name="UUID" type="s" direction="in"/> + </method> + <method name="Pair"></method> + <method name="CancelPairing"></method> + <property name="Address" type="s" access="read"></property> + <property name="Name" type="s" access="read"></property> + <property name="Alias" type="s" access="readwrite"></property> + <property name="Appearance" type="q" access="read"></property> + <property name="Icon" type="s" access="read"></property> + <property name="Paired" type="b" access="read"></property> + <property name="Trusted" type="b" access="readwrite"></property> + <property name="Blocked" type="b" access="readwrite"></property> + <property name="LegacyPairing" type="b" access="read"></property> + <property name="RSSI" type="n" access="read"></property> + <property name="Connected" type="b" access="read"></property> + <property name="UUIDs" type="as" access="read"></property> + <property name="Modalias" type="s" access="read"></property> + <property name="Adapter" type="o" access="read"></property> + </interface> +</node> + diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/bluez/objectmanager.xml b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/objectmanager.xml new file mode 100644 index 0000000..e52d6fe --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/bluez/objectmanager.xml @@ -0,0 +1,20 @@ +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node name="/" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> + <interface name="org.freedesktop.DBus.ObjectManager"> + <method name="GetManagedObjects"> + <arg type="a{oa{sa{sv}}}" name="object_paths_interfaces_and_properties" direction="out"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ManagedObjectList"/> + </method> + <signal name="InterfacesAdded"> + <arg type="o" name="object_path"/> + <arg type="a{sa{sv}}" name="interfaces_and_properties"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="InterfaceList"/> + </signal> + <signal name="InterfacesRemoved"> + <arg type="o" name="object_path"/> + <arg type="as" name="interfaces"/> + </signal> + </interface> +</node> + diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/discoverymodel.cpp b/src/qtdevicesettings/bluetoothsettingsplugin/discoverymodel.cpp new file mode 100644 index 0000000..36d3a2e --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/discoverymodel.cpp @@ -0,0 +1,246 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QBluetoothAddress> +#include "discoverymodel.h" + +BtDeviceItem::BtDeviceItem(const QBluetoothDeviceInfo& bt, QObject *parent) + : QObject(parent) + ,m_name(bt.name()) + ,m_address(bt.address().toString()) + ,m_connected(false) +{ + m_type = getDeviceType(bt.majorDeviceClass(), bt.minorDeviceClass()); +} + +QString BtDeviceItem::name() const +{ + return m_name; +} + +QString BtDeviceItem::address() const +{ + return m_address; +} + +bool BtDeviceItem::connected() const +{ + return m_connected; +} + +void BtDeviceItem::setConnected(bool aConnected) +{ + m_connected = aConnected; + emit connectedChanged(); +} + +BtDeviceItem::DeviceType BtDeviceItem::type() const +{ + return m_type; +} + +BtDeviceItem::DeviceType BtDeviceItem::getDeviceType(const QBluetoothDeviceInfo::MajorDeviceClass major, const quint8 minor) const +{ + switch (major) { + case QBluetoothDeviceInfo::ComputerDevice: + return getComputerDeviceType(minor); + break; + case QBluetoothDeviceInfo::PhoneDevice: + return getPhoneDeviceType(minor); + break; + case QBluetoothDeviceInfo::AudioVideoDevice: + return getAudioDeviceType(minor); + break; + case QBluetoothDeviceInfo::PeripheralDevice: + return getPeripheralDeviceType(minor); + break; + case QBluetoothDeviceInfo::ImagingDevice: + return getImagingDeviceType(minor); + break; + default: + return GenericDevice; + } + return GenericDevice; +} + +BtDeviceItem::DeviceType BtDeviceItem::getComputerDeviceType(const quint8 minor) const +{ + Q_UNUSED(minor); + return Computer; +} + +BtDeviceItem::DeviceType BtDeviceItem::getAudioDeviceType(const quint8 minor) const +{ + switch (minor) { + case QBluetoothDeviceInfo::Microphone: + return Microphone; + break; + case QBluetoothDeviceInfo::WearableHeadsetDevice: + case QBluetoothDeviceInfo::Headphones: + return Headphones; + break; + case QBluetoothDeviceInfo::Camcorder: + case QBluetoothDeviceInfo::VideoCamera: + return Camcorder; + break; + default: + return GenericDevice; + break; + } +} + +BtDeviceItem::DeviceType BtDeviceItem::getPeripheralDeviceType(const quint8 minor) const +{ + switch (minor) { + case QBluetoothDeviceInfo::KeyboardPeripheral: + return Keyboard; + break; + case QBluetoothDeviceInfo::PointingDevicePeripheral: + return Mouse; + break; + default: + return GenericDevice; + break; + } +} + +BtDeviceItem::DeviceType BtDeviceItem::getImagingDeviceType(const quint8 minor) const +{ + switch (minor) { + case QBluetoothDeviceInfo::ImageCamera: + return Camera; + break; + default: + return GenericDevice; + break; + } +} + +BtDeviceItem::DeviceType BtDeviceItem::getPhoneDeviceType(const quint8 minor) const +{ + Q_UNUSED(minor); + return Phone; +} + + +DiscoveryModel::DiscoveryModel(QObject *parent) + : QAbstractListModel(parent) + ,m_discoveryAgent(new QBluetoothDeviceDiscoveryAgent(this)) +{ + m_roleNames.insert(Qt::UserRole, "modelData"); + m_roleNames.insert(Address, "address"); + m_roleNames.insert(Name, "name"); + m_roleNames.insert(Type, "type"); + m_roleNames.insert(Connected, "connected"); + + connect(m_discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), + this, SLOT(deviceDiscovered(QBluetoothDeviceInfo))); + + connect(m_discoveryAgent, SIGNAL(finished()), + this, SIGNAL(scanFinished())); + +} + +void DiscoveryModel::deviceDiscovered(const QBluetoothDeviceInfo &device) +{ + beginInsertRows(QModelIndex(), m_items.count(), m_items.count()); + BtDeviceItem *item = new BtDeviceItem(device); + m_items.append(item); + endInsertRows(); +} + +DiscoveryModel::~DiscoveryModel() +{ + +} + +void DiscoveryModel::scanDevices() +{ + m_discoveryAgent->start(); +} + +QHash<int, QByteArray> DiscoveryModel::roleNames() const +{ + return m_roleNames; +} + +int DiscoveryModel::rowCount(const QModelIndex & parent) const +{ + Q_UNUSED(parent); + return m_items.count(); +} + +QVariant DiscoveryModel::data(const QModelIndex & index, int role) const +{ + if (!index.isValid()) return QVariant(); + + BtDeviceItem *item = m_items[index.row()]; + + switch (role) { + case DiscoveryModel::Name: + return item->name(); + break; + case DiscoveryModel::Address: + return item->address(); + break; + case DiscoveryModel::Type: + return item->type(); + break; + case DiscoveryModel::Connected: + return item->connected(); + default: + return ""; + } +} + +void DiscoveryModel::setConnected(const QString &aAddress, bool connected) +{ + bool found = false; + int i = 0; + QVector<int> role; + role.append(DiscoveryModel::Connected); + foreach (BtDeviceItem *item, m_items) { + if (item->address() == aAddress) { + item->setConnected(connected); + found = true; + break; + } + i++; + } + + if (found) + emit dataChanged(index(i, 0), index(i, 0), role); +} diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/discoverymodel.h b/src/qtdevicesettings/bluetoothsettingsplugin/discoverymodel.h new file mode 100644 index 0000000..de30c4c --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/discoverymodel.h @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef DISCOVERYMODEL_H +#define DISCOVERYMODEL_H + + +#include <QObject> +#include <QAbstractListModel> +#include <QBluetoothDeviceInfo> +#include <QBluetoothDeviceDiscoveryAgent> + +class BtDeviceItem : public QObject +{ + Q_OBJECT + Q_ENUMS(DeviceType) + Q_PROPERTY(QString address READ address CONSTANT) + Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged) + Q_PROPERTY(DeviceType type READ type CONSTANT) +public: + explicit BtDeviceItem(const QBluetoothDeviceInfo& id, QObject *parent=0); + //The list of device type we want to show the icon + enum DeviceType { + Phone, + Computer, + Mouse, + Keyboard, + Headphones, + Microphone, + Camera, + Camcorder, + Clock, + HealthDevice, + GenericDevice=1000 + }; + QString name() const; + QString address() const; + DeviceType type() const; + bool connected() const; + void setConnected(bool aConnected); + +signals: + void connectedChanged(); + +protected: + DeviceType getDeviceType(const QBluetoothDeviceInfo::MajorDeviceClass major, + const quint8 minor) const; + DeviceType getComputerDeviceType(const quint8 minor) const; + DeviceType getAudioDeviceType(const quint8 minor) const; + DeviceType getPeripheralDeviceType(const quint8 minor) const; + DeviceType getImagingDeviceType(const quint8 minor) const; + DeviceType getHealthDeviceType(const quint8 minor) const; + DeviceType getPhoneDeviceType(const quint8 minor) const; + +private: + QString m_name; + QString m_address; + bool m_connected; + DeviceType m_type; +}; + +class DiscoveryModel : public QAbstractListModel +{ + Q_OBJECT + Q_ENUMS(DeviceType) +public: + explicit DiscoveryModel(QObject *parent=0); + virtual ~DiscoveryModel(); + // from QAbstractItemModel + int rowCount(const QModelIndex & parent = QModelIndex()) const; + QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; + QHash<int, QByteArray> roleNames() const; + Q_INVOKABLE QVariant itemFromRow(const int row) const; + void setConnected(const QString& aAddress, bool connected); + void scanDevices(); + + enum Roles { + Name = Qt::UserRole, + Address, + Type, + Connected + }; + +signals: + void scanFinished(); + +private slots: + void deviceDiscovered(const QBluetoothDeviceInfo &device); + void canceled(); + void error(QBluetoothDeviceDiscoveryAgent::Error error); + void finished(); +private: + QList<BtDeviceItem*> m_items; + QHash<int, QByteArray> m_roleNames; + QBluetoothDeviceDiscoveryAgent *m_discoveryAgent; +}; +#endif // DISCOVERYMODEL_H diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/icons.qrc b/src/qtdevicesettings/bluetoothsettingsplugin/icons.qrc new file mode 100644 index 0000000..a7c8d7e --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/icons.qrc @@ -0,0 +1,16 @@ +<RCC> + <qresource prefix="/"> + <file>../icons/Bluetooth_qt_1x.png</file> + <file>../icons/Camcorder_qt_1x.png</file> + <file>../icons/Camera_qt_1x.png</file> + <file>../icons/Clock_qt_1x.png</file> + <file>../icons/Headphones_qt_1x.png</file> + <file>../icons/Heartbeat_qt_1x.png</file> + <file>../icons/Keyboard_qt_1x.png</file> + <file>../icons/Laptop_qt_1x.png</file> + <file>../icons/Microphone_qt_1x.png</file> + <file>../icons/MobilePhone_qt_1x.png</file> + <file>../icons/Mouse_qt_1x.png</file> + <file>../icons/Tablet_qt_1x.png</file> + </qresource> +</RCC> diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/plugin.cpp b/src/qtdevicesettings/bluetoothsettingsplugin/plugin.cpp new file mode 100644 index 0000000..24e9705 --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/plugin.cpp @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtQml/QQmlExtensionPlugin> +#include <QtQml/qqml.h> +#include <qcoreapplication.h> +#include <QQmlEngine> +#include <QQmlContext> + +#include "bluetoothdevice.h" +#include "discoverymodel.h" + +class BluetoothSettingsQmlPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == QLatin1String("com.theqtcompany.settings.bluetooth")); + qmlRegisterUncreatableType<BtDeviceItem>(uri, 1, 0, "BtDeviceItem", "Cannot be instantiated directly."); + const QString prefix = "qrc:"; + qmlRegisterType(QUrl(prefix + "Bluetooth.qml"), uri, 1, 0, "Bluetooth"); + qmlRegisterType(QUrl(prefix + "Discovery.qml"), uri, 1, 0, "Discovery"); + + } + + void initializeEngine(QQmlEngine * engine, const char * uri) + { + Q_ASSERT(QLatin1String(uri) == QLatin1String("com.theqtcompany.settings.bluetooth")); + BluetoothDevice *device = new BluetoothDevice(engine); + engine->rootContext()->setContextProperty("BtDevice", device); + } +}; + +#include "plugin.moc" diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/qml.qrc b/src/qtdevicesettings/bluetoothsettingsplugin/qml.qrc new file mode 100644 index 0000000..1d36902 --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/qml.qrc @@ -0,0 +1,6 @@ +<RCC> + <qresource prefix="/"> + <file>Bluetooth.qml</file> + <file>Discovery.qml</file> + </qresource> +</RCC> diff --git a/src/qtdevicesettings/bluetoothsettingsplugin/qmldir b/src/qtdevicesettings/bluetoothsettingsplugin/qmldir new file mode 100644 index 0000000..febebc2 --- /dev/null +++ b/src/qtdevicesettings/bluetoothsettingsplugin/qmldir @@ -0,0 +1,3 @@ +module com.theqtcompany.settings.bluetooth +Bluetooth 1.0 Bluetooth.qml +plugin btsettingsplugin |