Merge PR #484: Remove cloud push notifications
This commit is contained in:
commit
b5e1228173
@ -45,7 +45,6 @@
|
|||||||
|
|
||||||
AWSConnector::AWSConnector(QObject *parent) : QObject(parent)
|
AWSConnector::AWSConnector(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
qRegisterMetaType<AWSConnector::PushNotificationsEndpoint>();
|
|
||||||
m_clientName = readSyncedNameCache();
|
m_clientName = readSyncedNameCache();
|
||||||
|
|
||||||
m_reconnectTimer.setSingleShot(true);
|
m_reconnectTimer.setSingleShot(true);
|
||||||
@ -217,29 +216,10 @@ void AWSConnector::onPairingsRetrieved(const QVariantMap &pairings)
|
|||||||
}
|
}
|
||||||
|
|
||||||
qCDebug(dcAWS) << pairings.value("users").toList().count() << "devices paired in cloud.";
|
qCDebug(dcAWS) << pairings.value("users").toList().count() << "devices paired in cloud.";
|
||||||
qCDebug(dcAWS) << pairings.value("pushNotificationsEndpoints").toList().count() << "push notification enabled users paired in cloud.";
|
|
||||||
QList<PushNotificationsEndpoint> pushNotificationEndpoints;
|
|
||||||
if (pairings.value("pushNotificationsEndpoints").toList().count() > 0) {
|
|
||||||
foreach (const QVariant &pairing, pairings.value("pushNotificationsEndpoints").toList()) {
|
|
||||||
foreach (const QString &cognitoUserId, pairing.toMap().keys()) {
|
|
||||||
qCDebug(dcAWS()) << "User:" << cognitoUserId << "has" << pairing.toMap().value(cognitoUserId).toList().count() << "push notifications enabled devices.";
|
|
||||||
foreach (const QVariant &endpoint, pairing.toMap().value(cognitoUserId).toList()) {
|
|
||||||
PushNotificationsEndpoint ep;
|
|
||||||
ep.userId = cognitoUserId;
|
|
||||||
ep.endpointId = endpoint.toMap().value("endpointId").toString();
|
|
||||||
ep.displayName = endpoint.toMap().value("displayName").toString();
|
|
||||||
pushNotificationEndpoints.append(ep);
|
|
||||||
qCDebug(dcAWS) << "Device:" << ep.displayName << "endpoint:" << ep.endpointId << "user:" << ep.userId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (readSyncedNameCache() != m_clientName) {
|
if (readSyncedNameCache() != m_clientName) {
|
||||||
setName();
|
setName();
|
||||||
}
|
}
|
||||||
|
|
||||||
emit pushNotificationEndpointsUpdated(pushNotificationEndpoints);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AWSConnector::disconnectAWS()
|
void AWSConnector::disconnectAWS()
|
||||||
@ -278,18 +258,6 @@ void AWSConnector::pairDevice(const QString &idToken, const QString &userId)
|
|||||||
m_pairingRequests.insert(m_transactionId, userId);
|
m_pairingRequests.insert(m_transactionId, userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
int AWSConnector::sendPushNotification(const QString &userId, const QString &endpointId, const QString &title, const QString &text)
|
|
||||||
{
|
|
||||||
QVariantMap params;
|
|
||||||
params.insert("id", ++m_transactionId);
|
|
||||||
params.insert("command", "sendPushNotification");
|
|
||||||
params.insert("title", title);
|
|
||||||
params.insert("body", text);
|
|
||||||
params.insert("timestamp", QDateTime::currentMSecsSinceEpoch());
|
|
||||||
publish(QString("%1/notify/user/%2/%3").arg(m_clientId, userId, endpointId), params);
|
|
||||||
return m_transactionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
quint16 AWSConnector::publish(const QString &topic, const QVariantMap &message)
|
quint16 AWSConnector::publish(const QString &topic, const QVariantMap &message)
|
||||||
{
|
{
|
||||||
if (!m_setupInProgress && !isConnected()) {
|
if (!m_setupInProgress && !isConnected()) {
|
||||||
@ -471,20 +439,6 @@ void AWSConnector::onPublishReceived(const QString &topic, const QByteArray &pay
|
|||||||
}
|
}
|
||||||
qCDebug(dcAWS) << "Proxy remote connection request received";
|
qCDebug(dcAWS) << "Proxy remote connection request received";
|
||||||
proxyConnectionRequestReceived(token, nonce, serverUrl);
|
proxyConnectionRequestReceived(token, nonce, serverUrl);
|
||||||
} else if (topic == QString("%1/notify/response").arg(m_clientId)) {
|
|
||||||
int transactionId = jsonDoc.toVariant().toMap().value("id").toInt();
|
|
||||||
int status = jsonDoc.toVariant().toMap().value("status").toInt();
|
|
||||||
qCDebug(dcAWS()) << "Push notification reply for transaction" << transactionId << " Status:" << status << jsonDoc.toVariant().toMap().value("message").toString();
|
|
||||||
emit pushNotificationSent(transactionId, status);
|
|
||||||
} else if (topic == QString("%1/notify/info/endpoint").arg(m_clientId)) {
|
|
||||||
QVariantMap endpoint = jsonDoc.toVariant().toMap().value("newPushNotificationsEndpoint").toMap();
|
|
||||||
Q_ASSERT(endpoint.keys().count() == 1);
|
|
||||||
QString cognitoId = endpoint.keys().first();
|
|
||||||
PushNotificationsEndpoint ep;
|
|
||||||
ep.userId = cognitoId;
|
|
||||||
ep.endpointId = endpoint.value(cognitoId).toMap().value("endpointId").toString();
|
|
||||||
ep.displayName = endpoint.value(cognitoId).toMap().value("displayName").toString();
|
|
||||||
emit pushNotificationEndpointAdded(ep);
|
|
||||||
} else {
|
} else {
|
||||||
qCWarning(dcAWS()) << "Unhandled subscription received!" << topic << payload;
|
qCWarning(dcAWS()) << "Unhandled subscription received!" << topic << payload;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,13 +45,6 @@ public:
|
|||||||
explicit AWSConnector(QObject *parent = nullptr);
|
explicit AWSConnector(QObject *parent = nullptr);
|
||||||
~AWSConnector();
|
~AWSConnector();
|
||||||
|
|
||||||
class PushNotificationsEndpoint {
|
|
||||||
public:
|
|
||||||
QString userId;
|
|
||||||
QString endpointId;
|
|
||||||
QString displayName;
|
|
||||||
};
|
|
||||||
|
|
||||||
void connect2AWS(const QString &endpoint, const QString &clientId, const QString &clientName, const QString &caFile, const QString &clientCertFile, const QString &clientPrivKeyFile);
|
void connect2AWS(const QString &endpoint, const QString &clientId, const QString &clientName, const QString &caFile, const QString &clientCertFile, const QString &clientPrivKeyFile);
|
||||||
void disconnectAWS();
|
void disconnectAWS();
|
||||||
bool isConnected() const;
|
bool isConnected() const;
|
||||||
@ -59,16 +52,10 @@ public:
|
|||||||
void setDeviceName(const QString &deviceName);
|
void setDeviceName(const QString &deviceName);
|
||||||
void pairDevice(const QString &idToken, const QString &userId);
|
void pairDevice(const QString &idToken, const QString &userId);
|
||||||
|
|
||||||
public slots:
|
|
||||||
int sendPushNotification(const QString &userId, const QString &endpointId, const QString &title, const QString &text);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void connected();
|
void connected();
|
||||||
void disconnected();
|
void disconnected();
|
||||||
void devicePaired(const QString &cognritoUserId, int errorCode, const QString &message);
|
void devicePaired(const QString &cognritoUserId, int errorCode, const QString &message);
|
||||||
void pushNotificationEndpointsUpdated(const QList<AWSConnector::PushNotificationsEndpoint> pushNotificationEndpoints);
|
|
||||||
void pushNotificationEndpointAdded(const AWSConnector::PushNotificationsEndpoint &pushNotificationEndpoint);
|
|
||||||
void pushNotificationSent(int id, int status);
|
|
||||||
|
|
||||||
void proxyConnectionRequestReceived(const QString &token, const QString &nonce, const QString &serverUrl);
|
void proxyConnectionRequestReceived(const QString &token, const QString &nonce, const QString &serverUrl);
|
||||||
|
|
||||||
@ -126,6 +113,5 @@ private:
|
|||||||
QPair<QVariantMap, QDateTime> m_cachedTURNCredentials;
|
QPair<QVariantMap, QDateTime> m_cachedTURNCredentials;
|
||||||
|
|
||||||
};
|
};
|
||||||
Q_DECLARE_METATYPE(AWSConnector::PushNotificationsEndpoint)
|
|
||||||
|
|
||||||
#endif // AWSCONNECTOR_H
|
#endif // AWSCONNECTOR_H
|
||||||
|
|||||||
@ -46,14 +46,11 @@ ParamTypeId notifyActionParamBodyId = ParamTypeId("4bd0fa87-c663-4621-8040-99b6d
|
|||||||
|
|
||||||
StateTypeId connectedStateTypeId = StateTypeId("518e27b6-c3bf-49d7-be24-05ae978c00f7");
|
StateTypeId connectedStateTypeId = StateTypeId("518e27b6-c3bf-49d7-be24-05ae978c00f7");
|
||||||
|
|
||||||
CloudNotifications::CloudNotifications(AWSConnector* awsConnector, QObject *parent):
|
CloudNotifications::CloudNotifications(QObject *parent):
|
||||||
IntegrationPlugin(parent),
|
IntegrationPlugin(parent)
|
||||||
m_awsConnector(awsConnector)
|
|
||||||
{
|
{
|
||||||
connect(m_awsConnector, &AWSConnector::pushNotificationEndpointsUpdated, this, &CloudNotifications::pushNotificationEndpointsUpdated);
|
|
||||||
connect(m_awsConnector, &AWSConnector::pushNotificationEndpointAdded, this, &CloudNotifications::pushNotificationEndpointAdded);
|
|
||||||
connect(m_awsConnector, &AWSConnector::pushNotificationSent, this, &CloudNotifications::pushNotificationSent);
|
|
||||||
|
|
||||||
|
// Metadata is just kept for now to not cause any dead things in the system. To be removed in 0.31 or so
|
||||||
QVariantMap pluginMetaData;
|
QVariantMap pluginMetaData;
|
||||||
pluginMetaData.insert("id", "ccc6dbc8-e352-48a1-8e87-3c89a4669fc2");
|
pluginMetaData.insert("id", "ccc6dbc8-e352-48a1-8e87-3c89a4669fc2");
|
||||||
pluginMetaData.insert("name", "CloudNotifications");
|
pluginMetaData.insert("name", "CloudNotifications");
|
||||||
@ -148,107 +145,12 @@ CloudNotifications::CloudNotifications(AWSConnector* awsConnector, QObject *pare
|
|||||||
|
|
||||||
void CloudNotifications::setupThing(ThingSetupInfo *info)
|
void CloudNotifications::setupThing(ThingSetupInfo *info)
|
||||||
{
|
{
|
||||||
Thing *thing = info->thing();
|
// Just finishing the setup for any old existing things to not throw any errors
|
||||||
thing->setStateValue(connectedStateTypeId, m_awsConnector->isConnected());
|
|
||||||
qCDebug(dcCloud) << "Cloud Notifications thing setup:" << thing->name() << "Connected:" << m_awsConnector->isConnected();
|
|
||||||
connect(m_awsConnector, &AWSConnector::connected, info->thing(), [thing]() {
|
|
||||||
thing->setStateValue(connectedStateTypeId, true);
|
|
||||||
});
|
|
||||||
connect(m_awsConnector, &AWSConnector::disconnected, thing, [thing]() {
|
|
||||||
thing->setStateValue(connectedStateTypeId, false);
|
|
||||||
});
|
|
||||||
info->finish(Thing::ThingErrorNoError);
|
info->finish(Thing::ThingErrorNoError);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CloudNotifications::startMonitoringAutoThings()
|
void CloudNotifications::postSetupThing(Thing *thing)
|
||||||
{
|
{
|
||||||
}
|
// And make it go away...
|
||||||
|
emit autoThingDisappeared(thing->id());
|
||||||
void CloudNotifications::executeAction(ThingActionInfo *info)
|
|
||||||
{
|
|
||||||
qCDebug(dcCloud()) << "executeAction" << info->thing() << info->action().params();
|
|
||||||
QString userId = info->thing()->paramValue(cloudNotificationsThingClassUserParamId).toString();
|
|
||||||
QString endpointId = info->thing()->paramValue(cloudNotificationsThingClassEndpointParamId).toString();
|
|
||||||
int id = m_awsConnector->sendPushNotification(userId, endpointId, info->action().param(notifyActionParamTitleId).value().toString(), info->action().param(notifyActionParamBodyId).value().toString());
|
|
||||||
m_pendingPushNotifications.insert(id, info);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CloudNotifications::pushNotificationEndpointsUpdated(const QList<AWSConnector::PushNotificationsEndpoint> &endpoints)
|
|
||||||
{
|
|
||||||
qCDebug(dcCloud()) << "Push Notification endpoint update";
|
|
||||||
QList<Thing*> thingsToRemove;
|
|
||||||
foreach (Thing *configuredThing, myThings()) {
|
|
||||||
bool found = false;
|
|
||||||
foreach (const AWSConnector::PushNotificationsEndpoint &ep, endpoints) {
|
|
||||||
if (configuredThing->paramValue(cloudNotificationsThingClassUserParamId).toString() == ep.userId
|
|
||||||
&& configuredThing->paramValue(cloudNotificationsThingClassEndpointParamId).toString() == ep.endpointId) {
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
thingsToRemove.append(configuredThing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach (Thing *d, thingsToRemove) {
|
|
||||||
emit autoThingDisappeared(d->id());
|
|
||||||
}
|
|
||||||
|
|
||||||
ThingDescriptors thingsToAdd;
|
|
||||||
foreach (const AWSConnector::PushNotificationsEndpoint &ep, endpoints) {
|
|
||||||
bool found = false;
|
|
||||||
qCDebug(dcCloud) << "Checking endoint:" << ep.endpointId;
|
|
||||||
foreach (Thing *d, myThings()) {
|
|
||||||
qCDebug(dcCloud) << "Have existing thing:" << d->name() << d->paramValue(cloudNotificationsThingClassEndpointParamId);
|
|
||||||
if (d->paramValue(cloudNotificationsThingClassUserParamId).toString() == ep.userId
|
|
||||||
&& d->paramValue(cloudNotificationsThingClassEndpointParamId).toString() == ep.endpointId) {
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
qCDebug(dcCloud) << "Adding new notification thing" << ep.displayName;
|
|
||||||
ThingDescriptor descriptor(cloudNotificationsThingClassId, ep.displayName, QString("Send notifications to %1").arg(ep.displayName));
|
|
||||||
ParamList params;
|
|
||||||
Param userIdParam(cloudNotificationsThingClassUserParamId, ep.userId);
|
|
||||||
params.append(userIdParam);
|
|
||||||
Param endpointIdParam(cloudNotificationsThingClassEndpointParamId, ep.endpointId);
|
|
||||||
params.append(endpointIdParam);
|
|
||||||
descriptor.setParams(params);
|
|
||||||
thingsToAdd.append(descriptor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
emit autoThingsAppeared(thingsToAdd);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void CloudNotifications::pushNotificationEndpointAdded(const AWSConnector::PushNotificationsEndpoint &endpoint)
|
|
||||||
{
|
|
||||||
// Could be just an update, don't add it in that case...
|
|
||||||
foreach (Thing *d, myThings()) {
|
|
||||||
if (d->paramValue(cloudNotificationsThingClassUserParamId).toString() == endpoint.userId
|
|
||||||
&& d->paramValue(cloudNotificationsThingClassEndpointParamId).toString() == endpoint.endpointId) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
qCDebug(dcCloud) << "Push notification endpoint added:" << endpoint.displayName;
|
|
||||||
ThingDescriptor descriptor(cloudNotificationsThingClassId, endpoint.displayName, QString("Send notifications to %1").arg(endpoint.displayName));
|
|
||||||
ParamList params;
|
|
||||||
Param userIdParam(cloudNotificationsThingClassUserParamId, endpoint.userId);
|
|
||||||
params.append(userIdParam);
|
|
||||||
Param endpointIdParam(cloudNotificationsThingClassEndpointParamId, endpoint.endpointId);
|
|
||||||
params.append(endpointIdParam);
|
|
||||||
descriptor.setParams(params);
|
|
||||||
emit autoThingsAppeared({descriptor});
|
|
||||||
}
|
|
||||||
|
|
||||||
void CloudNotifications::pushNotificationSent(int id, int status)
|
|
||||||
{
|
|
||||||
qCDebug(dcCloud()) << "Push notification sent" << id << status;
|
|
||||||
ThingActionInfo *info = m_pendingPushNotifications.take(id);
|
|
||||||
if (!info) {
|
|
||||||
qCWarning(dcCloud()) << "Received a push notification send reponse for a request we're not waiting for.";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
info->finish(status == 200 ? Thing::ThingErrorNoError : Thing::ThingErrorHardwareNotAvailable);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,32 +32,20 @@
|
|||||||
#define CLOUDNOTIFICATIONS_H
|
#define CLOUDNOTIFICATIONS_H
|
||||||
|
|
||||||
#include "integrations/integrationplugin.h"
|
#include "integrations/integrationplugin.h"
|
||||||
#include "awsconnector.h"
|
|
||||||
|
|
||||||
class CloudNotifications : public IntegrationPlugin
|
class CloudNotifications : public IntegrationPlugin
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
// Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "deviceplugincloudnotifications.json")
|
|
||||||
Q_INTERFACES(IntegrationPlugin)
|
Q_INTERFACES(IntegrationPlugin)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CloudNotifications(AWSConnector *awsConnector, QObject* parent = nullptr);
|
CloudNotifications(QObject* parent = nullptr);
|
||||||
|
|
||||||
PluginMetadata metaData() const;
|
PluginMetadata metaData() const;
|
||||||
|
|
||||||
void setupThing(ThingSetupInfo *info) override;
|
void setupThing(ThingSetupInfo *info) override;
|
||||||
void startMonitoringAutoThings() override;
|
void postSetupThing(Thing *thing) override;
|
||||||
void executeAction(ThingActionInfo *info) override;
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void pushNotificationEndpointsUpdated(const QList<AWSConnector::PushNotificationsEndpoint> &endpoints);
|
|
||||||
void pushNotificationEndpointAdded(const AWSConnector::PushNotificationsEndpoint &endpoint);
|
|
||||||
void pushNotificationSent(int id, int status);
|
|
||||||
|
|
||||||
private:
|
|
||||||
AWSConnector *m_awsConnector = nullptr;
|
|
||||||
QHash<int, ThingActionInfo*> m_pendingPushNotifications;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CLOUDNOTIFICATIONS_H
|
#endif // CLOUDNOTIFICATIONS_H
|
||||||
|
|||||||
@ -151,6 +151,9 @@ void NymeaCore::init(const QStringList &additionalInterfaces) {
|
|||||||
m_experienceManager = new ExperienceManager(m_thingManager, m_serverManager->jsonServer(), this);
|
m_experienceManager = new ExperienceManager(m_thingManager, m_serverManager->jsonServer(), this);
|
||||||
|
|
||||||
|
|
||||||
|
// To be removed with 0.31 or later.
|
||||||
|
// Most of the cloud push notifications code has been removed with 0.30, this is just kept for a release or two
|
||||||
|
// to auto-remove all the cloud based push notification things users might have in their systems
|
||||||
CloudNotifications *cloudNotifications = m_cloudManager->createNotificationsPlugin();
|
CloudNotifications *cloudNotifications = m_cloudManager->createNotificationsPlugin();
|
||||||
m_thingManager->registerStaticPlugin(cloudNotifications);
|
m_thingManager->registerStaticPlugin(cloudNotifications);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user