harbour-batterybuddy/service/src/settings.cpp
2020-11-30 22:35:58 +02:00

148 lines
5.8 KiB
C++

/**
* Battery Buddy, a Sailfish application to prolong battery lifetime
*
* Copyright (C) 2019-2020 Matti Viljanen
*
* Battery Buddy is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Battery Buddy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU General Public License for more details. You should have received a copy of the GNU
* General Public License along with Battery Buddy. If not, see <http://www.gnu.org/licenses/>.
*
* Author: Matti Viljanen
*/
#include "settings.h"
Settings::Settings(QObject *parent) : QObject(parent)
{
// Use the same file location as GUI for data exchange
if(!mySettings) {
mySettings = new QSettings("harbour-batterybuddy", "harbour-batterybuddy");
}
qDebug() << "Using" << mySettings->fileName();
// Migrate old settings
if(mySettings->contains("lowerLimit")) {
mySettings->setValue(sLowAlert, mySettings->value("lowerLimit"));
mySettings->remove("lowerLimit");
qInfo() << "Migrated old lowerLimit value";
}
if(mySettings->contains("upperLimit")) {
mySettings->setValue(sHighAlert, mySettings->value("upperLimit"));
mySettings->remove("upperLimit");
qInfo() << "Migrated old upperLimit value";
}
if(mySettings->contains("notificationsEnabled")) {
mySettings->setValue(sHighNotificationsEnabled, mySettings->value("notificationsEnabled"));
mySettings->remove("notificationsEnabled");
qInfo() << "Migrated old upperLimit value";
}
if(mySettings->contains("interval")) {
mySettings->setValue(sHighNotificationsInterval, mySettings->value("interval"));
mySettings->setValue(sLowNotificationsInterval, mySettings->value("interval"));
mySettings->remove("interval");
qInfo() << "Migrated old notification interval value";
}
// Do this here, because...
watcher = new QFileSystemWatcher(QStringList(mySettings->fileName()));
connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(updateConfig(QString)));
// ...calling this deletes mySettings!
updateConfig(mySettings->fileName());
qInfo() << "Loaded" << sLimitEnabled << limitEnabled;
// Battery Buddy GUI application changes the settings file,
// so we must monitor it and update when it changes.
}
Settings::~Settings()
{
delete mySettings;
}
int Settings::bound(int value, int min, int max) {
return (value <= min ? min : (value >= max ? max : value));
}
bool Settings::loadInteger(const char* key, int *value, int min, int max) {
oldValue = *value;
*value = bound(mySettings->value(key, *value).toInt(), min, max);
if(oldValue != *value) {
qInfo() << "Loaded" << key << *value;
}
return oldValue != *value;
}
void Settings::updateConfig(QString path) {
// Use the same file location as GUI for data exchange
if(!mySettings) {
mySettings = new QSettings("harbour-batterybuddy", "harbour-batterybuddy");
}
qDebug() << "Reading values...";
// Read in the values
bool restartTimers = false;
loadInteger(sLowAlert, &lowAlert, 10, 99);
loadInteger(sHighAlert, &highAlert, 11, 100);
restartTimers |= loadInteger(sHighNotificationsInterval, &highNotificationsInterval, 60, 600);
restartTimers |= loadInteger(sLowNotificationsInterval, &lowNotificationsInterval, 60, 600);
loadInteger(sLimitEnabled, &limitEnabled, 0, 1);
restartTimers |= loadInteger(sHighNotificationsEnabled, &highNotificationsEnabled, 0, 1);
restartTimers |= loadInteger(sLowNotificationsEnabled, &lowNotificationsEnabled, 0, 1);
loadInteger(sLowLimit, &lowLimit, 20, 94);
loadInteger(sHighLimit, &highLimit, 21, 95);
// These are translated in the GUI application
// and delivered here via the config file
notificationTitle = mySettings->value(sNotificationTitle, "Battery charge %1%").toString();
notificationLowText = mySettings->value(sNotificationLowText, "Please connect the charger.").toString();
notificationHighText = mySettings->value(sNotificationHighText, "Please disconnect the charger.").toString();
qDebug() << "Values read.";
delete mySettings;
mySettings = nullptr;
// Let the file system settle...
QThread::msleep(50);
if(watcher->files().contains(path)) {
qDebug() << "File OK";
}
else {
qDebug() << "File replaced, re-adding.";
watcher->addPath(path);
}
if(restartTimers) {
emit resetTimers();
}
}
// Getters condensed
int Settings::getLowAlert() { return lowAlert; }
int Settings::getHighAlert() { return highAlert; }
int Settings::getHighNotificationsInterval() { return highNotificationsInterval; }
int Settings::getLowNotificationsInterval() { return lowNotificationsInterval; }
int Settings::getLowLimit() { return lowLimit; }
int Settings::getHighLimit() { return highLimit; }
bool Settings::getLimitEnabled() { return limitEnabled == 1; }
bool Settings::getHighNotificationsEnabled() { return highNotificationsEnabled == 1; }
bool Settings::getLowNotificationsEnabled() { return lowNotificationsEnabled == 1; }
QString Settings::getLowAlertFile() { return lowAlertFile; }
QString Settings::getHighAlertFile() { return highAlertFile; }
QString Settings::getNotificationTitle() { return notificationTitle; }
QString Settings::getNotificationLowText() { return notificationLowText; }
QString Settings::getNotificationHighText() { return notificationHighText; }