~aleteoryx/muditaos

017e3d88dc687c85f3d0aeab3cddf255c5cc5d99 — Przemyslaw Brudny 4 years ago 1429d4f
[EGD-5711] Finalized onBoarding application

Finalized onBoarding application. Added no sim ready window
and sim response window. Created iceBox widget. Fixed various
onBoarding errors and misalignment.
49 files changed, 510 insertions(+), 182 deletions(-)

M image/assets/lang/English.json
M image/user/db/settings_v2_002.sql
M module-apps/Application.cpp
M module-apps/CMakeLists.txt
M module-apps/application-onboarding/ApplicationOnBoarding.cpp
M module-apps/application-onboarding/ApplicationOnBoarding.hpp
M module-apps/application-onboarding/CMakeLists.txt
A module-apps/application-onboarding/data/OnBoardingMessages.hpp
A module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.cpp
A module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.hpp
M module-apps/application-onboarding/windows/ConfigurationSuccessfulDialogWindow.cpp
M module-apps/application-onboarding/windows/NoConfigurationDialogWindow.cpp
M module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.cpp
M module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.hpp
M module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp
M module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.cpp
D module-apps/application-onboarding/windows/OnBoardingMainWindow.cpp
M module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.cpp
M module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.hpp
M module-apps/application-onboarding/windows/StartConfigurationWindow.cpp
M module-apps/application-onboarding/windows/UpdateDialogWindow.cpp
M module-apps/application-onboarding/windows/UpdateDialogWindow.hpp
M module-apps/application-settings-new/ApplicationSettings.cpp
M module-apps/application-settings-new/ApplicationSettings.hpp
M module-apps/application-settings-new/windows/DateAndTimeMainWindow.cpp
M module-apps/application-settings-new/windows/DateAndTimeMainWindow.hpp
M module-apps/application-settings-new/windows/NetworkWindow.cpp
M module-apps/application-settings-new/windows/NetworkWindow.hpp
M module-apps/locks/data/LockStyle.hpp
M module-apps/locks/handlers/PhoneLockHandler.cpp
M module-apps/locks/handlers/SimLockHandler.cpp
M module-apps/locks/handlers/SimLockHandler.hpp
M module-apps/locks/widgets/PhoneLockBox.cpp
M module-apps/locks/windows/LockInputWindow.cpp
M module-apps/locks/windows/LockInputWindow.hpp
M module-apps/popups/CMakeLists.txt
M module-apps/popups/Popups.cpp
M module-apps/popups/Popups.hpp
M module-apps/popups/lock-popups/PhoneLockInputWindow.cpp
M module-apps/popups/lock-popups/PhoneLockedInfoWindow.cpp
M module-apps/popups/lock-popups/SimInfoWindow.cpp
M module-apps/popups/lock-popups/SimLockInputWindow.cpp
A module-apps/popups/lock-popups/SimNotReadyWindow.cpp
R module-apps/{application-onboarding/windows/OnBoardingMainWindow => popups/lock-popups/SimNotReadyWindow}.hpp
A module-apps/widgets/IceBox.cpp
A module-apps/widgets/IceBox.hpp
M module-services/service-appmgr/model/ApplicationManager.cpp
M module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp
M module-services/service-db/agents/settings/SystemSettings.hpp
M image/assets/lang/English.json => image/assets/lang/English.json +4 -2
@@ 246,6 246,8 @@
  "sim_setup_wrong_puk_last_attempt_warning": "<text>If the code is wrong this time, the<br></br>SIM card will be blocked and you'll<br></br>have to contact the operator.</text>",
  "sim_card_pin_disabled": "SIM card pin disabled",
  "sim_card_pin_enabled": "SIM card pin enabled",
  "sim_card_cant_connect": "<text>Cannot connect to <token>$SIM</token> card.<br></br>Please insert card.</text>",
  "sim_card_not_ready": "<text>Waiting for Modem to start.<br></br>This may take a moment.</text>",
  "app_desktop_press_to_unlock": "<text font='gt_pressura' size='27'>Press <b>Unlock</b> and then <b>#</b></text>",
  "app_desktop_unread_messages": "<text>Unread <b>messages</b></text>",
  "app_desktop_missed_calls": "<text>Missed <b>calls</b></text>",


@@ 318,8 320,8 @@
  "app_onboarding_title_configuration": "Configuration",
  "app_onboarding_title_update_info": "MuditaOS update",
  "app_onboarding_skip_confirm": "<text>Sim setup is required for network connection. Skip the setup anyway? </text>",
  "app_onboarding_configuration_successful": "<text>Your Pure was configured</text><br></br><text>successfully.</text>",
  "app_onboarding_no_configuration": "<text>Your Pure is not configured.</text><br></br><text>You can go to Settings to.</text><br></br><text>configure it.</text>",
  "app_onboarding_configuration_successful": "<text>Your Mudita Pure<br></br>is ready to use.</text>",
  "app_onboarding_no_configuration": "<text>Your Mudita Pure has not been<br></br>configured. You can go to<br></br>Settings to set it up.</text>",
  "app_onboarding_update_info": "<text>New Mudita OS version is available.</text><br></br><text>To update your Pure Phone, please</text><br></br><text>visit: </text><text font='gt_pressura' weight='bold' size='27'>www.mudita.com/updateos</text><br></br><text>and follow the instructions.</text>",
  "app_settings_title_main": "Advanced",
  "app_settings_title_main_new": "Settings",

M image/user/db/settings_v2_002.sql => image/user/db/settings_v2_002.sql +1 -1
@@ 19,7 19,7 @@ INSERT OR IGNORE INTO settings_tab (path, value) VALUES
    ('gs_display_language', 'English'),
    ('gs_input_language', 'English'),
    ('gs_eula_accepted', '0'),
    ('gs_onboarding_done', '0'),
    ('gs_onboarding_done', '1'),
    ('gs_usb_security', '1'),
    ('gs_usb_devices', ''),
    ('gs_os_update_version', '0.00.0'),

M module-apps/Application.cpp => module-apps/Application.cpp +6 -0
@@ 51,6 51,7 @@
#include <popups/lock-popups/PhoneLockChangeInfoWindow.hpp>
#include <popups/lock-popups/SimLockInputWindow.hpp>
#include <popups/lock-popups/SimInfoWindow.hpp>
#include <popups/lock-popups/SimNotReadyWindow.hpp>
#include <popups/data/PopupData.hpp>
#include <popups/data/PopupRequestParams.hpp>
#include <popups/data/PhoneModeParams.hpp>


@@ 774,6 775,7 @@ namespace app
                break;
            case ID::PhoneLock:
            case ID::PhoneLockInput:
            case ID::PhoneLockInfo:
            case ID::PhoneLockChangeInfo:
                windowsFactory.attach(window::phone_lock_window, [](Application *app, const std::string &name) {
                    return std::make_unique<gui::PhoneLockedWindow>(app, window::phone_lock_window);


@@ 796,12 798,16 @@ namespace app
                break;
            case ID::SimLock:
            case ID::SimInfo:
            case ID::SimNotReady:
                windowsFactory.attach(window::sim_unlock_window, [](Application *app, const std::string &name) {
                    return std::make_unique<gui::SimLockInputWindow>(app, window::sim_unlock_window);
                });
                windowsFactory.attach(window::sim_info_window, [](Application *app, const std::string &name) {
                    return std::make_unique<gui::SimInfoWindow>(app, window::sim_info_window);
                });
                windowsFactory.attach(window::sim_not_ready_window, [](Application *app, const std::string &name) {
                    return std::make_unique<gui::SimNotReadyWindow>(app, window::sim_not_ready_window);
                });
                break;
            }
        }

