Skip to content
Snippets Groups Projects
Commit 0c3b2df6 authored by Albert  Babí Oller's avatar Albert Babí Oller Committed by Albert Babí Oller
Browse files

conference: host can add or remove moderator for a conference or rendez-vous

Change-Id: I89d3ef02fea54448f3b7bc38da5550cc52d6cbcd
parent c472fe83
No related branches found
No related tags found
No related merge requests found
......@@ -264,6 +264,7 @@ CallAdapter::getConferencesInfos()
data["y"] = participant["y"].toInt();
data["w"] = participant["w"].toInt();
data["h"] = participant["h"].toInt();
data["uri"] = participant["uri"];
data["active"] = participant["active"] == "true";
auto bestName = participant["uri"];
auto& accInfo = LRCInstance::accountModel().getAccountInfo(accountId_);
......@@ -622,6 +623,44 @@ CallAdapter::isCurrentHost() const
return true;
}
bool
CallAdapter::participantIsHost(const QString& uri) const
{
auto* convModel = LRCInstance::getCurrentConversationModel();
const auto convInfo = convModel->getConversationForUID(convUid_);
if (!convInfo.uid.isEmpty()) {
auto& accInfo = LRCInstance::getAccountInfo(accountId_);
auto* callModel = accInfo.callModel.get();
try {
auto call = callModel->getCall(convInfo.callId);
if (call.participantsInfos.size() == 0) {
return (uri.isEmpty() || uri == accInfo.profileInfo.uri);
} else {
return !convInfo.confId.isEmpty()
&& callModel->hasCall(convInfo.confId)
&& (uri.isEmpty() || uri == accInfo.profileInfo.uri);
}
} catch (...) {
}
}
return true;
}
bool
CallAdapter::isModerator(const QString& uri) const
{
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
auto* convModel = LRCInstance::getCurrentConversationModel();
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
auto confId = conversation.confId;
if (confId.isEmpty())
confId = conversation.callId;
try {
return callModel->isModerator(confId, uri);
} catch (...) {}
return false;
}
bool
CallAdapter::isCurrentModerator() const
{
......@@ -647,6 +686,21 @@ CallAdapter::isCurrentModerator() const
return true;
}
void
CallAdapter::setModerator(const QString& uri, const bool state)
{
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
auto* convModel = LRCInstance::getCurrentConversationModel();
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
auto confId = conversation.confId;
if (confId.isEmpty())
confId = conversation.callId;
try {
callModel->setModerator(confId, uri, state);
} catch (...) {}
}
int
CallAdapter::getCurrentLayoutType() const
{
......
......@@ -56,8 +56,11 @@ public:
Q_INVOKABLE void maximizeParticipant(const QString& uri, bool isActive);
Q_INVOKABLE void minimizeParticipant();
Q_INVOKABLE void hangUpThisCall();
Q_INVOKABLE bool isCurrentModerator() const;
Q_INVOKABLE void setModerator(const QString& uri, const bool state);
Q_INVOKABLE bool isCurrentHost() const;
Q_INVOKABLE bool participantIsHost(const QString& uri = {}) const;
Q_INVOKABLE bool isModerator(const QString& uri = {}) const;
Q_INVOKABLE bool isCurrentModerator() const;
Q_INVOKABLE int getCurrentLayoutType() const;
Q_INVOKABLE void holdThisCallToggle();
Q_INVOKABLE void muteThisCallToggle();
......
......@@ -35,6 +35,8 @@ Item {
property var showHangup: false
property var showMaximize: false
property var showMinimize: false
property var showSetModerator: false
property var showUnsetModerator: false
function openMenu(){
ContextMenuGenerator.initMenu()
......@@ -58,6 +60,20 @@ Item {
CallAdapter.minimizeParticipant()
})
if (showSetModerator)
ContextMenuGenerator.addMenuItem(qsTr("Set moderator"),
"qrc:/images/icons/person_add-24px.svg",
function (){
CallAdapter.setModerator(uri, true)
})
if (showUnsetModerator)
ContextMenuGenerator.addMenuItem(qsTr("Unset moderator"),
"qrc:/images/icons/round-close-24px.svg",
function (){
CallAdapter.setModerator(uri, false)
})
root.height = ContextMenuGenerator.getMenu().height
root.width = ContextMenuGenerator.getMenu().width
ContextMenuGenerator.getMenu().open()
......
......@@ -155,6 +155,9 @@ Rectangle {
var layout = CallAdapter.getCurrentLayoutType()
var showMaximized = layout !== 2
var showMinimized = !(layout === 0 || (layout === 1 && !active))
var isModerator = CallAdapter.isModerator(uri)
var isHost = CallAdapter.isCurrentHost()
var participantIsHost = CallAdapter.participantIsHost(uri)
injectedContextMenu.showHangup = !root.isLocal && showEndCall
injectedContextMenu.showMaximize = showMaximized
injectedContextMenu.showMinimize = showMinimized
......@@ -162,6 +165,8 @@ Rectangle {
injectedContextMenu.active = active
injectedContextMenu.x = mousePos.x
injectedContextMenu.y = mousePos.y - injectedContextMenu.height
injectedContextMenu.showSetModerator = (isHost && !participantIsHost && !isModerator)
injectedContextMenu.showUnsetModerator = (isHost && !participantIsHost && isModerator)
injectedContextMenu.openMenu()
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment