File indexing completed on 2025-03-09 04:54:38

0001 /*
0002     SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net
0003     SPDX-FileContributor: Tobias Koenig <tokoe@kdab.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "markmessagereadhandler.h"
0009 
0010 #include "settings/messageviewersettings.h"
0011 
0012 #include <Akonadi/ItemModifyJob>
0013 #include <Akonadi/MessageFlags>
0014 #include <Akonadi/Session>
0015 
0016 #include <QTimer>
0017 
0018 using namespace MessageViewer;
0019 Q_GLOBAL_STATIC(Akonadi::Item::List, sListItem)
0020 
0021 class MarkMessageReadHandler::MarkMessageReadHandlerPrivate
0022 {
0023 public:
0024     MarkMessageReadHandlerPrivate(MarkMessageReadHandler *qq)
0025         : q(qq)
0026     {
0027     }
0028 
0029     void handleMessages();
0030 
0031     MarkMessageReadHandler *const q;
0032     Akonadi::Item mItemQueue;
0033     QTimer mTimer;
0034 };
0035 
0036 void MarkMessageReadHandler::MarkMessageReadHandlerPrivate::handleMessages()
0037 {
0038     Akonadi::Item item = mItemQueue;
0039 
0040     // mark as read
0041     item.setFlag(Akonadi::MessageFlags::Seen);
0042 
0043     auto modifyJob = new Akonadi::ItemModifyJob(item, q->session());
0044     modifyJob->disableRevisionCheck();
0045     modifyJob->setIgnorePayload(true);
0046     sListItem->removeAll(item);
0047 }
0048 
0049 MarkMessageReadHandler::MarkMessageReadHandler(QObject *parent)
0050     : QObject(parent)
0051     , d(new MarkMessageReadHandlerPrivate(this))
0052 {
0053     d->mTimer.setSingleShot(true);
0054     connect(&d->mTimer, &QTimer::timeout, this, [this]() {
0055         d->handleMessages();
0056     });
0057 }
0058 
0059 MarkMessageReadHandler::~MarkMessageReadHandler()
0060 {
0061     if (d->mTimer.isActive()) {
0062         d->mTimer.stop();
0063     }
0064 }
0065 
0066 void MarkMessageReadHandler::setItem(const Akonadi::Item &item)
0067 {
0068     if (MessageViewer::MessageViewerSettings::self()->delayedMarkAsRead()) {
0069         if (sListItem->contains(item) || d->mItemQueue == item || item.hasFlag(Akonadi::MessageFlags::Queued)) {
0070             return;
0071         }
0072         if (d->mTimer.isActive()) {
0073             d->mTimer.stop();
0074         }
0075         if (item.hasFlag(Akonadi::MessageFlags::Seen)) {
0076             return;
0077         }
0078 
0079         sListItem->removeAll(d->mItemQueue);
0080         d->mItemQueue = item;
0081         sListItem->append(item);
0082 
0083         const int delayedMarkTime = MessageViewer::MessageViewerSettings::self()->delayedMarkTime();
0084         if (delayedMarkTime != 0) {
0085             d->mTimer.start(delayedMarkTime * 1000);
0086         } else {
0087             d->handleMessages();
0088         }
0089     }
0090 }
0091 
0092 #include "moc_markmessagereadhandler.cpp"