File indexing completed on 2024-05-12 05:35:37

0001 /*
0002  *  SPDX-FileCopyrightText: 2015-2016 Ivan Cukic <ivan.cukic@kde.org>
0003  *  SPDX-FileCopyrightText: 2023 Ismael Asensio <isma.af@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006  */
0007 
0008 #include "activityconfig.h"
0009 
0010 #include "utils/continue_with.h"
0011 
0012 #include <PlasmaActivities/Info>
0013 
0014 #include <KConfig>
0015 #include <KConfigGroup>
0016 #include <KGlobalAccel>
0017 #include <KLocalizedString>
0018 
0019 #include <QAction>
0020 #include <QDBusConnection>
0021 #include <QDBusPendingCallWatcher>
0022 #include <QDBusPendingReply>
0023 
0024 ActivityConfig::ActivityConfig(QObject *parent)
0025     : QObject(parent)
0026 {
0027     reset();
0028 }
0029 
0030 ActivityConfig::~ActivityConfig()
0031 {
0032 }
0033 
0034 void ActivityConfig::reset()
0035 {
0036     m_name = QString();
0037     m_description = QString();
0038     m_iconName = QStringLiteral("activities");
0039     m_private = false;
0040     m_shortcut = QKeySequence();
0041     m_inhibitScreen = false;
0042     m_inhibitSleep = false;
0043 }
0044 
0045 QString ActivityConfig::activityId() const
0046 {
0047     return m_activityId;
0048 }
0049 
0050 void ActivityConfig::setActivityId(const QString &activityId)
0051 {
0052     if (activityId == m_activityId) {
0053         return;
0054     }
0055 
0056     m_activityId = activityId;
0057     Q_EMIT activityIdChanged();
0058 
0059     load();
0060 }
0061 
0062 bool ActivityConfig::isSaveNeeded()
0063 {
0064     KActivities::Info activityInfo(m_activityId);
0065     if (activityInfo.name() != m_name || activityInfo.description() != m_description || activityInfo.icon() != m_iconName) {
0066         return true;
0067     }
0068 
0069     const auto shortcuts = KGlobalAccel::self()->globalShortcut(QStringLiteral("ActivityManager"), QStringLiteral("switch-to-activity-%1").arg(m_activityId));
0070     QKeySequence savedShortcut = shortcuts.isEmpty() ? QKeySequence() : shortcuts.first();
0071     if (savedShortcut != m_shortcut) {
0072         return true;
0073     }
0074 
0075     // The private state is retrieved/set via DBus. We store it in a member variable for convenience
0076     if (m_private != m_savedPrivate) {
0077         return true;
0078     }
0079 
0080     if (m_inhibitScreen != m_savedInhibitScreen) {
0081         return true;
0082     }
0083 
0084     if (m_inhibitSleep != m_savedInhibitSleep) {
0085         return true;
0086     }
0087 
0088     return false;
0089 }
0090 
0091 void ActivityConfig::load()
0092 {
0093     if (m_activityId.isEmpty()) {
0094         reset();
0095         Q_EMIT infoChanged();
0096         return;
0097     }
0098 
0099     KActivities::Info activityInfo(m_activityId);
0100     m_name = activityInfo.name();
0101     m_description = activityInfo.description();
0102     m_iconName = activityInfo.icon();
0103 
0104     // finding the key shortcut
0105     const auto shortcuts = KGlobalAccel::self()->globalShortcut(QStringLiteral("ActivityManager"), QStringLiteral("switch-to-activity-%1").arg(m_activityId));
0106     m_shortcut = shortcuts.isEmpty() ? QKeySequence() : shortcuts.first();
0107 
0108     // Get "isPrivate" property via DBus
0109     QDBusMessage message = QDBusMessage::createMethodCall(QStringLiteral("org.kde.ActivityManager"),
0110                                                           QStringLiteral("/ActivityManager/Features"),
0111                                                           QStringLiteral("org.kde.ActivityManager.Features"),
0112                                                           QStringLiteral("GetValue"));
0113     message.setArguments({QStringLiteral("org.kde.ActivityManager.Resources.Scoring/isOTR/%1").arg(m_activityId)});
0114 
0115     QDBusPendingCall result = QDBusConnection::sessionBus().asyncCall(message);
0116     auto watcher = new QDBusPendingCallWatcher(result, this);
0117     QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [&](QDBusPendingCallWatcher *watcher) mutable {
0118         QDBusPendingReply<QDBusVariant> reply = *watcher;
0119         m_private = false;
0120         if (!reply.isError()) {
0121             m_private = reply.value().variant().toBool();
0122         }
0123         m_savedPrivate = m_private;
0124         Q_EMIT infoChanged();
0125         watcher->deleteLater();
0126     });
0127 
0128     KConfig powerdevilConfig("powerdevilrc");
0129     KConfigGroup activityGroup = powerdevilConfig.group(QStringLiteral("Activities")).group(m_activityId);
0130     m_inhibitScreen = activityGroup.readEntry("InhibitScreenManagement", false);
0131     m_savedInhibitScreen = m_inhibitScreen;
0132     m_inhibitSleep = activityGroup.readEntry("InhibitSuspend", false);
0133     m_savedInhibitSleep = m_inhibitSleep;
0134 
0135     Q_EMIT infoChanged();
0136 }
0137 
0138 void ActivityConfig::save()
0139 {
0140     if (m_activityId.isEmpty()) {
0141         createActivity();
0142         return;
0143     }
0144 
0145     m_activities.setActivityName(m_activityId, m_name);
0146     m_activities.setActivityDescription(m_activityId, m_description);
0147     m_activities.setActivityIcon(m_activityId, m_iconName);
0148 
0149     // setting the key shortcut
0150     QAction action(nullptr);
0151     action.setProperty("isConfigurationAction", true);
0152     action.setProperty("componentName", QStringLiteral("ActivityManager"));
0153     action.setObjectName(QStringLiteral("switch-to-activity-%1").arg(m_activityId));
0154     KGlobalAccel::self()->setShortcut(&action, {m_shortcut}, KGlobalAccel::NoAutoloading);
0155 
0156     // Set "isPrivate" property via DBus
0157     QDBusMessage message = QDBusMessage::createMethodCall(QStringLiteral("org.kde.ActivityManager"),
0158                                                           QStringLiteral("/ActivityManager/Features"),
0159                                                           QStringLiteral("org.kde.ActivityManager.Features"),
0160                                                           QStringLiteral("SetValue"));
0161     message.setArguments({
0162         QStringLiteral("org.kde.ActivityManager.Resources.Scoring/isOTR/%1").arg(m_activityId),
0163         QVariant::fromValue(QDBusVariant(m_private)),
0164     });
0165     QDBusConnection::sessionBus().asyncCall(message);
0166 
0167     KConfig powerdevilConfig("powerdevilrc");
0168     KConfigGroup activityGroup = powerdevilConfig.group(QStringLiteral("Activities")).group(m_activityId);
0169     activityGroup.writeEntry("InhibitScreenManagement", m_inhibitScreen);
0170     m_savedInhibitScreen = m_inhibitScreen;
0171     activityGroup.writeEntry("InhibitSuspend", m_inhibitSleep);
0172     m_savedInhibitSleep = m_inhibitSleep;
0173 }
0174 
0175 void ActivityConfig::createActivity()
0176 {
0177     using namespace kamd::utils;
0178     continue_with(KActivities::Controller().addActivity(m_name), [this](const optional_view<QString> &activityId) {
0179         if (activityId.is_initialized()) {
0180             m_activityId = activityId.get();
0181             save();
0182         }
0183     });
0184 }