File indexing completed on 2024-05-12 05:10:41

0001 // SPDX-FileCopyrightText: 2021 Claudio Cambra <claudio.cambra@gmail.com>
0002 // SPDX-License-Identifier: LGPL-2.1-or-later
0003 
0004 #pragma once
0005 
0006 #include <QDateTime>
0007 #include <QHash>
0008 #include <QTimer>
0009 
0010 #include <Akonadi/ETMCalendar>
0011 #include <Akonadi/EntityTreeModel>
0012 #include <Akonadi/ServerManager>
0013 
0014 #include <chrono>
0015 
0016 class AlarmNotification;
0017 
0018 class KalendarAlarmClient : public QObject
0019 {
0020     Q_OBJECT
0021 
0022 public:
0023     explicit KalendarAlarmClient(QObject *parent = nullptr);
0024     ~KalendarAlarmClient() override;
0025 
0026     /** Dismisses any further notification display for the alarm \p notification. */
0027     void dismiss(AlarmNotification *notification);
0028     /** Suspends the display of the alarm \p notification. */
0029     void suspend(AlarmNotification *notification, std::chrono::seconds sec);
0030     /** Show incidence in the calendar application. */
0031     void showIncidence(const QString &uid, const QDateTime &occurrence, const QString &xdgActivationToken);
0032 
0033 private:
0034     void deferredInit();
0035     void restoreSuspendedFromConfig();
0036     void storeNotification(AlarmNotification *notification);
0037     void removeNotification(AlarmNotification *notification);
0038     void addNotification(const QString &uid, const QString &text, const QDateTime &occurrence, const QDateTime &remindTime, bool wasSuspended);
0039     void checkAlarms();
0040     void setupAkonadi();
0041     [[nodiscard]] bool collectionsAvailable() const;
0042     void saveLastCheckTime();
0043     [[nodiscard]] QDateTime
0044     occurrenceForAlarm(const KCalendarCore::Incidence::Ptr &incidence, const KCalendarCore::Alarm::Ptr &alarm, const QDateTime &from) const;
0045 
0046     Akonadi::ETMCalendar::Ptr mCalendar;
0047     Akonadi::EntityTreeModel *mETM = nullptr;
0048 
0049     QDateTime mLastChecked;
0050     QTimer mCheckTimer;
0051     QHash<QString, AlarmNotification *> m_notifications;
0052 };