Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 47 additions & 34 deletions src/gui/tray/notificationhandler.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/*
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-2.0-or-later
Expand Down Expand Up @@ -98,24 +98,24 @@

const auto notifies = json.object().value("ocs"_L1).toObject().value("data"_L1).toArray();

auto *ai = qvariant_cast<AccountState *>(sender()->property(propertyAccountStateC));
auto accountState = qvariant_cast<AccountState *>(sender()->property(propertyAccountStateC));

Check warning on line 101 in src/gui/tray/notificationhandler.cpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Unmodified variable "accountState" of type "class OCC::AccountState *" should be const-qualified.

See more on https://sonarcloud.io/project/issues?id=nextcloud_desktop&issues=AZsNPLSSeCy-prftK5uG&open=AZsNPLSSeCy-prftK5uG&pullRequest=9228

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();

Check warning on line 107 in src/gui/tray/notificationhandler.cpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

declaration shadows a local variable

See more on https://sonarcloud.io/project/issues?id=nextcloud_desktop&issues=AZsNPLSSeCy-prftK5uE&open=AZsNPLSSeCy-prftK5uE&pullRequest=9228
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(),
Expand All @@ -126,60 +126,73 @@
}

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) {

Check failure on line 156 in src/gui/tray/notificationhandler.cpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this code to not nest more than 3 if|for|do|while|switch statements.

See more on https://sonarcloud.io/project/issues?id=nextcloud_desktop&issues=AZsNPLSSeCy-prftK5uF&open=AZsNPLSSeCy-prftK5uF&pullRequest=9228
link._primary = false;
}

a._talkNotificationData.userAvatar = ai->account()->url().toString() + QStringLiteral("/index.php/avatar/") + a._subjectRichParameters["user"_L1].value<Activity::RichSubjectParameter>().id + QStringLiteral("/128");
activity._talkNotificationData.userAvatar = accountState->account()->url().toString()
+ QStringLiteral("/index.php/avatar/")
+ activity._subjectRichParameters["user"_L1].value<Activity::RichSubjectParameter>().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());
// 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()) {
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);
Expand Down
Loading