Add bluez module

pull/5/head
reionwong 4 years ago
parent 40dd871f08
commit 01ac677dae

@ -34,6 +34,7 @@ endif()
# -------------------------------------------
add_subdirectory(accounts)
add_subdirectory(bluez)
add_subdirectory(mpris)
add_subdirectory(networkmanagement)
add_subdirectory(screen)

@ -8,7 +8,7 @@ sudo pacman -S gcc cmake qt5-base qt5-quickcontrols2 networkmanager-qt modemmana
Note that when using apt, the names of certain packages are different:
```shell
sudo apt install qtbase5-dev qtquickcontrols2-5-dev modemmanager-qt-dev libqt5sensors5-dev libkf5networkmanagerqt-dev libkf5screen-dev
sudo apt install qtbase5-dev qtquickcontrols2-5-dev modemmanager-qt-dev libqt5sensors5-dev libkf5networkmanagerqt-dev libkf5screen-dev libkf5bluezqt-dev
```
## Build and Install
@ -23,4 +23,4 @@ sudo make install
## License
This project has been licensed by GPLv3.
This project has been licensed by GPLv3.

@ -0,0 +1,26 @@
set(bluezqtextensionplugin_SRCS
declarativemanager.cpp
declarativeadapter.cpp
# declarativebattery.cpp
declarativedevice.cpp
declarativeinput.cpp
declarativemediaplayer.cpp
declarativedevicesmodel.cpp
bluezqtextensionplugin.cpp
applet/devicesproxymodel.cpp
)
add_library(cutefishbluez_qmlplugins SHARED ${bluezqtextensionplugin_SRCS})
find_package(KF5BluezQt REQUIRED)
target_link_libraries(cutefishbluez_qmlplugins
Qt5::Core
Qt5::Qml
Qt5::DBus
KF5::BluezQt
)
install(TARGETS cutefishbluez_qmlplugins DESTINATION ${INSTALL_QMLDIR}/Cutefish/Bluez)
install(FILES DevicesModel.qml DESTINATION ${INSTALL_QMLDIR}/Cutefish/Bluez)
install(FILES qmldir DESTINATION ${INSTALL_QMLDIR}/Cutefish/Bluez)

