File indexing completed on 2024-05-12 17:06:42

0001 /***************************************************************************
0002  *                                                                         *
0003  *   SPDX-FileCopyrightText: 2021 Aditya Mehra <aix.m@outlook.com>         *
0004  *   SPDX-FileCopyrightText: 2015 Sebastian Kügler <sebas@kde.org>         *
0005  *                                                                         *
0006  *   SPDX-License-Identifier: GPL-2.0-or-later                             *
0007  ***************************************************************************/
0008 
0009 #include "bigscreensettings.h"
0010 #include "themelistmodel.h"
0011 
0012 #include <QQuickItem>
0013 #include <QDBusConnection>
0014 #include <QDBusMessage>
0015 
0016 #include <KAboutData>
0017 #include <KLocalizedString>
0018 #include <KPluginFactory>
0019 
0020 #include <Plasma/Svg>
0021 #include <Plasma/Theme>
0022 
0023 #include "timedated_interface.h"
0024 
0025 BigscreenSettings::BigscreenSettings(QObject *parent, const QVariantList &args)
0026     : KQuickAddons::ConfigModule(parent, args)
0027     , m_themeListModel(new ThemeListModel(this))
0028 {
0029     KAboutData *about = new KAboutData(QStringLiteral("kcm_mediacenter_bigscreen_settings"), //
0030                                        i18n("Appearance"),
0031                                        QStringLiteral("2.0"),
0032                                        QString(),
0033                                        KAboutLicense::LGPL);
0034     setAboutData(about);
0035     setButtons(Apply | Default);
0036 
0037     qmlRegisterAnonymousType<ThemeListModel>("ThemeListModel", 1);
0038     m_theme = new Plasma::Theme(this);
0039     m_theme->setUseGlobalSettings(true);
0040     m_themeName = m_theme->themeName();
0041 
0042     OrgFreedesktopTimedate1Interface timedateIface(QStringLiteral("org.freedesktop.timedate1"),
0043                                                    QStringLiteral("/org/freedesktop/timedate1"),
0044                                                    QDBusConnection::systemBus());
0045     m_useNtp = timedateIface.nTP();
0046 }
0047 
0048 void BigscreenSettings::load()
0049 {
0050 }
0051 
0052 void BigscreenSettings::applyPlasmaTheme(QQuickItem *item, const QString &themeName)
0053 {
0054     if (!item) {
0055         return;
0056     }
0057 
0058     Plasma::Theme *theme = m_themes[themeName];
0059     if (!theme) {
0060         theme = new Plasma::Theme(themeName, this);
0061         m_themes[themeName] = theme;
0062     }
0063 
0064     Q_FOREACH (Plasma::Svg *svg, item->findChildren<Plasma::Svg *>()) {
0065         svg->setTheme(theme);
0066         svg->setUsingRenderingCache(false);
0067     }
0068 }
0069 
0070 BigscreenSettings::~BigscreenSettings() = default;
0071 
0072 void BigscreenSettings::setThemeName(const QString &theme)
0073 {
0074     if (theme != m_themeName) {
0075         m_themeName = theme;
0076         m_theme->setThemeName(theme);
0077         emit themeNameChanged();
0078     }
0079 }
0080 
0081 QString BigscreenSettings::themeName() const
0082 {
0083     return m_themeName;
0084 }
0085 
0086 ThemeListModel *BigscreenSettings::themeListModel()
0087 {
0088     return m_themeListModel;
0089 }
0090 
0091 bool BigscreenSettings::useColoredTiles()
0092 {
0093     QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.biglauncher", "/BigLauncher", "", "coloredTilesActive");
0094     QDBusMessage response = QDBusConnection::sessionBus().call(msg);
0095     QList<QVariant> responseArg = response.arguments();
0096     return responseArg.at(0).toBool();
0097 }
0098 
0099 bool BigscreenSettings::useExpandingTiles()
0100 {
0101     QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.biglauncher", "/BigLauncher", "", "expandableTilesActive");
0102     QDBusMessage response = QDBusConnection::sessionBus().call(msg);
0103     QList<QVariant> responseArg = response.arguments();
0104     return responseArg.at(0).toBool();
0105 }
0106 
0107 bool BigscreenSettings::mycroftIntegrationActive()
0108 {
0109     QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.biglauncher", "/BigLauncher", "", "mycroftIntegrationActive");
0110     QDBusMessage response = QDBusConnection::sessionBus().call(msg);
0111     QList<QVariant> responseArg = response.arguments();
0112     return responseArg.at(0).toBool();
0113 }
0114 
0115 bool BigscreenSettings::pmInhibitionActive()
0116 {
0117     QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.biglauncher", "/BigLauncher", "", "pmInhibitionActive");
0118     QDBusMessage response = QDBusConnection::sessionBus().call(msg);
0119     QList<QVariant> responseArg = response.arguments();
0120     return responseArg.at(0).toBool();
0121 }
0122 
0123 void BigscreenSettings::setUseColoredTiles(bool useColoredTiles)
0124 {
0125     QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.biglauncher", "/BigLauncher", "", "useColoredTiles");
0126     msg << useColoredTiles;
0127     QDBusConnection::sessionBus().send(msg);
0128 }
0129 
0130 void BigscreenSettings::setUseExpandingTiles(bool useExpandingTiles)
0131 {
0132     QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.biglauncher", "/BigLauncher", "", "useExpandableTiles");
0133     msg << useExpandingTiles;
0134     QDBusConnection::sessionBus().send(msg);
0135 }
0136 
0137 void BigscreenSettings::setMycroftIntegrationActive(bool mycroftIntegrationActive)
0138 {
0139     QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.biglauncher", "/BigLauncher", "", "enableMycroftIntegration");
0140     msg << mycroftIntegrationActive;
0141     QDBusConnection::sessionBus().send(msg);
0142 }
0143 
0144 void BigscreenSettings::setPmInhibitionActive(bool pmInhibitionActive)
0145 {
0146     QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.biglauncher", "/BigLauncher", "", "enablePmInhibition");
0147     msg << pmInhibitionActive;
0148     QDBusConnection::sessionBus().send(msg);
0149 }
0150 
0151 void BigscreenSettings::saveTimeZone(const QString &newtimezone)
0152 {
0153     qDebug() << "Saving timezone to config: " << newtimezone;
0154     OrgFreedesktopTimedate1Interface timedateIface(QStringLiteral("org.freedesktop.timedate1"),
0155                                                    QStringLiteral("/org/freedesktop/timedate1"),
0156                                                    QDBusConnection::systemBus());
0157 
0158     if (!newtimezone.isEmpty()) {
0159         qDebug() << "Setting timezone: " << newtimezone;
0160         auto reply = timedateIface.SetTimezone(newtimezone, true);
0161         reply.waitForFinished();
0162         if (reply.isError()) {
0163             qDebug() << "Failed to set timezone" << reply.error().name() << reply.error().message();
0164         }
0165     }
0166 }
0167 
0168 void BigscreenSettings::setCurrentTime(const QTime &currentTime)
0169 {
0170     if (m_currentTime != currentTime) {
0171         m_currentTime = currentTime;
0172         emit currentTimeChanged();
0173     }
0174 }
0175 
0176 
0177 void BigscreenSettings::setCurrentDate(const QDate &currentDate)
0178 {
0179     if (m_currentDate != currentDate) {
0180         m_currentDate = currentDate;
0181         emit currentDateChanged();
0182     }
0183 }
0184 
0185 QTime BigscreenSettings::currentTime()
0186 {
0187     return m_currentTime;
0188 }
0189 
0190 
0191 QDate BigscreenSettings::currentDate()
0192 {
0193     return m_currentDate;
0194 }
0195 
0196 bool BigscreenSettings::useNtp()
0197 {
0198     return m_useNtp;
0199 }
0200 
0201 void BigscreenSettings::setUseNtp(bool ntp)
0202 {
0203     if (m_useNtp != ntp) {
0204         m_useNtp = ntp;
0205         saveTime();
0206         emit useNtpChanged();
0207     }
0208 }
0209 
0210 bool BigscreenSettings::saveTime()
0211 {
0212     OrgFreedesktopTimedate1Interface timedateIface(QStringLiteral("org.freedesktop.timedate1"),
0213                                                    QStringLiteral("/org/freedesktop/timedate1"),
0214                                                    QDBusConnection::systemBus());
0215 
0216     bool rc = true;
0217     // final arg in each method is "user-interaction" i.e whether it's OK for polkit to ask for auth
0218 
0219     // we cannot send requests up front then block for all replies as we need NTP to be disabled before we can make a call to SetTime
0220     // timedated processes these in parallel and will return an error otherwise
0221 
0222     auto reply = timedateIface.SetNTP(m_useNtp, true);
0223     reply.waitForFinished();
0224     if (reply.isError()) {
0225         qWarning() << "Failed to enable NTP" << reply.error().name() << reply.error().message();
0226         rc = false;
0227     }
0228 
0229     if (!useNtp()) {
0230         QDateTime userTime;
0231         userTime.setTime(currentTime());
0232         userTime.setDate(currentDate());
0233         qDebug() << "Setting userTime: " << userTime;
0234         qint64 timeDiff = userTime.toMSecsSinceEpoch() - QDateTime::currentMSecsSinceEpoch();
0235         auto reply = timedateIface.SetTime(timeDiff * 1000, true, true);
0236         reply.waitForFinished();
0237         if (reply.isError()) {
0238             qWarning() << "Failed to set current time" << reply.error().name() << reply.error().message();
0239             rc = false;
0240         }
0241     }
0242     return rc;
0243 }
0244 
0245 K_PLUGIN_FACTORY_WITH_JSON(BigscreenSettingsFactory, "bigscreensettings.json", registerPlugin<BigscreenSettings>();)
0246 
0247 #include "bigscreensettings.moc"
0248 #include "moc_bigscreensettings.cpp"