From c2078cc1de2bd57f400e0326b7a556c1609848c6 Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Wed, 10 Dec 2025 13:51:35 +0100 Subject: [PATCH 1/2] style: modernize ServerNotificationHandler::slotNotificationsReceived. Signed-off-by: Camila Ayres --- src/gui/tray/notificationhandler.cpp | 72 +++++++++++++++------------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/src/gui/tray/notificationhandler.cpp b/src/gui/tray/notificationhandler.cpp index 4520c8c2ca0bb..a39b79db73311 100644 --- a/src/gui/tray/notificationhandler.cpp +++ b/src/gui/tray/notificationhandler.cpp @@ -98,24 +98,24 @@ void ServerNotificationHandler::slotNotificationsReceived(const QJsonDocument &j const auto notifies = json.object().value("ocs"_L1).toObject().value("data"_L1).toArray(); - auto *ai = qvariant_cast(sender()->property(propertyAccountStateC)); + auto accountState = qvariant_cast(sender()->property(propertyAccountStateC)); ActivityList list; ActivityList callList; - for (const auto element : notifies) { - auto json = element.toObject(); - auto a = Activity::fromActivityJson(json, ai->account()); + for (const auto &element : notifies) { + const auto json = element.toObject(); + auto activity = Activity::fromActivityJson(json, accountState->account()); - a._type = Activity::NotificationType; - a._id = json.value("notification_id"_L1).toInteger(); + activity._type = Activity::NotificationType; + activity._id = json.value("notification_id"_L1).toInteger(); - if(json.contains("subjectRichParameters")) { + if (json.contains("subjectRichParameters")) { const auto richParams = json.value("subjectRichParameters"_L1).toObject(); const auto richParamsKeys = richParams.keys(); for(const auto &key : richParamsKeys) { const auto parameterJsonObject = richParams.value(key).toObject(); - a._subjectRichParameters.insert(key, QVariant::fromValue(Activity::RichSubjectParameter{ + activity._subjectRichParameters.insert(key, QVariant::fromValue(Activity::RichSubjectParameter{ parameterJsonObject.value("type"_L1).toString(), parameterJsonObject.value("id"_L1).toString(), parameterJsonObject.value("name"_L1).toString(), @@ -126,60 +126,64 @@ void ServerNotificationHandler::slotNotificationsReceived(const QJsonDocument &j } if (json.contains("shouldNotify"_L1)) { - a._shouldNotify = json.value("shouldNotify"_L1).toBool(true); + activity._shouldNotify = json.value("shouldNotify"_L1).toBool(true); } // 2 cases to consider: // 1. server == 24 & has Talk: object_type is chat/call/room & object_id contains conversationToken/messageId // 2. server < 24 & has Talk: object_type is chat/call/room & object_id contains _only_ conversationToken - if (a._objectType == "chat"_L1 || a._objectType == "call"_L1 || a._objectType == "room"_L1) { + if (activity._objectType == "chat"_L1 || activity._objectType == "call"_L1 || activity._objectType == "room"_L1) { const auto objectId = json.value("object_id"_L1).toString(); const auto objectIdData = objectId.split(u'/'); - ActivityLink al; - al._label = tr("Reply"); - al._verb = "REPLY"; - al._primary = true; + ActivityLink link; + link._label = tr("Reply"); + link._verb = "REPLY"; + link._primary = true; - a._talkNotificationData.conversationToken = objectIdData.first(); + activity._talkNotificationData.conversationToken = objectIdData.first(); - if (a._objectType == "chat" && objectIdData.size() > 1) { - a._talkNotificationData.messageId = objectIdData.last(); + if (activity._objectType == "chat" && objectIdData.size() > 1) { + activity._talkNotificationData.messageId = objectIdData.last(); } else { - qCInfo(lcServerNotification) << "Replying directly to Talk conversation" << a._talkNotificationData.conversationToken << "will not be possible because the notification doesn't contain the message ID."; + qCInfo(lcServerNotification) << "Replying directly to Talk conversation" << activity._talkNotificationData.conversationToken + << "will not be possible because the notification doesn't contain the message ID."; } - if (a._subjectRichParameters.contains("user"_L1)) { + if (activity._subjectRichParameters.contains("user"_L1)) { // callback then it is the primary action - if (a._objectType == "call"_L1) { - al._primary = false; + if (activity._objectType == "call"_L1) { + link._primary = false; } - a._talkNotificationData.userAvatar = ai->account()->url().toString() + QStringLiteral("/index.php/avatar/") + a._subjectRichParameters["user"_L1].value().id + QStringLiteral("/128"); + activity._talkNotificationData.userAvatar = accountState->account()->url().toString() + + QStringLiteral("/index.php/avatar/") + + activity._subjectRichParameters["user"_L1].value().id + + QStringLiteral("/128"); } // We want to serve incoming call dialogs to the user for calls that - if (a._objectType == "call"_L1 && a._dateTime.secsTo(QDateTime::currentDateTime()) < 120) { - callList.append(a); + if (activity._objectType == "call"_L1 && activity._dateTime.secsTo(QDateTime::currentDateTime()) < 120) { + callList.append(activity); } - a._links.insert(al._primary? 0 : a._links.size(), al); + activity._links.insert(link._primary? 0 : activity._links.size(), link); } - QUrl link(json.value("link"_L1).toString()); - if (!link.isEmpty()) { - if (link.host().isEmpty()) { - link.setScheme(ai->account()->url().scheme()); - link.setHost(ai->account()->url().host()); + QUrl url(json.value("link"_L1).toString()); + if (!url.isEmpty()) { + if (url.host().isEmpty()) { + url.setScheme(accountState->account()->url().scheme()); + url.setHost(accountState->account()->url().host()); } - if (link.port() == -1) { - link.setPort(ai->account()->url().port()); + if (url.port() == -1) { + url.setPort(accountState->account()->url().port()); } } - a._link = link; + activity._link = url; - list.append(a); + list.append(activity); } emit newNotificationList(list); emit newIncomingCallsList(callList); From f28369130b7cac7264dfa9c477c660f5eb386808 Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Wed, 10 Dec 2025 14:25:25 +0100 Subject: [PATCH 2/2] fix(notifications): add delete action to notifications. Fix for #6797 and #8274. Signed-off-by: Camila Ayres --- src/gui/tray/notificationhandler.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gui/tray/notificationhandler.cpp b/src/gui/tray/notificationhandler.cpp index a39b79db73311..cf0624367a3ca 100644 --- a/src/gui/tray/notificationhandler.cpp +++ b/src/gui/tray/notificationhandler.cpp @@ -171,6 +171,15 @@ void ServerNotificationHandler::slotNotificationsReceived(const QJsonDocument &j activity._links.insert(link._primary? 0 : activity._links.size(), link); } + // e.g. announcement + if (activity._objectType != "remote_share"_L1 && activity._links.isEmpty()) { + ActivityLink link; + link._label = tr("Dismiss"); + link._verb = "DELETE"; + link._primary = true; + activity._links.append(link); + } + QUrl url(json.value("link"_L1).toString()); if (!url.isEmpty()) { if (url.host().isEmpty()) {