M module-apps/CMakeLists.txt => module-apps/CMakeLists.txt +1 -0
@@ 37,6 37,7 @@ set( SOURCES
    "widgets/ActiveIconFactory.cpp"
    "widgets/TextWithIconsWidget.cpp"
    "widgets/DateWidget.cpp"
    "widgets/IceBox.cpp"
    "widgets/TimeWidget.cpp"
    "widgets/WidgetsUtils.cpp"
    "notifications/NotificationListItem.cpp"

M module-apps/application-onboarding/ApplicationOnBoarding.cpp => module-apps/application-onboarding/ApplicationOnBoarding.cpp +32 -11
@@ 5,7 5,7 @@

#include "ApplicationOnBoarding.hpp"

#include "windows/OnBoardingMainWindow.hpp"
#include "data/OnBoardingMessages.hpp"
#include "windows/StartConfigurationWindow.hpp"
#include "windows/OnBoardingLanguagesWindow.hpp"
#include "windows/EULALicenseWindow.hpp"


@@ 23,6 23,8 @@
#include <module-services/service-db/agents/settings/SystemSettings.hpp>
#include <module-apps/application-settings-new/windows/ChangeTimeZone.hpp>
#include <module-apps/locks/data/PhoneLockMessages.hpp>
#include <module-apps/locks/data/SimLockMessages.hpp>
#include <service-appmgr/service-appmgr/model/ApplicationManager.hpp>

namespace app
{


@@ 42,6 44,7 @@ namespace app

        bus.channels.push_back(sys::BusChannel::ServiceDBNotifications);
        bus.channels.push_back(sys::BusChannel::PhoneLockChanges);
        bus.channels.push_back(sys::BusChannel::ServiceCellularNotifications);
    }

    // Invoked upon receiving data message


@@ 85,12 88,27 @@ namespace app
            return sys::msgHandled();
        });

        connect(typeid(cellular::msg::notification::SimReady), [&](sys::Message *msg) {
            if (getCurrentWindow()->getName() == gui::window::name::onBoarding_sim_select) {
                phoneLockSubject.setPhoneLock();
                return sys::msgHandled();
            }
            return sys::msgNotHandled();
        });

        return ret;
    }

    void ApplicationOnBoarding::acceptEULA()
    {
        settings->setValue(settings::SystemProperties::eulaAccepted, "1", settings::SettingsScope::Global);
        settings->setValue(
            settings::SystemProperties::eulaAccepted, utils::to_string(true), settings::SettingsScope::Global);
    }

    void ApplicationOnBoarding::finalizeOnBoarding()
    {
        bus.sendUnicast(std::make_shared<onBoarding::FinalizeOnBoarding>(),
                        app::manager::ApplicationManager::ServiceName);
    }

    sys::ReturnCodes ApplicationOnBoarding::DeinitHandler()


@@ 106,9 124,6 @@ namespace app
    void ApplicationOnBoarding::createUserInterface()
    {
        windowsFactory.attach(gui::name::window::main_window, [](Application *app, const std::string &name) {
            return std::make_unique<app::onBoarding::OnBoardingMainWindow>(app);
        });
        windowsFactory.attach(gui::window::name::onBoarding_languages, [](Application *app, const std::string &name) {
            return std::make_unique<app::onBoarding::OnBoardingLanguagesWindow>(app);
        });
        windowsFactory.attach(gui::window::name::onBoarding_start_configuration,


@@ 122,7 137,8 @@ namespace app
            return std::make_unique<app::onBoarding::EULALicenseWindow>(app, std::move(presenter));
        });
        windowsFactory.attach(gui::window::name::onBoarding_sim_select, [](Application *app, const std::string &name) {
            return std::make_unique<gui::OnBoardingSimSelectWindow>(app, gui::window::name::onBoarding_sim_select);
            return std::make_unique<app::onBoarding::OnBoardingSimSelectWindow>(
                app, gui::window::name::onBoarding_sim_select);
        });
        windowsFactory.attach(gui::window::name::onBoarding_no_sim_selected,
                              [](Application *app, const std::string &name) {


@@ 136,8 152,10 @@ namespace app
                              [](Application *app, const std::string &name) {
                                  return std::make_unique<app::onBoarding::NoConfigurationDialogWindow>(app);
                              });
        windowsFactory.attach(gui::window::name::onBoarding_update, [](Application *app, const std::string &name) {
            return std::make_unique<app::onBoarding::UpdateDialogWindow>(app);
        windowsFactory.attach(gui::window::name::onBoarding_update, [&](Application *app, const std::string &name) {
            auto presenter =
                std::make_unique<app::onBoarding::OnBoardingFinalizeWindowPresenter>([&]() { finalizeOnBoarding(); });
            return std::make_unique<app::onBoarding::UpdateDialogWindow>(app, std::move(presenter));
        });
        windowsFactory.attach(gui::window::name::onBoarding_skip, [](Application *app, const std::string &name) {
            return std::make_unique<app::onBoarding::SkipDialogWindow>(app);


@@ 148,7 166,7 @@ namespace app
                              });
        windowsFactory.attach(gui::window::name::onBoarding_change_date_and_time,
                              [](Application *app, const std::string &name) {
                                  return std::make_unique<gui::OnBoardingChangeDateAndTimeWindow>(app);
                                  return std::make_unique<app::onBoarding::OnBoardingChangeDateAndTimeWindow>(app);
                              });
        windowsFactory.attach(gui::window::name::change_time_zone, [](Application *app, const std::string &name) {
            return std::make_unique<gui::ChangeTimeZone>(app);


@@ 157,8 175,11 @@ namespace app
            return std::make_unique<gui::DialogConfirm>(app, gui::window::name::dialog_confirm);
        });

        attachPopups(
            {gui::popup::ID::Volume, gui::popup::ID::Tethering, gui::popup::ID::PhoneModes, gui::popup::ID::PhoneLock});
        attachPopups({gui::popup::ID::Volume,
                      gui::popup::ID::Tethering,
                      gui::popup::ID::PhoneModes,
                      gui::popup::ID::PhoneLock,
                      gui::popup::ID::SimLock});
    }

    void ApplicationOnBoarding::destroyUserInterface()

M module-apps/application-onboarding/ApplicationOnBoarding.hpp => module-apps/application-onboarding/ApplicationOnBoarding.hpp +1 -0
@@ 38,6 38,7 @@ namespace app
        sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override;

        void acceptEULA();
        void finalizeOnBoarding();

        void createUserInterface() override;
        void destroyUserInterface() override;

M module-apps/application-onboarding/CMakeLists.txt => module-apps/application-onboarding/CMakeLists.txt +3 -2
@@ 12,11 12,11 @@ target_sources(${PROJECT_NAME}

	PRIVATE
		"${CMAKE_CURRENT_LIST_DIR}/ApplicationOnBoarding.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingMainWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/StartConfigurationWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingLanguagesWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/EULALicenseWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/presenter/EULALicenseWindowPresenter.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/presenter/OnBoardingFinalizeWindowPresenter.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/model/EULARepository.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/ConfigurationSuccessfulDialogWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/NoConfigurationDialogWindow.cpp"


@@ 28,12 28,13 @@ target_sources(${PROJECT_NAME}
		"${CMAKE_CURRENT_LIST_DIR}/windows/NoSimSelectedDialogWindow.cpp"
	PUBLIC
		"${CMAKE_CURRENT_LIST_DIR}/ApplicationOnBoarding.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingMainWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/StartConfigurationWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingLanguagesWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/data/OnBoardingSwitchData.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/data/OnBoardingMessages.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/EULALicenseWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/presenter/EULALicenseWindowPresenter.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/presenter/OnBoardingFinalizeWindowPresenter.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/model/EULARepository.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/ConfigurationSuccessfulDialogWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/NoConfigurationDialogWindow.hpp"

A module-apps/application-onboarding/data/OnBoardingMessages.hpp => module-apps/application-onboarding/data/OnBoardingMessages.hpp +12 -0
@@ 0,0 1,12 @@
// 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 <Service/Message.hpp>

namespace app::onBoarding
{
    class FinalizeOnBoarding : public sys::DataMessage
    {};
} // namespace app::onBoarding

A module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.cpp => module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.cpp +17 -0
@@ 0,0 1,17 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "OnBoardingFinalizeWindowPresenter.hpp"

namespace app::onBoarding
{
    OnBoardingFinalizeWindowPresenter::OnBoardingFinalizeWindowPresenter(Function finalizeOnBoarding)
        : finalizeOnBoardingApp(std::move(finalizeOnBoarding))
    {}

    void OnBoardingFinalizeWindowPresenter::finalizeOnBoarding()
    {
        finalizeOnBoardingApp();
    }

} // namespace app::onBoarding

A module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.hpp => module-apps/application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.hpp +41 -0
@@ 0,0 1,41 @@
// 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 "functional"
#include "string"
#include "BasePresenter.hpp"

using Function = std::function<void()>;

namespace app::onBoarding
{
    class OnBoardingFinalizeContract
    {
      public:
        class View
        {
          public:
            virtual ~View() noexcept = default;
        };
        class Presenter : public BasePresenter<OnBoardingFinalizeContract::View>
        {
          public:
            ~Presenter() noexcept override = default;

            virtual void finalizeOnBoarding() = 0;
        };
    };

    class OnBoardingFinalizeWindowPresenter : public OnBoardingFinalizeContract::Presenter
    {
      public:
        explicit OnBoardingFinalizeWindowPresenter(Function finalizeOnBoarding);

        void finalizeOnBoarding() override;

      private:
        std::function<void()> finalizeOnBoardingApp;
    };
} // namespace app::onBoarding

M module-apps/application-onboarding/windows/ConfigurationSuccessfulDialogWindow.cpp => module-apps/application-onboarding/windows/ConfigurationSuccessfulDialogWindow.cpp +14 -3
@@ 3,12 3,14 @@

#include "ConfigurationSuccessfulDialogWindow.hpp"

#include <i18n/i18n.hpp>
#include <Style.hpp>

#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
#include <module-apps/application-onboarding/data/OnBoardingSwitchData.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
#include <widgets/IceBox.hpp>
#include <service-appmgr/Controller.hpp>

#include <i18n/i18n.hpp>
#include <Style.hpp>

namespace app::onBoarding
{


@@ 17,6 19,8 @@ namespace app::onBoarding
    {
        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(style::strings::common::start));
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);

        new gui::IceBox(this);
    }

    bool ConfigurationSuccessfulDialogWindow::onInput(const gui::InputEvent &inputEvent)


@@ 37,6 41,13 @@ namespace app::onBoarding
            if (inputEvent.is(gui::KeyCode::KEY_RF)) {
                return true;
            }

            if (inputEvent.is(gui::KeyCode::KEY_LEFT)) {
                app::manager::Controller::sendAction(application,
                                                     app::manager::actions::EmergencyDial,
                                                     std::make_unique<gui::SwitchData>(),
                                                     app::manager::OnSwitchBehaviour::RunInBackground);
            }
        }
        return AppWindow::onInput(inputEvent);
    }

M module-apps/application-onboarding/windows/NoConfigurationDialogWindow.cpp => module-apps/application-onboarding/windows/NoConfigurationDialogWindow.cpp +15 -3
@@ 3,12 3,14 @@

#include "NoConfigurationDialogWindow.hpp"

#include <i18n/i18n.hpp>
#include <Style.hpp>

#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
#include <module-apps/application-onboarding/data/OnBoardingSwitchData.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
#include <widgets/IceBox.hpp>
#include <service-appmgr/Controller.hpp>

#include <i18n/i18n.hpp>
#include <Style.hpp>

namespace app::onBoarding
{


@@ 17,6 19,8 @@ namespace app::onBoarding
    {
        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(style::strings::common::start));
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);

        new gui::IceBox(this);
    }

    bool NoConfigurationDialogWindow::onInput(const gui::InputEvent &inputEvent)


