Browse Source

Use proper online status for user ('dnd', 'online', 'invisible', etc.) to enable or disable desktop notifications.

Signed-off-by: alex-z <blackslayer4@gmail.com>
alex-z 3 years ago
parent
commit
514f72f975

+ 8 - 0
src/gui/accountstate.cpp

@@ -21,6 +21,7 @@
 #include "logger.h"
 #include "configfile.h"
 #include "ocsnavigationappsjob.h"
+#include "ocsuserstatusconnector.h"
 #include "pushnotifications.h"
 
 #include <QSettings>
@@ -58,6 +59,8 @@ AccountState::AccountState(AccountPtr account)
         this, &AccountState::slotCredentialsAsked);
     connect(account.data(), &Account::pushNotificationsReady,
             this, &AccountState::slotPushNotificationsReady);
+    connect(account.data(), &Account::serverUserStatusChanged, this,
+        &AccountState::slotServerUserStatusChanged);
 
     connect(this, &AccountState::isConnectedChanged, [=]{
         // Get the Apps available on the server if we're now connected.
@@ -558,6 +561,11 @@ void AccountState::slotPushNotificationsReady()
     }
 }
 
+void AccountState::slotServerUserStatusChanged()
+{
+    setDesktopNotificationsAllowed(_account->userStatusConnector()->userStatus().state() != UserStatus::OnlineStatus::DoNotDisturb);
+}
+
 void AccountState::slotNavigationAppsFetched(const QJsonDocument &reply, int statusCode)
 {
     if(_account){

+ 1 - 0
src/gui/accountstate.h

@@ -217,6 +217,7 @@ private Q_SLOTS:
 
     void slotCheckConnection();
     void slotPushNotificationsReady();
+    void slotServerUserStatusChanged();
 
 private:
     AccountPtr _account;

+ 0 - 10
src/gui/tray/notificationhandler.cpp

@@ -47,8 +47,6 @@ void ServerNotificationHandler::slotFetchNotifications()
         this, &ServerNotificationHandler::slotNotificationsReceived);
     QObject::connect(_notificationJob.data(), &JsonApiJob::etagResponseHeaderReceived,
         this, &ServerNotificationHandler::slotEtagResponseHeaderReceived);
-    QObject::connect(_notificationJob.data(), &JsonApiJob::allowDesktopNotificationsChanged,
-            this, &ServerNotificationHandler::slotAllowDesktopNotificationsChanged);
     _notificationJob->setProperty(propertyAccountStateC, QVariant::fromValue<AccountState *>(_accountState));
     _notificationJob->addRawHeader("If-None-Match", _accountState->notificationsEtagResponseHeader());
     _notificationJob->start();
@@ -63,14 +61,6 @@ void ServerNotificationHandler::slotEtagResponseHeaderReceived(const QByteArray
     }
 }
 
-void ServerNotificationHandler::slotAllowDesktopNotificationsChanged(bool isAllowed)
-{
-    auto *account = qvariant_cast<AccountState *>(sender()->property(propertyAccountStateC));
-    if (account != nullptr) {
-       account->setDesktopNotificationsAllowed(isAllowed);
-    }
-}
-
 void ServerNotificationHandler::slotNotificationsReceived(const QJsonDocument &json, int statusCode)
 {
     if (statusCode != successStatusCode && statusCode != notModifiedStatusCode) {

+ 0 - 1
src/gui/tray/notificationhandler.h

@@ -25,7 +25,6 @@ public slots:
 private slots:
     void slotNotificationsReceived(const QJsonDocument &json, int statusCode);
     void slotEtagResponseHeaderReceived(const QByteArray &value, int statusCode);
-    void slotAllowDesktopNotificationsChanged(bool isAllowed);
 
 private:
     QPointer<JsonApiJob> _notificationJob;

+ 1 - 0
src/gui/userstatusselectormodel.cpp

@@ -182,6 +182,7 @@ void UserStatusSelectorModel::setOnlineStatus(UserStatus::OnlineStatus status)
     }
 
     _userStatus.setState(status);
+    _userStatusConnector->setUserStatus(_userStatus);
     emit onlineStatusChanged();
 }
 

+ 3 - 0
src/libsync/account.cpp

@@ -635,9 +635,12 @@ void Account::setupUserStatusConnector()
     connect(_userStatusConnector.get(), &UserStatusConnector::userStatusFetched, this, [this](const UserStatus &) {
         emit userStatusChanged();
     });
+    connect(_userStatusConnector.get(), &UserStatusConnector::serverUserStatusChanged, this, &Account::serverUserStatusChanged);
     connect(_userStatusConnector.get(), &UserStatusConnector::messageCleared, this, [this] {
         emit userStatusChanged();
     });
+
+    _userStatusConnector->fetchUserStatus();
 }
 
 QString Account::serverVersion() const

+ 2 - 0
src/libsync/account.h

@@ -322,6 +322,8 @@ signals:
 
     void userStatusChanged();
 
+    void serverUserStatusChanged();
+
     void capabilitiesChanged();
 
     void lockFileSuccess();

+ 0 - 5
src/libsync/networkjobs.cpp

@@ -915,11 +915,6 @@ bool JsonApiJob::finished()
     if(reply()->rawHeaderList().contains("ETag"))
         emit etagResponseHeaderReceived(reply()->rawHeader("ETag"), statusCode);
 
-    const auto desktopNotificationsAllowed = reply()->rawHeader(QByteArray("X-Nextcloud-User-Status"));
-    if(!desktopNotificationsAllowed.isEmpty()) {
-        emit allowDesktopNotificationsChanged(desktopNotificationsAllowed == "online");
-    }
-
     QJsonParseError error;
     auto json = QJsonDocument::fromJson(jsonStr.toUtf8(), &error);
     // empty or invalid response and status code is != 304 because jsonStr is expected to be empty

+ 0 - 6
src/libsync/networkjobs.h

@@ -449,12 +449,6 @@ signals:
      */
     void etagResponseHeaderReceived(const QByteArray &value, int statusCode);
 
-    /**
-     * @brief desktopNotificationStatusReceived - signal to report if notifications are allowed
-     * @param status - set desktop notifications allowed status
-     */
-    void allowDesktopNotificationsChanged(bool isAllowed);
-
 private:
     QByteArray _body;
     QUrlQuery _additionalParams;

+ 21 - 1
src/libsync/ocsuserstatusconnector.cpp

@@ -256,8 +256,14 @@ void OcsUserStatusConnector::onUserStatusFetched(const QJsonDocument &json, int
         return;
     }
 
+    const auto oldOnlineState = _userStatus.state();
     _userStatus = jsonToUserStatus(json);
+
     emit userStatusFetched(_userStatus);
+
+    if (oldOnlineState != _userStatus.state()) {
+        emit serverUserStatusChanged();
+    }
 }
 
 void OcsUserStatusConnector::startFetchPredefinedStatuses()
@@ -396,7 +402,9 @@ void OcsUserStatusConnector::setUserStatus(const UserStatus &userStatus)
         return;
     }
 
-    setUserStatusOnlineStatus(userStatus.state());
+    if (userStatus.state() != _userStatus.state()) {
+        setUserStatusOnlineStatus(userStatus.state());
+    }
     setUserStatusMessage(userStatus);
 }
 
@@ -408,6 +416,15 @@ void OcsUserStatusConnector::onUserStatusOnlineStatusSet(const QJsonDocument &js
         emit error(Error::CouldNotSetUserStatus);
         return;
     }
+
+    const auto oldOnlineState = _userStatus.state();
+    _userStatus.setState(jsonToUserStatus(json).state());
+
+    emit userStatusSet();
+
+    if (oldOnlineState != _userStatus.state()) {
+        emit serverUserStatusChanged();
+    }
 }
 
 void OcsUserStatusConnector::onUserStatusMessageSet(const QJsonDocument &json, int statusCode)
@@ -449,7 +466,10 @@ void OcsUserStatusConnector::onMessageCleared(const QJsonDocument &json, int sta
         return;
     }
 
+    const auto onlineState = _userStatus.state();
+
     _userStatus = {};
+    _userStatus.setState(onlineState);
     emit messageCleared();
 }
 }

+ 1 - 0
src/libsync/userstatusconnector.h

@@ -129,6 +129,7 @@ signals:
     void userStatusFetched(const UserStatus &userStatus);
     void predefinedStatusesFetched(const std::vector<UserStatus> &statuses);
     void userStatusSet();
+    void serverUserStatusChanged();
     void messageCleared();
     void error(Error error);
 };