blob: 2358ece9a14708ba0ba9bb94029a47ff024a694c [file] [log] [blame]
/*
* 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"
#undef REGISTERED
#include "../daemon/src/dring/account_const.h"
AccountAdapter::AccountAdapter(QObject *parent)
: QmlAdapterBase(parent)
{}
AccountAdapter::~AccountAdapter() {}
AccountAdapter &
AccountAdapter::instance()
{
static auto instance = new AccountAdapter;
return *instance;
}
void
AccountAdapter::initQmlObject()
{
setSelectedAccount(LRCInstance::getCurrAccId());
}
void
AccountAdapter::accountChanged(int index)
{
auto accountList = LRCInstance::accountModel().getAccountList();
if (accountList.size() > index)
setSelectedAccount(accountList.at(index));
}
void
AccountAdapter::connectFailure()
{
Utils::oneShotConnect(&LRCInstance::accountModel(),
&lrc::api::NewAccountModel::accountRemoved,
[this](const QString &accountId) {
Q_UNUSED(accountId);
emit reportFailure();
});
Utils::oneShotConnect(&LRCInstance::accountModel(),
&lrc::api::NewAccountModel::invalidAccountDetected,
[this](const QString &accountId) {
Q_UNUSED(accountId);
emit reportFailure();
});
}
void
AccountAdapter::createJamiAccount(QString registeredName,
const QVariantMap &settings,
QString photoBoothImgBase64,
bool isCreating)
{
Utils::oneShotConnect(
&LRCInstance::accountModel(),
&lrc::api::NewAccountModel::accountAdded,
[this, registeredName, settings, isCreating, photoBoothImgBase64](const QString &accountId) {
QSettings qSettings("jami.net", "Jami");
if (not qSettings.contains(SettingsKey::neverShowMeAgain)) {
qSettings.setValue(SettingsKey::neverShowMeAgain, false);
}
auto showBackup = isCreating && !settings.value(SettingsKey::neverShowMeAgain).toBool();
if (!registeredName.isEmpty()) {
Utils::oneShotConnect(&LRCInstance::accountModel(),
&lrc::api::NewAccountModel::nameRegistrationEnded,
[this, showBackup](const QString &accountId) {
emit accountAdded(showBackup,
LRCInstance::accountModel()
.getAccountList()
.indexOf(accountId));
});
LRCInstance::accountModel().registerName(accountId,
settings["password"].toString(),
registeredName);
} else {
emit accountAdded(showBackup,
LRCInstance::accountModel().getAccountList().indexOf(accountId));
}
// set up avatar pixmap from photobooth
QImage avatarImg;
const bool ret = avatarImg.loadFromData(
QByteArray::fromBase64(photoBoothImgBase64.toLatin1()));
if (!ret) {
qDebug() << "JAMI account creation BASE64 image loading failed";
} else {
LRCInstance::setAvatarForAccount(QPixmap::fromImage(avatarImg), accountId);
}
});
connectFailure();
QtConcurrent::run([this, settings] {
QMap<QString, QString> additionalAccountConfig;
additionalAccountConfig.insert(DRing::Account::ConfProperties::Ringtone::PATH,
Utils::GetRingtonePath());
LRCInstance::accountModel().createNewAccount(lrc::api::profile::Type::RING,
settings["alias"].toString(),
settings["archivePath"].toString(),
settings["password"].toString(),
settings["archivePin"].toString(),
"",
additionalAccountConfig);
});
}
void
AccountAdapter::createSIPAccount(const QVariantMap &settings, QString photoBoothImgBase64)
{
Utils::oneShotConnect(&LRCInstance::accountModel(),
&lrc::api::NewAccountModel::accountAdded,
[this, settings, photoBoothImgBase64](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.proxyServer = settings["proxy"].toString();
LRCInstance::accountModel().setAccountConfig(accountId, confProps);
// set up photobooth avatar to SIP avatar
QImage avatarImg;
const bool ret = avatarImg.loadFromData(
QByteArray::fromBase64(photoBoothImgBase64.toLatin1()));
if (!ret) {
qDebug() << "SIP account creation BASE64 image loading failed";
} else {
LRCInstance::setAvatarForAccount(QPixmap::fromImage(avatarImg),
accountId);
}
emit accountAdded(false,
LRCInstance::accountModel().getAccountList().indexOf(
accountId));
});
connectFailure();
QtConcurrent::run([this, settings] {
QMap<QString, QString> additionalAccountConfig;
additionalAccountConfig.insert(DRing::Account::ConfProperties::Ringtone::PATH,
Utils::GetRingtonePath());
LRCInstance::accountModel().createNewAccount(lrc::api::profile::Type::SIP,
settings["alias"].toString(),
settings["archivePath"].toString(),
"",
"",
settings["username"].toString(),
additionalAccountConfig);
QThread::sleep(2);
emit LRCInstance::instance().accountListChanged();
});
}
void
AccountAdapter::createJAMSAccount(const QVariantMap &settings)
{
Utils::oneShotConnect(&LRCInstance::accountModel(),
&lrc::api::NewAccountModel::accountAdded,
[this](const QString &accountId) {
Q_UNUSED(accountId)
if (!LRCInstance::accountModel().getAccountList().size())
return;
emit accountAdded(false,
LRCInstance::accountModel().getAccountList().indexOf(
accountId));
emit LRCInstance::instance().accountListChanged();
});
connectFailure();
QtConcurrent::run([this, settings] {
QMap<QString, QString> additionalAccountConfig;
additionalAccountConfig.insert(DRing::Account::ConfProperties::Ringtone::PATH,
Utils::GetRingtonePath());
LRCInstance::accountModel().connectToAccountManager(settings["username"].toString(),
settings["password"].toString(),
settings["manager"].toString(),
additionalAccountConfig);
});
}
void
AccountAdapter::deleteCurrentAccount()
{
LRCInstance::accountModel().removeAccount(LRCInstance::getCurrAccId());
}
bool
AccountAdapter::savePassword(const QString accountId,
const QString oldPassword,
const QString newPassword)
{
return LRCInstance::accountModel().changeAccountPassword(accountId, oldPassword, newPassword);
}
void
AccountAdapter::startAudioMeter(bool async)
{
LRCInstance::startAudioMeter(async);
}
void
AccountAdapter::stopAudioMeter(bool async)
{
LRCInstance::stopAudioMeter(async);
}
void
AccountAdapter::startPreviewing(bool force, bool async)
{
LRCInstance::renderer()->startPreviewing(force, async);
}
void
AccountAdapter::stopPreviewing(bool async)
{
if (!LRCInstance::hasVideoCall() && LRCInstance::renderer()->isPreviewing()) {
LRCInstance::renderer()->stopPreviewing(async);
}
}
bool
AccountAdapter::hasVideoCall()
{
return LRCInstance::hasVideoCall();
}
bool
AccountAdapter::isPreviewing()
{
return LRCInstance::renderer()->isPreviewing();
}
void
AccountAdapter::setCurrAccDisplayName(QString text)
{
LRCInstance::setCurrAccDisplayName(text);
}
void
AccountAdapter::setSelectedAccountId(QString accountId)
{
LRCInstance::setSelectedAccountId(accountId);
}
void
AccountAdapter::setSelectedConvId(QString accountId)
{
LRCInstance::setSelectedConvId(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::settingsNeverShowAgain(bool checked)
{
QSettings settings("jami.net", "Jami");
settings.setValue(SettingsKey::neverShowMeAgain, checked);
}
void
AccountAdapter::passwordSetStatusMessageBox(bool success, QString title, QString infoToDisplay)
{
if (success) {
QMessageBox::information(0, title, infoToDisplay);
} else {
QMessageBox::critical(0, title, infoToDisplay);
}
}
void
AccountAdapter::setSelectedAccount(const QString &accountId)
{
LRCInstance::setSelectedAccountId(accountId);
connectAccount(accountId);
emit accountSignalsReconnect(accountId);
backToWelcomePage();
}
void
AccountAdapter::backToWelcomePage()
{
deselectConversation();
QMetaObject::invokeMethod(qmlObj_, "backToWelcomePage");
}
void
AccountAdapter::deselectConversation()
{
if (LRCInstance::getCurrentConvUid().isEmpty()) {
return;
}
auto currentConversationModel = LRCInstance::getCurrentConversationModel();
if (currentConversationModel == nullptr) {
return;
}
currentConversationModel->selectConversation("");
LRCInstance::setSelectedConvId();
}
void
AccountAdapter::connectAccount(const QString &accountId)
{
try {
auto &accInfo = LRCInstance::accountModel().getAccountInfo(accountId);
QObject::disconnect(accountStatusChangedConnection_);
QObject::disconnect(contactAddedConnection_);
accountStatusChangedConnection_
= QObject::connect(accInfo.accountModel,
&lrc::api::NewAccountModel::accountStatusChanged,
[this] { emit accountStatusChanged(); });
contactAddedConnection_
= QObject::connect(accInfo.contactModel.get(),
&lrc::api::ContactModel::contactAdded,
[this, accountId](const QString &contactUri) {
auto &accInfo = LRCInstance::accountModel().getAccountInfo(
accountId);
auto* convModel = LRCInstance::getCurrentConversationModel();
const auto conversation = convModel->getConversationForUID(
LRCInstance::getCurrentConvUid());
if (conversation.uid.isEmpty()) {
return;
}
if (contactUri
== accInfo.contactModel
->getContact(conversation.participants.at(0))
.profileInfo.uri) {
/*
* Update conversation.
*/
emit updateConversationForAddedContact();
}
});
QObject::disconnect(addedToConferenceConnection_);
addedToConferenceConnection_
= QObject::connect(accInfo.callModel.get(),
&NewCallModel::callAddedToConference,
[this](const QString &callId, const QString &confId) {
Q_UNUSED(callId);
LRCInstance::renderer()->addDistantRenderer(confId);
});
} catch (...) {
qWarning() << "Couldn't get account: " << accountId;
}
}