diff options
author | Matt Ranostay <matt.ranostay@konsulko.com> | 2017-04-16 18:31:22 -0700 |
---|---|---|
committer | Matt Ranostay <matt.ranostay@konsulko.com> | 2017-04-18 11:53:26 -0700 |
commit | 1f14b62977b3deb285be13f4ede2449df76f24c1 (patch) | |
tree | d438b8ef94dd1e0b5f98c80ea63c9de8d0cd55ab /app/dbus.cpp | |
parent | ba7c74937dfbe12ab2ef2419c934a3fc6b51c711 (diff) |
bluetooth: populate data for existing avrcp/a2dp connection
Bluetooth connection could exist before mediaplayer application
is started. This patchset detects that and populates the initial
metadata, and track position + status.
AGL-Bug: SPEC-526
Change-Id: Ia0d60972c8eddd8642add708e9a4529c038e931f
Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Diffstat (limited to 'app/dbus.cpp')
-rw-r--r-- | app/dbus.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/app/dbus.cpp b/app/dbus.cpp index 4c307a7..0deb4ee 100644 --- a/app/dbus.cpp +++ b/app/dbus.cpp @@ -83,6 +83,9 @@ bool DbusService::enableBluetooth() if (!system_bus.isConnected()) return false; + if (deviceConnected(system_bus)) + initialBluetoothData(system_bus); + ret = system_bus.connect(QString("org.bluez"), QString("/"), interface, "InterfacesAdded", this, SLOT(newBluetoothDevice(QDBusObjectPath,QVariantMap))); if (!ret) @@ -108,6 +111,93 @@ bool DbusService::checkIfPlayer(const QString& path) const return false; } +bool DbusService::deviceConnected(const QDBusConnection& system_bus) +{ + QDBusInterface interface("org.bluez", "/", "org.freedesktop.DBus.ObjectManager", system_bus); + QDBusMessage result = interface.call("GetManagedObjects"); + const QDBusArgument argument = result.arguments().at(0).value<QDBusArgument>(); + bool ret = false; + + if (argument.currentType() != QDBusArgument::MapType) + return false; + + argument.beginMap(); + + while (!argument.atEnd()) { + QString key; + + argument.beginMapEntry(); + argument >> key; + argument.endMapEntry(); + + ret = checkIfPlayer(key); + + if (ret) { + newBluetoothDevice(QDBusObjectPath(key), QVariantMap()); + break; + } + } + + argument.endMap(); + + return ret; +} + +void DbusService::initialBluetoothData(const QDBusConnection& system_bus) +{ + QDBusInterface interface("org.bluez", getBluezPath(), "org.freedesktop.DBus.Properties", system_bus); + + QDBusMessage result = interface.call("GetAll", "org.bluez.MediaPlayer1"); + const QDBusArgument argument = result.arguments().at(0).value<QDBusArgument>(); + QString status, artist, title; + int position = 0, duration = 0; + + if (argument.currentType() != QDBusArgument::MapType) + return; + + argument.beginMap(); + + while (!argument.atEnd()) { + QString key; + QVariant value; + + argument.beginMapEntry(); + argument >> key >> value; + + if (key == "Position") { + position = value.toInt(); + } else if (key == "Status") { + status = value.toString(); + } else if (key == "Track") { + const QDBusArgument argument1 = qvariant_cast<QDBusArgument>(value); + QString key1; + QVariant value1; + + argument1.beginMap(); + + while (!argument1.atEnd()) { + argument1.beginMapEntry(); + argument1 >> key1 >> value1; + if (key1 == "Artist") + artist = value1.toString(); + else if (key1 == "Title") + title = value1.toString(); + else if (key1 == "Duration") + duration = value1.toInt(); + argument1.endMapEntry(); + } + argument1.endMap(); + } + argument.endMapEntry(); + } + argument.endMap(); + + emit processPlaylistHide(); + emit displayBluetoothMetadata(artist, title, duration); + emit updatePlayerStatus(status); + emit updatePosition(position); +} + void DbusService::newBluetoothDevice(const QDBusObjectPath& item, const QVariantMap&) { QString path = item.path(); |