void ActivityListModel::checkAndRemoveSeenActivities(const OCC::ActivityList &newActivities)
{
+ ActivityList activitiesToRemove;
for (const auto &activity : _finalList) {
if (activity._objectType == QStringLiteral("chat") && !newActivities.contains(activity)) {
- removeActivityFromActivityList(activity);
+ activitiesToRemove.push_back(activity);
}
}
+
+ for (const auto &toRemove : activitiesToRemove) {
+ removeActivityFromActivityList(toRemove);
+ }
}
void ActivityListModel::slotTriggerDefaultAction(const int activityIndex)
{
}
-void ServerNotificationHandler::slotFetchNotifications()
+bool ServerNotificationHandler::startFetchNotifications()
{
// check connectivity and credentials
if (!(_accountState && _accountState->isConnected() && _accountState->account() && _accountState->account()->credentials() && _accountState->account()->credentials()->ready())) {
deleteLater();
- return;
+ return false;
}
// check if the account has notifications enabled. If the capabilities are
// not yet valid, its assumed that notifications are available.
if (!_accountState->account()->capabilities().notificationsAvailable()) {
qCInfo(lcServerNotification) << "Account" << _accountState->account()->displayName() << "does not have notifications enabled.";
deleteLater();
- return;
+ return false;
}
}
_notificationJob->setProperty(propertyAccountStateC, QVariant::fromValue<AccountState *>(_accountState));
_notificationJob->addRawHeader("If-None-Match", _accountState->notificationsEtagResponseHeader());
_notificationJob->start();
+ return true;
}
void ServerNotificationHandler::slotEtagResponseHeaderReceived(const QByteArray &value, int statusCode)
if (statusCode != successStatusCode && statusCode != notModifiedStatusCode) {
qCWarning(lcServerNotification) << "Notifications failed with status code " << statusCode;
deleteLater();
+ emit jobFinished();
return;
}
if (statusCode == notModifiedStatusCode) {
qCWarning(lcServerNotification) << "Status code " << statusCode << " Not Modified - No new notifications.";
deleteLater();
+ emit jobFinished();
return;
}
}
emit newNotificationList(list);
emit newIncomingCallsList(callList);
+ emit jobFinished();
deleteLater();
}
signals:
void newNotificationList(OCC::ActivityList);
void newIncomingCallsList(OCC::ActivityList);
+ void jobFinished();
-public slots:
- void slotFetchNotifications();
+public:
+ bool startFetchNotifications();
private slots:
void slotNotificationsReceived(const QJsonDocument &json, int statusCode);
!notificationAlreadyShown(notificationId);
}
+void User::checkAndRemoveSeenActivities(const ActivityList &list, const int numChatNotificationsReceived)
+{
+ if (numChatNotificationsReceived < _lastChatNotificationsReceivedCount) {
+ _activityModel->checkAndRemoveSeenActivities(list);
+ }
+ _lastChatNotificationsReceivedCount = numChatNotificationsReceived;
+}
+
void User::showDesktopNotification(const QString &title, const QString &message, const long notificationId)
{
if(!canShowNotification(notificationId)) {
void User::slotBuildNotificationDisplay(const ActivityList &list)
{
+ const auto chatNotificationsReceivedCount = std::count_if(std::cbegin(list), std::cend(list), [](const auto &activity) {
+ return activity._objectType == QStringLiteral("chat");
+ });
+ checkAndRemoveSeenActivities(list, chatNotificationsReceivedCount);
+
ActivityList toNotifyList;
std::copy_if(list.constBegin(), list.constEnd(), std::back_inserter(toNotifyList), [&](const Activity &activity) {
return;
}
- auto chatNotificationsReceivedCount = 0;
-
- for(const auto &activity : qAsConst(toNotifyList)) {
+ for (const auto &activity : qAsConst(toNotifyList)) {
if (activity._objectType == QStringLiteral("chat")) {
- ++chatNotificationsReceivedCount;
showDesktopTalkNotification(activity);
} else {
showDesktopNotification(activity);
}
}
+}
- if (chatNotificationsReceivedCount < _lastChatNotificationsReceivedCount) {
- _activityModel->checkAndRemoveSeenActivities(toNotifyList);
- }
- _lastChatNotificationsReceivedCount = chatNotificationsReceivedCount;
+void User::slotNotificationFetchFinished()
+{
+ _isNotificationFetchRunning = false;
}
void User::slotBuildIncomingCallDialogs(const ActivityList &list)
// start a server notification handler if no notification requests
// are running
if (_notificationRequestsRunning == 0) {
+ if (_isNotificationFetchRunning) {
+ qCDebug(lcActivity) << "Notification fetch is already running.";
+ return;
+ }
auto *snh = new ServerNotificationHandler(_account.data());
connect(snh, &ServerNotificationHandler::newNotificationList,
this, &User::slotBuildNotificationDisplay);
connect(snh, &ServerNotificationHandler::newIncomingCallsList,
this, &User::slotBuildIncomingCallDialogs);
-
- snh->slotFetchNotifications();
+ connect(snh, &ServerNotificationHandler::jobFinished,
+ this, &User::slotNotificationFetchFinished);
+ _isNotificationFetchRunning = snh->startFetchNotifications();
} else {
qCWarning(lcActivity) << "Notification request counter not zero.";
}
void slotNotifyServerFinished(const QString &reply, int replyCode);
void slotSendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row);
void slotBuildNotificationDisplay(const OCC::ActivityList &list);
+ void slotNotificationFetchFinished();
void slotBuildIncomingCallDialogs(const OCC::ActivityList &list);
void slotRefreshNotifications();
void slotRefreshActivitiesInitial();
bool notificationAlreadyShown(const long notificationId);
bool canShowNotification(const long notificationId);
+ void checkAndRemoveSeenActivities(const ActivityList &list, const int numChatNotificationsReceived);
+
AccountStatePtr _account;
bool _isCurrentUser;
ActivityListModel *_activityModel;
int _notificationRequestsRunning = 0;
int _lastChatNotificationsReceivedCount = 0;
+
+ bool _isNotificationFetchRunning = false;
};
class UserModel : public QAbstractListModel