diff --git a/image/assets/lang/English.json b/image/assets/lang/English.json index 7faf8c61b..94160a179 100644 --- a/image/assets/lang/English.json +++ b/image/assets/lang/English.json @@ -332,6 +332,10 @@ "app_onboarding_configuration_successful": "Your Pure was configured

successfully.", "app_onboarding_no_configuration": "Your Pure is not configured.

You can go to Settings to.

configure it.", "app_onboarding_update_info": "New Mudita OS version is available.

To update your Pure Phone, please

visit: www.mudita.com/updateos

and follow the instructions.", + "app_onboarding_set_password": "Set passcode that unlocks the phone", + "app_onboarding_confirm_password": "Confirm the passcode", + "app_onboarding_wrong_password": "Wrong passcode. Configure passcode again.", + "app_onboarding_passcode_configuration": "Configure passcode", "app_settings_title_main": "Advanced", "app_settings_title_main_new": "Settings", "app_settings_bt": "Bluetooth", diff --git a/module-apps/application-onboarding/ApplicationOnBoarding.cpp b/module-apps/application-onboarding/ApplicationOnBoarding.cpp index a5473583a..1fc1f0eaa 100644 --- a/module-apps/application-onboarding/ApplicationOnBoarding.cpp +++ b/module-apps/application-onboarding/ApplicationOnBoarding.cpp @@ -20,6 +20,7 @@ #include #include #include +#include namespace app { @@ -83,6 +84,18 @@ namespace app settings->setValue(settings::SystemProperties::eulaAccepted, "1", settings::SettingsScope::Global); } + void ApplicationOnBoarding::setLockPassHash(unsigned int value) + { + lockPassHash = value; + settings->setValue( + ::settings::SystemProperties::lockPassHash, std::to_string(value), ::settings::SettingsScope::Global); + } + + auto ApplicationOnBoarding::getLockPassHash() const noexcept -> unsigned int + { + return lockPassHash; + } + sys::ReturnCodes ApplicationOnBoarding::DeinitHandler() { return sys::ReturnCodes::Success; @@ -137,6 +150,13 @@ namespace app windowsFactory.attach(gui::window::name::change_time_zone, [](Application *app, const std::string &name) { return std::make_unique(app); }); + windowsFactory.attach(gui::window::name::onBoarding_configure_passcode, + [](Application *app, const std::string &name) { + return std::make_unique(app); + }); + windowsFactory.attach(gui::window::name::dialog_confirm, [](Application *app, const std::string &name) { + return std::make_unique(app, gui::window::name::dialog_confirm); + }); attachPopups({gui::popup::ID::Volume, gui::popup::ID::Tethering, diff --git a/module-apps/application-onboarding/ApplicationOnBoarding.hpp b/module-apps/application-onboarding/ApplicationOnBoarding.hpp index dbe234248..722b08d3a 100644 --- a/module-apps/application-onboarding/ApplicationOnBoarding.hpp +++ b/module-apps/application-onboarding/ApplicationOnBoarding.hpp @@ -16,6 +16,7 @@ namespace gui::window::name inline constexpr auto onBoarding_skip = "OnBoardingSkipConfirm"; inline constexpr auto onBoarding_date_and_time = "OnBoardingDateAndTime"; inline constexpr auto onBoarding_change_date_and_time = "OnBoardingChangeDateAndTime"; + inline constexpr auto onBoarding_configure_passcode = "OnBoardingConfigurePasscode"; } // namespace gui::window::name namespace app @@ -39,6 +40,12 @@ namespace app void createUserInterface() override; void destroyUserInterface() override; + + void setLockPassHash(unsigned int value); + [[nodiscard]] auto getLockPassHash() const noexcept -> unsigned int; + + private: + unsigned int lockPassHash = 0; }; template <> struct ManifestTraits diff --git a/module-apps/application-onboarding/CMakeLists.txt b/module-apps/application-onboarding/CMakeLists.txt index 3c265b521..19349ee8c 100644 --- a/module-apps/application-onboarding/CMakeLists.txt +++ b/module-apps/application-onboarding/CMakeLists.txt @@ -24,6 +24,7 @@ target_sources(${PROJECT_NAME} "${CMAKE_CURRENT_LIST_DIR}/windows/SkipDialogWindow.cpp" "${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingDateAndTimeWindow.cpp" "${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingChangeDateAndTimeWindow.cpp" + "${CMAKE_CURRENT_LIST_DIR}/windows/ConfigurePasscodeWindow.cpp" PUBLIC "${CMAKE_CURRENT_LIST_DIR}/ApplicationOnBoarding.hpp" "${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingMainWindow.hpp" diff --git a/module-apps/application-onboarding/windows/ConfigurePasscodeWindow.cpp b/module-apps/application-onboarding/windows/ConfigurePasscodeWindow.cpp new file mode 100644 index 000000000..0147201d2 --- /dev/null +++ b/module-apps/application-onboarding/windows/ConfigurePasscodeWindow.cpp @@ -0,0 +1,106 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "ConfigurePasscodeWindow.hpp" + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace lock_style = style::window::pin_lock; +namespace screen_lock_style = style::window::screen_pin_lock; + +namespace gui +{ + ConfigurePasscodeWindow::ConfigurePasscodeWindow(app::Application *app) : ChangePasscodeWindow(app) + { + lockState = PinLock::LockState::NewPasscodeRequired; + + textForEnterNewPassword = "app_onboarding_set_password"; + testForConfirmPassword = "app_onboarding_confirm_password"; + textForWrongPassword = "app_onboarding_worng_password"; + } + + auto ConfigurePasscodeWindow::onInput(const InputEvent &inputEvent) -> bool + { + if (inputEvent.isShortPress() && inputEvent.is(KeyCode::KEY_LF)) { + application->setLockScreenPasscodeOn(false); + application->switchWindow(gui::window::name::onBoarding_date_and_time, + gui::ShowMode::GUI_SHOW_INIT, + std::make_unique()); + } + + return ChangePasscodeWindow::onInput(inputEvent); + } + + void ConfigurePasscodeWindow::buildBottomBar() + { + bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::confirm)); + bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); + bottomBar->setText(BottomBar::Side::LEFT, utils::localize.get(style::strings::common::skip)); + } + + void ConfigurePasscodeWindow::buildTitleBar() + { + setTitle(utils::localize.get("app_onboarding_passcode_configuration")); + } + + void ConfigurePasscodeWindow::processPasscode() + { + switch (lockState) { + case PinLock::LockState::NewPasscodeConfirmRequired: + case PinLock::LockState::NewPasscodeInvalid: { + lockState = lockHandler.newPasscodeConfirmed(); + if (lockState == PinLock::LockState::Unlocked) { + auto app = static_cast(application); + app->setLockPassHash(lockHandler.getNewPasscodeHash()); + } + break; + } + default: + return ChangePasscodeWindow::processPasscode(); + } + } + + void ConfigurePasscodeWindow::setVisibleState() + { + switch (lockState) { + case PinLock::LockState::NewPasscodeInvalid: { + + auto metaData = std::make_unique( + gui::DialogMetadata{utils::localize.get("app_onboarding_passcode_configuration"), + "info_big_circle_W_G", + utils::localize.get("app_onboarding_wrong_password"), + "", + [this]() { + application->switchWindow(gui::window::name::onBoarding_configure_passcode, + gui::ShowMode::GUI_SHOW_INIT, + std::make_unique( + ChangePasscodeAction::OnlyProvideNewPasscode)); + return true; + }}); + + application->switchWindow( + gui::window::name::dialog_confirm, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData)); + + break; + } + case PinLock::LockState::Unlocked: { + application->setLockScreenPasscodeOn(true); + application->switchWindow(gui::window::name::onBoarding_date_and_time, + gui::ShowMode::GUI_SHOW_INIT, + std::make_unique()); + break; + } + default: + ChangePasscodeWindow::setVisibleState(); + break; + } + } +} // namespace gui diff --git a/module-apps/application-onboarding/windows/ConfigurePasscodeWindow.hpp b/module-apps/application-onboarding/windows/ConfigurePasscodeWindow.hpp new file mode 100644 index 000000000..1740a5b7d --- /dev/null +++ b/module-apps/application-onboarding/windows/ConfigurePasscodeWindow.hpp @@ -0,0 +1,26 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include +#include +#include +#include + +namespace gui +{ + class ConfigurePasscodeWindow : public ChangePasscodeWindow + { + public: + explicit ConfigurePasscodeWindow(app::Application *app); + bool onInput(const InputEvent &inputEvent) override; + + protected: + void buildBottomBar() override; + void buildTitleBar() override; + void processPasscode() override; + void setVisibleState() override; + }; +} /* namespace gui */ diff --git a/module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp b/module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp index 09bea162d..8de827cdd 100644 --- a/module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp +++ b/module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp @@ -1,12 +1,14 @@ // Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include "application-onboarding/ApplicationOnBoarding.hpp" #include "OnBoardingDateAndTimeWindow.hpp" #include "ConfigurationSuccessfulDialogWindow.hpp" + +#include #include #include #include +#include namespace app::onBoarding { @@ -30,7 +32,11 @@ namespace app::onBoarding bool OnBoardingDateAndTimeWindow::onInput(const gui::InputEvent &inputEvent) { if (inputEvent.isShortPress() && inputEvent.is(gui::KeyCode::KEY_RF)) { - return AppWindow::onInput(inputEvent); + application->switchWindow( + gui::window::name::onBoarding_configure_passcode, + gui::ShowMode::GUI_SHOW_INIT, + std::make_unique(ChangePasscodeAction::OnlyProvideNewPasscode)); + return true; } else if (inputEvent.isShortPress() && inputEvent.is(gui::KeyCode::KEY_LF)) { return getFocusItem()->onActivated(nullptr); diff --git a/module-apps/application-onboarding/windows/StartConfigurationWindow.cpp b/module-apps/application-onboarding/windows/StartConfigurationWindow.cpp index f249b582d..8a346615e 100644 --- a/module-apps/application-onboarding/windows/StartConfigurationWindow.cpp +++ b/module-apps/application-onboarding/windows/StartConfigurationWindow.cpp @@ -51,7 +51,7 @@ namespace app::onBoarding std::make_unique()); } if (inputEvent.is(gui::KeyCode::KEY_ENTER)) { - application->switchWindow(gui::window::name::onBoarding_date_and_time, + application->switchWindow(gui::window::name::onBoarding_configure_passcode, gui::ShowMode::GUI_SHOW_INIT, std::make_unique()); } diff --git a/module-apps/application-settings-new/windows/ChangePasscodeWindow.cpp b/module-apps/application-settings-new/windows/ChangePasscodeWindow.cpp index 3fc690845..35686e313 100644 --- a/module-apps/application-settings-new/windows/ChangePasscodeWindow.cpp +++ b/module-apps/application-settings-new/windows/ChangePasscodeWindow.cpp @@ -67,8 +67,11 @@ namespace gui lockBox = std::make_unique(this); lockBox->buildLockBox(lockHandler.getLock().getMaxPinSize()); - primaryText->setPosition(screen_lock_style::primary_text::y, gui::Axis::Y); - pinLabelsBox->setPosition(screen_lock_style::pin_label::y, gui::Axis::Y); + + lockImage = new gui::Image(this, lock_style::image::x, lock_style::image::y, 0, 0, "pin_lock"); + + primaryText->setPosition(lockImage->getHeight() + screen_lock_style::primary_text::y, gui::Axis::Y); + pinLabelsBox->setPosition(lockImage->getHeight() + screen_lock_style::pin_label::y, gui::Axis::Y); } void ChangePasscodeWindow::buildTitleBar() diff --git a/module-apps/application-settings-new/windows/ChangePasscodeWindow.hpp b/module-apps/application-settings-new/windows/ChangePasscodeWindow.hpp index 361a81c57..d89a6f1cb 100644 --- a/module-apps/application-settings-new/windows/ChangePasscodeWindow.hpp +++ b/module-apps/application-settings-new/windows/ChangePasscodeWindow.hpp @@ -17,18 +17,25 @@ namespace gui bool onInput(const InputEvent &inputEvent) override; void rebuild() override; - private: + protected: void buildBottomBar() override; void buildInterface() override; void buildTitleBar() override; void destroyInterface() override; void onBeforeShow(ShowMode mode, SwitchData *data) override; - void processPasscode(); - void setVisibleState(); + + virtual void processPasscode(); + virtual void setVisibleState(); ChangePasscodeAction changePasscodeAction; std::unique_ptr lockBox = nullptr; + gui::Image *lockImage = nullptr; PinLock::LockState lockState{PinLock::LockState::PasscodeRequired}; ChangePasscodeLockHandler lockHandler; + + std::string textForEnterCurrentPassword = "app_settings_security_type_current_passcode"; + std::string textForEnterNewPassword = "app_settings_security_enter_new_passcode"; + std::string testForConfirmPassword = "app_settings_security_confirm_new_passcode"; + std::string textForWrongPassword = "app_settings_security_wrong_passcode"; }; } /* namespace gui */