From 8d3ab300b650dcef3d12fe1e5a4bb14855e8495a Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Thu, 9 Jul 2020 00:45:37 +0200 Subject: [PATCH 01/54] Open url using QDesktopServices from Qml This fixes some weirdness on some platforms, where Qt.openUrlExternally does weird stuff. --- resources/qml/MatrixText.qml | 2 +- src/timeline/TimelineViewManager.cpp | 7 +++++++ src/timeline/TimelineViewManager.h | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/resources/qml/MatrixText.qml b/resources/qml/MatrixText.qml index 9a4f7348..d56143dd 100644 --- a/resources/qml/MatrixText.qml +++ b/resources/qml/MatrixText.qml @@ -16,7 +16,7 @@ TextEdit { timelineManager.setHistoryView(match[1]) chat.positionViewAtIndex(chat.model.idToIndex(match[2]), ListView.Contain) } - else Qt.openUrlExternally(link) + else timelineManager.openLink(link) } MouseArea { diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index 64af8afb..060f52fe 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -1,5 +1,6 @@ #include "TimelineViewManager.h" +#include #include #include #include @@ -219,6 +220,12 @@ TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) const }); } +void +TimelineViewManager::openLink(QString link) const +{ + QDesktopServices::openUrl(link); +} + void TimelineViewManager::updateReadReceipts(const QString &room_id, const std::vector &event_ids) diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h index ed095058..81a8b9b4 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h @@ -47,6 +47,8 @@ public: Q_INVOKABLE QString userPresence(QString id) const; Q_INVOKABLE QString userStatus(QString id) const; + Q_INVOKABLE void openLink(QString link) const; + signals: void clearRoomMessageCount(QString roomid); void updateRoomsLastMessage(QString roomid, const DescInfo &info); From 7650e6ced60aad073d5c5f4bf64b34be0655759f Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Thu, 9 Jul 2020 13:26:01 +0200 Subject: [PATCH 02/54] Fix autolinking breaking on single quotes in href attribute Fixes #234 --- src/Config.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Config.h b/src/Config.h index f99cf36b..c0624709 100644 --- a/src/Config.h +++ b/src/Config.h @@ -53,9 +53,9 @@ namespace strings { const QString url_html = "\\1"; const QRegularExpression url_regex( // match an URL, that is not quoted, i.e. - // vvvvvv match quote via negative lookahead/lookbehind vv - // vvvv atomic match url -> fail if there is a " before or after vvv - R"((?((www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'"]+[^!,\.\s<>'"\]\)\:]))(?!"))"); + // vvvvvv match quote via negative lookahead/lookbehind vv + // vvvv atomic match url -> fail if there is a " before or after vvv + R"((?((www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'"]+[^!,\.\s<>'"\]\)\:]))(?!["']))"); } // Window geometry. From 7a206441c86cd2aa84cbbbc6be803f03b2f355ab Mon Sep 17 00:00:00 2001 From: trilene Date: Fri, 10 Jul 2020 19:19:48 -0400 Subject: [PATCH 03/54] Support voice calls --- CMakeLists.txt | 16 + resources/langs/nheko_en.ts | 45 ++ resources/media/callend.mp3 | Bin 0 -> 12971 bytes resources/media/callend.ogg | Bin 0 -> 13932 bytes resources/media/ring.mp3 | Bin 0 -> 36119 bytes resources/media/ring.ogg | Bin 0 -> 66715 bytes resources/media/ringback.mp3 | Bin 0 -> 18398 bytes resources/media/ringback.ogg | Bin 0 -> 8352 bytes resources/qml/delegates/MessageDelegate.qml | 18 + resources/res.qrc | 5 + src/ActiveCallBar.cpp | 74 ++++ src/ActiveCallBar.h | 26 ++ src/Cache.cpp | 3 + src/CallManager.cpp | 315 ++++++++++++++ src/CallManager.h | 67 +++ src/ChatPage.cpp | 61 ++- src/ChatPage.h | 8 +- src/TextInputWidget.cpp | 26 ++ src/TextInputWidget.h | 3 + src/UserSettingsPage.cpp | 31 ++ src/UserSettingsPage.h | 7 + src/Utils.cpp | 40 +- src/Utils.h | 45 +- src/WebRTCSession.cpp | 438 ++++++++++++++++++++ src/WebRTCSession.h | 58 +++ src/dialogs/AcceptCall.cpp | 53 +++ src/dialogs/AcceptCall.h | 26 ++ src/dialogs/PlaceCall.cpp | 60 +++ src/dialogs/PlaceCall.h | 28 ++ src/timeline/TimelineModel.cpp | 209 +++++++--- src/timeline/TimelineModel.h | 21 +- src/timeline/TimelineViewManager.cpp | 60 ++- src/timeline/TimelineViewManager.h | 13 +- 33 files changed, 1655 insertions(+), 101 deletions(-) create mode 100644 resources/media/callend.mp3 create mode 100644 resources/media/callend.ogg create mode 100644 resources/media/ring.mp3 create mode 100644 resources/media/ring.ogg create mode 100644 resources/media/ringback.mp3 create mode 100644 resources/media/ringback.ogg create mode 100644 src/ActiveCallBar.cpp create mode 100644 src/ActiveCallBar.h create mode 100644 src/CallManager.cpp create mode 100644 src/CallManager.h create mode 100644 src/WebRTCSession.cpp create mode 100644 src/WebRTCSession.h create mode 100644 src/dialogs/AcceptCall.cpp create mode 100644 src/dialogs/AcceptCall.h create mode 100644 src/dialogs/PlaceCall.cpp create mode 100644 src/dialogs/PlaceCall.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 04baf360..5b47b0af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -227,6 +227,7 @@ configure_file(cmake/nheko.h config/nheko.h) # set(SRC_FILES # Dialogs + src/dialogs/AcceptCall.cpp src/dialogs/CreateRoom.cpp src/dialogs/FallbackAuth.cpp src/dialogs/ImageOverlay.cpp @@ -235,6 +236,7 @@ set(SRC_FILES src/dialogs/LeaveRoom.cpp src/dialogs/Logout.cpp src/dialogs/MemberList.cpp + src/dialogs/PlaceCall.cpp src/dialogs/PreviewUploadOverlay.cpp src/dialogs/ReCaptcha.cpp src/dialogs/ReadReceipts.cpp @@ -278,9 +280,11 @@ set(SRC_FILES src/ui/Theme.cpp src/ui/ThemeManager.cpp + src/ActiveCallBar.cpp src/AvatarProvider.cpp src/BlurhashProvider.cpp src/Cache.cpp + src/CallManager.cpp src/ChatPage.cpp src/ColorImageProvider.cpp src/CommunitiesList.cpp @@ -306,6 +310,7 @@ set(SRC_FILES src/UserInfoWidget.cpp src/UserSettingsPage.cpp src/Utils.cpp + src/WebRTCSession.cpp src/WelcomePage.cpp src/popups/PopupItem.cpp src/popups/SuggestionsPopup.cpp @@ -423,6 +428,10 @@ else() find_package(Tweeny REQUIRED) endif() +include(FindPkgConfig) +pkg_check_modules(GST_SDP REQUIRED IMPORTED_TARGET gstreamer-sdp-1.0>=1.14) +pkg_check_modules(GST_WEBRTC REQUIRED IMPORTED_TARGET gstreamer-webrtc-1.0>=1.14) + # single instance functionality set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication") add_subdirectory(third_party/SingleApplication-3.1.3.1/) @@ -431,6 +440,7 @@ feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAG qt5_wrap_cpp(MOC_HEADERS # Dialogs + src/dialogs/AcceptCall.h src/dialogs/CreateRoom.h src/dialogs/FallbackAuth.h src/dialogs/ImageOverlay.h @@ -439,6 +449,7 @@ qt5_wrap_cpp(MOC_HEADERS src/dialogs/LeaveRoom.h src/dialogs/Logout.h src/dialogs/MemberList.h + src/dialogs/PlaceCall.h src/dialogs/PreviewUploadOverlay.h src/dialogs/RawMessage.h src/dialogs/ReCaptcha.h @@ -482,9 +493,11 @@ qt5_wrap_cpp(MOC_HEADERS src/notifications/Manager.h + src/ActiveCallBar.h src/AvatarProvider.h src/BlurhashProvider.h src/Cache_p.h + src/CallManager.h src/ChatPage.h src/CommunitiesList.h src/CommunitiesListItem.h @@ -504,6 +517,7 @@ qt5_wrap_cpp(MOC_HEADERS src/TrayIcon.h src/UserInfoWidget.h src/UserSettingsPage.h + src/WebRTCSession.h src/WelcomePage.h src/popups/PopupItem.h src/popups/SuggestionsPopup.h @@ -583,6 +597,8 @@ target_link_libraries(nheko PRIVATE lmdbxx::lmdbxx liblmdb::lmdb tweeny + PkgConfig::GST_SDP + PkgConfig::GST_WEBRTC SingleApplication::SingleApplication) if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0") diff --git a/resources/langs/nheko_en.ts b/resources/langs/nheko_en.ts index db24f1fe..27d739f2 100644 --- a/resources/langs/nheko_en.ts +++ b/resources/langs/nheko_en.ts @@ -404,6 +404,21 @@ Example: https://server.my:8787 %1 created and configured room: %2 %1 created and configured room: %2 + + + %1 placed a voice call. + %1 placed a voice call. + + + + %1 answered the call. + %1 answered the call. + + + + %1 ended the call. + %1 ended the call. + Placeholder @@ -1796,6 +1811,36 @@ Media size: %2 %1 sent an encrypted message %1 sent an encrypted message + + + You placed a call + You placed a call + + + + %1 placed a call + %1 placed a call + + + + You answered a call + You answered a call + + + + %1 answered a call + %1 answered a call + + + + You ended a call + You ended a call + + + + %1 ended a call + %1 ended a call + popups::UserMentions diff --git a/resources/media/callend.mp3 b/resources/media/callend.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..50c34e56401d25f33db5fdf41c1fb1d223ff6cdd GIT binary patch literal 12971 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 YUFWf)L3S_z;CWn-{-am?|3CTv0)`V=SpWb4 literal 0 HcmV?d00001 diff --git a/resources/media/callend.ogg b/resources/media/callend.ogg new file mode 100644 index 0000000000000000000000000000000000000000..927ce1f6340a6d9c65bcb03d244b6c3346060443 GIT binary patch literal 13932 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 LM6ir(Ko0y5xc4|N literal 0 HcmV?d00001 diff --git a/resources/media/ring.mp3 b/resources/media/ring.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..36200cd89d5969b57cf75965e7b7701a7c001e14 GIT binary patch literal 36119 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 literal 0 HcmV?d00001 diff --git a/resources/media/ring.ogg b/resources/media/ring.ogg new file mode 100644 index 0000000000000000000000000000000000000000..708213bfaca2f520c2c3b10bc6b7a53574a909ba GIT binary patch literal 66715 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 literal 0 HcmV?d00001 diff --git a/resources/media/ringback.mp3 b/resources/media/ringback.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6ee34bf3953c5ec94dfecce2fa5bfc6756ed4732 GIT binary patch literal 18398 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 literal 0 HcmV?d00001 diff --git a/resources/qml/delegates/MessageDelegate.qml b/resources/qml/delegates/MessageDelegate.qml index 17fe7360..52e628be 100644 --- a/resources/qml/delegates/MessageDelegate.qml +++ b/resources/qml/delegates/MessageDelegate.qml @@ -90,6 +90,24 @@ Item { text: qsTr("%1 created and configured room: %2").arg(model.data.userName).arg(model.data.roomId) } } + DelegateChoice { + roleValue: MtxEvent.CallInvite + NoticeMessage { + text: qsTr("%1 placed a voice call.").arg(model.data.userName) + } + } + DelegateChoice { + roleValue: MtxEvent.CallAnswer + NoticeMessage { + text: qsTr("%1 answered the call.").arg(model.data.userName) + } + } + DelegateChoice { + roleValue: MtxEvent.CallHangUp + NoticeMessage { + text: qsTr("%1 ended the call.").arg(model.data.userName) + } + } DelegateChoice { // TODO: make a more complex formatter for the power levels. roleValue: MtxEvent.PowerLevels diff --git a/resources/res.qrc b/resources/res.qrc index 439ed97b..3fd3fc96 100644 --- a/resources/res.qrc +++ b/resources/res.qrc @@ -136,4 +136,9 @@ qml/delegates/Placeholder.qml qml/delegates/Reply.qml + + media/ring.ogg + media/ringback.ogg + media/callend.ogg + diff --git a/src/ActiveCallBar.cpp b/src/ActiveCallBar.cpp new file mode 100644 index 00000000..a5ef754d --- /dev/null +++ b/src/ActiveCallBar.cpp @@ -0,0 +1,74 @@ +#include +#include +#include +#include + +#include "ActiveCallBar.h" +#include "WebRTCSession.h" +#include "ui/FlatButton.h" + +ActiveCallBar::ActiveCallBar(QWidget *parent) + : QWidget(parent) +{ + setAutoFillBackground(true); + auto p = palette(); + p.setColor(backgroundRole(), Qt::green); + setPalette(p); + + QFont f; + f.setPointSizeF(f.pointSizeF()); + + const int fontHeight = QFontMetrics(f).height(); + const int widgetMargin = fontHeight / 3; + const int contentHeight = fontHeight * 3; + + setFixedHeight(contentHeight + widgetMargin); + + topLayout_ = new QHBoxLayout(this); + topLayout_->setSpacing(widgetMargin); + topLayout_->setContentsMargins( + 2 * widgetMargin, widgetMargin, 2 * widgetMargin, widgetMargin); + topLayout_->setSizeConstraint(QLayout::SetMinimumSize); + + QFont labelFont; + labelFont.setPointSizeF(labelFont.pointSizeF() * 1.2); + labelFont.setWeight(QFont::Medium); + + callPartyLabel_ = new QLabel(this); + callPartyLabel_->setFont(labelFont); + + // TODO microphone mute/unmute icons + muteBtn_ = new FlatButton(this); + QIcon muteIcon; + muteIcon.addFile(":/icons/icons/ui/do-not-disturb-rounded-sign.png"); + muteBtn_->setIcon(muteIcon); + muteBtn_->setIconSize(QSize(buttonSize_ / 2, buttonSize_ / 2)); + muteBtn_->setToolTip(tr("Mute Mic")); + muteBtn_->setFixedSize(buttonSize_, buttonSize_); + muteBtn_->setCornerRadius(buttonSize_ / 2); + connect(muteBtn_, &FlatButton::clicked, this, [this]() { + if (WebRTCSession::instance().toggleMuteAudioSrc(muted_)) { + QIcon icon; + if (muted_) { + muteBtn_->setToolTip("Unmute Mic"); + icon.addFile(":/icons/icons/ui/round-remove-button.png"); + } else { + muteBtn_->setToolTip("Mute Mic"); + icon.addFile(":/icons/icons/ui/do-not-disturb-rounded-sign.png"); + } + muteBtn_->setIcon(icon); + } + }); + + topLayout_->addWidget(callPartyLabel_, 0, Qt::AlignLeft); + topLayout_->addWidget(muteBtn_, 0, Qt::AlignRight); +} + +void +ActiveCallBar::setCallParty(const QString &userid, const QString &displayName) +{ + if (!displayName.isEmpty() && displayName != userid) + callPartyLabel_->setText("Active Call: " + displayName + " (" + userid + ")"); + else + callPartyLabel_->setText("Active Call: " + userid); +} diff --git a/src/ActiveCallBar.h b/src/ActiveCallBar.h new file mode 100644 index 00000000..dd01e2ad --- /dev/null +++ b/src/ActiveCallBar.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +class QHBoxLayout; +class QLabel; +class QString; +class FlatButton; + +class ActiveCallBar : public QWidget +{ + Q_OBJECT + +public: + ActiveCallBar(QWidget *parent = nullptr); + +public slots: + void setCallParty(const QString &userid, const QString &displayName); + +private: + QHBoxLayout *topLayout_ = nullptr; + QLabel *callPartyLabel_ = nullptr; + FlatButton *muteBtn_ = nullptr; + int buttonSize_ = 32; + bool muted_ = false; +}; diff --git a/src/Cache.cpp b/src/Cache.cpp index d9d1134e..d435dc56 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -1364,6 +1364,9 @@ Cache::getLastMessageInfo(lmdb::txn &txn, const std::string &room_id) if (!(obj["event"]["type"] == "m.room.message" || obj["event"]["type"] == "m.sticker" || + obj["event"]["type"] == "m.call.invite" || + obj["event"]["type"] == "m.call.answer" || + obj["event"]["type"] == "m.call.hangup" || obj["event"]["type"] == "m.room.encrypted")) continue; diff --git a/src/CallManager.cpp b/src/CallManager.cpp new file mode 100644 index 00000000..67aabced --- /dev/null +++ b/src/CallManager.cpp @@ -0,0 +1,315 @@ +#include + +#include +#include + +#include "CallManager.h" +#include "Cache.h" +#include "ChatPage.h" +#include "Logging.h" +#include "MainWindow.h" +#include "MatrixClient.h" +#include "UserSettingsPage.h" +#include "WebRTCSession.h" + +#include "dialogs/AcceptCall.h" + +Q_DECLARE_METATYPE(std::vector) +Q_DECLARE_METATYPE(mtx::responses::TurnServer) + +using namespace mtx::events; +using namespace mtx::events::msg; + +// TODO Allow altenative in settings +#define STUN_SERVER "stun://turn.matrix.org:3478" + +CallManager::CallManager(QSharedPointer userSettings) + : QObject(), + session_(WebRTCSession::instance()), + turnServerTimer_(this), + settings_(userSettings) +{ + qRegisterMetaType>(); + qRegisterMetaType(); + + connect(&session_, &WebRTCSession::offerCreated, this, + [this](const std::string &sdp, + const std::vector& candidates) + { + nhlog::ui()->debug("Offer created with callid_ and roomid_: {} {}", callid_, roomid_.toStdString()); + emit newMessage(roomid_, CallInvite{callid_, sdp, 0, timeoutms_}); + emit newMessage(roomid_, CallCandidates{callid_, candidates, 0}); + }); + + connect(&session_, &WebRTCSession::answerCreated, this, + [this](const std::string &sdp, + const std::vector& candidates) + { + nhlog::ui()->debug("Answer created with callid_ and roomid_: {} {}", callid_, roomid_.toStdString()); + emit newMessage(roomid_, CallAnswer{callid_, sdp, 0}); + emit newMessage(roomid_, CallCandidates{callid_, candidates, 0}); + }); + + connect(&turnServerTimer_, &QTimer::timeout, this, &CallManager::retrieveTurnServer); + turnServerTimer_.start(2000); + + connect(this, &CallManager::turnServerRetrieved, this, + [this](const mtx::responses::TurnServer &res) + { + nhlog::net()->info("TURN server(s) retrieved from homeserver:"); + nhlog::net()->info("username: {}", res.username); + nhlog::net()->info("ttl: {}", res.ttl); + for (const auto &u : res.uris) + nhlog::net()->info("uri: {}", u); + + turnServer_ = res; + turnServerTimer_.setInterval(res.ttl * 1000 * 0.9); + }); + + connect(&session_, &WebRTCSession::pipelineChanged, this, + [this](bool started) { + if (!started) + playRingtone("qrc:/media/media/callend.ogg", false); + }); + + connect(&player_, &QMediaPlayer::mediaStatusChanged, this, + [this](QMediaPlayer::MediaStatus status) { + if (status == QMediaPlayer::LoadedMedia) + player_.play(); + }); +} + +void +CallManager::sendInvite(const QString &roomid) +{ + if (onActiveCall()) + return; + + std::vector members(cache::getMembers(roomid.toStdString())); + if (members.size() != 2) { + emit ChatPage::instance()->showNotification("Voice/Video calls are limited to 1:1 rooms"); + return; + } + + std::string errorMessage; + if (!session_.init(&errorMessage)) { + emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage)); + return; + } + + roomid_ = roomid; + setTurnServers(); + session_.setStunServer(settings_->useStunServer() ? STUN_SERVER : ""); + + // TODO Add invite timeout + generateCallID(); + const RoomMember &callee = members.front().user_id == utils::localUser() ? members.back() : members.front(); + emit newCallParty(callee.user_id, callee.display_name); + playRingtone("qrc:/media/media/ringback.ogg", true); + if (!session_.createOffer()) { + emit ChatPage::instance()->showNotification("Problem setting up call"); + endCall(); + } +} + +void +CallManager::hangUp() +{ + nhlog::ui()->debug("CallManager::hangUp: roomid_: {}", roomid_.toStdString()); + if (!callid_.empty()) { + emit newMessage(roomid_, CallHangUp{callid_, 0, CallHangUp::Reason::User}); + endCall(); + } +} + +bool +CallManager::onActiveCall() +{ + return session_.isActive(); +} + +void CallManager::syncEvent(const mtx::events::collections::TimelineEvents &event) +{ + if (handleEvent_(event) || handleEvent_(event) + || handleEvent_(event) || handleEvent_(event)) + return; +} + +template +bool +CallManager::handleEvent_(const mtx::events::collections::TimelineEvents &event) +{ + if (std::holds_alternative>(event)) { + handleEvent(std::get>(event)); + return true; + } + return false; +} + +void +CallManager::handleEvent(const RoomEvent &callInviteEvent) +{ + nhlog::ui()->debug("CallManager::incoming CallInvite from {} with id {}", callInviteEvent.sender, callInviteEvent.content.call_id); + + if (callInviteEvent.content.call_id.empty()) + return; + + std::vector members(cache::getMembers(callInviteEvent.room_id)); + if (onActiveCall() || members.size() != 2) { + emit newMessage(QString::fromStdString(callInviteEvent.room_id), + CallHangUp{callInviteEvent.content.call_id, 0, CallHangUp::Reason::InviteTimeOut}); + return; + } + + playRingtone("qrc:/media/media/ring.ogg", true); + roomid_ = QString::fromStdString(callInviteEvent.room_id); + callid_ = callInviteEvent.content.call_id; + remoteICECandidates_.clear(); + + const RoomMember &caller = members.front().user_id == utils::localUser() ? members.back() : members.front(); + emit newCallParty(caller.user_id, caller.display_name); + + auto dialog = new dialogs::AcceptCall(caller.user_id, caller.display_name, MainWindow::instance()); + connect(dialog, &dialogs::AcceptCall::accept, this, + [this, callInviteEvent](){ + MainWindow::instance()->hideOverlay(); + answerInvite(callInviteEvent.content);}); + connect(dialog, &dialogs::AcceptCall::reject, this, + [this](){ + MainWindow::instance()->hideOverlay(); + hangUp();}); + MainWindow::instance()->showSolidOverlayModal(dialog); +} + +void +CallManager::answerInvite(const CallInvite &invite) +{ + stopRingtone(); + std::string errorMessage; + if (!session_.init(&errorMessage)) { + emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage)); + hangUp(); + return; + } + + setTurnServers(); + session_.setStunServer(settings_->useStunServer() ? STUN_SERVER : ""); + + if (!session_.acceptOffer(invite.sdp)) { + emit ChatPage::instance()->showNotification("Problem setting up call"); + hangUp(); + return; + } + session_.acceptICECandidates(remoteICECandidates_); + remoteICECandidates_.clear(); +} + +void +CallManager::handleEvent(const RoomEvent &callCandidatesEvent) +{ + nhlog::ui()->debug("CallManager::incoming CallCandidates from {} with id {}", callCandidatesEvent.sender, callCandidatesEvent.content.call_id); + if (callid_ == callCandidatesEvent.content.call_id) { + if (onActiveCall()) + session_.acceptICECandidates(callCandidatesEvent.content.candidates); + else { + // CallInvite has been received and we're awaiting localUser to accept or reject the call + for (const auto &c : callCandidatesEvent.content.candidates) + remoteICECandidates_.push_back(c); + } + } +} + +void +CallManager::handleEvent(const RoomEvent &callAnswerEvent) +{ + nhlog::ui()->debug("CallManager::incoming CallAnswer from {} with id {}", callAnswerEvent.sender, callAnswerEvent.content.call_id); + if (onActiveCall() && callid_ == callAnswerEvent.content.call_id) { + stopRingtone(); + if (!session_.acceptAnswer(callAnswerEvent.content.sdp)) { + emit ChatPage::instance()->showNotification("Problem setting up call"); + hangUp(); + } + } +} + +void +CallManager::handleEvent(const RoomEvent &callHangUpEvent) +{ + nhlog::ui()->debug("CallManager::incoming CallHangUp from {} with id {}", callHangUpEvent.sender, callHangUpEvent.content.call_id); + if (onActiveCall() && callid_ == callHangUpEvent.content.call_id) + endCall(); +} + +void +CallManager::generateCallID() +{ + using namespace std::chrono; + uint64_t ms = duration_cast(system_clock::now().time_since_epoch()).count(); + callid_ = "c" + std::to_string(ms); +} + +void +CallManager::endCall() +{ + stopRingtone(); + session_.end(); + roomid_.clear(); + callid_.clear(); + remoteICECandidates_.clear(); +} + +void +CallManager::retrieveTurnServer() +{ + http::client()->get_turn_server( + [this](const mtx::responses::TurnServer &res, mtx::http::RequestErr err) { + if (err) { + turnServerTimer_.setInterval(5000); + return; + } + emit turnServerRetrieved(res); + }); +} + +void +CallManager::setTurnServers() +{ + // gstreamer expects (percent-encoded): turn(s)://username:password@host:port?transport=udp(tcp) + std::vector uris; + for (const auto &uri : turnServer_.uris) { + if (auto c = uri.find(':'); c == std::string::npos) { + nhlog::ui()->error("Invalid TURN server uri: {}", uri); + continue; + } + else { + std::string scheme = std::string(uri, 0, c); + if (scheme != "turn" && scheme != "turns") { + nhlog::ui()->error("Invalid TURN server uri: {}", uri); + continue; + } + std::string res = scheme + "://" + turnServer_.username + ":" + turnServer_.password + + "@" + std::string(uri, ++c); + QString encodedUri = QUrl::toPercentEncoding(QString::fromStdString(res)); + uris.push_back(encodedUri.toStdString()); + } + } + if (!uris.empty()) + session_.setTurnServers(uris); +} + +void +CallManager::playRingtone(const QString &ringtone, bool repeat) +{ + static QMediaPlaylist playlist; + playlist.clear(); + playlist.setPlaybackMode(repeat ? QMediaPlaylist::CurrentItemInLoop : QMediaPlaylist::CurrentItemOnce); + playlist.addMedia(QUrl(ringtone)); + player_.setVolume(100); + player_.setPlaylist(&playlist); +} + +void +CallManager::stopRingtone() +{ + player_.setPlaylist(nullptr); +} diff --git a/src/CallManager.h b/src/CallManager.h new file mode 100644 index 00000000..8a93241f --- /dev/null +++ b/src/CallManager.h @@ -0,0 +1,67 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include + +#include "mtx/events/collections.hpp" +#include "mtx/events/voip.hpp" +#include "mtx/responses/turn_server.hpp" + +class UserSettings; +class WebRTCSession; + +class CallManager : public QObject +{ + Q_OBJECT + +public: + CallManager(QSharedPointer); + + void sendInvite(const QString &roomid); + void hangUp(); + bool onActiveCall(); + +public slots: + void syncEvent(const mtx::events::collections::TimelineEvents &event); + +signals: + void newMessage(const QString &roomid, const mtx::events::msg::CallInvite&); + void newMessage(const QString &roomid, const mtx::events::msg::CallCandidates&); + void newMessage(const QString &roomid, const mtx::events::msg::CallAnswer&); + void newMessage(const QString &roomid, const mtx::events::msg::CallHangUp&); + void turnServerRetrieved(const mtx::responses::TurnServer&); + void newCallParty(const QString &userid, const QString& displayName); + +private slots: + void retrieveTurnServer(); + +private: + WebRTCSession& session_; + QString roomid_; + std::string callid_; + const uint32_t timeoutms_ = 120000; + std::vector remoteICECandidates_; + mtx::responses::TurnServer turnServer_; + QTimer turnServerTimer_; + QSharedPointer settings_; + QMediaPlayer player_; + + template + bool handleEvent_(const mtx::events::collections::TimelineEvents &event); + void handleEvent(const mtx::events::RoomEvent&); + void handleEvent(const mtx::events::RoomEvent&); + void handleEvent(const mtx::events::RoomEvent&); + void handleEvent(const mtx::events::RoomEvent&); + void answerInvite(const mtx::events::msg::CallInvite&); + void generateCallID(); + void endCall(); + void setTurnServers(); + void playRingtone(const QString &ringtone, bool repeat); + void stopRingtone(); +}; diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 3b8af33a..1bea8564 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -22,6 +22,7 @@ #include #include +#include "ActiveCallBar.h" #include "AvatarProvider.h" #include "Cache.h" #include "Cache_p.h" @@ -40,11 +41,13 @@ #include "UserInfoWidget.h" #include "UserSettingsPage.h" #include "Utils.h" +#include "WebRTCSession.h" #include "ui/OverlayModal.h" #include "ui/Theme.h" #include "notifications/Manager.h" +#include "dialogs/PlaceCall.h" #include "dialogs/ReadReceipts.h" #include "popups/UserMentions.h" #include "timeline/TimelineViewManager.h" @@ -68,6 +71,7 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) , isConnected_(true) , userSettings_{userSettings} , notificationsManager(this) + , callManager_(userSettings) { setObjectName("chatPage"); @@ -123,11 +127,26 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) contentLayout_->setMargin(0); top_bar_ = new TopRoomBar(this); - view_manager_ = new TimelineViewManager(userSettings_, this); + view_manager_ = new TimelineViewManager(userSettings_, &callManager_, this); contentLayout_->addWidget(top_bar_); contentLayout_->addWidget(view_manager_->getWidget()); + activeCallBar_ = new ActiveCallBar(this); + contentLayout_->addWidget(activeCallBar_); + activeCallBar_->hide(); + connect( + &callManager_, &CallManager::newCallParty, activeCallBar_, &ActiveCallBar::setCallParty); + connect(&WebRTCSession::instance(), + &WebRTCSession::pipelineChanged, + this, + [this](bool callStarted) { + if (callStarted) + activeCallBar_->show(); + else + activeCallBar_->hide(); + }); + // Splitter splitter->addWidget(sideBar_); splitter->addWidget(content_); @@ -446,6 +465,31 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) roomid, filename, encryptedFile, url, mime, dsize); }); + connect(text_input_, &TextInputWidget::callButtonPress, this, [this]() { + if (callManager_.onActiveCall()) { + callManager_.hangUp(); + } else { + if (cache::singleRoomInfo(current_room_.toStdString()).member_count != 2) { + showNotification("Voice/Video calls are limited to 1:1 rooms"); + } else { + std::vector 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, this); + connect(dialog, &dialogs::PlaceCall::voice, this, [this]() { + callManager_.sendInvite(current_room_); + }); + connect(dialog, &dialogs::PlaceCall::video, this, [this]() { + showNotification("Video calls not yet implemented"); + }); + dialog->show(); + } + } + }); + connect(room_list_, &RoomList::roomAvatarChanged, this, &ChatPage::updateTopBarAvatar); connect( @@ -569,6 +613,11 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) connect(this, &ChatPage::dropToLoginPageCb, this, &ChatPage::dropToLoginPage); + connectCallMessage(); + connectCallMessage(); + connectCallMessage(); + connectCallMessage(); + instance_ = this; } @@ -1430,3 +1479,13 @@ ChatPage::initiateLogout() emit showOverlayProgressBar(); } + +template +void +ChatPage::connectCallMessage() +{ + connect(&callManager_, + qOverload(&CallManager::newMessage), + view_manager_, + qOverload(&TimelineViewManager::queueCallMessage)); +} diff --git a/src/ChatPage.h b/src/ChatPage.h index c38d7717..fe63c9d9 100644 --- a/src/ChatPage.h +++ b/src/ChatPage.h @@ -35,11 +35,13 @@ #include #include "CacheStructs.h" +#include "CallManager.h" #include "CommunitiesList.h" #include "Utils.h" #include "notifications/Manager.h" #include "popups/UserMentions.h" +class ActiveCallBar; class OverlayModal; class QuickSwitcher; class RoomList; @@ -50,7 +52,6 @@ class TimelineViewManager; class TopRoomBar; class UserInfoWidget; class UserSettings; -class NotificationsManager; constexpr int CONSENSUS_TIMEOUT = 1000; constexpr int SHOW_CONTENT_TIMEOUT = 3000; @@ -216,6 +217,9 @@ private: void showNotificationsDialog(const QPoint &point); + template + void connectCallMessage(); + QHBoxLayout *topLayout_; Splitter *splitter; @@ -235,6 +239,7 @@ private: TopRoomBar *top_bar_; TextInputWidget *text_input_; + ActiveCallBar *activeCallBar_; QTimer connectivityTimer_; std::atomic_bool isConnected_; @@ -252,6 +257,7 @@ private: QSharedPointer userSettings_; NotificationsManager notificationsManager; + CallManager callManager_; }; template diff --git a/src/TextInputWidget.cpp b/src/TextInputWidget.cpp index 3e3915bb..2be0b404 100644 --- a/src/TextInputWidget.cpp +++ b/src/TextInputWidget.cpp @@ -31,6 +31,7 @@ #include "Logging.h" #include "TextInputWidget.h" #include "Utils.h" +#include "WebRTCSession.h" #include "ui/FlatButton.h" #include "ui/LoadingIndicator.h" @@ -453,6 +454,13 @@ TextInputWidget::TextInputWidget(QWidget *parent) topLayout_->setSpacing(0); topLayout_->setContentsMargins(13, 1, 13, 0); + callBtn_ = new FlatButton(this); + changeCallButtonState(false); + connect(&WebRTCSession::instance(), + &WebRTCSession::pipelineChanged, + this, + &TextInputWidget::changeCallButtonState); + QIcon send_file_icon; send_file_icon.addFile(":/icons/icons/ui/paper-clip-outline.png"); @@ -521,6 +529,7 @@ TextInputWidget::TextInputWidget(QWidget *parent) emojiBtn_->setIcon(emoji_icon); emojiBtn_->setIconSize(QSize(ButtonHeight, ButtonHeight)); + topLayout_->addWidget(callBtn_); topLayout_->addWidget(sendFileBtn_); topLayout_->addWidget(input_); topLayout_->addWidget(emojiBtn_); @@ -528,6 +537,7 @@ TextInputWidget::TextInputWidget(QWidget *parent) setLayout(topLayout_); + connect(callBtn_, &FlatButton::clicked, this, &TextInputWidget::callButtonPress); connect(sendMessageBtn_, &FlatButton::clicked, input_, &FilteredTextEdit::submit); connect(sendFileBtn_, SIGNAL(clicked()), this, SLOT(openFileSelection())); connect(input_, &FilteredTextEdit::message, this, &TextInputWidget::sendTextMessage); @@ -652,3 +662,19 @@ TextInputWidget::paintEvent(QPaintEvent *) style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } + +void +TextInputWidget::changeCallButtonState(bool callStarted) +{ + // TODO Telephone and HangUp icons - co-opt the ones below for now + QIcon icon; + if (callStarted) { + callBtn_->setToolTip(tr("Hang up")); + icon.addFile(":/icons/icons/ui/remove-symbol.png"); + } else { + callBtn_->setToolTip(tr("Place a call")); + icon.addFile(":/icons/icons/ui/speech-bubbles-comment-option.png"); + } + callBtn_->setIcon(icon); + callBtn_->setIconSize(QSize(ButtonHeight, ButtonHeight)); +} diff --git a/src/TextInputWidget.h b/src/TextInputWidget.h index a0105eb0..ae58f4e3 100644 --- a/src/TextInputWidget.h +++ b/src/TextInputWidget.h @@ -149,6 +149,7 @@ public slots: void openFileSelection(); void hideUploadSpinner(); void focusLineEdit() { input_->setFocus(); } + void changeCallButtonState(bool callStarted); private slots: void addSelectedEmoji(const QString &emoji); @@ -161,6 +162,7 @@ signals: void uploadMedia(const QSharedPointer data, QString mimeClass, const QString &filename); + void callButtonPress(); void sendJoinRoomRequest(const QString &room); void sendInviteRoomRequest(const QString &userid, const QString &reason); @@ -185,6 +187,7 @@ private: LoadingIndicator *spinner_; + FlatButton *callBtn_; FlatButton *sendFileBtn_; FlatButton *sendMessageBtn_; emoji::PickButton *emojiBtn_; diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp index 05ff6d38..e67da997 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp @@ -77,6 +77,7 @@ UserSettings::load() presence_ = settings.value("user/presence", QVariant::fromValue(Presence::AutomaticPresence)) .value(); + useStunServer_ = settings.value("user/use_stun_server", false).toBool(); applyTheme(); } @@ -279,6 +280,16 @@ UserSettings::setTheme(QString theme) emit themeChanged(theme); } +void +UserSettings::setUseStunServer(bool useStunServer) +{ + if (useStunServer == useStunServer_) + return; + useStunServer_ = useStunServer; + emit useStunServerChanged(useStunServer); + save(); +} + void UserSettings::applyTheme() { @@ -364,6 +375,7 @@ UserSettings::save() settings.setValue("font_family", font_); settings.setValue("emoji_font_family", emojiFont_); settings.setValue("presence", QVariant::fromValue(presence_)); + settings.setValue("use_stun_server", useStunServer_); settings.endGroup(); @@ -429,6 +441,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidge markdown_ = new Toggle{this}; desktopNotifications_ = new Toggle{this}; alertOnNotification_ = new Toggle{this}; + useStunServer_ = new Toggle{this}; scaleFactorCombo_ = new QComboBox{this}; fontSizeCombo_ = new QComboBox{this}; fontSelectionCombo_ = new QComboBox{this}; @@ -482,6 +495,12 @@ UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidge timelineMaxWidthSpin_->setMaximum(100'000'000); timelineMaxWidthSpin_->setSingleStep(10); + auto callsLabel = new QLabel{tr("CALLS"), this}; + callsLabel->setFixedHeight(callsLabel->minimumHeight() + LayoutTopMargin); + callsLabel->setAlignment(Qt::AlignBottom); + callsLabel->setFont(font); + useStunServer_ = new Toggle{this}; + auto encryptionLabel_ = new QLabel{tr("ENCRYPTION"), this}; encryptionLabel_->setFixedHeight(encryptionLabel_->minimumHeight() + LayoutTopMargin); encryptionLabel_->setAlignment(Qt::AlignBottom); @@ -612,6 +631,13 @@ UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidge #endif boxWrap(tr("Theme"), themeCombo_); + + formLayout_->addRow(callsLabel); + formLayout_->addRow(new HorizontalLine{this}); + boxWrap(tr("Allow Fallback Call Assist Server"), + useStunServer_, + tr("Will use turn.matrix.org as assist when your home server does not offer one.")); + formLayout_->addRow(encryptionLabel_); formLayout_->addRow(new HorizontalLine{this}); boxWrap(tr("Device ID"), deviceIdValue_); @@ -724,6 +750,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidge settings_->setEnlargeEmojiOnlyMessages(!disabled); }); + connect(useStunServer_, &Toggle::toggled, this, [this](bool disabled) { + settings_->setUseStunServer(!disabled); + }); + connect(timelineMaxWidthSpin_, qOverload(&QSpinBox::valueChanged), this, @@ -766,6 +796,7 @@ UserSettingsPage::showEvent(QShowEvent *) enlargeEmojiOnlyMessages_->setState(!settings_->enlargeEmojiOnlyMessages()); deviceIdValue_->setText(QString::fromStdString(http::client()->device_id())); timelineMaxWidthSpin_->setValue(settings_->timelineMaxWidth()); + useStunServer_->setState(!settings_->useStunServer()); deviceFingerprintValue_->setText( utils::humanReadableFingerprint(olm::client()->identity_keys().ed25519)); diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h index d2a1c641..567a7520 100644 --- a/src/UserSettingsPage.h +++ b/src/UserSettingsPage.h @@ -71,6 +71,8 @@ class UserSettings : public QObject Q_PROPERTY( QString emojiFont READ emojiFont WRITE setEmojiFontFamily NOTIFY emojiFontChanged) Q_PROPERTY(Presence presence READ presence WRITE setPresence NOTIFY presenceChanged) + Q_PROPERTY( + bool useStunServer READ useStunServer WRITE setUseStunServer NOTIFY useStunServerChanged) public: UserSettings(); @@ -107,6 +109,7 @@ public: void setAvatarCircles(bool state); void setDecryptSidebar(bool state); void setPresence(Presence state); + void setUseStunServer(bool state); QString theme() const { return !theme_.isEmpty() ? theme_ : defaultTheme_; } bool messageHoverHighlight() const { return messageHoverHighlight_; } @@ -132,6 +135,7 @@ public: QString font() const { return font_; } QString emojiFont() const { return emojiFont_; } Presence presence() const { return presence_; } + bool useStunServer() const { return useStunServer_; } signals: void groupViewStateChanged(bool state); @@ -154,6 +158,7 @@ signals: void fontChanged(QString state); void emojiFontChanged(QString state); void presenceChanged(Presence state); + void useStunServerChanged(bool state); private: // Default to system theme if QT_QPA_PLATFORMTHEME var is set. @@ -181,6 +186,7 @@ private: QString font_; QString emojiFont_; Presence presence_; + bool useStunServer_; }; class HorizontalLine : public QFrame @@ -234,6 +240,7 @@ private: Toggle *desktopNotifications_; Toggle *alertOnNotification_; Toggle *avatarCircles_; + Toggle *useStunServer_; Toggle *decryptSidebar_; QLabel *deviceFingerprintValue_; QLabel *deviceIdValue_; diff --git a/src/Utils.cpp b/src/Utils.cpp index 26ea124c..0bfc82c3 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -35,14 +35,13 @@ createDescriptionInfo(const Event &event, const QString &localUser, const QStrin const auto username = cache::displayName(room_id, sender); const auto ts = QDateTime::fromMSecsSinceEpoch(msg.origin_server_ts); - return DescInfo{ - QString::fromStdString(msg.event_id), - sender, - utils::messageDescription( - username, QString::fromStdString(msg.content.body).trimmed(), sender == localUser), - utils::descriptiveTime(ts), - msg.origin_server_ts, - ts}; + return DescInfo{QString::fromStdString(msg.event_id), + sender, + utils::messageDescription( + username, utils::event_body(event).trimmed(), sender == localUser), + utils::descriptiveTime(ts), + msg.origin_server_ts, + ts}; } QString @@ -156,14 +155,17 @@ utils::getMessageDescription(const TimelineEvent &event, const QString &localUser, const QString &room_id) { - using Audio = mtx::events::RoomEvent; - using Emote = mtx::events::RoomEvent; - using File = mtx::events::RoomEvent; - using Image = mtx::events::RoomEvent; - using Notice = mtx::events::RoomEvent; - using Text = mtx::events::RoomEvent; - using Video = mtx::events::RoomEvent; - using Encrypted = mtx::events::EncryptedEvent; + using Audio = mtx::events::RoomEvent; + using Emote = mtx::events::RoomEvent; + using File = mtx::events::RoomEvent; + using Image = mtx::events::RoomEvent; + using Notice = mtx::events::RoomEvent; + using Text = mtx::events::RoomEvent; + using Video = mtx::events::RoomEvent; + using CallInvite = mtx::events::RoomEvent; + using CallAnswer = mtx::events::RoomEvent; + using CallHangUp = mtx::events::RoomEvent; + using Encrypted = mtx::events::EncryptedEvent; if (std::holds_alternative