Moved out part of common code for cloud password to td_ui.

This commit is contained in:
23rd 2025-01-08 10:56:46 +03:00
parent 2b13fc9a24
commit 2b71625ffe
13 changed files with 247 additions and 192 deletions

View file

@ -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

View file

@ -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<void()> callback) {
void SetupAutoCloseTimer(
rpl::lifetime &lifetime,
Fn<void()> callback,
Fn<crl::time()> lastNonIdleTime) {
constexpr auto kTimerCheck = crl::time(1000 * 60);
constexpr auto kAutoCloseTimeout = crl::time(1000 * 60 * 10);
const auto timer = lifetime.make_state<base::Timer>([=] {
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<Ui::VerticalLayout*> content) {
dummy = nullptr;
}
AbstractStep::AbstractStep(
QWidget *parent,
not_null<Window::SessionController*> controller)
: AbstractSection(parent)
, _controller(controller) {
}
not_null<Window::SessionController*> AbstractStep::controller() const {
return _controller;
}
Api::CloudPassword &AbstractStep::cloudPassword() {
return _controller->session().api().cloudPassword();
}
rpl::producer<AbstractStep::Types> AbstractStep::removeTypes() {
return rpl::never<Types>();
}
void AbstractStep::showBack() {
_showBack.fire({});
}
void AbstractStep::showOther(Type type) {
_showOther.fire_copy(type);
}
void AbstractStep::setFocusCallback(Fn<void()> 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<Type> AbstractStep::sectionShowOther() {
return _showOther.events();
}
rpl::producer<> AbstractStep::sectionShowBack() {
return _showBack.events();
}
rpl::producer<std::vector<Type>> 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>(_stepData);
return my ? (*my) : StepData();
}
void AbstractStep::setStepData(StepData data) {
if (_stepData) {
*_stepData = data;
}
}
AbstractStep::~AbstractStep() = default;
} // namespace Settings::CloudPassword

View file

@ -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<void()> callback);
void SetupAutoCloseTimer(
rpl::lifetime &lifetime,
Fn<void()> callback,
Fn<crl::time()> lastNonIdleTime);
void SetupHeader(
not_null<Ui::VerticalLayout*> content,
@ -102,73 +105,5 @@ private:
};
class AbstractStep : public AbstractSection {
public:
using Types = std::vector<Type>;
AbstractStep(
QWidget *parent,
not_null<Window::SessionController*> controller);
~AbstractStep();
void showFinished() override final;
void setInnerFocus() override final;
[[nodiscard]] rpl::producer<Type> sectionShowOther() override final;
[[nodiscard]] rpl::producer<> sectionShowBack() override final;
[[nodiscard]] rpl::producer<Types> removeFromStack() override final;
void setStepDataReference(std::any &data) override;
protected:
[[nodiscard]] not_null<Window::SessionController*> controller() const;
[[nodiscard]] Api::CloudPassword &cloudPassword();
[[nodiscard]] virtual rpl::producer<Types> removeTypes();
bool isPasswordInvalidError(const QString &type);
void showBack();
void showOther(Type type);
void setFocusCallback(Fn<void()> callback);
[[nodiscard]] rpl::producer<> showFinishes() const;
StepData stepData() const;
void setStepData(StepData data);
private:
const not_null<Window::SessionController*> _controller;
Fn<void()> _setInnerFocusCallback;
rpl::event_stream<> _showFinished;
rpl::event_stream<Type> _showOther;
rpl::event_stream<> _showBack;
rpl::event_stream<Types> _quits;
std::any *_stepData;
};
template <typename SectionType>
class TypedAbstractStep : public AbstractStep {
public:
using AbstractStep::AbstractStep;
void setStepDataReference(std::any &data) override final {
AbstractStep::setStepDataReference(data);
static_cast<SectionType*>(this)->setupContent();
}
[[nodiscard]] static Type Id() {
return SectionFactory<SectionType>::Instance();
}
[[nodiscard]] Type id() const final override {
return Id();
}
};
} // namespace Settings::CloudPassword

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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) {

View file

@ -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"

View file

@ -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<Window::SessionController*> controller)
: AbstractSection(parent)
, _controller(controller) {
}
not_null<Window::SessionController*> AbstractStep::controller() const {
return _controller;
}
Api::CloudPassword &AbstractStep::cloudPassword() {
return _controller->session().api().cloudPassword();
}
rpl::producer<AbstractStep::Types> AbstractStep::removeTypes() {
return rpl::never<Types>();
}
void AbstractStep::showBack() {
_showBack.fire({});
}
void AbstractStep::showOther(Type type) {
_showOther.fire_copy(type);
}
void AbstractStep::setFocusCallback(Fn<void()> 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<Type> AbstractStep::sectionShowOther() {
return _showOther.events();
}
rpl::producer<> AbstractStep::sectionShowBack() {
return _showBack.events();
}
rpl::producer<std::vector<Type>> 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>(_stepData);
return my ? (*my) : StepData();
}
void AbstractStep::setStepData(StepData data) {
if (_stepData) {
*_stepData = data;
}
}
AbstractStep::~AbstractStep() = default;
} // namespace Settings::CloudPassword

View file

@ -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<Type>;
AbstractStep(
QWidget *parent,
not_null<Window::SessionController*> controller);
~AbstractStep();
void showFinished() override final;
void setInnerFocus() override final;
[[nodiscard]] rpl::producer<Type> sectionShowOther() override final;
[[nodiscard]] rpl::producer<> sectionShowBack() override final;
[[nodiscard]] rpl::producer<Types> removeFromStack() override final;
void setStepDataReference(std::any &data) override;
protected:
[[nodiscard]] not_null<Window::SessionController*> controller() const;
[[nodiscard]] Api::CloudPassword &cloudPassword();
[[nodiscard]] virtual rpl::producer<Types> removeTypes();
bool isPasswordInvalidError(const QString &type);
void showBack();
void showOther(Type type);
void setFocusCallback(Fn<void()> callback);
[[nodiscard]] rpl::producer<> showFinishes() const;
StepData stepData() const;
void setStepData(StepData data);
private:
const not_null<Window::SessionController*> _controller;
Fn<void()> _setInnerFocusCallback;
rpl::event_stream<> _showFinished;
rpl::event_stream<Type> _showOther;
rpl::event_stream<> _showBack;
rpl::event_stream<Types> _quits;
std::any *_stepData;
};
template <typename SectionType>
class TypedAbstractStep : public AbstractStep {
public:
using AbstractStep::AbstractStep;
void setStepDataReference(std::any &data) override final {
AbstractStep::setStepDataReference(data);
static_cast<SectionType*>(this)->setupContent();
}
[[nodiscard]] static Type Id() {
return SectionFactory<SectionType>::Instance();
}
[[nodiscard]] Type id() const final override {
return Id();
}
};
} // namespace Settings::CloudPassword

View file

@ -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);

View file

@ -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