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

Signed-off-by: alex-z <blackslayer4@gmail.com>
This commit is contained in:
alex-z 2022-05-09 18:30:36 +03:00
parent 415bcb7045
commit 514f72f975
11 changed files with 37 additions and 23 deletions

View file

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

View file

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

View file

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

View file

@ -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;

View file

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

View file

@ -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

View file

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

View file

@ -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

View file

@ -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;

View file

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

View file

@ -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);
};