@@ 37,6 41,14 @@ namespace app::onBoarding
            if (inputEvent.is(gui::KeyCode::KEY_RF)) {
                return true;
            }

            if (inputEvent.is(gui::KeyCode::KEY_LEFT)) {
                app::manager::Controller::sendAction(application,
                                                     app::manager::actions::EmergencyDial,
                                                     std::make_unique<gui::SwitchData>(),
                                                     app::manager::OnSwitchBehaviour::RunInBackground);
                return true;
            }
        }
        return AppWindow::onInput(inputEvent);
    }

M module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.cpp => module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.cpp +2 -2
@@ 5,7 5,7 @@
#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
#include <InputEvent.hpp>

namespace gui
namespace app::onBoarding
{
    OnBoardingChangeDateAndTimeWindow::OnBoardingChangeDateAndTimeWindow(app::Application *app)
        : ChangeDateAndTimeWindow(app, gui::window::name::onBoarding_change_date_and_time)


@@ 22,4 22,4 @@ namespace gui
        return ChangeDateAndTimeWindow::onInput(inputEvent);
    }

} /* namespace gui */
} // namespace app::onBoarding

M module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.hpp => module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.hpp +4 -4
@@ 6,13 6,13 @@
#include <application-settings-new/windows/ChangeDateAndTimeWindow.hpp>
#include <application-settings-new/models/DateAndTimeModel.hpp>

namespace gui
namespace app::onBoarding
{
    class OnBoardingChangeDateAndTimeWindow : public ChangeDateAndTimeWindow
    class OnBoardingChangeDateAndTimeWindow : public gui::ChangeDateAndTimeWindow
    {
      public:
        explicit OnBoardingChangeDateAndTimeWindow(app::Application *app);

        bool onInput(const InputEvent &inputEvent) override;
        bool onInput(const gui::InputEvent &inputEvent) override;
    };
} /* namespace gui */
} // namespace app::onBoarding

M module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp => module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp +12 -2
@@ 8,11 8,13 @@
#include <module-gui/gui/input/InputEvent.hpp>
#include <module-apps/application-onboarding/data/OnBoardingSwitchData.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
#include <module-apps/application-settings-new/data/ChangePasscodeData.hpp>
#include <widgets/IceBox.hpp>
#include <service-appmgr/Controller.hpp>

namespace app::onBoarding
{
    OnBoardingDateAndTimeWindow::OnBoardingDateAndTimeWindow(app::Application *app) : DateAndTimeMainWindow(app)
    OnBoardingDateAndTimeWindow::OnBoardingDateAndTimeWindow(app::Application *app)
        : DateAndTimeMainWindow(app, gui::window::name::onBoarding_date_and_time)
    {
        changeDateAndTimeWindow = gui::window::name::onBoarding_change_date_and_time;
    }


@@ 25,6 27,7 @@ namespace app::onBoarding
    void OnBoardingDateAndTimeWindow::onBeforeShow(gui::ShowMode mode, gui::SwitchData *data)
    {
        DateAndTimeMainWindow::onBeforeShow(mode, data);
        new gui::IceBox(this);

        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(style::strings::common::save));
        bottomBar->setText(gui::BottomBar::Side::LEFT, utils::translate(style::strings::common::Switch));


@@ 48,6 51,13 @@ namespace app::onBoarding
                                      std::move(metaData));
            return true;
        }
        else if (inputEvent.isShortRelease(gui::KeyCode::KEY_LEFT)) {
            app::manager::Controller::sendAction(application,
                                                 app::manager::actions::EmergencyDial,
                                                 std::make_unique<gui::SwitchData>(),
                                                 app::manager::OnSwitchBehaviour::RunInBackground);
            return true;
        }
        else {
            return DateAndTimeMainWindow::onInput(inputEvent);
        }

M module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.cpp => module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.cpp +13 -2
@@ 1,9 1,12 @@
// 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 "OnBoardingLanguagesWindow.hpp"
#include <application-onboarding/ApplicationOnBoarding.hpp>

#include <widgets/IceBox.hpp>
#include <module-gui/gui/input/InputEvent.hpp>
#include <service-appmgr/Controller.hpp>

namespace app::onBoarding
{


@@ 14,6 17,7 @@ namespace app::onBoarding
    void OnBoardingLanguagesWindow::onBeforeShow(gui::ShowMode mode, gui::SwitchData *data)
    {
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);
        new gui::IceBox(this);

        LanguagesWindow::onBeforeShow(mode, data);
    }


@@ 23,8 27,15 @@ namespace app::onBoarding
        if (inputEvent.isShortRelease(gui::KeyCode::KEY_RF)) {
            return true;
        }
        else if (inputEvent.isShortRelease(gui::KeyCode::KEY_LEFT)) {
            app::manager::Controller::sendAction(application,
                                                 app::manager::actions::EmergencyDial,
                                                 std::make_unique<gui::SwitchData>(),
                                                 app::manager::OnSwitchBehaviour::RunInBackground);
            return true;
        }
        else {
            return LanguagesWindow::onInput(inputEvent);
        }
    }
} /* namespace gui */
} // namespace app::onBoarding

