summary refs log tree commit diff
path: root/src/timeline
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2020-11-15 23:14:47 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2020-11-25 19:05:12 +0100
commitd1af1a86691290c67ad9e2b6ae9440b1254a2c0b (patch)
tree2127c4396d29ada0ed618f275619cb96b05ca380 /src/timeline
parentAdd file uploading (diff)
downloadnheko-d1af1a86691290c67ad9e2b6ae9440b1254a2c0b.tar.xz
Move calls to new input bar
Diffstat (limited to 'src/timeline')
-rw-r--r--src/timeline/InputBar.cpp45
-rw-r--r--src/timeline/InputBar.h1
-rw-r--r--src/timeline/TimelineViewManager.cpp136
-rw-r--r--src/timeline/TimelineViewManager.h31
4 files changed, 71 insertions, 142 deletions
diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index bd8f6414..dc287f94 100644
--- a/src/timeline/InputBar.cpp
+++ b/src/timeline/InputBar.cpp
@@ -12,13 +12,16 @@
 #include <mtx/responses/media.hpp>
 
 #include "Cache.h"
+#include "CallManager.h"
 #include "ChatPage.h"
 #include "Logging.h"
+#include "MainWindow.h"
 #include "MatrixClient.h"
 #include "Olm.h"
 #include "TimelineModel.h"
 #include "UserSettingsPage.h"
 #include "Utils.h"
+#include "dialogs/PlaceCall.h"
 #include "dialogs/PreviewUploadOverlay.h"
 
 #include "blurhash.hpp"
@@ -511,3 +514,45 @@ InputBar::showPreview(const QMimeData &source, QString path, const QStringList &
                     });
           });
 }
+
+void
+InputBar::callButton()
+{
+        auto callManager_ = ChatPage::instance()->callManager();
+        if (callManager_->onActiveCall()) {
+                callManager_->hangUp();
+        } else {
+                auto current_room_ = room->roomId();
+                if (auto roomInfo = cache::singleRoomInfo(current_room_.toStdString());
+                    roomInfo.member_count != 2) {
+                        ChatPage::instance()->showNotification("Calls are limited to 1:1 rooms.");
+                } else {
+                        std::vector<RoomMember> members(
+                          cache::getMembers(current_room_.toStdString()));
+                        const RoomMember &callee = members.front().user_id == utils::localUser()
+                                                     ? members.back()
+                                                     : members.front();
+                        auto dialog =
+                          new dialogs::PlaceCall(callee.user_id,
+                                                 callee.display_name,
+                                                 QString::fromStdString(roomInfo.name),
+                                                 QString::fromStdString(roomInfo.avatar_url),
+                                                 ChatPage::instance()->userSettings(),
+                                                 MainWindow::instance());
+                        connect(dialog,
+                                &dialogs::PlaceCall::voice,
+                                callManager_,
+                                [callManager_, current_room_]() {
+                                        callManager_->sendInvite(current_room_, false);
+                                });
+                        connect(dialog,
+                                &dialogs::PlaceCall::video,
+                                callManager_,
+                                [callManager_, current_room_]() {
+                                        callManager_->sendInvite(current_room_, true);
+                                });
+                        utils::centerWidget(dialog, MainWindow::instance());
+                        dialog->show();
+                }
+        }
+}
diff --git a/src/timeline/InputBar.h b/src/timeline/InputBar.h
index 35e3f8a4..a52a3904 100644
--- a/src/timeline/InputBar.h
+++ b/src/timeline/InputBar.h
@@ -27,6 +27,7 @@ public slots:
         void updateState(int selectionStart, int selectionEnd, int cursorPosition, QString text);
         void openFileSelection();
         bool uploading() const { return uploading_; }
+        void callButton();
 
 signals:
         void insertText(QString text);
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index f949498d..1392c505 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -244,6 +244,26 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
                 &CallManager::newVideoCallState,
                 this,
                 &TimelineViewManager::videoCallChanged);
+
+        connect(&WebRTCSession::instance(),
+                &WebRTCSession::stateChanged,
+                this,
+                &TimelineViewManager::onCallChanged);
+}
+
+bool
+TimelineViewManager::isOnCall() const
+{
+        return callManager_->onActiveCall();
+}
+bool
+TimelineViewManager::callsSupported() const
+{
+#ifdef GSTREAMER_AVAILABLE
+        return true;
+#else
+        return false;
+#endif
 }
 
 void
@@ -506,122 +526,6 @@ TimelineViewManager::queueReactionMessage(const QString &reactedEvent, const QSt
                 timeline_->redactEvent(selfReactedEvent);
         }
 }
