2023-03-14 01:45:47 +00:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
|
|
|
// SPDX-FileCopyrightText: 2020 Tomaz Canabrava <tcanabrava@kde.org>
|
|
|
|
|
|
|
|
|
|
#include "mobilepower.h"
|
|
|
|
|
#include "statisticsprovider.h"
|
|
|
|
|
|
|
|
|
|
#include <KConfigGroup>
|
|
|
|
|
#include <KLocalizedString>
|
|
|
|
|
#include <KPluginFactory>
|
|
|
|
|
#include <KSharedConfig>
|
|
|
|
|
|
|
|
|
|
#include <Solid/Battery>
|
2024-06-14 07:38:14 +00:00
|
|
|
#include <QDBusConnection>
|
|
|
|
|
#include <QDBusPendingCall>
|
2023-03-14 01:45:47 +00:00
|
|
|
|
2023-03-15 03:56:30 +00:00
|
|
|
K_PLUGIN_CLASS_WITH_JSON(MobilePower, "kcm_mobile_power.json")
|
2023-03-14 01:45:47 +00:00
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
THIRTY_SECONDS,
|
|
|
|
|
ONE_MINUTE,
|
|
|
|
|
TWO_MINUTES,
|
|
|
|
|
FIVE_MINUTES,
|
|
|
|
|
TEN_MINUTES,
|
|
|
|
|
FIFTEEN_MINUTES,
|
2024-01-02 19:17:41 +00:00
|
|
|
THIRTY_MINUTES,
|
2023-03-14 01:45:47 +00:00
|
|
|
NEVER,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const QStringList timeValues = {
|
|
|
|
|
i18n("30 sec"),
|
|
|
|
|
i18n("1 min"),
|
|
|
|
|
i18n("2 min"),
|
|
|
|
|
i18n("5 min"),
|
|
|
|
|
i18n("10 min"),
|
|
|
|
|
i18n("15 min"),
|
2024-01-02 19:17:41 +00:00
|
|
|
i18n("30 min"),
|
2023-03-14 01:45:47 +00:00
|
|
|
i18n("Never"),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Maps the indices of the timeValues indexes
|
2024-01-02 19:17:41 +00:00
|
|
|
// to seconds.
|
|
|
|
|
const QMap<int, qreal> idxToSeconds = {
|
|
|
|
|
{THIRTY_SECONDS, 30},
|
|
|
|
|
{ONE_MINUTE, 60},
|
|
|
|
|
{TWO_MINUTES, 120},
|
|
|
|
|
{FIVE_MINUTES, 300},
|
|
|
|
|
{TEN_MINUTES, 600},
|
|
|
|
|
{FIFTEEN_MINUTES, 900},
|
|
|
|
|
{THIRTY_MINUTES, 1800},
|
2023-03-14 01:45:47 +00:00
|
|
|
{NEVER, 0},
|
|
|
|
|
};
|
|
|
|
|
|
2023-06-10 08:50:37 +00:00
|
|
|
MobilePower::MobilePower(QObject *parent, const KPluginMetaData &metaData)
|
|
|
|
|
: KQuickConfigModule(parent, metaData)
|
2023-03-14 01:45:47 +00:00
|
|
|
, m_batteries{new BatteryModel(this)}
|
2024-01-02 19:17:41 +00:00
|
|
|
, m_profilesConfig{KSharedConfig::openConfig("powerdevilrc", KConfig::SimpleConfig | KConfig::CascadeConfig)}
|
2023-03-14 01:45:47 +00:00
|
|
|
{
|
|
|
|
|
qmlRegisterUncreatableType<BatteryModel>("org.kde.kcm.power.mobile.private", 1, 0, "BatteryModel", QStringLiteral("Use BatteryModel"));
|
|
|
|
|
qmlRegisterUncreatableType<Solid::Battery>("org.kde.kcm.power.mobile.private", 1, 0, "Battery", "");
|
|
|
|
|
qmlRegisterType<StatisticsProvider>("org.kde.kcm.power.mobile.private", 1, 0, "HistoryModel");
|
|
|
|
|
|
2023-03-18 17:53:52 +00:00
|
|
|
setButtons(KQuickConfigModule::NoAdditionalButton);
|
2023-03-14 01:45:47 +00:00
|
|
|
load();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MobilePower::load()
|
|
|
|
|
{
|
|
|
|
|
// we assume that the [AC], [Battery], and [LowBattery] groups have the same value
|
|
|
|
|
// (which is done by this kcm)
|
|
|
|
|
|
|
|
|
|
KConfigGroup batteryGroup = m_profilesConfig->group("Battery");
|
|
|
|
|
|
2024-01-02 19:17:41 +00:00
|
|
|
if (batteryGroup.hasGroup("Display")) {
|
|
|
|
|
qDebug() << "[Battery][Display] group is listed";
|
|
|
|
|
KConfigGroup displaySettings = batteryGroup.group("Display");
|
|
|
|
|
m_dimScreenTime = displaySettings.readEntry("DimDisplayIdleTimeoutSec", 30);
|
|
|
|
|
m_dimScreen = displaySettings.readEntry("DimDisplayWhenIdle", true);
|
2023-03-14 01:45:47 +00:00
|
|
|
|
2024-01-02 19:17:41 +00:00
|
|
|
m_screenOffTime = displaySettings.readEntry("TurnOffDisplayIdleTimeoutSec", 60);
|
|
|
|
|
m_screenOff = displaySettings.readEntry("TurnOffDisplayWhenIdle", true);
|
2023-03-14 01:45:47 +00:00
|
|
|
} else {
|
2024-01-02 19:17:41 +00:00
|
|
|
qDebug() << "[Battery][Display] Group is not listed";
|
|
|
|
|
m_dimScreenTime = 30;
|
|
|
|
|
m_dimScreen = true;
|
|
|
|
|
m_screenOffTime = 60;
|
|
|
|
|
m_screenOff = true;
|
2023-03-14 01:45:47 +00:00
|
|
|
}
|
|
|
|
|
|
2024-01-02 19:17:41 +00:00
|
|
|
if (batteryGroup.hasGroup("SuspendAndShutdown")) {
|
|
|
|
|
qDebug() << "[Battery][SuspendAndShutdown] group is listed";
|
|
|
|
|
KConfigGroup suspendSessionGroup = batteryGroup.group("SuspendAndShutdown");
|
|
|
|
|
m_suspendSessionTime = suspendSessionGroup.readEntry("AutoSuspendIdleTimeoutSec", 300);
|
2023-03-14 01:45:47 +00:00
|
|
|
} else {
|
2024-01-02 19:17:41 +00:00
|
|
|
qDebug() << "[Battery][SuspendAndShutdown] is not listed";
|
|
|
|
|
m_suspendSessionTime = 300;
|
2023-03-14 01:45:47 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MobilePower::save()
|
|
|
|
|
{
|
2024-01-02 19:17:41 +00:00
|
|
|
// we set all profiles at the same time, since our UI is a simple global toggle
|
2023-03-14 01:45:47 +00:00
|
|
|
KConfigGroup acGroup = m_profilesConfig->group("AC");
|
|
|
|
|
KConfigGroup batteryGroup = m_profilesConfig->group("Battery");
|
|
|
|
|
KConfigGroup lowBatteryGroup = m_profilesConfig->group("LowBattery");
|
|
|
|
|
|
2024-01-02 19:17:41 +00:00
|
|
|
acGroup.group("Display").writeEntry("DimDisplayWhenIdle", m_dimScreen, KConfigGroup::Notify);
|
|
|
|
|
acGroup.group("Display").writeEntry("DimDisplayIdleTimeoutSec", m_dimScreenTime, KConfigGroup::Notify);
|
|
|
|
|
batteryGroup.group("Display").writeEntry("DimDisplayWhenIdle", m_dimScreen, KConfigGroup::Notify);
|
|
|
|
|
batteryGroup.group("Display").writeEntry("DimDisplayIdleTimeoutSec", m_dimScreenTime, KConfigGroup::Notify);
|
|
|
|
|
lowBatteryGroup.group("Display").writeEntry("DimDisplayWhenIdle", m_dimScreen, KConfigGroup::Notify);
|
|
|
|
|
lowBatteryGroup.group("Display").writeEntry("DimDisplayIdleTimeoutSec", m_dimScreenTime, KConfigGroup::Notify);
|
2023-03-14 01:45:47 +00:00
|
|
|
|
2024-01-02 19:17:41 +00:00
|
|
|
acGroup.group("Display").writeEntry("TurnOffDisplayWhenIdle", m_screenOff, KConfigGroup::Notify);
|
|
|
|
|
acGroup.group("Display").writeEntry("TurnOffDisplayIdleTimeoutSec", m_screenOffTime, KConfigGroup::Notify);
|
|
|
|
|
batteryGroup.group("Display").writeEntry("TurnOffDisplayWhenIdle", m_screenOff, KConfigGroup::Notify);
|
|
|
|
|
batteryGroup.group("Display").writeEntry("TurnOffDisplayIdleTimeoutSec", m_screenOffTime, KConfigGroup::Notify);
|
|
|
|
|
lowBatteryGroup.group("Display").writeEntry("TurnOffDisplayWhenIdle", m_screenOff, KConfigGroup::Notify);
|
|
|
|
|
lowBatteryGroup.group("Display").writeEntry("TurnOffDisplayIdleTimeoutSec", m_screenOffTime, KConfigGroup::Notify);
|
2023-03-14 01:45:47 +00:00
|
|
|
|
2024-01-02 19:17:41 +00:00
|
|
|
acGroup.group("SuspendAndShutdown").writeEntry("AutoSuspendIdleTimeoutSec", m_suspendSessionTime, KConfigGroup::Notify);
|
|
|
|
|
batteryGroup.group("SuspendAndShutdown").writeEntry("AutoSuspendIdleTimeoutSec", m_suspendSessionTime, KConfigGroup::Notify);
|
|
|
|
|
lowBatteryGroup.group("SuspendAndShutdown").writeEntry("AutoSuspendIdleTimeoutSec", m_suspendSessionTime, KConfigGroup::Notify);
|
2023-03-14 01:45:47 +00:00
|
|
|
|
|
|
|
|
m_profilesConfig->sync();
|
2024-06-14 07:38:14 +00:00
|
|
|
|
|
|
|
|
QDBusMessage call =
|
|
|
|
|
QDBusMessage::createMethodCall("org.kde.Solid.PowerManagement", "/org/kde/Solid/PowerManagement", "org.kde.Solid.PowerManagement", "refreshStatus");
|
|
|
|
|
QDBusConnection::sessionBus().asyncCall(call);
|
2023-03-14 01:45:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QStringList MobilePower::timeOptions() const
|
|
|
|
|
{
|
|
|
|
|
return timeValues;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MobilePower::setDimScreenIdx(int idx)
|
|
|
|
|
{
|
2024-01-02 19:17:41 +00:00
|
|
|
qreal value = idxToSeconds.value(idx);
|
2023-03-14 01:45:47 +00:00
|
|
|
qDebug() << "Got the value" << value;
|
|
|
|
|
|
|
|
|
|
if (m_dimScreenTime == value) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (value == 0) {
|
|
|
|
|
qDebug() << "Setting to never dim";
|
2024-01-02 19:17:41 +00:00
|
|
|
m_dimScreen = false;
|
2023-03-14 01:45:47 +00:00
|
|
|
} else {
|
|
|
|
|
qDebug() << "Setting to dim in " << value << "Minutes";
|
2024-01-02 19:17:41 +00:00
|
|
|
m_dimScreen = true;
|
2023-03-14 01:45:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_dimScreenTime = value;
|
|
|
|
|
Q_EMIT dimScreenIdxChanged();
|
|
|
|
|
save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MobilePower::setScreenOffIdx(int idx)
|
|
|
|
|
{
|
2024-01-02 19:17:41 +00:00
|
|
|
qreal value = idxToSeconds.value(idx);
|
2023-03-14 01:45:47 +00:00
|
|
|
qDebug() << "Got the value" << value;
|
|
|
|
|
|
|
|
|
|
if (m_screenOffTime == value) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (value == 0) {
|
|
|
|
|
qDebug() << "Setting to never screen off";
|
2024-01-02 19:17:41 +00:00
|
|
|
m_screenOff = false;
|
2023-03-14 01:45:47 +00:00
|
|
|
} else {
|
|
|
|
|
qDebug() << "Setting to screen off in " << value << "Minutes";
|
2024-01-02 19:17:41 +00:00
|
|
|
m_screenOff = true;
|
2023-03-14 01:45:47 +00:00
|
|
|
}
|
|
|
|
|
m_screenOffTime = value;
|
|
|
|
|
|
|
|
|
|
Q_EMIT screenOffIdxChanged();
|
|
|
|
|
save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MobilePower::setSuspendSessionIdx(int idx)
|
|
|
|
|
{
|
2024-01-02 19:17:41 +00:00
|
|
|
qreal value = idxToSeconds.value(idx);
|
2023-03-14 01:45:47 +00:00
|
|
|
qDebug() << "Got the value" << value;
|
|
|
|
|
|
|
|
|
|
if (m_suspendSessionTime == value) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (value == 0) {
|
|
|
|
|
qDebug() << "Setting to never suspend";
|
|
|
|
|
} else {
|
|
|
|
|
qDebug() << "Setting to suspend in " << value << "Minutes";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_suspendSessionTime = value;
|
|
|
|
|
Q_EMIT suspendSessionIdxChanged();
|
|
|
|
|
save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int MobilePower::suspendSessionIdx()
|
|
|
|
|
{
|
|
|
|
|
if (m_suspendSessionTime == 0) {
|
|
|
|
|
return NEVER;
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-02 19:17:41 +00:00
|
|
|
return idxToSeconds.key(std::round(m_suspendSessionTime));
|
2023-03-14 01:45:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int MobilePower::dimScreenIdx()
|
|
|
|
|
{
|
2024-01-02 19:17:41 +00:00
|
|
|
if (!m_dimScreen) {
|
2023-03-14 01:45:47 +00:00
|
|
|
return NEVER;
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-02 19:17:41 +00:00
|
|
|
return idxToSeconds.key(std::round(m_dimScreenTime));
|
2023-03-14 01:45:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int MobilePower::screenOffIdx()
|
|
|
|
|
{
|
2024-01-02 19:17:41 +00:00
|
|
|
if (!m_screenOff) {
|
2023-03-14 01:45:47 +00:00
|
|
|
return NEVER;
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-02 19:17:41 +00:00
|
|
|
return idxToSeconds.key(std::round(m_screenOffTime));
|
2023-03-14 01:45:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BatteryModel *MobilePower::batteries()
|
|
|
|
|
{
|
|
|
|
|
return m_batteries;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#include "mobilepower.moc"
|