nextcloud-desktop/src/gui/tray/usermodel.h

260 lines
8.7 KiB
C++

#ifndef USERMODEL_H
#define USERMODEL_H
#include <QAbstractListModel>
#include <QImage>
#include <QDateTime>
#include <QStringList>
#include <QQuickImageProvider>
#include <QHash>
#include "activitylistmodel.h"
#include "accountfwd.h"
#include "accountmanager.h"
#include "folderman.h"
#include "notificationcache.h"
#include "userstatusselectormodel.h"
#include "userstatusconnector.h"
#include <chrono>
namespace OCC {
class UnifiedSearchResultsListModel;
class User : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name NOTIFY nameChanged)
Q_PROPERTY(QString server READ server CONSTANT)
Q_PROPERTY(QColor headerColor READ headerColor NOTIFY headerColorChanged)
Q_PROPERTY(QColor headerTextColor READ headerTextColor NOTIFY headerTextColorChanged)
Q_PROPERTY(QColor accentColor READ accentColor NOTIFY accentColorChanged)
Q_PROPERTY(bool serverHasUserStatus READ serverHasUserStatus CONSTANT)
Q_PROPERTY(QUrl statusIcon READ statusIcon NOTIFY statusChanged)
Q_PROPERTY(QString statusEmoji READ statusEmoji NOTIFY statusChanged)
Q_PROPERTY(QString statusMessage READ statusMessage NOTIFY statusChanged)
Q_PROPERTY(bool desktopNotificationsAllowed READ isDesktopNotificationsAllowed NOTIFY desktopNotificationsAllowedChanged)
Q_PROPERTY(bool hasLocalFolder READ hasLocalFolder NOTIFY hasLocalFolderChanged)
Q_PROPERTY(bool serverHasTalk READ serverHasTalk NOTIFY serverHasTalkChanged)
Q_PROPERTY(QString avatar READ avatarUrl NOTIFY avatarChanged)
Q_PROPERTY(bool isConnected READ isConnected NOTIFY accountStateChanged)
Q_PROPERTY(UnifiedSearchResultsListModel* unifiedSearchResultsListModel READ getUnifiedSearchResultsListModel CONSTANT)
public:
User(AccountStatePtr &account, const bool &isCurrent = false, QObject *parent = nullptr);
AccountPtr account() const;
AccountStatePtr accountState() const;
bool isConnected() const;
bool isCurrentUser() const;
void setCurrentUser(const bool &isCurrent);
Folder *getFolder() const;
ActivityListModel *getActivityModel();
UnifiedSearchResultsListModel *getUnifiedSearchResultsListModel() const;
void openLocalFolder();
QString name() const;
QString server(bool shortened = true) const;
bool hasLocalFolder() const;
bool serverHasTalk() const;
bool serverHasUserStatus() const;
AccountApp *talkApp() const;
bool hasActivities() const;
QColor accentColor() const;
QColor headerColor() const;
QColor headerTextColor() const;
AccountAppList appList() const;
QImage avatar() const;
void login() const;
void logout() const;
void removeAccount() const;
QString avatarUrl() const;
bool isDesktopNotificationsAllowed() const;
UserStatus::OnlineStatus status() const;
QString statusMessage() const;
QUrl statusIcon() const;
QString statusEmoji() const;
void processCompletedSyncItem(const Folder *folder, const SyncFileItemPtr &item);
signals:
void guiLog(const QString &, const QString &);
void nameChanged();
void hasLocalFolderChanged();
void serverHasTalkChanged();
void avatarChanged();
void accountStateChanged();
void statusChanged();
void desktopNotificationsAllowedChanged();
void headerColorChanged();
void headerTextColorChanged();
void accentColorChanged();
void sendReplyMessage(const int activityIndex, const QString &conversationToken, const QString &message, const QString &replyTo);
public slots:
void slotItemCompleted(const QString &folder, const SyncFileItemPtr &item);
void slotProgressInfo(const QString &folder, const ProgressInfo &progress);
void slotAddError(const QString &folderAlias, const QString &message, ErrorCategory category);
void slotAddErrorToGui(const QString &folderAlias, SyncFileItem::Status status, const QString &errorMessage, const QString &subject = {});
void slotNotificationRequestFinished(int statusCode);
void slotNotifyNetworkError(QNetworkReply *reply);
void slotEndNotificationRequest(int replyCode);
void slotNotifyServerFinished(const QString &reply, int replyCode);
void slotSendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row);
void slotBuildNotificationDisplay(const ActivityList &list);
void slotBuildIncomingCallDialogs(const ActivityList &list);
void slotRefreshNotifications();
void slotRefreshActivities();
void slotRefresh();
void slotRefreshUserStatus();
void slotRefreshImmediately();
void setNotificationRefreshInterval(std::chrono::milliseconds interval);
void slotRebuildNavigationAppList();
void slotSendReplyMessage(const int activityIndex, const QString &conversationToken, const QString &message, const QString &replyTo);
private:
void slotPushNotificationsReady();
void slotDisconnectPushNotifications();
void slotReceivedPushNotification(Account *account);
void slotReceivedPushActivity(Account *account);
void slotCheckExpiredActivities();
void connectPushNotifications() const;
bool checkPushNotificationsAreReady() const;
bool isActivityOfCurrentAccount(const Folder *folder) const;
bool isUnsolvableConflict(const SyncFileItemPtr &item) const;
void showDesktopNotification(const QString &title, const QString &message);
private:
AccountStatePtr _account;
bool _isCurrentUser;
ActivityListModel *_activityModel;
UnifiedSearchResultsListModel *_unifiedSearchResultsModel;
ActivityList _blacklistedNotifications;
QTimer _expiredActivitiesCheckTimer;
QTimer _notificationCheckTimer;
QHash<AccountState *, QElapsedTimer> _timeSinceLastCheck;
QElapsedTimer _guiLogTimer;
NotificationCache _notificationCache;
QMimeDatabase _mimeDb;
// number of currently running notification requests. If non zero,
// no query for notifications is started.
int _notificationRequestsRunning;
};
class UserModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(User* currentUser READ currentUser NOTIFY newUserSelected)
Q_PROPERTY(int currentUserId READ currentUserId NOTIFY newUserSelected)
public:
static UserModel *instance();
~UserModel() override = default;
void addUser(AccountStatePtr &user, const bool &isCurrent = false);
int currentUserIndex();
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QImage avatarById(const int &id);
User *currentUser() const;
int findUserIdForAccount(AccountState *account) const;
Q_INVOKABLE void fetchCurrentActivityModel();
Q_INVOKABLE void openCurrentAccountLocalFolder();
Q_INVOKABLE void openCurrentAccountTalk();
Q_INVOKABLE void openCurrentAccountServer();
Q_INVOKABLE int numUsers();
Q_INVOKABLE QString currentUserServer();
int currentUserId() const;
Q_INVOKABLE bool isUserConnected(const int &id);
Q_INVOKABLE void switchCurrentUser(const int &id);
Q_INVOKABLE void login(const int &id);
Q_INVOKABLE void logout(const int &id);
Q_INVOKABLE void removeAccount(const int &id);
Q_INVOKABLE std::shared_ptr<OCC::UserStatusConnector> userStatusConnector(int id);
ActivityListModel *currentActivityModel();
enum UserRoles {
NameRole = Qt::UserRole + 1,
ServerRole,
ServerHasUserStatusRole,
StatusIconRole,
StatusEmojiRole,
StatusMessageRole,
DesktopNotificationsAllowedRole,
AvatarRole,
IsCurrentUserRole,
IsConnectedRole,
IdRole
};
AccountAppList appList() const;
signals:
Q_INVOKABLE void addAccount();
Q_INVOKABLE void newUserSelected();
protected:
QHash<int, QByteArray> roleNames() const override;
private:
static UserModel *_instance;
UserModel(QObject *parent = nullptr);
QList<User*> _users;
int _currentUserId = 0;
bool _init = true;
void buildUserList();
};
class ImageProvider : public QQuickImageProvider
{
public:
ImageProvider();
QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override;
};
class UserAppsModel : public QAbstractListModel
{
Q_OBJECT
public:
static UserAppsModel *instance();
~UserAppsModel() override = default;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
enum UserAppsRoles {
NameRole = Qt::UserRole + 1,
UrlRole,
IconUrlRole
};
void buildAppList();
public slots:
void openAppUrl(const QUrl &url);
protected:
QHash<int, QByteArray> roleNames() const override;
private:
static UserAppsModel *_instance;
UserAppsModel(QObject *parent = nullptr);
AccountAppList _apps;
};
}
#endif // USERMODEL_H