From 21ee3a541403b717593b871a89925eed4364441f Mon Sep 17 00:00:00 2001 From: Gaelle Braud Date: Tue, 1 Apr 2025 15:34:22 +0200 Subject: [PATCH] add setting : create end to end meetings and group calls --- Linphone/core/setting/SettingsCore.cpp | 44 ++++++++++++++----- Linphone/core/setting/SettingsCore.hpp | 13 +++++- Linphone/model/setting/SettingsModel.cpp | 25 ++++++++--- Linphone/model/setting/SettingsModel.hpp | 4 ++ .../Settings/AdvancedSettingsLayout.qml | 7 +++ 5 files changed, 75 insertions(+), 18 deletions(-) diff --git a/Linphone/core/setting/SettingsCore.cpp b/Linphone/core/setting/SettingsCore.cpp index 77a857d5..88e4b45e 100644 --- a/Linphone/core/setting/SettingsCore.cpp +++ b/Linphone/core/setting/SettingsCore.cpp @@ -68,6 +68,7 @@ SettingsCore::SettingsCore(QObject *parent) : QObject(parent) { LinphoneEnums::toVariant(LinphoneEnums::fromLinphone(settingsModel->getDefaultMediaEncryption())); mMediaEncryptionMandatory = settingsModel->getMediaEncryptionMandatory(); + mCreateEndToEndEncryptedMeetingsAndGroupCalls = settingsModel->getCreateEndToEndEncryptedMeetingsAndGroupCalls(); mCaptureGain = settingsModel->getCaptureGain(); mPlaybackGain = settingsModel->getPlaybackGain(); @@ -129,6 +130,7 @@ SettingsCore::SettingsCore(const SettingsCore &settingsCore) { mMediaEncryptions = settingsCore.mMediaEncryptions; mMediaEncryption = settingsCore.mMediaEncryption; mMediaEncryptionMandatory = settingsCore.mMediaEncryptionMandatory; + mCreateEndToEndEncryptedMeetingsAndGroupCalls = settingsCore.mCreateEndToEndEncryptedMeetingsAndGroupCalls; // Call mVideoEnabled = settingsCore.mVideoEnabled; @@ -323,6 +325,13 @@ void SettingsCore::setSelf(QSharedPointer me) { mSettingsModelConnection->invokeToCore([this, mandatory]() { setMediaEncryptionMandatory(mandatory); }); }); + mSettingsModelConnection->makeConnectToModel(&SettingsModel::createEndToEndEncryptedMeetingsAndGroupCallsChanged, + [this](bool endtoend) { + mSettingsModelConnection->invokeToCore([this, endtoend]() { + setCreateEndToEndEncryptedMeetingsAndGroupCalls(endtoend); + }); + }); + mSettingsModelConnection->makeConnectToModel( &SettingsModel::videoDevicesChanged, [this](const QStringList devices) { mSettingsModelConnection->invokeToCore([this, devices]() { setVideoDevices(devices); }); @@ -413,16 +422,16 @@ void SettingsCore::setSelf(QSharedPointer me) { } }); }); - coreModelConnection->makeConnectToModel(&CoreModel::defaultAccountChanged, [this] (const std::shared_ptr &core, - const std::shared_ptr &account) { - QString accountDomain; - if (account) { - accountDomain = Utils::coreStringToAppString(account->getParams()->getDomain()); - } - mSettingsModelConnection->invokeToCore([this, accountDomain]() { - setShowAccountDevices(accountDomain == mDefaultDomain); - }); - }); + coreModelConnection->makeConnectToModel( + &CoreModel::defaultAccountChanged, + [this](const std::shared_ptr &core, const std::shared_ptr &account) { + QString accountDomain; + if (account) { + accountDomain = Utils::coreStringToAppString(account->getParams()->getDomain()); + } + mSettingsModelConnection->invokeToCore( + [this, accountDomain]() { setShowAccountDevices(accountDomain == mDefaultDomain); }); + }); } void SettingsCore::reset(const SettingsCore &settingsCore) { @@ -448,6 +457,7 @@ void SettingsCore::reset(const SettingsCore &settingsCore) { setMediaEncryption(settingsCore.mMediaEncryption); setMediaEncryptionMandatory(settingsCore.mMediaEncryptionMandatory); + setCreateEndToEndEncryptedMeetingsAndGroupCalls(settingsCore.mCreateEndToEndEncryptedMeetingsAndGroupCalls); setCaptureGain(settingsCore.mCaptureGain); setPlaybackGain(settingsCore.mPlaybackGain); @@ -592,6 +602,18 @@ void SettingsCore::setMediaEncryptionMandatory(bool mandatory) { } } +bool SettingsCore::getCreateEndToEndEncryptedMeetingsAndGroupCalls() const { + return mCreateEndToEndEncryptedMeetingsAndGroupCalls; +} + +void SettingsCore::setCreateEndToEndEncryptedMeetingsAndGroupCalls(bool endtoend) { + if (mCreateEndToEndEncryptedMeetingsAndGroupCalls != endtoend) { + mCreateEndToEndEncryptedMeetingsAndGroupCalls = endtoend; + emit createEndToEndEncryptedMeetingsAndGroupCallsChanged(endtoend); + setIsSaved(false); + } +} + bool SettingsCore::isSaved() const { return mIsSaved; } @@ -911,6 +933,7 @@ void SettingsCore::writeIntoModel(std::shared_ptr model) const { LinphoneEnums::toLinphone(LinphoneEnums::MediaEncryption(mMediaEncryption["id"].toInt()))); model->setMediaEncryptionMandatory(mMediaEncryptionMandatory); + model->setCreateEndToEndEncryptedMeetingsAndGroupCalls(mCreateEndToEndEncryptedMeetingsAndGroupCalls); model->setCaptureGain(mCaptureGain); model->setPlaybackGain(mPlaybackGain); @@ -973,6 +996,7 @@ void SettingsCore::writeFromModel(const std::shared_ptr &model) { mMediaEncryption = LinphoneEnums::toVariant(LinphoneEnums::fromLinphone(model->getDefaultMediaEncryption())); mMediaEncryptionMandatory = model->getMediaEncryptionMandatory(); + mCreateEndToEndEncryptedMeetingsAndGroupCalls = model->getCreateEndToEndEncryptedMeetingsAndGroupCalls(); mCaptureGain = model->getCaptureGain(); mPlaybackGain = model->getPlaybackGain(); diff --git a/Linphone/core/setting/SettingsCore.hpp b/Linphone/core/setting/SettingsCore.hpp index 9815c37b..6a425d3f 100644 --- a/Linphone/core/setting/SettingsCore.hpp +++ b/Linphone/core/setting/SettingsCore.hpp @@ -66,6 +66,9 @@ public: QVariantMap mediaEncryption READ getMediaEncryption WRITE setMediaEncryption NOTIFY mediaEncryptionChanged) Q_PROPERTY(bool mediaEncryptionMandatory READ isMediaEncryptionMandatory WRITE setMediaEncryptionMandatory NOTIFY mediaEncryptionMandatoryChanged) + Q_PROPERTY( + bool createEndToEndEncryptedMeetingsAndGroupCalls READ getCreateEndToEndEncryptedMeetingsAndGroupCalls WRITE + setCreateEndToEndEncryptedMeetingsAndGroupCalls NOTIFY createEndToEndEncryptedMeetingsAndGroupCallsChanged) Q_PROPERTY(QStringList videoDevices READ getVideoDevices NOTIFY videoDevicesChanged) Q_PROPERTY(QString videoDevice READ getVideoDevice WRITE setVideoDevice NOTIFY videoDeviceChanged) @@ -80,7 +83,8 @@ public: Q_PROPERTY(bool dnd READ dndEnabled WRITE lEnableDnd NOTIFY dndChanged) Q_PROPERTY(bool isSaved READ isSaved WRITE setIsSaved NOTIFY isSavedChanged) - Q_PROPERTY(bool showAccountDevices READ showAccountDevices WRITE setShowAccountDevices NOTIFY showAccountDevicesChanged) + Q_PROPERTY( + bool showAccountDevices READ showAccountDevices WRITE setShowAccountDevices NOTIFY showAccountDevicesChanged) static QSharedPointer create(); SettingsCore(QObject *parent = Q_NULLPTR); @@ -154,6 +158,8 @@ public: void setMediaEncryption(QVariantMap encryption); bool isMediaEncryptionMandatory() const; void setMediaEncryptionMandatory(bool mandatory); + bool getCreateEndToEndEncryptedMeetingsAndGroupCalls() const; + void setCreateEndToEndEncryptedMeetingsAndGroupCalls(bool endtoend); bool isSaved() const; void setIsSaved(bool saved); @@ -259,6 +265,8 @@ signals: void mediaEncryptionMandatoryChanged(bool mandatory); + void createEndToEndEncryptedMeetingsAndGroupCallsChanged(bool endtoend); + void isSavedChanged(); void lSetPlaybackDevice(QVariantMap device); @@ -305,6 +313,7 @@ private: QVariantList mMediaEncryptions; QVariantMap mMediaEncryption; bool mMediaEncryptionMandatory; + bool mCreateEndToEndEncryptedMeetingsAndGroupCalls; // Call bool mVideoEnabled; @@ -345,7 +354,7 @@ private: QSettings mAppSettings; QSharedPointer> mSettingsModelConnection; - //Account + // Account QString mDefaultDomain; bool mShowAccountDevices = false; diff --git a/Linphone/model/setting/SettingsModel.cpp b/Linphone/model/setting/SettingsModel.cpp index a53062a0..b6d74a53 100644 --- a/Linphone/model/setting/SettingsModel.cpp +++ b/Linphone/model/setting/SettingsModel.cpp @@ -63,11 +63,12 @@ SettingsModel::SettingsModel() { notifyConfigReady(); } }); - QObject::connect(CoreModel::getInstance().get(), &CoreModel::defaultAccountChanged, this, - [this](const std::shared_ptr &core, const std::shared_ptr account) { - mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); - setDisableMeetingsFeature(account && !account->getParams()->getAudioVideoConferenceFactoryAddress()); - }); + QObject::connect( + CoreModel::getInstance().get(), &CoreModel::defaultAccountChanged, this, + [this](const std::shared_ptr &core, const std::shared_ptr account) { + mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); + setDisableMeetingsFeature(account && !account->getParams()->getAudioVideoConferenceFactoryAddress()); + }); auto defaultAccount = core->getDefaultAccount(); setDisableMeetingsFeature(defaultAccount && !defaultAccount->getParams()->getAudioVideoConferenceFactoryAddress()); // Media cards must not be used twice (capture card + call) else we will get latencies issues and bad echo @@ -350,6 +351,17 @@ void SettingsModel::setMediaEncryptionMandatory(bool mandatory) { emit mediaEncryptionMandatoryChanged(); } +bool SettingsModel::getCreateEndToEndEncryptedMeetingsAndGroupCalls() const { + mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); + return !!mConfig->getBool(SettingsModel::AppSection, "create_e2e_encrypted_conferences", false); +} + +void SettingsModel::setCreateEndToEndEncryptedMeetingsAndGroupCalls(bool endtoend) { + mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); + mConfig->setBool(SettingsModel::AppSection, "create_e2e_encrypted_conferences", endtoend); + emit createEndToEndEncryptedMeetingsAndGroupCallsChanged(endtoend); +} + // ----------------------------------------------------------------------------- QVariantMap SettingsModel::getPlaybackDevice() const { @@ -690,7 +702,8 @@ void SettingsModel::setShortcuts(QVariantList data) { } QString SettingsModel::getDefaultDomain() const { - return Utils::coreStringToAppString(mConfig->getString(SettingsModel::AppSection, "default_domain", "sip.linphone.org")); + return Utils::coreStringToAppString( + mConfig->getString(SettingsModel::AppSection, "default_domain", "sip.linphone.org")); } // clang-format off diff --git a/Linphone/model/setting/SettingsModel.hpp b/Linphone/model/setting/SettingsModel.hpp index 6e111621..d833b36d 100644 --- a/Linphone/model/setting/SettingsModel.hpp +++ b/Linphone/model/setting/SettingsModel.hpp @@ -103,6 +103,9 @@ public: bool getMediaEncryptionMandatory() const; void setMediaEncryptionMandatory(bool mandatory); + bool getCreateEndToEndEncryptedMeetingsAndGroupCalls() const; + void setCreateEndToEndEncryptedMeetingsAndGroupCalls(bool endtoend); + QVariantMap getRingerDevice() const; void setRingerDevice(QVariantMap device); @@ -209,6 +212,7 @@ signals: void conferenceLayoutChanged(); void mediaEncryptionChanged(); void mediaEncryptionMandatoryChanged(); + void createEndToEndEncryptedMeetingsAndGroupCallsChanged(bool endtoend); void echoCancellationEnabledChanged(bool enabled); void automaticallyRecordCallsEnabledChanged(bool enabled); diff --git a/Linphone/view/Page/Layout/Settings/AdvancedSettingsLayout.qml b/Linphone/view/Page/Layout/Settings/AdvancedSettingsLayout.qml index cb5a9fb7..16e60e48 100644 --- a/Linphone/view/Page/Layout/Settings/AdvancedSettingsLayout.qml +++ b/Linphone/view/Page/Layout/Settings/AdvancedSettingsLayout.qml @@ -133,6 +133,13 @@ AbstractSettingsLayout { propertyName: "mediaEncryptionMandatory" propertyOwner: SettingsCpp } + SwitchSetting { + Layout.fillWidth: true + //: Create end to end encrypted meetings and group calls + titleText: qsTr("settings_advanced_create_endtoend_encrypted_meetings_title") + propertyName: "createEndToEndEncryptedMeetingsAndGroupCalls" + propertyOwner: SettingsCpp + } } }