From 2b71625ffe77ed75d63b212fb2fb1f7e5e090e5a Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 8 Jan 2025 10:56:46 +0300 Subject: [PATCH] Moved out part of common code for cloud password to td_ui. --- Telegram/CMakeLists.txt | 4 +- .../settings_cloud_password_common.cpp | 124 +---------------- .../settings_cloud_password_common.h | 75 +---------- .../settings_cloud_password_email.cpp | 1 + .../settings_cloud_password_email_confirm.cpp | 1 + .../settings_cloud_password_hint.cpp | 1 + .../settings_cloud_password_input.cpp | 1 + .../settings_cloud_password_manage.cpp | 7 +- .../settings_cloud_password_start.cpp | 1 + .../settings_cloud_password_step.cpp | 126 ++++++++++++++++++ .../settings_cloud_password_step.h | 89 +++++++++++++ .../settings/settings_local_passcode.cpp | 7 +- Telegram/cmake/td_ui.cmake | 2 + 13 files changed, 247 insertions(+), 192 deletions(-) create mode 100644 Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.cpp create mode 100644 Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 1e0365f37..1071fbe7a 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1409,8 +1409,6 @@ PRIVATE settings/business/settings_recipients_helper.h settings/business/settings_working_hours.cpp settings/business/settings_working_hours.h - settings/cloud_password/settings_cloud_password_common.cpp - settings/cloud_password/settings_cloud_password_common.h settings/cloud_password/settings_cloud_password_email.cpp settings/cloud_password/settings_cloud_password_email.h settings/cloud_password/settings_cloud_password_email_confirm.cpp @@ -1423,6 +1421,8 @@ PRIVATE settings/cloud_password/settings_cloud_password_manage.h settings/cloud_password/settings_cloud_password_start.cpp settings/cloud_password/settings_cloud_password_start.h + settings/cloud_password/settings_cloud_password_step.cpp + settings/cloud_password/settings_cloud_password_step.h settings/settings_active_sessions.cpp settings/settings_active_sessions.h settings/settings_advanced.cpp diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp index 3c1f5e376..4b6c8024f 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp @@ -7,28 +7,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "settings/cloud_password/settings_cloud_password_common.h" -#include "apiwrap.h" -#include "base/timer.h" -#include "core/application.h" #include "lang/lang_keys.h" #include "lottie/lottie_icon.h" -#include "main/main_session.h" -#include "settings/cloud_password/settings_cloud_password_email.h" -#include "settings/cloud_password/settings_cloud_password_email_confirm.h" -#include "settings/cloud_password/settings_cloud_password_hint.h" -#include "settings/cloud_password/settings_cloud_password_input.h" -#include "settings/cloud_password/settings_cloud_password_manage.h" -#include "settings/cloud_password/settings_cloud_password_start.h" -#include "ui/boxes/confirm_box.h" +#include "settings/settings_common.h" +#include "ui/vertical_list.h" #include "ui/widgets/buttons.h" #include "ui/widgets/fields/input_field.h" #include "ui/widgets/fields/password_input.h" #include "ui/widgets/labels.h" #include "ui/wrap/vertical_layout.h" -#include "ui/vertical_list.h" -#include "window/window_session_controller.h" #include "styles/style_boxes.h" -#include "styles/style_layers.h" #include "styles/style_settings.h" namespace Settings::CloudPassword { @@ -100,12 +88,15 @@ BottomButton CreateBottomDisableButton( }; } -void SetupAutoCloseTimer(rpl::lifetime &lifetime, Fn callback) { +void SetupAutoCloseTimer( + rpl::lifetime &lifetime, + Fn callback, + Fn lastNonIdleTime) { constexpr auto kTimerCheck = crl::time(1000 * 60); constexpr auto kAutoCloseTimeout = crl::time(1000 * 60 * 10); const auto timer = lifetime.make_state([=] { - const auto idle = crl::now() - Core::App().lastNonIdleTime(); + const auto idle = crl::now() - lastNonIdleTime(); if (idle >= kAutoCloseTimeout) { callback(); } @@ -269,105 +260,4 @@ void AddSkipInsteadOfError(not_null content) { dummy = nullptr; } -AbstractStep::AbstractStep( - QWidget *parent, - not_null controller) -: AbstractSection(parent) -, _controller(controller) { -} - -not_null AbstractStep::controller() const { - return _controller; -} - -Api::CloudPassword &AbstractStep::cloudPassword() { - return _controller->session().api().cloudPassword(); -} - -rpl::producer AbstractStep::removeTypes() { - return rpl::never(); -} - -void AbstractStep::showBack() { - _showBack.fire({}); -} - -void AbstractStep::showOther(Type type) { - _showOther.fire_copy(type); -} - -void AbstractStep::setFocusCallback(Fn callback) { - _setInnerFocusCallback = callback; -} - -rpl::producer<> AbstractStep::showFinishes() const { - return _showFinished.events(); -} - -void AbstractStep::showFinished() { - _showFinished.fire({}); -} - -void AbstractStep::setInnerFocus() { - if (_setInnerFocusCallback) { - _setInnerFocusCallback(); - } -} - -bool AbstractStep::isPasswordInvalidError(const QString &type) { - if (type == u"PASSWORD_HASH_INVALID"_q - || type == u"SRP_PASSWORD_CHANGED"_q) { - - // Most likely the cloud password has been changed on another device. - // Quit. - _quits.fire(AbstractStep::Types{ - CloudPasswordStartId(), - CloudPasswordInputId(), - CloudPasswordHintId(), - CloudPasswordEmailId(), - CloudPasswordEmailConfirmId(), - CloudPasswordManageId(), - }); - controller()->show( - Ui::MakeInformBox(tr::lng_cloud_password_expired()), - Ui::LayerOption::CloseOther); - setStepData(StepData()); - showBack(); - return true; - } - return false; -} - -rpl::producer AbstractStep::sectionShowOther() { - return _showOther.events(); -} - -rpl::producer<> AbstractStep::sectionShowBack() { - return _showBack.events(); -} - -rpl::producer> AbstractStep::removeFromStack() { - return rpl::merge(removeTypes(), _quits.events()); -} - -void AbstractStep::setStepDataReference(std::any &data) { - _stepData = &data; -} - -StepData AbstractStep::stepData() const { - if (!_stepData || !_stepData->has_value()) { - StepData(); - } - const auto my = std::any_cast(_stepData); - return my ? (*my) : StepData(); -} - -void AbstractStep::setStepData(StepData data) { - if (_stepData) { - *_stepData = data; - } -} - -AbstractStep::~AbstractStep() = default; - } // namespace Settings::CloudPassword diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h index 836728b48..586e58a9d 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h @@ -7,7 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once -#include "settings/settings_common_session.h" +#include "ui/text/text_variant.h" #include "ui/widgets/box_content_divider.h" namespace Ui { @@ -43,7 +43,10 @@ struct StepData { ProcessRecover processRecover; }; -void SetupAutoCloseTimer(rpl::lifetime &lifetime, Fn callback); +void SetupAutoCloseTimer( + rpl::lifetime &lifetime, + Fn callback, + Fn lastNonIdleTime); void SetupHeader( not_null content, @@ -102,73 +105,5 @@ private: }; -class AbstractStep : public AbstractSection { -public: - using Types = std::vector; - AbstractStep( - QWidget *parent, - not_null controller); - ~AbstractStep(); - - void showFinished() override final; - void setInnerFocus() override final; - [[nodiscard]] rpl::producer sectionShowOther() override final; - [[nodiscard]] rpl::producer<> sectionShowBack() override final; - - [[nodiscard]] rpl::producer removeFromStack() override final; - - void setStepDataReference(std::any &data) override; - -protected: - [[nodiscard]] not_null controller() const; - [[nodiscard]] Api::CloudPassword &cloudPassword(); - - [[nodiscard]] virtual rpl::producer removeTypes(); - - bool isPasswordInvalidError(const QString &type); - - void showBack(); - void showOther(Type type); - - void setFocusCallback(Fn callback); - - [[nodiscard]] rpl::producer<> showFinishes() const; - - StepData stepData() const; - void setStepData(StepData data); - -private: - const not_null _controller; - - Fn _setInnerFocusCallback; - - rpl::event_stream<> _showFinished; - rpl::event_stream _showOther; - rpl::event_stream<> _showBack; - rpl::event_stream _quits; - - std::any *_stepData; - -}; - -template -class TypedAbstractStep : public AbstractStep { -public: - using AbstractStep::AbstractStep; - - void setStepDataReference(std::any &data) override final { - AbstractStep::setStepDataReference(data); - static_cast(this)->setupContent(); - } - - [[nodiscard]] static Type Id() { - return SectionFactory::Instance(); - } - [[nodiscard]] Type id() const final override { - return Id(); - } - -}; - } // namespace Settings::CloudPassword diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.cpp index aead318d0..f83eb1437 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/cloud_password/settings_cloud_password_common.h" #include "settings/cloud_password/settings_cloud_password_email_confirm.h" #include "settings/cloud_password/settings_cloud_password_manage.h" +#include "settings/cloud_password/settings_cloud_password_step.h" #include "ui/vertical_list.h" #include "ui/boxes/confirm_box.h" #include "ui/widgets/buttons.h" diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email_confirm.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email_confirm.cpp index 7bf21c9d5..2e482f761 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email_confirm.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email_confirm.cpp @@ -19,6 +19,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/cloud_password/settings_cloud_password_input.h" #include "settings/cloud_password/settings_cloud_password_manage.h" #include "settings/cloud_password/settings_cloud_password_start.h" +#include "settings/cloud_password/settings_cloud_password_step.h" #include "ui/vertical_list.h" #include "ui/boxes/confirm_box.h" #include "ui/text/format_values.h" diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_hint.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_hint.cpp index e690b9905..7f59c7a93 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_hint.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_hint.cpp @@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/cloud_password/settings_cloud_password_common.h" #include "settings/cloud_password/settings_cloud_password_email.h" #include "settings/cloud_password/settings_cloud_password_manage.h" +#include "settings/cloud_password/settings_cloud_password_step.h" #include "ui/vertical_list.h" #include "ui/widgets/buttons.h" #include "ui/widgets/fields/input_field.h" diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.cpp index b25659f3f..0064dcbda 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.cpp @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/cloud_password/settings_cloud_password_email_confirm.h" #include "settings/cloud_password/settings_cloud_password_hint.h" #include "settings/cloud_password/settings_cloud_password_manage.h" +#include "settings/cloud_password/settings_cloud_password_step.h" #include "ui/boxes/confirm_box.h" #include "ui/text/format_values.h" #include "ui/widgets/buttons.h" diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp index 2d273895e..1f7a87673 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_manage.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/cloud_password/settings_cloud_password_manage.h" #include "api/api_cloud_password.h" +#include "core/application.h" #include "core/core_cloud_password.h" #include "lang/lang_keys.h" #include "settings/cloud_password/settings_cloud_password_common.h" @@ -16,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/cloud_password/settings_cloud_password_hint.h" #include "settings/cloud_password/settings_cloud_password_input.h" #include "settings/cloud_password/settings_cloud_password_start.h" +#include "settings/cloud_password/settings_cloud_password_step.h" #include "ui/vertical_list.h" #include "ui/boxes/confirm_box.h" #include "ui/widgets/buttons.h" @@ -97,7 +99,10 @@ void Manage::setupContent() { showBack(); }; - SetupAutoCloseTimer(content->lifetime(), quit); + SetupAutoCloseTimer( + content->lifetime(), + quit, + [] { return Core::App().lastNonIdleTime(); }); const auto state = cloudPassword().stateCurrent(); if (!state) { diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_start.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_start.cpp index 00fd0f240..e882a3406 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_start.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_start.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "settings/cloud_password/settings_cloud_password_common.h" #include "settings/cloud_password/settings_cloud_password_input.h" +#include "settings/cloud_password/settings_cloud_password_step.h" #include "ui/vertical_list.h" #include "ui/widgets/buttons.h" #include "ui/wrap/vertical_layout.h" diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.cpp new file mode 100644 index 000000000..b9bf6baa1 --- /dev/null +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.cpp @@ -0,0 +1,126 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "settings/cloud_password/settings_cloud_password_step.h" + +#include "apiwrap.h" +#include "lang/lang_keys.h" +#include "main/main_session.h" +#include "settings/cloud_password/settings_cloud_password_common.h" +#include "settings/cloud_password/settings_cloud_password_email.h" +#include "settings/cloud_password/settings_cloud_password_email_confirm.h" +#include "settings/cloud_password/settings_cloud_password_hint.h" +#include "settings/cloud_password/settings_cloud_password_input.h" +#include "settings/cloud_password/settings_cloud_password_manage.h" +#include "settings/cloud_password/settings_cloud_password_start.h" +#include "ui/boxes/confirm_box.h" +#include "window/window_session_controller.h" + +namespace Settings::CloudPassword { + +AbstractStep::AbstractStep( + QWidget *parent, + not_null controller) +: AbstractSection(parent) +, _controller(controller) { +} + +not_null AbstractStep::controller() const { + return _controller; +} + +Api::CloudPassword &AbstractStep::cloudPassword() { + return _controller->session().api().cloudPassword(); +} + +rpl::producer AbstractStep::removeTypes() { + return rpl::never(); +} + +void AbstractStep::showBack() { + _showBack.fire({}); +} + +void AbstractStep::showOther(Type type) { + _showOther.fire_copy(type); +} + +void AbstractStep::setFocusCallback(Fn callback) { + _setInnerFocusCallback = callback; +} + +rpl::producer<> AbstractStep::showFinishes() const { + return _showFinished.events(); +} + +void AbstractStep::showFinished() { + _showFinished.fire({}); +} + +void AbstractStep::setInnerFocus() { + if (_setInnerFocusCallback) { + _setInnerFocusCallback(); + } +} + +bool AbstractStep::isPasswordInvalidError(const QString &type) { + if (type == u"PASSWORD_HASH_INVALID"_q + || type == u"SRP_PASSWORD_CHANGED"_q) { + + // Most likely the cloud password has been changed on another device. + // Quit. + _quits.fire(AbstractStep::Types{ + CloudPasswordStartId(), + CloudPasswordInputId(), + CloudPasswordHintId(), + CloudPasswordEmailId(), + CloudPasswordEmailConfirmId(), + CloudPasswordManageId(), + }); + controller()->show( + Ui::MakeInformBox(tr::lng_cloud_password_expired()), + Ui::LayerOption::CloseOther); + setStepData(StepData()); + showBack(); + return true; + } + return false; +} + +rpl::producer AbstractStep::sectionShowOther() { + return _showOther.events(); +} + +rpl::producer<> AbstractStep::sectionShowBack() { + return _showBack.events(); +} + +rpl::producer> AbstractStep::removeFromStack() { + return rpl::merge(removeTypes(), _quits.events()); +} + +void AbstractStep::setStepDataReference(std::any &data) { + _stepData = &data; +} + +StepData AbstractStep::stepData() const { + if (!_stepData || !_stepData->has_value()) { + StepData(); + } + const auto my = std::any_cast(_stepData); + return my ? (*my) : StepData(); +} + +void AbstractStep::setStepData(StepData data) { + if (_stepData) { + *_stepData = data; + } +} + +AbstractStep::~AbstractStep() = default; + +} // namespace Settings::CloudPassword diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.h b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.h new file mode 100644 index 000000000..241024785 --- /dev/null +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_step.h @@ -0,0 +1,89 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "settings/settings_common_session.h" + +namespace Api { +class CloudPassword; +} // namespace Api + +namespace Settings::CloudPassword { + +struct StepData; + +class AbstractStep : public AbstractSection { +public: + using Types = std::vector; + AbstractStep( + QWidget *parent, + not_null controller); + ~AbstractStep(); + + void showFinished() override final; + void setInnerFocus() override final; + [[nodiscard]] rpl::producer sectionShowOther() override final; + [[nodiscard]] rpl::producer<> sectionShowBack() override final; + + [[nodiscard]] rpl::producer removeFromStack() override final; + + void setStepDataReference(std::any &data) override; + +protected: + [[nodiscard]] not_null controller() const; + [[nodiscard]] Api::CloudPassword &cloudPassword(); + + [[nodiscard]] virtual rpl::producer removeTypes(); + + bool isPasswordInvalidError(const QString &type); + + void showBack(); + void showOther(Type type); + + void setFocusCallback(Fn callback); + + [[nodiscard]] rpl::producer<> showFinishes() const; + + StepData stepData() const; + void setStepData(StepData data); + +private: + const not_null _controller; + + Fn _setInnerFocusCallback; + + rpl::event_stream<> _showFinished; + rpl::event_stream _showOther; + rpl::event_stream<> _showBack; + rpl::event_stream _quits; + + std::any *_stepData; + +}; + +template +class TypedAbstractStep : public AbstractStep { +public: + using AbstractStep::AbstractStep; + + void setStepDataReference(std::any &data) override final { + AbstractStep::setStepDataReference(data); + static_cast(this)->setupContent(); + } + + [[nodiscard]] static Type Id() { + return SectionFactory::Instance(); + } + [[nodiscard]] Type id() const final override { + return Id(); + } + +}; + +} // namespace Settings::CloudPassword + diff --git a/Telegram/SourceFiles/settings/settings_local_passcode.cpp b/Telegram/SourceFiles/settings/settings_local_passcode.cpp index 193445caf..8f639c30a 100644 --- a/Telegram/SourceFiles/settings/settings_local_passcode.cpp +++ b/Telegram/SourceFiles/settings/settings_local_passcode.cpp @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_domain.h" #include "main/main_session.h" #include "settings/cloud_password/settings_cloud_password_common.h" +#include "settings/cloud_password/settings_cloud_password_step.h" #include "storage/storage_domain.h" #include "ui/vertical_list.h" #include "ui/boxes/confirm_box.h" @@ -128,7 +129,8 @@ void LocalPasscodeEnter::setupContent() { if (isChange) { CloudPassword::SetupAutoCloseTimer( content->lifetime(), - [=] { _showBack.fire({}); }); + [=] { _showBack.fire({}); }, + [] { return Core::App().lastNonIdleTime(); }); } Ui::AddSkip(content); @@ -448,7 +450,8 @@ void LocalPasscodeManage::setupContent() { CloudPassword::SetupAutoCloseTimer( content->lifetime(), - [=] { _showBack.fire({}); }); + [=] { _showBack.fire({}); }, + [] { return Core::App().lastNonIdleTime(); }); Ui::AddSkip(content); diff --git a/Telegram/cmake/td_ui.cmake b/Telegram/cmake/td_ui.cmake index e9e683250..77e710a6a 100644 --- a/Telegram/cmake/td_ui.cmake +++ b/Telegram/cmake/td_ui.cmake @@ -224,6 +224,8 @@ PRIVATE settings/settings_common.cpp settings/settings_common.h + settings/cloud_password/settings_cloud_password_common.cpp + settings/cloud_password/settings_cloud_password_common.h statistics/chart_lines_filter_controller.cpp statistics/chart_lines_filter_controller.h