D module-apps/application-onboarding/windows/OnBoardingMainWindow.cpp => module-apps/application-onboarding/windows/OnBoardingMainWindow.cpp +0 -52
@@ 1,52 0,0 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <i18n/i18n.hpp>
#include <Style.hpp>

#include <InputEvent.hpp>

#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>

#include "module-apps/application-onboarding/data/OnBoardingSwitchData.hpp"
#include "OnBoardingMainWindow.hpp"

namespace app::onBoarding
{
    OnBoardingMainWindow::OnBoardingMainWindow(app::Application *app) : AppWindow(app, gui::name::window::main_window)
    {
        buildInterface();
    }

    void OnBoardingMainWindow::buildInterface()
    {
        AppWindow::buildInterface();

        bottomBar->setActive(gui::BottomBar::Side::CENTER, true);
        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(::style::strings::common::start));

        new gui::Image(this, 0, 0, 0, 0, "logo");
    }

    gui::top_bar::Configuration OnBoardingMainWindow::configureTopBar(gui::top_bar::Configuration appConfiguration)
    {
        appConfiguration.setIndicator(gui::top_bar::Indicator::Time, false);
        appConfiguration.setIndicator(gui::top_bar::Indicator::Battery, false);
        appConfiguration.setIndicator(gui::top_bar::Indicator::SimCard, false);
        appConfiguration.setIndicator(gui::top_bar::Indicator::Signal, false);
        return appConfiguration;
    }

    bool OnBoardingMainWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (inputEvent.isShortRelease(gui::KeyCode::KEY_ENTER)) {
            application->switchWindow(gui::window::name::onBoarding_languages,
                                      gui::ShowMode::GUI_SHOW_INIT,
                                      std::make_unique<OnBoardingSwitchData>());

            return true;
        }
        return AppWindow::onInput(inputEvent);
    }

} // namespace gui

M module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.cpp => module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.cpp +15 -9
@@ 7,9 7,11 @@
#include <application-onboarding/style/OnBoardingStyle.hpp>
#include <OptionSetting.hpp>

#include <widgets/IceBox.hpp>
#include <service-appmgr/Controller.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>

namespace gui
namespace app::onBoarding
{
    OnBoardingSimSelectWindow::OnBoardingSimSelectWindow(app::Application *app, std::string name)
        : BaseSettingsWindow(app, std::move(name))


@@ 25,6 27,8 @@ namespace gui
        bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::translate(::style::strings::common::back));
        bottomBar->setText(gui::BottomBar::Side::LEFT, utils::translate(::style::strings::common::skip));

        new gui::IceBox(this);

        descriptionText = new gui::Text(this,
                                        style::window::default_left_margin,
                                        style::onboarding::sim_select::description_y,


@@ 33,17 37,12 @@ namespace gui
        descriptionText->setFont(style::window::font::medium);
        descriptionText->setAlignment(
            gui::Alignment{gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top});
        descriptionText->setEdges(RectangleEdge::Top);
        descriptionText->setEdges(gui::RectangleEdge::Top);
        descriptionText->setPenWidth(style::window::default_border_rect_no_focus);
        descriptionText->setPadding(Padding(0, style::onboarding::sim_select::description_top_padding, 0, 0));
        descriptionText->setPadding(gui::Padding(0, style::onboarding::sim_select::description_top_padding, 0, 0));
        descriptionText->setRichText(utils::translate("app_onboarding_select_sim_description"));
    }

    void OnBoardingSimSelectWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        refreshOptionsList();
    }

    auto OnBoardingSimSelectWindow::buildOptionsList() -> std::list<gui::Option>
    {
        std::list<gui::Option> options;


@@ 97,6 96,13 @@ namespace gui
                gui::window::name::onBoarding_skip, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
            return true;
        }
        else if (inputEvent.isShortRelease(gui::KeyCode::KEY_LEFT)) {
            app::manager::Controller::sendAction(application,
                                                 app::manager::actions::EmergencyDial,
                                                 std::make_unique<gui::SwitchData>(),
                                                 app::manager::OnSwitchBehaviour::RunInBackground);
            return true;
        }
        return AppWindow::onInput(inputEvent);
    }
} /* namespace gui */
} // namespace app::onBoarding

M module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.hpp => module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.hpp +4 -5
@@ 6,9 6,9 @@
#include <application-settings-new/windows/BaseSettingsWindow.hpp>
#include <Text.hpp>

namespace gui
namespace app::onBoarding
{
    class OnBoardingSimSelectWindow : public BaseSettingsWindow
    class OnBoardingSimSelectWindow : public gui::BaseSettingsWindow
    {
      public:
        explicit OnBoardingSimSelectWindow(app::Application *app, std::string name);


@@ 17,8 17,7 @@ namespace gui
      private:
        gui::Text *descriptionText = nullptr;

        auto buildOptionsList() -> std::list<Option> override;
        void onBeforeShow(ShowMode mode, SwitchData *data) override;
        auto buildOptionsList() -> std::list<gui::Option> override;
        bool onInput(const gui::InputEvent &inputEvent) override;
    };
} /* namespace gui */
} // namespace app::onBoarding

M module-apps/application-onboarding/windows/StartConfigurationWindow.cpp => module-apps/application-onboarding/windows/StartConfigurationWindow.cpp +9 -0
@@ 8,6 8,8 @@

#include <module-apps/windows/DialogMetadata.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
#include <widgets/IceBox.hpp>
#include <service-appmgr/Controller.hpp>

#include <i18n/i18n.hpp>
#include <Style.hpp>


