diff options
| author | Andrew Branson <andrew.branson@cern.ch> | 2016-02-14 00:36:58 +0100 |
|---|---|---|
| committer | Andrew Branson <andrew.branson@cern.ch> | 2016-02-14 00:36:58 +0100 |
| commit | 1d4ff75fb86a32a38f2ea149f7a2042bdd0aeb53 (patch) | |
| tree | 39fa00b6de8db2c06e23227f05e5a26c67c2762c | |
| parent | 9df90e731612efe1cd9a69ae114f566c464e3e3a (diff) | |
Notifications with actions working.
| -rw-r--r-- | rockworkd/platformintegration/sailfish/sailfishplatform.cpp | 152 | ||||
| -rw-r--r-- | rockworkd/platformintegration/sailfish/sailfishplatform.h | 2 |
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; |
