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 */