File indexing completed on 2024-04-28 05:26:47

0001 /*
0002  *   SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "NotifierItem.h"
0008 #include "updatessettings.h"
0009 #include <KLocalizedString>
0010 #include <QDebug>
0011 #include <QMenu>
0012 
0013 NotifierItem::NotifierItem()
0014 {
0015     connect(&m_notifier, &DiscoverNotifier::stateChanged, this, &NotifierItem::refreshStatusNotifierVisibility);
0016 }
0017 
0018 void NotifierItem::setupNotifierItem()
0019 {
0020     Q_ASSERT(!m_item);
0021     m_item = new KStatusNotifierItem(QStringLiteral("org.kde.DiscoverNotifier"), this);
0022     m_item->setTitle(i18n("Updates"));
0023     m_item->setToolTipTitle(i18n("Updates"));
0024 
0025     connect(m_item, &KStatusNotifierItem::activateRequested, &m_notifier, [this]() {
0026         if (m_notifier.needsReboot()) {
0027             m_notifier.reboot();
0028         } else {
0029             m_notifier.showDiscoverUpdates(m_item->providedToken());
0030         }
0031     });
0032 
0033     QMenu *menu = new QMenu;
0034     connect(m_item, &QObject::destroyed, menu, &QObject::deleteLater);
0035     auto discoverAction = menu->addAction(QIcon::fromTheme(QStringLiteral("plasmadiscover")), i18n("Open Discover…"));
0036     connect(discoverAction, &QAction::triggered, &m_notifier, [this] {
0037         m_notifier.showDiscover(m_item->providedToken());
0038     });
0039 
0040     auto updatesAction = menu->addAction(QIcon::fromTheme(QStringLiteral("system-software-update")), i18n("See Updates…"));
0041     connect(updatesAction, &QAction::triggered, &m_notifier, [this] {
0042         m_notifier.showDiscoverUpdates(m_item->providedToken());
0043     });
0044 
0045     auto refreshAction = menu->addAction(QIcon::fromTheme(QStringLiteral("view-refresh")), i18n("Refresh…"));
0046     connect(refreshAction, &QAction::triggered, &m_notifier, &DiscoverNotifier::recheckSystemUpdateNeeded);
0047 
0048     auto f = [this]() {
0049         m_item->setTitle(i18n("Restart to apply installed updates"));
0050         m_item->setToolTipTitle(i18n("Click to restart the device"));
0051         m_item->setIconByName(QStringLiteral("view-refresh"));
0052     };
0053     if (m_notifier.needsReboot())
0054         f();
0055     else
0056         connect(&m_notifier, &DiscoverNotifier::needsRebootChanged, menu, f);
0057 
0058     connect(&m_notifier, &DiscoverNotifier::newUpgradeAction, menu, [menu](UpgradeAction *a) {
0059         QAction *action = new QAction(a->description(), menu);
0060         connect(action, &QAction::triggered, a, &UpgradeAction::trigger);
0061         menu->addAction(action);
0062     });
0063     m_item->setContextMenu(menu);
0064     m_item->setStatus(KStatusNotifierItem::Active);
0065     refresh();
0066 }
0067 
0068 void NotifierItem::refreshStatusNotifierVisibility()
0069 {
0070     bool shouldShow = shouldShowStatusNotifier();
0071     if (!m_item && shouldShow) {
0072         setStatusNotifierVisibility(true);
0073     } else if (m_item && !shouldShow) {
0074         setStatusNotifierVisibility(false);
0075     }
0076     refresh();
0077 }
0078 
0079 void NotifierItem::setStatusNotifierEnabled(bool enabled)
0080 {
0081     m_statusNotifierEnabled = enabled;
0082     refreshStatusNotifierVisibility();
0083 }
0084 
0085 void NotifierItem::refresh()
0086 {
0087     if (!m_item) {
0088         return;
0089     }
0090     m_item->setIconByName(m_notifier.iconName());
0091     m_item->setToolTipSubTitle(m_notifier.message());
0092 }
0093 
0094 void NotifierItem::setStatusNotifierVisibility(bool visible)
0095 {
0096     if (visible) {
0097         Q_ASSERT(!m_item);
0098         setupNotifierItem();
0099     } else {
0100         Q_ASSERT(m_item);
0101         delete m_item;
0102     }
0103 }
0104 
0105 bool NotifierItem::shouldShowStatusNotifier() const
0106 {
0107     if (!isStatusNotifierEnabled()) {
0108         return false;
0109     }
0110 
0111     // Only show the status notifier if there is something to notify about
0112     // BUG: 413053
0113     switch (m_notifier.state()) {
0114     case DiscoverNotifier::Busy:
0115     case DiscoverNotifier::RebootRequired:
0116         return true;
0117     case DiscoverNotifier::NormalUpdates:
0118     case DiscoverNotifier::SecurityUpdates:
0119         return m_notifier.settings()->requiredNotificationInterval() > 0;
0120     case DiscoverNotifier::Offline:
0121     case DiscoverNotifier::NoUpdates:
0122     default:
0123         return false;
0124     }
0125 }