-
-void
-TimelineViewManager::queueImageMessage(const QString &roomid,
-                                       const QString &filename,
-                                       const std::optional<mtx::crypto::EncryptedFile> &file,
-                                       const QString &url,
-                                       const QString &mime,
-                                       uint64_t dsize,
-                                       const QSize &dimensions,
-                                       const QString &blurhash)
-{
-        mtx::events::msg::Image image;
-        image.info.mimetype = mime.toStdString();
-        image.info.size     = dsize;
-        image.info.blurhash = blurhash.toStdString();
-        image.body          = filename.toStdString();
-        image.info.h        = dimensions.height();
-        image.info.w        = dimensions.width();
-
-        if (file)
-                image.file = file;
-        else
-                image.url = url.toStdString();
-
-        auto model = models.value(roomid);
-        if (!model->reply().isEmpty()) {
-                image.relates_to.in_reply_to.event_id = model->reply().toStdString();
-                model->resetReply();
-        }
-
-        model->sendMessageEvent(image, mtx::events::EventType::RoomMessage);
-}
-
-void
-TimelineViewManager::queueFileMessage(
-  const QString &roomid,
-  const QString &filename,
-  const std::optional<mtx::crypto::EncryptedFile> &encryptedFile,
-  const QString &url,
-  const QString &mime,
-  uint64_t dsize)
-{
-        mtx::events::msg::File file;
-        file.info.mimetype = mime.toStdString();
-        file.info.size     = dsize;
-        file.body          = filename.toStdString();
-
-        if (encryptedFile)
-                file.file = encryptedFile;
-        else
-                file.url = url.toStdString();
-
-        auto model = models.value(roomid);
-        if (!model->reply().isEmpty()) {
-                file.relates_to.in_reply_to.event_id = model->reply().toStdString();
-                model->resetReply();
-        }
-
-        model->sendMessageEvent(file, mtx::events::EventType::RoomMessage);
-}
-
-void
-TimelineViewManager::queueAudioMessage(const QString &roomid,
-                                       const QString &filename,
-                                       const std::optional<mtx::crypto::EncryptedFile> &file,
-                                       const QString &url,
-                                       const QString &mime,
-                                       uint64_t dsize)
-{
-        mtx::events::msg::Audio audio;
-        audio.info.mimetype = mime.toStdString();
-        audio.info.size     = dsize;
-        audio.body          = filename.toStdString();
-        audio.url           = url.toStdString();
-
-        if (file)
-                audio.file = file;
-        else
-                audio.url = url.toStdString();
-
-        auto model = models.value(roomid);
-        if (!model->reply().isEmpty()) {
-                audio.relates_to.in_reply_to.event_id = model->reply().toStdString();
-                model->resetReply();
-        }
-
-        model->sendMessageEvent(audio, mtx::events::EventType::RoomMessage);
-}
-
-void
-TimelineViewManager::queueVideoMessage(const QString &roomid,
-                                       const QString &filename,
-                                       const std::optional<mtx::crypto::EncryptedFile> &file,
-                                       const QString &url,
-                                       const QString &mime,
-                                       uint64_t dsize)
-{
-        mtx::events::msg::Video video;
-        video.info.mimetype = mime.toStdString();
-        video.info.size     = dsize;
-        video.body          = filename.toStdString();
-
-        if (file)
-                video.file = file;
-        else
-                video.url = url.toStdString();
-
-        auto model = models.value(roomid);
-        if (!model->reply().isEmpty()) {
-                video.relates_to.in_reply_to.event_id = model->reply().toStdString();
-                model->resetReply();
-        }
-
-        model->sendMessageEvent(video, mtx::events::EventType::RoomMessage);
-}
-
 void
 TimelineViewManager::queueCallMessage(const QString &roomid,
                                       const mtx::events::msg::CallInvite &callInvite)
diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 02e0e132..371e9af2 100644
--- a/src/timeline/TimelineViewManager.h
+++ b/src/timeline/TimelineViewManager.h
@@ -41,6 +41,8 @@ class TimelineViewManager : public QObject
         Q_PROPERTY(QString callPartyName READ callPartyName NOTIFY callPartyChanged)
         Q_PROPERTY(QString callPartyAvatarUrl READ callPartyAvatarUrl NOTIFY callPartyChanged)
         Q_PROPERTY(bool isMicMuted READ isMicMuted NOTIFY micMuteChanged)
+        Q_PROPERTY(bool isOnCall READ isOnCall NOTIFY onCallChanged)
+        Q_PROPERTY(bool callsSupported READ callsSupported CONSTANT)
 
 public:
         TimelineViewManager(CallManager *callManager, ChatPage *parent = nullptr);
@@ -95,6 +97,7 @@ signals:
         void videoCallChanged();
         void callPartyChanged();
         void micMuteChanged();
+        void onCallChanged();
 
 public slots:
         void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
@@ -104,38 +107,14 @@ public slots:
         void setHistoryView(const QString &room_id);
         void updateColorPalette();
         void queueReactionMessage(const QString &reactedEvent, const QString &reactionKey);
-        void queueImageMessage(const QString &roomid,
-                               const QString &filename,
-                               const std::optional<mtx::crypto::EncryptedFile> &file,
-                               const QString &url,
-                               const QString &mime,
-                               uint64_t dsize,
-                               const QSize &dimensions,
-                               const QString &blurhash);
-        void queueFileMessage(const QString &roomid,
-                              const QString &filename,
-                              const std::optional<mtx::crypto::EncryptedFile> &file,
-                              const QString &url,
-                              const QString &mime,
-                              uint64_t dsize);
-        void queueAudioMessage(const QString &roomid,
-                               const QString &filename,
-                               const std::optional<mtx::crypto::EncryptedFile> &file,
-                               const QString &url,
-                               const QString &mime,
-                               uint64_t dsize);
-        void queueVideoMessage(const QString &roomid,
-                               const QString &filename,
-                               const std::optional<mtx::crypto::EncryptedFile> &file,
-                               const QString &url,
-                               const QString &mime,
-                               uint64_t dsize);
         void queueCallMessage(const QString &roomid, const mtx::events::msg::CallInvite &);
         void queueCallMessage(const QString &roomid, const mtx::events::msg::CallCandidates &);
         void queueCallMessage(const QString &roomid, const mtx::events::msg::CallAnswer &);
         void queueCallMessage(const QString &roomid, const mtx::events::msg::CallHangUp &);
 
         void updateEncryptedDescriptions();
+        bool isOnCall() const;
+        bool callsSupported() const;
 
         void enableBackButton()
         {