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"