fix get size with screen ratio function

fix chat sending area ui #LINQT-2068

print debug logs in linphone files for futur debugging

fix call history details ui when no video conference factory set

use remote name of each call if in local conference #LINQT-2058
This commit is contained in:
Gaelle Braud 2025-10-20 10:46:20 +02:00
parent 7825646edd
commit b17bc8cc27
38 changed files with 597 additions and 545 deletions

View file

@ -435,10 +435,10 @@ void App::setSelf(QSharedPointer<App>(me)) {
mCliModelConnection->makeConnectToCore(&App::receivedMessage, [this](int, const QByteArray &byteArray) { mCliModelConnection->makeConnectToCore(&App::receivedMessage, [this](int, const QByteArray &byteArray) {
QString command(byteArray); QString command(byteArray);
if (command.isEmpty()) { if (command.isEmpty()) {
lDebug() << log().arg("Check with CliModel for commands"); lInfo() << log().arg("Check with CliModel for commands");
mCliModelConnection->invokeToModel([]() { CliModel::getInstance()->runProcess(); }); mCliModelConnection->invokeToModel([]() { CliModel::getInstance()->runProcess(); });
} else { } else {
qInfo() << QStringLiteral("Received command from other application: `%1`.").arg(command); lInfo() << log().arg("Received command from other application: `%1`.").arg(command);
mCliModelConnection->invokeToModel([command]() { CliModel::getInstance()->executeCommand(command); }); mCliModelConnection->invokeToModel([command]() { CliModel::getInstance()->executeCommand(command); });
} }
}); });

View file

@ -60,7 +60,10 @@ AccountCore::AccountCore(const std::shared_ptr<linphone::Account> &account) : QO
mRegisterEnabled = params->registerEnabled(); mRegisterEnabled = params->registerEnabled();
mMwiServerAddress = mMwiServerAddress =
params->getMwiServerAddress() ? Utils::coreStringToAppString(params->getMwiServerAddress()->asString()) : ""; params->getMwiServerAddress() ? Utils::coreStringToAppString(params->getMwiServerAddress()->asString()) : "";
mTransports << "UDP" << "TCP" << "TLS" << "DTLS"; mTransports << "UDP"
<< "TCP"
<< "TLS"
<< "DTLS";
mTransport = LinphoneEnums::toString(LinphoneEnums::fromLinphone(params->getTransport())); mTransport = LinphoneEnums::toString(LinphoneEnums::fromLinphone(params->getTransport()));
mRegistrarUri = mRegistrarUri =
params->getServerAddress() ? Utils::coreStringToAppString(params->getServerAddress()->asString()) : ""; params->getServerAddress() ? Utils::coreStringToAppString(params->getServerAddress()->asString()) : "";
@ -384,7 +387,7 @@ void AccountCore::onRegistrationStateChanged(const std::shared_ptr<linphone::Acc
linphone::RegistrationState state, linphone::RegistrationState state,
const std::string &message) { const std::string &message) {
mRegistrationState = LinphoneEnums::fromLinphone(state); mRegistrationState = LinphoneEnums::fromLinphone(state);
lDebug() << log().arg(Q_FUNC_INFO) << mRegistrationState; qDebug() << log().arg(Q_FUNC_INFO) << mRegistrationState;
emit registrationStateChanged(Utils::coreStringToAppString(message)); emit registrationStateChanged(Utils::coreStringToAppString(message));
} }

View file

@ -22,6 +22,7 @@
#include "CallCore.hpp" #include "CallCore.hpp"
#include "CallGui.hpp" #include "CallGui.hpp"
#include "core/App.hpp" #include "core/App.hpp"
#include "model/tool/ToolModel.hpp"
#include <QSharedPointer> #include <QSharedPointer>
#include <linphone++/linphone.hh> #include <linphone++/linphone.hh>
@ -96,34 +97,26 @@ void CallList::setSelf(QSharedPointer<CallList> me) {
bool enablingVideo = false; bool enablingVideo = false;
if (currentCall) enablingVideo = currentCall->getCurrentParams()->videoEnabled(); if (currentCall) enablingVideo = currentCall->getCurrentParams()->videoEnabled();
if (!conference) { if (!conference) {
auto parameters = core->createConferenceParams(conference);
auto audioVideoConfFactoryUri = auto audioVideoConfFactoryUri =
core->getDefaultAccount()->getParams()->getAudioVideoConferenceFactoryAddress(); core->getDefaultAccount()->getParams()->getAudioVideoConferenceFactoryAddress();
if (audioVideoConfFactoryUri) { QString subject = audioVideoConfFactoryUri
parameters->setConferenceFactoryAddress(audioVideoConfFactoryUri); //: Remote group call
parameters->setSubject("Meeting"); ? tr("remote_group_call")
//: "Local group call"
: tr("local_group_call");
auto conference = ToolModel::createConference(subject, nullptr);
if (!conference) {
lWarning() << log().arg("Failed to merge calls");
mModelConnection->invokeToCore([] {
Utils::showInformationPopup(tr("info_popup_error_title"),
//: Failed to merge calls !
tr("info_popup_merge_calls_failed_message"), false);
});
return;
} else { } else {
parameters->setSubject("Local meeting"); conference->addParticipants(currentCalls);
}
parameters->enableVideo(enablingVideo);
conference = core->createConferenceWithParams(parameters);
}
std::list<std::shared_ptr<linphone::Address>> allLinphoneAddresses;
std::list<std::shared_ptr<linphone::Address>> newCalls;
std::list<std::shared_ptr<linphone::Call>> runningCallsToAdd;
for (auto call : currentCalls) {
if (!call->getConference()) {
runningCallsToAdd.push_back(call);
} }
} }
// 1) Add running calls
if (runningCallsToAdd.size() > 0) {
conference->addParticipants(runningCallsToAdd);
}
// emit lUpdate(); // emit lUpdate();
}); });
}); });

View file

