summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2016-02-14 00:36:58 +0100
committerAndrew Branson <andrew.branson@cern.ch>2016-02-14 00:36:58 +0100
commit1d4ff75fb86a32a38f2ea149f7a2042bdd0aeb53 (patch)
tree39fa00b6de8db2c06e23227f05e5a26c67c2762c
parent9df90e731612efe1cd9a69ae114f566c464e3e3a (diff)
Notifications with actions working.
-rw-r--r--rockworkd/platformintegration/sailfish/sailfishplatform.cpp152
-rw-r--r--rockworkd/platformintegration/sailfish/sailfishplatform.h2
2 files changed, 109 insertions, 45 deletions
diff --git a/rockworkd/platformintegration/sailfish/sailfishplatform.cpp b/rockworkd/platformintegration/sailfish/sailfishplatform.cpp
index e31d65b..09e1426 100644
--- a/rockworkd/platformintegration/sailfish/sailfishplatform.cpp
+++ b/rockworkd/platformintegration/sailfish/sailfishplatform.cpp
@@ -77,56 +77,92 @@ QDBusInterface *SailfishPlatform::interface() const
uint SailfishPlatform::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)
{
- // Lets directly suppress volume change notifications, network password entries and phone call snap decisions here
- QStringList hiddenNotifications = {"indicator-sound", "indicator-network"};
- if (!hiddenNotifications.contains(app_name)) {
- if (hints.contains("x-canonical-secondary-icon") && hints.value("x-canonical-secondary-icon").toString() == "incoming-call") {
- qDebug() << "Have a phone call notification. Ignoring it..." << app_name << app_icon;
- } else {
- qDebug() << "Notification received" << app_name << replaces_id << app_icon << summary << body << actions << hints << expire_timeout;
- Notification n(app_name);
- if (app_name.contains("twitter")) {
- n.setType(Notification::NotificationTypeTwitter);
- n.setSourceName("Twitter");
- } else if (app_name.contains("dekko")) {
- n.setType(Notification::NotificationTypeEmail);
- n.setSourceName("EMail");
- } else if (app_name.toLower().contains("gmail")) {
- n.setType(Notification::NotificationTypeGMail);
- n.setSourceName("GMail");
- } else if (app_name.contains("facebook")) {
- n.setType(Notification::NotificationTypeFacebook);
- n.setSourceName("Facebook");
- } else if (app_name.toLower().contains("telegram") || app_name.toLower().contains("sailorgram")) {
- n.setType(Notification::NotificationTypeTelegram);
- n.setSourceName("Telegram");
- } else if (app_name.toLower().contains("hangish")) {
- n.setType(Notification::NotificationTypeHangout);
- n.setSourceName("Hangout");
- } else if (app_name.contains("indicator-datetime")) {
- n.setType(Notification::NotificationTypeReminder);
- n.setSourceName("reminders");
- } else {
- n.setType(Notification::NotificationTypeGeneric);
- }
- n.setSender(summary);
- n.setBody(body);
- foreach (const QString &action, actions) {
- if (action.contains(QRegExp("^[a-z]*://"))) {
- n.setActToken(action);
- break;
- }
- }
- qDebug() << "have act token" << n.actToken();
+ qDebug() << "Notification received" << app_name << replaces_id << app_icon << summary << body << actions << hints << expire_timeout;
+ QString owner = hints.value("x-nemo-owner", "").toString();
+
+ // Look up the notification category and its parameters
+ QString category = hints.value("category", "").toString();
+ QHash<QString, QString> categoryParams = this->getCategoryParams(category);
+
+ // Ignore transient and hidden notifications (notif hints override category hints)
+ // Hack this to accept transient -preview and -summary notifications, as we don't know how to decode the actual notifs yet
+ if (hints.value("transient", categoryParams.value("transient", "false")).toString() == "true") {
+ qDebug() << "Ignoring transient notification from " << owner;
+ return 0;
+ }
+ else if (hints.value("x-nemo-hidden", "false").toString() == "true" ) {
+ qDebug() << "Ignoring hidden notification from " << owner;
+ return 0;
+ }
- emit notificationReceived(n);
+ Notification n(app_name);
+ if (owner == "twitter-notifications-client") {
+ n.setType(Notification::NotificationTypeTwitter);
+ n.setSourceName("Twitter");
+ } else if (category == "x-nemo.email") {
+ if (app_name.toLower().contains("gmail")) {
+ n.setType(Notification::NotificationTypeGMail);
+ n.setSourceName("GMail");
+ }
+ else {
+ n.setType(Notification::NotificationTypeEmail);
+ n.setSubject(app_name);
+ }
+ } else if (owner == "facebook-notifications-client") {
+ n.setType(Notification::NotificationTypeFacebook);
+ n.setSourceName("Facebook");
+ } else if (hints.value("x-nemo-origin-package").toString() == "org.telegram.messenger"
+ || category.startsWith("harbour.sailorgram")) {
+ n.setType(Notification::NotificationTypeTelegram);
+ n.setSourceName("Telegram");
+ } else if (hints.value("x-nemo-origin-package").toString() == "com.google.android.apps.babel"
+ || owner == "harbour-hangish") {
+ n.setType(Notification::NotificationTypeHangout);
+ n.setSourceName("Hangouts");
+ } else if (hints.value("x-nemo-origin-package").toString() == "com.whatsapp"
+ || owner.toLower().contains("whatsup")) {
+ n.setType(Notification::NotificationTypeWhatsApp);
+ n.setSourceName("Whatsapp");
+ } else if (app_name.contains("indicator-datetime")) {
+ n.setType(Notification::NotificationTypeReminder);
+ n.setSourceName("reminders");
+ } else {
+ n.setType(Notification::NotificationTypeGeneric);
+ }
+ n.setSender(summary);
+ n.setBody(body);
+ foreach (const QString &action, actions) {
+ if (action == "default") {
+ n.setActToken(hints.value("x-nemo-remote-action-default").toString());
+ break;
}
}
+ qDebug() << "have act token" << n.actToken();
+
+ emit notificationReceived(n);
// We never return something. We're just snooping in...
setDelayedReply(true);
return 0;
}
+ QHash<QString, QString> SailfishPlatform::getCategoryParams(QString category)
+ {
+ if (!category.isEmpty()) {
+ QString categoryConfigFile = QString("/usr/share/lipstick/notificationcategories/%1.conf").arg(category);
+ QFile testFile(categoryConfigFile);
+ if (testFile.exists()) {
+ QHash<QString, QString> 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 QHash<QString, QString>();
+ }
+
void SailfishPlatform::sendMusicControlCommand(MusicControlButton controlButton)
{
QString method;
@@ -210,8 +246,36 @@ QList<CalendarEvent> SailfishPlatform::organizerItems() const
void SailfishPlatform::actionTriggered(const QString &actToken)
{
- Q_UNUSED(actToken);
- //url_dispatch_send(actToken.toStdString().c_str(), [] (const char *, boolean, pointer) {}, nullptr);
+ QVariantMap action;
+ // Extract the element of the DBus call
+ QStringList elements(actToken.split(' ', QString::SkipEmptyParts));
+ if (elements.size() <= 3) {
+ qWarning() << "Unable to decode invalid remote action:" << actToken;
+ } else {
+ int index = 0;
+ action.insert(QStringLiteral("service"), elements.at(index++));
+ action.insert(QStringLiteral("path"), elements.at(index++));
+ action.insert(QStringLiteral("iface"), elements.at(index++));
+ action.insert(QStringLiteral("method"), elements.at(index++));
+
+ if (index < elements.size()) {
+ QVariantList args;
+ while (index < elements.size()) {
+ const QString &arg(elements.at(index++));
+ const QByteArray buffer(QByteArray::fromBase64(arg.toUtf8()));
+
+ QDataStream stream(buffer);
+ QVariant var;
+ stream >> var;
+ args.append(var);
+ }
+ action.insert(QStringLiteral("arguments"), args);
+ }
+ qDebug() << "Calling: " << action;
+ QDBusMessage call = QDBusMessage::createMethodCall(action.value("service").toString(), action.value("path").toString(), action.value("iface").toString(), action.value("method").toString());
+ if (action.contains("arguments")) call.setArguments(action.value("arguments").toList());
+ QDBusConnection::sessionBus().call(call);
+ }
}
void SailfishPlatform::fetchMusicMetadata()
diff --git a/rockworkd/platformintegration/sailfish/sailfishplatform.h b/rockworkd/platformintegration/sailfish/sailfishplatform.h
index a95f433..dd4f56d 100644
--- a/rockworkd/platformintegration/sailfish/sailfishplatform.h
+++ b/rockworkd/platformintegration/sailfish/sailfishplatform.h
@@ -25,8 +25,8 @@ public:
void sendMusicControlCommand(MusicControlButton controlButton) override;
MusicMetaData musicMetaData() const override;
-
void hangupCall(uint cookie) override;
+ QHash<QString, QString> getCategoryParams(QString category);
QList<CalendarEvent> organizerItems() const override;