File indexing completed on 2024-12-08 04:33:08
0001 /* 0002 SPDX-FileCopyrightText: 2021-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "awaymanager.h" 0008 #include "rocketchataccount.h" 0009 #include "ruqola_away_debug.h" 0010 #include <KIdleTime> 0011 // #define DEBUG_IDLETIME 1 0012 AwayManager::AwayManager(RocketChatAccount *const account, QObject *parent) 0013 : QObject{parent} 0014 , mRocketChatAccount(account) 0015 { 0016 connect(KIdleTime::instance(), &KIdleTime::resumingFromIdle, this, &AwayManager::slotResumeFromIdle); 0017 connect(KIdleTime::instance(), &KIdleTime::timeoutReached, this, &AwayManager::slotIdleTimeoutReached); 0018 0019 KIdleTime::instance()->catchNextResumeEvent(); 0020 } 0021 0022 AwayManager::~AwayManager() = default; 0023 0024 void AwayManager::slotResumeFromIdle() 0025 { 0026 if (!mEnabled) { 0027 return; 0028 } 0029 Q_EMIT awayChanged(false); // Not away now 0030 qCDebug(RUQOLA_AWAY_LOG) << " void AwayManager::slotResumeFromIdle() : name : " << mRocketChatAccount->accountName(); 0031 const QHash<int, int> idleTimeouts = KIdleTime::instance()->idleTimeouts(); 0032 0033 int remainingTime = calculateRemainingTime(); 0034 // Check if the user should be away right now. 0035 if (remainingTime <= 0) { 0036 Q_EMIT awayChanged(true); 0037 // As at least one identity is away we have to catch the next 0038 // resume event. 0039 KIdleTime::instance()->catchNextResumeEvent(); 0040 0041 // Since the user is away right now the next auto-away should occur 0042 // in X minutes (where X is the timeout which the user has 0043 // configured for the identity). 0044 remainingTime = mIdleTiming; 0045 } 0046 if (idleTimeouts[mTimerId] != remainingTime) { 0047 // Remove the idle timeout. 0048 if (mTimerId != -1) { 0049 KIdleTime::instance()->removeIdleTimeout(mTimerId); 0050 } 0051 0052 // Then also reset the timer ID (as the timer does not exist anymore). 0053 mTimerId = -1; 0054 } 0055 // Check if we already have a timer. 0056 if (mTimerId == -1) { 0057 mTimerId = KIdleTime::instance()->addIdleTimeout(timeValue()); 0058 } 0059 } 0060 0061 int AwayManager::calculateRemainingTime() const 0062 { 0063 // The remaining time until the user will be marked as "auto-away". 0064 const int remainingTime = mIdleTiming - KIdleTime::instance()->idleTime(); 0065 0066 return remainingTime; 0067 } 0068 0069 void AwayManager::slotIdleTimeoutReached(int timerId) 0070 { 0071 if (!mEnabled) { 0072 return; 0073 } 0074 if (mTimerId == timerId) { 0075 qDebug() << " slotIdleTimeoutReached " << KIdleTime::instance()->idleTimeouts(); 0076 qCDebug(RUQOLA_AWAY_LOG) << " void AwayManager::slotIdleTimeoutReached() mTimerId :" << mTimerId << "name : " << mRocketChatAccount->accountName(); 0077 Q_EMIT awayChanged(true); // Away now 0078 // Account is away => we need to catch next resume event. 0079 KIdleTime::instance()->catchNextResumeEvent(); 0080 } 0081 } 0082 0083 int AwayManager::idleTiming() const 0084 { 0085 return mIdleTiming; 0086 } 0087 0088 void AwayManager::setIdleTiming(int newIdleTiming) 0089 { 0090 mIdleTiming = newIdleTiming; 0091 } 0092 0093 void AwayManager::updateSettings() 0094 { 0095 const auto &ownerUserPref = mRocketChatAccount->ownUserPreferences(); 0096 setIdleTiming(ownerUserPref.idleTimeLimit()); 0097 setEnabled(ownerUserPref.enableAutoAway()); 0098 } 0099 0100 bool AwayManager::enabled() const 0101 { 0102 return mEnabled; 0103 } 0104 0105 void AwayManager::setEnabled(bool newEnabled) 0106 { 0107 qCDebug(RUQOLA_AWAY_LOG) << " void AwayManager::setEnabled()" << newEnabled << "name : " << mRocketChatAccount->accountName(); 0108 if (mEnabled != newEnabled) { 0109 mEnabled = newEnabled; 0110 if (!mEnabled && (mTimerId != -1)) { 0111 KIdleTime::instance()->removeIdleTimeout(mTimerId); 0112 qCDebug(RUQOLA_AWAY_LOG) << " Remove Idle Timeout " << newEnabled; 0113 mTimerId = -1; 0114 } else if (mEnabled && (mTimerId == -1)) { 0115 mTimerId = KIdleTime::instance()->addIdleTimeout(timeValue()); 0116 qCDebug(RUQOLA_AWAY_LOG) << " Catch Next Resume Event " << newEnabled << " mIdleTiming (s)" << mIdleTiming << " mTimerId " << mTimerId; 0117 KIdleTime::instance()->catchNextResumeEvent(); 0118 } 0119 } 0120 } 0121 0122 int AwayManager::timeValue() const 0123 { 0124 constexpr int minute = 60 * 1000; 0125 #ifdef DEBUG_IDLETIME 0126 const int timerValue = minute; // 1 minutes 0127 #else 0128 const int timerValue = mIdleTiming * minute; 0129 #endif 0130 return timerValue; 0131 } 0132 0133 QDebug operator<<(QDebug d, const AwayManager &t) 0134 { 0135 d.space() << "mEnabled" << t.enabled(); 0136 d.space() << "mIdleTiming" << t.idleTiming(); 0137 return d; 0138 } 0139 0140 #include "moc_awaymanager.cpp"