Add actions to notifications
Summary: When Android sends a list of possible actions add them to the notification. When the action is triggered send a package containing the id and the action back CCBUG: 366475 Test Plan: Send dummy notification, see the actions, trigger it, look for received package on Android Reviewers: #kde_connect, apol Reviewed By: #kde_connect, apol Subscribers: apol, kdeconnect, broulik, mtijink, #kde_connect Tags: #kde_connect Differential Revision: https://phabricator.kde.org/D12293
This commit is contained in:
parent
e14b3dde32
commit
957975898b
6 changed files with 38 additions and 2 deletions
|
@ -122,7 +122,8 @@
|
||||||
},
|
},
|
||||||
"X-KdeConnect-OutgoingPacketType": [
|
"X-KdeConnect-OutgoingPacketType": [
|
||||||
"kdeconnect.notification.request",
|
"kdeconnect.notification.request",
|
||||||
"kdeconnect.notification.reply"
|
"kdeconnect.notification.reply",
|
||||||
|
"kdeconnect.notification.action"
|
||||||
],
|
],
|
||||||
"X-KdeConnect-SupportedPacketType": [
|
"X-KdeConnect-SupportedPacketType": [
|
||||||
"kdeconnect.notification"
|
"kdeconnect.notification"
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "notification_debug.h"
|
#include "notification_debug.h"
|
||||||
|
|
||||||
#include <KNotification>
|
#include <KNotification>
|
||||||
|
#include <QtGlobal>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
@ -29,6 +30,8 @@
|
||||||
#include <KLocalizedString>
|
#include <KLocalizedString>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
|
||||||
|
#include <QJsonArray>
|
||||||
|
|
||||||
#include <core/filetransferjob.h>
|
#include <core/filetransferjob.h>
|
||||||
|
|
||||||
QMap<QString, FileTransferJob*> Notification::s_downloadsInProgress;
|
QMap<QString, FileTransferJob*> Notification::s_downloadsInProgress;
|
||||||
|
@ -104,6 +107,15 @@ KNotification* Notification::createKNotification(const NetworkPacket& np)
|
||||||
m_notification->setText(escapedTitle+": "+escapedText);
|
m_notification->setText(escapedTitle+": "+escapedText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(m_notification, QOverload<unsigned int>::of(&KNotification::activated), this, [this] (unsigned int actionIndex) {
|
||||||
|
// Do nothing for our own reply action
|
||||||
|
if(!m_requestReplyId.isEmpty() && actionIndex == 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Notification action idices start at 1
|
||||||
|
Q_EMIT actionTriggered(m_internalId, m_actions[actionIndex - 1]);
|
||||||
|
});
|
||||||
|
|
||||||
m_hasIcon = m_hasIcon && !m_payloadHash.isEmpty();
|
m_hasIcon = m_hasIcon && !m_payloadHash.isEmpty();
|
||||||
|
|
||||||
if (!m_hasIcon) {
|
if (!m_hasIcon) {
|
||||||
|
@ -115,9 +127,10 @@ KNotification* Notification::createKNotification(const NetworkPacket& np)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_requestReplyId.isEmpty()) {
|
if (!m_requestReplyId.isEmpty()) {
|
||||||
m_notification->setActions(QStringList(i18n("Reply")));
|
m_actions.prepend(i18n("Reply"));
|
||||||
connect(m_notification, &KNotification::action1Activated, this, &Notification::reply);
|
connect(m_notification, &KNotification::action1Activated, this, &Notification::reply);
|
||||||
}
|
}
|
||||||
|
m_notification->setActions(m_actions);
|
||||||
|
|
||||||
return m_notification;
|
return m_notification;
|
||||||
}
|
}
|
||||||
|
@ -179,4 +192,11 @@ void Notification::parseNetworkPacket(const NetworkPacket& np)
|
||||||
m_silent = np.get<bool>(QStringLiteral("silent"));
|
m_silent = np.get<bool>(QStringLiteral("silent"));
|
||||||
m_payloadHash = np.get<QString>(QStringLiteral("payloadHash"));
|
m_payloadHash = np.get<QString>(QStringLiteral("payloadHash"));
|
||||||
m_requestReplyId = np.get<QString>(QStringLiteral("requestReplyId"), QString());
|
m_requestReplyId = np.get<QString>(QStringLiteral("requestReplyId"), QString());
|
||||||
|
|
||||||
|
m_actions.clear();
|
||||||
|
|
||||||
|
for (QJsonValue value : np.get<QJsonArray>(QStringLiteral("actions"))) {
|
||||||
|
m_actions.append(value.toString());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,6 +72,7 @@ public Q_SLOTS:
|
||||||
void dismissRequested(const QString& m_internalId);
|
void dismissRequested(const QString& m_internalId);
|
||||||
void replyRequested();
|
void replyRequested();
|
||||||
Q_SCRIPTABLE void ready();
|
Q_SCRIPTABLE void ready();
|
||||||
|
void actionTriggered(const QString& key, const QString& action);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_internalId;
|
QString m_internalId;
|
||||||
|
@ -88,6 +89,7 @@ private:
|
||||||
bool m_silent;
|
bool m_silent;
|
||||||
QString m_payloadHash;
|
QString m_payloadHash;
|
||||||
bool m_ready;
|
bool m_ready;
|
||||||
|
QStringList m_actions;
|
||||||
|
|
||||||
void parseNetworkPacket(const NetworkPacket& np);
|
void parseNetworkPacket(const NetworkPacket& np);
|
||||||
void loadIcon(const NetworkPacket& np);
|
void loadIcon(const NetworkPacket& np);
|
||||||
|
|
|
@ -113,6 +113,8 @@ void NotificationsDbusInterface::addNotification(Notification* noti)
|
||||||
replyRequested(noti);
|
replyRequested(noti);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(noti, &Notification::actionTriggered, this, &NotificationsDbusInterface::sendAction);
|
||||||
|
|
||||||
const QString& publicId = newId();
|
const QString& publicId = newId();
|
||||||
m_notifications[publicId] = noti;
|
m_notifications[publicId] = noti;
|
||||||
m_internalIdToPublicId[internalId] = publicId;
|
m_internalIdToPublicId[internalId] = publicId;
|
||||||
|
@ -177,6 +179,14 @@ void NotificationsDbusInterface::sendReply(const QString& replyId, const QString
|
||||||
m_plugin->sendPacket(np);
|
m_plugin->sendPacket(np);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NotificationsDbusInterface::sendAction(const QString& key, const QString& action)
|
||||||
|
{
|
||||||
|
NetworkPacket np(PACKET_TYPE_NOTIFICATION_ACTION);
|
||||||
|
np.set<QString>("key", key);
|
||||||
|
np.set<QString>("action", action);
|
||||||
|
m_plugin->sendPacket(np);
|
||||||
|
}
|
||||||
|
|
||||||
QString NotificationsDbusInterface::newId()
|
QString NotificationsDbusInterface::newId()
|
||||||
{
|
{
|
||||||
return QString::number(++m_lastId);
|
return QString::number(++m_lastId);
|
||||||
|
|
|
@ -52,6 +52,7 @@ public:
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
Q_SCRIPTABLE QStringList activeNotifications();
|
Q_SCRIPTABLE QStringList activeNotifications();
|
||||||
Q_SCRIPTABLE void sendReply(const QString& replyId, const QString& message);
|
Q_SCRIPTABLE void sendReply(const QString& replyId, const QString& message);
|
||||||
|
Q_SCRIPTABLE void sendAction(const QString& key, const QString& action);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
Q_SCRIPTABLE void notificationPosted(const QString& publicId);
|
Q_SCRIPTABLE void notificationPosted(const QString& publicId);
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
|
|
||||||
#define PACKET_TYPE_NOTIFICATION_REQUEST QStringLiteral("kdeconnect.notification.request")
|
#define PACKET_TYPE_NOTIFICATION_REQUEST QStringLiteral("kdeconnect.notification.request")
|
||||||
#define PACKET_TYPE_NOTIFICATION_REPLY QStringLiteral("kdeconnect.notification.reply")
|
#define PACKET_TYPE_NOTIFICATION_REPLY QStringLiteral("kdeconnect.notification.reply")
|
||||||
|
#define PACKET_TYPE_NOTIFICATION_ACTION QStringLiteral("kdeconnect.notification.action")
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This class is just a proxy for NotificationsDbusInterface
|
* This class is just a proxy for NotificationsDbusInterface
|
||||||
|
|
Loading…
Reference in a new issue