@@ 29,6 31,7 @@ namespace app::onBoarding
        bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::translate(::style::strings::common::back));
        bottomBar->setText(gui::BottomBar::Side::LEFT, utils::translate(::style::strings::common::skip));

        new gui::IceBox(this);
        new gui::Icon(this,
                      0,
                      0,


@@ 51,6 54,12 @@ namespace app::onBoarding
                                          gui::ShowMode::GUI_SHOW_INIT,
                                          std::make_unique<OnBoardingSwitchData>());
            }
            if (inputEvent.is(gui::KeyCode::KEY_LEFT)) {
                app::manager::Controller::sendAction(application,
                                                     app::manager::actions::EmergencyDial,
                                                     std::make_unique<gui::SwitchData>(),
                                                     app::manager::OnSwitchBehaviour::RunInBackground);
            }
            if (inputEvent.is(gui::KeyCode::KEY_LF)) {

                auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{

M module-apps/application-onboarding/windows/UpdateDialogWindow.cpp => module-apps/application-onboarding/windows/UpdateDialogWindow.cpp +7 -8
@@ 6,26 6,25 @@
#include <i18n/i18n.hpp>
#include <Style.hpp>

#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
#include <module-apps/application-onboarding/data/OnBoardingSwitchData.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
#include <application-onboarding/ApplicationOnBoarding.hpp>
#include <service-appmgr/service-appmgr/Controller.hpp>

namespace app::onBoarding
{
    UpdateDialogWindow::UpdateDialogWindow(app::Application *app)
        : gui::Dialog(app, gui::window::name::onBoarding_update)
    UpdateDialogWindow::UpdateDialogWindow(app::Application *app,
                                           std::unique_ptr<OnBoardingFinalizeContract::Presenter> &&windowPresenter)
        : gui::Dialog(app, gui::window::name::onBoarding_update), presenter(std::move(windowPresenter))
    {
        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(style::strings::common::ok));
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);
        presenter->attach(this);
    }

    bool UpdateDialogWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (inputEvent.isShortRelease()) {
            if (inputEvent.is(gui::KeyCode::KEY_ENTER)) {
                application->switchWindow(gui::window::name::onBoarding_start_configuration,
                                          gui::ShowMode::GUI_SHOW_INIT,
                                          std::make_unique<OnBoardingSwitchData>());
                presenter->finalizeOnBoarding();
                return true;
            }
            if (inputEvent.is(gui::KeyCode::KEY_RF)) {

M module-apps/application-onboarding/windows/UpdateDialogWindow.hpp => module-apps/application-onboarding/windows/UpdateDialogWindow.hpp +8 -7
@@ 5,18 5,19 @@

#include "Dialog.hpp"

#include <module-apps/application-onboarding/presenter/EULALicenseWindowPresenter.hpp>

#include <module-gui/gui/widgets/Label.hpp>
#include <module-gui/gui/widgets/Text.hpp>
#include <module-gui/gui/input/InputEvent.hpp>
#include <application-onboarding/presenter/EULALicenseWindowPresenter.hpp>
#include <application-onboarding/presenter/OnBoardingFinalizeWindowPresenter.hpp>

namespace app::onBoarding
{
    class UpdateDialogWindow : public gui::Dialog
    class UpdateDialogWindow : public gui::Dialog, public OnBoardingFinalizeContract::View
    {
      private:
        std::unique_ptr<OnBoardingFinalizeContract::Presenter> presenter;

      public:
        explicit UpdateDialogWindow(app::Application *app);
        UpdateDialogWindow(app::Application *app,
                           std::unique_ptr<OnBoardingFinalizeContract::Presenter> &&windowPresenter);

        bool onInput(const gui::InputEvent &inputEvent) override;
    };

M module-apps/application-settings-new/ApplicationSettings.cpp => module-apps/application-settings-new/ApplicationSettings.cpp +7 -2
@@ 147,7 147,7 @@ namespace app
            return ret;
        }
        connect(typeid(cellular::msg::notification::SimReady), [&](sys::Message *) {
            selectedSim      = Store::GSM::get()->selected;
            selectedSim = Store::GSM::get()->selected;
            CellularServiceAPI::RequestForOwnNumber(this);
            auto currentWindow = getCurrentWindow();
            if (gui::window::name::network == currentWindow->getName()) {


@@ 440,7 440,7 @@ namespace app
            return std::make_unique<gui::LanguagesWindow>(app);
        });
        windowsFactory.attach(gui::window::name::date_and_time, [](Application *app, const std::string &name) {
            return std::make_unique<gui::DateAndTimeMainWindow>(app);
            return std::make_unique<gui::DateAndTimeMainWindow>(app, gui::window::name::date_and_time);
        });
        windowsFactory.attach(gui::window::name::about_your_pure, [](Application *app, const std::string &name) {
            return std::make_unique<gui::AboutYourPureWindow>(app);


@@ 524,6 524,11 @@ namespace app
        getSimLockSubject().setSim(arg);
    }

    void ApplicationSettingsNew::updateSim()
    {
        selectedSim = Store::GSM::get()->selected;
    }

    Store::GSM::SIM ApplicationSettingsNew::getSim()
    {
        return selectedSim;

M module-apps/application-settings-new/ApplicationSettings.hpp => module-apps/application-settings-new/ApplicationSettings.hpp +2 -0
@@ 90,6 90,7 @@ namespace app
          public:
            virtual ~SimParams()                     = default;
            virtual void setSim(Store::GSM::SIM sim) = 0;
            virtual void updateSim()                 = 0;
            virtual Store::GSM::SIM getSim()         = 0;
            virtual std::string getNumber()          = 0;
        };


@@ 201,6 202,7 @@ namespace app
        void createUserInterface() override;
        void destroyUserInterface() override;
        void setSim(Store::GSM::SIM sim) override;
        void updateSim() override;
        Store::GSM::SIM getSim() override;
        std::string getNumber() override;


M module-apps/application-settings-new/windows/DateAndTimeMainWindow.cpp => module-apps/application-settings-new/windows/DateAndTimeMainWindow.cpp +2 -2
@@ 10,8 10,8 @@

namespace gui
{
    DateAndTimeMainWindow::DateAndTimeMainWindow(app::Application *app)
        : BaseSettingsWindow(app, window::name::date_and_time)
    DateAndTimeMainWindow::DateAndTimeMainWindow(app::Application *app, std::string name)
        : BaseSettingsWindow(app, std::move(name))
    {
        setTitle(utils::translate("app_settings_date_and_time"));
        automaticDateAndTimeIsOn = utils::dateAndTimeSettings.isAutomaticDateAndTimeOn();

M module-apps/application-settings-new/windows/DateAndTimeMainWindow.hpp => module-apps/application-settings-new/windows/DateAndTimeMainWindow.hpp +1 -1
@@ 11,7 11,7 @@ namespace gui
    class DateAndTimeMainWindow : public BaseSettingsWindow
    {
      public:
        explicit DateAndTimeMainWindow(app::Application *app);
        DateAndTimeMainWindow(app::Application *app, std::string name);

      protected:
        auto buildOptionsList() -> std::list<Option> override;

M module-apps/application-settings-new/windows/NetworkWindow.cpp => module-apps/application-settings-new/windows/NetworkWindow.cpp +6 -0
@@ 18,6 18,12 @@ namespace gui
          operatorsSettings(operatorsSettings)
    {}

    void NetworkWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        simParams->updateSim();
        BaseSettingsWindow::onBeforeShow(mode, data);
    }

    auto NetworkWindow::buildOptionsList() -> std::list<gui::Option>
    {
        std::list<gui::Option> optList;

M module-apps/application-settings-new/windows/NetworkWindow.hpp => module-apps/application-settings-new/windows/NetworkWindow.hpp +3 -1
@@ 23,7 23,7 @@ namespace gui
    class NetworkWindow : public BaseSettingsWindow
    {
      private:
        auto buildOptionsList() -> std::list<Option>;
        auto buildOptionsList() -> std::list<Option> override;
        app::settingsInterface::SimParams *simParams;
        app::settingsInterface::OperatorsSettings *operatorsSettings;



@@ 31,5 31,7 @@ namespace gui
        NetworkWindow(app::Application *app,
                      app::settingsInterface::SimParams *simParams,
                      app::settingsInterface::OperatorsSettings *operatorsSettings);

        void onBeforeShow(ShowMode mode, SwitchData *data) override;
    };
} // namespace gui

M module-apps/locks/data/LockStyle.hpp => module-apps/locks/data/LockStyle.hpp +0 -16
@@ 22,22 22,6 @@ namespace style::window::lock_input
        constexpr inline auto top_margin   = 30;
    } // namespace pin_label

    namespace ice
    {
        constexpr inline auto x = style::window::default_left_margin;
        constexpr inline auto y = 60;
        constexpr inline auto w = 60;
        constexpr inline auto h = 50;

        constexpr inline auto margin = 3;

        namespace text
        {
            constexpr inline auto w = 40;
        }

    } // namespace ice

    namespace primary_text
    {
        constexpr inline auto h = 60;

M module-apps/locks/handlers/PhoneLockHandler.cpp => module-apps/locks/handlers/PhoneLockHandler.cpp +4 -0
@@ 66,6 66,10 @@ namespace locks
            app::manager::Controller::sendAction(owner,
                                                 app::manager::actions::AbortPopup,
                                                 std::make_unique<gui::PopupRequestParams>(gui::popup::ID::PhoneLock));
            app::manager::Controller::sendAction(
                owner,
                app::manager::actions::AbortPopup,
                std::make_unique<gui::PopupRequestParams>(gui::popup::ID::PhoneLockInfo));
        }
    }


M module-apps/locks/handlers/SimLockHandler.cpp => module-apps/locks/handlers/SimLockHandler.cpp +58 -7
@@ 4,13 4,13 @@
#include "SimLockHandler.hpp"

#include <service-appmgr/service-appmgr/Controller.hpp>
#include <locks/widgets/LockHash.hpp>
#include <Utils.hpp>
#include <memory>

#include <module-apps/popups/data/PopupRequestParams.hpp>
#include <service-cellular-api>
#include <module-utils/common_data/EventStore.hpp>
#include <module-sys/Timers/TimerFactory.hpp>
#include <service-cellular-api>

namespace locks
{


@@ 22,6 22,11 @@ namespace locks
        : owner(owner), lock(Lock::LockState::Unlocked, default_attempts)
    {
        lock.setInputSizeBounds(min_input_size, max_input_size);

        simResponseTimer = sys::TimerFactory::createSingleShotTimer(
            owner, simResponseTimerName, std::chrono::seconds{1}, [this](sys::Timer &) {
                handleSimNotRespondingMessage();
            });
    }

    void SimLockHandler::clearStoredInputs()


@@ 32,6 37,8 @@ namespace locks

    void SimLockHandler::setSimInputTypeAction(SimInputTypeAction _simInputTypeAction)
    {
        simResponseTimer.stop();

        if (simInputTypeAction != _simInputTypeAction) {
            simInputTypeAction = _simInputTypeAction;
            lock.lockState     = Lock::LockState::Unlocked;


@@ 61,6 68,20 @@ namespace locks
                                             std::make_unique<gui::PopupRequestParams>(gui::popup::ID::SimLock));
    }

    void SimLockHandler::simNotReadyAction()
    {
        app::manager::Controller::sendAction(owner,
                                             app::manager::actions::ShowPopup,
                                             std::make_unique<gui::PopupRequestParams>(gui::popup::ID::SimNotReady));
    }

    void SimLockHandler::simReadyAction()
    {
        app::manager::Controller::sendAction(owner,
                                             app::manager::actions::AbortPopup,
                                             std::make_unique<gui::PopupRequestParams>(gui::popup::ID::SimNotReady));
    }

    void SimLockHandler::simInfoAction()
    {
        app::manager::Controller::sendAction(


@@ 71,10 92,10 @@ namespace locks

    void SimLockHandler::getSettingsSimSelect(const std::string &settingsSim)
    {
        auto selectedSim            = magic_enum::enum_cast<Store::GSM::SIM>(settingsSim);
        Store::GSM::get()->selected = selectedSim.value();
        auto selectedSim = magic_enum::enum_cast<Store::GSM::SIM>(settingsSim);

        if ((selectedSim.value() == Store::GSM::SIM::SIM1 || selectedSim.value() == Store::GSM::SIM::SIM2)) {
        if (selectedSim.has_value() &&
            (selectedSim.value() == Store::GSM::SIM::SIM1 || selectedSim.value() == Store::GSM::SIM::SIM2)) {
            setSim(static_cast<cellular::api::SimSlot>(selectedSim.value()));
        }
        else {


@@ 84,7 105,14 @@ namespace locks

    void SimLockHandler::setSim(cellular::api::SimSlot simSlot)
    {
        owner->bus.sendUnicast<cellular::msg::request::sim::SetActiveSim>(simSlot);
        if (simReady) {
            simResponseTimer.start();
            Store::GSM::get()->selected = static_cast<Store::GSM::SIM>(simSlot);
            owner->bus.sendUnicast<cellular::msg::request::sim::SetActiveSim>(simSlot);
        }
        else {
            simNotReadyAction();
        }
    }

    sys::MessagePointer SimLockHandler::handleSimPinRequest(unsigned int attempts)


@@ 147,7 175,7 @@ namespace locks
        return sys::msgHandled();
    }

    sys::MessagePointer SimLockHandler::handleSimChangedMessage()
    sys::MessagePointer SimLockHandler::handleSimPinChangedMessage()
    {
        lock.lockState = Lock::LockState::Unlocked;
        simInfoAction();


@@ 240,6 268,22 @@ namespace locks
        return sys::msgHandled();
    }

    sys::MessagePointer SimLockHandler::handleSimReadyMessage()
    {
        simResponseTimer.stop();
        return sys::msgHandled();
    }

    sys::MessagePointer SimLockHandler::handleSimNotRespondingMessage()
    {
        setSimInputTypeAction(SimInputTypeAction::Error);

        lock.lockName = utils::enumToString(Store::GSM::get()->selected);
        simInfoAction();

        return sys::msgHandled();
    }

    sys::MessagePointer SimLockHandler::processLockWithNewInput(LockInput inputData)
    {
        if (lock.isState(Lock::LockState::InputRequired) || (lock.isState(Lock::LockState::InputInvalid))) {


@@ 289,6 333,12 @@ namespace locks
        simUnlockBlockOnLockedPhone = true;
    }

    void SimLockHandler::setSimReady()
    {
        simReady = true;
        simReadyAction();
    }

    sys::MessagePointer SimLockHandler::releaseSimUnlockBlockOnLockedPhone()
    {
        if (simUnlockBlockOnLockedPhone) {


@@ 351,4 401,5 @@ namespace locks
                                                                        pinInputData);
        return sys::msgHandled();
    }

} // namespace locks

M module-apps/locks/handlers/SimLockHandler.hpp => module-apps/locks/handlers/SimLockHandler.hpp +13 -2
@@ 8,10 8,12 @@
#include <locks/data/LockData.hpp>

#include <module-sys/Service/Service.hpp>
#include <Timers/TimerHandle.hpp>

namespace locks
{
    using StoredLockInput = std::vector<unsigned int>;
    using StoredLockInput               = std::vector<unsigned int>;
    constexpr auto simResponseTimerName = "SimResponseTimer";

    class SimLockHandler
    {


@@ 22,9 24,12 @@ namespace locks
        SimInputTypeAction simInputTypeAction = SimInputTypeAction::UnlockWithPin;
        unsigned int storedErrorCode          = 0;
        bool simUnlockBlockOnLockedPhone      = false;
        bool simReady                         = false;
        StoredLockInput storedFirstInput;
        StoredLockInput storedSecondInput;

        sys::TimerHandle simResponseTimer;

        void clearStoredInputs();
        void setSimInputTypeAction(SimInputTypeAction _simInputTypeAction);



@@ 32,6 37,8 @@ namespace locks
        void simErrorAction(unsigned int errorCode);
        void simUnlockAction();
        void simInfoAction();
        void simNotReadyAction();
        void simReadyAction();

        sys::MessagePointer unlockSimWithPin(LockInput pinInputData);
        sys::MessagePointer processLockWithNewInput(LockInput inputData);


@@ 45,6 52,8 @@ namespace locks
        explicit SimLockHandler(sys::Service *owner);

        void setSimUnlockBlockOnLockedPhone();
        void setSimReady();

        sys::MessagePointer releaseSimUnlockBlockOnLockedPhone();

        sys::MessagePointer verifySimLockInput(LockInput inputData);


@@ 58,8 67,10 @@ namespace locks
        sys::MessagePointer handleSimBlockedRequest();
        sys::MessagePointer handleCMEErrorRequest(unsigned int errorCode);
        sys::MessagePointer handleSimUnlockedMessage();
        sys::MessagePointer handleSimChangedMessage();
        sys::MessagePointer handleSimPinChangedMessage();
        sys::MessagePointer handleSimAvailabilityMessage();
        sys::MessagePointer handleSimReadyMessage();
        sys::MessagePointer handleSimNotRespondingMessage();

        void getSettingsSimSelect(const std::string &settingsSim);
        void setSim(cellular::api::SimSlot simSlot);

M module-apps/locks/widgets/PhoneLockBox.cpp => module-apps/locks/widgets/PhoneLockBox.cpp +1 -1
@@ 36,7 36,7 @@ namespace gui
            leftBottomBarState     = false;
            break;
        case locks::PhoneLockInputTypeAction::Set:
            LockWindow->setTitleBar(true, false);
            LockWindow->setTitleBar(true, true);
            LockWindow->setText("phone_lock_configure", LockInputWindow::TextType::Title);

            textForInputRequired   = "phone_lock_current";

M module-apps/locks/windows/LockInputWindow.cpp => module-apps/locks/windows/LockInputWindow.cpp +7 -19
@@ 72,25 72,7 @@ namespace gui

    void LockInputWindow::buildIceBox()
    {
        using namespace style::window::lock_input;

        iceBox = new gui::HBox(this, ice::x, ice::y, ice::w, ice::h);
        iceBox->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
        iceBox->setEdges(RectangleEdge::None);
        iceBox->setVisible(false);

        auto arrow        = new gui::Image("left_label_arrow");
        arrow->activeItem = false;
        arrow->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
        arrow->setMargins(Margins(0, 0, ice::margin, 0));
        iceBox->addWidget(arrow);

        auto iceText        = new gui::Text(nullptr, 0, 0, ice::text::w, ice::h);
        iceText->activeItem = false;
        iceText->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
        iceText->setFont(style::window::font::verysmall);
        iceText->setText(utils::translate("app_desktop_emergency"));
        iceBox->addWidget(iceText);
        iceBox = new gui::IceBox(this);
    }

    void LockInputWindow::buildPinBody()


@@ 232,6 214,11 @@ namespace gui
        }
    }

    auto LockInputWindow::isIceVisible() const noexcept -> bool
    {
        return iceBox->visible;
    }

    auto LockInputWindow::isInInputState() const noexcept -> bool
    {
        return lock && (lock->isState(locks::Lock::LockState::InputRequired) ||


@@ 244,4 231,5 @@ namespace gui
        return lock && (lock->isState(locks::Lock::LockState::InputInvalid) ||
                        lock->isState(locks::Lock::LockState::NewInputInvalid));
    }

} // namespace gui

M module-apps/locks/windows/LockInputWindow.hpp => module-apps/locks/windows/LockInputWindow.hpp +3 -1
@@ 9,6 9,7 @@
#include <RichTextParser.hpp>
#include <Text.hpp>
#include <ImageBox.hpp>
#include <widgets/IceBox.hpp>

namespace locks
{


@@ 62,10 63,11 @@ namespace gui

        [[nodiscard]] auto isInInputState() const noexcept -> bool;
        [[nodiscard]] auto isInInvalidInputState() const noexcept -> bool;
        [[nodiscard]] auto isIceVisible() const noexcept -> bool;

      private:
        gui::VBox *body          = nullptr;
        gui::HBox *iceBox        = nullptr;
        gui::IceBox *iceBox      = nullptr;
        gui::ImageBox *infoImage = nullptr;
        gui::Text *primaryText   = nullptr;
        gui::Text *secondaryText = nullptr;

M module-apps/popups/CMakeLists.txt => module-apps/popups/CMakeLists.txt +2 -0
@@ 30,6 30,7 @@ target_sources( ${PROJECT_NAME}
		"${CMAKE_CURRENT_LIST_DIR}/lock-popups/PhoneLockChangeInfoWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimLockInputWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimInfoWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimNotReadyWindow.cpp"

	PRIVATE
		"${CMAKE_CURRENT_LIST_DIR}/Popups.hpp"


@@ 48,4 49,5 @@ target_sources( ${PROJECT_NAME}
		"${CMAKE_CURRENT_LIST_DIR}/lock-popups/PhoneLockChangeInfoWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimLockInputWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimInfoWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/lock-popups/SimNotReadyWindow.hpp"
)

M module-apps/popups/Popups.cpp => module-apps/popups/Popups.cpp +4 -0
@@ 22,12 22,16 @@ namespace gui::popup
            return gui::popup::window::phone_lock_window;
        case ID::PhoneLockInput:
            return gui::popup::window::phone_lock_input_window;
        case ID::PhoneLockInfo:
            return gui::popup::window::phone_lock_info_window;
        case ID::PhoneLockChangeInfo:
            return gui::popup::window::phone_lock_change_info_window;
        case ID::SimLock:
            return gui::popup::window::sim_unlock_window;
        case ID::SimInfo:
            return gui::popup::window::sim_info_window;
        case ID::SimNotReady:
            return gui::popup::window::sim_not_ready_window;
        }

        return {};

M module-apps/popups/Popups.hpp => module-apps/popups/Popups.hpp +3 -1
@@ 18,9 18,11 @@ namespace gui
            TetheringPhoneModeChangeProhibited,
            PhoneLock,
            PhoneLockInput,
            PhoneLockInfo,
            PhoneLockChangeInfo,
            SimLock,
            SimInfo,
            SimNotReady,
        };

        namespace window


@@ 38,7 40,7 @@ namespace gui
            inline constexpr auto power_off_window                  = "PowerOffPopup";
            inline constexpr auto sim_unlock_window                 = "SimUnlockPopup";
            inline constexpr auto sim_info_window                   = "SimInfoPopup";

            inline constexpr auto sim_not_ready_window              = "SimNotReadyPopup";
        } // namespace window

        std::string resolveWindowName(ID id);

M module-apps/popups/lock-popups/PhoneLockInputWindow.cpp => module-apps/popups/lock-popups/PhoneLockInputWindow.cpp +7 -1
@@ 101,7 101,6 @@ namespace gui
                return true;
            }
        }

        else if (inputEvent.is(KeyCode::KEY_ENTER) && bottomBar->isActive(BottomBar::Side::CENTER)) {
            if (lock->isState(locks::Lock::LockState::Blocked)) {
                application->returnToPreviousWindow();


@@ 119,6 118,13 @@ namespace gui
            lock->clearAttempt();
            return true;
        }
        else if (inputEvent.is(KeyCode::KEY_LEFT) && isIceVisible()) {
            app::manager::Controller::sendAction(application,
                                                 app::manager::actions::EmergencyDial,
                                                 std::make_unique<gui::SwitchData>(),
                                                 app::manager::OnSwitchBehaviour::RunInBackground);
            return true;
        }

        // check if any of the lower inheritance onInput methods catch the event
        return AppWindow::onInput(inputEvent);

M module-apps/popups/lock-popups/PhoneLockedInfoWindow.cpp => module-apps/popups/lock-popups/PhoneLockedInfoWindow.cpp +0 -2
@@ 5,7 5,6 @@

#include <service-appmgr/Controller.hpp>
#include <application-desktop/data/DesktopStyle.hpp>
#include <locks/data/LockStyle.hpp>

#include <i18n/i18n.hpp>



@@ 49,7 48,6 @@ top_bar::Configuration PhoneLockedInfoWindow::configureTopBar(top_bar::Configura

void PhoneLockedInfoWindow::buildInterface()
{
    namespace lock_style = style::window::lock_input;
    AppWindow::buildInterface();

    bottomBar->setText(BottomBar::Side::LEFT, utils::translate("app_desktop_emergency"));

M module-apps/popups/lock-popups/SimInfoWindow.cpp => module-apps/popups/lock-popups/SimInfoWindow.cpp +6 -0
@@ 44,6 44,12 @@ void SimInfoWindow::onBeforeShow(ShowMode mode, SwitchData *data)
            setTitle("");
            infoIcon->text->setRichText(utils::translate("sim_card_pin_disabled"));
            break;
        case locks::SimInputTypeAction::Error:
            setTitle(utils::translate("app_settings_net"));
            infoIcon->text->setRichText(utils::translate("sim_card_cant_connect"),
                                        {{"$SIM", infoData->getLock().getLockName()}});
            infoIcon->image->set("sim_card_W_G");
            break;
        default:
            break;
        }

M module-apps/popups/lock-popups/SimLockInputWindow.cpp => module-apps/popups/lock-popups/SimLockInputWindow.cpp +7 -0
@@ 115,6 115,13 @@ namespace gui
            }
            return true;
        }
        else if (inputEvent.is(KeyCode::KEY_LEFT) && isIceVisible()) {
            app::manager::Controller::sendAction(application,
                                                 app::manager::actions::EmergencyDial,
                                                 std::make_unique<gui::SwitchData>(),
                                                 app::manager::OnSwitchBehaviour::RunInBackground);
            return true;
        }

        // check if any of the lower inheritance onInput methods catch the event
        return AppWindow::onInput(inputEvent);

A module-apps/popups/lock-popups/SimNotReadyWindow.cpp => module-apps/popups/lock-popups/SimNotReadyWindow.cpp +46 -0
@@ 0,0 1,46 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "SimNotReadyWindow.hpp"

#include <service-appmgr/Controller.hpp>
#include <application-desktop/data/DesktopStyle.hpp>

#include <i18n/i18n.hpp>

using namespace gui;

SimNotReadyWindow::SimNotReadyWindow(app::Application *app, const std::string &name) : AppWindow(app, name)
{
    buildInterface();
}

top_bar::Configuration SimNotReadyWindow::configureTopBar(top_bar::Configuration appConfiguration)
{
    appConfiguration.disable(top_bar::Indicator::NetworkAccessTechnology);
    appConfiguration.disable(top_bar::Indicator::Lock);
    appConfiguration.enable(top_bar::Indicator::PhoneMode);
    appConfiguration.enable(top_bar::Indicator::Time);
    appConfiguration.enable(top_bar::Indicator::Battery);
    appConfiguration.enable(top_bar::Indicator::Signal);
    appConfiguration.enable(top_bar::Indicator::SimCard);
    return appConfiguration;
}

void SimNotReadyWindow::buildInterface()
{
    AppWindow::buildInterface();

    setTitle(utils::translate("app_settings_net"));

    bottomBar->setText(BottomBar::Side::RIGHT, utils::translate("common_back"));

    infoIcon = new gui::Icon(this,
                             style::window::default_left_margin,
                             style::header::height,
                             style::window::default_body_width,
                             style::window::default_body_height,
                             "sim_card_W_G",
                             utils::translate("sim_card_not_ready"));
    infoIcon->setAlignment(Alignment::Horizontal::Center);
}

R module-apps/application-onboarding/windows/OnBoardingMainWindow.hpp => module-apps/popups/lock-popups/SimNotReadyWindow.hpp +9 -10
@@ 3,21 3,20 @@

#pragma once

#include <memory>

#include <AppWindow.hpp>
#include <module-gui/gui/widgets/Image.hpp>
#include <Text.hpp>
#include <gui/widgets/Icon.hpp>

namespace app::onBoarding
namespace gui
{
    class OnBoardingMainWindow : public gui::AppWindow
    class SimNotReadyWindow : public AppWindow
    {
      public:
        explicit OnBoardingMainWindow(app::Application *app);
        Icon *infoIcon = nullptr;

        bool onInput(const gui::InputEvent &inputEvent) override;
      public:
        SimNotReadyWindow(app::Application *app, const std::string &name);

        void buildInterface() override;
        gui::top_bar::Configuration configureTopBar(gui::top_bar::Configuration appConfiguration) override;
        top_bar::Configuration configureTopBar(top_bar::Configuration appConfiguration) override;
    };
} // namespace gui
} /* namespace gui */

A module-apps/widgets/IceBox.cpp => module-apps/widgets/IceBox.cpp +30 -0
@@ 0,0 1,30 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "IceBox.hpp"

#include <Text.hpp>
#include <i18n/i18n.hpp>

namespace gui
{
    IceBox::IceBox(Item *parent)
        : HBox(parent, style::window::ice::x, style::window::ice::y, style::window::ice::w, style::window::ice::h)
    {
        setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
        setEdges(RectangleEdge::None);

        auto arrow        = new gui::Image("left_label_arrow");
        arrow->activeItem = false;
        arrow->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
        arrow->setMargins(Margins(0, 0, style::window::ice::margin, 0));
        addWidget(arrow);

        auto iceText        = new gui::Text(nullptr, 0, 0, style::window::ice::text::w, style::window::ice::h);
        iceText->activeItem = false;
        iceText->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
        iceText->setFont(style::window::font::verysmall);
        iceText->setText(utils::translate("app_desktop_emergency"));
        addWidget(iceText);
    }
} // namespace gui

A module-apps/widgets/IceBox.hpp => module-apps/widgets/IceBox.hpp +32 -0
@@ 0,0 1,32 @@
// 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 <BoxLayout.hpp>
#include <Label.hpp>
#include <Image.hpp>

namespace style::window::ice
{
    constexpr inline auto x = 25;
    constexpr inline auto y = 53;
    constexpr inline auto w = 60;
    constexpr inline auto h = 38;

    constexpr inline auto margin = 3;

    namespace text
    {
        constexpr inline auto w = 40;
    }
} // namespace style::window::ice

namespace gui
{
    class IceBox : public HBox
    {
      public:
        explicit IceBox(Item *parent = nullptr);
    };
} // namespace gui

M module-services/service-appmgr/model/ApplicationManager.cpp => module-services/service-appmgr/model/ApplicationManager.cpp +32 -3
@@ 17,6 17,8 @@
#include <application-call/ApplicationCall.hpp>
#include <application-special-input/ApplicationSpecialInput.hpp>
#include <application-desktop/ApplicationDesktop.hpp>
#include <application-onboarding/ApplicationOnBoarding.hpp>
#include <application-onboarding/data/OnBoardingMessages.hpp>
#include <i18n/i18n.hpp>
#include <log/log.hpp>
#include <service-appmgr/messages/Message.hpp>


@@ 514,7 516,7 @@ namespace app::manager
                [&](sys::Message *request) -> sys::MessagePointer {
                    auto data = static_cast<cellular::msg::request::sim::ChangePin::Response *>(request);
                    if (data->retCode) {
                        return simLockHandler.handleSimChangedMessage();
                        return simLockHandler.handleSimPinChangedMessage();
                    }
                    else {
                        return simLockHandler.handleSimPinChangeFailedRequest();


@@ 568,9 570,12 @@ namespace app::manager
                    }
                    return sys::msgNotHandled();
                });
        connect(typeid(cellular::msg::notification::SimReady),
                [&](sys::Message *request) -> sys::MessagePointer { return simLockHandler.handleSimReadyMessage(); });
        connect(typeid(cellular::StateChange), [&](sys::Message *request) -> sys::MessagePointer {
            auto data = static_cast<cellular::StateChange *>(request);
            if (data->request == cellular::service::State::ST::URCReady) {
                simLockHandler.setSimReady();
                simLockHandler.getSettingsSimSelect(
                    settings->getValue(settings::SystemProperties::activeSim, settings::SettingsScope::Global));
                return sys::msgHandled();


@@ 578,6 583,9 @@ namespace app::manager
            return sys::msgNotHandled();
        });

        connect(typeid(onBoarding::FinalizeOnBoarding),
                [&](sys::Message *request) -> sys::MessagePointer { return handleOnBoardingFinalize(); });

        connect(typeid(sdesktop::developerMode::DeveloperModeRequest),
                [&](sys::Message *request) -> sys::MessagePointer { return handleDeveloperModeRequest(request); });



@@ 785,9 793,9 @@ namespace app::manager

    auto ApplicationManager::handleHomeAction(ActionEntry &action) -> ActionProcessStatus
    {
        action.setTargetApplication(rootApplicationName);
        action.setTargetApplication(resolveHomeApplication());

        SwitchRequest switchRequest(ServiceName, rootApplicationName, resolveHomeWindow(), nullptr);
        SwitchRequest switchRequest(ServiceName, resolveHomeApplication(), resolveHomeWindow(), nullptr);
        return handleSwitchApplication(&switchRequest) ? ActionProcessStatus::Accepted : ActionProcessStatus::Dropped;
    }



@@ 797,6 805,27 @@ namespace app::manager
                                                : gui::name::window::main_window;
    }

    auto ApplicationManager::handleOnBoardingFinalize() -> sys::MessagePointer
    {
        settings->setValue(settings::SystemProperties::onboardingDone, utils::to_string(true));
        app::manager::Controller::sendAction(this, app::manager::actions::Home);
        return sys::msgHandled();
    }

    auto ApplicationManager::checkOnBoarding() -> bool
    {
        return not utils::getNumericValue<bool>(settings->getValue(settings::SystemProperties::onboardingDone));
    }

    auto ApplicationManager::resolveHomeApplication() -> std::string
    {
        if (checkOnBoarding()) {
            phoneLockHandler.handleUnlockRequest();
            return app::name_onboarding;
        }
        return rootApplicationName;
    }

    auto ApplicationManager::handleLaunchAction(ActionEntry &action) -> ActionProcessStatus
    {
        auto launchParams = static_cast<ApplicationLaunchData *>(action.params.get());

M module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp => module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp +3 -0
@@ 129,6 129,9 @@ namespace app::manager
        void handleActionRequest(ActionRequest *actionMsg);
        auto handleHomeAction(ActionEntry &action) -> ActionProcessStatus;
        auto resolveHomeWindow() -> std::string;
        auto handleOnBoardingFinalize() -> sys::MessagePointer;
        auto checkOnBoarding() -> bool;
        auto resolveHomeApplication() -> std::string;
        auto handleLaunchAction(ActionEntry &action) -> ActionProcessStatus;
        auto handleActionOnFocusedApp(ActionEntry &action) -> ActionProcessStatus;
        auto handlePhoneModeChangedAction(ActionEntry &action) -> ActionProcessStatus;

M module-services/service-db/agents/settings/SystemSettings.hpp => module-services/service-db/agents/settings/SystemSettings.hpp +1 -0
@@ 19,6 19,7 @@ namespace settings
        constexpr inline auto automaticTimeZoneIsOn    = "gs_automatic_time_zone_is_on";
        constexpr inline auto timeFormat               = "gs_time_format";
        constexpr inline auto dateFormat               = "gs_date_format";
        constexpr inline auto onboardingDone           = "gs_onboarding_done";
        constexpr inline auto eulaAccepted             = "gs_eula_accepted";
        constexpr inline auto osCurrentVersion         = "gs_os_current_version";
        constexpr inline auto osUpdateVersion          = "gs_os_update_version";