@ -323,16 +323,16 @@ void ChatMessageCore::setSelf(QSharedPointer<ChatMessageCore> me) {
mChatMessageModelConnection->makeConnectToModel( mChatMessageModelConnection->makeConnectToModel(
&ChatMessageModel::fileTransferRecv, &ChatMessageModel::fileTransferRecv,
[this](const std::shared_ptr<linphone::ChatMessage> &message, const std::shared_ptr<linphone::Content> &content, [this](const std::shared_ptr<linphone::ChatMessage> &message, const std::shared_ptr<linphone::Content> &content,
const std::shared_ptr<const linphone::Buffer> &buffer) { qDebug() << "transfer received"; }); const std::shared_ptr<const linphone::Buffer> &buffer) { lInfo() << log().arg("transfer received"); });
mChatMessageModelConnection->makeConnectToModel( mChatMessageModelConnection->makeConnectToModel(
&ChatMessageModel::fileTransferSend, &ChatMessageModel::fileTransferSend,
[this](const std::shared_ptr<linphone::ChatMessage> &message, const std::shared_ptr<linphone::Content> &content, [this](const std::shared_ptr<linphone::ChatMessage> &message, const std::shared_ptr<linphone::Content> &content,
size_t offset, size_t size) { qDebug() << "transfer send"; }); size_t offset, size_t size) { lInfo() << log().arg("transfer send"); });
mChatMessageModelConnection->makeConnectToModel( mChatMessageModelConnection->makeConnectToModel(
&ChatMessageModel::fileTransferSendChunk, &ChatMessageModel::fileTransferSendChunk,
[this](const std::shared_ptr<linphone::ChatMessage> &message, const std::shared_ptr<linphone::Content> &content, [this](const std::shared_ptr<linphone::ChatMessage> &message, const std::shared_ptr<linphone::Content> &content,
size_t offset, size_t size, size_t offset, size_t size,
const std::shared_ptr<linphone::Buffer> &buffer) { qDebug() << "transfer send chunk"; }); const std::shared_ptr<linphone::Buffer> &buffer) { lInfo() << log().arg("transfer send chunk"); });
mChatMessageModelConnection->makeConnectToModel( mChatMessageModelConnection->makeConnectToModel(
&ChatMessageModel::participantImdnStateChanged, &ChatMessageModel::participantImdnStateChanged,
[this](const std::shared_ptr<linphone::ChatMessage> &message, [this](const std::shared_ptr<linphone::ChatMessage> &message,

View file

@ -139,7 +139,7 @@ void ChatMessageContentList::addFiles(const QStringList &paths) {
qint64 fileSize = file.size(); qint64 fileSize = file.size();
if (fileSize > Constants::FileSizeLimit) { if (fileSize > Constants::FileSizeLimit) {
++nbTooBig; ++nbTooBig;
qWarning() << QString("Unable to send file. (Size limit=%1)").arg(Constants::FileSizeLimit); lWarning() << log().arg("Unable to send file. (Size limit=%1)").arg(Constants::FileSizeLimit);
continue; continue;
} }
auto name = file.fileName().toStdString(); auto name = file.fileName().toStdString();
@ -149,7 +149,7 @@ void ChatMessageContentList::addFiles(const QStringList &paths) {
if (mimeType.length() != 2) { if (mimeType.length() != 2) {
++nbMimeError; ++nbMimeError;
lastMimeError = path; lastMimeError = path;
qWarning() << QString("Unable to get supported mime type for: `%1`.").arg(path); lWarning() << log().arg("Unable to get supported mime type for: `%1`.").arg(path);
continue; continue;
} }
content->setType(Utils::appStringToCoreString(mimeType[0])); content->setType(Utils::appStringToCoreString(mimeType[0]));

View file

@ -105,7 +105,7 @@ void ConferenceInfoList::setSelf(QSharedPointer<ConferenceInfoList> me) {
&CoreModel::conferenceInfoReceived, &CoreModel::conferenceInfoReceived,
[this](const std::shared_ptr<linphone::Core> &core, [this](const std::shared_ptr<linphone::Core> &core,
const std::shared_ptr<const linphone::ConferenceInfo> &conferenceInfo) { const std::shared_ptr<const linphone::ConferenceInfo> &conferenceInfo) {
lDebug() << log().arg("conference info received") << conferenceInfo->getSubject(); lInfo() << log().arg("conference info received") << conferenceInfo->getSubject();
// We must refresh all the conference infos cause we are not able to determine // We must refresh all the conference infos cause we are not able to determine
// which account is concerned by the signal if multiple accounts are connected // which account is concerned by the signal if multiple accounts are connected
emit lUpdate(); emit lUpdate();

View file

@ -282,8 +282,8 @@ void Notifier::notifyReceivedCall(const shared_ptr<linphone::Call> &call) {
auto accountModel = Utils::makeQObject_ptr<AccountModel>(account); auto accountModel = Utils::makeQObject_ptr<AccountModel>(account);
accountModel->setSelf(accountModel); accountModel->setSelf(accountModel);
if (!accountModel->getNotificationsAllowed()) { if (!accountModel->getNotificationsAllowed()) {
qInfo() lInfo() << log().arg(
<< "Notifications have been disabled for this account - not creating a notification for incoming call"; "Notifications have been disabled for this account - not creating a notification for incoming call");
if (accountModel->forwardToVoiceMailInDndPresence()) { if (accountModel->forwardToVoiceMailInDndPresence()) {
lInfo() << log().arg("Transferring call to voicemail"); lInfo() << log().arg("Transferring call to voicemail");
auto voicemailAddress = linphone::Factory::get()->createAddress( auto voicemailAddress = linphone::Factory::get()->createAddress(
@ -341,8 +341,9 @@ void Notifier::notifyReceivedMessages(const std::shared_ptr<linphone::ChatRoom>
auto accountModel = Utils::makeQObject_ptr<AccountModel>(receiverAccount); auto accountModel = Utils::makeQObject_ptr<AccountModel>(receiverAccount);
accountModel->setSelf(accountModel); accountModel->setSelf(accountModel);
if (!accountModel->getNotificationsAllowed()) { if (!accountModel->getNotificationsAllowed()) {
qInfo() << "Notifications have been disabled for this account - not creating a notification for " lInfo() << log().arg(
"incoming message"; "Notifications have been disabled for this account - not creating a notification for "
"incoming message");
return; return;
} }
} }

View file

@ -164,7 +164,7 @@ static inline QString getAppRootCaFilePath() {
if (Paths::filePathExists(rootca)) { // Packaged if (Paths::filePathExists(rootca)) { // Packaged
return rootca; return rootca;
} else { } else {
qDebug() << "Root ca path does not exist. Create it"; lInfo() << "Root ca path does not exist. Create it";
QFileInfo rootcaInfo(rootca); QFileInfo rootcaInfo(rootca);
if (!rootcaInfo.absoluteDir().exists()) { if (!rootcaInfo.absoluteDir().exists()) {
QDir dataDir(getAppPackageDataDirPath()); QDir dataDir(getAppPackageDataDirPath());

View file

@ -140,7 +140,7 @@ void MagicSearchList::setSelf(QSharedPointer<MagicSearchList> me) {
emit resultsProcessed(); emit resultsProcessed();
}); });
}); });
qDebug() << log().arg("Initialized"); lDebug() << log().arg("Initialized");
emit initialized(); emit initialized();
}); });
}); });
@ -157,7 +157,7 @@ void MagicSearchList::setResults(const QList<QSharedPointer<FriendCore>> &contac
if (!isFriendCore) continue; if (!isFriendCore) continue;
disconnect(isFriendCore.get()); disconnect(isFriendCore.get());
} }
qDebug() << log().arg("SetResults: %1").arg(contacts.size()); lDebug() << log().arg("SetResults: %1").arg(contacts.size());
resetData<FriendCore>(contacts); resetData<FriendCore>(contacts);
for (auto it : contacts) { for (auto it : contacts) {
connectContact(it.get()); connectContact(it.get());

View file

@ -39,45 +39,45 @@
<context> <context>
<name>AccountCore</name> <name>AccountCore</name>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="435"/> <location filename="../../core/account/AccountCore.cpp" line="446"/>
<source>drawer_menu_account_connection_status_connected</source> <source>drawer_menu_account_connection_status_connected</source>
<extracomment>&quot;Connecté&quot;</extracomment> <extracomment>&quot;Connecté&quot;</extracomment>
<translation>Verbunden</translation> <translation>Verbunden</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="438"/> <location filename="../../core/account/AccountCore.cpp" line="449"/>
<source>drawer_menu_account_connection_status_refreshing</source> <source>drawer_menu_account_connection_status_refreshing</source>
<translation>Aktualisiere</translation> <translation>Aktualisiere</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="441"/> <location filename="../../core/account/AccountCore.cpp" line="452"/>
<source>drawer_menu_account_connection_status_progress</source> <source>drawer_menu_account_connection_status_progress</source>
<translation>Verbinde</translation> <translation>Verbinde</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="444"/> <location filename="../../core/account/AccountCore.cpp" line="455"/>
<source>drawer_menu_account_connection_status_failed</source> <source>drawer_menu_account_connection_status_failed</source>
<translation>Fehler</translation> <translation>Fehler</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="448"/> <location filename="../../core/account/AccountCore.cpp" line="459"/>
<source>drawer_menu_account_connection_status_cleared</source> <source>drawer_menu_account_connection_status_cleared</source>
<translation>Deaktiviert</translation> <translation>Deaktiviert</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="482"/> <location filename="../../core/account/AccountCore.cpp" line="493"/>
<source>manage_account_status_connected_summary</source> <source>manage_account_status_connected_summary</source>
<extracomment>&quot;Vous êtes en ligne et joignable.&quot;</extracomment> <extracomment>&quot;Vous êtes en ligne et joignable.&quot;</extracomment>
<translation>Sie sind online und erreichbar.</translation> <translation>Sie sind online und erreichbar.</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="485"/> <location filename="../../core/account/AccountCore.cpp" line="496"/>
<source>manage_account_status_failed_summary</source> <source>manage_account_status_failed_summary</source>
<extracomment>&quot;Erreur de connexion, vérifiez vos paramètres.&quot;</extracomment> <extracomment>&quot;Erreur de connexion, vérifiez vos paramètres.&quot;</extracomment>
<translation>Verbindungsfehler, überprüfen Sie Ihre Einstellungen.</translation> <translation>Verbindungsfehler, überprüfen Sie Ihre Einstellungen.</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="489"/> <location filename="../../core/account/AccountCore.cpp" line="500"/>
<source>manage_account_status_cleared_summary</source> <source>manage_account_status_cleared_summary</source>
<extracomment>&quot;Compte désactivé, vous ne recevrez ni appel ni message.&quot;</extracomment> <extracomment>&quot;Compte désactivé, vous ne recevrez ni appel ni message.&quot;</extracomment>
<translation>Konto deaktiviert, Sie erhalten keine Anrufe oder Nachrichten.</translation> <translation>Konto deaktiviert, Sie erhalten keine Anrufe oder Nachrichten.</translation>
@ -634,102 +634,101 @@
<context> <context>
<name>App</name> <name>App</name>
<message> <message>
<location filename="../../core/App.cpp" line="357"/> <location filename="../../core/App.cpp" line="356"/>
<source>remote_provisioning_dialog</source> <source>remote_provisioning_dialog</source>
<extracomment>Voulez-vous télécharger et appliquer la configuration depuis cette adresse ?</extracomment> <extracomment>Voulez-vous télécharger et appliquer la configuration depuis cette adresse ?</extracomment>
<translation>Möchten Sie die Remote-Konfiguration von dieser Adresse herunterladen und anwenden?</translation> <translation>Möchten Sie die Remote-Konfiguration von dieser Adresse herunterladen und anwenden?</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="394"/> <location filename="../../core/App.cpp" line="393"/>
<location filename="../../core/App.cpp" line="648"/> <location filename="../../core/App.cpp" line="658"/>
<source>info_popup_error_title</source> <source>info_popup_error_title</source>
<extracomment>Error</extracomment> <extracomment>Error</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="395"/> <location filename="../../core/App.cpp" line="394"/>
<location filename="../../core/App.cpp" line="650"/> <location filename="../../core/App.cpp" line="660"/>
<source>info_popup_configuration_failed_message</source> <source>info_popup_configuration_failed_message</source>
<extracomment>Remote provisioning failed : %1</extracomment> <extracomment>Remote provisioning failed : %1</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="644"/> <location filename="../../core/App.cpp" line="654"/>
<source>configuration_error_detail</source> <source>configuration_error_detail</source>
<extracomment>not reachable</extracomment> <extracomment>not reachable</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="916"/> <location filename="../../core/App.cpp" line="926"/>
<source>application_description</source> <source>application_description</source>
<extracomment>&quot;A free and open source SIP video-phone.&quot;</extracomment> <extracomment>&quot;A free and open source SIP video-phone.&quot;</extracomment>
<translation>Ein kostenloses Open-Source SIP Video-Telefon.</translation> <translation>Ein kostenloses Open-Source SIP Video-Telefon.</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="918"/> <location filename="../../core/App.cpp" line="928"/>
<source>command_line_arg_order</source> <source>command_line_arg_order</source>
<extracomment>&quot;Send an order to the application towards a command line&quot;</extracomment> <extracomment>&quot;Send an order to the application towards a command line&quot;</extracomment>
<translation>Kommandozeilen-Befehl an die Anwendung schicken</translation> <translation>Kommandozeilen-Befehl an die Anwendung schicken</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="922"/> <location filename="../../core/App.cpp" line="932"/>
<source>command_line_option_show_help</source> <source>command_line_option_show_help</source>
<translation>Zeige Hilfe</translation> <translation>Zeige Hilfe</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="927"/> <location filename="../../core/App.cpp" line="937"/>
<source>command_line_option_show_app_version</source> <source>command_line_option_show_app_version</source>
<translation type="unfinished">Zeige App-Version</translation> <translation type="unfinished">Zeige App-Version</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="935"/> <location filename="../../core/App.cpp" line="945"/>
<source>command_line_option_config_to_fetch</source> <source>command_line_option_config_to_fetch</source>
<extracomment>&quot;Specify the linphone configuration file to be fetched. It will be merged with the current configuration.&quot;</extracomment> <extracomment>&quot;Specify the linphone configuration file to be fetched. It will be merged with the current configuration.&quot;</extracomment>
<translation>Abzurufende Linphone-Konfigurationsdatei angeben. Sie wird mit der aktuellen Konfiguration zusammengeführt.</translation> <translation>Abzurufende Linphone-Konfigurationsdatei angeben. Sie wird mit der aktuellen Konfiguration zusammengeführt.</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="937"/> <location filename="../../core/App.cpp" line="947"/>
<source>command_line_option_config_to_fetch_arg</source> <source>command_line_option_config_to_fetch_arg</source>
<extracomment>&quot;URL, path or file&quot;</extracomment> <extracomment>&quot;URL, path or file&quot;</extracomment>
<translation>URL, Pfad oder Datei</translation> <translation>URL, Pfad oder Datei</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="942"/> <location filename="../../core/App.cpp" line="952"/>
<source>command_line_option_minimized</source> <source>command_line_option_minimized</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="945"/> <location filename="../../core/App.cpp" line="955"/>
<source>command_line_option_log_to_stdout</source> <source>command_line_option_log_to_stdout</source>
<translation>Debug-Informationen auf der Standardausgabe ausgeben</translation> <translation>Debug-Informationen auf der Standardausgabe ausgeben</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="948"/> <location filename="../../core/App.cpp" line="958"/>
<source>command_line_option_print_app_logs_only</source> <source>command_line_option_print_app_logs_only</source>
<extracomment>&quot;Print only logs from the application&quot;</extracomment> <extracomment>&quot;Print only logs from the application&quot;</extracomment>
<translation>Nur Anwendungs-Logs ausgeben</translation> <translation>Nur Anwendungs-Logs ausgeben</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1318"/> <location filename="../../core/App.cpp" line="1329"/>
<source>hide_action</source> <source>hide_action</source>
<extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment> <extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment>
<translation>Ausblenden</translation> <translation>Ausblenden</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1318"/> <location filename="../../core/App.cpp" line="1329"/>
<source>show_action</source> <source>show_action</source>
<translation>Zeigen</translation> <translation>Zeigen</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1333"/> <location filename="../../core/App.cpp" line="1344"/>
<source>quit_action</source> <source>quit_action</source>
<extracomment>&quot;Quitter&quot;</extracomment> <extracomment>&quot;Quitter&quot;</extracomment>
<translation>Beenden</translation> <translation>Beenden</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1337"/> <location filename="../../core/App.cpp" line="1448"/>
<source>mark_all_read_action</source> <source>mark_all_read_action</source>
<extracomment>&quot;Mark all as read&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
@ -946,7 +945,7 @@
<translation type="vanished">Offline</translation> <translation type="vanished">Offline</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Container/Call/CallHistoryLayout.qml" line="116"/> <location filename="../../view/Control/Container/Call/CallHistoryLayout.qml" line="111"/>
<source>meeting_info_join_title</source> <source>meeting_info_join_title</source>
<extracomment>&quot;Rejoindre la réunion&quot;</extracomment> <extracomment>&quot;Rejoindre la réunion&quot;</extracomment>
<translation>Besprechung beitreten</translation> <translation>Besprechung beitreten</translation>
@ -1023,52 +1022,77 @@
<translation>Der Besprechungs-Link wurde in die Zwischenablage kopiert</translation> <translation>Der Besprechungs-Link wurde in die Zwischenablage kopiert</translation>
</message> </message>
</context> </context>
<context>
<name>CallList</name>
<message>
<location filename="../../core/call/CallList.cpp" line="104"/>
<source>remote_group_call</source>
<extracomment>Remote group call</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/call/CallList.cpp" line="106"/>
<source>local_group_call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/call/CallList.cpp" line="111"/>
<source>info_popup_error_title</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/call/CallList.cpp" line="113"/>
<source>info_popup_merge_calls_failed_message</source>
<extracomment>Failed to merge calls !</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>CallListView</name> <name>CallListView</name>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="55"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="59"/>
<source>meeting</source> <source>meeting</source>
<extracomment>&quot;Réunion</extracomment> <extracomment>&quot;Réunion</extracomment>
<translation>Besprechung</translation> <translation>Besprechung</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="57"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="61"/>
<source>call</source> <source>call</source>
<extracomment>&quot;Appel&quot;</extracomment> <extracomment>&quot;Appel&quot;</extracomment>
<translation>Anruf</translation> <translation>Anruf</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="62"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="66"/>
<source>paused_call_or_meeting</source> <source>paused_call_or_meeting</source>
<extracomment>&quot;%1 en pause&quot;</extracomment> <extracomment>&quot;%1 en pause&quot;</extracomment>
<translation>%1 pausiert</translation> <translation>%1 pausiert</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="64"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="68"/>
<source>ongoing_call_or_meeting</source> <source>ongoing_call_or_meeting</source>
<extracomment>&quot;%1 en cours&quot;</extracomment> <extracomment>&quot;%1 en cours&quot;</extracomment>
<translation>%1 laufend</translation> <translation>%1 laufend</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="84"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="88"/>
<source>transfer_call_name_accessible_name</source> <source>transfer_call_name_accessible_name</source>
<extracomment>Transfer call %1</extracomment> <extracomment>Transfer call %1</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="112"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="116"/>
<source>resume_call_name_accessible_name</source> <source>resume_call_name_accessible_name</source>
<extracomment>Resume %1 call</extracomment> <extracomment>Resume %1 call</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="114"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="118"/>
<source>pause_call_name_accessible_name</source> <source>pause_call_name_accessible_name</source>
<extracomment>Pause %1 call</extracomment> <extracomment>Pause %1 call</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="137"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="141"/>
<source>end_call_name_accessible_name</source> <source>end_call_name_accessible_name</source>
<extracomment>End %1 call</extracomment> <extracomment>End %1 call</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2032,13 +2056,13 @@
<context> <context>
<name>ChatDroppableTextArea</name> <name>ChatDroppableTextArea</name>
<message> <message>
<location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="152"/> <location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="154"/>
<source>chat_view_send_area_placeholder_text</source> <source>chat_view_send_area_placeholder_text</source>
<extracomment>Say something : placeholder text for sending message text area</extracomment> <extracomment>Say something : placeholder text for sending message text area</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="187"/> <location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="190"/>
<source>cannot_record_while_in_call_tooltip</source> <source>cannot_record_while_in_call_tooltip</source>
<extracomment>Cannot record a message while a call is ongoing</extracomment> <extracomment>Cannot record a message while a call is ongoing</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2261,13 +2285,13 @@ Error</extracomment>
<context> <context>
<name>ChatMessageContentModel</name> <name>ChatMessageContentModel</name>
<message> <message>
<location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="104"/> <location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="105"/>
<source>popup_error_title</source> <source>popup_error_title</source>
<extracomment>Error</extracomment> <extracomment>Error</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="107"/> <location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="108"/>
<source>popup_download_error_message</source> <source>popup_download_error_message</source>
<extracomment>This file was already downloaded and is no more on the server. Your peer have to resend it if you want to get it</extracomment> <extracomment>This file was already downloaded and is no more on the server. Your peer have to resend it if you want to get it</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -4874,36 +4898,36 @@ Error</extracomment>
<context> <context>
<name>Notifier</name> <name>Notifier</name>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="309"/> <location filename="../../core/notifier/Notifier.cpp" line="310"/>
<source>new_call_alert_accessible_name</source> <source>new_call_alert_accessible_name</source>
<extracomment>New call from %1</extracomment> <extracomment>New call from %1</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="361"/> <location filename="../../core/notifier/Notifier.cpp" line="363"/>
<source>new_voice_message</source> <source>new_voice_message</source>
<extracomment>&apos;Voice message received!&apos; : message to warn the user in a notofication for voice messages.</extracomment> <extracomment>&apos;Voice message received!&apos; : message to warn the user in a notofication for voice messages.</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="362"/> <location filename="../../core/notifier/Notifier.cpp" line="364"/>
<source>new_file_message</source> <source>new_file_message</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="365"/> <location filename="../../core/notifier/Notifier.cpp" line="367"/>
<source>new_conference_invitation</source> <source>new_conference_invitation</source>
<extracomment>&apos;Conference invitation received!&apos; : Notification about receiving an invitation to a conference.</extracomment> <extracomment>&apos;Conference invitation received!&apos; : Notification about receiving an invitation to a conference.</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="385"/> <location filename="../../core/notifier/Notifier.cpp" line="387"/>
<source>new_chat_room_messages</source> <source>new_chat_room_messages</source>
<extracomment>&apos;New messages received!&apos; Notification that warn the user of new messages.</extracomment> <extracomment>&apos;New messages received!&apos; Notification that warn the user of new messages.</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="392"/> <location filename="../../core/notifier/Notifier.cpp" line="394"/>
<source>new_message_alert_accessible_name</source> <source>new_message_alert_accessible_name</source>
<extracomment>New message on chatroom %1</extracomment> <extracomment>New message on chatroom %1</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -4923,102 +4947,102 @@ Error</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="123"/> <location filename="../../model/auth/OIDCModel.cpp" line="125"/>
<source>oidc_authentication_granted_message</source> <source>oidc_authentication_granted_message</source>
<extracomment>Authentication granted</extracomment> <extracomment>Authentication granted</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="130"/> <location filename="../../model/auth/OIDCModel.cpp" line="132"/>
<source>oidc_authentication_not_authenticated_message</source> <source>oidc_authentication_not_authenticated_message</source>
<extracomment>Not authenticated</extracomment> <extracomment>Not authenticated</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="136"/> <location filename="../../model/auth/OIDCModel.cpp" line="138"/>
<source>oidc_authentication_refresh_message</source> <source>oidc_authentication_refresh_message</source>
<extracomment>Refreshing token</extracomment> <extracomment>Refreshing token</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="141"/> <location filename="../../model/auth/OIDCModel.cpp" line="143"/>
<source>oidc_authentication_temporary_credentials_message</source> <source>oidc_authentication_temporary_credentials_message</source>
<extracomment>Temporary credentials received</extracomment> <extracomment>Temporary credentials received</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="159"/> <location filename="../../model/auth/OIDCModel.cpp" line="161"/>
<source>oidc_authentication_network_error</source> <source>oidc_authentication_network_error</source>
<extracomment>Network error</extracomment> <extracomment>Network error</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="163"/> <location filename="../../model/auth/OIDCModel.cpp" line="165"/>
<source>oidc_authentication_server_error</source> <source>oidc_authentication_server_error</source>
<extracomment>Server error</extracomment> <extracomment>Server error</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="167"/> <location filename="../../model/auth/OIDCModel.cpp" line="169"/>
<source>oidc_authentication_token_not_found_error</source> <source>oidc_authentication_token_not_found_error</source>
<extracomment>OAuth token not found</extracomment> <extracomment>OAuth token not found</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="171"/> <location filename="../../model/auth/OIDCModel.cpp" line="173"/>
<source>oidc_authentication_token_secret_not_found_error</source> <source>oidc_authentication_token_secret_not_found_error</source>
<extracomment>OAuth token secret not found</extracomment> <extracomment>OAuth token secret not found</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="175"/> <location filename="../../model/auth/OIDCModel.cpp" line="177"/>
<source>oidc_authentication_callback_not_verified_error</source> <source>oidc_authentication_callback_not_verified_error</source>
<extracomment>OAuth callback not verified</extracomment> <extracomment>OAuth callback not verified</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="186"/> <location filename="../../model/auth/OIDCModel.cpp" line="188"/>
<source>oidc_authentication_request_auth_message</source> <source>oidc_authentication_request_auth_message</source>
<extracomment>Requesting authorization from browser</extracomment> <extracomment>Requesting authorization from browser</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="217"/> <location filename="../../model/auth/OIDCModel.cpp" line="219"/>
<source>oidc_authentication_no_token_found_error</source> <source>oidc_authentication_no_token_found_error</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="230"/> <location filename="../../model/auth/OIDCModel.cpp" line="232"/>
<source>oidc_authentication_request_token_message</source> <source>oidc_authentication_request_token_message</source>
<extracomment>Requesting access token</extracomment> <extracomment>Requesting access token</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="235"/> <location filename="../../model/auth/OIDCModel.cpp" line="237"/>
<source>oidc_authentication_refresh_token_message</source> <source>oidc_authentication_refresh_token_message</source>
<extracomment>Refreshing access token</extracomment> <extracomment>Refreshing access token</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="240"/> <location filename="../../model/auth/OIDCModel.cpp" line="242"/>
<source>oidc_authentication_request_authorization_message</source> <source>oidc_authentication_request_authorization_message</source>
<extracomment>Requesting authorization</extracomment> <extracomment>Requesting authorization</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="245"/> <location filename="../../model/auth/OIDCModel.cpp" line="247"/>
<source>oidc_authentication_request_temporary_credentials_message</source> <source>oidc_authentication_request_temporary_credentials_message</source>
<extracomment>Requesting temporary credentials</extracomment> <extracomment>Requesting temporary credentials</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="272"/> <location filename="../../model/auth/OIDCModel.cpp" line="274"/>
<source>oidc_authentication_no_auth_found_in_config_error</source> <source>oidc_authentication_no_auth_found_in_config_error</source>
<extracomment>No authorization endpoint found in OpenID configuration</extracomment> <extracomment>No authorization endpoint found in OpenID configuration</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="287"/> <location filename="../../model/auth/OIDCModel.cpp" line="289"/>
<source>oidc_authentication_no_token_found_in_config_error</source> <source>oidc_authentication_no_token_found_in_config_error</source>
<extracomment>No token endpoint found in OpenID configuration</extracomment> <extracomment>No token endpoint found in OpenID configuration</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -5690,37 +5714,37 @@ Pour les activer dans un projet commercial, merci de nous contacter.</source>
<translation>Start a group call ?</translation> <translation>Start a group call ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="118"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="121"/>
<source>unencrypted_conversation_warning</source> <source>unencrypted_conversation_warning</source>
<extracomment>This conversation is not encrypted !</extracomment> <extracomment>This conversation is not encrypted !</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="436"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="407"/>
<source>reply_to_label</source> <source>reply_to_label</source>
<extracomment>Reply to %1</extracomment> <extracomment>Reply to %1</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="637"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="607"/>
<source>shared_medias_title</source> <source>shared_medias_title</source>
<extracomment>Shared medias</extracomment> <extracomment>Shared medias</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="639"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="609"/>
<source>shared_documents_title</source> <source>shared_documents_title</source>
<extracomment>Shared documents</extracomment> <extracomment>Shared documents</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="668"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="638"/>
<source>forward_to_title</source> <source>forward_to_title</source>
<extracomment>Forward to</extracomment> <extracomment>Forward to</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="702"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="672"/>
<source>conversations_title</source> <source>conversations_title</source>
<extracomment>Conversations</extracomment> <extracomment>Conversations</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -5859,38 +5883,38 @@ Pour les activer dans un projet commercial, merci de nous contacter.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="408"/> <location filename="../../model/tool/ToolModel.cpp" line="413"/>
<source>group_call_error_participants_invite</source> <source>group_call_error_participants_invite</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="412"/> <location filename="../../model/tool/ToolModel.cpp" line="417"/>
<source>group_call_error_creation</source> <source>group_call_error_creation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="512"/> <location filename="../../model/tool/ToolModel.cpp" line="517"/>
<source>voice_recording_duration</source> <source>voice_recording_duration</source>
<extracomment>&quot;Voice recording (%1)&quot; : %1 is the duration formated in mm:ss</extracomment> <extracomment>&quot;Voice recording (%1)&quot; : %1 is the duration formated in mm:ss</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="520"/> <location filename="../../model/tool/ToolModel.cpp" line="525"/>
<source>conference_invitation</source> <source>conference_invitation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="522"/> <location filename="../../model/tool/ToolModel.cpp" line="527"/>
<source>conference_invitation_updated</source> <source>conference_invitation_updated</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="524"/> <location filename="../../model/tool/ToolModel.cpp" line="529"/>
<source>conference_invitation_cancelled</source> <source>conference_invitation_cancelled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="585"/> <location filename="../../model/tool/ToolModel.cpp" line="591"/>
<source>unknown_audio_device_name</source> <source>unknown_audio_device_name</source>
<translation>Unbekannter Gerätename</translation> <translation>Unbekannter Gerätename</translation>
</message> </message>

View file

@ -39,45 +39,45 @@
<context> <context>
<name>AccountCore</name> <name>AccountCore</name>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="435"/> <location filename="../../core/account/AccountCore.cpp" line="446"/>
<source>drawer_menu_account_connection_status_connected</source> <source>drawer_menu_account_connection_status_connected</source>
<extracomment>&quot;Connecté&quot;</extracomment> <extracomment>&quot;Connecté&quot;</extracomment>
<translation>Connected</translation> <translation>Connected</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="438"/> <location filename="../../core/account/AccountCore.cpp" line="449"/>
<source>drawer_menu_account_connection_status_refreshing</source> <source>drawer_menu_account_connection_status_refreshing</source>
<translation>Refreshing</translation> <translation>Refreshing</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="441"/> <location filename="../../core/account/AccountCore.cpp" line="452"/>
<source>drawer_menu_account_connection_status_progress</source> <source>drawer_menu_account_connection_status_progress</source>
<translation>Connecting</translation> <translation>Connecting</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="444"/> <location filename="../../core/account/AccountCore.cpp" line="455"/>
<source>drawer_menu_account_connection_status_failed</source> <source>drawer_menu_account_connection_status_failed</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="448"/> <location filename="../../core/account/AccountCore.cpp" line="459"/>
<source>drawer_menu_account_connection_status_cleared</source> <source>drawer_menu_account_connection_status_cleared</source>
<translation>Disabled</translation> <translation>Disabled</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="482"/> <location filename="../../core/account/AccountCore.cpp" line="493"/>
<source>manage_account_status_connected_summary</source> <source>manage_account_status_connected_summary</source>
<extracomment>&quot;Vous êtes en ligne et joignable.&quot;</extracomment> <extracomment>&quot;Vous êtes en ligne et joignable.&quot;</extracomment>
<translation>You are online and reachable.</translation> <translation>You are online and reachable.</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="485"/> <location filename="../../core/account/AccountCore.cpp" line="496"/>
<source>manage_account_status_failed_summary</source> <source>manage_account_status_failed_summary</source>
<extracomment>&quot;Erreur de connexion, vérifiez vos paramètres.&quot;</extracomment> <extracomment>&quot;Erreur de connexion, vérifiez vos paramètres.&quot;</extracomment>
<translation>Connection error, check your settings.</translation> <translation>Connection error, check your settings.</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="489"/> <location filename="../../core/account/AccountCore.cpp" line="500"/>
<source>manage_account_status_cleared_summary</source> <source>manage_account_status_cleared_summary</source>
<extracomment>&quot;Compte désactivé, vous ne recevrez ni appel ni message.&quot;</extracomment> <extracomment>&quot;Compte désactivé, vous ne recevrez ni appel ni message.&quot;</extracomment>
<translation>Account disabled, you will not receive calls or messages.</translation> <translation>Account disabled, you will not receive calls or messages.</translation>
@ -428,11 +428,6 @@
<extracomment>&quot;If this field is filled, the outbound proxy will be enabled automatically. Leave it empty to disable it.&quot;</extracomment> <extracomment>&quot;If this field is filled, the outbound proxy will be enabled automatically. Leave it empty to disable it.&quot;</extracomment>
<translation>If this field is filled, the outbound proxy will be enabled automatically. Leave it empty to disable it.</translation> <translation>If this field is filled, the outbound proxy will be enabled automatically. Leave it empty to disable it.</translation>
</message> </message>
<message>
<source>account_settings_outbound_proxy_title</source>
<extracomment>&quot;Outbound proxy enabled&quot;</extracomment>
<translation type="vanished">Outbound proxy server enabled</translation>
</message>
<message> <message>
<location filename="../../view/Page/Layout/Settings/AccountSettingsParametersLayout.qml" line="157"/> <location filename="../../view/Page/Layout/Settings/AccountSettingsParametersLayout.qml" line="157"/>
<source>account_settings_stun_server_url_title</source> <source>account_settings_stun_server_url_title</source>
@ -634,103 +629,102 @@
<context> <context>
<name>App</name> <name>App</name>
<message> <message>
<location filename="../../core/App.cpp" line="357"/> <location filename="../../core/App.cpp" line="356"/>
<source>remote_provisioning_dialog</source> <source>remote_provisioning_dialog</source>
<extracomment>Voulez-vous télécharger et appliquer la configuration depuis cette adresse ?</extracomment> <extracomment>Voulez-vous télécharger et appliquer la configuration depuis cette adresse ?</extracomment>
<translation>Do you want to download and apply remote provisioning from this address ?</translation> <translation>Do you want to download and apply remote provisioning from this address ?</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="394"/> <location filename="../../core/App.cpp" line="393"/>
<location filename="../../core/App.cpp" line="648"/> <location filename="../../core/App.cpp" line="658"/>
<source>info_popup_error_title</source> <source>info_popup_error_title</source>
<extracomment>Error</extracomment> <extracomment>Error</extracomment>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="395"/> <location filename="../../core/App.cpp" line="394"/>
<location filename="../../core/App.cpp" line="650"/> <location filename="../../core/App.cpp" line="660"/>
<source>info_popup_configuration_failed_message</source> <source>info_popup_configuration_failed_message</source>
<extracomment>Remote provisioning failed : %1</extracomment> <extracomment>Remote provisioning failed : %1</extracomment>
<translation>Remote provisioning failed : %1</translation> <translation>Remote provisioning failed : %1</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="644"/> <location filename="../../core/App.cpp" line="654"/>
<source>configuration_error_detail</source> <source>configuration_error_detail</source>
<extracomment>not reachable</extracomment> <extracomment>not reachable</extracomment>
<translation>not reachable</translation> <translation>not reachable</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="916"/> <location filename="../../core/App.cpp" line="926"/>
<source>application_description</source> <source>application_description</source>
<extracomment>&quot;A free and open source SIP video-phone.&quot;</extracomment> <extracomment>&quot;A free and open source SIP video-phone.&quot;</extracomment>
<translation>A free and open source SIP video-phone.</translation> <translation>A free and open source SIP video-phone.</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="918"/> <location filename="../../core/App.cpp" line="928"/>
<source>command_line_arg_order</source> <source>command_line_arg_order</source>
<extracomment>&quot;Send an order to the application towards a command line&quot;</extracomment> <extracomment>&quot;Send an order to the application towards a command line&quot;</extracomment>
<translation>Send an order to the application towards a command line</translation> <translation>Send an order to the application towards a command line</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="922"/> <location filename="../../core/App.cpp" line="932"/>
<source>command_line_option_show_help</source> <source>command_line_option_show_help</source>
<translation>Show this help</translation> <translation>Show this help</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="927"/> <location filename="../../core/App.cpp" line="937"/>
<source>command_line_option_show_app_version</source> <source>command_line_option_show_app_version</source>
<translation>Show app version</translation> <translation>Show app version</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="935"/> <location filename="../../core/App.cpp" line="945"/>
<source>command_line_option_config_to_fetch</source> <source>command_line_option_config_to_fetch</source>
<extracomment>&quot;Specify the linphone configuration file to be fetched. It will be merged with the current configuration.&quot;</extracomment> <extracomment>&quot;Specify the linphone configuration file to be fetched. It will be merged with the current configuration.&quot;</extracomment>
<translation>Specify the linphone configuration file to be fetched. It will be merged with the current configuration.</translation> <translation>Specify the linphone configuration file to be fetched. It will be merged with the current configuration.</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="937"/> <location filename="../../core/App.cpp" line="947"/>
<source>command_line_option_config_to_fetch_arg</source> <source>command_line_option_config_to_fetch_arg</source>
<extracomment>&quot;URL, path or file&quot;</extracomment> <extracomment>&quot;URL, path or file&quot;</extracomment>
<translation>URL, path or file</translation> <translation>URL, path or file</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="942"/> <location filename="../../core/App.cpp" line="952"/>
<source>command_line_option_minimized</source> <source>command_line_option_minimized</source>
<translation>Minimize</translation> <translation>Minimize</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="945"/> <location filename="../../core/App.cpp" line="955"/>
<source>command_line_option_log_to_stdout</source> <source>command_line_option_log_to_stdout</source>
<translation>Log to stdout some debug information while running</translation> <translation>Log to stdout some debug information while running</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="948"/> <location filename="../../core/App.cpp" line="958"/>
<source>command_line_option_print_app_logs_only</source> <source>command_line_option_print_app_logs_only</source>
<extracomment>&quot;Print only logs from the application&quot;</extracomment> <extracomment>&quot;Print only logs from the application&quot;</extracomment>
<translation>Print only logs from the application</translation> <translation>Print only logs from the application</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1318"/> <location filename="../../core/App.cpp" line="1329"/>
<source>hide_action</source> <source>hide_action</source>
<extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment> <extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment>
<translation>Hide</translation> <translation>Hide</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1318"/> <location filename="../../core/App.cpp" line="1329"/>
<source>show_action</source> <source>show_action</source>
<translation>Show</translation> <translation>Show</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1333"/> <location filename="../../core/App.cpp" line="1344"/>
<source>quit_action</source> <source>quit_action</source>
<extracomment>&quot;Quitter&quot;</extracomment> <extracomment>&quot;Quitter&quot;</extracomment>
<translation>Quit</translation> <translation>Quit</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1337"/> <location filename="../../core/App.cpp" line="1448"/>
<source>mark_all_read_action</source> <source>mark_all_read_action</source>
<extracomment>&quot;Mark all as read&quot;</extracomment> <translation>Marquer tout comme lu</translation>
<translation>Mark all as read</translation>
</message> </message>
</context> </context>
<context> <context>
@ -926,7 +920,7 @@
<context> <context>
<name>CallHistoryLayout</name> <name>CallHistoryLayout</name>
<message> <message>
<location filename="../../view/Control/Container/Call/CallHistoryLayout.qml" line="116"/> <location filename="../../view/Control/Container/Call/CallHistoryLayout.qml" line="111"/>
<source>meeting_info_join_title</source> <source>meeting_info_join_title</source>
<extracomment>&quot;Rejoindre la réunion&quot;</extracomment> <extracomment>&quot;Rejoindre la réunion&quot;</extracomment>
<translation>Join meeting</translation> <translation>Join meeting</translation>
@ -1003,52 +997,77 @@
<translation>The meeting link has been copied to the clipboard</translation> <translation>The meeting link has been copied to the clipboard</translation>
</message> </message>
</context> </context>
<context>
<name>CallList</name>
<message>
<location filename="../../core/call/CallList.cpp" line="104"/>
<source>remote_group_call</source>
<extracomment>Remote group call</extracomment>
<translation>Remote group call</translation>
</message>
<message>
<location filename="../../core/call/CallList.cpp" line="106"/>
<source>local_group_call</source>
<translation>Local group call</translation>
</message>
<message>
<location filename="../../core/call/CallList.cpp" line="111"/>
<source>info_popup_error_title</source>
<translation>Error</translation>
</message>
<message>
<location filename="../../core/call/CallList.cpp" line="113"/>
<source>info_popup_merge_calls_failed_message</source>
<extracomment>Failed to merge calls !</extracomment>
<translation>Failed to merge calls !</translation>
</message>
</context>
<context> <context>
<name>CallListView</name> <name>CallListView</name>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="55"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="59"/>
<source>meeting</source> <source>meeting</source>
<extracomment>&quot;Réunion</extracomment> <extracomment>&quot;Réunion</extracomment>
<translation>Meeting</translation> <translation>Meeting</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="57"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="61"/>
<source>call</source> <source>call</source>
<extracomment>&quot;Appel&quot;</extracomment> <extracomment>&quot;Appel&quot;</extracomment>
<translation>Call</translation> <translation>Call</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="62"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="66"/>
<source>paused_call_or_meeting</source> <source>paused_call_or_meeting</source>
<extracomment>&quot;%1 en pause&quot;</extracomment> <extracomment>&quot;%1 en pause&quot;</extracomment>
<translation>%1 paused</translation> <translation>%1 paused</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="64"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="68"/>
<source>ongoing_call_or_meeting</source> <source>ongoing_call_or_meeting</source>
<extracomment>&quot;%1 en cours&quot;</extracomment> <extracomment>&quot;%1 en cours&quot;</extracomment>
<translation>Ongoing %1</translation> <translation>Ongoing %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="84"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="88"/>
<source>transfer_call_name_accessible_name</source> <source>transfer_call_name_accessible_name</source>
<extracomment>Transfer call %1</extracomment> <extracomment>Transfer call %1</extracomment>
<translation>Transfer call %1</translation> <translation>Transfer call %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="112"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="116"/>
<source>resume_call_name_accessible_name</source> <source>resume_call_name_accessible_name</source>
<extracomment>Resume %1 call</extracomment> <extracomment>Resume %1 call</extracomment>
<translation>Resume %1 call</translation> <translation>Resume %1 call</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="114"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="118"/>
<source>pause_call_name_accessible_name</source> <source>pause_call_name_accessible_name</source>
<extracomment>Pause %1 call</extracomment> <extracomment>Pause %1 call</extracomment>
<translation>Pause %1 call</translation> <translation>Pause %1 call</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="137"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="141"/>
<source>end_call_name_accessible_name</source> <source>end_call_name_accessible_name</source>
<extracomment>End %1 call</extracomment> <extracomment>End %1 call</extracomment>
<translation>End %1 call</translation> <translation>End %1 call</translation>
@ -1994,13 +2013,13 @@
<context> <context>
<name>ChatDroppableTextArea</name> <name>ChatDroppableTextArea</name>
<message> <message>
<location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="152"/> <location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="154"/>
<source>chat_view_send_area_placeholder_text</source> <source>chat_view_send_area_placeholder_text</source>
<extracomment>Say something : placeholder text for sending message text area</extracomment> <extracomment>Say something : placeholder text for sending message text area</extracomment>
<translation>Say something</translation> <translation>Say something</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="187"/> <location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="190"/>
<source>cannot_record_while_in_call_tooltip</source> <source>cannot_record_while_in_call_tooltip</source>
<extracomment>Cannot record a message while a call is ongoing</extracomment> <extracomment>Cannot record a message while a call is ongoing</extracomment>
<translation>Cannot record a message while a call is ongoing</translation> <translation>Cannot record a message while a call is ongoing</translation>
@ -2223,13 +2242,13 @@ Error</extracomment>
<context> <context>
<name>ChatMessageContentModel</name> <name>ChatMessageContentModel</name>
<message> <message>
<location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="104"/> <location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="105"/>
<source>popup_error_title</source> <source>popup_error_title</source>
<extracomment>Error</extracomment> <extracomment>Error</extracomment>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="107"/> <location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="108"/>
<source>popup_download_error_message</source> <source>popup_download_error_message</source>
<extracomment>This file was already downloaded and is no more on the server. Your peer have to resend it if you want to get it</extracomment> <extracomment>This file was already downloaded and is no more on the server. Your peer have to resend it if you want to get it</extracomment>
<translation>This file was already downloaded and is no more on the server. Your peer have to resend it if you want to get it</translation> <translation>This file was already downloaded and is no more on the server. Your peer have to resend it if you want to get it</translation>
@ -4771,36 +4790,36 @@ Expiration : %1</translation>
<context> <context>
<name>Notifier</name> <name>Notifier</name>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="309"/> <location filename="../../core/notifier/Notifier.cpp" line="310"/>
<source>new_call_alert_accessible_name</source> <source>new_call_alert_accessible_name</source>
<extracomment>New call from %1</extracomment> <extracomment>New call from %1</extracomment>
<translation>New call from %1</translation> <translation>New call from %1</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="361"/> <location filename="../../core/notifier/Notifier.cpp" line="363"/>
<source>new_voice_message</source> <source>new_voice_message</source>
<extracomment>&apos;Voice message received!&apos; : message to warn the user in a notofication for voice messages.</extracomment> <extracomment>&apos;Voice message received!&apos; : message to warn the user in a notofication for voice messages.</extracomment>
<translation>Voice message received!</translation> <translation>Voice message received!</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="362"/> <location filename="../../core/notifier/Notifier.cpp" line="364"/>
<source>new_file_message</source> <source>new_file_message</source>
<translation>File received!</translation> <translation>File received!</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="365"/> <location filename="../../core/notifier/Notifier.cpp" line="367"/>
<source>new_conference_invitation</source> <source>new_conference_invitation</source>
<extracomment>&apos;Conference invitation received!&apos; : Notification about receiving an invitation to a conference.</extracomment> <extracomment>&apos;Conference invitation received!&apos; : Notification about receiving an invitation to a conference.</extracomment>
<translation>Conference invitation received !</translation> <translation>Conference invitation received !</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="385"/> <location filename="../../core/notifier/Notifier.cpp" line="387"/>
<source>new_chat_room_messages</source> <source>new_chat_room_messages</source>
<extracomment>&apos;New messages received!&apos; Notification that warn the user of new messages.</extracomment> <extracomment>&apos;New messages received!&apos; Notification that warn the user of new messages.</extracomment>
<translation>New messages received !</translation> <translation>New messages received !</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="392"/> <location filename="../../core/notifier/Notifier.cpp" line="394"/>
<source>new_message_alert_accessible_name</source> <source>new_message_alert_accessible_name</source>
<extracomment>New message on chatroom %1</extracomment> <extracomment>New message on chatroom %1</extracomment>
<translation>New message on chatroom %1</translation> <translation>New message on chatroom %1</translation>
@ -4820,102 +4839,102 @@ Expiration : %1</translation>
<translation>Timeout: Not authenticated</translation> <translation>Timeout: Not authenticated</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="123"/> <location filename="../../model/auth/OIDCModel.cpp" line="125"/>
<source>oidc_authentication_granted_message</source> <source>oidc_authentication_granted_message</source>
<extracomment>Authentication granted</extracomment> <extracomment>Authentication granted</extracomment>
<translation>Authentication granted</translation> <translation>Authentication granted</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="130"/> <location filename="../../model/auth/OIDCModel.cpp" line="132"/>
<source>oidc_authentication_not_authenticated_message</source> <source>oidc_authentication_not_authenticated_message</source>
<extracomment>Not authenticated</extracomment> <extracomment>Not authenticated</extracomment>
<translation>Not authenticated</translation> <translation>Not authenticated</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="136"/> <location filename="../../model/auth/OIDCModel.cpp" line="138"/>
<source>oidc_authentication_refresh_message</source> <source>oidc_authentication_refresh_message</source>
<extracomment>Refreshing token</extracomment> <extracomment>Refreshing token</extracomment>
<translation>Refreshing token</translation> <translation>Refreshing token</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="141"/> <location filename="../../model/auth/OIDCModel.cpp" line="143"/>
<source>oidc_authentication_temporary_credentials_message</source> <source>oidc_authentication_temporary_credentials_message</source>
<extracomment>Temporary credentials received</extracomment> <extracomment>Temporary credentials received</extracomment>
<translation>Temporary credentials received</translation> <translation>Temporary credentials received</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="159"/> <location filename="../../model/auth/OIDCModel.cpp" line="161"/>
<source>oidc_authentication_network_error</source> <source>oidc_authentication_network_error</source>
<extracomment>Network error</extracomment> <extracomment>Network error</extracomment>
<translation>Network error</translation> <translation>Network error</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="163"/> <location filename="../../model/auth/OIDCModel.cpp" line="165"/>
<source>oidc_authentication_server_error</source> <source>oidc_authentication_server_error</source>
<extracomment>Server error</extracomment> <extracomment>Server error</extracomment>
<translation>Server error</translation> <translation>Server error</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="167"/> <location filename="../../model/auth/OIDCModel.cpp" line="169"/>
<source>oidc_authentication_token_not_found_error</source> <source>oidc_authentication_token_not_found_error</source>
<extracomment>OAuth token not found</extracomment> <extracomment>OAuth token not found</extracomment>
<translation>OAuth token not found</translation> <translation>OAuth token not found</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="171"/> <location filename="../../model/auth/OIDCModel.cpp" line="173"/>
<source>oidc_authentication_token_secret_not_found_error</source> <source>oidc_authentication_token_secret_not_found_error</source>
<extracomment>OAuth token secret not found</extracomment> <extracomment>OAuth token secret not found</extracomment>
<translation>OAuth token secret not found</translation> <translation>OAuth token secret not found</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="175"/> <location filename="../../model/auth/OIDCModel.cpp" line="177"/>
<source>oidc_authentication_callback_not_verified_error</source> <source>oidc_authentication_callback_not_verified_error</source>
<extracomment>OAuth callback not verified</extracomment> <extracomment>OAuth callback not verified</extracomment>
<translation>OAuth callback not verified</translation> <translation>OAuth callback not verified</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="186"/> <location filename="../../model/auth/OIDCModel.cpp" line="188"/>
<source>oidc_authentication_request_auth_message</source> <source>oidc_authentication_request_auth_message</source>
<extracomment>Requesting authorization from browser</extracomment> <extracomment>Requesting authorization from browser</extracomment>
<translation>Requesting authorization from browser</translation> <translation>Requesting authorization from browser</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="217"/> <location filename="../../model/auth/OIDCModel.cpp" line="219"/>
<source>oidc_authentication_no_token_found_error</source> <source>oidc_authentication_no_token_found_error</source>
<translation>No token found</translation> <translation>No token found</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="230"/> <location filename="../../model/auth/OIDCModel.cpp" line="232"/>
<source>oidc_authentication_request_token_message</source> <source>oidc_authentication_request_token_message</source>
<extracomment>Requesting access token</extracomment> <extracomment>Requesting access token</extracomment>
<translation>Requesting access token</translation> <translation>Requesting access token</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="235"/> <location filename="../../model/auth/OIDCModel.cpp" line="237"/>
<source>oidc_authentication_refresh_token_message</source> <source>oidc_authentication_refresh_token_message</source>
<extracomment>Refreshing access token</extracomment> <extracomment>Refreshing access token</extracomment>
<translation>Refreshing access token</translation> <translation>Refreshing access token</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="240"/> <location filename="../../model/auth/OIDCModel.cpp" line="242"/>
<source>oidc_authentication_request_authorization_message</source> <source>oidc_authentication_request_authorization_message</source>
<extracomment>Requesting authorization</extracomment> <extracomment>Requesting authorization</extracomment>
<translation>Requesting authorization</translation> <translation>Requesting authorization</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="245"/> <location filename="../../model/auth/OIDCModel.cpp" line="247"/>
<source>oidc_authentication_request_temporary_credentials_message</source> <source>oidc_authentication_request_temporary_credentials_message</source>
<extracomment>Requesting temporary credentials</extracomment> <extracomment>Requesting temporary credentials</extracomment>
<translation>Requesting temporary credentials</translation> <translation>Requesting temporary credentials</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="272"/> <location filename="../../model/auth/OIDCModel.cpp" line="274"/>
<source>oidc_authentication_no_auth_found_in_config_error</source> <source>oidc_authentication_no_auth_found_in_config_error</source>
<extracomment>No authorization endpoint found in OpenID configuration</extracomment> <extracomment>No authorization endpoint found in OpenID configuration</extracomment>
<translation>No authorization endpoint found in OpenID configuration</translation> <translation>No authorization endpoint found in OpenID configuration</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="287"/> <location filename="../../model/auth/OIDCModel.cpp" line="289"/>
<source>oidc_authentication_no_token_found_in_config_error</source> <source>oidc_authentication_no_token_found_in_config_error</source>
<extracomment>No token endpoint found in OpenID configuration</extracomment> <extracomment>No token endpoint found in OpenID configuration</extracomment>
<translation>No token endpoint found in OpenID configuration</translation> <translation>No token endpoint found in OpenID configuration</translation>
@ -5575,37 +5594,37 @@ To enable them in a commercial project, please contact us.</translation>
<translation>Start a group call ?</translation> <translation>Start a group call ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="118"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="121"/>
<source>unencrypted_conversation_warning</source> <source>unencrypted_conversation_warning</source>
<extracomment>This conversation is not encrypted !</extracomment> <extracomment>This conversation is not encrypted !</extracomment>
<translation>This conversation is not encrypted !</translation> <translation>This conversation is not encrypted !</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="436"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="407"/>
<source>reply_to_label</source> <source>reply_to_label</source>
<extracomment>Reply to %1</extracomment> <extracomment>Reply to %1</extracomment>
<translation>Reply to %1</translation> <translation>Reply to %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="637"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="607"/>
<source>shared_medias_title</source> <source>shared_medias_title</source>
<extracomment>Shared medias</extracomment> <extracomment>Shared medias</extracomment>
<translation>Shared medias</translation> <translation>Shared medias</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="639"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="609"/>
<source>shared_documents_title</source> <source>shared_documents_title</source>
<extracomment>Shared documents</extracomment> <extracomment>Shared documents</extracomment>
<translation>Shared documents</translation> <translation>Shared documents</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="668"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="638"/>
<source>forward_to_title</source> <source>forward_to_title</source>
<extracomment>Forward to</extracomment> <extracomment>Forward to</extracomment>
<translation>Froward to</translation> <translation>Froward to</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="702"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="672"/>
<source>conversations_title</source> <source>conversations_title</source>
<extracomment>Conversations</extracomment> <extracomment>Conversations</extracomment>
<translation>Conversations</translation> <translation>Conversations</translation>
@ -5658,11 +5677,6 @@ To enable them in a commercial project, please contact us.</translation>
<extracomment>&quot;Réunions&quot;</extracomment> <extracomment>&quot;Réunions&quot;</extracomment>
<translation>Meetings</translation> <translation>Meetings</translation>
</message> </message>
<message>
<source>settings_security_title</source>
<extracomment>&quot;Affichage&quot; &quot;Security&quot;</extracomment>
<translation type="vanished">Security / Encryption</translation>
</message>
<message> <message>
<location filename="../../view/Page/Form/Settings/SettingsPage.qml" line="29"/> <location filename="../../view/Page/Form/Settings/SettingsPage.qml" line="29"/>
<source>settings_network_title</source> <source>settings_network_title</source>
@ -5744,38 +5758,38 @@ To enable them in a commercial project, please contact us.</translation>
<translation>No default account found, can&apos;t create group call</translation> <translation>No default account found, can&apos;t create group call</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="408"/> <location filename="../../model/tool/ToolModel.cpp" line="413"/>
<source>group_call_error_participants_invite</source> <source>group_call_error_participants_invite</source>
<translation>Couldn&apos;t invite participants to group call</translation> <translation>Couldn&apos;t invite participants to group call</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="412"/> <location filename="../../model/tool/ToolModel.cpp" line="417"/>
<source>group_call_error_creation</source> <source>group_call_error_creation</source>
<translation>Group call couldn&apos;t be created</translation> <translation>Group call couldn&apos;t be created</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="512"/> <location filename="../../model/tool/ToolModel.cpp" line="517"/>
<source>voice_recording_duration</source> <source>voice_recording_duration</source>
<extracomment>&quot;Voice recording (%1)&quot; : %1 is the duration formated in mm:ss</extracomment> <extracomment>&quot;Voice recording (%1)&quot; : %1 is the duration formated in mm:ss</extracomment>
<translation>Voice recording (%1)</translation> <translation>Voice recording (%1)</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="585"/> <location filename="../../model/tool/ToolModel.cpp" line="591"/>
<source>unknown_audio_device_name</source> <source>unknown_audio_device_name</source>
<translation>Unknown device name</translation> <translation>Unknown device name</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="520"/> <location filename="../../model/tool/ToolModel.cpp" line="525"/>
<source>conference_invitation</source> <source>conference_invitation</source>
<translation>Meeting invitation</translation> <translation>Meeting invitation</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="524"/> <location filename="../../model/tool/ToolModel.cpp" line="529"/>
<source>conference_invitation_cancelled</source> <source>conference_invitation_cancelled</source>
<translation>Meeting cancellation</translation> <translation>Meeting cancellation</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="522"/> <location filename="../../model/tool/ToolModel.cpp" line="527"/>
<source>conference_invitation_updated</source> <source>conference_invitation_updated</source>
<translation>Meeting modification</translation> <translation>Meeting modification</translation>
</message> </message>

View file

@ -39,45 +39,45 @@
<context> <context>
<name>AccountCore</name> <name>AccountCore</name>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="435"/> <location filename="../../core/account/AccountCore.cpp" line="446"/>
<source>drawer_menu_account_connection_status_connected</source> <source>drawer_menu_account_connection_status_connected</source>
<extracomment>&quot;Connecté&quot;</extracomment> <extracomment>&quot;Connecté&quot;</extracomment>
<translation>Connecté</translation> <translation>Connecté</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="438"/> <location filename="../../core/account/AccountCore.cpp" line="449"/>
<source>drawer_menu_account_connection_status_refreshing</source> <source>drawer_menu_account_connection_status_refreshing</source>
<translation>En cours de rafraîchissement</translation> <translation>En cours de rafraîchissement</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="441"/> <location filename="../../core/account/AccountCore.cpp" line="452"/>
<source>drawer_menu_account_connection_status_progress</source> <source>drawer_menu_account_connection_status_progress</source>
<translation>Connexion</translation> <translation>Connexion</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="444"/> <location filename="../../core/account/AccountCore.cpp" line="455"/>
<source>drawer_menu_account_connection_status_failed</source> <source>drawer_menu_account_connection_status_failed</source>
<translation>Erreur</translation> <translation>Erreur</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="448"/> <location filename="../../core/account/AccountCore.cpp" line="459"/>
<source>drawer_menu_account_connection_status_cleared</source> <source>drawer_menu_account_connection_status_cleared</source>
<translation>Désactivé</translation> <translation>Désactivé</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="482"/> <location filename="../../core/account/AccountCore.cpp" line="493"/>
<source>manage_account_status_connected_summary</source> <source>manage_account_status_connected_summary</source>
<extracomment>&quot;Vous êtes en ligne et joignable.&quot;</extracomment> <extracomment>&quot;Vous êtes en ligne et joignable.&quot;</extracomment>
<translation>Vous êtes en ligne et joignable.</translation> <translation>Vous êtes en ligne et joignable.</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="485"/> <location filename="../../core/account/AccountCore.cpp" line="496"/>
<source>manage_account_status_failed_summary</source> <source>manage_account_status_failed_summary</source>
<extracomment>&quot;Erreur de connexion, vérifiez vos paramètres.&quot;</extracomment> <extracomment>&quot;Erreur de connexion, vérifiez vos paramètres.&quot;</extracomment>
<translation>Erreur de connexion, vérifiez vos paramètres.</translation> <translation>Erreur de connexion, vérifiez vos paramètres.</translation>
</message> </message>
<message> <message>
<location filename="../../core/account/AccountCore.cpp" line="489"/> <location filename="../../core/account/AccountCore.cpp" line="500"/>
<source>manage_account_status_cleared_summary</source> <source>manage_account_status_cleared_summary</source>
<extracomment>&quot;Compte désactivé, vous ne recevrez ni appel ni message.&quot;</extracomment> <extracomment>&quot;Compte désactivé, vous ne recevrez ni appel ni message.&quot;</extracomment>
<translation>Compte désactivé, vous ne recevrez ni appel ni message.</translation> <translation>Compte désactivé, vous ne recevrez ni appel ni message.</translation>
@ -428,11 +428,6 @@
<extracomment>&quot;If this field is filled, the outbound proxy will be enabled automatically. Leave it empty to disable it.&quot;</extracomment> <extracomment>&quot;If this field is filled, the outbound proxy will be enabled automatically. Leave it empty to disable it.&quot;</extracomment>
<translation>Si ce champ est rempli, loutbound proxy sera activé automatiquement. Laissez-le vide pour le désactiver.</translation> <translation>Si ce champ est rempli, loutbound proxy sera activé automatiquement. Laissez-le vide pour le désactiver.</translation>
</message> </message>
<message>
<source>account_settings_outbound_proxy_title</source>
<extracomment>&quot;Outbound proxy enabled&quot;</extracomment>
<translation type="vanished">Serveur mandataire sortant</translation>
</message>
<message> <message>
<location filename="../../view/Page/Layout/Settings/AccountSettingsParametersLayout.qml" line="157"/> <location filename="../../view/Page/Layout/Settings/AccountSettingsParametersLayout.qml" line="157"/>
<source>account_settings_stun_server_url_title</source> <source>account_settings_stun_server_url_title</source>
@ -634,103 +629,102 @@
<context> <context>
<name>App</name> <name>App</name>
<message> <message>
<location filename="../../core/App.cpp" line="357"/> <location filename="../../core/App.cpp" line="356"/>
<source>remote_provisioning_dialog</source> <source>remote_provisioning_dialog</source>
<extracomment>Voulez-vous télécharger et appliquer la configuration depuis cette adresse ?</extracomment> <extracomment>Voulez-vous télécharger et appliquer la configuration depuis cette adresse ?</extracomment>
<translation>Voulez-vous télécharger et appliquer la configuration depuis cette adresse ?</translation> <translation>Voulez-vous télécharger et appliquer la configuration depuis cette adresse ?</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="394"/> <location filename="../../core/App.cpp" line="393"/>
<location filename="../../core/App.cpp" line="648"/> <location filename="../../core/App.cpp" line="658"/>
<source>info_popup_error_title</source> <source>info_popup_error_title</source>
<extracomment>Error</extracomment> <extracomment>Error</extracomment>
<translation>Erreur</translation> <translation>Erreur</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="395"/> <location filename="../../core/App.cpp" line="394"/>
<location filename="../../core/App.cpp" line="650"/> <location filename="../../core/App.cpp" line="660"/>
<source>info_popup_configuration_failed_message</source> <source>info_popup_configuration_failed_message</source>
<extracomment>Remote provisioning failed : %1</extracomment> <extracomment>Remote provisioning failed : %1</extracomment>
<translation>La configuration distante a échoué : %1</translation> <translation>La configuration distante a échoué : %1</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="644"/> <location filename="../../core/App.cpp" line="654"/>
<source>configuration_error_detail</source> <source>configuration_error_detail</source>
<extracomment>not reachable</extracomment> <extracomment>not reachable</extracomment>
<translation>indisponible</translation> <translation>indisponible</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="916"/> <location filename="../../core/App.cpp" line="926"/>
<source>application_description</source> <source>application_description</source>
<extracomment>&quot;A free and open source SIP video-phone.&quot;</extracomment> <extracomment>&quot;A free and open source SIP video-phone.&quot;</extracomment>
<translation>A free and open source SIP video-phone.</translation> <translation>A free and open source SIP video-phone.</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="918"/> <location filename="../../core/App.cpp" line="928"/>
<source>command_line_arg_order</source> <source>command_line_arg_order</source>
<extracomment>&quot;Send an order to the application towards a command line&quot;</extracomment> <extracomment>&quot;Send an order to the application towards a command line&quot;</extracomment>
<translation>Send an order to the application towards a command line</translation> <translation>Send an order to the application towards a command line</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="922"/> <location filename="../../core/App.cpp" line="932"/>
<source>command_line_option_show_help</source> <source>command_line_option_show_help</source>
<translation>Show this help</translation> <translation>Show this help</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="927"/> <location filename="../../core/App.cpp" line="937"/>
<source>command_line_option_show_app_version</source> <source>command_line_option_show_app_version</source>
<translation>Afficher la version de l&apos;application</translation> <translation>Afficher la version de l&apos;application</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="935"/> <location filename="../../core/App.cpp" line="945"/>
<source>command_line_option_config_to_fetch</source> <source>command_line_option_config_to_fetch</source>
<extracomment>&quot;Specify the linphone configuration file to be fetched. It will be merged with the current configuration.&quot;</extracomment> <extracomment>&quot;Specify the linphone configuration file to be fetched. It will be merged with the current configuration.&quot;</extracomment>
<translation>Specify the linphone configuration file to be fetched. It will be merged with the current configuration.</translation> <translation>Specify the linphone configuration file to be fetched. It will be merged with the current configuration.</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="937"/> <location filename="../../core/App.cpp" line="947"/>
<source>command_line_option_config_to_fetch_arg</source> <source>command_line_option_config_to_fetch_arg</source>
<extracomment>&quot;URL, path or file&quot;</extracomment> <extracomment>&quot;URL, path or file&quot;</extracomment>
<translation>URL, path or file</translation> <translation>URL, path or file</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="942"/> <location filename="../../core/App.cpp" line="952"/>
<source>command_line_option_minimized</source> <source>command_line_option_minimized</source>
<translation>Minimiser</translation> <translation>Minimiser</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="945"/> <location filename="../../core/App.cpp" line="955"/>
<source>command_line_option_log_to_stdout</source> <source>command_line_option_log_to_stdout</source>
<translation>Log to stdout some debug information while running</translation> <translation>Log to stdout some debug information while running</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="948"/> <location filename="../../core/App.cpp" line="958"/>
<source>command_line_option_print_app_logs_only</source> <source>command_line_option_print_app_logs_only</source>
<extracomment>&quot;Print only logs from the application&quot;</extracomment> <extracomment>&quot;Print only logs from the application&quot;</extracomment>
<translation>Print only logs from the application</translation> <translation>Print only logs from the application</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1318"/> <location filename="../../core/App.cpp" line="1329"/>
<source>hide_action</source> <source>hide_action</source>
<extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment> <extracomment>&quot;Cacher&quot; &quot;Afficher&quot;</extracomment>
<translation>Cacher</translation> <translation>Cacher</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1318"/> <location filename="../../core/App.cpp" line="1329"/>
<source>show_action</source> <source>show_action</source>
<translation>Afficher</translation> <translation>Afficher</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1333"/> <location filename="../../core/App.cpp" line="1344"/>
<source>quit_action</source> <source>quit_action</source>
<extracomment>&quot;Quitter&quot;</extracomment> <extracomment>&quot;Quitter&quot;</extracomment>
<translation>Quitter</translation> <translation>Quitter</translation>
</message> </message>
<message> <message>
<location filename="../../core/App.cpp" line="1337"/> <location filename="../../core/App.cpp" line="1448"/>
<source>mark_all_read_action</source> <source>mark_all_read_action</source>
<extracomment>&quot;Mark all as read&quot;</extracomment> <translation>Mark all as read</translation>
<translation>Marquer tout comme lu</translation>
</message> </message>
</context> </context>
<context> <context>
@ -926,7 +920,7 @@
<context> <context>
<name>CallHistoryLayout</name> <name>CallHistoryLayout</name>
<message> <message>
<location filename="../../view/Control/Container/Call/CallHistoryLayout.qml" line="116"/> <location filename="../../view/Control/Container/Call/CallHistoryLayout.qml" line="111"/>
<source>meeting_info_join_title</source> <source>meeting_info_join_title</source>
<extracomment>&quot;Rejoindre la réunion&quot;</extracomment> <extracomment>&quot;Rejoindre la réunion&quot;</extracomment>
<translation>Rejoindre la réunion</translation> <translation>Rejoindre la réunion</translation>
@ -1003,52 +997,77 @@
<translation>Le lien de la réunion a é copié dans le presse-papier</translation> <translation>Le lien de la réunion a é copié dans le presse-papier</translation>
</message> </message>
</context> </context>
<context>
<name>CallList</name>
<message>
<location filename="../../core/call/CallList.cpp" line="104"/>
<source>remote_group_call</source>
<extracomment>Remote group call</extracomment>
<translation>Appel de groupe distant</translation>
</message>
<message>
<location filename="../../core/call/CallList.cpp" line="106"/>
<source>local_group_call</source>
<translation>Appel de groupe local</translation>
</message>
<message>
<location filename="../../core/call/CallList.cpp" line="111"/>
<source>info_popup_error_title</source>
<translation>Erreur</translation>
</message>
<message>
<location filename="../../core/call/CallList.cpp" line="113"/>
<source>info_popup_merge_calls_failed_message</source>
<extracomment>Failed to merge calls !</extracomment>
<translation>La fusion des appels a échoué !</translation>
</message>
</context>
<context> <context>
<name>CallListView</name> <name>CallListView</name>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="55"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="59"/>
<source>meeting</source> <source>meeting</source>
<extracomment>&quot;Réunion</extracomment> <extracomment>&quot;Réunion</extracomment>
<translation>Réunion</translation> <translation>Réunion</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="57"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="61"/>
<source>call</source> <source>call</source>
<extracomment>&quot;Appel&quot;</extracomment> <extracomment>&quot;Appel&quot;</extracomment>
<translation>Appel</translation> <translation>Appel</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="62"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="66"/>
<source>paused_call_or_meeting</source> <source>paused_call_or_meeting</source>
<extracomment>&quot;%1 en pause&quot;</extracomment> <extracomment>&quot;%1 en pause&quot;</extracomment>
<translation>%1 en pause</translation> <translation>%1 en pause</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="64"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="68"/>
<source>ongoing_call_or_meeting</source> <source>ongoing_call_or_meeting</source>
<extracomment>&quot;%1 en cours&quot;</extracomment> <extracomment>&quot;%1 en cours&quot;</extracomment>
<translation>%1 en cours</translation> <translation>%1 en cours</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="84"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="88"/>
<source>transfer_call_name_accessible_name</source> <source>transfer_call_name_accessible_name</source>
<extracomment>Transfer call %1</extracomment> <extracomment>Transfer call %1</extracomment>
<translation>Transférer l&apos;appel %1</translation> <translation>Transférer l&apos;appel %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="112"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="116"/>
<source>resume_call_name_accessible_name</source> <source>resume_call_name_accessible_name</source>
<extracomment>Resume %1 call</extracomment> <extracomment>Resume %1 call</extracomment>
<translation>Reprendre l&apos;appel %1</translation> <translation>Reprendre l&apos;appel %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="114"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="118"/>
<source>pause_call_name_accessible_name</source> <source>pause_call_name_accessible_name</source>
<extracomment>Pause %1 call</extracomment> <extracomment>Pause %1 call</extracomment>
<translation>Mettre l&apos;appel %1 en pause</translation> <translation>Mettre l&apos;appel %1 en pause</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Call/CallListView.qml" line="137"/> <location filename="../../view/Control/Display/Call/CallListView.qml" line="141"/>
<source>end_call_name_accessible_name</source> <source>end_call_name_accessible_name</source>
<extracomment>End %1 call</extracomment> <extracomment>End %1 call</extracomment>
<translation>Terminer l&apos;appel %1</translation> <translation>Terminer l&apos;appel %1</translation>
@ -1994,13 +2013,13 @@
<context> <context>
<name>ChatDroppableTextArea</name> <name>ChatDroppableTextArea</name>
<message> <message>
<location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="152"/> <location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="154"/>
<source>chat_view_send_area_placeholder_text</source> <source>chat_view_send_area_placeholder_text</source>
<extracomment>Say something : placeholder text for sending message text area</extracomment> <extracomment>Say something : placeholder text for sending message text area</extracomment>
<translation>Dites quelque chose</translation> <translation>Dites quelque chose</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="187"/> <location filename="../../view/Control/Input/Chat/ChatDroppableTextArea.qml" line="190"/>
<source>cannot_record_while_in_call_tooltip</source> <source>cannot_record_while_in_call_tooltip</source>
<extracomment>Cannot record a message while a call is ongoing</extracomment> <extracomment>Cannot record a message while a call is ongoing</extracomment>
<translation>Impossible d&apos;enregistrer un message vocal pendant un appel</translation> <translation>Impossible d&apos;enregistrer un message vocal pendant un appel</translation>
@ -2223,13 +2242,13 @@ Error</extracomment>
<context> <context>
<name>ChatMessageContentModel</name> <name>ChatMessageContentModel</name>
<message> <message>
<location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="104"/> <location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="105"/>
<source>popup_error_title</source> <source>popup_error_title</source>
<extracomment>Error</extracomment> <extracomment>Error</extracomment>
<translation>Erreur</translation> <translation>Erreur</translation>
</message> </message>
<message> <message>
<location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="107"/> <location filename="../../model/chat/message/content/ChatMessageContentModel.cpp" line="108"/>
<source>popup_download_error_message</source> <source>popup_download_error_message</source>
<extracomment>This file was already downloaded and is no more on the server. Your peer have to resend it if you want to get it</extracomment> <extracomment>This file was already downloaded and is no more on the server. Your peer have to resend it if you want to get it</extracomment>
<translation>Ce fichier a déjà é téléchargé et n&apos;est plus sur le serveur. Votre correspondant devra vous le renvoyer si vous voulez y avoir accès.</translation> <translation>Ce fichier a déjà é téléchargé et n&apos;est plus sur le serveur. Votre correspondant devra vous le renvoyer si vous voulez y avoir accès.</translation>
@ -4771,36 +4790,36 @@ Expiration : %1</translation>
<context> <context>
<name>Notifier</name> <name>Notifier</name>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="309"/> <location filename="../../core/notifier/Notifier.cpp" line="310"/>
<source>new_call_alert_accessible_name</source> <source>new_call_alert_accessible_name</source>
<extracomment>New call from %1</extracomment> <extracomment>New call from %1</extracomment>
<translation>Nouvel appel de %1</translation> <translation>Nouvel appel de %1</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="361"/> <location filename="../../core/notifier/Notifier.cpp" line="363"/>
<source>new_voice_message</source> <source>new_voice_message</source>
<extracomment>&apos;Voice message received!&apos; : message to warn the user in a notofication for voice messages.</extracomment> <extracomment>&apos;Voice message received!&apos; : message to warn the user in a notofication for voice messages.</extracomment>
<translation>Message vocal reçu !</translation> <translation>Message vocal reçu !</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="362"/> <location filename="../../core/notifier/Notifier.cpp" line="364"/>
<source>new_file_message</source> <source>new_file_message</source>
<translation>Fichier reçu !</translation> <translation>Fichier reçu !</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="365"/> <location filename="../../core/notifier/Notifier.cpp" line="367"/>
<source>new_conference_invitation</source> <source>new_conference_invitation</source>
<extracomment>&apos;Conference invitation received!&apos; : Notification about receiving an invitation to a conference.</extracomment> <extracomment>&apos;Conference invitation received!&apos; : Notification about receiving an invitation to a conference.</extracomment>
<translation>Nouvelle invitation à une conférence !</translation> <translation>Nouvelle invitation à une conférence !</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="385"/> <location filename="../../core/notifier/Notifier.cpp" line="387"/>
<source>new_chat_room_messages</source> <source>new_chat_room_messages</source>
<extracomment>&apos;New messages received!&apos; Notification that warn the user of new messages.</extracomment> <extracomment>&apos;New messages received!&apos; Notification that warn the user of new messages.</extracomment>
<translation>Nouveaux messages reçus !</translation> <translation>Nouveaux messages reçus !</translation>
</message> </message>
<message> <message>
<location filename="../../core/notifier/Notifier.cpp" line="392"/> <location filename="../../core/notifier/Notifier.cpp" line="394"/>
<source>new_message_alert_accessible_name</source> <source>new_message_alert_accessible_name</source>
<extracomment>New message on chatroom %1</extracomment> <extracomment>New message on chatroom %1</extracomment>
<translation>Nouveau message sur la conversation %1</translation> <translation>Nouveau message sur la conversation %1</translation>
@ -4820,102 +4839,102 @@ Expiration : %1</translation>
<translation>Timeout : non authentifié</translation> <translation>Timeout : non authentifié</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="123"/> <location filename="../../model/auth/OIDCModel.cpp" line="125"/>
<source>oidc_authentication_granted_message</source> <source>oidc_authentication_granted_message</source>
<extracomment>Authentication granted</extracomment> <extracomment>Authentication granted</extracomment>
<translation>Authentification accordée</translation> <translation>Authentification accordée</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="130"/> <location filename="../../model/auth/OIDCModel.cpp" line="132"/>
<source>oidc_authentication_not_authenticated_message</source> <source>oidc_authentication_not_authenticated_message</source>
<extracomment>Not authenticated</extracomment> <extracomment>Not authenticated</extracomment>
<translation>Non authentifié</translation> <translation>Non authentifié</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="136"/> <location filename="../../model/auth/OIDCModel.cpp" line="138"/>
<source>oidc_authentication_refresh_message</source> <source>oidc_authentication_refresh_message</source>
<extracomment>Refreshing token</extracomment> <extracomment>Refreshing token</extracomment>
<translation>Token en cours de rafraîchissement</translation> <translation>Token en cours de rafraîchissement</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="141"/> <location filename="../../model/auth/OIDCModel.cpp" line="143"/>
<source>oidc_authentication_temporary_credentials_message</source> <source>oidc_authentication_temporary_credentials_message</source>
<extracomment>Temporary credentials received</extracomment> <extracomment>Temporary credentials received</extracomment>
<translation>Identifiants temporaires reçus</translation> <translation>Identifiants temporaires reçus</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="159"/> <location filename="../../model/auth/OIDCModel.cpp" line="161"/>
<source>oidc_authentication_network_error</source> <source>oidc_authentication_network_error</source>
<extracomment>Network error</extracomment> <extracomment>Network error</extracomment>
<translation>Erreur réseau</translation> <translation>Erreur réseau</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="163"/> <location filename="../../model/auth/OIDCModel.cpp" line="165"/>
<source>oidc_authentication_server_error</source> <source>oidc_authentication_server_error</source>
<extracomment>Server error</extracomment> <extracomment>Server error</extracomment>
<translation>Erreur de serveur</translation> <translation>Erreur de serveur</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="167"/> <location filename="../../model/auth/OIDCModel.cpp" line="169"/>
<source>oidc_authentication_token_not_found_error</source> <source>oidc_authentication_token_not_found_error</source>
<extracomment>OAuth token not found</extracomment> <extracomment>OAuth token not found</extracomment>
<translation>Token OAuth non trouvé</translation> <translation>Token OAuth non trouvé</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="171"/> <location filename="../../model/auth/OIDCModel.cpp" line="173"/>
<source>oidc_authentication_token_secret_not_found_error</source> <source>oidc_authentication_token_secret_not_found_error</source>
<extracomment>OAuth token secret not found</extracomment> <extracomment>OAuth token secret not found</extracomment>
<translation>Token OAuth secret non trouvé</translation> <translation>Token OAuth secret non trouvé</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="175"/> <location filename="../../model/auth/OIDCModel.cpp" line="177"/>
<source>oidc_authentication_callback_not_verified_error</source> <source>oidc_authentication_callback_not_verified_error</source>
<extracomment>OAuth callback not verified</extracomment> <extracomment>OAuth callback not verified</extracomment>
<translation>Retour OAuth non vérifié</translation> <translation>Retour OAuth non vérifié</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="186"/> <location filename="../../model/auth/OIDCModel.cpp" line="188"/>
<source>oidc_authentication_request_auth_message</source> <source>oidc_authentication_request_auth_message</source>
<extracomment>Requesting authorization from browser</extracomment> <extracomment>Requesting authorization from browser</extracomment>
<translation>En attente d&apos;autorisation du navigateur</translation> <translation>En attente d&apos;autorisation du navigateur</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="217"/> <location filename="../../model/auth/OIDCModel.cpp" line="219"/>
<source>oidc_authentication_no_token_found_error</source> <source>oidc_authentication_no_token_found_error</source>
<translation>Token non trouvé</translation> <translation>Token non trouvé</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="230"/> <location filename="../../model/auth/OIDCModel.cpp" line="232"/>
<source>oidc_authentication_request_token_message</source> <source>oidc_authentication_request_token_message</source>
<extracomment>Requesting access token</extracomment> <extracomment>Requesting access token</extracomment>
<translation>En attente du token d&apos;accès</translation> <translation>En attente du token d&apos;accès</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="235"/> <location filename="../../model/auth/OIDCModel.cpp" line="237"/>
<source>oidc_authentication_refresh_token_message</source> <source>oidc_authentication_refresh_token_message</source>
<extracomment>Refreshing access token</extracomment> <extracomment>Refreshing access token</extracomment>
<translation>Token en cours de rafraîchissement</translation> <translation>Token en cours de rafraîchissement</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="240"/> <location filename="../../model/auth/OIDCModel.cpp" line="242"/>
<source>oidc_authentication_request_authorization_message</source> <source>oidc_authentication_request_authorization_message</source>
<extracomment>Requesting authorization</extracomment> <extracomment>Requesting authorization</extracomment>
<translation>Autorisation en cours</translation> <translation>Autorisation en cours</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="245"/> <location filename="../../model/auth/OIDCModel.cpp" line="247"/>
<source>oidc_authentication_request_temporary_credentials_message</source> <source>oidc_authentication_request_temporary_credentials_message</source>
<extracomment>Requesting temporary credentials</extracomment> <extracomment>Requesting temporary credentials</extracomment>
<translation>En attente d&apos;identifiants temporaires</translation> <translation>En attente d&apos;identifiants temporaires</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="272"/> <location filename="../../model/auth/OIDCModel.cpp" line="274"/>
<source>oidc_authentication_no_auth_found_in_config_error</source> <source>oidc_authentication_no_auth_found_in_config_error</source>
<extracomment>No authorization endpoint found in OpenID configuration</extracomment> <extracomment>No authorization endpoint found in OpenID configuration</extracomment>
<translation>Pas d&apos;autorisation trouvé dans la configuration OpenID</translation> <translation>Pas d&apos;autorisation trouvé dans la configuration OpenID</translation>
</message> </message>
<message> <message>
<location filename="../../model/auth/OIDCModel.cpp" line="287"/> <location filename="../../model/auth/OIDCModel.cpp" line="289"/>
<source>oidc_authentication_no_token_found_in_config_error</source> <source>oidc_authentication_no_token_found_in_config_error</source>
<extracomment>No token endpoint found in OpenID configuration</extracomment> <extracomment>No token endpoint found in OpenID configuration</extracomment>
<translation>Pas de token trouvé dans la configuration OpenID</translation> <translation>Pas de token trouvé dans la configuration OpenID</translation>
@ -5575,37 +5594,37 @@ Pour les activer dans un projet commercial, merci de nous contacter.</translatio
<translation>Démarrer un appel de groupe ?</translation> <translation>Démarrer un appel de groupe ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="118"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="121"/>
<source>unencrypted_conversation_warning</source> <source>unencrypted_conversation_warning</source>
<extracomment>This conversation is not encrypted !</extracomment> <extracomment>This conversation is not encrypted !</extracomment>
<translation>Cette conversation n&apos;est pas chiffrée !</translation> <translation>Cette conversation n&apos;est pas chiffrée !</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="436"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="407"/>
<source>reply_to_label</source> <source>reply_to_label</source>
<extracomment>Reply to %1</extracomment> <extracomment>Reply to %1</extracomment>
<translation>Réponse à %1</translation> <translation>Réponse à %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="637"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="607"/>
<source>shared_medias_title</source> <source>shared_medias_title</source>
<extracomment>Shared medias</extracomment> <extracomment>Shared medias</extracomment>
<translation>Médias partagés</translation> <translation>Médias partagés</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="639"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="609"/>
<source>shared_documents_title</source> <source>shared_documents_title</source>
<extracomment>Shared documents</extracomment> <extracomment>Shared documents</extracomment>
<translation>Documents partagés</translation> <translation>Documents partagés</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="668"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="638"/>
<source>forward_to_title</source> <source>forward_to_title</source>
<extracomment>Forward to</extracomment> <extracomment>Forward to</extracomment>
<translation>Transférer à</translation> <translation>Transférer à</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="702"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="672"/>
<source>conversations_title</source> <source>conversations_title</source>
<extracomment>Conversations</extracomment> <extracomment>Conversations</extracomment>
<translation>Conversations</translation> <translation>Conversations</translation>
@ -5658,11 +5677,6 @@ Pour les activer dans un projet commercial, merci de nous contacter.</translatio
<extracomment>&quot;Réunions&quot;</extracomment> <extracomment>&quot;Réunions&quot;</extracomment>
<translation>Réunions</translation> <translation>Réunions</translation>
</message> </message>
<message>
<source>settings_security_title</source>
<extracomment>&quot;Affichage&quot; &quot;Security&quot;</extracomment>
<translation type="vanished">Sécurité / Chiffrement</translation>
</message>
<message> <message>
<location filename="../../view/Page/Form/Settings/SettingsPage.qml" line="29"/> <location filename="../../view/Page/Form/Settings/SettingsPage.qml" line="29"/>
<source>settings_network_title</source> <source>settings_network_title</source>
@ -5744,38 +5758,38 @@ Pour les activer dans un projet commercial, merci de nous contacter.</translatio
<translation>Impossible de créer l&apos;appel de groupe, le compte par défaut n&apos;est pas défini</translation> <translation>Impossible de créer l&apos;appel de groupe, le compte par défaut n&apos;est pas défini</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="408"/> <location filename="../../model/tool/ToolModel.cpp" line="413"/>
<source>group_call_error_participants_invite</source> <source>group_call_error_participants_invite</source>
<translation>Impossible d&apos;inviter les participants à l&apos;appel de groupe</translation> <translation>Impossible d&apos;inviter les participants à l&apos;appel de groupe</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="412"/> <location filename="../../model/tool/ToolModel.cpp" line="417"/>
<source>group_call_error_creation</source> <source>group_call_error_creation</source>
<translation>L&apos;appel de groupe n&apos;a pas pu être créé</translation> <translation>L&apos;appel de groupe n&apos;a pas pu être créé</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="512"/> <location filename="../../model/tool/ToolModel.cpp" line="517"/>
<source>voice_recording_duration</source> <source>voice_recording_duration</source>
<extracomment>&quot;Voice recording (%1)&quot; : %1 is the duration formated in mm:ss</extracomment> <extracomment>&quot;Voice recording (%1)&quot; : %1 is the duration formated in mm:ss</extracomment>
<translation>Message vocal (%1)</translation> <translation>Message vocal (%1)</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="585"/> <location filename="../../model/tool/ToolModel.cpp" line="591"/>
<source>unknown_audio_device_name</source> <source>unknown_audio_device_name</source>
<translation>Appareil inconnu</translation> <translation>Appareil inconnu</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="520"/> <location filename="../../model/tool/ToolModel.cpp" line="525"/>
<source>conference_invitation</source> <source>conference_invitation</source>
<translation>Invitation à une réunion</translation> <translation>Invitation à une réunion</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="524"/> <location filename="../../model/tool/ToolModel.cpp" line="529"/>
<source>conference_invitation_cancelled</source> <source>conference_invitation_cancelled</source>
<translation>Annulation d&apos;une réunion</translation> <translation>Annulation d&apos;une réunion</translation>
</message> </message>
<message> <message>
<location filename="../../model/tool/ToolModel.cpp" line="522"/> <location filename="../../model/tool/ToolModel.cpp" line="527"/>
<source>conference_invitation_updated</source> <source>conference_invitation_updated</source>
<translation>Modification d&apos;une réunion</translation> <translation>Modification d&apos;une réunion</translation>
</message> </message>

View file

@ -49,19 +49,19 @@ int main(int argc, char *argv[]) {
#endif #endif
*/ */
// Useful to share camera on Fullscreen (other context) or multiscreens // Useful to share camera on Fullscreen (other context) or multiscreens
qDebug() << "[Main] Setting ShareOpenGLContexts"; lDebug() << "[Main] Setting ShareOpenGLContexts";
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts); QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
qDebug() << "[Main] Disabling VSync"; lDebug() << "[Main] Disabling VSync";
// Ignore vertical sync. This way, we avoid blinking on resizes(and other refresh like layouts etc.). // Ignore vertical sync. This way, we avoid blinking on resizes(and other refresh like layouts etc.).
auto ignoreVSync = QSurfaceFormat::defaultFormat(); auto ignoreVSync = QSurfaceFormat::defaultFormat();
ignoreVSync.setSwapInterval(0); ignoreVSync.setSwapInterval(0);
QSurfaceFormat::setDefaultFormat(ignoreVSync); QSurfaceFormat::setDefaultFormat(ignoreVSync);
// Disable QML cache. Avoid malformed cache. // Disable QML cache. Avoid malformed cache.
qDebug() << "[Main] Disabling QML disk cache"; lDebug() << "[Main] Disabling QML disk cache";
qputenv("QML_DISABLE_DISK_CACHE", "true"); qputenv("QML_DISABLE_DISK_CACHE", "true");
qDebug() << "[Main] Setting application to UTF8"; lDebug() << "[Main] Setting application to UTF8";
setlocale(LC_CTYPE, ".UTF8"); setlocale(LC_CTYPE, ".UTF8");
qDebug() << "[Main] Creating application"; lDebug() << "[Main] Creating application";
auto app = QSharedPointer<App>::create(argc, argv); auto app = QSharedPointer<App>::create(argc, argv);
#ifdef ACCESSBILITY_WORKAROUND #ifdef ACCESSBILITY_WORKAROUND
QAccessible::installUpdateHandler(DummyUpdateHandler); QAccessible::installUpdateHandler(DummyUpdateHandler);
@ -69,29 +69,29 @@ int main(int argc, char *argv[]) {
#endif #endif
if (app->isSecondary()) { if (app->isSecondary()) {
qDebug() << "[Main] Sending command from secondary application"; lDebug() << "[Main] Sending command from secondary application";
app->sendCommand(); app->sendCommand();
qInfo() << QStringLiteral("[Main] Running secondary app success. Kill it now."); qInfo() << QStringLiteral("[Main] Running secondary app success. Kill it now.");
app->clean(); app->clean();
cleanStream(); cleanStream();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} else { } else {
qDebug() << "[Main] Initializing core for primary application"; lDebug() << "[Main] Initializing core for primary application";
app->initCore(); app->initCore();
qDebug() << "[Main] Preparing application's connections"; lDebug() << "[Main] Preparing application's connections";
app->setSelf(app); app->setSelf(app);
} }
int result = 0; int result = 0;
do { do {
qDebug() << "[Main] Sending command from primary application"; lDebug() << "[Main] Sending command from primary application";
app->sendCommand(); app->sendCommand();
qInfo() << "[Main] Running application"; lInfo() << "[Main] Running application";
result = app->exec(); result = app->exec();
} while (result == (int)App::StatusCode::gRestartCode); } while (result == (int)App::StatusCode::gRestartCode);
QString message = "[Main] Exiting app with the code : " + QString::number(result); QString message = "[Main] Exiting app with the code : " + QString::number(result);
if (!result) qInfo() << message; if (!result) lInfo() << message;
else qWarning() << message; else lWarning() << message;
app->clean(); app->clean();
app = nullptr; app = nullptr;
cleanStream(); cleanStream();

View file

@ -189,7 +189,7 @@ void AccountManager::registerNewAccount(const QString &username,
const std::shared_ptr<const linphone::AccountManagerServicesRequest> &request, const std::string &data) { const std::shared_ptr<const linphone::AccountManagerServicesRequest> &request, const std::string &data) {
if (request->getType() == linphone::AccountManagerServicesRequest::Type::AccountCreationRequestToken) { if (request->getType() == linphone::AccountManagerServicesRequest::Type::AccountCreationRequestToken) {
QString verifyTokenUrl = Utils::coreStringToAppString(data); QString verifyTokenUrl = Utils::coreStringToAppString(data);
qDebug() << "[AccountManager] request token succeed" << verifyTokenUrl; lInfo() << "[AccountManager] request token succeed" << verifyTokenUrl;
QDesktopServices::openUrl(verifyTokenUrl); QDesktopServices::openUrl(verifyTokenUrl);
auto creationToken = verifyTokenUrl.mid(verifyTokenUrl.lastIndexOf("/") + 1); auto creationToken = verifyTokenUrl.mid(verifyTokenUrl.lastIndexOf("/") + 1);
@ -206,7 +206,7 @@ void AccountManager::registerNewAccount(const QString &username,
} else if (request->getType() == linphone::AccountManagerServicesRequest::Type:: } else if (request->getType() == linphone::AccountManagerServicesRequest::Type::
AccountCreationTokenFromAccountCreationRequestToken) { AccountCreationTokenFromAccountCreationRequestToken) {
qDebug() << "[AccountManager] request token conversion succeed" << data; lInfo() << "[AccountManager] request token conversion succeed" << data;
emit tokenConversionSucceed(Utils::coreStringToAppString(data)); emit tokenConversionSucceed(Utils::coreStringToAppString(data));
timer.stop(); timer.stop();
mAccountManagerServicesModel->createAccountUsingToken(Utils::appStringToCoreString(username), mAccountManagerServicesModel->createAccountUsingToken(Utils::appStringToCoreString(username),
@ -225,24 +225,24 @@ void AccountManager::registerNewAccount(const QString &username,
createdSipIdentityAddress->getDomain() // Domain. createdSipIdentityAddress->getDomain() // Domain.
)); ));
if (type == RegisterType::Email) { if (type == RegisterType::Email) {
qDebug() << "[AccountManager] creation succeed, email verification" << registerAddress; lInfo() << "[AccountManager] creation succeed, email verification" << registerAddress;
mAccountManagerServicesModel->linkEmailByEmail( mAccountManagerServicesModel->linkEmailByEmail(
ToolModel::interpretUrl(Utils::coreStringToAppString(data)), ToolModel::interpretUrl(Utils::coreStringToAppString(data)),
Utils::appStringToCoreString(registerAddress)); Utils::appStringToCoreString(registerAddress));
} else { } else {
qDebug() << "[AccountManager] creation succeed, sms verification" << registerAddress; lInfo() << "[AccountManager] creation succeed, sms verification" << registerAddress;
mAccountManagerServicesModel->linkPhoneNumberBySms( mAccountManagerServicesModel->linkPhoneNumberBySms(
ToolModel::interpretUrl(Utils::coreStringToAppString(data)), ToolModel::interpretUrl(Utils::coreStringToAppString(data)),
Utils::appStringToCoreString(registerAddress)); Utils::appStringToCoreString(registerAddress));
} }
} else if (request->getType() == } else if (request->getType() ==
linphone::AccountManagerServicesRequest::Type::SendEmailLinkingCodeByEmail) { linphone::AccountManagerServicesRequest::Type::SendEmailLinkingCodeByEmail) {
qDebug() << "[AccountManager] send email succeed, link account using code"; lInfo() << "[AccountManager] send email succeed, link account using code";
emit newAccountCreationSucceed(mCreatedSipAddress, type, registerAddress); emit newAccountCreationSucceed(mCreatedSipAddress, type, registerAddress);
mCreatedSipAddress.clear(); mCreatedSipAddress.clear();
} else if (request->getType() == } else if (request->getType() ==
linphone::AccountManagerServicesRequest::Type::SendPhoneNumberLinkingCodeBySms) { linphone::AccountManagerServicesRequest::Type::SendPhoneNumberLinkingCodeBySms) {
qDebug() << "[AccountManager] send phone number succeed, link account using code"; lInfo() << "[AccountManager] send phone number succeed, link account using code";
emit newAccountCreationSucceed(mCreatedSipAddress, type, registerAddress); emit newAccountCreationSucceed(mCreatedSipAddress, type, registerAddress);
mCreatedSipAddress.clear(); mCreatedSipAddress.clear();
} }
@ -252,11 +252,11 @@ void AccountManager::registerNewAccount(const QString &username,
[this](const std::shared_ptr<const linphone::AccountManagerServicesRequest> &request, int statusCode, [this](const std::shared_ptr<const linphone::AccountManagerServicesRequest> &request, int statusCode,
const std::string &errorMessage, const std::shared_ptr<const linphone::Dictionary> &parameterErrors) { const std::string &errorMessage, const std::shared_ptr<const linphone::Dictionary> &parameterErrors) {
if (request->getType() == linphone::AccountManagerServicesRequest::Type::AccountCreationRequestToken) { if (request->getType() == linphone::AccountManagerServicesRequest::Type::AccountCreationRequestToken) {
qDebug() << "[AccountManager] error creating request token :" << errorMessage; lInfo() << "[AccountManager] error creating request token :" << errorMessage;
emit registerNewAccountFailed(Utils::coreStringToAppString(errorMessage)); emit registerNewAccountFailed(Utils::coreStringToAppString(errorMessage));
} else if (request->getType() == linphone::AccountManagerServicesRequest::Type:: } else if (request->getType() == linphone::AccountManagerServicesRequest::Type::
AccountCreationTokenFromAccountCreationRequestToken) { AccountCreationTokenFromAccountCreationRequestToken) {
qDebug() << "[AccountManager] error converting token into creation token :" << errorMessage; lInfo() << "[AccountManager] error converting token into creation token :" << errorMessage;
if (parameterErrors) { if (parameterErrors) {
timer.stop(); timer.stop();
emit registerNewAccountFailed(Utils::coreStringToAppString(errorMessage)); emit registerNewAccountFailed(Utils::coreStringToAppString(errorMessage));
@ -264,7 +264,7 @@ void AccountManager::registerNewAccount(const QString &username,
timer.start(); timer.start();
} }
} else if (request->getType() == linphone::AccountManagerServicesRequest::Type::CreateAccountUsingToken) { } else if (request->getType() == linphone::AccountManagerServicesRequest::Type::CreateAccountUsingToken) {
qDebug() << "[AccountManager] error creating account :" << errorMessage; lInfo() << "[AccountManager] error creating account :" << errorMessage;
if (parameterErrors) { if (parameterErrors) {
for (const std::string &key : parameterErrors->getKeys()) { for (const std::string &key : parameterErrors->getKeys()) {
emit errorInField(Utils::coreStringToAppString(key), emit errorInField(Utils::coreStringToAppString(key),
@ -275,7 +275,7 @@ void AccountManager::registerNewAccount(const QString &username,
} }
} else if (request->getType() == } else if (request->getType() ==
linphone::AccountManagerServicesRequest::Type::SendEmailLinkingCodeByEmail) { linphone::AccountManagerServicesRequest::Type::SendEmailLinkingCodeByEmail) {
qDebug() << "[AccountManager] error sending code to email" << errorMessage; lInfo() << "[AccountManager] error sending code to email" << errorMessage;
if (parameterErrors) { if (parameterErrors) {
for (const std::string &key : parameterErrors->getKeys()) { for (const std::string &key : parameterErrors->getKeys()) {
emit errorInField(Utils::coreStringToAppString(key), emit errorInField(Utils::coreStringToAppString(key),
@ -286,7 +286,7 @@ void AccountManager::registerNewAccount(const QString &username,
} }
} else if (request->getType() == } else if (request->getType() ==
linphone::AccountManagerServicesRequest::Type::SendPhoneNumberLinkingCodeBySms) { linphone::AccountManagerServicesRequest::Type::SendPhoneNumberLinkingCodeBySms) {
qDebug() << "[AccountManager] error sending code to phone number" << errorMessage; lInfo() << "[AccountManager] error sending code to phone number" << errorMessage;
if (parameterErrors) { if (parameterErrors) {
for (const std::string &key : parameterErrors->getKeys()) { for (const std::string &key : parameterErrors->getKeys()) {
emit errorInField(Utils::coreStringToAppString(key), emit errorInField(Utils::coreStringToAppString(key),
@ -320,10 +320,10 @@ void AccountManager::linkNewAccountUsingCode(const QString &code,
mAccountManagerServicesModel.get(), &AccountManagerServicesModel::requestSuccessfull, this, mAccountManagerServicesModel.get(), &AccountManagerServicesModel::requestSuccessfull, this,
[this](const std::shared_ptr<const linphone::AccountManagerServicesRequest> &request, const std::string &data) { [this](const std::shared_ptr<const linphone::AccountManagerServicesRequest> &request, const std::string &data) {
if (request->getType() == linphone::AccountManagerServicesRequest::Type::LinkEmailUsingCode) { if (request->getType() == linphone::AccountManagerServicesRequest::Type::LinkEmailUsingCode) {
qDebug() << "[AccountManager] link email to account succeed" << data; lInfo() << "[AccountManager] link email to account succeed" << data;
emit linkingNewAccountWithCodeSucceed(); emit linkingNewAccountWithCodeSucceed();
} else if (request->getType() == linphone::AccountManagerServicesRequest::Type::LinkPhoneNumberUsingCode) { } else if (request->getType() == linphone::AccountManagerServicesRequest::Type::LinkPhoneNumberUsingCode) {
qDebug() << "[AccountManager] link phone number to account succeed" << data; lInfo() << "[AccountManager] link phone number to account succeed" << data;
emit linkingNewAccountWithCodeSucceed(); emit linkingNewAccountWithCodeSucceed();
} }
}); });
@ -332,9 +332,9 @@ void AccountManager::linkNewAccountUsingCode(const QString &code,
[this](const std::shared_ptr<const linphone::AccountManagerServicesRequest> &request, int statusCode, [this](const std::shared_ptr<const linphone::AccountManagerServicesRequest> &request, int statusCode,
const std::string &errorMessage, const std::shared_ptr<const linphone::Dictionary> &parameterErrors) { const std::string &errorMessage, const std::shared_ptr<const linphone::Dictionary> &parameterErrors) {
if (request->getType() == linphone::AccountManagerServicesRequest::Type::LinkEmailUsingCode) { if (request->getType() == linphone::AccountManagerServicesRequest::Type::LinkEmailUsingCode) {
qDebug() << "[AccountManager] error linking email to account" << errorMessage; lInfo() << "[AccountManager] error linking email to account" << errorMessage;
} else if (request->getType() == linphone::AccountManagerServicesRequest::Type::LinkPhoneNumberUsingCode) { } else if (request->getType() == linphone::AccountManagerServicesRequest::Type::LinkPhoneNumberUsingCode) {
qDebug() << "[AccountManager] error linking phone number to account" << errorMessage; lInfo() << "[AccountManager] error linking phone number to account" << errorMessage;
} }
emit linkingNewAccountWithCodeFailed(Utils::coreStringToAppString(errorMessage)); emit linkingNewAccountWithCodeFailed(Utils::coreStringToAppString(errorMessage));
}); });

View file

@ -52,7 +52,7 @@ OIDCModel::OIDCModel(const std::shared_ptr<linphone::AuthInfo> &authInfo, QObjec
qDebug() << "OIDC Redirect URI Port set to [" << port << "]"; qDebug() << "OIDC Redirect URI Port set to [" << port << "]";
auto replyHandler = new OAuthHttpServerReplyHandler(port, this); auto replyHandler = new OAuthHttpServerReplyHandler(port, this);
if (!replyHandler->isListening()) { if (!replyHandler->isListening()) {
qWarning() << "OAuthHttpServerReplyHandler is not listening on port" << port; lWarning() << log().arg("OAuthHttpServerReplyHandler is not listening on port") << port;
emit requestFailed(tr("OAuthHttpServerReplyHandler is not listening")); emit requestFailed(tr("OAuthHttpServerReplyHandler is not listening"));
emit finished(); emit finished();
return; return;
@ -99,7 +99,7 @@ OIDCModel::OIDCModel(const std::shared_ptr<linphone::AuthInfo> &authInfo, QObjec
mTimeout.setInterval(1000 * 60 * 2); // 2minutes mTimeout.setInterval(1000 * 60 * 2); // 2minutes
connect(&mTimeout, &QTimer::timeout, [this]() { connect(&mTimeout, &QTimer::timeout, [this]() {
qWarning() << log().arg("Timeout reached for OpenID connection."); lWarning() << log().arg("Timeout reached for OpenID connection.");
dynamic_cast<OAuthHttpServerReplyHandler *>(mOidc.replyHandler())->close(); dynamic_cast<OAuthHttpServerReplyHandler *>(mOidc.replyHandler())->close();
CoreModel::getInstance()->getCore()->abortAuthentication(mAuthInfo); CoreModel::getInstance()->getCore()->abortAuthentication(mAuthInfo);
//: Timeout: Not authenticated //: Timeout: Not authenticated
@ -108,11 +108,13 @@ OIDCModel::OIDCModel(const std::shared_ptr<linphone::AuthInfo> &authInfo, QObjec
}); });
connect(mOidc.networkAccessManager(), &QNetworkAccessManager::authenticationRequired, connect(mOidc.networkAccessManager(), &QNetworkAccessManager::authenticationRequired,
[=](QNetworkReply *reply, QAuthenticator *authenticator) { [=](QNetworkReply *reply, QAuthenticator *authenticator) {
lDebug() << "authenticationRequired url [" << reply->url() << "]"; lInfo() << "authenticationRequired url [" << reply->url() << "]";
if (mOidc.clientIdentifierSharedKey().isEmpty() == false) { if (mOidc.clientIdentifierSharedKey().isEmpty() == false) {
authenticator->setUser(mOidc.clientIdentifier()); authenticator->setUser(mOidc.clientIdentifier());
authenticator->setPassword(mOidc.clientIdentifierSharedKey()); authenticator->setPassword(mOidc.clientIdentifierSharedKey());
} else lWarning() << "client secret not found for client id [" << mOidc.clientIdentifier() << "]"; } else
lWarning() << log().arg("client secret not found for client id [") << mOidc.clientIdentifier()
<< "]";
}); });
connect(&mOidc, &QOAuth2AuthorizationCodeFlow::statusChanged, [=](QAbstractOAuth::Status status) { connect(&mOidc, &QOAuth2AuthorizationCodeFlow::statusChanged, [=](QAbstractOAuth::Status status) {
@ -152,7 +154,7 @@ OIDCModel::OIDCModel(const std::shared_ptr<linphone::AuthInfo> &authInfo, QObjec
const QMetaObject metaObject = QAbstractOAuth::staticMetaObject; const QMetaObject metaObject = QAbstractOAuth::staticMetaObject;
int index = metaObject.indexOfEnumerator("Error"); int index = metaObject.indexOfEnumerator("Error");
QMetaEnum metaEnum = metaObject.enumerator(index); QMetaEnum metaEnum = metaObject.enumerator(index);
qWarning() << "RequestFailed:" << metaEnum.valueToKey(static_cast<int>(error)); lWarning() << log().arg("RequestFailed:") << metaEnum.valueToKey(static_cast<int>(error));
switch (error) { switch (error) {
case QAbstractOAuth::Error::NetworkError: case QAbstractOAuth::Error::NetworkError:
//: Network error //: Network error
@ -213,7 +215,7 @@ OIDCModel::OIDCModel(const std::shared_ptr<linphone::AuthInfo> &authInfo, QObjec
} else { } else {
mIdToken.clear(); mIdToken.clear();
qWarning() << "No ID Token or Access Token found in the tokens."; lWarning() << "No ID Token or Access Token found in the tokens.";
emit requestFailed(tr("oidc_authentication_no_token_found_error")); emit requestFailed(tr("oidc_authentication_no_token_found_error"));
emit finished(); emit finished();
} }
@ -267,7 +269,7 @@ void OIDCModel::openIdConfigReceived() {
if (rootArray.contains("authorization_endpoint")) { if (rootArray.contains("authorization_endpoint")) {
mOidc.setAuthorizationUrl(QUrl(rootArray["authorization_endpoint"].toString())); mOidc.setAuthorizationUrl(QUrl(rootArray["authorization_endpoint"].toString()));
} else { } else {
qWarning() << "No authorization endpoint found in OpenID configuration"; lWarning() << log().arg("No authorization endpoint found in OpenID configuration");
//: No authorization endpoint found in OpenID configuration //: No authorization endpoint found in OpenID configuration
emit requestFailed(tr("oidc_authentication_no_auth_found_in_config_error")); emit requestFailed(tr("oidc_authentication_no_auth_found_in_config_error"));
emit finished(); emit finished();
@ -282,7 +284,7 @@ void OIDCModel::openIdConfigReceived() {
mAuthInfo->setTokenEndpointUri( mAuthInfo->setTokenEndpointUri(
Utils::appStringToCoreString(QUrl(rootArray["token_endpoint"].toString()).toString())); Utils::appStringToCoreString(QUrl(rootArray["token_endpoint"].toString()).toString()));
} else { } else {
qWarning() << "No token endpoint found in OpenID configuration"; lWarning() << log().arg("No token endpoint found in OpenID configuration");
//: No token endpoint found in OpenID configuration //: No token endpoint found in OpenID configuration
emit requestFailed(tr("oidc_authentication_no_token_found_in_config_error")); emit requestFailed(tr("oidc_authentication_no_token_found_in_config_error"));
emit finished(); emit finished();
@ -307,7 +309,7 @@ void OIDCModel::setBearers() {
mAuthInfo->setRefreshToken(refreshBearer); mAuthInfo->setRefreshToken(refreshBearer);
} else { } else {
qWarning() << "No refresh token found"; lWarning() << log().arg("No refresh token found");
} }
CoreModel::getInstance()->getCore()->addAuthInfo(mAuthInfo); CoreModel::getInstance()->getCore()->addAuthInfo(mAuthInfo);
emit CoreModel::getInstance()->bearerAccountAdded(); emit CoreModel::getInstance()->bearerAccountAdded();

View file

@ -97,7 +97,7 @@ void CallModel::setPaused(bool paused) {
void CallModel::transferTo(const std::shared_ptr<linphone::Address> &address) { void CallModel::transferTo(const std::shared_ptr<linphone::Address> &address) {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
if (mMonitor->transferTo(address) == -1) if (mMonitor->transferTo(address) == -1)
qWarning() << log() lWarning() << log()
.arg(QStringLiteral("Unable to transfer: `%1`.")) .arg(QStringLiteral("Unable to transfer: `%1`."))
.arg(Utils::coreStringToAppString(address->asStringUriOnly())); .arg(Utils::coreStringToAppString(address->asStringUriOnly()));
} }
@ -105,7 +105,7 @@ void CallModel::transferTo(const std::shared_ptr<linphone::Address> &address) {
void CallModel::transferToAnother(const std::shared_ptr<linphone::Call> &call) { void CallModel::transferToAnother(const std::shared_ptr<linphone::Call> &call) {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
if (mMonitor->transferToAnother(call) == -1) if (mMonitor->transferToAnother(call) == -1)
qWarning() << log() lWarning() << log()
.arg(QStringLiteral("Unable to transfer: `%1`.")) .arg(QStringLiteral("Unable to transfer: `%1`."))
.arg(Utils::coreStringToAppString(call->getRemoteAddress()->asStringUriOnly())); .arg(Utils::coreStringToAppString(call->getRemoteAddress()->asStringUriOnly()));
} }
@ -331,14 +331,14 @@ void CallModel::setVideoSourceDescriptorModel(std::shared_ptr<VideoSourceDescrip
void CallModel::sendDtmf(const QString &dtmf) { void CallModel::sendDtmf(const QString &dtmf) {
const char key = dtmf.constData()[0].toLatin1(); const char key = dtmf.constData()[0].toLatin1();
qInfo() << QStringLiteral("Send dtmf: `%1`.").arg(key); lInfo() << log().arg("Send dtmf: `%1`.").arg(key);
if (mMonitor) mMonitor->sendDtmf(key); if (mMonitor) mMonitor->sendDtmf(key);
CoreModel::getInstance()->getCore()->playDtmf(key, gDtmfSoundDelay); CoreModel::getInstance()->getCore()->playDtmf(key, gDtmfSoundDelay);
} }
void CallModel::updateCallErrorFromReason(linphone::Reason reason) { void CallModel::updateCallErrorFromReason(linphone::Reason reason) {
QString error; QString error;
qDebug() << "call Error reason" << (int)reason; lDebug() << log().arg("call Error reason") << (int)reason;
switch (reason) { switch (reason) {
case linphone::Reason::None: case linphone::Reason::None:
error = ""; error = "";
@ -391,7 +391,7 @@ void CallModel::updateCallErrorFromReason(linphone::Reason reason) {
break; break;
} }
if (!error.isEmpty()) qInfo() << QStringLiteral("Call terminated with error (%1):").arg(error) << this; if (!error.isEmpty()) lInfo() << log().arg("Call terminated with error (%1):").arg(error) << this;
emit errorMessageChanged(error); emit errorMessageChanged(error);
} }

View file

@ -85,7 +85,7 @@ void ChatMessageContentModel::downloadFile(const QString &name) {
case linphone::ChatMessage::State::FileTransferInProgress: case linphone::ChatMessage::State::FileTransferInProgress:
return; return;
default: default:
qWarning() << QStringLiteral("Wrong message state when requesting downloading, state=.") lWarning() << QStringLiteral("Wrong message state when requesting downloading, state=.")
<< LinphoneEnums::fromLinphone(mChatMessageModel->getState()); << LinphoneEnums::fromLinphone(mChatMessageModel->getState());
} }
bool soFarSoGood; bool soFarSoGood;
@ -93,12 +93,13 @@ void ChatMessageContentModel::downloadFile(const QString &name) {
QStringLiteral("%1%2").arg(App::getInstance()->getSettings()->getDownloadFolder()).arg(name), &soFarSoGood); QStringLiteral("%1%2").arg(App::getInstance()->getSettings()->getDownloadFolder()).arg(name), &soFarSoGood);
if (!soFarSoGood) { if (!soFarSoGood) {
qWarning() << QStringLiteral("Unable to create safe file path for: %1.").arg(name); lWarning() << QStringLiteral("Unable to create safe file path for: %1.").arg(name);
return; return;
} }
mContent->setFilePath(Utils::appStringToCoreString(safeFilePath)); mContent->setFilePath(Utils::appStringToCoreString(safeFilePath));
if (!mContent->isFileTransfer()) { if (!mContent->isFileTransfer()) {
lWarning() << QStringLiteral("file transfer is not available");
Utils::showInformationPopup( Utils::showInformationPopup(
//: Error //: Error
tr("popup_error_title"), tr("popup_error_title"),
@ -107,7 +108,7 @@ void ChatMessageContentModel::downloadFile(const QString &name) {
tr("popup_download_error_message"), false); tr("popup_download_error_message"), false);
} else { } else {
if (!mChatMessageModel->getMonitor()->downloadContent(mContent)) if (!mChatMessageModel->getMonitor()->downloadContent(mContent))
qWarning() << QStringLiteral("Unable to download file of entry %1.").arg(name); lWarning() << QStringLiteral("Unable to download file of entry %1.").arg(name);
} }
} }

View file

@ -93,7 +93,7 @@ QString CliModel::parseFunctionName(const QString &command, bool isOptional) {
// mRegExpFunctionName.indexIn(command.toLower()); // mRegExpFunctionName.indexIn(command.toLower());
// if (mRegExpFunctionName.pos(1) == -1) { // if (mRegExpFunctionName.pos(1) == -1) {
if (!match.hasMatch()) { if (!match.hasMatch()) {
if (!isOptional) qWarning() << QStringLiteral("Unable to parse function name of command: `%1`.").arg(command); if (!isOptional) lWarning() << QStringLiteral("Unable to parse function name of command: `%1`.").arg(command);
return QString(""); return QString("");
} }
@ -102,7 +102,7 @@ QString CliModel::parseFunctionName(const QString &command, bool isOptional) {
const QString functionName = texts[1]; const QString functionName = texts[1];
if (!mCommands.contains(functionName)) { if (!mCommands.contains(functionName)) {
if (!isOptional) qWarning() << QStringLiteral("This command doesn't exist: `%1`.").arg(functionName); if (!isOptional) lWarning() << QStringLiteral("This command doesn't exist: `%1`.").arg(functionName);
return QString(""); return QString("");
} }
@ -344,7 +344,7 @@ void CliModel::executeCommand(const QString &command) { //, CommandFormat *forma
const QString &functionName = parseFunctionName(command, false); const QString &functionName = parseFunctionName(command, false);
const QString configURI = QString(EXECUTABLE_NAME).toLower() + "-config"; const QString configURI = QString(EXECUTABLE_NAME).toLower() + "-config";
if (!functionName.isEmpty()) { // It is a CLI if (!functionName.isEmpty()) { // It is a CLI
qInfo() << QStringLiteral("Detecting cli command: `%1`…").arg(command); lInfo() << log().arg("Detecting cli command: `%1`…").arg(command);
QHash<QString, QString> args = parseArgs(command); QHash<QString, QString> args = parseArgs(command);
QHash<QString, QString> argsToProcess; QHash<QString, QString> argsToProcess;
for (auto it = args.begin(); it != args.end(); ++it) { for (auto it = args.begin(); it != args.end(); ++it) {
@ -410,7 +410,7 @@ void CliModel::executeCommand(const QString &command) { //, CommandFormat *forma
address = linphone::Factory::get()->createAddress( address = linphone::Factory::get()->createAddress(
Utils::appStringToCoreString(transformedCommand)); // Test if command is an address Utils::appStringToCoreString(transformedCommand)); // Test if command is an address
// if (format) *format = UriFormat; // if (format) *format = UriFormat;
qInfo() << QStringLiteral("Detecting URI command: `%1`…").arg(command); lInfo() << log().arg("Detecting URI command: `%1`…").arg(command);
QString functionName; QString functionName;
if (address) { if (address) {
functionName = Utils::coreStringToAppString(address->getHeader("method")).isEmpty() functionName = Utils::coreStringToAppString(address->getHeader("method")).isEmpty()
@ -429,10 +429,10 @@ void CliModel::executeCommand(const QString &command) { //, CommandFormat *forma
} }
functionName = functionName.toLower(); functionName = functionName.toLower();
if (functionName.isEmpty()) { if (functionName.isEmpty()) {
qWarning() << QStringLiteral("There is no method set in `%1`.").arg(command); lWarning() << log().arg("There is no method set in `%1`.").arg(command);
return; return;
} else if (!mCommands.contains(functionName)) { } else if (!mCommands.contains(functionName)) {
qWarning() << QStringLiteral("This command doesn't exist: `%1`.").arg(functionName); lWarning() << log().arg("This command doesn't exist: `%1`.").arg(functionName);
return; return;
} }
QHash<QString, QString> headers; QHash<QString, QString> headers;

View file

@ -183,20 +183,20 @@ void ConferenceModel::onActiveSpeakerParticipantDevice(
void ConferenceModel::onParticipantAdded(const std::shared_ptr<linphone::Conference> &conference, void ConferenceModel::onParticipantAdded(const std::shared_ptr<linphone::Conference> &conference,
const std::shared_ptr<linphone::Participant> &participant) { const std::shared_ptr<linphone::Participant> &participant) {
lDebug() << "onParticipant Added" << participant->getAddress()->asStringUriOnly(); lInfo() << "onParticipant Added" << participant->getAddress()->asStringUriOnly();
emit participantAdded(participant); emit participantAdded(participant);
emit participantDeviceCountChanged(conference, getParticipantDeviceCount()); emit participantDeviceCountChanged(conference, getParticipantDeviceCount());
} }
void ConferenceModel::onParticipantRemoved(const std::shared_ptr<linphone::Conference> &conference, void ConferenceModel::onParticipantRemoved(const std::shared_ptr<linphone::Conference> &conference,
const std::shared_ptr<const linphone::Participant> &participant) { const std::shared_ptr<const linphone::Participant> &participant) {
lDebug() << "onParticipant Removed" << participant->getAddress()->asStringUriOnly(); lInfo() << "onParticipant Removed" << participant->getAddress()->asStringUriOnly();
emit participantRemoved(participant); emit participantRemoved(participant);
emit participantDeviceCountChanged(conference, getParticipantDeviceCount()); emit participantDeviceCountChanged(conference, getParticipantDeviceCount());
} }
void ConferenceModel::onParticipantDeviceAdded(const std::shared_ptr<linphone::Conference> &conference, void ConferenceModel::onParticipantDeviceAdded(const std::shared_ptr<linphone::Conference> &conference,
const std::shared_ptr<linphone::ParticipantDevice> &participantDevice) { const std::shared_ptr<linphone::ParticipantDevice> &participantDevice) {
lDebug() << "onParticipantDeviceAdded"; lInfo() << "onParticipantDeviceAdded";
lDebug() << "Me devices : " << conference->getMe()->getDevices().size(); lInfo() << "Me devices : " << conference->getMe()->getDevices().size();
if (conference->getMe()->getDevices().size() > 1) if (conference->getMe()->getDevices().size() > 1)
for (auto d : conference->getMe()->getDevices()) for (auto d : conference->getMe()->getDevices())
lDebug() << "\t--> " << d->getAddress()->asString().c_str(); lDebug() << "\t--> " << d->getAddress()->asString().c_str();
@ -222,13 +222,13 @@ void ConferenceModel::onParticipantDeviceStateChanged(const std::shared_ptr<linp
} }
void ConferenceModel::onParticipantAdminStatusChanged(const std::shared_ptr<linphone::Conference> &conference, void ConferenceModel::onParticipantAdminStatusChanged(const std::shared_ptr<linphone::Conference> &conference,
const std::shared_ptr<const linphone::Participant> &participant) { const std::shared_ptr<const linphone::Participant> &participant) {
lDebug() << "onParticipantAdminStatusChanged"; lInfo() << "onParticipantAdminStatusChanged";
emit participantAdminStatusChanged(participant); emit participantAdminStatusChanged(participant);
} }
void ConferenceModel::onParticipantDeviceMediaCapabilityChanged( void ConferenceModel::onParticipantDeviceMediaCapabilityChanged(
const std::shared_ptr<linphone::Conference> &conference, const std::shared_ptr<linphone::Conference> &conference,
const std::shared_ptr<const linphone::ParticipantDevice> &participantDevice) { const std::shared_ptr<const linphone::ParticipantDevice> &participantDevice) {
lDebug() << "onParticipantDeviceMediaCapabilityChanged: " lInfo() << "onParticipantDeviceMediaCapabilityChanged: "
<< (int)participantDevice->getStreamCapability(linphone::StreamType::Video) << (int)participantDevice->getStreamCapability(linphone::StreamType::Video)
<< ". Device: " << participantDevice->getAddress()->asString().c_str(); << ". Device: " << participantDevice->getAddress()->asString().c_str();
emit participantDeviceMediaCapabilityChanged(participantDevice); emit participantDeviceMediaCapabilityChanged(participantDevice);
@ -236,7 +236,7 @@ void ConferenceModel::onParticipantDeviceMediaCapabilityChanged(
void ConferenceModel::onParticipantDeviceMediaAvailabilityChanged( void ConferenceModel::onParticipantDeviceMediaAvailabilityChanged(
const std::shared_ptr<linphone::Conference> &conference, const std::shared_ptr<linphone::Conference> &conference,
const std::shared_ptr<const linphone::ParticipantDevice> &participantDevice) { const std::shared_ptr<const linphone::ParticipantDevice> &participantDevice) {
lDebug() << "onParticipantDeviceMediaAvailabilityChanged: " lInfo() << "onParticipantDeviceMediaAvailabilityChanged: "
<< (int)participantDevice->getStreamAvailability(linphone::StreamType::Video) << (int)participantDevice->getStreamAvailability(linphone::StreamType::Video)
<< ". Device: " << participantDevice->getAddress()->asString().c_str(); << ". Device: " << participantDevice->getAddress()->asString().c_str();
emit participantDeviceMediaAvailabilityChanged(participantDevice); emit participantDeviceMediaAvailabilityChanged(participantDevice);
@ -254,7 +254,7 @@ void ConferenceModel::onParticipantDeviceScreenSharingChanged(
const std::shared_ptr<linphone::Conference> &conference, const std::shared_ptr<linphone::Conference> &conference,
const std::shared_ptr<const linphone::ParticipantDevice> &device, const std::shared_ptr<const linphone::ParticipantDevice> &device,
bool enabled) { bool enabled) {
qDebug() << "onParticipantDeviceScreenSharingChanged: " << device->getAddress()->asString().c_str() lInfo() << log().arg("onParticipantDeviceScreenSharingChanged: ") << device->getAddress()->asString().c_str()
<< ". Enabled:" << enabled; << ". Enabled:" << enabled;
emit participantDeviceScreenSharingChanged(device, enabled); emit participantDeviceScreenSharingChanged(device, enabled);
if (ToolModel::isLocal(mMonitor, device)) { if (ToolModel::isLocal(mMonitor, device)) {
@ -265,7 +265,7 @@ void ConferenceModel::onParticipantDeviceScreenSharingChanged(
void ConferenceModel::onStateChanged(const std::shared_ptr<linphone::Conference> &conference, void ConferenceModel::onStateChanged(const std::shared_ptr<linphone::Conference> &conference,
linphone::Conference::State newState) { linphone::Conference::State newState) {
lDebug() << log().arg("onStateChanged:") << (int)newState; lInfo() << log().arg("onStateChanged:") << (int)newState;
if (newState == linphone::Conference::State::Created) { if (newState == linphone::Conference::State::Created) {
emit participantDeviceCountChanged(conference, mMonitor->getParticipantDeviceList().size()); emit participantDeviceCountChanged(conference, mMonitor->getParticipantDeviceList().size());
if (mMonitor->getScreenSharingParticipant()) emit isScreenSharingEnabledChanged(true); if (mMonitor->getScreenSharingParticipant()) emit isScreenSharingEnabledChanged(true);
@ -275,7 +275,7 @@ void ConferenceModel::onStateChanged(const std::shared_ptr<linphone::Conference>
} }
void ConferenceModel::onSubjectChanged(const std::shared_ptr<linphone::Conference> &conference, void ConferenceModel::onSubjectChanged(const std::shared_ptr<linphone::Conference> &conference,
const std::string &subject) { const std::string &subject) {
lDebug() << "onSubjectChanged"; lInfo() << "onSubjectChanged";
emit subjectChanged(subject); emit subjectChanged(subject);
} }
void ConferenceModel::onAudioDeviceChanged(const std::shared_ptr<linphone::Conference> &conference, void ConferenceModel::onAudioDeviceChanged(const std::shared_ptr<linphone::Conference> &conference,
@ -286,7 +286,7 @@ void ConferenceModel::onAudioDeviceChanged(const std::shared_ptr<linphone::Confe
void ConferenceModel::onIsScreenSharingEnabledChanged() { void ConferenceModel::onIsScreenSharingEnabledChanged() {
auto call = mMonitor->getCall(); auto call = mMonitor->getCall();
std::shared_ptr<linphone::CallParams> params = CoreModel::getInstance()->getCore()->createCallParams(call); std::shared_ptr<linphone::CallParams> params = CoreModel::getInstance()->getCore()->createCallParams(call);
lDebug() << log().arg("Old Layout=%1").arg((int)params->getConferenceVideoLayout()); lInfo() << log().arg("Old Layout=%1").arg((int)params->getConferenceVideoLayout());
if (params->getConferenceVideoLayout() == linphone::Conference::Layout::Grid && params->videoEnabled()) { if (params->getConferenceVideoLayout() == linphone::Conference::Layout::Grid && params->videoEnabled()) {
params->setConferenceVideoLayout(linphone::Conference::Layout::ActiveSpeaker); params->setConferenceVideoLayout(linphone::Conference::Layout::ActiveSpeaker);
} }

View file

@ -59,7 +59,11 @@ void MagicSearchModel::search(QString filter,
// sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::ChatRooms; // sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::ChatRooms;
// sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::ConferencesInfo; // sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::ConferencesInfo;
} }
qInfo() << log().arg("Searching ") << filter << " from " << sourceFlags << " with limit " << maxResults; if (((sourceFlags & (int)LinphoneEnums::MagicSearchSource::RemoteCardDAV) > 0) &&
SettingsModel::getInstance()->getCardDAVMinCharResearch() > filter.size()) {
sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::RemoteCardDAV;
}
lInfo() << log().arg("Searching ") << filter << " from " << sourceFlags << " with limit " << maxResults;
mMonitor->getContactsListAsync(filter != "*" ? Utils::appStringToCoreString(filter) : "", "", sourceFlags, mMonitor->getContactsListAsync(filter != "*" ? Utils::appStringToCoreString(filter) : "", "", sourceFlags,
LinphoneEnums::toLinphone(aggregation)); LinphoneEnums::toLinphone(aggregation));
} }
@ -80,7 +84,7 @@ void MagicSearchModel::setMaxResults(int maxResults) {
void MagicSearchModel::onSearchResultsReceived(const std::shared_ptr<linphone::MagicSearch> &magicSearch) { void MagicSearchModel::onSearchResultsReceived(const std::shared_ptr<linphone::MagicSearch> &magicSearch) {
auto results = magicSearch->getLastSearch(); auto results = magicSearch->getLastSearch();
qInfo() << log().arg("SDK send callback: onSearchResultsReceived : %1 results.").arg(results.size()); lInfo() << log().arg("SDK send callback: onSearchResultsReceived : %1 results.").arg(results.size());
auto appFriends = ToolModel::getAppFriendList(); auto appFriends = ToolModel::getAppFriendList();
auto ldapFriends = ToolModel::getLdapFriendList(); auto ldapFriends = ToolModel::getLdapFriendList();
emit searchResultsReceived(results); emit searchResultsReceived(results);

View file

@ -156,18 +156,18 @@ void SettingsModel::startCaptureGraph() {
// Media cards must not be used twice (capture card + call) else we will get latencies issues and bad echo // Media cards must not be used twice (capture card + call) else we will get latencies issues and bad echo
// calibrations in call. // calibrations in call.
if (!getIsInCall() && !mSimpleCaptureGraph) { if (!getIsInCall() && !mSimpleCaptureGraph) {
qDebug() << log().arg("Starting capture graph [%1]").arg(mCaptureGraphListenerCount); lDebug() << log().arg("Starting capture graph [%1]").arg(mCaptureGraphListenerCount);
createCaptureGraph(); createCaptureGraph();
} else qDebug() << log().arg("Adding capture graph reference [%1]").arg(mCaptureGraphListenerCount); } else lDebug() << log().arg("Adding capture graph reference [%1]").arg(mCaptureGraphListenerCount);
++mCaptureGraphListenerCount; ++mCaptureGraphListenerCount;
} }
void SettingsModel::stopCaptureGraph() { void SettingsModel::stopCaptureGraph() {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
if (--mCaptureGraphListenerCount == 0) { if (--mCaptureGraphListenerCount == 0) {
qDebug() << log().arg("Stopping capture graph [%1]").arg(mCaptureGraphListenerCount); lDebug() << log().arg("Stopping capture graph [%1]").arg(mCaptureGraphListenerCount);
deleteCaptureGraph(); deleteCaptureGraph();
} else if (mCaptureGraphListenerCount > 0) } else if (mCaptureGraphListenerCount > 0)
qDebug() << log().arg("Removing capture graph reference [%1]").arg(mCaptureGraphListenerCount); lDebug() << log().arg("Removing capture graph reference [%1]").arg(mCaptureGraphListenerCount);
else qCritical() << log().arg("Removing too much capture graph reference [%1]").arg(mCaptureGraphListenerCount); else qCritical() << log().arg("Removing too much capture graph reference [%1]").arg(mCaptureGraphListenerCount);
} }

View file

@ -82,7 +82,7 @@ bool SoundPlayerModel::play(QString source, bool fromStart) {
if (source == "") return false; if (source == "") return false;
if (fromStart) stop(); if (fromStart) stop();
if (!open(source)) { if (!open(source)) {
qWarning() << QStringLiteral("Unable to open: `%1`").arg(source); lWarning() << QStringLiteral("[SoundPlayerModel] %1 Unable to open: `%2`").arg(Q_FUNC_INFO).arg(source);
//: Unable to open: `%1` //: Unable to open: `%1`
emit errorChanged(QString("sound_player_open_error").arg(source)); emit errorChanged(QString("sound_player_open_error").arg(source));
return false; return false;
@ -102,7 +102,7 @@ bool SoundPlayerModel::play(QString source, bool fromStart) {
void SoundPlayerModel::seek(QString source, int offset) { void SoundPlayerModel::seek(QString source, int offset) {
if (!open(source)) { if (!open(source)) {
qWarning() << QStringLiteral("Unable to open: `%1`").arg(source); lWarning() << QStringLiteral("[SoundPlayerModel] %1 Unable to open: `%2`").arg(Q_FUNC_INFO).arg(source);
//: Unable to open: `%1` //: Unable to open: `%1`
emit errorChanged(QString("sound_player_open_error").arg(source)); emit errorChanged(QString("sound_player_open_error").arg(source));
return; return;

View file

@ -373,7 +373,7 @@ bool ToolModel::createCall(const QString &sipAddress,
*/ */
} }
bool ToolModel::createGroupCall(QString subject, const std::list<QString> &participantAddresses, QString *message) { std::shared_ptr<linphone::Conference> ToolModel::createConference(QString subject, QString *message) {
auto core = CoreModel::getInstance()->getCore(); auto core = CoreModel::getInstance()->getCore();
auto conferenceParams = core->createConferenceParams(nullptr); auto conferenceParams = core->createConferenceParams(nullptr);
conferenceParams->enableVideo(true); conferenceParams->enableVideo(true);
@ -381,7 +381,7 @@ bool ToolModel::createGroupCall(QString subject, const std::list<QString> &parti
if (!account) { if (!account) {
qWarning() << "No default account found, can't create group call"; qWarning() << "No default account found, can't create group call";
*message = tr("group_call_error_no_account"); *message = tr("group_call_error_no_account");
return false; return nullptr;
} }
conferenceParams->setAccount(account); conferenceParams->setAccount(account);
conferenceParams->setSubject(Utils::appStringToCoreString(subject)); conferenceParams->setSubject(Utils::appStringToCoreString(subject));
@ -392,8 +392,13 @@ bool ToolModel::createGroupCall(QString subject, const std::list<QString> &parti
conferenceParams->enableChat(true); conferenceParams->enableChat(true);
auto conference = core->createConferenceWithParams(conferenceParams); return core->createConferenceWithParams(conferenceParams);
}
bool ToolModel::createGroupCall(QString subject, const std::list<QString> &participantAddresses, QString *message) {
auto conference = createConference(subject, message);
if (conference) { if (conference) {
auto core = CoreModel::getInstance()->getCore();
auto callParams = core->createCallParams(nullptr); auto callParams = core->createCallParams(nullptr);
callParams->enableVideo(true); callParams->enableVideo(true);
callParams->setVideoDirection(linphone::MediaDirection::RecvOnly); callParams->setVideoDirection(linphone::MediaDirection::RecvOnly);
@ -409,7 +414,7 @@ bool ToolModel::createGroupCall(QString subject, const std::list<QString> &parti
} }
} else { } else {
qWarning() << "Could not create group call"; qWarning() << "Could not create group call";
*message = tr("group_call_error_creation"); if (message->isEmpty()) *message = tr("group_call_error_creation");
} }
return conference != nullptr; return conference != nullptr;
} }
@ -534,7 +539,7 @@ QString ToolModel::getMessageFromContent(std::list<std::shared_ptr<linphone::Con
void ToolModel::loadDownloadedCodecs() { void ToolModel::loadDownloadedCodecs() {
mustBeInLinphoneThread(sLog().arg(Q_FUNC_INFO)); mustBeInLinphoneThread(sLog().arg(Q_FUNC_INFO));
#if defined(Q_OS_LINUX) || defined(Q_OS_WIN) #if defined(Q_OS_LINUX) || defined(Q_OS_WIN)
qInfo() << QStringLiteral("Loading downloaded codecs in folder %1…").arg(Paths::getCodecsDirPath()); lInfo() << QStringLiteral("[ToolModel] Loading downloaded codecs in folder %1…").arg(Paths::getCodecsDirPath());
QDirIterator it(Paths::getCodecsDirPath()); QDirIterator it(Paths::getCodecsDirPath());
while (it.hasNext()) { while (it.hasNext()) {
QFileInfo info(it.next()); QFileInfo info(it.next());
@ -543,9 +548,10 @@ void ToolModel::loadDownloadedCodecs() {
qInfo() << QStringLiteral("Loading `%1` symbols…").arg(filename); qInfo() << QStringLiteral("Loading `%1` symbols…").arg(filename);
auto library = QLibrary(info.filePath()); auto library = QLibrary(info.filePath());
if (!library.load()) // lib.load()) if (!library.load()) // lib.load())
qWarning() << QStringLiteral("Failed to load `%1` symbols.").arg(filename) << library.errorString(); lWarning() << QStringLiteral("[ToolModel] Failed to load `%1` symbols.").arg(filename)
else qInfo() << QStringLiteral("Loaded `%1` symbols…").arg(filename); << library.errorString();
} else qWarning() << QStringLiteral("Found codec file `%1` that is not a library").arg(filename); else lInfo() << QStringLiteral("[ToolModel] Loaded `%1` symbols…").arg(filename);
} else lWarning() << QStringLiteral("[ToolModel] Found codec file `%1` that is not a library").arg(filename);
} }
CoreModel::getInstance()->getCore()->reloadMsPlugins(""); CoreModel::getInstance()->getCore()->reloadMsPlugins("");
qInfo() << QStringLiteral("Finished loading downloaded codecs."); qInfo() << QStringLiteral("Finished loading downloaded codecs.");
@ -664,11 +670,11 @@ std::shared_ptr<linphone::ChatRoom> ToolModel::lookupCurrentCallChat(std::shared
auto localAddress = call->getCallLog()->getLocalAddress(); auto localAddress = call->getCallLog()->getLocalAddress();
std::list<std::shared_ptr<linphone::Address>> participants; std::list<std::shared_ptr<linphone::Address>> participants;
participants.push_back(remoteaddress->clone()); participants.push_back(remoteaddress->clone());
qDebug() << "Looking for chat with local address" << localAddress->asStringUriOnly() << "and participant" lInfo() << "[ToolModel] Looking for chat with local address" << localAddress->asStringUriOnly()
<< remoteaddress->asStringUriOnly(); << "and participant" << remoteaddress->asStringUriOnly();
auto existingChat = core->searchChatRoom(params, localAddress, nullptr, participants); auto existingChat = core->searchChatRoom(params, localAddress, nullptr, participants);
if (existingChat) qDebug() << "Found existing chat"; if (existingChat) lInfo() << "[ToolModel] Found existing chat";
else qDebug() << "Did not find existing chat"; else lInfo() << "[ToolModel] Did not find existing chat";
return existingChat; return existingChat;
} }
} }
@ -708,11 +714,11 @@ std::shared_ptr<linphone::ChatRoom> ToolModel::lookupChatForAddress(std::shared_
remoteAddress->clean(); remoteAddress->clean();
participants.push_back(remoteAddress); participants.push_back(remoteAddress);
qDebug() << "Looking for chat with local address" << localAddress->asStringUriOnly() << "and participant" lInfo() << "Looking for chat with local address" << localAddress->asStringUriOnly() << "and participant"
<< remoteAddress->asStringUriOnly(); << remoteAddress->asStringUriOnly();
auto existingChat = core->searchChatRoom(params, localAddress, nullptr, participants); auto existingChat = core->searchChatRoom(params, localAddress, nullptr, participants);
if (existingChat) qDebug() << "Found existing chat"; if (existingChat) lInfo() << "Found existing chat";
else qDebug() << "Did not find existing chat"; else lInfo() << "Did not find existing chat";
return existingChat; return existingChat;
} }

View file

@ -65,6 +65,7 @@ public:
linphone::MediaEncryption = linphone::MediaEncryption::None, linphone::MediaEncryption = linphone::MediaEncryption::None,
QString *errorMessage = nullptr); QString *errorMessage = nullptr);
static std::shared_ptr<linphone::Conference> createConference(QString subject, QString *message = nullptr);
static bool static bool
createGroupCall(QString subject, const std::list<QString> &participantAddresses, QString *message = nullptr); createGroupCall(QString subject, const std::list<QString> &participantAddresses, QString *message = nullptr);

View file

@ -178,7 +178,7 @@ void Utils::createCall(const QString &sipAddress,
if (mediaEncryption == LinphoneEnums::MediaEncryption::None) if (mediaEncryption == LinphoneEnums::MediaEncryption::None)
mediaEncryption = mediaEncryption =
App::getInstance()->getSettings()->getMediaEncryption()["id"].value<LinphoneEnums::MediaEncryption>(); App::getInstance()->getSettings()->getMediaEncryption()["id"].value<LinphoneEnums::MediaEncryption>();
lDebug() << "[Utils] create call with uri :" << sipAddress << mediaEncryption; lInfo() << "[Utils] create call with uri :" << sipAddress << mediaEncryption;
App::postModelAsync([sipAddress, options, mediaEncryption, prepareTransfertAddress, headers]() { App::postModelAsync([sipAddress, options, mediaEncryption, prepareTransfertAddress, headers]() {
QString errorMessage; QString errorMessage;
bool success = ToolModel::createCall(sipAddress, options, prepareTransfertAddress, headers, bool success = ToolModel::createCall(sipAddress, options, prepareTransfertAddress, headers,
@ -1586,15 +1586,15 @@ VariantObject *Utils::getCurrentCallChat(CallGui *call) {
auto chatCore = ChatCore::create(linphoneChatRoom); auto chatCore = ChatCore::create(linphoneChatRoom);
return QVariant::fromValue(new ChatGui(chatCore)); return QVariant::fromValue(new ChatGui(chatCore));
} else { } else {
qDebug() << "Did not find existing chat room, create one"; lInfo() << "[Utils] Did not find existing chat room, create one";
linphoneChatRoom = ToolModel::createCurrentCallChat(callModel); linphoneChatRoom = ToolModel::createCurrentCallChat(callModel);
if (linphoneChatRoom != nullptr) { if (linphoneChatRoom != nullptr) {
qDebug() << "Chatroom created with" << callModel->getRemoteAddress()->asStringUriOnly(); lInfo() << "[Utils] Chatroom created with" << callModel->getRemoteAddress()->asStringUriOnly();
auto id = linphoneChatRoom->getIdentifier(); auto id = linphoneChatRoom->getIdentifier();
auto chatCore = ChatCore::create(linphoneChatRoom); auto chatCore = ChatCore::create(linphoneChatRoom);
return QVariant::fromValue(new ChatGui(chatCore)); return QVariant::fromValue(new ChatGui(chatCore));
} else { } else {
qWarning() << "Failed to create 1-1 conversation with" lWarning() << "[Utils] Failed to create 1-1 conversation with"
<< callModel->getRemoteAddress()->asStringUriOnly() << "!"; << callModel->getRemoteAddress()->asStringUriOnly() << "!";
data->mConnection->invokeToCore([] { data->mConnection->invokeToCore([] {
//: Error //: Error
@ -1623,14 +1623,14 @@ VariantObject *Utils::getChatForAddress(QString address) {
auto chatCore = ChatCore::create(linphoneChatRoom); auto chatCore = ChatCore::create(linphoneChatRoom);
return QVariant::fromValue(new ChatGui(chatCore)); return QVariant::fromValue(new ChatGui(chatCore));
} else { } else {
qDebug() << "Did not find existing chat room, create one"; lInfo() << "[Utils] Did not find existing chat room, create one";
linphoneChatRoom = ToolModel::createChatForAddress(linAddr); linphoneChatRoom = ToolModel::createChatForAddress(linAddr);
if (linphoneChatRoom != nullptr) { if (linphoneChatRoom != nullptr) {
qDebug() << "Chatroom created with" << linAddr->asStringUriOnly(); lInfo() << "[Utils] Chatroom created with" << linAddr->asStringUriOnly();
auto chatCore = ChatCore::create(linphoneChatRoom); auto chatCore = ChatCore::create(linphoneChatRoom);
return QVariant::fromValue(new ChatGui(chatCore)); return QVariant::fromValue(new ChatGui(chatCore));
} else { } else {
qWarning() << "Failed to create 1-1 conversation with" << linAddr->asStringUriOnly() << "!"; lWarning() << "[Utils] Failed to create 1-1 conversation with" << linAddr->asStringUriOnly() << "!";
//: Failed to create 1-1 conversation with %1 ! //: Failed to create 1-1 conversation with %1 !
data->mConnection->invokeToCore([] { data->mConnection->invokeToCore([] {
showInformationPopup(tr("information_popup_error_title"), showInformationPopup(tr("information_popup_error_title"),

View file

@ -70,7 +70,7 @@ void KeyboardShortcuts::onAcceptCallShortcut() {
auto callList = App::getInstance()->getCallList(); auto callList = App::getInstance()->getCallList();
auto currentPendingCall = callList->getFirstIncommingPendingCall(); auto currentPendingCall = callList->getFirstIncommingPendingCall();
if (!currentPendingCall.isNull()) { if (!currentPendingCall.isNull()) {
lDebug() << "Accept call with shortcut :" << currentPendingCall; lInfo() << "Accept call with shortcut :" << currentPendingCall;
auto gui = new CallGui(currentPendingCall); auto gui = new CallGui(currentPendingCall);
Utils::openCallsWindow(gui); Utils::openCallsWindow(gui);
currentPendingCall->lAccept(false); currentPendingCall->lAccept(false);
@ -82,7 +82,7 @@ void KeyboardShortcuts::onDeclineCallShortcut() {
auto callList = App::getInstance()->getCallList(); auto callList = App::getInstance()->getCallList();
auto currentPendingCall = callList->getFirstIncommingPendingCall(); auto currentPendingCall = callList->getFirstIncommingPendingCall();
if (!currentPendingCall.isNull()) { if (!currentPendingCall.isNull()) {
lDebug() << "Dcline call with shortcut :" << currentPendingCall; lInfo() << "Decline call with shortcut :" << currentPendingCall;
currentPendingCall->lDecline(); currentPendingCall->lDecline();
} }
} }

View file

@ -26,6 +26,8 @@
#include "FileDownloader.hpp" #include "FileDownloader.hpp"
DEFINE_ABSTRACT_OBJECT(FileDownloader)
// ============================================================================= // =============================================================================
static QString getDownloadFilePath(const QString &folder, const QUrl &url, const bool &overwrite) { static QString getDownloadFilePath(const QString &folder, const QUrl &url, const bool &overwrite) {
@ -63,7 +65,7 @@ static bool isHttpRedirect(QNetworkReply *reply) {
void FileDownloader::download() { void FileDownloader::download() {
if (mDownloading) { if (mDownloading) {
qWarning() << "Unable to download file. Already downloading!"; lWarning() << log().arg("Unable to download file. Already downloading!");
return; return;
} }
setDownloading(true); setDownloading(true);
@ -102,7 +104,8 @@ bool FileDownloader::remove() {
} }
void FileDownloader::emitOutputError() { void FileDownloader::emitOutputError() {
qWarning() << QStringLiteral("Could not write into `%1` (%2).") lWarning() << log()
.arg("Could not write into `%1` (%2).")
.arg(mDestinationFile.fileName()) .arg(mDestinationFile.fileName())
.arg(mDestinationFile.errorString()); .arg(mDestinationFile.errorString());
mNetworkReply->abort(); mNetworkReply->abort();
@ -123,18 +126,18 @@ void FileDownloader::handleDownloadFinished() {
if (mNetworkReply->error() != QNetworkReply::NoError) return; if (mNetworkReply->error() != QNetworkReply::NoError) return;
if (isHttpRedirect(mNetworkReply)) { if (isHttpRedirect(mNetworkReply)) {
qWarning() << QStringLiteral("Request was redirected."); lWarning() << log().arg("Request was redirected.");
mDestinationFile.remove(); mDestinationFile.remove();
cleanDownloadEnd(); cleanDownloadEnd();
emit downloadFailed(); emit downloadFailed();
} else { } else {
qInfo() << QStringLiteral("Download of %1 finished to %2").arg(mUrl.toString(), mDestinationFile.fileName()); lInfo() << log().arg("Download of %1 finished to %2").arg(mUrl.toString(), mDestinationFile.fileName());
mDestinationFile.close(); mDestinationFile.close();
cleanDownloadEnd(); cleanDownloadEnd();
QString fileChecksum = Utils::getFileChecksum(mDestinationFile.fileName()); QString fileChecksum = Utils::getFileChecksum(mDestinationFile.fileName());
if (mCheckSum.isEmpty() || fileChecksum == mCheckSum) emit downloadFinished(mDestinationFile.fileName()); if (mCheckSum.isEmpty() || fileChecksum == mCheckSum) emit downloadFinished(mDestinationFile.fileName());
else { else {
qCritical() << "File cannot be downloaded : Bad checksum " << fileChecksum; lCritical() << log().arg("File cannot be downloaded : Bad checksum ") << fileChecksum;
mDestinationFile.remove(); mDestinationFile.remove();
emit downloadFailed(); emit downloadFailed();
} }
@ -143,8 +146,7 @@ void FileDownloader::handleDownloadFinished() {
void FileDownloader::handleError(QNetworkReply::NetworkError code) { void FileDownloader::handleError(QNetworkReply::NetworkError code) {
if (code != QNetworkReply::OperationCanceledError) if (code != QNetworkReply::OperationCanceledError)
qWarning() lWarning() << log().arg("Download of %1 failed: %2").arg(mUrl.toString()).arg(mNetworkReply->errorString());
<< QStringLiteral("Download of %1 failed: %2").arg(mUrl.toString()).arg(mNetworkReply->errorString());
mDestinationFile.remove(); mDestinationFile.remove();
cleanDownloadEnd(); cleanDownloadEnd();
@ -155,7 +157,7 @@ void FileDownloader::handleError(QNetworkReply::NetworkError code) {
void FileDownloader::handleSslErrors(const QList<QSslError> &sslErrors) { void FileDownloader::handleSslErrors(const QList<QSslError> &sslErrors) {
#if QT_CONFIG(ssl) #if QT_CONFIG(ssl)
for (const QSslError &error : sslErrors) for (const QSslError &error : sslErrors)
qWarning() << QStringLiteral("SSL error: %1").arg(error.errorString()); lWarning() << log().arg("SSL error: %1").arg(error.errorString());
#else #else
Q_UNUSED(sslErrors); Q_UNUSED(sslErrors);
#endif #endif
@ -163,7 +165,7 @@ void FileDownloader::handleSslErrors(const QList<QSslError> &sslErrors) {
void FileDownloader::handleTimeout() { void FileDownloader::handleTimeout() {
if (mReadBytes == mTimeoutReadBytes) { if (mReadBytes == mTimeoutReadBytes) {
qWarning() << QStringLiteral("Download of %1 failed: timeout.").arg(mUrl.toString()); lWarning() << log().arg("Download of %1 failed: timeout.").arg(mUrl.toString());
mNetworkReply->abort(); mNetworkReply->abort();
} else mTimeoutReadBytes = mReadBytes; } else mTimeoutReadBytes = mReadBytes;
} }
@ -181,15 +183,16 @@ QUrl FileDownloader::getUrl() const {
void FileDownloader::setUrl(const QUrl &url) { void FileDownloader::setUrl(const QUrl &url) {
if (mDownloading) { if (mDownloading) {
qWarning() << QStringLiteral("Unable to set url, a file is downloading."); lWarning() << log().arg("Unable to set url, a file is downloading.");
return; return;
} }
if (mUrl != url) { if (mUrl != url) {
mUrl = url; mUrl = url;
if (!QSslSocket::supportsSsl() && mUrl.scheme() == "https") { if (!QSslSocket::supportsSsl() && mUrl.scheme() == "https") {
qWarning() << "Https has been requested but SSL is not supported. Fallback to http. Install manually " lWarning() << log().arg(
"OpenSSL libraries in your PATH."; "Https has been requested but SSL is not supported. Fallback to http. Install manually "
"OpenSSL libraries in your PATH.");
mUrl.setScheme("http"); mUrl.setScheme("http");
} }
emit urlChanged(mUrl); emit urlChanged(mUrl);
@ -202,7 +205,7 @@ QString FileDownloader::getDownloadFolder() const {
void FileDownloader::setDownloadFolder(const QString &downloadFolder) { void FileDownloader::setDownloadFolder(const QString &downloadFolder) {
if (mDownloading) { if (mDownloading) {
qWarning() << QStringLiteral("Unable to set download folder, a file is downloading."); lWarning() << log().arg("Unable to set download folder, a file is downloading.");
return; return;
} }
@ -224,7 +227,7 @@ QString
FileDownloader::synchronousDownload(const QUrl &url, const QString &destinationFolder, const bool &overwriteFile) { FileDownloader::synchronousDownload(const QUrl &url, const QString &destinationFolder, const bool &overwriteFile) {
QString filePath; QString filePath;
FileDownloader downloader; FileDownloader downloader;
if (url.isRelative()) qWarning() << "FileDownloader: The specified URL is not valid"; if (url.isRelative()) lWarning() << QStringLiteral("FileDownloader: The specified URL is not valid");
else { else {
bool isOver = false; bool isOver = false;
bool *pIsOver = &isOver; bool *pIsOver = &isOver;
@ -238,7 +241,7 @@ FileDownloader::synchronousDownload(const QUrl &url, const QString &destinationF
filePath = downloader.getDestinationFileName(); filePath = downloader.getDestinationFileName();
if (!QFile::exists(filePath)) { if (!QFile::exists(filePath)) {
filePath = ""; filePath = "";
qWarning() << "FileDownloader: Cannot download the specified file"; lWarning() << QStringLiteral("FileDownloader: Cannot download the specified file");
} }
} }
} }

View file

@ -21,6 +21,8 @@
#ifndef FILE_DOWNLOADER_H_ #ifndef FILE_DOWNLOADER_H_
#define FILE_DOWNLOADER_H_ #define FILE_DOWNLOADER_H_
#include "tool/AbstractObject.hpp"
#include <QObject> #include <QObject>
#include <QThread> #include <QThread>
#include <QtNetwork> #include <QtNetwork>
@ -29,7 +31,7 @@
class QSslError; class QSslError;
class FileDownloader : public QObject { class FileDownloader : public QObject, public AbstractObject {
Q_OBJECT; Q_OBJECT;
// TODO: Add an error property to use in UI. // TODO: Add an error property to use in UI.
@ -121,6 +123,8 @@ private:
QTimer mTimeout; QTimer mTimeout;
static constexpr int DefaultTimeout = 5000; static constexpr int DefaultTimeout = 5000;
DECLARE_ABSTRACT_OBJECT
}; };
#endif // FILE_DOWNLOADER_H_ #endif // FILE_DOWNLOADER_H_

View file

@ -29,6 +29,8 @@
#include "tool/Constants.hpp" #include "tool/Constants.hpp"
#include "tool/Utils.hpp" #include "tool/Utils.hpp"
DEFINE_ABSTRACT_OBJECT(FileExtractor)
// ============================================================================= // =============================================================================
using namespace std; using namespace std;
@ -41,7 +43,7 @@ FileExtractor::~FileExtractor() {
void FileExtractor::extract() { void FileExtractor::extract() {
if (mExtracting) { if (mExtracting) {
qWarning() << "Unable to extract file. Already extracting!"; lWarning() << log().arg("Unable to extract file. Already extracting!");
return; return;
} }
setExtracting(true); setExtracting(true);
@ -117,7 +119,7 @@ QString FileExtractor::getFile() const {
void FileExtractor::setFile(const QString &file) { void FileExtractor::setFile(const QString &file) {
if (mExtracting) { if (mExtracting) {
qWarning() << QStringLiteral("Unable to set file, a file is extracting."); lWarning() << log().arg("Unable to set file, a file is extracting.");
return; return;
} }
if (mFile != file) { if (mFile != file) {
@ -132,7 +134,7 @@ QString FileExtractor::getExtractFolder() const {
void FileExtractor::setExtractFolder(const QString &extractFolder) { void FileExtractor::setExtractFolder(const QString &extractFolder) {
if (mExtracting) { if (mExtracting) {
qWarning() << QStringLiteral("Unable to set extract folder, a file is extracting."); lWarning() << log().arg("Unable to set extract folder, a file is extracting.");
return; return;
} }
if (mExtractFolder != extractFolder) { if (mExtractFolder != extractFolder) {

View file

@ -21,6 +21,8 @@
#ifndef FILE_EXTRACTOR_H_ #ifndef FILE_EXTRACTOR_H_
#define FILE_EXTRACTOR_H_ #define FILE_EXTRACTOR_H_
#include "tool/AbstractObject.hpp"
#include <QFile> #include <QFile>
// ============================================================================= // =============================================================================
@ -28,7 +30,7 @@
class QTimer; class QTimer;
// Supports only bzip file. // Supports only bzip file.
class FileExtractor : public QObject { class FileExtractor : public QObject, public AbstractObject {
Q_OBJECT; Q_OBJECT;
@ -99,6 +101,8 @@ private:
qint64 mTotalBytes = 0; qint64 mTotalBytes = 0;
QTimer *mTimer = nullptr; QTimer *mTimer = nullptr;
DECLARE_ABSTRACT_OBJECT
}; };
#endif // FILE_EXTRACTOR_H_ #endif // FILE_EXTRACTOR_H_

View file

@ -56,7 +56,7 @@ Control.Button {
property var checkedImageColor: style?.image?.checked || Qt.darker(contentImageColor, 1.1) property var checkedImageColor: style?.image?.checked || Qt.darker(contentImageColor, 1.1)
property var pressedImageColor: style?.image?.pressed || Qt.darker(contentImageColor, 1.1) property var pressedImageColor: style?.image?.pressed || Qt.darker(contentImageColor, 1.1)
icon.source: style?.iconSource || "" icon.source: style?.iconSource || ""
property color colorizationColor: mainItem.checkable && mainItem.checked ? mainItem.checkedImageColor || mainItem.checkedColor || mainItem.pressedColor : mainItem.pressed ? mainItem.pressedImageColor : mainItem.hovered ? mainItem.hoveredImageColor : mainItem.contentImageColor property color colorizationColor: mainItem.checkable && mainItem.checked ? mainItem.checkedImageColor : mainItem.pressed ? mainItem.pressedImageColor : mainItem.hovered ? mainItem.hoveredImageColor : mainItem.contentImageColor
// Size properties // Size properties
spacing: Utils.getSizeWithScreenRatio(5) spacing: Utils.getSizeWithScreenRatio(5)
property real radius: Math.ceil(height / 2) property real radius: Math.ceil(height / 2)

View file

@ -104,11 +104,6 @@ ColumnLayout {
} }
} }
} }
RowLayout {
Layout.alignment: Qt.AlignHCenter
spacing: Math.round(72 * DefaultStyle.dp)
Layout.fillWidth: true
Layout.preferredHeight: childrenRect.height
MediumButton { MediumButton {
visible: mainItem.isConference && !SettingsCpp.disableMeetingsFeature visible: mainItem.isConference && !SettingsCpp.disableMeetingsFeature
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
@ -123,8 +118,13 @@ ColumnLayout {
} }
} }
} }
LabelButton { RowLayout {
Layout.alignment: Qt.AlignHCenter
spacing: Math.round(72 * DefaultStyle.dp)
Layout.fillWidth: true
Layout.preferredHeight: childrenRect.height
visible: !mainItem.isConference visible: !mainItem.isConference
LabelButton {
width: Math.round(56 * DefaultStyle.dp) width: Math.round(56 * DefaultStyle.dp)
height: Math.round(56 * DefaultStyle.dp) height: Math.round(56 * DefaultStyle.dp)
button.icon.width: Math.round(24 * DefaultStyle.dp) button.icon.width: Math.round(24 * DefaultStyle.dp)
@ -138,7 +138,7 @@ ColumnLayout {
} }
} }
LabelButton { LabelButton {
visible: !mainItem.isConference && !SettingsCpp.disableChatFeature visible: !SettingsCpp.disableChatFeature
width: Math.round(56 * DefaultStyle.dp) width: Math.round(56 * DefaultStyle.dp)
height: Math.round(56 * DefaultStyle.dp) height: Math.round(56 * DefaultStyle.dp)
button.icon.width: Math.round(24 * DefaultStyle.dp) button.icon.width: Math.round(24 * DefaultStyle.dp)
@ -158,7 +158,7 @@ ColumnLayout {
} }
} }
LabelButton { LabelButton {
visible: !mainItem.isConference && SettingsCpp.videoEnabled visible: SettingsCpp.videoEnabled
width: Math.round(56 * DefaultStyle.dp) width: Math.round(56 * DefaultStyle.dp)
height: Math.round(56 * DefaultStyle.dp) height: Math.round(56 * DefaultStyle.dp)
button.icon.width: Math.round(24 * DefaultStyle.dp) button.icon.width: Math.round(24 * DefaultStyle.dp)

View file

@ -4,6 +4,7 @@ import QtQuick.Effects
import Linphone import Linphone
import QtQml import QtQml
import SettingsCpp
import UtilsCpp 1.0 import UtilsCpp 1.0
import 'qrc:/qt/qml/Linphone/view/Style/buttonStyle.js' as ButtonStyle import 'qrc:/qt/qml/Linphone/view/Style/buttonStyle.js' as ButtonStyle
@ -29,7 +30,11 @@ ListView {
width: mainItem.width width: mainItem.width
height: Math.round(45 * DefaultStyle.dp) height: Math.round(45 * DefaultStyle.dp)
property var remoteNameObj: UtilsCpp.getDisplayName(modelData.core.remoteAddress) property var remoteNameObj: UtilsCpp.getDisplayName(modelData.core.remoteAddress)
property var callName : modelData.core.isConference ? modelData.core.conference.core.subject : remoteNameObj ? remoteNameObj.value : "" property var callName : (modelData && !SettingsCpp.disableMeetingsFeature && modelData.core.isConference)
? modelData.core.conference.core.subject
: remoteNameObj
? remoteNameObj.value
: ""
Avatar { Avatar {
id: delegateAvatar id: delegateAvatar
Layout.preferredWidth: Math.round(45 * DefaultStyle.dp) Layout.preferredWidth: Math.round(45 * DefaultStyle.dp)
@ -43,7 +48,6 @@ ListView {
spacing: 0 spacing: 0
Text { Text {
id: delegateName id: delegateName
property var remoteNameObj: UtilsCpp.getDisplayName(modelData.core.remoteAddress)
text: callInformationItem.callName text: callInformationItem.callName
font.pixelSize: Math.round(14 * DefaultStyle.dp) font.pixelSize: Math.round(14 * DefaultStyle.dp)
Layout.fillWidth: true Layout.fillWidth: true

View file

@ -27,9 +27,9 @@ Control.Control {
property var msgState: chatMessage ? chatMessage.core.messageState : LinphoneEnums.ChatMessageState.StateIdle property var msgState: chatMessage ? chatMessage.core.messageState : LinphoneEnums.ChatMessageState.StateIdle
hoverEnabled: true hoverEnabled: true
property bool linkHovered: false property bool linkHovered: false
property real maxWidth: parent?.width || Math.round(300 * DefaultStyle.dp) property real maxWidth: parent?.width || Utils.getSizeWithScreenRatio(300)
leftPadding: isRemoteMessage ? Math.round(5 * DefaultStyle.dp) : 0 leftPadding: isRemoteMessage ? Utils.getSizeWithScreenRatio(5) : 0
signal messageDeletionRequested() signal messageDeletionRequested()
signal isFileHoveringChanged(bool isFileHovering) signal isFileHoveringChanged(bool isFileHovering)
@ -63,11 +63,11 @@ Control.Control {
} }
contentItem: ColumnLayout { contentItem: ColumnLayout {
spacing: Math.round(5 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(5)
Text { Text {
id: fromNameText id: fromNameText
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
Layout.leftMargin: mainItem.isFromChatGroup ? Math.round(9 * DefaultStyle.dp) + avatar.width : 0 Layout.leftMargin: mainItem.isFromChatGroup ? Utils.getSizeWithScreenRatio(9) + avatar.width : 0
visible: mainItem.isFromChatGroup && mainItem.isRemoteMessage && mainItem.isFirstMessage && !replyLayout.visible visible: mainItem.isFromChatGroup && mainItem.isRemoteMessage && mainItem.isFirstMessage && !replyLayout.visible
maximumLineCount: 1 maximumLineCount: 1
width: implicitWidth width: implicitWidth
@ -81,15 +81,15 @@ Control.Control {
} }
RowLayout { RowLayout {
id: forwardLayout id: forwardLayout
spacing: Math.round(8 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(8)
visible: mainItem.isForward visible: mainItem.isForward
Layout.leftMargin: mainItem.isFromChatGroup ? Math.round(9 * DefaultStyle.dp) + avatar.width : 0 Layout.leftMargin: mainItem.isFromChatGroup ? Utils.getSizeWithScreenRatio(9) + avatar.width : 0
Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft: Qt.AlignRight Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft: Qt.AlignRight
EffectImage { EffectImage {
imageSource: AppIcons.forward imageSource: AppIcons.forward
colorizationColor: DefaultStyle.main2_500_main colorizationColor: DefaultStyle.main2_500_main
Layout.preferredWidth: Math.round(12 * DefaultStyle.dp) Layout.preferredWidth: Utils.getSizeWithScreenRatio(12)
Layout.preferredHeight: Math.round(12 * DefaultStyle.dp) Layout.preferredHeight: Utils.getSizeWithScreenRatio(12)
} }
Text { Text {
//: Forwarded //: Forwarded
@ -104,20 +104,20 @@ Control.Control {
RowLayout { RowLayout {
id: replyLayout id: replyLayout
visible: mainItem.isReply visible: mainItem.isReply
Layout.leftMargin: mainItem.isFromChatGroup ? Math.round(9 * DefaultStyle.dp) + avatar.width : 0 Layout.leftMargin: mainItem.isFromChatGroup ? Utils.getSizeWithScreenRatio(9) + avatar.width : 0
layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft
ColumnLayout { ColumnLayout {
spacing: Math.round(5 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(5)
RowLayout { RowLayout {
id: replyLabel id: replyLabel
spacing: Math.round(8 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(8)
Layout.fillWidth: false Layout.fillWidth: false
Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft : Qt.AlignRight Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft : Qt.AlignRight
EffectImage { EffectImage {
imageSource: AppIcons.reply imageSource: AppIcons.reply
colorizationColor: DefaultStyle.main2_500_main colorizationColor: DefaultStyle.main2_500_main
Layout.preferredWidth: Math.round(12 * DefaultStyle.dp) Layout.preferredWidth: Utils.getSizeWithScreenRatio(12)
Layout.preferredHeight: Math.round(12 * DefaultStyle.dp) Layout.preferredHeight: Utils.getSizeWithScreenRatio(12)
} }
Text { Text {
Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft: Qt.AlignRight Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft: Qt.AlignRight
@ -143,16 +143,16 @@ Control.Control {
id: replyMessage id: replyMessage
visible: mainItem.replyText !== "" visible: mainItem.replyText !== ""
Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft : Qt.AlignRight Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft : Qt.AlignRight
spacing: Math.round(5 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(5)
topPadding: Math.round(12 * DefaultStyle.dp) topPadding: Utils.getSizeWithScreenRatio(12)
bottomPadding: Math.round(19 * DefaultStyle.dp) bottomPadding: Utils.getSizeWithScreenRatio(19)
leftPadding: Math.round(18 * DefaultStyle.dp) leftPadding: Utils.getSizeWithScreenRatio(18)
rightPadding: Math.round(18 * DefaultStyle.dp) rightPadding: Utils.getSizeWithScreenRatio(18)
Layout.preferredWidth: Math.min(implicitWidth, mainItem.maxWidth - avatar.implicitWidth) Layout.preferredWidth: Math.min(implicitWidth, mainItem.maxWidth - avatar.implicitWidth)
background: Rectangle { background: Rectangle {
anchors.fill: parent anchors.fill: parent
color: DefaultStyle.grey_200 color: DefaultStyle.grey_200
radius: Math.round(16 * DefaultStyle.dp) radius: Utils.getSizeWithScreenRatio(16)
} }
contentItem: Text { contentItem: Text {
Layout.fillWidth: true Layout.fillWidth: true
@ -172,30 +172,30 @@ Control.Control {
z: replyLayout.z + 1 z: replyLayout.z + 1
spacing: 0 spacing: 0
layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft
Layout.topMargin: replyMessage.visible ? Math.round(-20 * DefaultStyle.dp) : 0 Layout.topMargin: replyMessage.visible ? Utils.getSizeWithScreenRatio(-20) : 0
Avatar { Avatar {
id: avatar id: avatar
visible: mainItem.isFromChatGroup && mainItem.isRemoteMessage visible: mainItem.isFromChatGroup && mainItem.isRemoteMessage
Layout.preferredWidth: mainItem.isRemoteMessage ? 26 * DefaultStyle.dp : 0 Layout.preferredWidth: mainItem.isRemoteMessage ? 26 : 0
Layout.preferredHeight: 26 * DefaultStyle.dp Layout.preferredHeight: 26
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
_address: chatMessage ? chatMessage.core.fromAddress : "" _address: chatMessage ? chatMessage.core.fromAddress : ""
} }
Item { Item {
id: bubbleContainer id: bubbleContainer
// Layout.topMargin: isFirstMessage ? 16 * DefaultStyle.dp : 0 // Layout.topMargin: isFirstMessage ? 16 : 0
Layout.leftMargin: mainItem.isFromChatGroup ? Math.round(9 * DefaultStyle.dp) : 0 Layout.leftMargin: mainItem.isFromChatGroup ? Utils.getSizeWithScreenRatio(9) : 0
Layout.preferredHeight: childrenRect.height Layout.preferredHeight: childrenRect.height
Layout.preferredWidth: childrenRect.width Layout.preferredWidth: childrenRect.width
Control.Control { Control.Control {
id: chatBubble id: chatBubble
spacing: Math.round(2 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(2)
topPadding: Math.round(12 * DefaultStyle.dp) topPadding: Utils.getSizeWithScreenRatio(12)
bottomPadding: Math.round(6 * DefaultStyle.dp) bottomPadding: Utils.getSizeWithScreenRatio(6)
leftPadding: Math.round(18 * DefaultStyle.dp) leftPadding: Utils.getSizeWithScreenRatio(18)
rightPadding: Math.round(18 * DefaultStyle.dp) rightPadding: Utils.getSizeWithScreenRatio(18)
width: Math.min(implicitWidth, mainItem.maxWidth - avatar.implicitWidth) width: Math.min(implicitWidth, mainItem.maxWidth - avatar.implicitWidth)
MouseArea { // Default mouse area. Each sub bubble can control the mouse and pass on to the main mouse handler. Child bubble mouse area must cover the entire bubble. MouseArea { // Default mouse area. Each sub bubble can control the mouse and pass on to the main mouse handler. Child bubble mouse area must cover the entire bubble.
@ -211,31 +211,31 @@ Control.Control {
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
color: mainItem.backgroundColor color: mainItem.backgroundColor
radius: Math.round(16 * DefaultStyle.dp) radius: Utils.getSizeWithScreenRatio(16)
} }
Rectangle { Rectangle {
visible: mainItem.isFirstMessage && mainItem.isRemoteMessage visible: mainItem.isFirstMessage && mainItem.isRemoteMessage
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
width: Math.round(parent.width / 4) width: Utils.getSizeWithScreenRatio(parent.width / 4)
height: Math.round(parent.height / 4) height: Utils.getSizeWithScreenRatio(parent.height / 4)
color: mainItem.backgroundColor color: mainItem.backgroundColor
} }
Rectangle { Rectangle {
visible: mainItem.isFirstMessage && !mainItem.isRemoteMessage visible: mainItem.isFirstMessage && !mainItem.isRemoteMessage
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
width: Math.round(parent.width / 4) width: Utils.getSizeWithScreenRatio(parent.width / 4)
height: Math.round(parent.height / 4) height: Utils.getSizeWithScreenRatio(parent.height / 4)
color: mainItem.backgroundColor color: mainItem.backgroundColor
} }
Rectangle { Rectangle {
id: highlightRectangle id: highlightRectangle
anchors.fill: parent anchors.fill: parent
radius: Math.round(16 * DefaultStyle.dp) radius: Utils.getSizeWithScreenRatio(16)
color: Qt.lighter(mainItem.backgroundColor, 2) color: Qt.lighter(mainItem.backgroundColor, 2)
border.color: mainItem.backgroundColor border.color: mainItem.backgroundColor
border.width: Math.round(2 * DefaultStyle.dp) border.width: Utils.getSizeWithScreenRatio(2)
opacity: 0 opacity: 0
Behavior on opacity { Behavior on opacity {
NumberAnimation { NumberAnimation {
@ -246,7 +246,7 @@ Control.Control {
} }
} }
contentItem: ColumnLayout { contentItem: ColumnLayout {
spacing: Math.round(5 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(5)
ChatMessageContent { ChatMessageContent {
id: chatBubbleContent id: chatBubbleContent
Layout.fillWidth: true Layout.fillWidth: true
@ -263,9 +263,9 @@ Control.Control {
Layout.preferredHeight: childrenRect.height Layout.preferredHeight: childrenRect.height
Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft : Qt.AlignRight Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft : Qt.AlignRight
layoutDirection: mainItem.isRemoteMessage ? Qt.RightToLeft : Qt.LeftToRight layoutDirection: mainItem.isRemoteMessage ? Qt.RightToLeft : Qt.LeftToRight
spacing: Math.round(7 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(7)
RowLayout { RowLayout {
spacing: Math.round(3 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(3)
Layout.preferredHeight: childrenRect.height Layout.preferredHeight: childrenRect.height
Text { Text {
id: ephemeralTime id: ephemeralTime
@ -281,12 +281,12 @@ Control.Control {
visible: mainItem.chatMessage.core.isEphemeral visible: mainItem.chatMessage.core.isEphemeral
imageSource: AppIcons.clockCountDown imageSource: AppIcons.clockCountDown
colorizationColor: DefaultStyle.main2_500_main colorizationColor: DefaultStyle.main2_500_main
Layout.preferredWidth: visible ? 14 * DefaultStyle.dp : 0 Layout.preferredWidth: visible ? 14 : 0
Layout.preferredHeight: visible ? 14 * DefaultStyle.dp : 0 Layout.preferredHeight: visible ? 14 : 0
} }
} }
RowLayout { RowLayout {
spacing: mainItem.isRemoteMessage ? 0 : Math.round(5 * DefaultStyle.dp) spacing: mainItem.isRemoteMessage ? 0 : Utils.getSizeWithScreenRatio(5)
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
Layout.preferredHeight: childrenRect.height Layout.preferredHeight: childrenRect.height
Text { Text {
@ -301,8 +301,8 @@ Control.Control {
EffectImage { EffectImage {
// Imdn status icon // Imdn status icon
visible: !mainItem.isRemoteMessage visible: !mainItem.isRemoteMessage
Layout.preferredWidth: visible ? 14 * DefaultStyle.dp : 0 Layout.preferredWidth: visible ? 14 : 0
Layout.preferredHeight: visible ? 14 * DefaultStyle.dp : 0 Layout.preferredHeight: visible ? 14 : 0
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
colorizationColor: DefaultStyle.main1_500_main colorizationColor: DefaultStyle.main1_500_main
imageSource: mainItem.msgState === LinphoneEnums.ChatMessageState.StateDelivered imageSource: mainItem.msgState === LinphoneEnums.ChatMessageState.StateDelivered
@ -318,8 +318,8 @@ Control.Control {
: "" : ""
BusyIndicator { BusyIndicator {
anchors.fill: parent anchors.fill: parent
Layout.preferredWidth: visible ? 14 * DefaultStyle.dp : 0 Layout.preferredWidth: visible ? 14 : 0
Layout.preferredHeight: visible ? 14 * DefaultStyle.dp : 0 Layout.preferredHeight: visible ? 14 : 0
visible: mainItem.msgState === LinphoneEnums.ChatMessageState.StateIdle visible: mainItem.msgState === LinphoneEnums.ChatMessageState.StateIdle
|| mainItem.msgState === LinphoneEnums.ChatMessageState.StateInProgress || mainItem.msgState === LinphoneEnums.ChatMessageState.StateInProgress
|| mainItem.msgState === LinphoneEnums.ChatMessageState.StateFileTransferInProgress || mainItem.msgState === LinphoneEnums.ChatMessageState.StateFileTransferInProgress
@ -346,30 +346,30 @@ Control.Control {
value: chatBubble.right value: chatBubble.right
} }
onClicked: mainItem.showReactionsForMessageRequested() onClicked: mainItem.showReactionsForMessageRequested()
anchors.topMargin: Math.round(-6 * DefaultStyle.dp) anchors.topMargin: Utils.getSizeWithScreenRatio(-6)
topPadding: Math.round(8 * DefaultStyle.dp) topPadding: Utils.getSizeWithScreenRatio(8)
bottomPadding: Math.round(8 * DefaultStyle.dp) bottomPadding: Utils.getSizeWithScreenRatio(8)
leftPadding: Math.round(8 * DefaultStyle.dp) leftPadding: Utils.getSizeWithScreenRatio(8)
rightPadding: Math.round(8 * DefaultStyle.dp) rightPadding: Utils.getSizeWithScreenRatio(8)
background: Rectangle { background: Rectangle {
color: DefaultStyle.grey_100 color: DefaultStyle.grey_100
border.color: DefaultStyle.grey_0 border.color: DefaultStyle.grey_0
border.width: Math.round(2 * DefaultStyle.dp) border.width: Utils.getSizeWithScreenRatio(2)
radius: Math.round(20 * DefaultStyle.dp) radius: Utils.getSizeWithScreenRatio(20)
} }
contentItem: RowLayout { contentItem: RowLayout {
spacing: Math.round(6 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(6)
Repeater { Repeater {
id: reactionList id: reactionList
model: mainItem.chatMessage ? mainItem.chatMessage.core.reactionsSingleton : [] model: mainItem.chatMessage ? mainItem.chatMessage.core.reactionsSingleton : []
delegate: RowLayout { delegate: RowLayout {
spacing: Math.round(3 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(3)
Text { Text {
text: UtilsCpp.encodeEmojiToQmlRichFormat(modelData.body) text: UtilsCpp.encodeEmojiToQmlRichFormat(modelData.body)
textFormat: Text.RichText textFormat: Text.RichText
font { font {
pixelSize: Math.round(15 * DefaultStyle.dp) pixelSize: Utils.getSizeWithScreenRatio(15)
weight: Math.round(400 * DefaultStyle.dp) weight: Utils.getSizeWithScreenRatio(400)
} }
} }
Text { Text {
@ -389,11 +389,11 @@ Control.Control {
RowLayout { RowLayout {
id: actionsLayout id: actionsLayout
visible: mainItem.hovered || optionsMenu.hovered || optionsMenu.popup.opened || emojiButton.hovered || emojiButton.popup.opened visible: mainItem.hovered || optionsMenu.hovered || optionsMenu.popup.opened || emojiButton.hovered || emojiButton.popup.opened
Layout.leftMargin: Math.round(8 * DefaultStyle.dp) Layout.leftMargin: Utils.getSizeWithScreenRatio(8)
Layout.rightMargin: Math.round(8 * DefaultStyle.dp) Layout.rightMargin: Utils.getSizeWithScreenRatio(8)
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
// Layout.fillWidth: true // Layout.fillWidth: true
spacing: Math.round(7 * DefaultStyle.dp) spacing: Utils.getSizeWithScreenRatio(7)
layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft
PopupButton { PopupButton {
id: optionsMenu id: optionsMenu
@ -406,7 +406,7 @@ Control.Control {
text: qsTr("chat_message_reception_info") text: qsTr("chat_message_reception_info")
icon.source: AppIcons.chatTeardropText icon.source: AppIcons.chatTeardropText
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) Layout.preferredHeight: Utils.getSizeWithScreenRatio(45)
onClicked: { onClicked: {
mainItem.showImdnStatusForMessageRequested() mainItem.showImdnStatusForMessageRequested()
optionsMenu.close() optionsMenu.close()
@ -418,7 +418,7 @@ Control.Control {
text: qsTr("chat_message_reply") text: qsTr("chat_message_reply")
icon.source: AppIcons.reply icon.source: AppIcons.reply
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) Layout.preferredHeight: Utils.getSizeWithScreenRatio(45)
onClicked: { onClicked: {
mainItem.replyToMessageRequested() mainItem.replyToMessageRequested()
optionsMenu.close() optionsMenu.close()
@ -432,9 +432,9 @@ Control.Control {
//: "Copy" //: "Copy"
: qsTr("chat_message_copy") : qsTr("chat_message_copy")
icon.source: AppIcons.copy icon.source: AppIcons.copy
// spacing: Math.round(10 * DefaultStyle.dp) // spacing: Utils.getSizeWithScreenRatio(10)
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) Layout.preferredHeight: Utils.getSizeWithScreenRatio(45)
onClicked: { onClicked: {
var success = UtilsCpp.copyToClipboard(chatBubbleContent.selectedText != "" ? chatBubbleContent.selectedText : mainItem.chatMessage.core.text) var success = UtilsCpp.copyToClipboard(chatBubbleContent.selectedText != "" ? chatBubbleContent.selectedText : mainItem.chatMessage.core.text)
//: Copied //: Copied
@ -450,7 +450,7 @@ Control.Control {
text: qsTr("chat_message_forward") text: qsTr("chat_message_forward")
icon.source: AppIcons.forward icon.source: AppIcons.forward
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) Layout.preferredHeight: Utils.getSizeWithScreenRatio(45)
onClicked: { onClicked: {
mainItem.forwardMessageRequested() mainItem.forwardMessageRequested()
optionsMenu.close() optionsMenu.close()
@ -458,7 +458,7 @@ Control.Control {
} }
Rectangle { Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: Math.min(1, Math.round(1 * DefaultStyle.dp)) Layout.preferredHeight: Math.min(1, Utils.getSizeWithScreenRatio(1))
color: DefaultStyle.main2_400 color: DefaultStyle.main2_400
} }
IconLabelButton { IconLabelButton {
@ -466,9 +466,9 @@ Control.Control {
//: "Delete" //: "Delete"
text: qsTr("chat_message_delete") text: qsTr("chat_message_delete")
icon.source: AppIcons.trashCan icon.source: AppIcons.trashCan
// spacing: Math.round(10 * DefaultStyle.dp) // spacing: Utils.getSizeWithScreenRatio(10)
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) Layout.preferredHeight: Utils.getSizeWithScreenRatio(45)
onClicked: { onClicked: {
mainItem.messageDeletionRequested() mainItem.messageDeletionRequested()
optionsMenu.close() optionsMenu.close()
@ -504,8 +504,8 @@ Control.Control {
PopupButton { PopupButton {
id: emojiPickerButton id: emojiPickerButton
icon.source: AppIcons.plusCircle icon.source: AppIcons.plusCircle
popup.width: Math.round(393 * DefaultStyle.dp) popup.width: Utils.getSizeWithScreenRatio(393)
popup.height: Math.round(291 * DefaultStyle.dp) popup.height: Utils.getSizeWithScreenRatio(291)
popup.contentItem: EmojiPicker { popup.contentItem: EmojiPicker {
id: emojiPicker id: emojiPicker
onEmojiClicked: (emoji) => { onEmojiClicked: (emoji) => {

View file

@ -157,6 +157,7 @@ ColumnLayout {
id: list id: list
width: mainItem.width width: mainItem.width
height: Math.round(250 * DefaultStyle.dp) height: Math.round(250 * DefaultStyle.dp)
Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
model: mainItem.categories model: mainItem.categories
spacing: Math.round(30 * DefaultStyle.dp) spacing: Math.round(30 * DefaultStyle.dp)

View file

@ -16,7 +16,6 @@ Control.Control {
property var textArea property var textArea
property int selectedFilesCount: 0 property int selectedFilesCount: 0
// property alias cursorPosition: sendingTextArea.cursorPosition // property alias cursorPosition: sendingTextArea.cursorPosition
property Popup emojiPicker
property bool dropEnabled: true property bool dropEnabled: true
property bool isEphemeral : false property bool isEphemeral : false
@ -77,14 +76,14 @@ Control.Control {
id: textAreaComp id: textAreaComp
RowLayout { RowLayout {
spacing: Math.round(16 * DefaultStyle.dp) spacing: Math.round(16 * DefaultStyle.dp)
BigButton { PopupButton {
id: emojiPickerButton id: emojiPickerButton
style: ButtonStyle.noBackground style: ButtonStyle.noBackground
checked: mainItem.emojiPicker?.visible || false
icon.source: checked ? AppIcons.closeX : AppIcons.smiley icon.source: checked ? AppIcons.closeX : AppIcons.smiley
onPressed: { popup.width: Math.round(393 * DefaultStyle.dp)
if (!checked) mainItem.emojiPicker.open() popup.height: Math.round(291 * DefaultStyle.dp)
else mainItem.emojiPicker.close() popup.contentItem: EmojiPicker {
editor: sendingTextArea
} }
} }
BigButton { BigButton {
@ -121,7 +120,9 @@ Control.Control {
id: sendingAreaFlickable id: sendingAreaFlickable
Layout.preferredHeight: Math.min(Math.round(100 * DefaultStyle.dp), contentHeight) Layout.preferredHeight: Math.min(Math.round(100 * DefaultStyle.dp), contentHeight)
Layout.fillHeight: true Layout.fillHeight: true
width: sendingControl.width - sendingControl.leftPadding - sendingControl.rightPadding
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignCenter
contentHeight: sendingTextArea.contentHeight contentHeight: sendingTextArea.contentHeight
contentWidth: width contentWidth: width
@ -138,8 +139,9 @@ Control.Control {
TextArea { TextArea {
id: sendingTextArea id: sendingTextArea
// RectangleTest{anchors.fill: parent}
width: sendingAreaFlickable.width width: sendingAreaFlickable.width
height: sendingAreaFlickable.height height: implicitHeight// sendingAreaFlickable.height
textFormat: TextEdit.AutoText textFormat: TextEdit.AutoText
onTextChanged: { onTextChanged: {
mainItem.text = text mainItem.text = text
@ -180,6 +182,7 @@ Control.Control {
RowLayout { RowLayout {
id: stackButton id: stackButton
spacing: 0 spacing: 0
Layout.preferredHeight: Math.max(recordButton.height, sendMessageButton.height)
BigButton { BigButton {
id: recordButton id: recordButton
ToolTip.visible: !enabled && hovered ToolTip.visible: !enabled && hovered
@ -196,6 +199,7 @@ Control.Control {
} }
BigButton { BigButton {
id: sendMessageButton id: sendMessageButton
Layout.preferredHeight: height
visible: sendingTextArea.text.length !== 0 || mainItem.selectedFilesCount > 0 visible: sendingTextArea.text.length !== 0 || mainItem.selectedFilesCount > 0
style: ButtonStyle.noBackgroundOrange style: ButtonStyle.noBackgroundOrange
icon.source: AppIcons.paperPlaneRight icon.source: AppIcons.paperPlaneRight

View file

@ -874,5 +874,7 @@ function getSizeWithScreenRatio(size){
if (size == 0) { if (size == 0) {
return size; return size;
} }
return Math.max(Math.round(size * Linphone.DefaultStyle.dp), 1); return size > 0
? Math.max(Math.round(size * Linphone.DefaultStyle.dp), 1)
: Math.min(Math.round(size * Linphone.DefaultStyle.dp), -1);
} }

View file

@ -295,40 +295,6 @@ FocusScope {
contentLoader.panelType = SelectedChatView.PanelType.ForwardToList contentLoader.panelType = SelectedChatView.PanelType.ForwardToList
detailsPanel.visible = true detailsPanel.visible = true
} }
Popup {
id: emojiPickerPopup
y: Math.round(chatMessagesListView.y + chatMessagesListView.height - height - 8*DefaultStyle.dp)
x: Math.round(chatMessagesListView.x + 8*DefaultStyle.dp)
width: Math.round(393 * DefaultStyle.dp)
height: Math.round(291 * DefaultStyle.dp)
visible: false
modal: true
dim: false
closePolicy: Popup.CloseOnReleaseOutside
padding: 10 * DefaultStyle.dp
background: Item {
anchors.fill: parent
Rectangle {
id: buttonBackground
anchors.fill: parent
color: DefaultStyle.grey_0
radius: Math.round(20 * DefaultStyle.dp)
}
MultiEffect {
anchors.fill: buttonBackground
source: buttonBackground
shadowEnabled: true
shadowColor: DefaultStyle.grey_1000
shadowBlur: 0.1
shadowOpacity: 0.5
}
}
contentItem: EmojiPicker {
id: emojiPicker
editor: messageSender.textArea
}
}
} }
ScrollBar { ScrollBar {
id: scrollbar id: scrollbar
@ -512,7 +478,6 @@ FocusScope {
Control.SplitView.minimumHeight: mainItem.chat?.core.isReadOnly ? 0 : Math.round(79 * DefaultStyle.dp) Control.SplitView.minimumHeight: mainItem.chat?.core.isReadOnly ? 0 : Math.round(79 * DefaultStyle.dp)
chat: mainItem.chat chat: mainItem.chat
selectedFilesCount: contents.count selectedFilesCount: contents.count
emojiPicker: emojiPickerPopup
callOngoing: mainItem.call != null callOngoing: mainItem.call != null
onChatChanged: { onChatChanged: {
if (chat) messageSender.text = mainItem.chat.core.sendingText if (chat) messageSender.text = mainItem.chat.core.sendingText