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"