diff options
| author | Tomasz Sterna <tomek@xiaoka.com> | 2014-07-14 16:49:27 +0200 |
|---|---|---|
| committer | Tomasz Sterna <tomek@xiaoka.com> | 2014-07-14 16:49:27 +0200 |
| commit | c358544734ae26770e91d56a92dcd8e22da71be5 (patch) | |
| tree | 8227bed64b6cbd7088102c762285e64a30418d56 /daemon/notificationmanager.cpp | |
| parent | 9160f139d399bce61c67a4ebc31dfdf1cc5d3e62 (diff) | |
| parent | c911932934f0a7d8bf1c252be4a3e718859b3b09 (diff) | |
Merge branch 'notifications' of github.com:smurfy/pebble into smurfy-notifications
Conflicts:
daemon/daemon.pro
daemon/manager.cpp
daemon/manager.h
Diffstat (limited to 'daemon/notificationmanager.cpp')
| -rw-r--r-- | daemon/notificationmanager.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/daemon/notificationmanager.cpp b/daemon/notificationmanager.cpp new file mode 100644 index 0000000..917a245 --- /dev/null +++ b/daemon/notificationmanager.cpp @@ -0,0 +1,162 @@ +#include "notificationmanager.h" + +#include <QDebug> +#include <QTimer> +#include <QFile> +#include <QSettings> +#include <QDBusInterface> +#include <QDBusPendingReply> + +class NotificationManagerPrivate +{ + Q_DECLARE_PUBLIC(NotificationManager) + +public: + NotificationManagerPrivate(NotificationManager *q) + : q_ptr(q), + interface(NULL), + connected(false) + { /*...*/ } + + NotificationManager *q_ptr; + + QDBusInterface *interface; + + bool connected; +}; + +NotificationManager::NotificationManager(QObject *parent) + : QObject(parent), d_ptr(new NotificationManagerPrivate(this)) +{ + Q_D(NotificationManager); + QDBusConnection::sessionBus().registerObject("/org/freedesktop/Notifications", this, QDBusConnection::ExportAllSlots); + + d->interface = new QDBusInterface("org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus"); + + d->interface->call("AddMatch", "interface='org.freedesktop.Notifications',member='Notify',type='method_call',eavesdrop='true'"); + + this->initialize(); +} + +NotificationManager::~NotificationManager() +{ + Q_D(NotificationManager); + delete d; +} + + +void NotificationManager::initialize(bool notifyError) +{ + Q_D(NotificationManager); + bool success = false; + + if(d->interface->isValid()) + { + success = true; + } + + if(!(d->connected = success)) + { + QTimer::singleShot(2000, this, SLOT(initialize())); + if(notifyError) emit this->error("Failed to connect to Notifications D-Bus service."); + } +} + +QDBusInterface* NotificationManager::interface() const +{ + Q_D(const NotificationManager); + return d->interface; +} + +QString NotificationManager::getCleanAppName(QString app_name) +{ + QString desktopFile = QString("/usr/share/applications/%1.desktop").arg(app_name); + QFile testFile(desktopFile); + if (testFile.exists()) { + QSettings settings(desktopFile, QSettings::IniFormat); + settings.beginGroup("Desktop Entry"); + QString cleanName = settings.value("Name").toString(); + settings.endGroup(); + if (!cleanName.isEmpty()) { + return cleanName; + } + } + return app_name; +} + +QStringHash NotificationManager::getCategoryParams(QString category) +{ + if (!category.isEmpty()) { + QString categoryConfigFile = QString("/usr/share/lipstick/notificationcategories/%1.conf").arg(category); + QFile testFile(categoryConfigFile); + if (testFile.exists()) { + QStringHash categories; + QSettings settings(categoryConfigFile, QSettings::IniFormat); + const QStringList settingKeys = settings.allKeys(); + foreach (const QString &settingKey, settingKeys) { + categories[settingKey] = settings.value(settingKey).toString(); + } + return categories; + } + } + return QStringHash(); +} + +void NotificationManager::Notify(const QString &app_name, uint replaces_id, const QString &app_icon, const QString &summary, const QString &body, const QStringList &actions, const QVariantHash &hints, int expire_timeout) { + + //Ignore notifcations from myself + if (app_name == "pebbled") { + return; + } + + logger()->debug() << Q_FUNC_INFO << "Got notification via dbus from" << this->getCleanAppName(app_name); + + if (app_name == "messageserver5") { + emit this->emailNotify(hints.value("x-nemo-preview-summary", this->getCleanAppName(app_name)).toString(), + hints.value("x-nemo-preview-body", "default").toString(), + "" + ); + } else if (app_name == "commhistoryd") { + if (summary == "" && body == "") { + emit this->smsNotify(hints.value("x-nemo-preview-summary", "default").toString(), + hints.value("x-nemo-preview-body", "default").toString() + ); + } + } else if (app_name == "harbour-mitakuuluu2-server") { + emit this->smsNotify(hints.value("x-nemo-preview-body", "default").toString(), + hints.value("x-nemo-preview-summary", "default").toString() + ); + } else { + //Prioritize x-nemo-preview* over dbus direct summary and body + QString subject = hints.value("x-nemo-preview-summary", "").toString(); + QString data = hints.value("x-nemo-preview-body", "").toString(); + QString category = hints.value("category", "").toString(); + QStringHash categoryParams = this->getCategoryParams(category); + int prio = categoryParams.value("x-nemo-priority", "0").toInt(); + + logger()->debug() << "MSG Prio:" << prio; + + if (subject.isEmpty()) { + subject = summary; + } + if (data.isEmpty()) { + data = body; + } + + //Prioritize data over subject + if (data.isEmpty() && !subject.isEmpty()) { + data = subject; + subject = ""; + } + + //Never send empty data and subject + if (data.isEmpty() && subject.isEmpty()) { + logger()->warn() << Q_FUNC_INFO << "Empty subject and data in dbus app " << app_name; + return; + } + + emit this->emailNotify(this->getCleanAppName(app_name), data, subject); + } +} |
