1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-04-22 06:02:03 +02:00

lrc: avoid excessive copying of conversation info objects

1. Container View api
2. use optional conversation info ref api

Change-Id: I38aa57edc1fbf304ea0ef95d48000e0495c409ee
This commit is contained in:
Mingrui Zhang 2020-12-15 11:55:38 -05:00 committed by Ming Rui Zhang
parent 44ebb170ff
commit 9ef94561a5
14 changed files with 204 additions and 283 deletions

View file

@ -379,17 +379,16 @@ AccountAdapter::connectAccount(const QString& accountId)
= QObject::connect(accInfo.contactModel.get(), = QObject::connect(accInfo.contactModel.get(),
&lrc::api::ContactModel::contactAdded, &lrc::api::ContactModel::contactAdded,
[this, accountId](const QString& contactUri) { [this, accountId](const QString& contactUri) {
auto& accInfo = LRCInstance::accountModel().getAccountInfo( const auto& convInfo = LRCInstance::getConversationFromConvUid(
accountId);
auto* convModel = LRCInstance::getCurrentConversationModel();
const auto conversation = convModel->getConversationForUID(
LRCInstance::getCurrentConvUid()); LRCInstance::getCurrentConvUid());
if (conversation.uid.isEmpty()) { if (convInfo.uid.isEmpty()) {
return; return;
} }
auto& accInfo = LRCInstance::accountModel().getAccountInfo(
accountId);
if (contactUri if (contactUri
== accInfo.contactModel == accInfo.contactModel
->getContact(conversation.participants.at(0)) ->getContact(convInfo.participants.at(0))
.profileInfo.uri) { .profileInfo.uri) {
/* /*
* Update conversation. * Update conversation.

View file

@ -234,9 +234,8 @@ AvAdapter::stopAudioMeter(bool async)
const QString& const QString&
AvAdapter::getCurrentCallId() AvAdapter::getCurrentCallId()
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(LRCInstance::getCurrentConvUid());
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid()); auto call = LRCInstance::getCallInfoForConversation(convInfo);
auto call = LRCInstance::getCallInfoForConversation(conversation);
if (!call) if (!call)
return QString(); return QString();
return call->id; return call->id;

View file

@ -19,6 +19,7 @@
#pragma once #pragma once
#include "utils.h" #include "utils.h"
#include "lrcinstance.h"
#include <QImage> #include <QImage>
#include <QQuickImageProvider> #include <QQuickImageProvider>
@ -57,9 +58,8 @@ public:
return Utils::accountPhoto(LRCInstance::accountModel().getAccountInfo(idContent), return Utils::accountPhoto(LRCInstance::accountModel().getAccountInfo(idContent),
requestedSize); requestedSize);
} else if (idType == "conversation") { } else if (idType == "conversation") {
auto* convModel = LRCInstance::getCurrentAccountInfo().conversationModel.get(); const auto& convInfo = LRCInstance::getConversationFromConvUid(idContent);
const auto& conv = convModel->getConversationForUID(idContent); return Utils::contactPhoto(convInfo.participants[0], requestedSize);
return Utils::contactPhoto(conv.participants[0], requestedSize);
} else if (idType == "contact") { } else if (idType == "contact") {
return Utils::contactPhoto(idContent, requestedSize); return Utils::contactPhoto(idContent, requestedSize);
} else if (idType == "fallback") { } else if (idType == "fallback") {

View file

@ -1,4 +1,4 @@
/* /*!
* Copyright (C) 2020 by Savoir-faire Linux * Copyright (C) 2020 by Savoir-faire Linux
* Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com> * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>
* Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com> * Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com>
@ -37,19 +37,21 @@ CallAdapter::CallAdapter(QObject* parent)
connect(&LRCInstance::behaviorController(), connect(&LRCInstance::behaviorController(),
&BehaviorController::showIncomingCallView, &BehaviorController::showIncomingCallView,
this, this,
&CallAdapter::slotShowIncomingCallView); &CallAdapter::onShowIncomingCallView);
connect(&LRCInstance::instance(),
&LRCInstance::currentAccountChanged,
this,
&CallAdapter::slotAccountChanged);
connect(&LRCInstance::behaviorController(), connect(&LRCInstance::behaviorController(),
&BehaviorController::showCallView, &BehaviorController::showCallView,
this, this,
&CallAdapter::slotShowCallView); &CallAdapter::onShowCallView);
connect(&LRCInstance::instance(),
&LRCInstance::currentAccountChanged,
this,
&CallAdapter::onAccountChanged);
} }
void void
CallAdapter::slotAccountChanged() CallAdapter::onAccountChanged()
{ {
accountId_ = LRCInstance::getCurrAccId(); accountId_ = LRCInstance::getCurrAccId();
connectCallModel(accountId_); connectCallModel(accountId_);
@ -76,8 +78,7 @@ CallAdapter::placeCall()
void void
CallAdapter::hangUpACall(const QString& accountId, const QString& convUid) CallAdapter::hangUpACall(const QString& accountId, const QString& convUid)
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
const auto convInfo = convModel->getConversationForUID(convUid);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
LRCInstance::getAccountInfo(accountId).callModel->hangUp(convInfo.callId); LRCInstance::getAccountInfo(accountId).callModel->hangUp(convInfo.callId);
} }
@ -86,8 +87,7 @@ CallAdapter::hangUpACall(const QString& accountId, const QString& convUid)
void void
CallAdapter::refuseACall(const QString& accountId, const QString& convUid) CallAdapter::refuseACall(const QString& accountId, const QString& convUid)
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
const auto convInfo = convModel->getConversationForUID(convUid);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
LRCInstance::getAccountInfo(accountId).callModel->refuse(convInfo.callId); LRCInstance::getAccountInfo(accountId).callModel->refuse(convInfo.callId);
} }
@ -96,8 +96,7 @@ CallAdapter::refuseACall(const QString& accountId, const QString& convUid)
void void
CallAdapter::acceptACall(const QString& accountId, const QString& convUid) CallAdapter::acceptACall(const QString& accountId, const QString& convUid)
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
const auto convInfo = convModel->getConversationForUID(convUid);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
LRCInstance::getAccountInfo(accountId).callModel->accept(convInfo.callId); LRCInstance::getAccountInfo(accountId).callModel->accept(convInfo.callId);
auto& accInfo = LRCInstance::getAccountInfo(convInfo.accountId); auto& accInfo = LRCInstance::getAccountInfo(convInfo.accountId);
@ -118,11 +117,14 @@ CallAdapter::acceptACall(const QString& accountId, const QString& convUid)
} }
void void
CallAdapter::slotShowIncomingCallView(const QString& accountId, const conversation::Info& convInfo) CallAdapter::onShowIncomingCallView(const QString& accountId, const QString& convUid)
{ {
const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
if (convInfo.uid.isEmpty()) {
return;
}
auto selectedAccountId = LRCInstance::getCurrAccId(); auto selectedAccountId = LRCInstance::getCurrAccId();
auto* callModel = LRCInstance::getCurrentCallModel(); auto* callModel = LRCInstance::getCurrentCallModel();
auto* convModel = LRCInstance::getCurrentConversationModel();
if (!callModel->hasCall(convInfo.callId)) { if (!callModel->hasCall(convInfo.callId)) {
if (QApplication::focusObject() == nullptr || accountId != selectedAccountId) { if (QApplication::focusObject() == nullptr || accountId != selectedAccountId) {
@ -130,8 +132,8 @@ CallAdapter::slotShowIncomingCallView(const QString& accountId, const conversati
return; return;
} }
const auto currentConvUid = LRCInstance::getCurrentConvUid(); const auto& currentConvInfo = LRCInstance::getConversationFromConvUid(
const auto currentConvInfo = convModel->getConversationForUID(currentConvUid); LRCInstance::getCurrentConvUid());
// Current call // Current call
auto currentConvHasCall = callModel->hasCall(currentConvInfo.callId); auto currentConvHasCall = callModel->hasCall(currentConvInfo.callId);
@ -164,8 +166,8 @@ CallAdapter::slotShowIncomingCallView(const QString& accountId, const conversati
return; return;
} }
const auto currentConvUid = LRCInstance::getCurrentConvUid(); const auto& currentConvInfo = LRCInstance::getConversationFromConvUid(
const auto currentConvInfo = convModel->getConversationForUID(currentConvUid); LRCInstance::getCurrentConvUid());
// Call in current conversation // Call in current conversation
auto currentConvHasCall = callModel->hasCall(currentConvInfo.callId); auto currentConvHasCall = callModel->hasCall(currentConvInfo.callId);
@ -202,8 +204,12 @@ CallAdapter::slotShowIncomingCallView(const QString& accountId, const conversati
} }
void void
CallAdapter::slotShowCallView(const QString& accountId, const lrc::api::conversation::Info& convInfo) CallAdapter::onShowCallView(const QString& accountId, const QString& convUid)
{ {
const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
if (convInfo.uid.isEmpty()) {
return;
}
updateCall(convInfo.uid, accountId); updateCall(convInfo.uid, accountId);
} }
@ -213,8 +219,7 @@ CallAdapter::updateCall(const QString& convUid, const QString& accountId, bool f
accountId_ = accountId.isEmpty() ? accountId_ : accountId; accountId_ = accountId.isEmpty() ? accountId_ : accountId;
convUid_ = convUid.isEmpty() ? convUid_ : convUid; convUid_ = convUid.isEmpty() ? convUid_ : convUid;
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto convInfo = convModel->getConversationForUID(convUid_);
if (convInfo.uid.isEmpty()) { if (convInfo.uid.isEmpty()) {
return; return;
} }
@ -238,8 +243,8 @@ bool
CallAdapter::shouldShowPreview(bool force) CallAdapter::shouldShowPreview(bool force)
{ {
bool shouldShowPreview {false}; bool shouldShowPreview {false};
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto convInfo = convModel->getConversationForUID(convUid_);
if (convInfo.uid.isEmpty()) { if (convInfo.uid.isEmpty()) {
return shouldShowPreview; return shouldShowPreview;
} }
@ -255,8 +260,7 @@ QVariantList
CallAdapter::getConferencesInfos() CallAdapter::getConferencesInfos()
{ {
QVariantList map; QVariantList map;
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto convInfo = convModel->getConversationForUID(convUid_);
if (convInfo.uid.isEmpty()) if (convInfo.uid.isEmpty())
return map; return map;
auto callId = convInfo.confId.isEmpty() ? convInfo.callId : convInfo.confId; auto callId = convInfo.confId.isEmpty() ? convInfo.callId : convInfo.confId;
@ -299,18 +303,20 @@ void
CallAdapter::showNotification(const QString& accountId, const QString& convUid) CallAdapter::showNotification(const QString& accountId, const QString& convUid)
{ {
QString from {}; QString from {};
auto convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
if (!accountId.isEmpty() && !convInfo.uid.isEmpty()) { if (!accountId.isEmpty() && !convInfo.uid.isEmpty()) {
auto& accInfo = LRCInstance::getAccountInfo(accountId); auto& accInfo = LRCInstance::getAccountInfo(accountId);
if (!convInfo.participants.isEmpty()) if (!convInfo.participants.isEmpty())
from = accInfo.contactModel->bestNameForContact(convInfo.participants[0]); from = accInfo.contactModel->bestNameForContact(convInfo.participants[0]);
} }
auto onClicked = [this, convInfo]() { auto onClicked = [this, accountId, convUid = convInfo.uid]() {
emit LRCInstance::instance().notificationClicked(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
if (!convInfo.uid.isEmpty()) { if (convInfo.uid.isEmpty()) {
emit callSetupMainViewRequired(convInfo.accountId, convInfo.uid); return;
} }
emit LRCInstance::instance().notificationClicked();
emit callSetupMainViewRequired(convInfo.accountId, convInfo.uid);
}; };
emit LRCInstance::instance().updateSmartList(); emit LRCInstance::instance().updateSmartList();
Utils::showNotification(tr("is calling you"), from, accountId, convUid, onClicked); Utils::showNotification(tr("is calling you"), from, accountId, convUid, onClicked);
@ -331,7 +337,7 @@ CallAdapter::connectCallModel(const QString& accountId)
auto& accInfo = LRCInstance::accountModel().getAccountInfo(accountId); auto& accInfo = LRCInstance::accountModel().getAccountInfo(accountId);
auto& callModel = accInfo.callModel; auto& callModel = accInfo.callModel;
auto call = callModel->getCall(confId); auto call = callModel->getCall(confId);
const auto convInfo = LRCInstance::getConversationFromCallId(confId); const auto& convInfo = LRCInstance::getConversationFromCallId(confId);
bool currentMuted = false; bool currentMuted = false;
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
// Convert to QML // Convert to QML
@ -371,8 +377,7 @@ CallAdapter::connectCallModel(const QString& accountId)
} }
// Link local mute to conference mute // Link local mute to conference mute
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto convInfo = convModel->getConversationForUID(convUid_);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto call = LRCInstance::getCallInfoForConversation(convInfo); auto call = LRCInstance::getCallInfoForConversation(convInfo);
if (call) { if (call) {
@ -397,7 +402,7 @@ CallAdapter::connectCallModel(const QString& accountId)
/* /*
* Change status label text. * Change status label text.
*/ */
const auto convInfo = LRCInstance::getConversationFromCallId(callId); const auto& convInfo = LRCInstance::getConversationFromCallId(callId);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
emit callStatusChanged(static_cast<int>(call.status), accountId, convInfo.uid); emit callStatusChanged(static_cast<int>(call.status), accountId, convInfo.uid);
updateCallOverlay(convInfo); updateCallOverlay(convInfo);
@ -439,7 +444,7 @@ CallAdapter::connectCallModel(const QString& accountId)
} }
auto currentCall = callModel->getCall(callId); auto currentCall = callModel->getCall(callId);
if (currentCall.status == lrc::api::call::Status::IN_PROGRESS) { if (currentCall.status == lrc::api::call::Status::IN_PROGRESS) {
auto otherConv = LRCInstance::getConversationFromCallId(callId); const auto& otherConv = LRCInstance::getConversationFromCallId(callId);
if (!otherConv.uid.isEmpty() && otherConv.uid != convInfo.uid) { if (!otherConv.uid.isEmpty() && otherConv.uid != convInfo.uid) {
/* /*
* Reset the call view corresponding accountId, uid. * Reset the call view corresponding accountId, uid.
@ -454,7 +459,7 @@ CallAdapter::connectCallModel(const QString& accountId)
} }
case lrc::api::call::Status::CONNECTED: case lrc::api::call::Status::CONNECTED:
case lrc::api::call::Status::IN_PROGRESS: { case lrc::api::call::Status::IN_PROGRESS: {
const auto convInfo = LRCInstance::getConversationFromCallId(callId, accountId); const auto& convInfo = LRCInstance::getConversationFromCallId(callId, accountId);
if (!convInfo.uid.isEmpty() && convInfo.uid == LRCInstance::getCurrentConvUid()) { if (!convInfo.uid.isEmpty() && convInfo.uid == LRCInstance::getCurrentConvUid()) {
accInfo.conversationModel->selectConversation(convInfo.uid); accInfo.conversationModel->selectConversation(convInfo.uid);
} }
@ -517,7 +522,7 @@ CallAdapter::updateCallOverlay(const lrc::api::conversation::Info& convInfo)
oneSecondTimer_->start(20); oneSecondTimer_->start(20);
auto& accInfo = LRCInstance::accountModel().getAccountInfo(accountId_); auto& accInfo = LRCInstance::accountModel().getAccountInfo(accountId_);
auto call = LRCInstance::getCallInfoForConversation(convInfo); auto* call = LRCInstance::getCallInfoForConversation(convInfo);
if (!call) { if (!call) {
return; return;
} }
@ -544,7 +549,7 @@ CallAdapter::updateCallOverlay(const lrc::api::conversation::Info& convInfo)
void void
CallAdapter::hangupCall(const QString& uri) CallAdapter::hangupCall(const QString& uri)
{ {
const auto convInfo = LRCInstance::getConversationFromPeerUri(uri, accountId_); const auto& convInfo = LRCInstance::getConversationFromPeerUri(uri, accountId_);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
if (callModel->hasCall(convInfo.callId)) { if (callModel->hasCall(convInfo.callId)) {
@ -571,11 +576,12 @@ void
CallAdapter::maximizeParticipant(const QString& uri) CallAdapter::maximizeParticipant(const QString& uri)
{ {
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(LRCInstance::getCurrentConvUid(),
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid()); accountId_);
auto confId = conversation.confId;
auto confId = convInfo.confId;
if (confId.isEmpty()) if (confId.isEmpty())
confId = conversation.callId; confId = convInfo.callId;
try { try {
auto call = callModel->getCall(confId); auto call = callModel->getCall(confId);
if (call.participantsInfos.size() > 0) { if (call.participantsInfos.size() > 0) {
@ -603,12 +609,12 @@ void
CallAdapter::minimizeParticipant(const QString& uri) CallAdapter::minimizeParticipant(const QString& uri)
{ {
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(LRCInstance::getCurrentConvUid(),
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid()); accountId_);
auto confId = conversation.confId; auto confId = convInfo.confId;
if (confId.isEmpty()) if (confId.isEmpty())
confId = conversation.callId; confId = convInfo.callId;
try { try {
auto call = callModel->getCall(confId); auto call = callModel->getCall(confId);
if (call.participantsInfos.size() > 0) { if (call.participantsInfos.size() > 0) {
@ -633,8 +639,7 @@ CallAdapter::minimizeParticipant(const QString& uri)
void void
CallAdapter::hangUpThisCall() CallAdapter::hangUpThisCall()
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
const auto convInfo = convModel->getConversationForUID(convUid_);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
if (!convInfo.confId.isEmpty() && callModel->hasCall(convInfo.confId)) { if (!convInfo.confId.isEmpty() && callModel->hasCall(convInfo.confId)) {
@ -648,9 +653,8 @@ CallAdapter::hangUpThisCall()
bool bool
CallAdapter::isRecordingThisCall() CallAdapter::isRecordingThisCall()
{ {
const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
auto& accInfo = LRCInstance::accountModel().getAccountInfo(accountId_); auto& accInfo = LRCInstance::accountModel().getAccountInfo(accountId_);
auto& convModel = accInfo.conversationModel;
const auto convInfo = convModel->getConversationForUID(convUid_);
return accInfo.callModel->isRecording(convInfo.confId) return accInfo.callModel->isRecording(convInfo.confId)
|| accInfo.callModel->isRecording(convInfo.callId); || accInfo.callModel->isRecording(convInfo.callId);
} }
@ -658,8 +662,7 @@ CallAdapter::isRecordingThisCall()
bool bool
CallAdapter::isCurrentHost() const CallAdapter::isCurrentHost() const
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_, accountId_);
const auto convInfo = convModel->getConversationForUID(convUid_);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
try { try {
@ -681,8 +684,7 @@ CallAdapter::isCurrentHost() const
bool bool
CallAdapter::participantIsHost(const QString& uri) const CallAdapter::participantIsHost(const QString& uri) const
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto convInfo = convModel->getConversationForUID(convUid_);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto& accInfo = LRCInstance::getAccountInfo(accountId_); auto& accInfo = LRCInstance::getAccountInfo(accountId_);
auto* callModel = accInfo.callModel.get(); auto* callModel = accInfo.callModel.get();
@ -704,11 +706,11 @@ bool
CallAdapter::isModerator(const QString& uri) const CallAdapter::isModerator(const QString& uri) const
{ {
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid()); auto confId = convInfo.confId;
auto confId = conversation.confId;
if (confId.isEmpty()) if (confId.isEmpty())
confId = conversation.callId; confId = convInfo.callId;
try { try {
return callModel->isModerator(confId, uri); return callModel->isModerator(confId, uri);
} catch (...) { } catch (...) {
@ -719,8 +721,7 @@ CallAdapter::isModerator(const QString& uri) const
bool bool
CallAdapter::isCurrentModerator() const CallAdapter::isCurrentModerator() const
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto convInfo = convModel->getConversationForUID(convUid_);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
try { try {
@ -745,11 +746,10 @@ void
CallAdapter::setModerator(const QString& uri, const bool state) CallAdapter::setModerator(const QString& uri, const bool state)
{ {
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid()); auto confId = convInfo.confId;
auto confId = conversation.confId;
if (confId.isEmpty()) if (confId.isEmpty())
confId = conversation.callId; confId = convInfo.callId;
try { try {
callModel->setModerator(confId, uri, state); callModel->setModerator(confId, uri, state);
} catch (...) { } catch (...) {
@ -760,11 +760,11 @@ void
CallAdapter::muteParticipant(const QString& uri, const bool state) CallAdapter::muteParticipant(const QString& uri, const bool state)
{ {
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid()); auto confId = convInfo.confId;
auto confId = conversation.confId;
if (confId.isEmpty()) if (confId.isEmpty())
confId = conversation.callId; confId = convInfo.callId;
try { try {
const auto call = callModel->getCall(confId); const auto call = callModel->getCall(confId);
callModel->muteParticipant(confId, uri, state); callModel->muteParticipant(confId, uri, state);
@ -775,8 +775,7 @@ CallAdapter::muteParticipant(const QString& uri, const bool state)
bool bool
CallAdapter::isMuted(const QString& uri) const CallAdapter::isMuted(const QString& uri) const
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto convInfo = convModel->getConversationForUID(convUid_);
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
auto confId = convInfo.confId.isEmpty() ? convInfo.callId : convInfo.confId; auto confId = convInfo.confId.isEmpty() ? convInfo.callId : convInfo.confId;
try { try {
@ -799,11 +798,11 @@ void
CallAdapter::hangupParticipant(const QString& uri) CallAdapter::hangupParticipant(const QString& uri)
{ {
auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get(); auto* callModel = LRCInstance::getAccountInfo(accountId_).callModel.get();
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid_);
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid()); auto confId = convInfo.confId;
auto confId = conversation.confId;
if (confId.isEmpty()) if (confId.isEmpty())
confId = conversation.callId; confId = convInfo.callId;
try { try {
const auto call = callModel->getCall(confId); const auto call = callModel->getCall(confId);
callModel->hangupParticipant(confId, uri); callModel->hangupParticipant(confId, uri);

View file

@ -1,4 +1,4 @@
/* /*!
* Copyright (C) 2020 by Savoir-faire Linux * Copyright (C) 2020 by Savoir-faire Linux
* Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com> * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
* Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com> * Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
@ -99,10 +99,9 @@ signals:
void remoteRecordingChanged(const QStringList& peers, bool state); void remoteRecordingChanged(const QStringList& peers, bool state);
public slots: public slots:
void slotShowIncomingCallView(const QString& accountId, void onShowIncomingCallView(const QString& accountId, const QString& convUid);
const lrc::api::conversation::Info& convInfo); void onShowCallView(const QString& accountId, const QString& convUid);
void slotShowCallView(const QString& accountId, const lrc::api::conversation::Info& convInfo); void onAccountChanged();
void slotAccountChanged();
private: private:
bool shouldShowPreview(bool force); bool shouldShowPreview(bool force);

View file

@ -35,10 +35,7 @@ ContactAdapter::getContactSelectableModel(int type)
* Called from qml every time contact picker refreshes. * Called from qml every time contact picker refreshes.
*/ */
listModeltype_ = static_cast<SmartListModel::Type>(type); listModeltype_ = static_cast<SmartListModel::Type>(type);
smartListModel_.reset(new SmartListModel(this, smartListModel_.reset(new SmartListModel(this, listModeltype_));
LRCInstance::getCurrAccId(),
listModeltype_,
LRCInstance::getCurrentConvUid()));
selectableProxyModel_->setSourceModel(smartListModel_.get()); selectableProxyModel_->setSourceModel(smartListModel_.get());
/* /*
@ -90,9 +87,7 @@ ContactAdapter::contactSelected(int index)
{ {
auto contactIndex = selectableProxyModel_->index(index, 0); auto contactIndex = selectableProxyModel_->index(index, 0);
auto* callModel = LRCInstance::getCurrentCallModel(); auto* callModel = LRCInstance::getCurrentCallModel();
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(LRCInstance::getCurrentConvUid());
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
if (contactIndex.isValid()) { if (contactIndex.isValid()) {
switch (listModeltype_) { switch (listModeltype_) {
case SmartListModel::Type::CONFERENCE: { case SmartListModel::Type::CONFERENCE: {
@ -111,16 +106,15 @@ ContactAdapter::contactSelected(int index)
const auto callId = LRCInstance::getCallIdForConversationUid(convUid, accId); const auto callId = LRCInstance::getCallIdForConversationUid(convUid, accId);
if (!callId.isEmpty()) { if (!callId.isEmpty()) {
if (conversation.uid.isEmpty()) { if (convInfo.uid.isEmpty()) {
return; return;
} }
auto thisCallId = conversation.confId.isEmpty() ? conversation.callId auto thisCallId = convInfo.confId.isEmpty() ? convInfo.callId : convInfo.confId;
: conversation.confId;
callModel->joinCalls(thisCallId, callId); callModel->joinCalls(thisCallId, callId);
} else { } else {
const auto contactUri = contactIndex.data(SmartListModel::Role::URI).value<QString>(); const auto contactUri = contactIndex.data(SmartListModel::Role::URI).value<QString>();
auto call = LRCInstance::getCallInfoForConversation(conversation); auto call = LRCInstance::getCallInfoForConversation(convInfo);
if (!call) { if (!call) {
return; return;
} }
@ -133,11 +127,10 @@ ContactAdapter::contactSelected(int index)
*/ */
const auto contactUri = contactIndex.data(SmartListModel::Role::URI).value<QString>(); const auto contactUri = contactIndex.data(SmartListModel::Role::URI).value<QString>();
if (conversation.uid.isEmpty()) { if (convInfo.uid.isEmpty()) {
return; return;
} }
const auto callId = conversation.confId.isEmpty() ? conversation.callId const auto callId = convInfo.confId.isEmpty() ? convInfo.callId : convInfo.confId;
: conversation.confId;
QString destCallId; QString destCallId;

View file

@ -1,7 +1,7 @@
/*! /*!
* Copyright (C) 2020 by Savoir-faire Linux * Copyright (C) 2020 by Savoir-faire Linux
* Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com> * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>
* Author: Anthony Lonard <anthony.leonard@savoirfairelinux.com> * Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com>
* Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com> * Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com>
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
* Author: Isa Nanic <isa.nanic@savoirfairelinux.com> * Author: Isa Nanic <isa.nanic@savoirfairelinux.com>
@ -39,14 +39,14 @@ ConversationsAdapter::ConversationsAdapter(QObject* parent)
void void
ConversationsAdapter::safeInit() ConversationsAdapter::safeInit()
{ {
conversationSmartListModel_ = new SmartListModel(this, LRCInstance::getCurrAccId()); conversationSmartListModel_ = new SmartListModel(this);
emit modelChanged(QVariant::fromValue(conversationSmartListModel_)); emit modelChanged(QVariant::fromValue(conversationSmartListModel_));
connect(&LRCInstance::behaviorController(), connect(&LRCInstance::behaviorController(),
&BehaviorController::showChatView, &BehaviorController::showChatView,
[this](const QString& accountId, lrc::api::conversation::Info convInfo) { [this](const QString& accountId, const QString& convId) {
emit showConversation(accountId, convInfo.uid); emit showConversation(accountId, convId);
}); });
connect(&LRCInstance::behaviorController(), connect(&LRCInstance::behaviorController(),
@ -75,13 +75,16 @@ ConversationsAdapter::backToWelcomePage()
void void
ConversationsAdapter::selectConversation(const QString& accountId, const QString& convUid) ConversationsAdapter::selectConversation(const QString& accountId, const QString& convUid)
{ {
auto* convModel = LRCInstance::getAccountInfo(accountId).conversationModel.get(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
const auto& convInfo = convModel->getConversationForUID(convUid);
if (LRCInstance::getCurrentConvUid() != convInfo.uid && convInfo.participants.size() > 0) { if (LRCInstance::getCurrentConvUid() != convInfo.uid && convInfo.participants.size() > 0) {
// If the account is not currently selected, do that first, then // If the account is not currently selected, do that first, then
// proceed to select the conversation. // proceed to select the conversation.
auto selectConversation = [this, convInfo] { auto selectConversation = [this, accountId, convUid = convInfo.uid] {
const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
if (convInfo.uid.isEmpty()) {
return;
}
auto& accInfo = LRCInstance::getAccountInfo(convInfo.accountId); auto& accInfo = LRCInstance::getAccountInfo(convInfo.accountId);
LRCInstance::setSelectedConvId(convInfo.uid); LRCInstance::setSelectedConvId(convInfo.uid);
accInfo.conversationModel->clearUnreadInteractions(convInfo.uid); accInfo.conversationModel->clearUnreadInteractions(convInfo.uid);
@ -143,11 +146,10 @@ ConversationsAdapter::onNewUnreadInteraction(const QString& accountId,
&& (!QApplication::focusWindow() || accountId != LRCInstance::getCurrAccId() && (!QApplication::focusWindow() || accountId != LRCInstance::getCurrAccId()
|| convUid != LRCInstance::getCurrentConvUid())) { || convUid != LRCInstance::getCurrentConvUid())) {
auto& accInfo = LRCInstance::getAccountInfo(accountId); auto& accInfo = LRCInstance::getAccountInfo(accountId);
auto& contact = accInfo.contactModel->getContact(interaction.authorUri);
auto from = accInfo.contactModel->bestNameForContact(interaction.authorUri); auto from = accInfo.contactModel->bestNameForContact(interaction.authorUri);
auto onClicked = [this, accountId, convUid, uri = interaction.authorUri] { auto onClicked = [this, accountId, convUid, uri = interaction.authorUri] {
emit LRCInstance::instance().notificationClicked(); emit LRCInstance::instance().notificationClicked();
auto convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
selectConversation(accountId, convInfo.uid); selectConversation(accountId, convInfo.uid);
emit LRCInstance::instance().updateSmartList(); emit LRCInstance::instance().updateSmartList();
@ -185,24 +187,25 @@ ConversationsAdapter::connectConversationModel(bool updateFilter)
auto currentConversationModel = LRCInstance::getCurrentConversationModel(); auto currentConversationModel = LRCInstance::getCurrentConversationModel();
modelSortedConnection_ = QObject::connect( modelSortedConnection_ = QObject::connect(
currentConversationModel, &lrc::api::ConversationModel::modelSorted, [this]() { currentConversationModel, &lrc::api::ConversationModel::modelChanged, [this]() {
conversationSmartListModel_->fillConversationsList(); conversationSmartListModel_->fillConversationsList();
updateConversationsFilterWidget(); updateConversationsFilterWidget();
emit updateListViewRequested(); emit updateListViewRequested();
auto* convModel = LRCInstance::getCurrentConversationModel(); auto* convModel = LRCInstance::getCurrentConversationModel();
const auto conversation = convModel->getConversationForUID( const auto& convInfo = LRCInstance::getConversationFromConvUid(
LRCInstance::getCurrentConvUid()); LRCInstance::getCurrentConvUid());
if (conversation.uid.isEmpty() || conversation.participants.isEmpty()) { if (convInfo.uid.isEmpty() || convInfo.participants.isEmpty()) {
return; return;
} }
const auto contactURI = conversation.participants[0]; const auto contactURI = convInfo.participants[0];
if (contactURI.isEmpty() if (contactURI.isEmpty()
|| convModel->owner.contactModel->getContact(contactURI).profileInfo.type || convModel->owner.contactModel->getContact(contactURI).profileInfo.type
== lrc::api::profile::Type::TEMPORARY) { == lrc::api::profile::Type::TEMPORARY) {
return; return;
} }
emit modelSorted(QVariant::fromValue(conversation.uid)); emit modelSorted(QVariant::fromValue(convInfo.uid));
}); });
contactProfileUpdatedConnection_ contactProfileUpdatedConnection_
@ -215,9 +218,7 @@ ConversationsAdapter::connectConversationModel(bool updateFilter)
modelUpdatedConnection_ = QObject::connect(currentConversationModel, modelUpdatedConnection_ = QObject::connect(currentConversationModel,
&lrc::api::ConversationModel::conversationUpdated, &lrc::api::ConversationModel::conversationUpdated,
[this](const QString& convUid) { [this](const QString&) {
conversationSmartListModel_->updateConversation(
convUid);
updateConversationsFilterWidget(); updateConversationsFilterWidget();
emit updateListViewRequested(); emit updateListViewRequested();
}); });
@ -309,13 +310,13 @@ ConversationsAdapter::updateConversationForNewContact(const QString& convUid)
if (convModel == nullptr) { if (convModel == nullptr) {
return; return;
} }
const auto selectedUid = LRCInstance::getCurrentConvUid(); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid);
const auto conversation = convModel->getConversationForUID(convUid);
if (!conversation.uid.isEmpty() && !conversation.participants.isEmpty()) { if (!convInfo.uid.isEmpty() && !convInfo.participants.isEmpty()) {
try { try {
const auto contact = convModel->owner.contactModel->getContact( const auto contact = convModel->owner.contactModel->getContact(convInfo.participants[0]);
conversation.participants[0]); if (!contact.profileInfo.uri.isEmpty()
if (!contact.profileInfo.uri.isEmpty() && contact.profileInfo.uri == selectedUid) { && contact.profileInfo.uri == LRCInstance::getCurrentConvUid()) {
LRCInstance::setSelectedConvId(convUid); LRCInstance::setSelectedConvId(convUid);
convModel->selectConversation(convUid); convModel->selectConversation(convUid);
} }

View file

@ -169,8 +169,7 @@ public:
static QString getCallIdForConversationUid(const QString& convUid, const QString& accountId) static QString getCallIdForConversationUid(const QString& convUid, const QString& accountId)
{ {
auto& accInfo = LRCInstance::getAccountInfo(accountId); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
auto convInfo = accInfo.conversationModel->getConversationForUID(convUid);
if (convInfo.uid.isEmpty()) { if (convInfo.uid.isEmpty()) {
return {}; return {};
} }
@ -208,68 +207,31 @@ public:
} }
} }
static const conversation::Info& getConversation(const QString& accountId,
getConvPredicate pred = {},
bool filtered = false)
{
using namespace lrc::api;
static conversation::Info invalid = {};
try {
auto& accInfo = LRCInstance::getAccountInfo(accountId);
auto& convModel = accInfo.conversationModel;
if (filtered) {
auto& convs = convModel->allFilteredConversations();
auto conv = std::find_if(convs.begin(), convs.end(), pred);
if (conv != convs.end()) {
return *conv;
}
} else {
for (int i = static_cast<int>(profile::Type::RING);
i <= static_cast<int>(profile::Type::TEMPORARY);
++i) {
auto filter = static_cast<profile::Type>(i);
auto& convs = convModel->getFilteredConversations(filter);
auto conv = std::find_if(convs.begin(), convs.end(), pred);
if (conv != convs.end()) {
return *conv;
}
}
}
} catch (...) {
}
return invalid;
}
static const conversation::Info& getConversationFromConvUid(const QString& convUid, static const conversation::Info& getConversationFromConvUid(const QString& convUid,
const QString& accountId = {}, const QString& accountId = {})
bool filtered = false)
{ {
return getConversation( auto& accInfo = LRCInstance::accountModel().getAccountInfo(
!accountId.isEmpty() ? accountId : getCurrAccId(), !accountId.isEmpty() ? accountId : getCurrAccId());
[&](const conversation::Info& conv) -> bool { return convUid == conv.uid; }, auto& convModel = accInfo.conversationModel;
filtered); return convModel->getConversationForUid(convUid).value_or(instance().invalid);
}
static const conversation::Info& getConversationFromCallId(const QString& callId,
const QString& accountId = {},
bool filtered = false)
{
return getConversation(
!accountId.isEmpty() ? accountId : getCurrAccId(),
[&](const conversation::Info& conv) -> bool {
return callId == conv.callId or callId == conv.confId;
},
filtered);
} }
static const conversation::Info& getConversationFromPeerUri(const QString& peerUri, static const conversation::Info& getConversationFromPeerUri(const QString& peerUri,
const QString& accountId = {}, const QString& accountId = {})
bool filtered = false)
{ {
return getConversation( auto& accInfo = LRCInstance::accountModel().getAccountInfo(
!accountId.isEmpty() ? accountId : getCurrAccId(), !accountId.isEmpty() ? accountId : getCurrAccId());
[&](const conversation::Info& conv) -> bool { return peerUri == conv.participants[0]; }, auto& convModel = accInfo.conversationModel;
filtered); return convModel->getConversationForPeerUri(peerUri).value_or(instance().invalid);
}
static const conversation::Info& getConversationFromCallId(const QString& callId,
const QString& accountId = {})
{
auto& accInfo = LRCInstance::accountModel().getAccountInfo(
!accountId.isEmpty() ? accountId : getCurrAccId());
auto& convModel = accInfo.conversationModel;
return convModel->getConversationForCallId(callId).value_or(instance().invalid);
} }
static ConversationModel* getCurrentConversationModel() static ConversationModel* getCurrentConversationModel()
@ -469,5 +431,7 @@ private:
QString selectedConvUid_; QString selectedConvUid_;
MapStringString contentDrafts_; MapStringString contentDrafts_;
MapStringString lastConferences_; MapStringString lastConferences_;
conversation::Info invalid {};
}; };
Q_DECLARE_METATYPE(LRCInstance*) Q_DECLARE_METATYPE(LRCInstance*)

View file

@ -51,17 +51,17 @@ MessagesAdapter::safeInit()
} }
void void
MessagesAdapter::setupChatView(const QString& uid) MessagesAdapter::setupChatView(const QString& convUid)
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); auto* convModel = LRCInstance::getCurrentConversationModel();
if (convModel == nullptr) { if (convModel == nullptr) {
return; return;
} }
if (currentConvUid_ == uid) if (currentConvUid_ == convUid)
return; return;
const auto& convInfo = convModel->getConversationForUID(uid); const auto& convInfo = LRCInstance::getConversationFromConvUid(convUid);
if (convInfo.uid.isEmpty() || convInfo.participants.isEmpty()) { if (convInfo.uid.isEmpty() || convInfo.participants.isEmpty()) {
return; return;
} }
@ -93,11 +93,11 @@ MessagesAdapter::setupChatView(const QString& uid)
contactIsComposing(convInfo.uid, "", false); contactIsComposing(convInfo.uid, "", false);
connect(LRCInstance::getCurrentConversationModel(), connect(LRCInstance::getCurrentConversationModel(),
&ConversationModel::composingStatusChanged, &ConversationModel::composingStatusChanged,
[this](const QString& uid, const QString& contactUri, bool isComposing) { [this](const QString& convUid, const QString& contactUri, bool isComposing) {
if (!AppSettingsManager::getValue(Settings::Key::EnableTypingIndicator).toBool()) { if (!AppSettingsManager::getValue(Settings::Key::EnableTypingIndicator).toBool()) {
return; return;
} }
contactIsComposing(uid, contactUri, isComposing); contactIsComposing(convUid, contactUri, isComposing);
}); });
/* /*
@ -110,7 +110,7 @@ MessagesAdapter::setupChatView(const QString& uid)
requestSendMessageContent(); requestSendMessageContent();
currentConvUid_ = uid; currentConvUid_ = convUid;
} }
void void
@ -167,11 +167,11 @@ void
MessagesAdapter::updateConversationForAddedContact() MessagesAdapter::updateConversationForAddedContact()
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); auto* convModel = LRCInstance::getCurrentConversationModel();
const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid()); const auto& convInfo = LRCInstance::getConversationFromConvUid(LRCInstance::getCurrentConvUid());
clear(); clear();
setConversationProfileData(conversation); setConversationProfileData(convInfo);
printHistory(*convModel, conversation.interactions); printHistory(*convModel, convInfo.interactions);
} }
void void
@ -205,7 +205,7 @@ void
MessagesAdapter::slotMessagesCleared() MessagesAdapter::slotMessagesCleared()
{ {
auto* convModel = LRCInstance::getCurrentConversationModel(); auto* convModel = LRCInstance::getCurrentConversationModel();
const auto convInfo = convModel->getConversationForUID(LRCInstance::getCurrentConvUid()); const auto& convInfo = LRCInstance::getConversationFromConvUid(LRCInstance::getCurrentConvUid());
printHistory(*convModel, convInfo.interactions); printHistory(*convModel, convInfo.interactions);
@ -442,15 +442,13 @@ MessagesAdapter::onComposing(bool isComposing)
void void
MessagesAdapter::setConversationProfileData(const lrc::api::conversation::Info& convInfo) MessagesAdapter::setConversationProfileData(const lrc::api::conversation::Info& convInfo)
{ {
auto* convModel = LRCInstance::getCurrentConversationModel();
auto accInfo = &LRCInstance::getCurrentAccountInfo(); auto accInfo = &LRCInstance::getCurrentAccountInfo();
const auto conv = convModel->getConversationForUID(convInfo.uid);
if (conv.participants.isEmpty()) { if (convInfo.participants.isEmpty()) {
return; return;
} }
auto contactUri = conv.participants.front(); auto contactUri = convInfo.participants.front();
if (contactUri.isEmpty()) { if (contactUri.isEmpty()) {
return; return;
} }

View file

@ -54,9 +54,7 @@ public:
/* /*
* For contact_xxx, xxx is "" initially * For contact_xxx, xxx is "" initially
*/ */
const auto& convInfo = LRCInstance::getConversationFromConvUid(list[1]);
auto convModel = LRCInstance::getCurrentConversationModel();
auto convInfo = convModel->getConversationForUID(list[1]);
auto contact = LRCInstance::getCurrentAccountInfo().contactModel->getContact( auto contact = LRCInstance::getCurrentAccountInfo().contactModel->getContact(
convInfo.participants.at(0)); convInfo.participants.at(0));
return QPair(QrType::Contact, contact.profileInfo.uri); return QPair(QrType::Contact, contact.profileInfo.uri);

View file

@ -115,6 +115,7 @@ SettingsAdapter::getResolutions(const QString& device)
auto channelCaps = get_ResRateList(currentChannel, device); auto channelCaps = get_ResRateList(currentChannel, device);
for (auto [resolution, frameRateList] : channelCaps) { for (auto [resolution, frameRateList] : channelCaps) {
for (auto rate : frameRateList) { for (auto rate : frameRateList) {
(void) rate;
resolutions.append(resolution); resolutions.append(resolution);
} }
} }

View file

@ -1,4 +1,4 @@
/* /*!
* Copyright (C) 2017-2020 by Savoir-faire Linux * Copyright (C) 2017-2020 by Savoir-faire Linux
* Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com> * Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com>
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
@ -25,10 +25,7 @@
#include <QDateTime> #include <QDateTime>
SmartListModel::SmartListModel(QObject* parent, SmartListModel::SmartListModel(QObject* parent, SmartListModel::Type listModelType)
const QString& accId,
SmartListModel::Type listModelType,
const QString& convUid)
: QAbstractListModel(parent) : QAbstractListModel(parent)
, listModelType_(listModelType) , listModelType_(listModelType)
{ {
@ -79,20 +76,20 @@ SmartListModel::data(const QModelIndex& index, int role) const
} }
try { try {
auto& accountInfo = LRCInstance::accountModel().getAccountInfo(LRCInstance::getCurrAccId()); auto& currentAccountInfo = LRCInstance::accountModel().getAccountInfo(
auto& convModel = accountInfo.conversationModel; LRCInstance::getCurrAccId());
lrc::api::conversation::Info item; auto& convModel = currentAccountInfo.conversationModel;
if (listModelType_ == Type::TRANSFER) { if (listModelType_ == Type::TRANSFER) {
auto filterType = accountInfo.profileInfo.type; auto filterType = currentAccountInfo.profileInfo.type;
item = convModel->getFilteredConversations(filterType).at(index.row()); auto& item = convModel->getFilteredConversations(filterType).at(index.row());
return getConversationItemData(item, accountInfo, role); return getConversationItemData(item, currentAccountInfo, role);
} else if (listModelType_ == Type::CONFERENCE) { } else if (listModelType_ == Type::CONFERENCE) {
auto calls = conferenceables_[ConferenceableItem::CALL]; auto calls = conferenceables_[ConferenceableItem::CALL];
auto contacts = conferenceables_[ConferenceableItem::CONTACT]; auto contacts = conferenceables_[ConferenceableItem::CONTACT];
QString itemConvUid {}, itemAccId {}; QString itemConvUid {}, itemAccountId {};
if (calls.size() == 0) { if (calls.size() == 0) {
itemConvUid = contacts.at(index.row()).at(0).convId; itemConvUid = contacts.at(index.row()).at(0).convId;
itemAccId = contacts.at(index.row()).at(0).accountId; itemAccountId = contacts.at(index.row()).at(0).accountId;
} else { } else {
bool callsOpen = sectionState_[tr("Calls")]; bool callsOpen = sectionState_[tr("Calls")];
bool contactsOpen = sectionState_[tr("Contacts")]; bool contactsOpen = sectionState_[tr("Contacts")];
@ -107,7 +104,7 @@ SmartListModel::data(const QModelIndex& index, int role) const
} else { } else {
auto idx = index.row() - 1; auto idx = index.row() - 1;
itemConvUid = calls.at(idx).at(0).convId; itemConvUid = calls.at(idx).at(0).convId;
itemAccId = calls.at(idx).at(0).accountId; itemAccountId = calls.at(idx).at(0).accountId;
} }
} else if (index.row() < contactSectionEnd) { } else if (index.row() < contactSectionEnd) {
if (index.row() == callSectionEnd) { if (index.row() == callSectionEnd) {
@ -117,20 +114,20 @@ SmartListModel::data(const QModelIndex& index, int role) const
} else { } else {
auto idx = index.row() - (callSectionEnd + 1); auto idx = index.row() - (callSectionEnd + 1);
itemConvUid = contacts.at(idx).at(0).convId; itemConvUid = contacts.at(idx).at(0).convId;
itemAccId = contacts.at(idx).at(0).accountId; itemAccountId = contacts.at(idx).at(0).accountId;
} }
} }
} }
if (role == Role::AccountId) { if (role == Role::AccountId) {
return QVariant(itemAccId); return QVariant(itemAccountId);
} }
auto& itemAccountInfo = LRCInstance::accountModel().getAccountInfo(itemAccId); auto& itemAccountInfo = LRCInstance::accountModel().getAccountInfo(itemAccountId);
item = itemAccountInfo.conversationModel->getConversationForUID(itemConvUid); auto& item = LRCInstance::getConversationFromConvUid(itemConvUid, itemAccountId);
return getConversationItemData(item, itemAccountInfo, role); return getConversationItemData(item, itemAccountInfo, role);
} else if (listModelType_ == Type::CONVERSATION) { } else if (listModelType_ == Type::CONVERSATION) {
item = conversations_.at(index.row()); auto& item = conversations_.at(index.row());
return getConversationItemData(item, accountInfo, role); return getConversationItemData(item, currentAccountInfo, role);
} }
} catch (const std::exception& e) { } catch (const std::exception& e) {
qWarning() << e.what(); qWarning() << e.what();
@ -182,30 +179,12 @@ SmartListModel::fillConversationsList()
fillContactAvatarUidMap(LRCInstance::getCurrentAccountInfo().contactModel->getAllContacts()); fillContactAvatarUidMap(LRCInstance::getCurrentAccountInfo().contactModel->getAllContacts());
auto* convModel = LRCInstance::getCurrentConversationModel(); auto* convModel = LRCInstance::getCurrentConversationModel();
conversations_.clear(); using ConversationList = ConversationModel::ConversationQueueProxy;
conversations_ = ConversationList(convModel->getAllSearchResults())
for (auto convSearch : convModel->getAllSearchResults()) { + convModel->allFilteredConversations();
conversations_.emplace_back(convSearch);
}
for (auto convFilt : convModel->allFilteredConversations()) {
conversations_.emplace_back(convFilt);
}
endResetModel(); endResetModel();
} }
void
SmartListModel::updateConversation(const QString& convUid)
{
auto* convModel = LRCInstance::getCurrentConversationModel();
for (lrc::api::conversation::Info& conversation : conversations_) {
if (conversation.uid == convUid) {
conversation = convModel->getConversationForUID(convUid);
return;
}
}
}
void void
SmartListModel::updateContactAvatarUid(const QString& contactUri) SmartListModel::updateContactAvatarUid(const QString& contactUri)
{ {
@ -336,8 +315,7 @@ SmartListModel::getConversationItemData(const conversation::Info& item,
case Role::UID: case Role::UID:
return QVariant(item.uid); return QVariant(item.uid);
case Role::InCall: { case Role::InCall: {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(item.uid);
const auto convInfo = convModel->getConversationForUID(item.uid);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto* callModel = LRCInstance::getCurrentCallModel(); auto* callModel = LRCInstance::getCurrentCallModel();
return QVariant(callModel->hasCall(convInfo.callId)); return QVariant(callModel->hasCall(convInfo.callId));
@ -345,8 +323,7 @@ SmartListModel::getConversationItemData(const conversation::Info& item,
return QVariant(false); return QVariant(false);
} }
case Role::IsAudioOnly: { case Role::IsAudioOnly: {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(item.uid);
const auto convInfo = convModel->getConversationForUID(item.uid);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto* call = LRCInstance::getCallInfoForConversation(convInfo); auto* call = LRCInstance::getCallInfoForConversation(convInfo);
if (call) { if (call) {
@ -356,11 +333,10 @@ SmartListModel::getConversationItemData(const conversation::Info& item,
return QVariant(); return QVariant();
} }
case Role::CallStackViewShouldShow: { case Role::CallStackViewShouldShow: {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(item.uid);
const auto convInfo = convModel->getConversationForUID(item.uid);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto* callModel = LRCInstance::getCurrentCallModel(); auto* callModel = LRCInstance::getCurrentCallModel();
const auto call = callModel->getCall(convInfo.callId); const auto& call = callModel->getCall(convInfo.callId);
return QVariant( return QVariant(
callModel->hasCall(convInfo.callId) callModel->hasCall(convInfo.callId)
&& ((!call.isOutgoing && ((!call.isOutgoing
@ -372,11 +348,9 @@ SmartListModel::getConversationItemData(const conversation::Info& item,
return QVariant(false); return QVariant(false);
} }
case Role::CallState: { case Role::CallState: {
auto* convModel = LRCInstance::getCurrentConversationModel(); const auto& convInfo = LRCInstance::getConversationFromConvUid(item.uid);
const auto convInfo = convModel->getConversationForUID(item.uid);
if (!convInfo.uid.isEmpty()) { if (!convInfo.uid.isEmpty()) {
auto* call = LRCInstance::getCallInfoForConversation(convInfo); if (auto* call = LRCInstance::getCallInfoForConversation(convInfo)) {
if (call) {
return QVariant(static_cast<int>(call->status)); return QVariant(static_cast<int>(call->status));
} }
} }

View file

@ -64,9 +64,7 @@ public:
Q_ENUM(Role) Q_ENUM(Role)
explicit SmartListModel(QObject* parent = 0, explicit SmartListModel(QObject* parent = 0,
const QString& accId = {}, SmartListModel::Type listModelType = Type::CONVERSATION);
SmartListModel::Type listModelType = Type::CONVERSATION,
const QString& convUid = {});
~SmartListModel(); ~SmartListModel();
/* /*
@ -76,15 +74,16 @@ public:
int columnCount(const QModelIndex& parent) const override; int columnCount(const QModelIndex& parent) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const; QModelIndex index(int row,
QModelIndex parent(const QModelIndex& child) const; int column = 0,
Qt::ItemFlags flags(const QModelIndex& index) const; const QModelIndex& parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex& child) const override;
Qt::ItemFlags flags(const QModelIndex& index) const override;
Q_INVOKABLE void setConferenceableFilter(const QString& filter = {}); Q_INVOKABLE void setConferenceableFilter(const QString& filter = {});
Q_INVOKABLE void toggleSection(const QString& section); Q_INVOKABLE void toggleSection(const QString& section);
Q_INVOKABLE int currentUidSmartListModelIndex(); Q_INVOKABLE int currentUidSmartListModelIndex();
Q_INVOKABLE void fillConversationsList(); Q_INVOKABLE void fillConversationsList();
Q_INVOKABLE void updateConversation(const QString& conv);
/* /*
* This function is to update contact avatar uuid for current account when there's an contact * This function is to update contact avatar uuid for current account when there's an contact
@ -109,5 +108,5 @@ private:
QMap<QString, bool> sectionState_; QMap<QString, bool> sectionState_;
QMap<ConferenceableItem, ConferenceableValue> conferenceables_; QMap<ConferenceableItem, ConferenceableValue> conferenceables_;
QMap<QString, QString> contactAvatarUidMap_; QMap<QString, QString> contactAvatarUidMap_;
ConversationModel::ConversationQueue conversations_; ConversationModel::ConversationQueueProxy conversations_;
}; };

View file

@ -1,4 +1,4 @@
/* /*!
* Copyright (C) 2015-2020 by Savoir-faire Linux * Copyright (C) 2015-2020 by Savoir-faire Linux
* Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com> * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
@ -103,7 +103,7 @@ UtilsAdapter::checkStartupLink()
const QString const QString
UtilsAdapter::getBestName(const QString& accountId, const QString& uid) UtilsAdapter::getBestName(const QString& accountId, const QString& uid)
{ {
auto conv = LRCInstance::getConversationFromConvUid(uid); const auto& conv = LRCInstance::getConversationFromConvUid(uid);
if (!conv.participants.isEmpty()) if (!conv.participants.isEmpty())
return LRCInstance::getAccountInfo(accountId).contactModel->bestNameForContact( return LRCInstance::getAccountInfo(accountId).contactModel->bestNameForContact(
conv.participants[0]); conv.participants[0]);
@ -121,7 +121,7 @@ UtilsAdapter::getBestId(const QString& accountId)
const QString const QString
UtilsAdapter::getBestId(const QString& accountId, const QString& uid) UtilsAdapter::getBestId(const QString& accountId, const QString& uid)
{ {
auto conv = LRCInstance::getConversationFromConvUid(uid); const auto& conv = LRCInstance::getConversationFromConvUid(uid);
if (!conv.participants.isEmpty()) if (!conv.participants.isEmpty())
return LRCInstance::getAccountInfo(accountId).contactModel->bestIdForContact( return LRCInstance::getAccountInfo(accountId).contactModel->bestIdForContact(
conv.participants[0]); conv.participants[0]);
@ -134,10 +134,10 @@ UtilsAdapter::getTotalUnreadMessages()
int totalUnreadMessages {0}; int totalUnreadMessages {0};
if (LRCInstance::getCurrentAccountInfo().profileInfo.type != lrc::api::profile::Type::SIP) { if (LRCInstance::getCurrentAccountInfo().profileInfo.type != lrc::api::profile::Type::SIP) {
auto* convModel = LRCInstance::getCurrentConversationModel(); auto* convModel = LRCInstance::getCurrentConversationModel();
auto ringConversations = convModel->getFilteredConversations(lrc::api::profile::Type::RING); auto ringConversations = convModel->getFilteredConversations(lrc::api::profile::Type::RING,
std::for_each(ringConversations.begin(), false);
ringConversations.end(), ringConversations.for_each(
[&totalUnreadMessages](const auto& conversation) { [&totalUnreadMessages](const lrc::api::conversation::Info& conversation) {
totalUnreadMessages += conversation.unreadMessages; totalUnreadMessages += conversation.unreadMessages;
}); });
} }
@ -197,7 +197,7 @@ void
UtilsAdapter::setCurrentCall(const QString& accountId, const QString& convUid) UtilsAdapter::setCurrentCall(const QString& accountId, const QString& convUid)
{ {
auto& accInfo = LRCInstance::getAccountInfo(accountId); auto& accInfo = LRCInstance::getAccountInfo(accountId);
const auto convInfo = accInfo.conversationModel->getConversationForUID(convUid); auto const& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
accInfo.callModel->setCurrentCall(convInfo.callId); accInfo.callModel->setCurrentCall(convInfo.callId);
} }
@ -230,19 +230,16 @@ UtilsAdapter::getCallConvForAccount(const QString& accountId)
const QString const QString
UtilsAdapter::getCallId(const QString& accountId, const QString& convUid) UtilsAdapter::getCallId(const QString& accountId, const QString& convUid)
{ {
auto& accInfo = LRCInstance::getAccountInfo(accountId); auto const& convInfo = LRCInstance::getConversationFromConvUid(convUid, accountId);
const auto convInfo = accInfo.conversationModel->getConversationForUID(convUid);
if (convInfo.uid.isEmpty()) { if (convInfo.uid.isEmpty()) {
return ""; return {};
}
auto call = LRCInstance::getCallInfoForConversation(convInfo, false);
if (!call) {
return "";
} }
if (auto* call = LRCInstance::getCallInfoForConversation(convInfo, false)) {
return call->id; return call->id;
}
return {};
} }
int int