From f7454a428417e55a329833e68ec2b5762ee05720 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 18 May 2021 14:16:04 +0400 Subject: [PATCH] Fix crash on quit in idle state. --- Telegram/SourceFiles/api/api_updates.cpp | 11 +++++++---- Telegram/SourceFiles/api/api_updates.h | 3 ++- Telegram/SourceFiles/window/window_controller.cpp | 11 +++++++++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index d3feabee8d..c70b339d3f 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -867,7 +867,11 @@ void Updates::updateOnline() { } bool Updates::isIdle() const { - return _isIdle; + return _isIdle.current(); +} + +rpl::producer Updates::isIdleValue() const { + return _isIdle.value(); } void Updates::updateOnline(bool gotOtherOffline) { @@ -881,7 +885,7 @@ void Updates::updateOnline(bool gotOtherOffline) { const auto idle = crl::now() - Core::App().lastNonIdleTime(); if (idle >= config.offlineIdleTimeout) { isOnline = false; - if (!_isIdle) { + if (!isIdle()) { _isIdle = true; _idleFinishTimer.callOnce(900); } @@ -932,10 +936,9 @@ void Updates::updateOnline(bool gotOtherOffline) { void Updates::checkIdleFinish() { if (crl::now() - Core::App().lastNonIdleTime() < _session->serverConfig().offlineIdleTimeout) { + updateOnline(); _idleFinishTimer.cancel(); _isIdle = false; - updateOnline(); - App::wnd()->checkHistoryActivation(); } else { _idleFinishTimer.callOnce(900); } diff --git a/Telegram/SourceFiles/api/api_updates.h b/Telegram/SourceFiles/api/api_updates.h index dc6c451f7c..4981b5b8dd 100644 --- a/Telegram/SourceFiles/api/api_updates.h +++ b/Telegram/SourceFiles/api/api_updates.h @@ -40,6 +40,7 @@ public: void updateOnline(); [[nodiscard]] bool isIdle() const; + [[nodiscard]] rpl::producer isIdleValue() const; void checkIdleFinish(); bool lastWasOnline() const; crl::time lastSetOnline() const; @@ -185,7 +186,7 @@ private: base::Timer _idleFinishTimer; crl::time _lastSetOnline = 0; bool _lastWasOnline = false; - bool _isIdle = false; + rpl::variable _isIdle = false; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp index b4a168f833..0bbddee13b 100644 --- a/Telegram/SourceFiles/window/window_controller.cpp +++ b/Telegram/SourceFiles/window/window_controller.cpp @@ -82,7 +82,7 @@ void Controller::showAccount(not_null account) { _sessionController->filtersMenuChanged( ) | rpl::start_with_next([=] { sideBarChanged(); - }, session->lifetime()); + }, _sessionController->lifetime()); } if (session && session->settings().dialogsFiltersEnabled()) { _sessionController->toggleFiltersMenu(true); @@ -93,11 +93,18 @@ void Controller::showAccount(not_null account) { if (session) { setupMain(); + session->updates().isIdleValue( + ) | rpl::filter([=](bool idle) { + return !idle; + }) | rpl::start_with_next([=] { + widget()->checkHistoryActivation(); + }, _sessionController->lifetime()); + session->termsLockValue( ) | rpl::start_with_next([=] { checkLockByTerms(); _widget.updateGlobalMenu(); - }, _lifetime); + }, _sessionController->lifetime()); } else { setupIntro(); _widget.updateGlobalMenu();