Sophie

Sophie

distrib > Mageia > 6 > armv7hl > media > core-updates-src > by-pkgid > 145ee51332341f6fb2068a2879ec1835 > files > 17

kdelibs4-4.14.35-1.mga6.src.rpm

diff --git a/solid/solid/CMakeLists.txt b/solid/solid/CMakeLists.txt
index a7f1f07..c2099dc 100644
--- a/solid/solid/CMakeLists.txt
+++ b/solid/solid/CMakeLists.txt
@@ -287,6 +287,15 @@ if(NOT WIN32 AND NOT APPLE)
    backends/upower/upowergenericinterface.cpp
    )
 
+   message(STATUS "Building Solid PhonePower backend." )
+   set(solid_LIB_SRCS ${solid_LIB_SRCS}
+   backends/phonepower/phonepowermanager.cpp
+   backends/phonepower/phonepowerdevice.cpp
+   backends/phonepower/phonepowerbattery.cpp
+   backends/phonepower/phonepowerdeviceinterface.cpp
+   backends/phonepower/kdeconnectinterface.cpp
+   )
+
    # FIXME: this should work on more Unix systems
    if (CMAKE_SYSTEM_NAME MATCHES Linux)
 
diff --git a/solid/solid/backends/phonepower/kdeconnectinterface.cpp b/solid/solid/backends/phonepower/kdeconnectinterface.cpp
new file mode 100644
index 0000000..8b7f519
--- /dev/null
+++ b/solid/solid/backends/phonepower/kdeconnectinterface.cpp
@@ -0,0 +1,28 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.7
+ * Command line was: qdbusxml2cpp -m -p daemoninterface /home/vaka/kde4/build/kdeconnect-kded/daemon/org.kde.kdeconnect.daemon.xml
+ *
+ * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ *
+ * This is an auto-generated file.
+ * This file may have been hand-edited. Look for HAND-EDIT comments
+ * before re-generating it.
+ */
+
+#include "kdeconnectinterface.h"
+
+/*
+ * Implementation of interface class OrgKdeKdeconnectDaemonInterface
+ */
+
+OrgKdeKdeconnectDaemonInterface::OrgKdeKdeconnectDaemonInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)
+    : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent)
+{
+}
+
+OrgKdeKdeconnectDaemonInterface::~OrgKdeKdeconnectDaemonInterface()
+{
+}
+
+
+#include "kdeconnectinterface.moc"
diff --git a/solid/solid/backends/phonepower/kdeconnectinterface.h b/solid/solid/backends/phonepower/kdeconnectinterface.h
new file mode 100644
index 0000000..e813c4c
--- /dev/null
+++ b/solid/solid/backends/phonepower/kdeconnectinterface.h
@@ -0,0 +1,77 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.7
+ * Command line was: qdbusxml2cpp -m -p daemoninterface /home/vaka/kde4/build/kdeconnect-kded/daemon/org.kde.kdeconnect.daemon.xml
+ *
+ * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ *
+ * This is an auto-generated file.
+ * Do not edit! All changes made to it will be lost.
+ */
+
+#ifndef DAEMONINTERFACE_H_1376408992
+#define DAEMONINTERFACE_H_1376408992
+
+#include <QtCore/QObject>
+#include <QtCore/QByteArray>
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVariant>
+#include <QtDBus/QtDBus>
+
+/*
+ * Proxy class for interface org.kde.kdeconnect.daemon
+ */
+class OrgKdeKdeconnectDaemonInterface: public QDBusAbstractInterface
+{
+    Q_OBJECT
+public:
+    static inline const char *staticInterfaceName()
+    { return "org.kde.kdeconnect.daemon"; }
+
+public:
+    OrgKdeKdeconnectDaemonInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0);
+
+    ~OrgKdeKdeconnectDaemonInterface();
+
+public Q_SLOTS: // METHODS
+    inline QDBusPendingReply<QStringList> devices()
+    {
+        QList<QVariant> argumentList;
+        return asyncCallWithArgumentList(QLatin1String("devices"), argumentList);
+    }
+
+    inline QDBusPendingReply<> forceOnNetworkChange()
+    {
+        QList<QVariant> argumentList;
+        return asyncCallWithArgumentList(QLatin1String("forceOnNetworkChange"), argumentList);
+    }
+
+    inline QDBusPendingReply<> setDiscoveryEnabled(bool b)
+    {
+        QList<QVariant> argumentList;
+        argumentList << QVariant::fromValue(b);
+        return asyncCallWithArgumentList(QLatin1String("setDiscoveryEnabled"), argumentList);
+    }
+
+    inline QDBusPendingReply<QStringList> visibleDevices()
+    {
+        QList<QVariant> argumentList;
+        return asyncCallWithArgumentList(QLatin1String("visibleDevices"), argumentList);
+    }
+
+Q_SIGNALS: // SIGNALS
+    void deviceAdded(const QString &id);
+    void deviceRemoved(const QString &id);
+    void deviceVisibilityChanged(const QString &id, bool isVisible);
+};
+
+namespace org {
+  namespace kde {
+    namespace kdeconnect {
+      typedef ::OrgKdeKdeconnectDaemonInterface daemon;
+    }
+  }
+}
+#endif
diff --git a/solid/solid/backends/phonepower/phonepowerbattery.cpp b/solid/solid/backends/phonepower/phonepowerbattery.cpp
new file mode 100644
index 0000000..c5c4d87
--- /dev/null
+++ b/solid/solid/backends/phonepower/phonepowerbattery.cpp
@@ -0,0 +1,98 @@
+/*
+    Copyright 2013 Albert Vaca <albertvaka@gmail.com>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) version 3, or any
+    later version accepted by the membership of KDE e.V. (or its
+    successor approved by the membership of KDE e.V.), which shall
+    act as a proxy defined in Section 6 of version 3 of the license.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "phonepowerbattery.h"
+
+#include <QDebug>
+
+using namespace Solid::Backends::PhonePower;
+
+Battery::Battery(PhonePowerDevice *device)
+    : DeviceInterface(device)
+    , m_chargePercent(0)
+    , m_chargeState(Solid::Battery::NoCharge)
+    , mDevice(device)
+{
+    connect(device, SIGNAL(changed()), this, SLOT(slotChanged()));
+}
+
+Battery::~Battery()
+{
+}
+
+bool Battery::isPlugged() const
+{
+    return true;
+}
+
+Solid::Battery::BatteryType Battery::type() const
+{
+    return Solid::Battery::PhoneBattery;
+}
+
+int Battery::chargePercent() const
+{
+    m_chargePercent = mDevice->chargePercent();
+    return m_chargePercent;
+}
+
+int Battery::capacity() const
+{
+    return 100;
+}
+
+bool Battery::isRechargeable() const
+{
+    return true;
+}
+
+bool Battery::isPowerSupply() const
+{
+    return false;
+}
+
+Solid::Battery::ChargeState Battery::chargeState() const
+{
+    m_chargeState = mDevice->chargeState();
+    return m_chargeState;
+}
+
+void Battery::slotChanged()
+{
+
+    if (!mDevice) {
+        return;
+    }
+
+    if (m_chargePercent != mDevice->chargePercent()) {
+        m_chargePercent = mDevice->chargePercent();
+        qDebug() << "Percentage has changed: " << m_chargePercent << mDevice->udi();
+        Q_EMIT chargePercentChanged(m_chargePercent, mDevice->udi());
+    }
+
+    if (m_chargeState != mDevice->chargeState()) {
+        m_chargeState = mDevice->chargeState();
+        qDebug() << "State has changed: " << m_chargeState << mDevice->udi();
+        Q_EMIT chargeStateChanged(m_chargeState, mDevice->udi());
+    }
+
+}
+
+#include "backends/phonepower/phonepowerbattery.moc"
diff --git a/solid/solid/backends/phonepower/phonepowerbattery.h b/solid/solid/backends/phonepower/phonepowerbattery.h
new file mode 100644
index 0000000..c279df5
--- /dev/null
+++ b/solid/solid/backends/phonepower/phonepowerbattery.h
@@ -0,0 +1,73 @@
+/*
+    Copyright 2013 Albert Vaca <albertvaka@gmail.com>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) version 3, or any
+    later version accepted by the membership of KDE e.V. (or its
+    successor approved by the membership of KDE e.V.), which shall
+    act as a proxy defined in Section 6 of version 3 of the license.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SOLID_BACKENDS_PHONEPOWER_BATTERY_H
+#define SOLID_BACKENDS_PHONEPOWER_BATTERY_H
+
+#include <solid/ifaces/battery.h>
+#include "phonepowerdevice.h"
+#include "phonepowerdeviceinterface.h"
+
+namespace Solid
+{
+namespace Backends
+{
+namespace PhonePower
+{
+class Battery : public DeviceInterface, virtual public Solid::Ifaces::Battery
+{
+    Q_OBJECT
+    Q_INTERFACES(Solid::Ifaces::Battery)
+
+public:
+    Battery(PhonePowerDevice *device);
+    virtual ~Battery();
+
+    virtual bool isPlugged() const;
+    virtual Solid::Battery::BatteryType type() const;
+
+    virtual int chargePercent() const;
+    virtual int capacity() const;
+
+    virtual bool isRechargeable() const;
+    virtual bool isPowerSupply() const;
+
+    virtual Solid::Battery::ChargeState chargeState() const;
+
+Q_SIGNALS:
+    void chargePercentChanged(int value, const QString &udi);
+    void capacityChanged(int value, const QString &udi);
+    void chargeStateChanged(int newState, const QString &udi);
+    void plugStateChanged(bool newState, const QString &udi);
+    void powerSupplyStateChanged(bool newState, const QString &udi);
+
+private Q_SLOTS:
+    void slotChanged();
+
+private:
+    mutable int m_chargePercent;
+    mutable Solid::Battery::ChargeState m_chargeState;
+    PhonePowerDevice *mDevice;
+};
+}
+}
+}
+
+#endif // SOLID_BACKENDS_PHONEPOWER_BATTERY_H
diff --git a/solid/solid/backends/phonepower/phonepowerdevice.cpp b/solid/solid/backends/phonepower/phonepowerdevice.cpp
new file mode 100644
index 0000000..8a15168
--- /dev/null
+++ b/solid/solid/backends/phonepower/phonepowerdevice.cpp
@@ -0,0 +1,141 @@
+/*
+    Copyright 2013 Albert Vaca <albertvaka@gmail.com>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) version 3, or any
+    later version accepted by the membership of KDE e.V. (or its
+    successor approved by the membership of KDE e.V.), which shall
+    act as a proxy defined in Section 6 of version 3 of the license.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "phonepowerdevice.h"
+#include "phonepowerdeviceinterface.h"
+#include "phonepowerbattery.h"
+
+#include <solid/genericinterface.h>
+#include <solid/device.h>
+
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <QtDBus/QDBusPendingReply>
+
+using namespace Solid::Backends::PhonePower;
+
+PhonePowerDevice::PhonePowerDevice(const QString &udi, const QString &id)
+    : Solid::Ifaces::Device()
+    , m_device("org.kde.kdeconnect",
+               "/modules/kdeconnect/devices/"+id,
+               "org.kde.kdeconnect.device",
+               QDBusConnection::sessionBus())
+    , m_battery("org.kde.kdeconnect",
+               "/modules/kdeconnect/devices/"+id,
+               "org.kde.kdeconnect.device.battery",
+               QDBusConnection::sessionBus())
+    , m_udi(udi)
+{
+    qDebug() << "/modules/kdeconnect/devices/"+id;
+
+    if (m_battery.isValid())
+        connect(&m_battery, SIGNAL(chargingChange()), this, SLOT(slotChanged()));
+}
+
+PhonePowerDevice::~PhonePowerDevice()
+{
+}
+
+QObject* PhonePowerDevice::createDeviceInterface(const Solid::DeviceInterface::Type& type)
+{
+    if (!queryDeviceInterface(type)) {
+        return 0;
+    }
+
+    DeviceInterface *iface = 0;
+    switch (type)
+    {
+    case Solid::DeviceInterface::Battery:
+        iface = new Battery(this);
+        break;
+    default:
+        break;
+    }
+    return iface;
+}
+
+bool PhonePowerDevice::queryDeviceInterface(const Solid::DeviceInterface::Type& type) const
+{
+    switch(type) {
+        case Solid::DeviceInterface::Battery:
+            return true;
+        default:
+            return false;
+    }
+}
+
+QStringList PhonePowerDevice::emblems() const
+{
+    return QStringList();
+}
+
+QString PhonePowerDevice::description() const
+{
+    return QObject::tr("%1 Battery", "%1 is battery technology").arg(batteryTechnology());
+}
+
+QString PhonePowerDevice::batteryTechnology() const
+{
+    return QLatin1String("Android");
+}
+
+QString PhonePowerDevice::icon() const
+{
+    return "pda";
+}
+
+QString PhonePowerDevice::product() const
+{
+    return m_device.property("name").toString();
+}
+
+QString PhonePowerDevice::vendor() const
+{
+    return QLatin1String("Android");
+}
+
+QString PhonePowerDevice::udi() const
+{
+    return m_udi;
+}
+
+QString PhonePowerDevice::parentUdi() const
+{
+    return QLatin1String("/org/kde/kdeconnect");
+}
+
+int PhonePowerDevice::chargePercent()
+{
+    return m_battery.property("charge").toInt();
+}
+
+Solid::Battery::ChargeState PhonePowerDevice::chargeState()
+{
+    bool charging = m_battery.property("isCharging").toBool();
+    if (charging) return Solid::Battery::Charging;
+    else return Solid::Battery::NoCharge;
+    //TODO: return Solid::Battery::Discharging;
+}
+
+void PhonePowerDevice::slotChanged()
+{
+    qDebug() << "charge information changed" << m_udi;
+    emit changed();
+}
\ No newline at end of file
diff --git a/solid/solid/backends/phonepower/phonepowerdevice.h b/solid/solid/backends/phonepower/phonepowerdevice.h
new file mode 100644
index 0000000..96e352e
--- /dev/null
+++ b/solid/solid/backends/phonepower/phonepowerdevice.h
@@ -0,0 +1,76 @@
+/*
+    Copyright 2013 Albert Vaca <albertvaka@gmail.com>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) version 3, or any
+    later version accepted by the membership of KDE e.V. (or its
+    successor approved by the membership of KDE e.V.), which shall
+    act as a proxy defined in Section 6 of version 3 of the license.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef PHONEPOWERDEVICE_H
+#define PHONEPOWERDEVICE_H
+
+#include <ifaces/device.h>
+#include <solid/deviceinterface.h>
+#include <battery.h>
+
+#include <QtDBus/QDBusInterface>
+#include <QtCore/QSet>
+
+namespace Solid
+{
+namespace Backends
+{
+namespace PhonePower
+{
+
+class PhonePowerDevice : public Solid::Ifaces::Device
+{
+    Q_OBJECT
+public:
+    PhonePowerDevice(const QString &udi, const QString &di);
+    virtual ~PhonePowerDevice();
+
+    virtual QObject* createDeviceInterface(const Solid::DeviceInterface::Type& type);
+    virtual bool queryDeviceInterface(const Solid::DeviceInterface::Type& type) const;
+    virtual QString description() const;
+    virtual QStringList emblems() const;
+    virtual QString icon() const;
+    virtual QString product() const;
+    virtual QString vendor() const;
+    virtual QString udi() const;
+    virtual QString parentUdi() const;
+    Solid::Battery::ChargeState chargeState();
+    int chargePercent();
+
+Q_SIGNALS:
+    void changed();
+
+private Q_SLOTS:
+    void slotChanged();
+
+private:
+    QString batteryTechnology() const;
+    mutable QDBusInterface m_device;
+    mutable QDBusInterface m_battery;
+    QString m_udi;
+
+};
+
+}
+}
+}
+
+#endif // PHONEPOWERDEVICE_H
diff --git a/solid/solid/backends/phonepower/phonepowerdeviceinterface.cpp b/solid/solid/backends/phonepower/phonepowerdeviceinterface.cpp
new file mode 100644
index 0000000..23ce11c
--- /dev/null
+++ b/solid/solid/backends/phonepower/phonepowerdeviceinterface.cpp
@@ -0,0 +1,33 @@
+/*
+    Copyright 2013 Albert Vaca <albertvaka@gmail.com>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) version 3, or any
+    later version accepted by the membership of KDE e.V. (or its
+    successor approved by the membership of KDE e.V.), which shall
+    act as a proxy defined in Section 6 of version 3 of the license.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "phonepowerdeviceinterface.h"
+
+using namespace Solid::Backends::PhonePower;
+
+DeviceInterface::DeviceInterface(PhonePowerDevice *device)
+    : QObject(device), m_device(device)
+{
+
+}
+
+DeviceInterface::~DeviceInterface()
+{
+}
diff --git a/solid/solid/backends/phonepower/phonepowerdeviceinterface.h b/solid/solid/backends/phonepower/phonepowerdeviceinterface.h
new file mode 100644
index 0000000..85bac01
--- /dev/null
+++ b/solid/solid/backends/phonepower/phonepowerdeviceinterface.h
@@ -0,0 +1,56 @@
+/*
+    Copyright 2013 Albert Vaca <albertvaka@gmail.com>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) version 3, or any
+    later version accepted by the membership of KDE e.V. (or its
+    successor approved by the membership of KDE e.V.), which shall
+    act as a proxy defined in Section 6 of version 3 of the license.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef PHONEPOWERDEVICEINTERFACE_H
+#define PHONEPOWERDEVICEINTERFACE_H
+
+#include <ifaces/deviceinterface.h>
+#include "phonepowerdevice.h"
+
+#include <QtCore/QObject>
+#include <QtCore/QStringList>
+#include <QtCore/QWeakPointer>
+
+namespace Solid
+{
+namespace Backends
+{
+namespace PhonePower
+{
+
+class DeviceInterface : public QObject, virtual public Solid::Ifaces::DeviceInterface
+{
+    Q_OBJECT
+    Q_INTERFACES(Solid::Ifaces::DeviceInterface)
+public:
+    DeviceInterface(PhonePowerDevice *device);
+    virtual ~DeviceInterface();
+
+protected:
+    QWeakPointer<PhonePowerDevice> m_device;
+
+};
+
+}
+}
+}
+
+#endif // PHONEPOWERDEVICEINTERFACE_H
diff --git a/solid/solid/backends/phonepower/phonepowermanager.cpp b/solid/solid/backends/phonepower/phonepowermanager.cpp
new file mode 100644
index 0000000..a0333d0
--- /dev/null
+++ b/solid/solid/backends/phonepower/phonepowermanager.cpp
@@ -0,0 +1,238 @@
+/*
+    Copyright 2013 Albert Vaca <albertvaka@gmail.com>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) version 3, or any
+    later version accepted by the membership of KDE e.V. (or its
+    successor approved by the membership of KDE e.V.), which shall
+    act as a proxy defined in Section 6 of version 3 of the license.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "phonepowermanager.h"
+#include "phonepowerdevice.h"
+
+#include <QtDBus/QDBusReply>
+#include <QtCore/QDebug>
+#include <QtDBus/QDBusMetaType>
+#include <QtDBus/QDBusConnectionInterface>
+#include <QDBusServiceWatcher>
+
+#include "../shared/rootdevice.h"
+
+using namespace Solid::Backends::PhonePower;
+using namespace Solid::Backends::Shared;
+
+PhonePowerManager::PhonePowerManager(QObject *parent)
+    : Solid::Ifaces::DeviceManager(parent)
+    , m_manager("org.kde.kdeconnect",
+                "/modules/kdeconnect",
+                QDBusConnection::sessionBus())
+    , m_ready(false)
+{
+    m_supportedInterfaces << Solid::DeviceInterface::Battery;
+
+
+    QDBusServiceWatcher* watcher = new QDBusServiceWatcher("org.kde.kdeconnect", QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, this);
+    connect(watcher, SIGNAL(serviceRegistered(QString)), this, SLOT(serviceReady()));
+    connect(watcher, SIGNAL(serviceUnregistered(QString)), this, SLOT(serviceUnregistered()));
+
+    QDBusPendingCall msg = m_manager.asyncCall("visibleDevices");
+    msg.waitForFinished();
+    if (msg.isValid()) {
+        serviceReady();
+    }
+
+}
+
+void PhonePowerManager::serviceReady()
+{
+
+    QDBusPendingReply<QStringList> pendingDeviceList = m_manager.visibleDevices();
+    pendingDeviceList.waitForFinished();
+    if (!pendingDeviceList.isValid() || pendingDeviceList.isError()) {
+        return;
+    }
+    QStringList deviceList = pendingDeviceList.value();
+
+    Q_FOREACH(const QString& device, deviceList) {
+        slotDeviceAdded(device);
+    }
+
+    connect(&m_manager, SIGNAL(deviceVisibilityChanged(QString, bool)),
+            this, SLOT(deviceVisibilityChanged(QString,bool)));
+
+    m_ready = true;
+}
+
+void PhonePowerManager::serviceUnregistered()
+{
+    m_ready = false;
+    Q_FOREACH(const QString& device, m_devices) {
+        slotDeviceRemoved(device);
+    }
+    m_devices.clear();
+
+    disconnect(&m_manager, SIGNAL(deviceVisibilityChanged(QString, bool)),
+            this, SLOT(deviceVisibilityChanged(QString,bool)));
+
+}
+
+void PhonePowerManager::deviceVisibilityChanged(const QString& id, bool visible)
+{
+    if (visible)
+        slotDeviceAdded(id);
+    else
+        slotDeviceRemoved(id);
+}
+
+PhonePowerManager::~PhonePowerManager()
+{
+
+}
+
+QObject* PhonePowerManager::createDevice(const QString& udi)
+{
+    if (!m_ready) return 0;
+
+    QString connectId = udi.mid(udiPrefix().count() + 1);
+    qDebug() << "createDevice" << udi << connectId;
+    if (udi == udiPrefix()) {
+
+        RootDevice *root = new RootDevice(udiPrefix());
+
+        root->setProduct(tr("Power Management"));
+        root->setDescription(tr("Batteries and other sources of power"));
+        root->setIcon("preferences-system-power-management");
+
+        return root;
+
+    } else if (m_devices.contains(connectId)) {
+        return new PhonePowerDevice(udi, connectId);
+    } else {
+        return 0;
+    }
+}
+
+QStringList PhonePowerManager::devicesFromQuery(const QString& parentUdi, Solid::DeviceInterface::Type type)
+{
+    if (!m_ready) {
+        return QStringList();
+    }
+
+    if (type != Solid::DeviceInterface::Battery)
+    {
+        return QStringList();
+    }
+
+    if (!parentUdi.isEmpty() && parentUdi != udiPrefix())
+    {
+        return QStringList();
+    }
+
+    return allDevices();
+
+}
+
+QStringList PhonePowerManager::allDevices()
+{
+    if (!m_ready) {
+        return QStringList();
+    }
+
+    QStringList udiList;
+    Q_FOREACH(const QString& device, m_devices) {
+        udiList.append(udiPrefix()+"/"+device);
+    }
+
+    return udiList;
+}
+
+QSet< Solid::DeviceInterface::Type > PhonePowerManager::supportedInterfaces() const
+{
+    return m_supportedInterfaces;
+}
+
+QString PhonePowerManager::udiPrefix() const
+{
+    return QLatin1String("/org/kde/kdeconnect");
+}
+
+void PhonePowerManager::slotDeviceAdded(const QString &id)
+{
+
+    qDebug() << "slotDeviceAdded" << id;
+
+    if (id.isEmpty() || m_devices.contains(id)) {
+        return;
+    }
+
+    //Test if device has battery support!
+    QDBusInterface* device = new QDBusInterface("org.kde.kdeconnect", "/modules/kdeconnect/devices/"+id, "org.kde.kdeconnect.device", QDBusConnection::sessionBus(), this);
+    QDBusPendingReply<bool> reply = device->asyncCallWithArgumentList("hasPlugin",QVariantList() << QVariant("kdeconnect_battery"));
+    reply.waitForFinished();
+    if (!reply.isValid()) {
+        return;
+    }
+
+    bool hasBattery = reply.value();
+
+    qDebug() << "HasBattery:" << hasBattery;
+
+    if (hasBattery) {
+        m_devices.insert(id);
+        Q_EMIT deviceAdded(udiPrefix()+"/"+id);
+        device->deleteLater();
+    } else {
+        connect(device, SIGNAL(pluginsChanged()),
+                this, SLOT(pluginsChanged()));
+    }
+
+}
+
+void PhonePowerManager::pluginsChanged()
+{
+    QDBusInterface* device = (QDBusInterface*)sender();
+
+    disconnect(device, SIGNAL(pluginsChanged()),
+               this, SLOT(pluginsChanged()));
+
+    QVariant id = device->property("id");
+    if (id.isValid()) {
+        qDebug() << "PluginsChanged" << id.toString();
+        QDBusInterface* device = new QDBusInterface("org.kde.kdeconnect", "/modules/kdeconnect/devices/"+id.toString(), "org.kde.kdeconnect.device", QDBusConnection::sessionBus(), this);
+        if (!device->isValid()) return;
+        QDBusPendingReply<bool> reply = device->asyncCallWithArgumentList("hasPlugin",QVariantList() << QVariant("kdeconnect_battery"));
+        reply.waitForFinished();
+        if (!reply.isValid() || !reply.value()) {
+            slotDeviceRemoved(id.toString());
+        } else {
+            slotDeviceAdded(id.toString());
+        }
+
+        //device->deleteLater();
+    }
+
+}
+
+void PhonePowerManager::slotDeviceRemoved(const QString &id)
+{
+    qDebug() << "slotDeviceRemoved" << id;
+    if (!m_devices.contains(id)) {
+        return;
+    }
+
+    m_devices.remove(id);
+    Q_EMIT deviceRemoved(id);
+}
+
+#include "backends/phonepower/phonepowermanager.moc"
diff --git a/solid/solid/backends/phonepower/phonepowermanager.h b/solid/solid/backends/phonepower/phonepowermanager.h
new file mode 100644
index 0000000..2722899
--- /dev/null
+++ b/solid/solid/backends/phonepower/phonepowermanager.h
@@ -0,0 +1,73 @@
+/*
+    Copyright 2013 Albert Vaca <albertvaka@gmail.com>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) version 3, or any
+    later version accepted by the membership of KDE e.V. (or its
+    successor approved by the membership of KDE e.V.), which shall
+    act as a proxy defined in Section 6 of version 3 of the license.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef PHONEPOWERMANAGER_H
+#define PHONEPOWERMANAGER_H
+
+#include "solid/ifaces/devicemanager.h"
+
+#include <QtDBus/QDBusInterface>
+#include <QtCore/QSet>
+
+#include "kdeconnectinterface.h"
+
+namespace Solid
+{
+namespace Backends
+{
+namespace PhonePower
+{
+
+class PhonePowerDevice;
+
+class PhonePowerManager : public Solid::Ifaces::DeviceManager
+{
+    Q_OBJECT
+
+public:
+    PhonePowerManager(QObject *parent);
+    virtual ~PhonePowerManager();
+    virtual QObject* createDevice(const QString& udi);
+    virtual QStringList devicesFromQuery(const QString& parentUdi, Solid::DeviceInterface::Type type);
+    virtual QStringList allDevices();
+    virtual QSet< Solid::DeviceInterface::Type > supportedInterfaces() const;
+    virtual QString udiPrefix() const;
+
+private Q_SLOTS:
+    void serviceReady();
+    void serviceUnregistered();
+    void deviceVisibilityChanged(const QString& id ,bool visible);
+    void slotDeviceAdded(const QString &opath);
+    void slotDeviceRemoved(const QString &opath);
+    void pluginsChanged();
+
+private:
+    QSet<Solid::DeviceInterface::Type> m_supportedInterfaces;
+    QSet<QString> m_devices;
+    OrgKdeKdeconnectDaemonInterface m_manager;
+    bool m_ready;
+
+};
+
+}
+}
+}
+#endif // PHONEPOWERMANAGER_H
diff --git a/solid/solid/managerbase.cpp b/solid/solid/managerbase.cpp
index 6649972..96d66ac 100644
--- a/solid/solid/managerbase.cpp
+++ b/solid/solid/managerbase.cpp
@@ -47,6 +47,7 @@
 #endif
 
 #include "backends/fstab/fstabmanager.h"
+#include "backends/phonepower/phonepowermanager.h"
 
 #elif defined (Q_WS_WIN) && !defined(_WIN32_WCE)
 #include "backends/win/windevicemanager.h"
@@ -99,6 +100,7 @@ void Solid::ManagerBasePrivate::loadBackends()
                            << new Solid::Backends::UPower::UPowerManager(0)
                            << new Solid::Backends::Fstab::FstabManager(0);
             }
+            m_backends << new Solid::Backends::PhonePower::PhonePowerManager(0);
 #        endif
 
 #        if defined (HUPNP_FOUND)