1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-08-03 06:15:39 +02:00
jami-client-qt/src/accountadapter.cpp
Andreas Traczyk cfa10ce268 calls: fix call overlay updates
- don't query the recording state in the set time text function
- change set time text function interval from 20ms to 1000ms
- stop the account-wide time text update timer when there are
  no calls

Change-Id: Iaaabfd52a50ba61aaabade59cae4f061c562cb2d
2021-04-09 16:00:51 -04:00

441 lines
17 KiB
C++

/*
* Copyright (C) 2020 by Savoir-faire Linux
* Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>
* Author: Anthony L�onard <anthony.leonard@savoirfairelinux.com
* Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com>
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
* Author: Isa Nanic <isa.nanic@savoirfairelinux.com>
* Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "accountadapter.h"
#include "appsettingsmanager.h"
#include "qtutils.h"
#include <QtConcurrent/QtConcurrent>
AccountAdapter::AccountAdapter(AppSettingsManager* settingsManager,
LRCInstance* instance,
QObject* parent)
: QmlAdapterBase(instance, parent)
, settingsManager_(settingsManager)
{}
void
AccountAdapter::safeInit()
{
connect(lrcInstance_,
&LRCInstance::currentAccountChanged,
this,
&AccountAdapter::onCurrentAccountChanged);
deselectConversation();
auto accountId = lrcInstance_->getCurrAccId();
setProperties(accountId);
connectAccount(accountId);
}
lrc::api::NewAccountModel*
AccountAdapter::getModel()
{
return &(lrcInstance_->accountModel());
}
lrc::api::NewDeviceModel*
AccountAdapter::getDeviceModel()
{
return lrcInstance_->getCurrentAccountInfo().deviceModel.get();
}
void
AccountAdapter::accountChanged(int index)
{
deselectConversation(); // Hack UI
auto accountList = lrcInstance_->accountModel().getAccountList();
if (accountList.size() > index) {
lrcInstance_->setSelectedAccountId(accountList.at(index));
}
}
void
AccountAdapter::connectFailure()
{
Utils::oneShotConnect(&lrcInstance_->accountModel(),
&lrc::api::NewAccountModel::accountRemoved,
[this](const QString& accountId) {
Q_UNUSED(accountId);
Q_EMIT reportFailure();
});
Utils::oneShotConnect(&lrcInstance_->accountModel(),
&lrc::api::NewAccountModel::invalidAccountDetected,
[this](const QString& accountId) {
Q_UNUSED(accountId);
Q_EMIT reportFailure();
});
}
void
AccountAdapter::createJamiAccount(QString registeredName,
const QVariantMap& settings,
bool isCreating)
{
Utils::oneShotConnect(
&lrcInstance_->accountModel(),
&lrc::api::NewAccountModel::accountAdded,
[this, registeredName, settings, isCreating](const QString& accountId) {
auto confProps = lrcInstance_->accountModel().getAccountConfig(accountId);
#ifdef Q_OS_WIN
confProps.Ringtone.ringtonePath = Utils::GetRingtonePath();
#endif
confProps.isRendezVous = settings["isRendezVous"].toBool();
lrcInstance_->accountModel().setAccountConfig(accountId, confProps);
auto showBackup = isCreating
&& !settingsManager_->getValue(Settings::Key::NeverShowMeAgain)
.toBool();
if (!registeredName.isEmpty()) {
QObject::disconnect(registeredNameSavedConnection_);
registeredNameSavedConnection_
= connect(&lrcInstance_->accountModel(),
&lrc::api::NewAccountModel::profileUpdated,
[this, showBackup, addedAccountId = accountId](
const QString& accountId) {
if (addedAccountId == accountId) {
Q_EMIT lrcInstance_->accountListChanged();
Q_EMIT accountAdded(accountId,
showBackup,
lrcInstance_->accountModel()
.getAccountList()
.indexOf(accountId));
QObject::disconnect(registeredNameSavedConnection_);
}
});
lrcInstance_->accountModel().registerName(accountId,
settings["password"].toString(),
registeredName);
} else {
Q_EMIT lrcInstance_->accountListChanged();
Q_EMIT accountAdded(accountId,
showBackup,
lrcInstance_->accountModel().getAccountList().indexOf(
accountId));
}
});
connectFailure();
QtConcurrent::run([this, settings] {
lrcInstance_->accountModel().createNewAccount(lrc::api::profile::Type::RING,
settings["alias"].toString(),
settings["archivePath"].toString(),
settings["password"].toString(),
settings["archivePin"].toString(),
"");
});
}
void
AccountAdapter::createSIPAccount(const QVariantMap& settings)
{
Utils::oneShotConnect(&lrcInstance_->accountModel(),
&lrc::api::NewAccountModel::accountAdded,
[this, settings](const QString& accountId) {
auto confProps = lrcInstance_->accountModel().getAccountConfig(
accountId);
// set SIP details
confProps.hostname = settings["hostname"].toString();
confProps.username = settings["username"].toString();
confProps.password = settings["password"].toString();
confProps.routeset = settings["proxy"].toString();
#ifdef Q_OS_WIN
confProps.Ringtone.ringtonePath = Utils::GetRingtonePath();
#endif
lrcInstance_->accountModel().setAccountConfig(accountId, confProps);
Q_EMIT lrcInstance_->accountListChanged();
Q_EMIT accountAdded(accountId,
false,
lrcInstance_->accountModel()
.getAccountList()
.indexOf(accountId));
});
connectFailure();
QtConcurrent::run([this, settings] {
lrcInstance_->accountModel().createNewAccount(lrc::api::profile::Type::SIP,
settings["alias"].toString(),
settings["archivePath"].toString(),
"",
"",
settings["username"].toString(),
{});
});
}
void
AccountAdapter::createJAMSAccount(const QVariantMap& settings)
{
Utils::oneShotConnect(&lrcInstance_->accountModel(),
&lrc::api::NewAccountModel::accountAdded,
[this](const QString& accountId) {
if (!lrcInstance_->accountModel().getAccountList().size())
return;
auto confProps = lrcInstance_->accountModel().getAccountConfig(
accountId);
#ifdef Q_OS_WIN
confProps.Ringtone.ringtonePath = Utils::GetRingtonePath();
#endif
lrcInstance_->accountModel().setAccountConfig(accountId, confProps);
Q_EMIT accountAdded(accountId,
false,
lrcInstance_->accountModel()
.getAccountList()
.indexOf(accountId));
Q_EMIT lrcInstance_->accountListChanged();
});
connectFailure();
QtConcurrent::run([this, settings] {
lrcInstance_->accountModel().connectToAccountManager(settings["username"].toString(),
settings["password"].toString(),
settings["manager"].toString());
});
}
void
AccountAdapter::deleteCurrentAccount()
{
lrcInstance_->accountModel().removeAccount(lrcInstance_->getCurrAccId());
Q_EMIT lrcInstance_->accountListChanged();
}
bool
AccountAdapter::savePassword(const QString& accountId,
const QString& oldPassword,
const QString& newPassword)
{
return lrcInstance_->accountModel().changeAccountPassword(accountId, oldPassword, newPassword);
}
void
AccountAdapter::startPreviewing(bool force)
{
lrcInstance_->renderer()->startPreviewing(force);
}
void
AccountAdapter::stopPreviewing()
{
if (!lrcInstance_->hasActiveCall(true) && lrcInstance_->renderer()->isPreviewing()) {
lrcInstance_->renderer()->stopPreviewing();
}
}
bool
AccountAdapter::hasVideoCall()
{
return lrcInstance_->hasActiveCall(true);
}
bool
AccountAdapter::isPreviewing()
{
return lrcInstance_->renderer()->isPreviewing();
}
void
AccountAdapter::setCurrAccDisplayName(const QString& text)
{
lrcInstance_->setCurrAccDisplayName(text);
}
void
AccountAdapter::setSelectedConvId(const QString& convId)
{
lrcInstance_->set_selectedConvUid(convId);
}
lrc::api::profile::Type
AccountAdapter::getCurrentAccountType()
{
return lrcInstance_->getCurrentAccountInfo().profileInfo.type;
}
void
AccountAdapter::setCurrAccAvatar(bool fromFile, const QString& source)
{
QtConcurrent::run([this, fromFile, source]() {
QPixmap image;
bool success;
if (fromFile)
success = image.load(source);
else
success = image.loadFromData(Utils::base64StringToByteArray(source));
if (success)
lrcInstance_->setCurrAccAvatar(image);
});
}
void
AccountAdapter::onCurrentAccountChanged()
{
auto accountId = lrcInstance_->getCurrAccId();
setProperties(accountId);
connectAccount(accountId);
}
bool
AccountAdapter::hasPassword()
{
auto confProps = lrcInstance_->accountModel().getAccountConfig(lrcInstance_->getCurrAccId());
return confProps.archiveHasPassword;
}
void
AccountAdapter::setArchiveHasPassword(bool isHavePassword)
{
auto confProps = lrcInstance_->accountModel().getAccountConfig(lrcInstance_->getCurrAccId());
confProps.archiveHasPassword = isHavePassword;
lrcInstance_->accountModel().setAccountConfig(lrcInstance_->getCurrAccId(), confProps);
}
bool
AccountAdapter::exportToFile(const QString& accountId,
const QString& path,
const QString& password) const
{
return lrcInstance_->accountModel().exportToFile(accountId, path, password);
}
void
AccountAdapter::setArchivePasswordAsync(const QString& accountID, const QString& password)
{
QtConcurrent::run([this, accountID, password] {
auto config = lrcInstance_->accountModel().getAccountConfig(accountID);
config.archivePassword = password;
lrcInstance_->accountModel().setAccountConfig(accountID, config);
});
}
void
AccountAdapter::passwordSetStatusMessageBox(bool success, QString title, QString infoToDisplay)
{
if (success) {
QMessageBox::information(0, title, infoToDisplay);
} else {
QMessageBox::critical(0, title, infoToDisplay);
}
}
void
AccountAdapter::deselectConversation()
{
if (lrcInstance_->get_selectedConvUid().isEmpty()) {
return;
}
// TODO: remove this unhealthy section
auto currentConversationModel = lrcInstance_->getCurrentConversationModel();
if (currentConversationModel == nullptr) {
return;
}
lrcInstance_->set_selectedConvUid();
}
void
AccountAdapter::connectAccount(const QString& accountId)
{
try {
auto& accInfo = lrcInstance_->accountModel().getAccountInfo(accountId);
QObject::disconnect(accountStatusChangedConnection_);
QObject::disconnect(accountProfileUpdatedConnection_);
QObject::disconnect(contactAddedConnection_);
QObject::disconnect(addedToConferenceConnection_);
QObject::disconnect(contactUnbannedConnection_);
accountStatusChangedConnection_
= QObject::connect(accInfo.accountModel,
&lrc::api::NewAccountModel::accountStatusChanged,
[this](const QString& accountId) {
Q_EMIT accountStatusChanged(accountId);
});
accountProfileUpdatedConnection_
= QObject::connect(accInfo.accountModel,
&lrc::api::NewAccountModel::profileUpdated,
[this](const QString& accountId) {
Q_EMIT accountStatusChanged(accountId);
});
contactAddedConnection_
= QObject::connect(accInfo.contactModel.get(),
&lrc::api::ContactModel::contactAdded,
[this, accountId](const QString& contactUri) {
const auto& convInfo = lrcInstance_->getConversationFromConvUid(
lrcInstance_->get_selectedConvUid());
if (convInfo.uid.isEmpty()) {
return;
}
auto& accInfo = lrcInstance_->accountModel().getAccountInfo(
accountId);
if (contactUri
== accInfo.contactModel
->getContact(convInfo.participants.at(0))
.profileInfo.uri) {
/*
* Update conversation.
*/
Q_EMIT updateConversationForAddedContact();
}
});
addedToConferenceConnection_
= QObject::connect(accInfo.callModel.get(),
&NewCallModel::callAddedToConference,
[this](const QString& callId, const QString& confId) {
Q_UNUSED(callId);
lrcInstance_->renderer()->addDistantRenderer(confId);
});
contactUnbannedConnection_ = QObject::connect(accInfo.contactModel.get(),
&lrc::api::ContactModel::bannedStatusChanged,
[this](const QString&, bool banned) {
if (!banned)
Q_EMIT contactUnbanned();
});
} catch (...) {
qWarning() << "Couldn't get account: " << accountId;
}
}
void
AccountAdapter::setProperties(const QString& accountId)
{
setProperty("currentAccountId", accountId);
auto accountType = lrcInstance_->getAccountInfo(accountId).profileInfo.type;
setProperty("currentAccountType", lrc::api::profile::to_string(accountType));
Q_EMIT deviceModelChanged();
}