@ -0,0 +1,11 @@
/*
* SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
import Cutefish.Bluez 1.0 as Bluez
Bluez.DevicesModelPrivate {
manager: Bluez.Manager
}

@ -0,0 +1,102 @@
/*
SPDX-FileCopyrightText: 2014-2015 David Rosca <nowrep@gmail.com>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "devicesproxymodel.h"
#include <BluezQt/Adapter>
#include <BluezQt/Device>
DevicesProxyModel::DevicesProxyModel(QObject *parent)
: QSortFilterProxyModel(parent)
{
setDynamicSortFilter(true);
sort(0, Qt::DescendingOrder);
}
QHash<int, QByteArray> DevicesProxyModel::roleNames() const
{
QHash<int, QByteArray> roles = QSortFilterProxyModel::roleNames();
roles[SectionRole] = QByteArrayLiteral("Section");
roles[DeviceFullNameRole] = QByteArrayLiteral("DeviceFullName");
return roles;
}
QVariant DevicesProxyModel::data(const QModelIndex &index, int role) const
{
switch (role) {
case SectionRole:
if (index.data(BluezQt::DevicesModel::ConnectedRole).toBool()) {
return QStringLiteral("Connected");
}
return QStringLiteral("Available");
case DeviceFullNameRole:
if (duplicateIndexAddress(index)) {
const QString &name = QSortFilterProxyModel::data(index, BluezQt::DevicesModel::NameRole).toString();
const QString &ubi = QSortFilterProxyModel::data(index, BluezQt::DevicesModel::UbiRole).toString();
const QString &hci = adapterHciString(ubi);
if (!hci.isEmpty()) {
return QStringLiteral("%1 - %2").arg(name, hci);
}
}
return QSortFilterProxyModel::data(index, BluezQt::DevicesModel::NameRole);
default:
return QSortFilterProxyModel::data(index, role);
}
}
bool DevicesProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
bool leftConnected = left.data(BluezQt::DevicesModel::ConnectedRole).toBool();
bool rightConnected = right.data(BluezQt::DevicesModel::ConnectedRole).toBool();
if (leftConnected < rightConnected) {
return true;
} else if (leftConnected > rightConnected) {
return false;
}
const QString &leftName = left.data(BluezQt::DevicesModel::NameRole).toString();
const QString &rightName = right.data(BluezQt::DevicesModel::NameRole).toString();
return QString::localeAwareCompare(leftName, rightName) > 0;
}
// Returns "hciX" part from UBI "/org/bluez/hciX/dev_xx_xx_xx_xx_xx_xx"
QString DevicesProxyModel::adapterHciString(const QString &ubi) const
{
int startIndex = ubi.indexOf(QLatin1String("/hci")) + 1;
if (startIndex < 1) {
return QString();
}
int endIndex = ubi.indexOf(QLatin1Char('/'), startIndex);
if (endIndex == -1) {
return ubi.mid(startIndex);
}
return ubi.mid(startIndex, endIndex - startIndex);
}
bool DevicesProxyModel::duplicateIndexAddress(const QModelIndex &idx) const
{
const QModelIndexList &list = match(index(0, 0), //
BluezQt::DevicesModel::AddressRole,
idx.data(BluezQt::DevicesModel::AddressRole).toString(),
2,
Qt::MatchExactly);
return list.size() > 1;
}
bool DevicesProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
const QModelIndex index = sourceModel()->index(source_row, 0, source_parent);
// Only show paired devices in the KCM and applet
return index.data(BluezQt::DevicesModel::PairedRole).toBool();
}

@ -0,0 +1,36 @@
/*
SPDX-FileCopyrightText: 2014 David Rosca <nowrep@gmail.com>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#ifndef DEVICESPROXYMODEL_H
#define DEVICESPROXYMODEL_H
#include <BluezQt/DevicesModel>
#include <QSortFilterProxyModel>
class DevicesProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
enum AdditionalRoles {
SectionRole = BluezQt::DevicesModel::LastRole + 10,
DeviceFullNameRole = BluezQt::DevicesModel::LastRole + 11,
};
explicit DevicesProxyModel(QObject *parent = nullptr);
QHash<int, QByteArray> roleNames() const override;
QVariant data(const QModelIndex &index, int role) const override;
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
Q_INVOKABLE QString adapterHciString(const QString &ubi) const;
private:
bool duplicateIndexAddress(const QModelIndex &idx) const;
};
#endif // DEVICESPROXYMODEL_H

@ -0,0 +1,81 @@
/*
* BluezQt - Asynchronous BlueZ wrapper library
*
* SPDX-FileCopyrightText: 2014 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "bluezqtextensionplugin.h"
#include "declarativeadapter.h"
// #include "declarativebattery.h"
#include "declarativedevice.h"
#include "declarativedevicesmodel.h"
#include "declarativeinput.h"
#include "declarativemanager.h"
#include "declarativemediaplayer.h"
#include "applet/devicesproxymodel.h"
#include <BluezQt/Device>
#include <BluezQt/PendingCall>
#include <BluezQt/Rfkill>
#include <BluezQt/Services>
#include <QtQml> // krazy:exclude=includes
static QObject *manager_singleton(QQmlEngine *engine, QJSEngine *scriptEngine)
{
Q_UNUSED(engine)
Q_UNUSED(scriptEngine)
return new DeclarativeManager;
}
static QJSValue services_singleton(QQmlEngine *engine, QJSEngine *scriptEngine)
{
Q_UNUSED(engine)
QJSValue object = scriptEngine->newObject();
object.setProperty(QStringLiteral("ServiceDiscoveryServer"), BluezQt::Services::ServiceDiscoveryServer);
object.setProperty(QStringLiteral("SerialPort"), BluezQt::Services::SerialPort);
object.setProperty(QStringLiteral("DialupNetworking"), BluezQt::Services::DialupNetworking);
object.setProperty(QStringLiteral("ObexObjectPush"), BluezQt::Services::ObexObjectPush);
object.setProperty(QStringLiteral("ObexFileTransfer"), BluezQt::Services::ObexFileTransfer);
object.setProperty(QStringLiteral("Headset"), BluezQt::Services::Headset);
object.setProperty(QStringLiteral("AudioSource"), BluezQt::Services::AudioSource);
object.setProperty(QStringLiteral("AudioVideoRemoteControlTarget"), BluezQt::Services::AudioVideoRemoteControlTarget);
object.setProperty(QStringLiteral("AdvancedAudioDistribution"), BluezQt::Services::AdvancedAudioDistribution);
object.setProperty(QStringLiteral("AudioVideoRemoteControl"), BluezQt::Services::AudioVideoRemoteControl);
object.setProperty(QStringLiteral("HeadsetAudioGateway"), BluezQt::Services::HeadsetAudioGateway);
object.setProperty(QStringLiteral("Panu"), BluezQt::Services::Panu);
object.setProperty(QStringLiteral("Nap"), BluezQt::Services::Nap);
object.setProperty(QStringLiteral("Handsfree"), BluezQt::Services::Handsfree);
object.setProperty(QStringLiteral("HandsfreeAudioGateway"), BluezQt::Services::HandsfreeAudioGateway);
object.setProperty(QStringLiteral("HumanInterfaceDevice"), BluezQt::Services::HumanInterfaceDevice);
object.setProperty(QStringLiteral("SimAccess"), BluezQt::Services::SimAccess);
object.setProperty(QStringLiteral("PhonebookAccessServer"), BluezQt::Services::PhonebookAccessServer);
object.setProperty(QStringLiteral("MessageAccessServer"), BluezQt::Services::MessageAccessServer);
object.setProperty(QStringLiteral("PnpInformation"), BluezQt::Services::PnpInformation);
return object;
}
void BluezQtExtensionPlugin::registerTypes(const char *uri)
{
using namespace BluezQt;
Q_ASSERT(QLatin1String(uri) == QLatin1String("Cutefish.Bluez"));
qmlRegisterType<DevicesProxyModel>(uri, 1, 0, "DevicesProxyModel");
qmlRegisterSingletonType<DeclarativeManager>(uri, 1, 0, "Manager", manager_singleton);
qmlRegisterType<DeclarativeDevicesModel>(uri, 1, 0, "DevicesModelPrivate");
qmlRegisterUncreatableType<DeclarativeAdapter>(uri, 1, 0, "Adapter", QStringLiteral("Adapter cannot be created"));
// qmlRegisterUncreatableType<DeclarativeBattery>(uri, 1, 0, "Battery", QStringLiteral("Battery cannot be created"));
qmlRegisterUncreatableType<DeclarativeDevice>(uri, 1, 0, "Device", QStringLiteral("Device cannot be created"));
qmlRegisterUncreatableType<DeclarativeInput>(uri, 1, 0, "Input", QStringLiteral("Input cannot be created"));
qmlRegisterUncreatableType<DeclarativeMediaPlayer>(uri, 1, 0, "MediaPlayer", QStringLiteral("MediaPlayer cannot be created"));
qmlRegisterUncreatableType<PendingCall>(uri, 1, 0, "PendingCall", QStringLiteral("PendingCall cannot be created"));
qmlRegisterUncreatableType<Rfkill>(uri, 1, 0, "Rfkill", QStringLiteral("Rfkill cannot be created"));
qmlRegisterSingletonType(uri, 1, 0, "Services", services_singleton);
}

@ -0,0 +1,23 @@
/*
* BluezQt - Asynchronous Bluez wrapper library
*
* SPDX-FileCopyrightText: 2014-2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#ifndef BLUEZQTEXTENSIONPLUGIN_H
#define BLUEZQTEXTENSIONPLUGIN_H
#include <QQmlExtensionPlugin>
class BluezQtExtensionPlugin : public QQmlExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "Cutefish.Bluez")
public:
void registerTypes(const char *uri) override;
};
#endif // BLUEZQTEXTENSIONPLUGIN_H

@ -0,0 +1,198 @@
/*
* BluezQt - Asynchronous Bluez wrapper library
*
* SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "declarativeadapter.h"
#include "declarativedevice.h"
static int devicesCountDeclarativeAdapterFunction(QQmlListProperty<DeclarativeDevice> *property)
{
Q_ASSERT(qobject_cast<DeclarativeAdapter *>(property->object));
DeclarativeAdapter *adapter = static_cast<DeclarativeAdapter *>(property->object);
return adapter->m_devices.count();
}
static DeclarativeDevice *devicesAtDeclarativeAdapterFunction(QQmlListProperty<DeclarativeDevice> *property, int index)
{
Q_ASSERT(qobject_cast<DeclarativeAdapter *>(property->object));
DeclarativeAdapter *adapter = static_cast<DeclarativeAdapter *>(property->object);
return adapter->m_devices.values().at(index);
}
DeclarativeAdapter::DeclarativeAdapter(BluezQt::AdapterPtr adapter, QObject *parent)
: QObject(parent)
, m_adapter(adapter)
{
connect(m_adapter.data(), &BluezQt::Adapter::nameChanged, this, &DeclarativeAdapter::nameChanged);
connect(m_adapter.data(), &BluezQt::Adapter::systemNameChanged, this, &DeclarativeAdapter::systemNameChanged);
connect(m_adapter.data(), &BluezQt::Adapter::adapterClassChanged, this, &DeclarativeAdapter::adapterClassChanged);
connect(m_adapter.data(), &BluezQt::Adapter::poweredChanged, this, &DeclarativeAdapter::poweredChanged);
connect(m_adapter.data(), &BluezQt::Adapter::discoverableChanged, this, &DeclarativeAdapter::discoverableChanged);
connect(m_adapter.data(), &BluezQt::Adapter::discoverableTimeoutChanged, this, &DeclarativeAdapter::discoverableTimeoutChanged);
connect(m_adapter.data(), &BluezQt::Adapter::pairableChanged, this, &DeclarativeAdapter::pairableChanged);
connect(m_adapter.data(), &BluezQt::Adapter::pairableTimeoutChanged, this, &DeclarativeAdapter::pairableTimeoutChanged);
connect(m_adapter.data(), &BluezQt::Adapter::discoveringChanged, this, &DeclarativeAdapter::discoveringChanged);
connect(m_adapter.data(), &BluezQt::Adapter::uuidsChanged, this, &DeclarativeAdapter::uuidsChanged);
connect(m_adapter.data(), &BluezQt::Adapter::modaliasChanged, this, &DeclarativeAdapter::modaliasChanged);
connect(m_adapter.data(), &BluezQt::Adapter::deviceAdded, this, &DeclarativeAdapter::slotDeviceAdded);
connect(m_adapter.data(), &BluezQt::Adapter::deviceRemoved, this, &DeclarativeAdapter::slotDeviceRemoved);
connect(m_adapter.data(), &BluezQt::Adapter::adapterRemoved, this, [this]() {
Q_EMIT adapterRemoved(this);
});
connect(m_adapter.data(), &BluezQt::Adapter::adapterChanged, this, [this]() {
Q_EMIT adapterChanged(this);
});
connect(m_adapter.data(), &BluezQt::Adapter::deviceChanged, this, [this](const BluezQt::DevicePtr &device) {
Q_EMIT deviceChanged(declarativeDeviceFromPtr(device));
});
}
QString DeclarativeAdapter::ubi() const
{
return m_adapter->ubi();
}
QString DeclarativeAdapter::address() const
{
return m_adapter->address();
}
QString DeclarativeAdapter::name() const
{
return m_adapter->name();
}
void DeclarativeAdapter::setName(const QString &name)
{
m_adapter->setName(name);
}
QString DeclarativeAdapter::systemName() const
{
return m_adapter->systemName();
}
quint32 DeclarativeAdapter::adapterClass() const
{
return m_adapter->adapterClass();
}
bool DeclarativeAdapter::isPowered() const
{
return m_adapter->isPowered();
}
void DeclarativeAdapter::setPowered(bool powered)
{
m_adapter->setPowered(powered);
}
bool DeclarativeAdapter::isDiscoverable() const
{
return m_adapter->isDiscoverable();
}
void DeclarativeAdapter::setDiscoverable(bool discoverable)
{
m_adapter->setDiscoverable(discoverable);
}
quint32 DeclarativeAdapter::discoverableTimeout() const
{
return m_adapter->discoverableTimeout();
}
void DeclarativeAdapter::setDiscoverableTimeout(quint32 timeout)
{
m_adapter->setDiscoverableTimeout(timeout);
}
bool DeclarativeAdapter::isPairable() const
{
return m_adapter->isPairable();
}
void DeclarativeAdapter::setPairable(bool pairable)
{
m_adapter->setPairable(pairable);
}
quint32 DeclarativeAdapter::pairableTimeout() const
{
return m_adapter->pairableTimeout();
}
void DeclarativeAdapter::setPairableTimeout(quint32 timeout)
{
m_adapter->setPairableTimeout(timeout);
}
bool DeclarativeAdapter::isDiscovering()
{
return m_adapter->isDiscovering();
}
QStringList DeclarativeAdapter::uuids() const
{
return m_adapter->uuids();
}
QString DeclarativeAdapter::modalias() const
{
return m_adapter->modalias();
}
QQmlListProperty<DeclarativeDevice> DeclarativeAdapter::devices()
{
return QQmlListProperty<DeclarativeDevice>(this, nullptr, devicesCountDeclarativeAdapterFunction, devicesAtDeclarativeAdapterFunction);
}
DeclarativeDevice *DeclarativeAdapter::deviceForAddress(const QString &address) const
{
return declarativeDeviceFromPtr(m_adapter->deviceForAddress(address));
}
BluezQt::PendingCall *DeclarativeAdapter::startDiscovery()
{
return m_adapter->startDiscovery();
}
BluezQt::PendingCall *DeclarativeAdapter::stopDiscovery()
{
return m_adapter->stopDiscovery();
}
BluezQt::PendingCall *DeclarativeAdapter::removeDevice(DeclarativeDevice *device)
{
return m_adapter->removeDevice(m_adapter->deviceForAddress(device->address()));
}
void DeclarativeAdapter::slotDeviceAdded(BluezQt::DevicePtr device)
{
Q_EMIT deviceFound(declarativeDeviceFromPtr(device));
Q_EMIT devicesChanged(devices());
}
void DeclarativeAdapter::slotDeviceRemoved(BluezQt::DevicePtr device)
{
Q_EMIT deviceRemoved(declarativeDeviceFromPtr(device));
Q_EMIT devicesChanged(devices());
}
DeclarativeDevice *DeclarativeAdapter::declarativeDeviceFromPtr(BluezQt::DevicePtr ptr) const
{
if (!ptr) {
return nullptr;
}
return m_devices.value(ptr->ubi());
}

@ -0,0 +1,111 @@
/*
* BluezQt - Asynchronous Bluez wrapper library
*
* SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#ifndef DECLARATIVEADAPTER_H
#define DECLARATIVEADAPTER_H
#include <QQmlListProperty>
#include <BluezQt/Adapter>
class DeclarativeDevice;
class DeclarativeAdapter : public QObject
{
Q_OBJECT
Q_PROPERTY(QString ubi READ ubi CONSTANT)
Q_PROPERTY(QString address READ address CONSTANT)
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString systemName READ systemName NOTIFY systemNameChanged)
Q_PROPERTY(quint32 adapterClass READ adapterClass NOTIFY adapterClassChanged)
Q_PROPERTY(bool powered READ isPowered WRITE setPowered NOTIFY poweredChanged)
Q_PROPERTY(bool discoverable READ isDiscoverable WRITE setDiscoverable NOTIFY discoverableChanged)
Q_PROPERTY(quint32 discoverableTimeout READ discoverableTimeout WRITE setDiscoverableTimeout NOTIFY discoverableTimeoutChanged)
Q_PROPERTY(bool pairable READ isPairable WRITE setPairable NOTIFY pairableChanged)
Q_PROPERTY(quint32 pairableTimeout READ pairableTimeout WRITE setPairableTimeout NOTIFY pairableTimeoutChanged)
Q_PROPERTY(bool discovering READ isDiscovering NOTIFY discoveringChanged)
Q_PROPERTY(QStringList uuids READ uuids NOTIFY uuidsChanged)
Q_PROPERTY(QString modalias READ modalias NOTIFY modaliasChanged)
Q_PROPERTY(QQmlListProperty<DeclarativeDevice> devices READ devices NOTIFY devicesChanged)
public:
explicit DeclarativeAdapter(BluezQt::AdapterPtr adapter, QObject *parent = nullptr);
QString ubi() const;
QString address() const;
QString name() const;
void setName(const QString &name);
QString systemName() const;
quint32 adapterClass() const;
bool isPowered() const;
void setPowered(bool powered);
bool isDiscoverable() const;
void setDiscoverable(bool discoverable);
quint32 discoverableTimeout() const;
void setDiscoverableTimeout(quint32 timeout);
bool isPairable() const;
void setPairable(bool pairable);
quint32 pairableTimeout() const;
void setPairableTimeout(quint32 timeout);
bool isDiscovering();
QStringList uuids() const;
QString modalias() const;
QQmlListProperty<DeclarativeDevice> devices();
BluezQt::AdapterPtr m_adapter;
QHash<QString, DeclarativeDevice *> m_devices;
public Q_SLOTS:
DeclarativeDevice *deviceForAddress(const QString &address) const;
BluezQt::PendingCall *startDiscovery();
BluezQt::PendingCall *stopDiscovery();
BluezQt::PendingCall *removeDevice(DeclarativeDevice *device);
Q_SIGNALS:
void adapterRemoved(DeclarativeAdapter *adapter);
void adapterChanged(DeclarativeAdapter *adapter);
void nameChanged(const QString &name);
void systemNameChanged(const QString &name);
void adapterClassChanged(quint32 adapterClass);
void poweredChanged(bool powered);
void discoverableChanged(bool discoverable);
void discoverableTimeoutChanged(quint32 timeout);
void pairableChanged(bool pairable);
void pairableTimeoutChanged(quint32 timeout);
void discoveringChanged(bool discovering);
void uuidsChanged(const QStringList &uuids);
void modaliasChanged(const QString &modalias);
void deviceFound(DeclarativeDevice *device);
void deviceRemoved(DeclarativeDevice *device);
void deviceChanged(DeclarativeDevice *device);
void devicesChanged(QQmlListProperty<DeclarativeDevice> devices);
private Q_SLOTS:
void slotDeviceAdded(BluezQt::DevicePtr device);
void slotDeviceRemoved(BluezQt::DevicePtr device);
private:
DeclarativeDevice *declarativeDeviceFromPtr(BluezQt::DevicePtr ptr) const;
};
#endif // DECLARATIVEADAPTER_H

@ -0,0 +1,21 @@
/*
* BluezQt - Asynchronous BlueZ wrapper library
*
* SPDX-FileCopyrightText: 2019 Kai Uwe Broulik <kde@broulik.de>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "declarativebattery.h"
DeclarativeBattery::DeclarativeBattery(const BluezQt::BatteryPtr &battery, QObject *parent)
: QObject(parent)
, m_battery(battery)
{
connect(m_battery.data(), &BluezQt::Battery::percentageChanged, this, &DeclarativeBattery::percentageChanged);
}
int DeclarativeBattery::percentage() const
{
return m_battery->percentage();
}

@ -0,0 +1,32 @@
/*
* BluezQt - Asynchronous BlueZ wrapper library
*
* SPDX-FileCopyrightText: 2019 Kai Uwe Broulik <kde@broulik.de>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#ifndef DECLARATIVEBATTERY_H
#define DECLARATIVEBATTERY_H
#include <BluezQt/Device>
#include <BluezQt/Types>
class DeclarativeBattery : public QObject
{
Q_OBJECT
Q_PROPERTY(int percentage READ percentage NOTIFY percentageChanged)
public:
explicit DeclarativeBattery(const BluezQt::BatteryPtr &battery, QObject *parent = nullptr);
int percentage() const;
Q_SIGNALS:
void percentageChanged(int percentage);
private:
BluezQt::BatteryPtr m_battery;
};
#endif // DECLARATIVEBATTERY_H

@ -0,0 +1,246 @@
/*
* BluezQt - Asynchronous BlueZ wrapper library
*
* SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "declarativedevice.h"
#include "declarativeadapter.h"
// #include "declarativebattery.h"
#include "declarativeinput.h"
#include "declarativemediaplayer.h"
#include <QStringList>
DeclarativeDevice::DeclarativeDevice(BluezQt::DevicePtr device, DeclarativeAdapter *adapter)
: QObject(adapter)
, m_device(device)
, m_adapter(adapter)
// , m_battery(nullptr)
, m_input(nullptr)
, m_mediaPlayer(nullptr)
{
connect(m_device.data(), &BluezQt::Device::nameChanged, this, &DeclarativeDevice::nameChanged);
connect(m_device.data(), &BluezQt::Device::friendlyNameChanged, this, &DeclarativeDevice::friendlyNameChanged);
connect(m_device.data(), &BluezQt::Device::remoteNameChanged, this, &DeclarativeDevice::remoteNameChanged);
connect(m_device.data(), &BluezQt::Device::deviceClassChanged, this, &DeclarativeDevice::deviceClassChanged);
connect(m_device.data(), &BluezQt::Device::typeChanged, this, &DeclarativeDevice::typeChanged);
connect(m_device.data(), &BluezQt::Device::appearanceChanged, this, &DeclarativeDevice::appearanceChanged);
connect(m_device.data(), &BluezQt::Device::iconChanged, this, &DeclarativeDevice::iconChanged);
connect(m_device.data(), &BluezQt::Device::pairedChanged, this, &DeclarativeDevice::pairedChanged);
connect(m_device.data(), &BluezQt::Device::trustedChanged, this, &DeclarativeDevice::trustedChanged);
connect(m_device.data(), &BluezQt::Device::blockedChanged, this, &DeclarativeDevice::blockedChanged);
connect(m_device.data(), &BluezQt::Device::legacyPairingChanged, this, &DeclarativeDevice::legacyPairingChanged);
connect(m_device.data(), &BluezQt::Device::rssiChanged, this, &DeclarativeDevice::rssiChanged);
connect(m_device.data(), &BluezQt::Device::connectedChanged, this, &DeclarativeDevice::connectedChanged);
connect(m_device.data(), &BluezQt::Device::uuidsChanged, this, &DeclarativeDevice::uuidsChanged);
connect(m_device.data(), &BluezQt::Device::modaliasChanged, this, &DeclarativeDevice::modaliasChanged);
connect(m_device.data(), &BluezQt::Device::mediaPlayerChanged, this, &DeclarativeDevice::updateMediaPlayer);
connect(m_device.data(), &BluezQt::Device::inputChanged, this, &DeclarativeDevice::updateInput);
// connect(m_device.data(), &BluezQt::Device::batteryChanged, this, &DeclarativeDevice::updateBattery);
connect(m_device.data(), &BluezQt::Device::deviceRemoved, this, [this]() {
Q_EMIT deviceRemoved(this);
});
connect(m_device.data(), &BluezQt::Device::deviceChanged, this, [this]() {
Q_EMIT deviceChanged(this);
});
updateInput();
updateMediaPlayer();
}
QString DeclarativeDevice::ubi() const
{
return m_device->ubi();
}
QString DeclarativeDevice::address() const
{
return m_device->address();
}
QString DeclarativeDevice::name() const
{
return m_device->name();
}
void DeclarativeDevice::setName(const QString &name)
{
m_device->setName(name);
}
QString DeclarativeDevice::friendlyName() const
{
return m_device->friendlyName();
}
QString DeclarativeDevice::remoteName() const
{
return m_device->remoteName();
}
quint32 DeclarativeDevice::deviceClass() const
{
return m_device->deviceClass();
}
BluezQt::Device::Type DeclarativeDevice::type() const
{
return m_device->type();
}
quint16 DeclarativeDevice::appearance() const
{
return m_device->appearance();
}
QString DeclarativeDevice::icon() const
{
return m_device->icon();
}
bool DeclarativeDevice::isPaired() const
{
return m_device->isPaired();
}
bool DeclarativeDevice::isTrusted() const
{
return m_device->isTrusted();
}
void DeclarativeDevice::setTrusted(bool trusted)
{
m_device->setTrusted(trusted);
}
bool DeclarativeDevice::isBlocked() const
{
return m_device->isBlocked();
}
void DeclarativeDevice::setBlocked(bool blocked)
{
m_device->setBlocked(blocked);
}
bool DeclarativeDevice::hasLegacyPairing() const
{
return m_device->hasLegacyPairing();
}
qint16 DeclarativeDevice::rssi() const
{
return m_device->rssi();
}
bool DeclarativeDevice::isConnected() const
{
return m_device->isConnected();
}
QStringList DeclarativeDevice::uuids() const
{
return m_device->uuids();
}
QString DeclarativeDevice::modalias() const
{
return m_device->modalias();
}
//DeclarativeBattery *DeclarativeDevice::battery() const
//{
// return m_battery;
//}
DeclarativeInput *DeclarativeDevice::input() const
{
return m_input;
}
DeclarativeMediaPlayer *DeclarativeDevice::mediaPlayer() const
{
return m_mediaPlayer;
}
DeclarativeAdapter *DeclarativeDevice::adapter() const
{
return m_adapter;
}
BluezQt::PendingCall *DeclarativeDevice::connectToDevice()
{
return m_device->connectToDevice();
}
BluezQt::PendingCall *DeclarativeDevice::disconnectFromDevice()
{
return m_device->disconnectFromDevice();
}
BluezQt::PendingCall *DeclarativeDevice::connectProfile(const QString &uuid)
{
return m_device->connectProfile(uuid);
}
BluezQt::PendingCall *DeclarativeDevice::disconnectProfile(const QString &uuid)
{
return m_device->disconnectProfile(uuid);
}
BluezQt::PendingCall *DeclarativeDevice::pair()
{
return m_device->pair();
}
BluezQt::PendingCall *DeclarativeDevice::cancelPairing()
{
return m_device->cancelPairing();
}
void DeclarativeDevice::updateBattery()
{
// if (m_battery) {
// m_battery->deleteLater();
// m_battery = nullptr;
// }
// if (m_device->battery()) {
// m_battery = new DeclarativeBattery(m_device->battery(), this);
// }
// Q_EMIT batteryChanged(m_battery);
}
void DeclarativeDevice::updateInput()
{
if (m_input) {
m_input->deleteLater();
m_input = nullptr;
}
if (m_device->input()) {
m_input = new DeclarativeInput(m_device->input(), this);
}
Q_EMIT inputChanged(m_input);
}
void DeclarativeDevice::updateMediaPlayer()
{
if (m_mediaPlayer) {
m_mediaPlayer->deleteLater();
m_mediaPlayer = nullptr;
}
if (m_device->mediaPlayer()) {
m_mediaPlayer = new DeclarativeMediaPlayer(m_device->mediaPlayer(), this);
}
Q_EMIT mediaPlayerChanged(m_mediaPlayer);
}

@ -0,0 +1,135 @@
/*
* BluezQt - Asynchronous BlueZ wrapper library
*
* SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#ifndef DECLARATIVEDEVICE_H
#define DECLARATIVEDEVICE_H
#include "declarativeinput.h"
#include "declarativemediaplayer.h"
#include <BluezQt/Device>
class DeclarativeAdapter;
// class DeclarativeBattery;
class DeclarativeDevice : public QObject
{
Q_OBJECT
Q_PROPERTY(QString ubi READ ubi CONSTANT)
Q_PROPERTY(QString address READ address CONSTANT)
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString friendlyName READ friendlyName NOTIFY friendlyNameChanged)
Q_PROPERTY(QString remoteName READ remoteName NOTIFY remoteNameChanged)
Q_PROPERTY(quint32 deviceClass READ deviceClass NOTIFY deviceClassChanged)
Q_PROPERTY(BluezQt::Device::Type type READ type NOTIFY typeChanged)
Q_PROPERTY(quint16 appearance READ appearance NOTIFY appearanceChanged)
Q_PROPERTY(QString icon READ icon NOTIFY iconChanged)
Q_PROPERTY(bool paired READ isPaired NOTIFY pairedChanged)
Q_PROPERTY(bool trusted READ isTrusted WRITE setTrusted NOTIFY trustedChanged)
Q_PROPERTY(bool blocked READ isBlocked WRITE setBlocked NOTIFY blockedChanged)
Q_PROPERTY(bool legacyPairing READ hasLegacyPairing NOTIFY legacyPairingChanged)
Q_PROPERTY(qint16 rssi READ rssi NOTIFY rssiChanged)
Q_PROPERTY(bool connected READ isConnected NOTIFY connectedChanged)
Q_PROPERTY(QStringList uuids READ uuids NOTIFY uuidsChanged)
Q_PROPERTY(QString modalias READ modalias NOTIFY modaliasChanged)
Q_PROPERTY(DeclarativeInput *input READ input NOTIFY inputChanged)
Q_PROPERTY(DeclarativeMediaPlayer *mediaPlayer READ mediaPlayer NOTIFY mediaPlayerChanged)
Q_PROPERTY(DeclarativeAdapter *adapter READ adapter CONSTANT)
public:
explicit DeclarativeDevice(BluezQt::DevicePtr device, DeclarativeAdapter *adapter);
QString ubi() const;
QString address() const;
QString name() const;
void setName(const QString &name);
QString friendlyName() const;
QString remoteName() const;
quint32 deviceClass() const;
BluezQt::Device::Type type() const;
quint16 appearance() const;
QString icon() const;
bool isPaired() const;
bool isTrusted() const;
void setTrusted(bool trusted);
bool isBlocked() const;
void setBlocked(bool blocked);
bool hasLegacyPairing() const;
qint16 rssi() const;
bool isConnected() const;
QStringList uuids() const;
QString modalias() const;
// DeclarativeBattery *battery() const;
DeclarativeInput *input() const;
DeclarativeMediaPlayer *mediaPlayer() const;
DeclarativeAdapter *adapter() const;
public Q_SLOTS:
BluezQt::PendingCall *connectToDevice();
BluezQt::PendingCall *disconnectFromDevice();
BluezQt::PendingCall *connectProfile(const QString &uuid);
BluezQt::PendingCall *disconnectProfile(const QString &uuid);
BluezQt::PendingCall *pair();
BluezQt::PendingCall *cancelPairing();
Q_SIGNALS:
void deviceRemoved(DeclarativeDevice *device);
void deviceChanged(DeclarativeDevice *device);
void nameChanged(const QString &name);
void friendlyNameChanged(const QString &friendlyName);
void remoteNameChanged(const QString &remoteName);
void deviceClassChanged(quint32 deviceClass);
void typeChanged(BluezQt::Device::Type type);
void appearanceChanged(quint16 appearance);
void iconChanged(const QString &icon);
void pairedChanged(bool paired);
void trustedChanged(bool trusted);
void blockedChanged(bool blocked);
void legacyPairingChanged(bool legacyPairing);
void rssiChanged(qint16 rssi);
void connectedChanged(bool connected);
void uuidsChanged(const QStringList &uuids);
void modaliasChanged(const QString &modalias);
// void batteryChanged(DeclarativeBattery *battery);
void inputChanged(DeclarativeInput *input);
void mediaPlayerChanged(DeclarativeMediaPlayer *mediaPlayer);
private:
void updateBattery();
void updateInput();
void updateMediaPlayer();
BluezQt::DevicePtr m_device;
DeclarativeAdapter *m_adapter;
// DeclarativeBattery *m_battery;
DeclarativeInput *m_input;
DeclarativeMediaPlayer *m_mediaPlayer;
};
#endif // DECLARATIVEDEVICE_H

@ -0,0 +1,76 @@
/*
* BluezQt - Asynchronous Bluez wrapper library
*
* SPDX-FileCopyrightText: 2014 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "declarativedevicesmodel.h"
#include "declarativeadapter.h"
// #include "declarativebattery.h"
#include "declarativedevice.h"
#include "declarativemanager.h"
#include "declarativemediaplayer.h"
DeclarativeDevicesModel::DeclarativeDevicesModel(QObject *parent)
: QSortFilterProxyModel(parent)
, m_manager(nullptr)
, m_model(nullptr)
{
}
DeclarativeManager *DeclarativeDevicesModel::manager() const
{
return m_manager;
}
void DeclarativeDevicesModel::setManager(DeclarativeManager *manager)
{
m_manager = manager;
m_model = new BluezQt::DevicesModel(m_manager, this);
setSourceModel(m_model);
}
QHash<int, QByteArray> DeclarativeDevicesModel::roleNames() const
{
QHash<int, QByteArray> roles = QSortFilterProxyModel::roleNames();
roles[DeviceRole] = QByteArrayLiteral("Device");
roles[AdapterRole] = QByteArrayLiteral("Adapter");
roles[MediaPlayerRole] = QByteArrayLiteral("MediaPlayer");
// roles[BatteryRole] = QByteArrayLiteral("Battery");
return roles;
}
QVariant DeclarativeDevicesModel::data(const QModelIndex &index, int role) const
{
if (!m_model) {
return QSortFilterProxyModel::data(index, role);
}
BluezQt::DevicePtr dev = m_model->device(mapToSource(index));
if (!dev) {
return QSortFilterProxyModel::data(index, role);
}
switch (role) {
case DeviceRole:
return QVariant::fromValue(m_manager->declarativeDeviceFromPtr(dev));
case AdapterRole:
return QVariant::fromValue(m_manager->declarativeAdapterFromPtr(dev->adapter()));
case MediaPlayerRole:
if (DeclarativeDevice *device = m_manager->declarativeDeviceFromPtr(dev)) {
return QVariant::fromValue(device->mediaPlayer());
}
break;
// case BatteryRole:
// if (DeclarativeDevice *device = m_manager->declarativeDeviceFromPtr(dev)) {
// return QVariant::fromValue(device->battery());
// }
// break;
}
return QSortFilterProxyModel::data(index, role);
}

@ -0,0 +1,44 @@
/*
* BluezQt - Asynchronous Bluez wrapper library
*
* SPDX-FileCopyrightText: 2014 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#ifndef DECLARATIVEDEVICESMODEL_H
#define DECLARATIVEDEVICESMODEL_H
#include <QSortFilterProxyModel>
#include "declarativemanager.h"
#include <BluezQt/DevicesModel>
class DeclarativeDevicesModel : public QSortFilterProxyModel
{
Q_OBJECT
Q_PROPERTY(DeclarativeManager *manager READ manager WRITE setManager)
public:
enum DeclarativeDeviceRoles {
DeviceRole = BluezQt::DevicesModel::LastRole + 1,
AdapterRole = BluezQt::DevicesModel::LastRole + 2,
MediaPlayerRole = BluezQt::DevicesModel::LastRole + 3,
// BatteryRole = BluezQt::DevicesModel::LastRole + 4,
};
explicit DeclarativeDevicesModel(QObject *parent = nullptr);
DeclarativeManager *manager() const;
void setManager(DeclarativeManager *manager);
QHash<int, QByteArray> roleNames() const override;
QVariant data(const QModelIndex &index, int role) const override;
private:
DeclarativeManager *m_manager;
BluezQt::DevicesModel *m_model;
};
#endif // DECLARATIVEMANAGER_H

@ -0,0 +1,21 @@
/*
* BluezQt - Asynchronous BlueZ wrapper library
*
* SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "declarativeinput.h"
DeclarativeInput::DeclarativeInput(const BluezQt::InputPtr &input, QObject *parent)
: QObject(parent)
, m_input(input)
{
connect(m_input.data(), &BluezQt::Input::reconnectModeChanged, this, &DeclarativeInput::reconnectModeChanged);
}
BluezQt::Input::ReconnectMode DeclarativeInput::reconnectMode() const
{
return m_input->reconnectMode();
}

@ -0,0 +1,31 @@
/*
* BluezQt - Asynchronous BlueZ wrapper library
*
* SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#ifndef DECLARATIVEINPUT_H
#define DECLARATIVEINPUT_H
#include <BluezQt/Input>
class DeclarativeInput : public QObject
{
Q_OBJECT
Q_PROPERTY(BluezQt::Input::ReconnectMode reconnectMode READ reconnectMode NOTIFY reconnectModeChanged)
public:
explicit DeclarativeInput(const BluezQt::InputPtr &input, QObject *parent = nullptr);
BluezQt::Input::ReconnectMode reconnectMode() const;
Q_SIGNALS:
void reconnectModeChanged(BluezQt::Input::ReconnectMode mode);
private:
BluezQt::InputPtr m_input;
};
#endif // DECLARATIVEINPUT_H

@ -0,0 +1,174 @@
/*
* BluezQt - Asynchronous Bluez wrapper library
*
* SPDX-FileCopyrightText: 2014-2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "declarativemanager.h"
#include "declarativeadapter.h"
#include "declarativedevice.h"
#include <BluezQt/InitManagerJob>
#include <BluezQt/Adapter>
#include <BluezQt/Device>
static int adaptersCountFunction(QQmlListProperty<DeclarativeAdapter> *property)
{
Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
return manager->m_adapters.count();
}
static DeclarativeAdapter *adaptersAtFunction(QQmlListProperty<DeclarativeAdapter> *property, int index)
{
Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
return manager->m_adapters.values().at(index);
}
static int devicesCountFunction(QQmlListProperty<DeclarativeDevice> *property)
{
Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
return manager->m_devices.count();
}
static DeclarativeDevice *devicesAtFunction(QQmlListProperty<DeclarativeDevice> *property, int index)
{
Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
return manager->m_devices.values().at(index);
}
DeclarativeManager::DeclarativeManager(QObject *parent)
: BluezQt::Manager(parent)
{
BluezQt::InitManagerJob *job = init();
job->start();
connect(job, &BluezQt::InitManagerJob::result, this, &DeclarativeManager::initJobResult);
connect(this, &BluezQt::Manager::adapterAdded, this, &DeclarativeManager::slotAdapterAdded);
connect(this, &BluezQt::Manager::adapterRemoved, this, &DeclarativeManager::slotAdapterRemoved);
connect(this, &BluezQt::Manager::usableAdapterChanged, this, &DeclarativeManager::slotUsableAdapterChanged);
connect(this, &BluezQt::Manager::deviceAdded, this, &DeclarativeManager::slotDeviceAdded);
connect(this, &BluezQt::Manager::deviceRemoved, this, &DeclarativeManager::slotDeviceRemoved);
connect(this, &BluezQt::Manager::adapterChanged, this, [this](const BluezQt::AdapterPtr &adapter) {
Q_EMIT adapterChanged(declarativeAdapterFromPtr(adapter));
});
connect(this, &BluezQt::Manager::deviceChanged, this, [this](const BluezQt::DevicePtr &device) {
Q_EMIT deviceChanged(declarativeDeviceFromPtr(device));
});
}
DeclarativeAdapter *DeclarativeManager::usableAdapter() const
{
return declarativeAdapterFromPtr(BluezQt::Manager::usableAdapter());
}
QQmlListProperty<DeclarativeAdapter> DeclarativeManager::declarativeAdapters()
{
return QQmlListProperty<DeclarativeAdapter>(this, nullptr, adaptersCountFunction, adaptersAtFunction);
}
QQmlListProperty<DeclarativeDevice> DeclarativeManager::declarativeDevices()
{
return QQmlListProperty<DeclarativeDevice>(this, nullptr, devicesCountFunction, devicesAtFunction);
}
DeclarativeAdapter *DeclarativeManager::declarativeAdapterFromPtr(BluezQt::AdapterPtr ptr) const
{
if (!ptr) {
return nullptr;
}
return m_adapters.value(ptr->ubi());
}
DeclarativeDevice *DeclarativeManager::declarativeDeviceFromPtr(BluezQt::DevicePtr ptr) const
{
if (!ptr) {
return nullptr;
}
return m_devices.value(ptr->ubi());
}
DeclarativeAdapter *DeclarativeManager::adapterForAddress(const QString &address) const
{
return declarativeAdapterFromPtr(BluezQt::Manager::adapterForAddress(address));
}
DeclarativeAdapter *DeclarativeManager::adapterForUbi(const QString &ubi) const
{
return declarativeAdapterFromPtr(BluezQt::Manager::adapterForUbi(ubi));
}
DeclarativeDevice *DeclarativeManager::deviceForAddress(const QString &address) const
{
return declarativeDeviceFromPtr(BluezQt::Manager::deviceForAddress(address));
}
DeclarativeDevice *DeclarativeManager::deviceForUbi(const QString &ubi) const
{
return declarativeDeviceFromPtr(BluezQt::Manager::deviceForUbi(ubi));
}
void DeclarativeManager::initJobResult(BluezQt::InitManagerJob *job)
{
if (job->error()) {
Q_EMIT initError(job->errorText());
return;
}
Q_EMIT initFinished();
}
void DeclarativeManager::slotAdapterAdded(BluezQt::AdapterPtr adapter)
{
DeclarativeAdapter *dAdapter = new DeclarativeAdapter(adapter, this);
m_adapters[adapter->ubi()] = dAdapter;
Q_EMIT adapterAdded(dAdapter);
Q_EMIT adaptersChanged(declarativeAdapters());
}
void DeclarativeManager::slotAdapterRemoved(BluezQt::AdapterPtr adapter)
{
DeclarativeAdapter *dAdapter = m_adapters.take(adapter->ubi());
dAdapter->deleteLater();
Q_EMIT adapterRemoved(dAdapter);
Q_EMIT adaptersChanged(declarativeAdapters());
}
void DeclarativeManager::slotDeviceAdded(BluezQt::DevicePtr device)
{
DeclarativeAdapter *dAdapter = declarativeAdapterFromPtr(device->adapter());
DeclarativeDevice *dDevice = new DeclarativeDevice(device, dAdapter);
m_devices[device->ubi()] = dDevice;
dAdapter->m_devices[device->ubi()] = dDevice;
Q_EMIT deviceAdded(dDevice);
Q_EMIT devicesChanged(declarativeDevices());
}
void DeclarativeManager::slotDeviceRemoved(BluezQt::DevicePtr device)
{
DeclarativeDevice *dDevice = m_devices.take(device->ubi());
dDevice->adapter()->m_devices.take(device->ubi());
dDevice->deleteLater();
Q_EMIT deviceRemoved(dDevice);
Q_EMIT devicesChanged(declarativeDevices());
}
void DeclarativeManager::slotUsableAdapterChanged(BluezQt::AdapterPtr adapter)
{
Q_EMIT usableAdapterChanged(declarativeAdapterFromPtr(adapter));
}

@ -0,0 +1,70 @@
/*
* BluezQt - Asynchronous Bluez wrapper library
*
* SPDX-FileCopyrightText: 2014-2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#ifndef DECLARATIVEMANAGER_H
#define DECLARATIVEMANAGER_H
#include <QHash>
#include <QQmlListProperty>
#include <BluezQt/Manager>
class DeclarativeDevice;
class DeclarativeAdapter;
class DeclarativeManager : public BluezQt::Manager
{
Q_OBJECT
Q_PROPERTY(DeclarativeAdapter *usableAdapter READ usableAdapter NOTIFY usableAdapterChanged)
Q_PROPERTY(QQmlListProperty<DeclarativeAdapter> adapters READ declarativeAdapters NOTIFY adaptersChanged)
Q_PROPERTY(QQmlListProperty<DeclarativeDevice> devices READ declarativeDevices NOTIFY devicesChanged)
public:
explicit DeclarativeManager(QObject *parent = nullptr);
DeclarativeAdapter *usableAdapter() const;
QQmlListProperty<DeclarativeAdapter> declarativeAdapters();
QQmlListProperty<DeclarativeDevice> declarativeDevices();
DeclarativeAdapter *declarativeAdapterFromPtr(BluezQt::AdapterPtr ptr) const;
DeclarativeDevice *declarativeDeviceFromPtr(BluezQt::DevicePtr ptr) const;
QHash<QString, DeclarativeAdapter *> m_adapters;
QHash<QString, DeclarativeDevice *> m_devices;
public Q_SLOTS:
DeclarativeAdapter *adapterForAddress(const QString &address) const;
DeclarativeAdapter *adapterForUbi(const QString &ubi) const;
DeclarativeDevice *deviceForAddress(const QString &address) const;
DeclarativeDevice *deviceForUbi(const QString &ubi) const;
Q_SIGNALS:
void initFinished();
void initError(const QString &errorText);
void adapterAdded(DeclarativeAdapter *adapter);
void adapterRemoved(DeclarativeAdapter *adapter);
void adapterChanged(DeclarativeAdapter *adapter);
void deviceAdded(DeclarativeDevice *device);
void deviceRemoved(DeclarativeDevice *device);
void deviceChanged(DeclarativeDevice *device);
void usableAdapterChanged(DeclarativeAdapter *adapter);
void adaptersChanged(QQmlListProperty<DeclarativeAdapter> adapters);
void devicesChanged(QQmlListProperty<DeclarativeDevice> devices);
private Q_SLOTS:
void initJobResult(BluezQt::InitManagerJob *job);
void slotAdapterAdded(BluezQt::AdapterPtr adapter);
void slotAdapterRemoved(BluezQt::AdapterPtr adapter);
void slotDeviceAdded(BluezQt::DevicePtr device);
void slotDeviceRemoved(BluezQt::DevicePtr device);
void slotUsableAdapterChanged(BluezQt::AdapterPtr adapter);
};
#endif // DECLARATIVEMANAGER_H

@ -0,0 +1,125 @@
/*
* BluezQt - Asynchronous Bluez wrapper library
*
* SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "declarativemediaplayer.h"
DeclarativeMediaPlayer::DeclarativeMediaPlayer(BluezQt::MediaPlayerPtr mediaPlayer, QObject *parent)
: QObject(parent)
, m_mediaPlayer(mediaPlayer)
{
connect(m_mediaPlayer.data(), &BluezQt::MediaPlayer::nameChanged, this, &DeclarativeMediaPlayer::nameChanged);
connect(m_mediaPlayer.data(), &BluezQt::MediaPlayer::equalizerChanged, this, &DeclarativeMediaPlayer::equalizerChanged);
connect(m_mediaPlayer.data(), &BluezQt::MediaPlayer::repeatChanged, this, &DeclarativeMediaPlayer::repeatChanged);
connect(m_mediaPlayer.data(), &BluezQt::MediaPlayer::shuffleChanged, this, &DeclarativeMediaPlayer::shuffleChanged);
connect(m_mediaPlayer.data(), &BluezQt::MediaPlayer::statusChanged, this, &DeclarativeMediaPlayer::statusChanged);
connect(m_mediaPlayer.data(), &BluezQt::MediaPlayer::positionChanged, this, &DeclarativeMediaPlayer::positionChanged);
connect(m_mediaPlayer.data(), &BluezQt::MediaPlayer::trackChanged, this, [this]() {
updateTrack();
Q_EMIT trackChanged(m_track);
});
updateTrack();
}
QString DeclarativeMediaPlayer::name() const
{
return m_mediaPlayer->name();
}
BluezQt::MediaPlayer::Equalizer DeclarativeMediaPlayer::equalizer() const
{
return m_mediaPlayer->equalizer();
}
void DeclarativeMediaPlayer::setEqualizer(BluezQt::MediaPlayer::Equalizer equalizer)
{
m_mediaPlayer->setEqualizer(equalizer);
}
BluezQt::MediaPlayer::Repeat DeclarativeMediaPlayer::repeat() const
{
return m_mediaPlayer->repeat();
}
void DeclarativeMediaPlayer::setRepeat(BluezQt::MediaPlayer::Repeat repeat)
{
m_mediaPlayer->setRepeat(repeat);
}
BluezQt::MediaPlayer::Shuffle DeclarativeMediaPlayer::shuffle() const
{
return m_mediaPlayer->shuffle();
}
void DeclarativeMediaPlayer::setShuffle(BluezQt::MediaPlayer::Shuffle shuffle)
{
m_mediaPlayer->setShuffle(shuffle);
}
BluezQt::MediaPlayer::Status DeclarativeMediaPlayer::status() const
{
return m_mediaPlayer->status();
}
QJsonObject DeclarativeMediaPlayer::track() const
{
return m_track;
}
quint32 DeclarativeMediaPlayer::position() const
{
return m_mediaPlayer->position();
}
BluezQt::PendingCall *DeclarativeMediaPlayer::play()
{
return m_mediaPlayer->play();
}
BluezQt::PendingCall *DeclarativeMediaPlayer::pause()
{
return m_mediaPlayer->pause();
}
BluezQt::PendingCall *DeclarativeMediaPlayer::stop()
{
return m_mediaPlayer->stop();
}
BluezQt::PendingCall *DeclarativeMediaPlayer::next()
{
return m_mediaPlayer->next();
}
BluezQt::PendingCall *DeclarativeMediaPlayer::previous()
{
return m_mediaPlayer->previous();
}
BluezQt::PendingCall *DeclarativeMediaPlayer::fastForward()
{
return m_mediaPlayer->fastForward();
}
BluezQt::PendingCall *DeclarativeMediaPlayer::rewind()
{
return m_mediaPlayer->rewind();
}
void DeclarativeMediaPlayer::updateTrack()
{
m_track[QStringLiteral("valid")] = m_mediaPlayer->track().isValid();
m_track[QStringLiteral("title")] = m_mediaPlayer->track().title();
m_track[QStringLiteral("artist")] = m_mediaPlayer->track().artist();
m_track[QStringLiteral("album")] = m_mediaPlayer->track().album();
m_track[QStringLiteral("genre")] = m_mediaPlayer->track().genre();
m_track[QStringLiteral("numberOfTracks")] = qint64(m_mediaPlayer->track().numberOfTracks());
m_track[QStringLiteral("trackNumber")] = qint64(m_mediaPlayer->track().trackNumber());
m_track[QStringLiteral("duration")] = qint64(m_mediaPlayer->track().duration());
}

@ -0,0 +1,72 @@
/*
* BluezQt - Asynchronous Bluez wrapper library
*
* SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#ifndef DECLARATIVEMEDIAPLAYER_H
#define DECLARATIVEMEDIAPLAYER_H
#include <QJsonObject>
#include <BluezQt/MediaPlayer>
class DeclarativeMediaPlayer : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name NOTIFY nameChanged)
Q_PROPERTY(BluezQt::MediaPlayer::Equalizer equalizer READ equalizer WRITE setEqualizer NOTIFY equalizerChanged)
Q_PROPERTY(BluezQt::MediaPlayer::Repeat repeat READ repeat WRITE setRepeat NOTIFY repeatChanged)
Q_PROPERTY(BluezQt::MediaPlayer::Shuffle shuffle READ shuffle WRITE setShuffle NOTIFY shuffleChanged)
Q_PROPERTY(BluezQt::MediaPlayer::Status status READ status NOTIFY statusChanged)
Q_PROPERTY(QJsonObject track READ track NOTIFY trackChanged)
Q_PROPERTY(quint32 position READ position NOTIFY positionChanged)
public:
explicit DeclarativeMediaPlayer(BluezQt::MediaPlayerPtr mediaPlayer, QObject *parent = nullptr);
QString name() const;
BluezQt::MediaPlayer::Equalizer equalizer() const;
void setEqualizer(BluezQt::MediaPlayer::Equalizer equalizer);
BluezQt::MediaPlayer::Repeat repeat() const;
void setRepeat(BluezQt::MediaPlayer::Repeat repeat);
BluezQt::MediaPlayer::Shuffle shuffle() const;
void setShuffle(BluezQt::MediaPlayer::Shuffle shuffle);
BluezQt::MediaPlayer::Status status() const;
QJsonObject track() const;
quint32 position() const;
public Q_SLOTS:
BluezQt::PendingCall *play();
BluezQt::PendingCall *pause();
BluezQt::PendingCall *stop();
BluezQt::PendingCall *next();
BluezQt::PendingCall *previous();
BluezQt::PendingCall *fastForward();
BluezQt::PendingCall *rewind();
Q_SIGNALS:
void nameChanged(const QString &name);
void equalizerChanged(BluezQt::MediaPlayer::Equalizer equalizer);
void repeatChanged(BluezQt::MediaPlayer::Repeat repeat);
void shuffleChanged(BluezQt::MediaPlayer::Shuffle shuffle);
void statusChanged(BluezQt::MediaPlayer::Status status);
void trackChanged(const QJsonObject &track);
void positionChanged(quint32 position);
private:
void updateTrack();
BluezQt::MediaPlayerPtr m_mediaPlayer;
QJsonObject m_track;
};
#endif // DECLARATIVEMEDIAPLAYER_H

@ -0,0 +1,4 @@
module Cutefish.Bluez
plugin cutefishbluez_qmlplugins
DevicesModel 1.0 DevicesModel.qml

1
debian/control vendored

@ -8,6 +8,7 @@ Build-Depends: cmake,
libkf5networkmanagerqt-dev,
libkf5kio-dev,
libkf5screen-dev,
libkf5bluezqt-dev,
modemmanager-qt-dev,
libqt5sensors5-dev,
qtbase5-dev,

Loading…
Cancel
Save