File indexing completed on 2024-04-21 05:50:56

0001 /*
0002  * SPDX-FileCopyrightText: 2020 Dimitris Kardarakos <dimkard@posteo.net>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "calalarmclient.h"
0008 #include "alarmnotification.h"
0009 #include "alarmsmodel.h"
0010 #include "notificationhandler.h"
0011 #include "kongressacadaptor.h"
0012 #include "solidwakeupbackend.h"
0013 #include "wakeupmanager.h"
0014 #include <QDebug>
0015 #include <KSharedConfig>
0016 #include <KConfigGroup>
0017 #include <KLocalizedString>
0018 
0019 CalAlarmClient::CalAlarmClient(QObject *parent)
0020     : QObject {parent},  m_notification_handler {new NotificationHandler {this}}, m_wakeup_manager {new WakeupManager {this}}
0021 {
0022     new KongressacAdaptor {this};
0023     auto dbus = QDBusConnection::sessionBus();
0024     dbus.registerObject("/kongressac", this);
0025 
0026     KConfigGroup generalGroup {KSharedConfig::openConfig(), "General"};
0027     m_last_checked = generalGroup.readEntry("CalendarsLastChecked", QDateTime {});
0028 
0029     qDebug() << "CalAlarmClient:\tLastChecked:" << m_last_checked.toString("dd.MM.yyyy hh:mm:ss");
0030 
0031     checkAlarms();
0032 
0033     if ((m_wakeup_manager != nullptr) && (m_wakeup_manager->active())) {
0034         qDebug() << "CalAlarmClient: wake up manager offers an active backend with wakeup features";
0035         connect(m_wakeup_manager, &WakeupManager::wakeupAlarmClient, this, &CalAlarmClient::wakeupCallback);
0036         scheduleAlarmCheck();
0037     }
0038 }
0039 
0040 QStringList CalAlarmClient::calendarFileList() const
0041 {
0042     QStringList filesList {};
0043     KConfigGroup kongressCfgGeneral {KSharedConfig::openConfig("kongressrc"), "general"};
0044     auto calendars = kongressCfgGeneral.readEntry("favoritesCalendars", QString {});
0045     auto calendarList = calendars.split(";");
0046 
0047     for (const auto &c : calendarList) {
0048         auto fileName = KSharedConfig::openConfig("kongressrc")->group(c).readEntry("file");
0049 
0050         if (!(fileName.isNull())) {
0051             filesList.append(fileName);
0052         }
0053     }
0054 
0055     qDebug() << "\ncalendarFileList:\tKongress calendars:" << filesList.join(",");
0056 
0057     return filesList;
0058 }
0059 
0060 void CalAlarmClient::checkAlarms()
0061 {
0062     KConfigGroup cfg {KSharedConfig::openConfig(), "General"};
0063 
0064     if (!cfg.readEntry("Enabled", true)) {
0065         return;
0066     }
0067     auto checkFrom = m_last_checked.addSecs(1);
0068     m_last_checked = QDateTime::currentDateTime();
0069 
0070     qDebug() << "\ncheckAlarms:Check:" << checkFrom.toString() << " -" << m_last_checked.toString();
0071 
0072     FilterPeriod fPeriod {.from = checkFrom, .to = m_last_checked};
0073     AlarmsModel alarmsModel;
0074     alarmsModel.setCalendarFiles(calendarFileList());
0075     alarmsModel.setPeriod(fPeriod);
0076 
0077     const auto alarms = alarmsModel.alarms();
0078     qDebug() << "checkAlarms:Alarms Found: " << alarms.count();
0079 
0080     KConfigGroup notificationsConfig {KSharedConfig::openConfig("kongressrc"), "notifications"};
0081 
0082     if (notificationsConfig.readEntry("remindFavorites", true)) {
0083         for (const auto &alarm : std::as_const(alarms)) {
0084             m_notification_handler->addActiveNotification(alarm->parentUid(), QString {"%1\n%2"}.arg(alarm->time().toTimeZone(QTimeZone::systemTimeZone()).toString("hh:mm"), alarm->text()));
0085         }
0086         m_notification_handler->sendNotifications();
0087     }
0088 
0089     saveLastCheckTime();
0090 }
0091 
0092 void CalAlarmClient::saveLastCheckTime()
0093 {
0094     KConfigGroup generalGroup {KSharedConfig::openConfig(), "General"};
0095     generalGroup.writeEntry("CalendarsLastChecked", m_last_checked);
0096     KSharedConfig::openConfig()->sync();
0097 }
0098 
0099 void CalAlarmClient::quit()
0100 {
0101     saveLastCheckTime();
0102     qDebug("\nquit");
0103     qApp->quit();
0104 }
0105 
0106 void CalAlarmClient::forceAlarmCheck()
0107 {
0108     checkAlarms();
0109     saveLastCheckTime();
0110 }
0111 
0112 QString CalAlarmClient::alarmText(const QString &uid) const
0113 {
0114     AlarmsModel model {};
0115     model.setCalendarFiles(calendarFileList());
0116     model.setPeriod({.from = QDateTime {}, .to = QDateTime::currentDateTime()});
0117     const auto alarms = model.alarms();
0118 
0119     for (const auto &alarm : std::as_const(alarms)) {
0120         if (alarm->parentUid() == uid) {
0121             return alarm->text();
0122         }
0123     }
0124 
0125     return QString {};
0126 }
0127 
0128 void CalAlarmClient::scheduleAlarmCheck()
0129 {
0130     if ((m_wakeup_manager == nullptr) || !(m_wakeup_manager->active())) {
0131         return;
0132     }
0133 
0134     AlarmsModel model {};
0135     model.setCalendarFiles(calendarFileList());
0136     model.setPeriod({.from =  m_last_checked.addSecs(1), .to = m_last_checked.addDays(1)});
0137 
0138     auto wakeupAt = model.firstAlarmTime();
0139     qDebug() << "scheduleAlarmCheck:" << "Shecdule next alarm check at" << wakeupAt.toString("dd.MM.yyyy hh:mm:ss");
0140     m_wakeup_manager->scheduleWakeup(wakeupAt.addSecs(1));
0141 }
0142 
0143 void CalAlarmClient::wakeupCallback()
0144 {
0145     checkAlarms();
0146     scheduleAlarmCheck();
0147 }
0148 
0149 int CalAlarmClient::active() const
0150 {
0151     if ((m_wakeup_manager != nullptr) && (m_wakeup_manager->active())) {
0152         return CalAlarmClient::CheckerStatus::Active;
0153     }
0154 
0155     return CalAlarmClient::CheckerStatus::Inactive;
0156 }
0157 
0158 #include "moc_calalarmclient.cpp"