mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-22 21:15:55 +03:00
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:
parent
415bcb7045
commit
514f72f975
11 changed files with 37 additions and 23 deletions
|
@ -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){
|
||||
|
|
|
@ -217,6 +217,7 @@ private Q_SLOTS:
|
|||
|
||||
void slotCheckConnection();
|
||||
void slotPushNotificationsReady();
|
||||
void slotServerUserStatusChanged();
|
||||
|
||||
private:
|
||||
AccountPtr _account;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -182,6 +182,7 @@ void UserStatusSelectorModel::setOnlineStatus(UserStatus::OnlineStatus status)
|
|||
}
|
||||
|
||||
_userStatus.setState(status);
|
||||
_userStatusConnector->setUserStatus(_userStatus);
|
||||
emit onlineStatusChanged();
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -322,6 +322,8 @@ signals:
|
|||
|
||||
void userStatusChanged();
|
||||
|
||||
void serverUserStatusChanged();
|
||||
|
||||
void capabilitiesChanged();
|
||||
|
||||
void lockFileSuccess();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue