diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index 5cbc33e0..3cddd613 100644
--- a/src/timeline/InputBar.cpp
+++ b/src/timeline/InputBar.cpp
@@ -13,7 +13,6 @@
#include <mtx/responses/media.hpp>
#include "Cache.h"
-#include "CallManager.h"
#include "ChatPage.h"
#include "CompletionProxyModel.h"
#include "Logging.h"
@@ -25,7 +24,6 @@
#include "UserSettingsPage.h"
#include "UsersModel.h"
#include "Utils.h"
-#include "dialogs/PlaceCall.h"
#include "dialogs/PreviewUploadOverlay.h"
#include "emoji/EmojiModel.h"
@@ -594,48 +592,6 @@ 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();
- }
- }
-}
-
-void
InputBar::startTyping()
{
if (!typingRefresh_.isActive()) {
diff --git a/src/timeline/InputBar.h b/src/timeline/InputBar.h
index 27aa4bc3..c729a6fc 100644
--- a/src/timeline/InputBar.h
+++ b/src/timeline/InputBar.h
@@ -41,7 +41,7 @@ public slots:
void updateState(int selectionStart, int selectionEnd, int cursorPosition, QString text);
void openFileSelection();
bool uploading() const { return uploading_; }
- void callButton();
+ void message(QString body);
QObject *completerFor(QString completerName);
@@ -54,7 +54,6 @@ signals:
void uploadingChanged(bool value);
private:
- void message(QString body);
void emote(QString body);
void command(QString name, QString args);
void image(const QString &filename,
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index adef886d..852f584d 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -613,8 +613,15 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline)
std::visit(
[this](auto &event) {
event.room_id = room_id_.toStdString();
- if (event.sender != http::client()->user_id().to_string())
+ if constexpr (std::is_same_v<std::decay_t<decltype(event)>,
+ RoomEvent<msg::CallAnswer>> ||
+ std::is_same_v<std::decay_t<decltype(event)>,
+ RoomEvent<msg::CallHangUp>>)
emit newCallEvent(event);
+ else {
+ if (event.sender != http::client()->user_id().to_string())
+ emit newCallEvent(event);
+ }
},
e);
else if (std::holds_alternative<StateEvent<state::Avatar>>(e))
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 03eb53fc..97af0065 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -136,6 +136,10 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
"im.nheko", 1, 0, "Settings", [](QQmlEngine *, QJSEngine *) -> QObject * {
return ChatPage::instance()->userSettings().data();
});
+ qmlRegisterSingletonType<CallManager>(
+ "im.nheko", 1, 0, "CallManager", [](QQmlEngine *, QJSEngine *) -> QObject * {
+ return ChatPage::instance()->callManager();
+ });
qRegisterMetaType<mtx::events::collections::TimelineEvents>();
qRegisterMetaType<std::vector<DeviceInfo>>();
@@ -237,36 +241,6 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
isInitialSync_ = true;
emit initialSyncChanged(true);
});
- connect(&WebRTCSession::instance(),
- &WebRTCSession::stateChanged,
- this,
- &TimelineViewManager::callStateChanged);
- connect(
- callManager_, &CallManager::newCallParty, this, &TimelineViewManager::callPartyChanged);
- connect(callManager_,
- &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
@@ -297,13 +271,20 @@ TimelineViewManager::sync(const mtx::responses::Rooms &rooms)
&CallManager::syncEvent);
if (ChatPage::instance()->userSettings()->typingNotifications()) {
- std::vector<QString> typing;
- typing.reserve(room.ephemeral.typing.size());
- for (const auto &user : room.ephemeral.typing) {
- if (user != http::client()->user_id().to_string())
- typing.push_back(QString::fromStdString(user));
+ for (const auto &ev : room.ephemeral.events) {
+ if (auto t = std::get_if<
+ mtx::events::EphemeralEvent<mtx::events::ephemeral::Typing>>(
+ &ev)) {
+ std::vector<QString> typing;
+ typing.reserve(t->content.user_ids.size());
+ for (const auto &user : t->content.user_ids) {
+ if (user != http::client()->user_id().to_string())
+ typing.push_back(
+ QString::fromStdString(user));
+ }
+ room_model->updateTypingUsers(typing);
+ }
}
- room_model->updateTypingUsers(typing);
}
}
@@ -348,19 +329,6 @@ TimelineViewManager::escapeEmoji(QString str) const
}
void
-TimelineViewManager::toggleMicMute()
-{
- WebRTCSession::instance().toggleMicMute();
- emit micMuteChanged();
-}
-
-void
-TimelineViewManager::toggleCameraView()
-{
- WebRTCSession::instance().toggleCameraView();
-}
-
-void
TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) const
{
if (mxcUrl.isEmpty()) {
@@ -502,6 +470,18 @@ TimelineViewManager::initWithMessages(const std::vector<QString> &roomIds)
}
void
+TimelineViewManager::queueReply(const QString &roomid,
+ const QString &repliedToEvent,
+ const QString &replyBody)
+{
+ auto room = models.find(roomid);
+ if (room != models.end()) {
+ room.value()->setReply(repliedToEvent);
+ room.value()->input()->message(replyBody);
+ }
+}
+
+void
TimelineViewManager::queueReactionMessage(const QString &reactedEvent, const QString &reactionKey)
{
if (!timeline_)
diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index f346acf8..23a960b8 100644
--- a/src/timeline/TimelineViewManager.h
+++ b/src/timeline/TimelineViewManager.h
@@ -36,13 +36,6 @@ class TimelineViewManager : public QObject
bool isInitialSync MEMBER isInitialSync_ READ isInitialSync NOTIFY initialSyncChanged)
Q_PROPERTY(
bool isNarrowView MEMBER isNarrowView_ READ isNarrowView NOTIFY narrowViewChanged)
- Q_PROPERTY(webrtc::State callState READ callState NOTIFY callStateChanged)
- Q_PROPERTY(bool onVideoCall READ onVideoCall NOTIFY videoCallChanged)
- 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);
@@ -61,14 +54,6 @@ public:
Q_INVOKABLE TimelineModel *activeTimeline() const { return timeline_; }
Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; }
bool isNarrowView() const { return isNarrowView_; }
- webrtc::State callState() const { return WebRTCSession::instance().state(); }
- bool onVideoCall() const { return WebRTCSession::instance().isVideo(); }
- Q_INVOKABLE void setVideoCallItem();
- QString callPartyName() const { return callManager_->callPartyName(); }
- QString callPartyAvatarUrl() const { return callManager_->callPartyAvatarUrl(); }
- bool isMicMuted() const { return WebRTCSession::instance().isMicMuted(); }
- Q_INVOKABLE void toggleMicMute();
- Q_INVOKABLE void toggleCameraView();
Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId) const;
Q_INVOKABLE QColor userColor(QString id, QColor background);
Q_INVOKABLE QString escapeEmoji(QString str) const;
@@ -98,11 +83,6 @@ signals:
void inviteUsers(QStringList users);
void showRoomList();
void narrowViewChanged();
- void callStateChanged(webrtc::State);
- void videoCallChanged();
- void callPartyChanged();
- void micMuteChanged();
- void onCallChanged();
public slots:
void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
@@ -120,6 +100,9 @@ public slots:
}
void updateColorPalette();
+ void queueReply(const QString &roomid,
+ const QString &repliedToEvent,
+ const QString &replyBody);
void queueReactionMessage(const QString &reactedEvent, const QString &reactionKey);
void queueCallMessage(const QString &roomid, const mtx::events::msg::CallInvite &);
void queueCallMessage(const QString &roomid, const mtx::events::msg::CallCandidates &);
@@ -127,8 +110,7 @@ public slots:
void queueCallMessage(const QString &roomid, const mtx::events::msg::CallHangUp &);
void updateEncryptedDescriptions();
- bool isOnCall() const;
- bool callsSupported() const;
+ void setVideoCallItem();
void enableBackButton()
{
|