diff --git a/assets/languages/en.ts b/assets/languages/en.ts
index 68780a132..71f39d9c6 100644
--- a/assets/languages/en.ts
+++ b/assets/languages/en.ts
@@ -967,6 +967,17 @@ your friend's SIP address or username.
Offline
+
+ SettingsAdvanced
+
+ logsTitle
+ Logs
+
+
+ logsFolderLabel
+ Logs folder
+
+
SettingsAudio
@@ -1389,6 +1400,10 @@ your friend's SIP address or username.
validButton
OK
+
+ uiAdvanced
+ Advanced
+
SmartSearchBar
diff --git a/assets/languages/fr.ts b/assets/languages/fr.ts
index 9db336fd0..5e2f2d002 100644
--- a/assets/languages/fr.ts
+++ b/assets/languages/fr.ts
@@ -965,6 +965,17 @@ Cliquez ici : <a href="%1">%1</a>
Hors-ligne
+
+ SettingsAdvanced
+
+ logsTitle
+ Logs
+
+
+ logsFolderLabel
+ Dossier des logs
+
+
SettingsAudio
@@ -1387,6 +1398,10 @@ Cliquez ici : <a href="%1">%1</a>
validButton
OK
+
+ uiAdvanced
+ Avancé
+
SmartSearchBar
diff --git a/resources.qrc b/resources.qrc
index 0cfd4ef78..022fcb318 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -403,6 +403,7 @@
ui/views/App/Main/MainWindow.js
ui/views/App/Main/MainWindowMenuBar.qml
ui/views/App/Main/MainWindow.qml
+ ui/views/App/Settings/SettingsAdvanced.qml
ui/views/App/Settings/SettingsAudio.qml
ui/views/App/Settings/SettingsCallsChat.qml
ui/views/App/Settings/SettingsNetwork.qml
diff --git a/src/app/App.cpp b/src/app/App.cpp
index 730737b9c..b38bf02e2 100644
--- a/src/app/App.cpp
+++ b/src/app/App.cpp
@@ -84,10 +84,9 @@ App::App (int &argc, char *argv[]) : SingleApplication(argc, argv, true, Mode::U
createParser();
mParser->process(*this);
- // Initialize logger. (Do not do this before this point because the
- // application has to be created for the logs to be put in the correct
- // directory.)
- Logger::init();
+ // Initialize logger.
+ shared_ptr config = ::getConfigIfExists(*mParser);
+ Logger::init(SettingsModel::getLogsFolder(config));
if (mParser->isSet("verbose"))
Logger::getInstance()->setVerbose(true);
@@ -97,7 +96,7 @@ App::App (int &argc, char *argv[]) : SingleApplication(argc, argv, true, Mode::U
// Init locale.
mTranslator = new DefaultTranslator(this);
- initLocale(::getConfigIfExists(*mParser));
+ initLocale(config);
if (mParser->isSet("help")) {
createParser();
diff --git a/src/app/logger/Logger.cpp b/src/app/logger/Logger.cpp
index b25fc3046..c93602bb8 100644
--- a/src/app/logger/Logger.cpp
+++ b/src/app/logger/Logger.cpp
@@ -155,7 +155,9 @@ void Logger::log (QtMsgType type, const QMessageLogContext &context, const QStri
// -----------------------------------------------------------------------------
-void Logger::init () {
+void Logger::init (const QString &folder) {
+ Q_ASSERT(!folder.isEmpty());
+
if (mInstance)
return;
mInstance = new Logger();
@@ -168,7 +170,8 @@ void Logger::init () {
::linphoneLog(domain, type, fmt, args);
});
- linphone_core_set_log_collection_path(Paths::getLogsDirPath().c_str());
+ linphone_core_set_log_collection_path(::Utils::appStringToCoreString(folder).c_str());
+
linphone_core_set_log_collection_max_file_size(MAX_LOGS_COLLECTION_SIZE);
linphone_core_enable_log_collection(LinphoneLogCollectionEnabled);
}
diff --git a/src/app/logger/Logger.hpp b/src/app/logger/Logger.hpp
index 67053a5df..453d4a115 100644
--- a/src/app/logger/Logger.hpp
+++ b/src/app/logger/Logger.hpp
@@ -39,7 +39,7 @@ public:
mVerbose = verbose;
}
- static void init ();
+ static void init (const QString &folder);
static Logger *getInstance () {
return mInstance;
diff --git a/src/components/settings/SettingsModel.cpp b/src/components/settings/SettingsModel.cpp
index e32231380..381a8c471 100644
--- a/src/components/settings/SettingsModel.cpp
+++ b/src/components/settings/SettingsModel.cpp
@@ -636,7 +636,7 @@ void SettingsModel::setDscpVideo (int dscp) {
}
// =============================================================================
-// Misc.
+// UI.
// =============================================================================
QString SettingsModel::getSavedScreenshotsFolder () const {
@@ -711,3 +711,27 @@ void SettingsModel::setExitOnClose (bool value) {
mConfig->setInt(UI_SECTION, "exit_on_close", value);
emit exitOnCloseChanged(value);
}
+
+// =============================================================================
+// Advanced.
+// =============================================================================
+
+QString SettingsModel::getLogsFolder () const {
+ return getLogsFolder(mConfig);
+}
+
+void SettingsModel::setLogsFolder (const QString &folder) {
+ // Do not update path in linphone core.
+ // Just update the config file.
+ mConfig->setString(UI_SECTION, "logs_folder", ::Utils::appStringToCoreString(folder));
+
+ emit logsFolderChanged(folder);
+}
+
+// -----------------------------------------------------------------------------
+
+QString SettingsModel::getLogsFolder (const shared_ptr &config) {
+ return ::Utils::coreStringToAppString(
+ config->getString(UI_SECTION, "logs_folder", Paths::getLogsDirPath())
+ );
+}
diff --git a/src/components/settings/SettingsModel.hpp b/src/components/settings/SettingsModel.hpp
index 5d251c0ea..cd4a6fce2 100644
--- a/src/components/settings/SettingsModel.hpp
+++ b/src/components/settings/SettingsModel.hpp
@@ -110,7 +110,7 @@ class SettingsModel : public QObject {
Q_PROPERTY(int dscpAudio READ getDscpAudio WRITE setDscpAudio NOTIFY dscpAudioChanged);
Q_PROPERTY(int dscpVideo READ getDscpVideo WRITE setDscpVideo NOTIFY dscpVideoChanged);
- // Misc. ---------------------------------------------------------------------
+ // UI. -----------------------------------------------------------------------
Q_PROPERTY(QString remoteProvisioning READ getRemoteProvisioning WRITE setRemoteProvisioning NOTIFY remoteProvisioningChanged);
@@ -120,6 +120,10 @@ class SettingsModel : public QObject {
Q_PROPERTY(bool exitOnClose READ getExitOnClose WRITE setExitOnClose NOTIFY exitOnCloseChanged);
+ // Advanced. -----------------------------------------------------------------
+
+ Q_PROPERTY(QString logsFolder READ getLogsFolder WRITE setLogsFolder NOTIFY logsFolderChanged);
+
public:
enum MediaEncryption {
MediaEncryptionNone = linphone::MediaEncryptionNone,
@@ -261,7 +265,7 @@ public:
int getDscpVideo () const;
void setDscpVideo (int dscp);
- // Misc. ---------------------------------------------------------------------
+ // UI. -----------------------------------------------------------------------
QString getSavedScreenshotsFolder () const;
void setSavedScreenshotsFolder (const QString &folder);
@@ -280,6 +284,13 @@ public:
// ---------------------------------------------------------------------------
+ QString getLogsFolder () const;
+ void setLogsFolder (const QString &folder);
+
+ // ---------------------------------------------------------------------------
+
+ static QString getLogsFolder (const std::shared_ptr &config);
+
static const std::string UI_SECTION;
// ===========================================================================
@@ -346,7 +357,7 @@ signals:
void dscpAudioChanged (int dscp);
void dscpVideoChanged (int dscp);
- // Misc. ---------------------------------------------------------------------
+ // UI. -----------------------------------------------------------------------
void savedScreenshotsFolderChanged (const QString &folder);
void savedVideosFolderChanged (const QString &folder);
@@ -357,6 +368,10 @@ signals:
void exitOnCloseChanged (bool value);
+ // Advanced. -----------------------------------------------------------------
+
+ void logsFolderChanged (const QString &folder);
+
private:
std::shared_ptr mConfig;
};
diff --git a/ui/views/App/Settings/SettingsAdvanced.qml b/ui/views/App/Settings/SettingsAdvanced.qml
new file mode 100644
index 000000000..9cb928851
--- /dev/null
+++ b/ui/views/App/Settings/SettingsAdvanced.qml
@@ -0,0 +1,43 @@
+import QtQuick 2.7
+
+import Common 1.0
+import Linphone 1.0
+
+import App.Styles 1.0
+
+// =============================================================================
+
+TabContainer {
+ Column {
+ spacing: SettingsWindowStyle.forms.spacing
+ width: parent.width
+
+ // -------------------------------------------------------------------------
+ // Logs.
+ // -------------------------------------------------------------------------
+
+ Form {
+ title: qsTr('logsTitle')
+ width: parent.width
+
+ FormLine {
+ FormGroup {
+ label: qsTr('logsFolderLabel')
+
+ FileChooserButton {
+ selectedFile: SettingsModel.logsFolder
+ selectFolder: true
+
+ onAccepted: SettingsModel.logsFolder = selectedFile
+ }
+ }
+ }
+ }
+
+ // -------------------------------------------------------------------------
+ // Internal features.
+ // -------------------------------------------------------------------------
+
+ // Nothing for the moment.
+ }
+}
diff --git a/ui/views/App/Settings/SettingsWindow.qml b/ui/views/App/Settings/SettingsWindow.qml
index da83b9c65..f28383e39 100644
--- a/ui/views/App/Settings/SettingsWindow.qml
+++ b/ui/views/App/Settings/SettingsWindow.qml
@@ -84,6 +84,12 @@ ApplicationWindow {
text: qsTr('uiTab')
width: implicitWidth
}
+
+ TabButton {
+ icon: 'settings_advanced'
+ text: qsTr('uiAdvanced')
+ width: implicitWidth
+ }
}
Rectangle {
@@ -110,6 +116,7 @@ ApplicationWindow {
SettingsCallsChat {}
SettingsNetwork {}
SettingsUi {}
+ SettingsAdvanced {}
}
// -------------------------------------------------------------------------