From c27db754a71217dcdddd9b1cd5edc46afb7e8a85 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 4 May 2022 02:50:54 +0300 Subject: [PATCH] Added initial implementation of first screen for local passcode. --- Telegram/CMakeLists.txt | 2 + .../animations/local_passcode_enter.tgs | Bin 0 -> 15448 bytes Telegram/Resources/langs/lang.strings | 9 + .../Resources/qrc/telegram/animations.qrc | 1 + Telegram/SourceFiles/settings/settings.style | 13 ++ .../settings/settings_local_passcode.cpp | 195 ++++++++++++++++++ .../settings/settings_local_passcode.h | 108 ++++++++++ 7 files changed, 328 insertions(+) create mode 100644 Telegram/Resources/animations/local_passcode_enter.tgs create mode 100644 Telegram/SourceFiles/settings/settings_local_passcode.cpp create mode 100644 Telegram/SourceFiles/settings/settings_local_passcode.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index c2a6e1b95..5b11282a3 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1092,6 +1092,8 @@ PRIVATE settings/settings_information.h settings/settings_intro.cpp settings/settings_intro.h + settings/settings_local_passcode.cpp + settings/settings_local_passcode.h settings/settings_main.cpp settings/settings_main.h settings/settings_notifications.cpp diff --git a/Telegram/Resources/animations/local_passcode_enter.tgs b/Telegram/Resources/animations/local_passcode_enter.tgs new file mode 100644 index 0000000000000000000000000000000000000000..e46c05c6e5a5bc9beaa5771bc3e603bc44828c8f GIT binary patch literal 15448 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 19f288c59..6e45bd766 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -647,6 +647,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_passcode_enter_new" = "Enter new passcode"; "lng_passcode_confirm_new" = "Re-enter new passcode"; "lng_passcode_about" = "When a local passcode is set, a lock icon appears at the top of your chats list. Click it to lock the app.\n\nNote: if you forget your local passcode, you'll need to relogin in Telegram Desktop."; +"lng_passcode_about1" = "When a local passcode is set, a lock icon appears at the top of your chats list."; +"lng_passcode_about2" = "Click it to lock Telegram Desktop."; +"lng_passcode_about3" = "Note: if you forget your passcode, you'll need to log out of Telegram Desktop and log in again."; "lng_passcode_differ" = "Passcodes are different"; "lng_passcode_wrong" = "Wrong passcode"; "lng_passcode_is_same" = "Passcode was not changed"; @@ -655,6 +658,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_passcode_submit" = "Submit"; "lng_passcode_logout" = "Log out"; "lng_passcode_need_unblock" = "You need to unlock me first."; +"lng_passcode_create_button" = "Save Passcode"; +"lng_passcode_check_button" = "Submit"; +"lng_passcode_change_button" = "Save Passcode"; +"lng_passcode_create_title" = "Create Local Passcode"; +"lng_passcode_check_title" = "Enter Passcode"; +"lng_passcode_change_title" = "Enter Passcode"; "lng_cloud_password_waiting_code" = "Confirmation code sent to {email}..."; "lng_cloud_password_confirm" = "Confirm recovery email"; diff --git a/Telegram/Resources/qrc/telegram/animations.qrc b/Telegram/Resources/qrc/telegram/animations.qrc index f228e20b0..abb233167 100644 --- a/Telegram/Resources/qrc/telegram/animations.qrc +++ b/Telegram/Resources/qrc/telegram/animations.qrc @@ -3,5 +3,6 @@ ../../animations/change_number.tgs ../../animations/blocked_peers_empty.tgs ../../animations/filters.tgs + ../../animations/local_passcode_enter.tgs diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index 0ec8e9ea3..90336e8ba 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -142,6 +142,19 @@ settingsCloudPasswordLabel: FlatLabel(defaultFlatLabel) { } settingsCloudPasswordLabelPadding: margins(22px, 8px, 10px, 8px); +settingLocalPasscodeInputField: InputField(defaultInputField) { + width: 256px; +} +settingLocalPasscodeDescription: FlatLabel(changePhoneDescription) { + minWidth: 256px; +} +settingLocalPasscodeError: FlatLabel(changePhoneError) { + minWidth: 256px; +} +settingLocalPasscodeDescriptionBottomSkip: 15px; +settingLocalPasscodeIconPadding: margins(0px, 19px, 0px, 5px); +settingLocalPasscodeButtonPadding: margins(0px, 19px, 0px, 15px); + settingsInfoPhotoHeight: 161px; settingsInfoPhotoSize: 100px; settingsInfoPhoto: UserpicButton(defaultUserpicButton) { diff --git a/Telegram/SourceFiles/settings/settings_local_passcode.cpp b/Telegram/SourceFiles/settings/settings_local_passcode.cpp new file mode 100644 index 000000000..505625b28 --- /dev/null +++ b/Telegram/SourceFiles/settings/settings_local_passcode.cpp @@ -0,0 +1,195 @@ +/* +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/settings_local_passcode.h" + +#include "lang/lang_keys.h" +#include "lottie/lottie_icon.h" +#include "main/main_domain.h" +#include "main/main_session.h" +#include "storage/storage_domain.h" +#include "ui/widgets/buttons.h" +#include "ui/widgets/input_fields.h" +#include "ui/widgets/labels.h" +#include "ui/wrap/vertical_layout.h" +#include "window/window_session_controller.h" +#include "styles/style_settings.h" +#include "styles/style_boxes.h" + +namespace Settings { +namespace details { + +LocalPasscodeEnter::LocalPasscodeEnter( + QWidget *parent, + not_null controller) +: AbstractSection(parent) +, _controller(controller) { +} + +rpl::producer LocalPasscodeEnter::title() { + return tr::lng_settings_passcode_title(); +} + +void LocalPasscodeEnter::setupContent() { + const auto content = Ui::CreateChild(this); + + const auto isCreate = (enterType() == EnterType::Create); + const auto isCheck = (enterType() == EnterType::Check); + + auto icon = CreateLottieIcon( + content, + { + .name = u"local_passcode_enter"_q, + .sizeOverride = { + st::changePhoneIconSize, + st::changePhoneIconSize, + }, + }, + st::settingLocalPasscodeIconPadding); + content->add(std::move(icon.widget)); + _showFinished.events( + ) | rpl::start_with_next([animate = std::move(icon.animate)] { + animate(anim::repeat::once); + }, content->lifetime()); + + AddSkip(content); + + content->add( + object_ptr>( + content, + object_ptr( + content, + isCreate + ? tr::lng_passcode_create_title() + : isCheck + ? tr::lng_passcode_check_title() + : tr::lng_passcode_change_title(), + st::changePhoneTitle)), + st::changePhoneTitlePadding); + + const auto addDescription = [&](rpl::producer &&text) { + const auto &st = st::settingLocalPasscodeDescription; + content->add( + object_ptr>( + content, + object_ptr(content, std::move(text), st)), + st::changePhoneDescriptionPadding); + }; + + addDescription(tr::lng_passcode_about1()); + AddSkip(content); + addDescription(tr::lng_passcode_about2()); + + AddSkip(content, st::settingLocalPasscodeDescriptionBottomSkip); + + const auto addField = [&](rpl::producer &&text) { + const auto &st = st::settingLocalPasscodeInputField; + auto container = object_ptr(content); + container->resize(container->width(), st.heightMin); + const auto field = Ui::CreateChild( + container.data(), + st, + std::move(text)); + + container->geometryValue( + ) | rpl::start_with_next([=](const QRect &r) { + field->moveToLeft((r.width() - field->width()) / 2, 0); + }, container->lifetime()); + + content->add(std::move(container)); + return field; + }; + + const auto addError = [&](not_null input) { + const auto error = content->add( + object_ptr>( + content, + object_ptr( + content, + // Set any text to resize. + tr::lng_language_name(tr::now), + st::settingLocalPasscodeError)), + st::changePhoneDescriptionPadding)->entity(); + error->hide(); + QObject::connect(input.get(), &Ui::MaskedInputField::changed, [=] { + error->hide(); + }); + return error; + }; + + const auto newPasscode = addField(tr::lng_passcode_enter_first()); + + const auto reenterPasscode = isCheck + ? (Ui::PasswordInput*)(nullptr) + : addField(tr::lng_passcode_confirm_new()); + const auto reenterError = isCheck + ? (Ui::FlatLabel*)(nullptr) + : addError(reenterPasscode); + + const auto button = content->add( + object_ptr>( + content, + object_ptr( + content, + isCreate + ? tr::lng_passcode_create_button() + : isCheck + ? tr::lng_passcode_check_button() + : tr::lng_passcode_change_button(), + st::changePhoneButton)), + st::settingLocalPasscodeButtonPadding)->entity(); + button->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); + button->setClickedCallback([=] { + const auto newText = newPasscode->text(); + const auto reenterText = reenterPasscode + ? reenterPasscode->text() + : QString(); + if (isCreate) { + if (newText.isEmpty()) { + newPasscode->setFocus(); + newPasscode->showError(); + } else if (reenterText.isEmpty()) { + reenterPasscode->setFocus(); + reenterPasscode->showError(); + } else if (newText != reenterText) { + reenterPasscode->setFocus(); + reenterPasscode->showError(); + reenterPasscode->selectAll(); + reenterError->show(); + reenterError->setText(tr::lng_passcode_differ(tr::now)); + } else { + // showOther + } + } + }); + + _setInnerFocus.events( + ) | rpl::start_with_next([=] { + if (newPasscode->text().isEmpty()) { + newPasscode->setFocus(); + } else if (reenterPasscode && reenterPasscode->text().isEmpty()) { + reenterPasscode->setFocus(); + } else { + newPasscode->setFocus(); + } + }, content->lifetime()); + + Ui::ResizeFitChild(this, content); +} + +void LocalPasscodeEnter::showFinished() { + _showFinished.fire({}); +} + +void LocalPasscodeEnter::setInnerFocus() { + _setInnerFocus.fire({}); +} + +LocalPasscodeEnter::~LocalPasscodeEnter() = default; + +} // namespace details +} // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_local_passcode.h b/Telegram/SourceFiles/settings/settings_local_passcode.h new file mode 100644 index 000000000..ad12e1ee4 --- /dev/null +++ b/Telegram/SourceFiles/settings/settings_local_passcode.h @@ -0,0 +1,108 @@ +/* +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.h" + +namespace Settings { +namespace details { + +class LocalPasscodeEnter : public AbstractSection { +public: + enum class EnterType { + Create, + Check, + Change, + }; + + LocalPasscodeEnter( + QWidget *parent, + not_null controller); + ~LocalPasscodeEnter(); + + void showFinished() override; + void setInnerFocus() override; + + [[nodiscard]] rpl::producer title() override; + +protected: + void setupContent(); + + [[nodiscard]] virtual EnterType enterType() const = 0; + +private: + + const not_null _controller; + + rpl::event_stream<> _showFinished; + rpl::event_stream<> _setInnerFocus; + +}; + +} // namespace details + +class LocalPasscodeCreate; +class LocalPasscodeCheck; +class LocalPasscodeChange; + +template +class TypedLocalPasscodeEnter : public details::LocalPasscodeEnter { +public: + TypedLocalPasscodeEnter( + QWidget *parent, + not_null controller) + : details::LocalPasscodeEnter(parent, controller) { + setupContent(); + } + + [[nodiscard]] static Type Id() { + return &SectionMetaImplementation::Meta; + } + [[nodiscard]] Type id() const final override { + return Id(); + } + +protected: + [[nodiscard]] EnterType enterType() const final override { + if constexpr (std::is_same_v) { + return EnterType::Create; + } + if constexpr (std::is_same_v) { + return EnterType::Check; + } + if constexpr (std::is_same_v) { + return EnterType::Change; + } + return EnterType::Create; + } + +}; + +class LocalPasscodeCreate final + : public TypedLocalPasscodeEnter { +public: + using TypedLocalPasscodeEnter::TypedLocalPasscodeEnter; + +}; + +class LocalPasscodeCheck final + : public TypedLocalPasscodeEnter { +public: + using TypedLocalPasscodeEnter::TypedLocalPasscodeEnter; + +}; + +class LocalPasscodeChange final + : public TypedLocalPasscodeEnter { +public: + using TypedLocalPasscodeEnter::TypedLocalPasscodeEnter; + +}; + +} // namespace Settings +