diff --git a/Telegram/SourceFiles/auth_session.cpp b/Telegram/SourceFiles/auth_session.cpp index d82d4a228..2f9dce4fb 100644 --- a/Telegram/SourceFiles/auth_session.cpp +++ b/Telegram/SourceFiles/auth_session.cpp @@ -483,11 +483,9 @@ void AuthSession::checkAutoLock() { } Core::App().checkLocalTime(); - auto now = crl::now(); - auto shouldLockInMs = Global::AutoLock() * 1000LL; - auto idleForMs = psIdleTime(); - auto notPlayingVideoForMs = now - settings().lastTimeVideoPlayedAt(); - auto checkTimeMs = qMin(idleForMs, notPlayingVideoForMs); + const auto now = crl::now(); + const auto shouldLockInMs = Global::AutoLock() * 1000LL; + const auto checkTimeMs = now - Core::App().lastNonIdleTime(); if (checkTimeMs >= shouldLockInMs || (_shouldLockAt > 0 && now > _shouldLockAt + kAutoLockTimeoutLateMs)) { Core::App().lockByPasscode(); } else { diff --git a/Telegram/SourceFiles/auth_session.h b/Telegram/SourceFiles/auth_session.h index 778fc8840..84ce215aa 100644 --- a/Telegram/SourceFiles/auth_session.h +++ b/Telegram/SourceFiles/auth_session.h @@ -139,12 +139,6 @@ public: bool smallDialogsList() const { return _variables.smallDialogsList; } - void setLastTimeVideoPlayedAt(crl::time time) { - _lastTimeVideoPlayedAt = time; - } - crl::time lastTimeVideoPlayedAt() const { - return _lastTimeVideoPlayedAt; - } void setSoundOverride(const QString &key, const QString &path) { _variables.soundOverrides.insert(key, path); } @@ -263,7 +257,6 @@ private: rpl::event_stream _tabbedReplacedWithInfoValue; Variables _variables; - crl::time _lastTimeVideoPlayedAt = 0; }; diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index 7798a9f2e..93a6bc40a 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -841,6 +841,14 @@ bool Application::passcodeLocked() const { return _passcodeLock.current(); } +void Application::updateNonIdle() { + _lastNonIdleTime = crl::now(); +} + +crl::time Application::lastNonIdleTime() const { + return std::max(Platform::LastUserInputTime(), _lastNonIdleTime); +} + rpl::producer Application::passcodeLockChanges() const { return _passcodeLock.changes(); } diff --git a/Telegram/SourceFiles/core/application.h b/Telegram/SourceFiles/core/application.h index 37678a8d0..0e542dc1e 100644 --- a/Telegram/SourceFiles/core/application.h +++ b/Telegram/SourceFiles/core/application.h @@ -184,6 +184,9 @@ public: rpl::producer lockChanges() const; rpl::producer lockValue() const; + [[nodiscard]] crl::time lastNonIdleTime() const; + void updateNonIdle(); + void registerLeaveSubscription(QWidget *widget); void unregisterLeaveSubscription(QWidget *widget); @@ -282,6 +285,8 @@ private: rpl::lifetime _lifetime; + crl::time _lastNonIdleTime = 0; + }; Application &App(); diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 1b5fbeee1..f93b95615 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -1241,6 +1241,7 @@ void HistoryWidget::onRecordUpdate(quint16 level, qint32 samples) { if (samples < 0 || samples >= Media::Player::kDefaultFrequency * AudioVoiceMsgMaxLength) { stopRecording(_peer && samples > 0 && _inField); } + Core::App().updateNonIdle(); updateField(); if (_history) { updateSendAction(_history, SendAction::Type::RecordVoice); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 5b78ccbcf..4c34dba05 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -3767,7 +3767,7 @@ void MainWidget::updateOnline(bool gotOtherOffline) { bool isOnline = !App::quitting() && App::wnd()->isActive(); int updateIn = Global::OnlineUpdatePeriod(); if (isOnline) { - auto idle = psIdleTime(); + const auto idle = crl::now() - Platform::LastUserInputTime(); if (idle >= Global::OfflineIdleTimeout()) { isOnline = false; if (!_isIdle) { @@ -3883,7 +3883,7 @@ void MainWidget::writeDrafts(History *history) { } void MainWidget::checkIdleFinish() { - if (psIdleTime() < Global::OfflineIdleTimeout()) { + if (crl::now() - Platform::LastUserInputTime() < Global::OfflineIdleTimeout()) { _idleFinishTimer.cancel(); _isIdle = false; updateOnline(); diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 590820765..8ec85ade0 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -2041,7 +2041,7 @@ void OverlayWidget::onVideoPlayProgress(const AudioMsgId &audioId) { if (state.length) { updateVideoPlaybackState(state); } - Auth().settings().setLastTimeVideoPlayedAt(crl::now()); + Core::App().updateNonIdle(); } } diff --git a/Telegram/SourceFiles/platform/linux/specific_linux.cpp b/Telegram/SourceFiles/platform/linux/specific_linux.cpp index 06581e9a8..284852866 100644 --- a/Telegram/SourceFiles/platform/linux/specific_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/specific_linux.cpp @@ -207,10 +207,6 @@ bool psIdleSupported() { return false; } -crl::time psIdleTime() { - return crl::now() - _lastUserAction; -} - void psActivateProcess(uint64 pid) { // objc_activateProgram(); } @@ -449,6 +445,10 @@ bool OpenSystemSettings(SystemSettingsType type) { return true; } +crl::time LastUserInputTime() { + return _lastUserAction; +} + namespace ThirdParty { void start() { diff --git a/Telegram/SourceFiles/platform/linux/specific_linux.h b/Telegram/SourceFiles/platform/linux/specific_linux.h index c2141eee5..681d0d92a 100644 --- a/Telegram/SourceFiles/platform/linux/specific_linux.h +++ b/Telegram/SourceFiles/platform/linux/specific_linux.h @@ -33,6 +33,8 @@ inline void ReInitOnTopPanel(QWidget *panel) { QString CurrentExecutablePath(int argc, char *argv[]); +crl::time LastUserInputTime(); + } // namespace Platform inline QString psServerPrefix() { @@ -51,7 +53,6 @@ void psDeleteDir(const QString &dir); void psUserActionDone(); bool psIdleSupported(); -crl::time psIdleTime(); QStringList psInitLogs(); void psClearInitLogs(); diff --git a/Telegram/SourceFiles/platform/mac/specific_mac.h b/Telegram/SourceFiles/platform/mac/specific_mac.h index 283058158..136aec875 100644 --- a/Telegram/SourceFiles/platform/mac/specific_mac.h +++ b/Telegram/SourceFiles/platform/mac/specific_mac.h @@ -19,6 +19,8 @@ inline bool TranslucentWindowsSupported(QPoint globalPosition) { QString CurrentExecutablePath(int argc, char *argv[]); +crl::time LastUserInputTime(); + void RemoveQuarantine(const QString &path); namespace ThirdParty { @@ -52,7 +54,6 @@ void psDeleteDir(const QString &dir); void psUserActionDone(); bool psIdleSupported(); -crl::time psIdleTime(); QStringList psInitLogs(); void psClearInitLogs(); diff --git a/Telegram/SourceFiles/platform/mac/specific_mac.mm b/Telegram/SourceFiles/platform/mac/specific_mac.mm index 476d521d1..8d0ac876c 100644 --- a/Telegram/SourceFiles/platform/mac/specific_mac.mm +++ b/Telegram/SourceFiles/platform/mac/specific_mac.mm @@ -104,11 +104,6 @@ bool psIdleSupported() { return objc_idleSupported(); } -crl::time psIdleTime() { - auto idleTime = 0LL; - return objc_idleTime(idleTime) ? idleTime : (crl::now() - _lastUserAction); -} - QStringList psInitLogs() { return _initLogs; } @@ -270,6 +265,11 @@ bool OpenSystemSettings(SystemSettingsType type) { return true; } +crl::time LastUserInputTime() { + auto idleTime = 0LL; + return objc_idleTime(idleTime) ? (crl::now() - crl::time(idleTime)) : _lastUserAction; +} + } // namespace Platform void psNewVersion() { diff --git a/Telegram/SourceFiles/platform/win/specific_win.cpp b/Telegram/SourceFiles/platform/win/specific_win.cpp index 782e72af1..59b088679 100644 --- a/Telegram/SourceFiles/platform/win/specific_win.cpp +++ b/Telegram/SourceFiles/platform/win/specific_win.cpp @@ -145,12 +145,6 @@ bool psIdleSupported() { return GetLastInputInfo(&lii); } -crl::time psIdleTime() { - LASTINPUTINFO lii; - lii.cbSize = sizeof(LASTINPUTINFO); - return GetLastInputInfo(&lii) ? (GetTickCount() - lii.dwTime) : (crl::now() - _lastUserAction); -} - QStringList psInitLogs() { return _initLogs; } @@ -350,6 +344,12 @@ QString CurrentExecutablePath(int argc, char *argv[]) { return QString(); } +crl::time LastUserInputTime() { + LASTINPUTINFO lii; + lii.cbSize = sizeof(LASTINPUTINFO); + return GetLastInputInfo(&lii) ? (crl::now() + lii.dwTime - GetTickCount()) : _lastUserAction; +} + namespace { QString GetLangCodeById(unsigned lngId) { diff --git a/Telegram/SourceFiles/platform/win/specific_win.h b/Telegram/SourceFiles/platform/win/specific_win.h index 770961a7d..89d08e78d 100644 --- a/Telegram/SourceFiles/platform/win/specific_win.h +++ b/Telegram/SourceFiles/platform/win/specific_win.h @@ -36,6 +36,8 @@ inline void ReInitOnTopPanel(QWidget *panel) { QString CurrentExecutablePath(int argc, char *argv[]); +crl::time LastUserInputTime(); + namespace ThirdParty { inline void start() { @@ -59,7 +61,6 @@ void psDeleteDir(const QString &dir); void psUserActionDone(); bool psIdleSupported(); -crl::time psIdleTime(); QStringList psInitLogs(); void psClearInitLogs();