Make call invites less intrusive
This commit is contained in:
parent
ac410f46f2
commit
7124024977
13 changed files with 204 additions and 253 deletions
|
|
@ -10,10 +10,9 @@
|
|||
#include "CallManager.h"
|
||||
#include "ChatPage.h"
|
||||
#include "Logging.h"
|
||||
#include "MainWindow.h"
|
||||
#include "MatrixClient.h"
|
||||
#include "UserSettingsPage.h"
|
||||
#include "Utils.h"
|
||||
#include "dialogs/AcceptCall.h"
|
||||
|
||||
#include "mtx/responses/turn_server.hpp"
|
||||
|
||||
|
|
@ -114,6 +113,22 @@ CallManager::CallManager(QObject *parent)
|
|||
emit newCallState();
|
||||
});
|
||||
|
||||
connect(&session_, &WebRTCSession::devicesChanged, this, [this]() {
|
||||
if (ChatPage::instance()->userSettings()->microphone().isEmpty()) {
|
||||
auto mics = session_.getDeviceNames(false, std::string());
|
||||
if (!mics.empty())
|
||||
ChatPage::instance()->userSettings()->setMicrophone(
|
||||
QString::fromStdString(mics.front()));
|
||||
}
|
||||
if (ChatPage::instance()->userSettings()->camera().isEmpty()) {
|
||||
auto cameras = session_.getDeviceNames(true, std::string());
|
||||
if (!cameras.empty())
|
||||
ChatPage::instance()->userSettings()->setCamera(
|
||||
QString::fromStdString(cameras.front()));
|
||||
}
|
||||
emit devicesChanged();
|
||||
});
|
||||
|
||||
connect(&player_,
|
||||
&QMediaPlayer::mediaStatusChanged,
|
||||
this,
|
||||
|
|
@ -160,7 +175,8 @@ CallManager::sendInvite(const QString &roomid, bool isVideo)
|
|||
return;
|
||||
}
|
||||
|
||||
roomid_ = roomid;
|
||||
isVideo_ = isVideo;
|
||||
roomid_ = roomid;
|
||||
session_.setTurnServers(turnURIs_);
|
||||
generateCallID();
|
||||
nhlog::ui()->debug(
|
||||
|
|
@ -168,16 +184,14 @@ CallManager::sendInvite(const QString &roomid, bool isVideo)
|
|||
std::vector<RoomMember> members(cache::getMembers(roomid.toStdString()));
|
||||
const RoomMember &callee =
|
||||
members.front().user_id == utils::localUser() ? members.back() : members.front();
|
||||
callPartyName_ = callee.display_name.isEmpty() ? callee.user_id : callee.display_name;
|
||||
callParty_ = callee.display_name.isEmpty() ? callee.user_id : callee.display_name;
|
||||
callPartyAvatarUrl_ = QString::fromStdString(roomInfo.avatar_url);
|
||||
emit newCallParty();
|
||||
emit newInviteState();
|
||||
playRingtone(QUrl("qrc:/media/media/ringback.ogg"), true);
|
||||
if (!session_.createOffer(isVideo)) {
|
||||
emit ChatPage::instance()->showNotification("Problem setting up call.");
|
||||
endCall();
|
||||
}
|
||||
if (isVideo)
|
||||
emit newVideoCallState();
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
|
@ -271,48 +285,41 @@ CallManager::handleEvent(const RoomEvent<CallInvite> &callInviteEvent)
|
|||
std::vector<RoomMember> members(cache::getMembers(callInviteEvent.room_id));
|
||||
const RoomMember &caller =
|
||||
members.front().user_id == utils::localUser() ? members.back() : members.front();
|
||||
callPartyName_ = caller.display_name.isEmpty() ? caller.user_id : caller.display_name;
|
||||
callParty_ = caller.display_name.isEmpty() ? caller.user_id : caller.display_name;
|
||||
callPartyAvatarUrl_ = QString::fromStdString(roomInfo.avatar_url);
|
||||
emit newCallParty();
|
||||
auto dialog = new dialogs::AcceptCall(caller.user_id,
|
||||
caller.display_name,
|
||||
QString::fromStdString(roomInfo.name),
|
||||
QString::fromStdString(roomInfo.avatar_url),
|
||||
isVideo,
|
||||
MainWindow::instance());
|
||||
connect(dialog, &dialogs::AcceptCall::accept, this, [this, callInviteEvent, isVideo]() {
|
||||
MainWindow::instance()->hideOverlay();
|
||||
answerInvite(callInviteEvent.content, isVideo);
|
||||
});
|
||||
connect(dialog, &dialogs::AcceptCall::reject, this, [this]() {
|
||||
MainWindow::instance()->hideOverlay();
|
||||
hangUp();
|
||||
});
|
||||
MainWindow::instance()->showSolidOverlayModal(dialog);
|
||||
|
||||
haveCallInvite_ = true;
|
||||
isVideo_ = isVideo;
|
||||
inviteSDP_ = callInviteEvent.content.sdp;
|
||||
session_.refreshDevices();
|
||||
emit newInviteState();
|
||||
}
|
||||
|
||||
void
|
||||
CallManager::answerInvite(const CallInvite &invite, bool isVideo)
|
||||
CallManager::acceptInvite()
|
||||
{
|
||||
if (!haveCallInvite_)
|
||||
return;
|
||||
|
||||
stopRingtone();
|
||||
std::string errorMessage;
|
||||
if (!session_.havePlugins(false, &errorMessage) ||
|
||||
(isVideo && !session_.havePlugins(true, &errorMessage))) {
|
||||
(isVideo_ && !session_.havePlugins(true, &errorMessage))) {
|
||||
emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage));
|
||||
hangUp();
|
||||
return;
|
||||
}
|
||||
|
||||
session_.setTurnServers(turnURIs_);
|
||||
if (!session_.acceptOffer(invite.sdp)) {
|
||||
if (!session_.acceptOffer(inviteSDP_)) {
|
||||
emit ChatPage::instance()->showNotification("Problem setting up call.");
|
||||
hangUp();
|
||||
return;
|
||||
}
|
||||
session_.acceptICECandidates(remoteICECandidates_);
|
||||
remoteICECandidates_.clear();
|
||||
if (isVideo)
|
||||
emit newVideoCallState();
|
||||
haveCallInvite_ = false;
|
||||
emit newInviteState();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -348,7 +355,8 @@ CallManager::handleEvent(const RoomEvent<CallAnswer> &callAnswerEvent)
|
|||
callid_ == callAnswerEvent.content.call_id) {
|
||||
emit ChatPage::instance()->showNotification("Call answered on another device.");
|
||||
stopRingtone();
|
||||
MainWindow::instance()->hideOverlay();
|
||||
haveCallInvite_ = false;
|
||||
emit newInviteState();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -369,10 +377,8 @@ CallManager::handleEvent(const RoomEvent<CallHangUp> &callHangUpEvent)
|
|||
callHangUpReasonString(callHangUpEvent.content.reason),
|
||||
callHangUpEvent.sender);
|
||||
|
||||
if (callid_ == callHangUpEvent.content.call_id) {
|
||||
MainWindow::instance()->hideOverlay();
|
||||
if (callid_ == callHangUpEvent.content.call_id)
|
||||
endCall();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -392,6 +398,23 @@ CallManager::callsSupported() const
|
|||
#endif
|
||||
}
|
||||
|
||||
QStringList
|
||||
CallManager::devices(bool isVideo) const
|
||||
{
|
||||
QStringList ret;
|
||||
const QString &defaultDevice = isVideo ? ChatPage::instance()->userSettings()->camera()
|
||||
: ChatPage::instance()->userSettings()->microphone();
|
||||
std::vector<std::string> devices =
|
||||
session_.getDeviceNames(isVideo, defaultDevice.toStdString());
|
||||
ret.reserve(devices.size());
|
||||
std::transform(devices.cbegin(),
|
||||
devices.cend(),
|
||||
std::back_inserter(ret),
|
||||
[](const auto &d) { return QString::fromStdString(d); });
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
CallManager::generateCallID()
|
||||
{
|
||||
|
|
@ -404,9 +427,13 @@ void
|
|||
CallManager::clear()
|
||||
{
|
||||
roomid_.clear();
|
||||
callPartyName_.clear();
|
||||
callParty_.clear();
|
||||
callPartyAvatarUrl_.clear();
|
||||
callid_.clear();
|
||||
isVideo_ = false;
|
||||
haveCallInvite_ = false;
|
||||
emit newInviteState();
|
||||
inviteSDP_.clear();
|
||||
remoteICECandidates_.clear();
|
||||
}
|
||||
|
||||
|
|
@ -414,11 +441,8 @@ void
|
|||
CallManager::endCall()
|
||||
{
|
||||
stopRingtone();
|
||||
clear();
|
||||
bool isVideo = session_.isVideo();
|
||||
session_.end();
|
||||
if (isVideo)
|
||||
emit newVideoCallState();
|
||||
clear();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue