1 // SPDX-FileCopyrightText: 2021 Nheko Contributors
2 //
3 // SPDX-License-Identifier: GPL-3.0-or-later
4 
5 #pragma once
6 
7 #include <QHash>
8 #include <QQuickItem>
9 #include <QQuickTextDocument>
10 #include <QQuickView>
11 #include <QQuickWidget>
12 #include <QWidget>
13 
14 #include <mtx/common.hpp>
15 #include <mtx/responses/messages.hpp>
16 #include <mtx/responses/sync.hpp>
17 
18 #include "Cache.h"
19 #include "JdenticonProvider.h"
20 #include "Logging.h"
21 #include "TimelineModel.h"
22 #include "Utils.h"
23 #include "emoji/EmojiModel.h"
24 #include "emoji/Provider.h"
25 #include "encryption/VerificationManager.h"
26 #include "timeline/CommunitiesModel.h"
27 #include "timeline/RoomlistModel.h"
28 #include "voip/CallManager.h"
29 #include "voip/WebRTCSession.h"
30 
31 class MxcImageProvider;
32 class BlurhashProvider;
33 class ColorImageProvider;
34 class UserSettings;
35 class ChatPage;
36 class ImagePackListModel;
37 
38 class TimelineViewManager : public QObject
39 {
40     Q_OBJECT
41 
42     Q_PROPERTY(
43       bool isInitialSync MEMBER isInitialSync_ READ isInitialSync NOTIFY initialSyncChanged)
44     Q_PROPERTY(
45       bool isWindowFocused MEMBER isWindowFocused_ READ isWindowFocused NOTIFY focusChanged)
46 
47 public:
48     TimelineViewManager(CallManager *callManager, ChatPage *parent = nullptr);
getWidget()49     QWidget *getWidget() const { return container; }
50 
51     void sync(const mtx::responses::Rooms &rooms);
52 
imageProvider()53     MxcImageProvider *imageProvider() { return imgProvider; }
callManager()54     CallManager *callManager() { return callManager_; }
verificationManager()55     VerificationManager *verificationManager() { return verificationManager_; }
56 
clearAll()57     void clearAll() { rooms_->clear(); }
58 
isInitialSync()59     Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; }
isWindowFocused()60     bool isWindowFocused() const { return isWindowFocused_; }
61     Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId);
62     Q_INVOKABLE void openImagePackSettings(QString roomid);
63     Q_INVOKABLE QColor userColor(QString id, QColor background);
64     Q_INVOKABLE QString escapeEmoji(QString str) const;
htmlEscape(QString str)65     Q_INVOKABLE QString htmlEscape(QString str) const { return str.toHtmlEscaped(); }
66 
67     Q_INVOKABLE QString userPresence(QString id) const;
68     Q_INVOKABLE QString userStatus(QString id) const;
69 
70     Q_INVOKABLE void openRoomMembers(TimelineModel *room);
71     Q_INVOKABLE void openRoomSettings(QString room_id);
72     Q_INVOKABLE void openInviteUsers(QString roomId);
73     Q_INVOKABLE void openGlobalUserProfile(QString userId);
74 
75     Q_INVOKABLE void focusMessageInput();
76 
77     Q_INVOKABLE void fixImageRendering(QQuickTextDocument *t, QQuickItem *i);
78 
79 signals:
80     void activeTimelineChanged(TimelineModel *timeline);
81     void initialSyncChanged(bool isInitialSync);
82     void replyingEventChanged(QString replyingEvent);
83     void replyClosed();
84     void inviteUsers(QString roomId, QStringList users);
85     void showRoomList();
86     void narrowViewChanged();
87     void focusChanged();
88     void focusInput();
89     void openImageOverlayInternalCb(QString eventId, QImage img);
90     void openRoomMembersDialog(MemberList *members, TimelineModel *room);
91     void openRoomSettingsDialog(RoomSettings *settings);
92     void openInviteUsersDialog(InviteesModel *invitees);
93     void openProfile(UserProfile *profile);
94     void showImagePackSettings(ImagePackListModel *packlist);
95     void openLeaveRoomDialog(QString roomid);
96 
97 public slots:
98     void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
99     void receivedSessionKey(const std::string &room_id, const std::string &session_id);
100     void initializeRoomlist();
chatFocusChanged(bool focused)101     void chatFocusChanged(bool focused)
102     {
103         isWindowFocused_ = focused;
104         emit focusChanged();
105     }
106 
107     void showEvent(const QString &room_id, const QString &event_id);
108     void focusTimeline();
109 
110     void updateColorPalette();
111     void queueReply(const QString &roomid, const QString &repliedToEvent, const QString &replyBody);
112     void queueCallMessage(const QString &roomid, const mtx::events::msg::CallInvite &);
113     void queueCallMessage(const QString &roomid, const mtx::events::msg::CallCandidates &);
114     void queueCallMessage(const QString &roomid, const mtx::events::msg::CallAnswer &);
115     void queueCallMessage(const QString &roomid, const mtx::events::msg::CallHangUp &);
116 
117     void setVideoCallItem();
118 
119     QObject *completerFor(QString completerName, QString roomId = "");
120     void forwardMessageToRoom(mtx::events::collections::TimelineEvents *e, QString roomId);
121 
rooms()122     RoomlistModel *rooms() { return rooms_; }
123 
124 private slots:
125     void openImageOverlayInternal(QString eventId, QImage img);
126 
127 private:
128 #ifdef USE_QUICK_VIEW
129     QQuickView *view;
130 #else
131     QQuickWidget *view;
132 #endif
133     QWidget *container;
134 
135     MxcImageProvider *imgProvider;
136     ColorImageProvider *colorImgProvider;
137     BlurhashProvider *blurhashProvider;
138     JdenticonProvider *jdenticonProvider;
139 
140     bool isInitialSync_   = true;
141     bool isWindowFocused_ = false;
142 
143     RoomlistModel *rooms_          = nullptr;
144     CommunitiesModel *communities_ = nullptr;
145 
146     // don't move this above the rooms_
147     CallManager *callManager_                 = nullptr;
148     VerificationManager *verificationManager_ = nullptr;
149 
150     QHash<QPair<QString, quint64>, QColor> userColors;
151 };
152 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationAccept)
153 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationCancel)
154 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationDone)
155 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationKey)
156 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationMac)
157 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationReady)
158 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationRequest)
159 Q_DECLARE_METATYPE(mtx::events::msg::KeyVerificationStart)
160