Move Call Forward under the save scope in settings

This commit is contained in:
Christophe Deschamps 2025-12-17 18:44:18 +01:00
parent c3b160ec3e
commit 0cf3938dc3
5 changed files with 50 additions and 73 deletions

View file

@ -146,7 +146,6 @@ SettingsCore::SettingsCore(QObject *parent) : QObject(parent) {
INIT_CORE_MEMBER(CallToneIndicationsEnabled, settingsModel) INIT_CORE_MEMBER(CallToneIndicationsEnabled, settingsModel)
INIT_CORE_MEMBER(CommandLine, settingsModel) INIT_CORE_MEMBER(CommandLine, settingsModel)
INIT_CORE_MEMBER(DisableCommandLine, settingsModel) INIT_CORE_MEMBER(DisableCommandLine, settingsModel)
INIT_CORE_MEMBER(DisableCallForward, settingsModel)
INIT_CORE_MEMBER(CallForwardToAddress, settingsModel) INIT_CORE_MEMBER(CallForwardToAddress, settingsModel)
INIT_CORE_MEMBER(ThemeMainColor, settingsModel) INIT_CORE_MEMBER(ThemeMainColor, settingsModel)
@ -226,7 +225,7 @@ SettingsCore::SettingsCore(const SettingsCore &settingsCore) {
mCallToneIndicationsEnabled = settingsCore.mCallToneIndicationsEnabled; mCallToneIndicationsEnabled = settingsCore.mCallToneIndicationsEnabled;
mCommandLine = settingsCore.mCommandLine; mCommandLine = settingsCore.mCommandLine;
mDisableCommandLine = settingsCore.mDisableCommandLine; mDisableCommandLine = settingsCore.mDisableCommandLine;
mDisableCallForward = settingsCore.mDisableCallForward; mCallForwardToAddress = settingsCore.mCallForwardToAddress;
mDefaultDomain = settingsCore.mDefaultDomain; mDefaultDomain = settingsCore.mDefaultDomain;
mShowAccountDevices = settingsCore.mShowAccountDevices; mShowAccountDevices = settingsCore.mShowAccountDevices;
@ -270,6 +269,12 @@ void SettingsCore::setSelf(QSharedPointer<SettingsCore> me) {
mSettingsModelConnection->invokeToCore([this, enabled]() { setIpv6Enabled(enabled); }); mSettingsModelConnection->invokeToCore([this, enabled]() { setIpv6Enabled(enabled); });
}); });
// Call Forward
mSettingsModelConnection->makeConnectToModel(
&SettingsModel::callForwardToAddressChanged, [this](const QString address) {
mSettingsModelConnection->invokeToCore([this, address]() { setCallForwardToAddress(address); });
});
// Hide FPS // Hide FPS
mSettingsModelConnection->makeConnectToModel(&SettingsModel::hideFpsChanged, [this](const bool hide) { mSettingsModelConnection->makeConnectToModel(&SettingsModel::hideFpsChanged, [this](const bool hide) {
mSettingsModelConnection->invokeToCore([this, hide]() { setHideFps(hide); }); mSettingsModelConnection->invokeToCore([this, hide]() { setHideFps(hide); });
@ -488,10 +493,6 @@ void SettingsCore::setSelf(QSharedPointer<SettingsCore> me) {
commandLine, CommandLine) commandLine, CommandLine)
DEFINE_CORE_GETSET_CONNECT(mSettingsModelConnection, SettingsCore, SettingsModel, settingsModel, bool, DEFINE_CORE_GETSET_CONNECT(mSettingsModelConnection, SettingsCore, SettingsModel, settingsModel, bool,
disableCommandLine, DisableCommandLine) disableCommandLine, DisableCommandLine)
DEFINE_CORE_GETSET_CONNECT(mSettingsModelConnection, SettingsCore, SettingsModel, settingsModel, bool,
disableCallForward, DisableCallForward)
DEFINE_CORE_GETSET_CONNECT(mSettingsModelConnection, SettingsCore, SettingsModel, settingsModel, QString,
callForwardToAddress, CallForwardToAddress)
DEFINE_CORE_GETSET_CONNECT(mSettingsModelConnection, SettingsCore, SettingsModel, settingsModel, QString, DEFINE_CORE_GETSET_CONNECT(mSettingsModelConnection, SettingsCore, SettingsModel, settingsModel, QString,
themeAboutPictureUrl, ThemeAboutPictureUrl) themeAboutPictureUrl, ThemeAboutPictureUrl)
DEFINE_CORE_GETSET_CONNECT(mSettingsModelConnection, SettingsCore, SettingsModel, settingsModel, QString, DEFINE_CORE_GETSET_CONNECT(mSettingsModelConnection, SettingsCore, SettingsModel, settingsModel, QString,
@ -588,6 +589,7 @@ void SettingsCore::reset(const SettingsCore &settingsCore) {
setAutoStart(settingsCore.mAutoStart); setAutoStart(settingsCore.mAutoStart);
setConfigLocale(settingsCore.mConfigLocale); setConfigLocale(settingsCore.mConfigLocale);
setDownloadFolder(settingsCore.mDownloadFolder); setDownloadFolder(settingsCore.mDownloadFolder);
setCallForwardToAddress(settingsCore.mCallForwardToAddress);
} }
QString SettingsCore::getConfigPath(const QCommandLineParser &parser) { QString SettingsCore::getConfigPath(const QCommandLineParser &parser) {
@ -661,6 +663,13 @@ void SettingsCore::setAutoStart(bool enabled) {
} }
} }
void SettingsCore::setCallForwardToAddress(QString address) {
if (mCallForwardToAddress != address) {
mCallForwardToAddress = address;
setIsSaved(false);
}
}
void SettingsCore::setHideFps(bool hide) { void SettingsCore::setHideFps(bool hide) {
if (mHideFps != hide) { if (mHideFps != hide) {
mHideFps = hide; mHideFps = hide;
@ -1160,6 +1169,7 @@ void SettingsCore::writeIntoModel(std::shared_ptr<SettingsModel> model) const {
model->setAutoStart(mAutoStart); model->setAutoStart(mAutoStart);
model->setConfigLocale(mConfigLocale); model->setConfigLocale(mConfigLocale);
model->setDownloadFolder(mDownloadFolder); model->setDownloadFolder(mDownloadFolder);
model->setCallForwardToAddress(mCallForwardToAddress);
} }
void SettingsCore::writeFromModel(const std::shared_ptr<SettingsModel> &model) { void SettingsCore::writeFromModel(const std::shared_ptr<SettingsModel> &model) {
@ -1242,6 +1252,7 @@ void SettingsCore::writeFromModel(const std::shared_ptr<SettingsModel> &model) {
mAutoStart = model->getAutoStart(); mAutoStart = model->getAutoStart();
mConfigLocale = model->getConfigLocale(); mConfigLocale = model->getConfigLocale();
mDownloadFolder = model->getDownloadFolder(); mDownloadFolder = model->getDownloadFolder();
mCallForwardToAddress = model->getCallForwardToAddress();
} }
bool SettingsCore::isCheckForUpdateAvailable() const { bool SettingsCore::isCheckForUpdateAvailable() const {

View file

@ -62,6 +62,10 @@ public:
Q_PROPERTY(QVariantMap playbackDevice READ getPlaybackDevice WRITE setPlaybackDevice NOTIFY playbackDeviceChanged) Q_PROPERTY(QVariantMap playbackDevice READ getPlaybackDevice WRITE setPlaybackDevice NOTIFY playbackDeviceChanged)
Q_PROPERTY(QVariantMap ringerDevice READ getRingerDevice WRITE setRingerDevice NOTIFY ringerDeviceChanged) Q_PROPERTY(QVariantMap ringerDevice READ getRingerDevice WRITE setRingerDevice NOTIFY ringerDeviceChanged)
// Call Forward
Q_PROPERTY(QString callForwardToAddress READ getCallForwardToAddress WRITE setCallForwardToAddress NOTIFY
callForwardToAddressChanged)
// Network // Network
Q_PROPERTY(bool ipv6Enabled READ getIpv6Enabled WRITE setIpv6Enabled NOTIFY ipv6EnabledChanged) Q_PROPERTY(bool ipv6Enabled READ getIpv6Enabled WRITE setIpv6Enabled NOTIFY ipv6EnabledChanged)
Q_PROPERTY(bool hideFps READ getHideFps WRITE setHideFps NOTIFY hideFpsChanged) Q_PROPERTY(bool hideFps READ getHideFps WRITE setHideFps NOTIFY hideFpsChanged)
@ -202,6 +206,13 @@ public:
Q_INVOKABLE void closeCallSettings(); Q_INVOKABLE void closeCallSettings();
Q_INVOKABLE void updateMicVolume() const; Q_INVOKABLE void updateMicVolume() const;
// Call Forward. --------------------------------------------------------------------
QString getCallForwardToAddress() {
return mCallForwardToAddress;
}
void setCallForwardToAddress(QString address);
// Network. -------------------------------------------------------------------- // Network. --------------------------------------------------------------------
bool getIpv6Enabled() { bool getIpv6Enabled() {
@ -277,8 +288,6 @@ public:
DECLARE_CORE_GETSET_MEMBER(bool, callToneIndicationsEnabled, CallToneIndicationsEnabled) DECLARE_CORE_GETSET_MEMBER(bool, callToneIndicationsEnabled, CallToneIndicationsEnabled)
DECLARE_CORE_GETSET_MEMBER(bool, disableCommandLine, DisableCommandLine) DECLARE_CORE_GETSET_MEMBER(bool, disableCommandLine, DisableCommandLine)
DECLARE_CORE_GETSET_MEMBER(QString, commandLine, CommandLine) DECLARE_CORE_GETSET_MEMBER(QString, commandLine, CommandLine)
DECLARE_CORE_GETSET_MEMBER(bool, disableCallForward, DisableCallForward)
DECLARE_CORE_GETSET_MEMBER(QString, callForwardToAddress, CallForwardToAddress)
DECLARE_CORE_GET_CONSTANT(QFont, emojiFont, EmojiFont) DECLARE_CORE_GET_CONSTANT(QFont, emojiFont, EmojiFont)
DECLARE_CORE_GET_CONSTANT(QFont, textMessageFont, TextMessageFont) DECLARE_CORE_GET_CONSTANT(QFont, textMessageFont, TextMessageFont)
// Theme // Theme
@ -312,6 +321,9 @@ signals:
// Network // Network
void ipv6EnabledChanged(); void ipv6EnabledChanged();
// Call Forward
void callForwardToAddressChanged();
// Advanced // Advanced
void autoStartChanged(); void autoStartChanged();
void hideFpsChanged(); void hideFpsChanged();
@ -417,6 +429,9 @@ private:
// Network // Network
bool mIpv6Enabled; bool mIpv6Enabled;
// Call Forward
QString mCallForwardToAddress;
// Advanced // Advanced
bool mAutoStart; bool mAutoStart;
bool mHideFps; bool mHideFps;

View file

@ -837,26 +837,13 @@ QString SettingsModel::getDefaultDomain() const {
mConfig->getString(SettingsModel::AppSection, "default_domain", "sip.linphone.org")); mConfig->getString(SettingsModel::AppSection, "default_domain", "sip.linphone.org"));
} }
void SettingsModel::enableCallForward(QString destination) {
// TODO implement business logic to activate call forward to destination on PBX via external API (contains voicemail
// or a destination).
mConfig->setString(UiSection, "call_forward_to_address", Utils::appStringToCoreString(destination));
emit callForwardToAddressChanged(getCallForwardToAddress());
}
void SettingsModel::disableCallForward() {
// TODO implement business logic to de-activate call forward on PBX via external API
mConfig->setString(UiSection, "call_forward_to_address", "");
}
QString SettingsModel::getCallForwardToAddress() const { QString SettingsModel::getCallForwardToAddress() const {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
return Utils::coreStringToAppString(mConfig->getString(UiSection, "call_forward_to_address", "")); return Utils::coreStringToAppString(mConfig->getString(UiSection, "call_forward_to_address", ""));
} }
void SettingsModel::setCallForwardToAddress(const QString &data) { void SettingsModel::setCallForwardToAddress(const QString &data) {
if (data == "") disableCallForward(); mConfig->setString(UiSection, "call_forward_to_address", Utils::appStringToCoreString(data)); // TODO implement BL
else enableCallForward(data);
emit(callForwardToAddressChanged(data)); emit(callForwardToAddressChanged(data));
} }
@ -1139,13 +1126,6 @@ DEFINE_GETSET_CONFIG(SettingsModel,
DisableCommandLine, DisableCommandLine,
"disable_command_line", "disable_command_line",
false) false)
DEFINE_GETSET_CONFIG(SettingsModel,
bool,
Bool,
disableCallForward,
DisableCallForward,
"disable_call_forward",
true)
DEFINE_GETSET_CONFIG_STRING(SettingsModel, DEFINE_GETSET_CONFIG_STRING(SettingsModel,
themeMainColor, themeMainColor,
ThemeMainColor, ThemeMainColor,

View file

@ -223,7 +223,6 @@ public:
DECLARE_GETSET(bool, usernameOnlyForCardDAVLookupsInCalls, UsernameOnlyForCardDAVLookupsInCalls) DECLARE_GETSET(bool, usernameOnlyForCardDAVLookupsInCalls, UsernameOnlyForCardDAVLookupsInCalls)
DECLARE_GETSET(QString, commandLine, CommandLine) DECLARE_GETSET(QString, commandLine, CommandLine)
DECLARE_GETSET(bool, disableCommandLine, DisableCommandLine) DECLARE_GETSET(bool, disableCommandLine, DisableCommandLine)
DECLARE_GETSET(bool, disableCallForward, DisableCallForward)
DECLARE_GETSET(QString, callForwardToAddress, CallForwardToAddress) DECLARE_GETSET(QString, callForwardToAddress, CallForwardToAddress)
DECLARE_GETSET(QString, chatNotificationSoundPath, ChatNotificationSoundPath) DECLARE_GETSET(QString, chatNotificationSoundPath, ChatNotificationSoundPath)
DECLARE_GETSET(QString, themeMainColor, ThemeMainColor) DECLARE_GETSET(QString, themeMainColor, ThemeMainColor)
@ -293,7 +292,6 @@ private:
VfsUtils mVfsUtils; VfsUtils mVfsUtils;
#endif #endif
void enableCallForward(QString destination);
void disableCallForward(); void disableCallForward();
static std::shared_ptr<SettingsModel> gSettingsModel; static std::shared_ptr<SettingsModel> gSettingsModel;

View file

@ -9,11 +9,9 @@ import "qrc:/qt/qml/Linphone/view/Control/Tool/Helper/utils.js" as Utils
AbstractSettingsLayout { AbstractSettingsLayout {
id: mainItem id: mainItem
width: parent?.width
property bool enableCallForward: SettingsCpp.callForwardToAddress.length > 0 property bool enableCallForward: SettingsCpp.callForwardToAddress.length > 0
property string localCallForwardToAddress: SettingsCpp.callForwardToAddress
width: parent?.width
contentModel: [ contentModel: [
{ {
@ -23,44 +21,14 @@ AbstractSettingsLayout {
} }
] ]
Connections {
target: SettingsCpp
function onCallForwardToAddressChanged() {
requestTimeOut.stop()
UtilsCpp.getMainWindow().closeLoadingPopup()
UtilsCpp.showInformationPopup("",
SettingsCpp.callForwardToAddress
? qsTr("settings_call_forward_activation_success") + (SettingsCpp.callForwardToAddress == "voicemail" ? qsTr("settings_call_forward_to_voicemail") : SettingsCpp.callForwardToAddress)
: qsTr("settings_call_forward_deactivation_success")
, true)
}
}
Timer {
id: requestTimeOut
interval: 10000
running: false
repeat: false
onTriggered: {
UtilsCpp.getMainWindow().closeLoadingPopup()
UtilsCpp.showInformationPopup("", qsTr("settings_call_forward_address_timeout"), false)
}
}
onSave: { onSave: {
if (mainItem.enableCallForward && mainItem.localCallForwardToAddress.length == 0) { if (mainItem.enableCallForward && SettingsCpp.callForwardToAddress.length == 0) {
UtilsCpp.getMainWindow().showInformationPopup("", qsTr("settings_call_forward_address_cannot_be_empty"), false) UtilsCpp.getMainWindow().showInformationPopup("", qsTr("settings_call_forward_address_cannot_be_empty"), false)
return return
} }
requestTimeOut.start() SettingsCpp.save()
if (!mainItem.enableCallForward && SettingsCpp.callForwardToAddress.length > 0) {
UtilsCpp.getMainWindow().showLoadingPopup(qsTr("settings_call_forward_address_progress_disabling") + " ...")
SettingsCpp.callForwardToAddress = ""
} else if (SettingsCpp.callForwardToAddress != mainItem.localCallForwardToAddress) {
UtilsCpp.getMainWindow().showLoadingPopup(qsTr("settings_call_forward_address_progress_enabling")+(mainItem.localCallForwardToAddress === 'voicemail' ? qsTr("settings_call_forward_to_voicemail") : mainItem.localCallForwardToAddress) + " ...")
SettingsCpp.callForwardToAddress = mainItem.localCallForwardToAddress
}
} }
onUndo: SettingsCpp.undo()
// Generic forward parameters // Generic forward parameters
///////////////////////////// /////////////////////////////
@ -76,6 +44,11 @@ AbstractSettingsLayout {
subTitleText: qsTr("settings_call_forward_activate_subtitle") subTitleText: qsTr("settings_call_forward_activate_subtitle")
propertyName: "enableCallForward" propertyName: "enableCallForward"
propertyOwner: mainItem propertyOwner: mainItem
onToggled: function () {
SettingsCpp.isSaved = false
if (!mainItem.enableCallForward)
SettingsCpp.callForwardToAddress = ""
}
} }
Text { Text {
visible: mainItem.enableCallForward visible: mainItem.enableCallForward
@ -99,7 +72,7 @@ AbstractSettingsLayout {
Component.onCompleted: { Component.onCompleted: {
if (mainItem.enableCallForward) { if (mainItem.enableCallForward) {
forwardDestination.currentIndex = forwardDestination.currentIndex =
(mainItem.localCallForwardToAddress === "voicemail" || mainItem.localCallForwardToAddress.length === 0) ? 0 : 1; (SettingsCpp.callForwardToAddress === "voicemail" || SettingsCpp.callForwardToAddress.length === 0) ? 0 : 1;
} else { } else {
forwardDestination.currentIndex = 0; forwardDestination.currentIndex = 0;
} }
@ -109,16 +82,16 @@ AbstractSettingsLayout {
if (!forwardDestination.isInitialized) if (!forwardDestination.isInitialized)
return; return;
if (currentIndex == 0) if (currentIndex == 0)
mainItem.localCallForwardToAddress = "voicemail"; SettingsCpp.callForwardToAddress = "voicemail";
else { else {
mainItem.localCallForwardToAddress = ""; SettingsCpp.callForwardToAddress = "";
sipInputField.empty(); sipInputField.empty();
} }
} }
onVisibleChanged: { onVisibleChanged: {
if (visible) { if (visible) {
currentIndex = 0 currentIndex = 0
mainItem.localCallForwardToAddress = "voicemail"; SettingsCpp.callForwardToAddress = "voicemail";
} }
} }
@ -127,8 +100,8 @@ AbstractSettingsLayout {
id: sipInputField id: sipInputField
visible: mainItem.enableCallForward && forwardDestination.currentIndex == 1 visible: mainItem.enableCallForward && forwardDestination.currentIndex == 1
Layout.fillWidth: true Layout.fillWidth: true
propertyName: "localCallForwardToAddress" propertyName: "callForwardToAddress"
propertyOwner: mainItem propertyOwner: SettingsCpp
//: SIP Address //: SIP Address
title: qsTr("settings_call_forward_sipaddress_title") title: qsTr("settings_call_forward_sipaddress_title")
placeHolder: qsTr("settings_call_forward_sipaddress_placeholder") placeHolder: qsTr("settings_call_forward_sipaddress_placeholder")