~aleteoryx/muditaos

2e2ce205d79822e1f45254debb606ec08459e990 — Przemyslaw Brudny 4 years ago 39a09e8
[EGD-5404] Added onBoarding Sim select window

Added onBoarding Sim select window and skip sim select.
Removed old PhoneLock settings selector from settings.
31 files changed, 244 insertions(+), 205 deletions(-)

A art/phone/application_onboarding/sim1_option.png
A art/phone/application_onboarding/sim2_option.png
A art/phone/common/sim_card_W_G.png
A image/assets/images/sim1_option.vpi
R image/assets/images/{sim1 => sim1_status}.vpi
A image/assets/images/sim2_option.vpi
R image/assets/images/{sim2 => sim2_status}.vpi
A image/assets/images/sim_card_W_G.vpi
M image/assets/lang/English.json
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/style/OnBoardingStyle.hpp
A module-apps/application-onboarding/windows/NoSimSelectedDialogWindow.cpp
A module-apps/application-onboarding/windows/NoSimSelectedDialogWindow.hpp
M module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.cpp
M module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp
A module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.cpp
A module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.hpp
M module-apps/application-onboarding/windows/StartConfigurationWindow.cpp
M module-apps/application-settings-new/windows/DateAndTimeMainWindow.cpp
M module-apps/application-settings-new/windows/DateAndTimeMainWindow.hpp
M module-apps/application-settings/ApplicationSettings.cpp
M module-apps/application-settings/ApplicationSettings.hpp
M module-apps/application-settings/windows/SettingsMainWindow.cpp
M module-apps/options/OptionStyle.hpp
D module-apps/options/type/OptionChangePin.cpp
D module-apps/options/type/OptionChangePin.hpp
M module-apps/options/type/OptionSetting.cpp
M module-gui/gui/widgets/TopBar/SIM.cpp
A art/phone/application_onboarding/sim1_option.png => art/phone/application_onboarding/sim1_option.png +0 -0
A art/phone/application_onboarding/sim2_option.png => art/phone/application_onboarding/sim2_option.png +0 -0
A art/phone/common/sim_card_W_G.png => art/phone/common/sim_card_W_G.png +0 -0
A image/assets/images/sim1_option.vpi => image/assets/images/sim1_option.vpi +0 -0
R image/assets/images/sim1.vpi => image/assets/images/sim1_status.vpi +0 -0
A image/assets/images/sim2_option.vpi => image/assets/images/sim2_option.vpi +0 -0
R image/assets/images/sim2.vpi => image/assets/images/sim2_status.vpi +0 -0
A image/assets/images/sim_card_W_G.vpi => image/assets/images/sim_card_W_G.vpi +0 -0
M image/assets/lang/English.json => image/assets/lang/English.json +4 -0
@@ 310,6 310,10 @@
  "app_onboarding_title": "Onboarding",
  "app_onboarding_start_configuration": "<text font='gt_pressura' weight='light' size='46'><p>Hello!</p></text><br></br><text font='gt_pressura' weight='regular' size='27'>Let's configure your Mudita Pure.</text>",
  "app_onboarding_eula_license": "License agreement (EULA)",
  "app_onboarding_select_sim": "Choose active SIM",
  "app_onboarding_select_sim_description": "<text>Only one SIM can be active at a time.<br></br>You can choose it now and switch in<br></br>the Settings whenever needed.</text>",
  "app_onboarding_no_sim_selected_title": "SIM setup",
  "app_onboarding_no_sim_selected_description": "<text>No SIM card set up.<br></br>To connect to network, set up <br></br> SIM cards in Settings.</text>>",
  "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>",

M module-apps/CMakeLists.txt => module-apps/CMakeLists.txt +0 -1
@@ 47,7 47,6 @@ set( SOURCES
    "options/type/OptionCall.cpp"
    "options/type/OptionContact.cpp"
    "options/type/OptionSetting.cpp"
    "options/type/OptionChangePin.cpp"
    "options/type/OptionWithActiveIcons.cpp"
    "notifications/NotificationData.cpp")


M module-apps/application-onboarding/ApplicationOnBoarding.cpp => module-apps/application-onboarding/ApplicationOnBoarding.cpp +9 -1
@@ 9,6 9,8 @@
#include "windows/StartConfigurationWindow.hpp"
#include "windows/OnBoardingLanguagesWindow.hpp"
#include "windows/EULALicenseWindow.hpp"
#include "windows/OnBoardingSimSelectWindow.hpp"
#include "windows/NoSimSelectedDialogWindow.hpp"
#include "windows/ConfigurationSuccessfulDialogWindow.hpp"
#include "windows/NoConfigurationDialogWindow.hpp"
#include "windows/UpdateDialogWindow.hpp"


@@ 123,6 125,13 @@ namespace app
                                                                                           std::move(eulaRepository));
            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);
        });
        windowsFactory.attach(gui::window::name::onBoarding_no_sim_selected,
                              [](Application *app, const std::string &name) {
                                  return std::make_unique<app::onBoarding::NoSimSelectedDialogWindow>(app);
                              });
        windowsFactory.attach(gui::window::name::onBoarding_configuration_successful,
                              [](Application *app, const std::string &name) {
                                  return std::make_unique<app::onBoarding::ConfigurationSuccessfulDialogWindow>(app);


@@ 134,7 143,6 @@ namespace 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_skip, [](Application *app, const std::string &name) {
            return std::make_unique<app::onBoarding::SkipDialogWindow>(app);
        });

M module-apps/application-onboarding/ApplicationOnBoarding.hpp => module-apps/application-onboarding/ApplicationOnBoarding.hpp +2 -0
@@ 16,6 16,8 @@ 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_sim_select               = "OnBoardingSimSelect";
    inline constexpr auto onBoarding_no_sim_selected          = "OnBoardingNoSimSelected";
} // namespace gui::window::name

namespace app

M module-apps/application-onboarding/CMakeLists.txt => module-apps/application-onboarding/CMakeLists.txt +7 -2
@@ 24,7 24,9 @@ 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"
    PUBLIC
		"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingSimSelectWindow.cpp"
		"${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"


@@ 38,8 40,11 @@ target_sources(${PROJECT_NAME}
		"${CMAKE_CURRENT_LIST_DIR}/windows/UpdateDialogWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/SkipDialogWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingDateAndTimeWindow.hpp"

		"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingSimSelectWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/NoSimSelectedDialogWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/style/OnBoardingStyle.hpp"
		)

target_include_directories(${PROJECT_NAME}
    PRIVATE
        service-db

A module-apps/application-onboarding/style/OnBoardingStyle.hpp => module-apps/application-onboarding/style/OnBoardingStyle.hpp +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

#pragma once

#include "Style.hpp"

namespace style::onboarding
{
    namespace sim_select
    {
        inline constexpr auto description_y           = 400;
        inline constexpr auto description_h           = 150;
        inline constexpr auto description_top_padding = 30;
    } // namespace sim_select

} // namespace style::onboarding

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

#include "NoSimSelectedDialogWindow.hpp"

#include <application-onboarding/ApplicationOnBoarding.hpp>

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

namespace app::onBoarding
{
    NoSimSelectedDialogWindow::NoSimSelectedDialogWindow(app::Application *app)
        : gui::Dialog(app, gui::window::name::onBoarding_no_sim_selected)
    {
        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(style::strings::common::ok));
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, true);
    }

    bool NoSimSelectedDialogWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (inputEvent.isShortRelease()) {
            if (inputEvent.is(gui::KeyCode::KEY_ENTER)) {
                application->getPhoneLockSubject().setPhoneLock();
            }
        }
        return AppWindow::onInput(inputEvent);
    }
} // namespace app::onBoarding

A module-apps/application-onboarding/windows/NoSimSelectedDialogWindow.hpp => module-apps/application-onboarding/windows/NoSimSelectedDialogWindow.hpp +19 -0
@@ 0,0 1,19 @@
// 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 <Dialog.hpp>

#include <module-gui/gui/input/InputEvent.hpp>

namespace app::onBoarding
{
    class NoSimSelectedDialogWindow : public gui::Dialog
    {
      public:
        explicit NoSimSelectedDialogWindow(app::Application *app);

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

M module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.cpp => module-apps/application-onboarding/windows/OnBoardingChangeDateAndTimeWindow.cpp +1 -1
@@ 13,7 13,7 @@ namespace gui

    bool OnBoardingChangeDateAndTimeWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (inputEvent.is(gui::KeyCode::KEY_ENTER)) {
        if (inputEvent.isKeyRelease(gui::KeyCode::KEY_ENTER)) {
            auto ret = ChangeDateAndTimeWindow::onInput(inputEvent);
            application->returnToPreviousWindow();
            return ret;

M module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp => module-apps/application-onboarding/windows/OnBoardingDateAndTimeWindow.cpp +3 -1
@@ 13,7 13,9 @@
namespace app::onBoarding
{
    OnBoardingDateAndTimeWindow::OnBoardingDateAndTimeWindow(app::Application *app) : DateAndTimeMainWindow(app)
    {}
    {
        changeDateAndTimeWindow = gui::window::name::onBoarding_change_date_and_time;
    }

    OnBoardingDateAndTimeWindow::~OnBoardingDateAndTimeWindow()
    {

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

#include "OnBoardingSimSelectWindow.hpp"

#include <application-onboarding/ApplicationOnBoarding.hpp>
#include <application-onboarding/style/OnBoardingStyle.hpp>
#include <OptionSetting.hpp>

#include <module-apps/messages/DialogMetadataMessage.hpp>

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

    void OnBoardingSimSelectWindow::buildInterface()
    {
        setTitle(utils::translate("app_onboarding_select_sim"));

        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::translate(::style::strings::common::select));
        bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::translate(::style::strings::common::back));
        bottomBar->setText(gui::BottomBar::Side::LEFT, utils::translate(::style::strings::common::skip));

        descriptionText = new gui::Text(this,
                                        style::window::default_left_margin,
                                        style::onboarding::sim_select::description_y,
                                        style::window::default_body_width,
                                        style::onboarding::sim_select::description_h);
        descriptionText->setFont(style::window::font::medium);
        descriptionText->setAlignment(
            gui::Alignment{gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top});
        descriptionText->setEdges(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->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;

        options.emplace_back(std::make_unique<gui::option::OptionSettings>(
            "SIM1",
            [=](const gui::Item &item) {
                application->getPhoneLockSubject().setPhoneLock();
                return true;
            },
            nullptr,
            this,
            gui::option::SettingRightItem::SIM1));

        options.emplace_back(std::make_unique<gui::option::OptionSettings>(
            "SIM2",
            [=](const gui::Item &item) {
                application->getPhoneLockSubject().setPhoneLock();
                return true;
            },
            nullptr,
            this,
            gui::option::SettingRightItem::SIM2));

        return options;
    }

    bool OnBoardingSimSelectWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (inputEvent.isShortRelease(gui::KeyCode::KEY_LF)) {
            auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
                utils::translate("app_onboarding_title"),
                "info_icon_W_G",
                utils::translate("app_onboarding_skip_confirm"),
                "",
                [=]() -> bool {
                    auto metaData = std::make_unique<gui::DialogMetadataMessage>(
                        gui::DialogMetadata{utils::translate("app_onboarding_no_sim_selected_title"),
                                            "sim_card_W_G",
                                            utils::translate("app_onboarding_no_sim_selected_description"),
                                            "",
                                            [=]() -> bool { return true; }});

                    application->switchWindow(gui::window::name::onBoarding_no_sim_selected,
                                              gui::ShowMode::GUI_SHOW_INIT,
                                              std::move(metaData));
                    return true;
                }});

            application->switchWindow(
                gui::window::name::onBoarding_skip, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
            return true;
        }
        return AppWindow::onInput(inputEvent);
    }
} /* namespace gui */

A module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.hpp => module-apps/application-onboarding/windows/OnBoardingSimSelectWindow.hpp +24 -0
@@ 0,0 1,24 @@
// 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 <application-settings-new/windows/BaseSettingsWindow.hpp>
#include <Text.hpp>

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

      private:
        gui::Text *descriptionText = nullptr;

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

M module-apps/application-onboarding/windows/StartConfigurationWindow.cpp => module-apps/application-onboarding/windows/StartConfigurationWindow.cpp +9 -11
@@ 1,18 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 <i18n/i18n.hpp>
#include <Style.hpp>
#include "StartConfigurationWindow.hpp"

#include <InputEvent.hpp>
#include <application-onboarding/ApplicationOnBoarding.hpp>
#include <application-onboarding/data/OnBoardingSwitchData.hpp>

#include <module-apps/application-onboarding/ApplicationOnBoarding.hpp>
#include <module-apps/windows/DialogMetadata.hpp>
#include <module-apps/messages/DialogMetadataMessage.hpp>
#include "module-apps/application-onboarding/data/OnBoardingSwitchData.hpp"
#include "module-apps/application-onboarding/ApplicationOnBoarding.hpp"

#include "StartConfigurationWindow.hpp"
#include <i18n/i18n.hpp>
#include <Style.hpp>
#include <InputEvent.hpp>

namespace app::onBoarding
{


@@ 26,11 25,8 @@ namespace app::onBoarding
    {
        AppWindow::buildInterface();

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

        new gui::Icon(this,


@@ 51,7 47,9 @@ namespace app::onBoarding
                                          std::make_unique<OnBoardingSwitchData>());
            }
            if (inputEvent.is(gui::KeyCode::KEY_ENTER)) {
                application->getPhoneLockSubject().setPhoneLock();
                application->switchWindow(gui::window::name::onBoarding_sim_select,
                                          gui::ShowMode::GUI_SHOW_INIT,
                                          std::make_unique<OnBoardingSwitchData>());
            }
            if (inputEvent.is(gui::KeyCode::KEY_LF)) {


M module-apps/application-settings-new/windows/DateAndTimeMainWindow.cpp => module-apps/application-settings-new/windows/DateAndTimeMainWindow.cpp +3 -2
@@ 18,6 18,7 @@ namespace gui
        automaticTimeZoneIsOn    = utils::dateAndTimeSettings.isAutomaticTimeZoneOn();
        timeFormat               = utils::dateAndTimeSettings.getTimeFormat();
        dateFormat               = utils::dateAndTimeSettings.getDateFormat();
        changeDateAndTimeWindow  = window::name::change_date_and_time;
    }

    auto DateAndTimeMainWindow::buildOptionsList() -> std::list<Option>


@@ 54,8 55,8 @@ namespace gui

        if (!automaticDateAndTimeIsOn) {
            addOption(utils::translate("app_settings_date_and_time_change_date_and_time"), [=](Item &item) {
                LOG_INFO("switching to %s page", window::name::change_date_and_time);
                application->switchWindow(window::name::change_date_and_time, nullptr);
                LOG_INFO("switching to %s page", changeDateAndTimeWindow.c_str());
                application->switchWindow(changeDateAndTimeWindow, nullptr);
                return true;
            });
        }

M module-apps/application-settings-new/windows/DateAndTimeMainWindow.hpp => module-apps/application-settings-new/windows/DateAndTimeMainWindow.hpp +2 -0
@@ 22,5 22,7 @@ namespace gui

        utils::time::Locale::TimeFormat timeFormat = utils::time::Locale::defaultTimeFormat;
        utils::time::Locale::DateFormat dateFormat = utils::time::Locale::defaultDateFormat;

        std::string changeDateAndTimeWindow;
    };
} // namespace gui

M module-apps/application-settings/ApplicationSettings.cpp => module-apps/application-settings/ApplicationSettings.cpp +0 -37
@@ 25,7 25,6 @@
#include "windows/SettingsMainWindow.hpp"
#include "windows/SimSelectWindow.hpp"
#include "windows/CellularPassthroughWindow.hpp"
#include "OptionChangePin.hpp"

#include <i18n/i18n.hpp>
#include <service-evtmgr/EventManagerServiceAPI.hpp>


@@ 101,11 100,6 @@ namespace app
        if (ret != sys::ReturnCodes::Success)
            return ret;

        settings->registerValueChange(
            settings::SystemProperties::lockPassHash,
            [this](std::string value) { lockPassChanged(value); },
            settings::SettingsScope::Global);

        createUserInterface();

        return ret;


@@ 126,9 120,6 @@ namespace app
        windowsFactory.attach(app::sim_select, [this](Application *app, const std::string &name) {
            return std::make_unique<gui::OptionWindow>(app, name, simSelectWindow(app, this));
        });
        windowsFactory.attach(app::change_setting, [this](Application *app, const std::string &name) {
            return std::make_unique<gui::OptionWindow>(app, name, settingChangePinWindow(app, this, lockPassHash));
        });
        windowsFactory.attach("Languages", [](Application *app, const std::string &name) {
            return std::make_unique<gui::LanguageWindow>(app);
        });


@@ 176,34 167,6 @@ namespace app
        CellularServiceAPI::SetSimCard(this, sim);
    }

    void ApplicationSettings::setPin(unsigned int value)
    {
        settings->setValue(
            settings::SystemProperties::lockPassHash, std::to_string(value), settings::SettingsScope::Global);
        lockPassHash = value;
    }

    void ApplicationSettings::clearPin()
    {
        settings->setValue(settings::SystemProperties::lockPassHash, "", settings::SettingsScope::Global);
        lockPassHash = 0U;
    }

    void ApplicationSettings::lockPassChanged(std::string value)
    {
        auto newLockPassHash = 0U;
        if (!value.empty()) {
            newLockPassHash = utils::getNumericValue<unsigned int>(value);
        }
        if (lockPassHash != newLockPassHash) {
            lockPassHash       = newLockPassHash;
            auto currentWindow = getCurrentWindow();
            if (app::change_setting == currentWindow->getName()) {
                currentWindow->rebuild();
            }
        }
    }

    void ApplicationSettings::timeDateChanged(std::string value)
    {
        auto newTimeDateFormat = utils::getNumericValue<bool>(value);

M module-apps/application-settings/ApplicationSettings.hpp => module-apps/application-settings/ApplicationSettings.hpp +1 -13
@@ 13,7 13,6 @@ namespace app

    inline constexpr auto name_settings  = "ApplicationSettings";
    inline constexpr auto sim_select     = "SimSelect";
    inline constexpr auto change_setting = "ChangeSetting";

    class SimSetter
    {


@@ 22,15 21,7 @@ namespace app
        virtual void setSim(Store::GSM::SIM sim) = 0;
    };

    class PinLockSetter
    {
      public:
        virtual ~PinLockSetter()              = default;
        virtual void setPin(unsigned int pin) = 0;
        virtual void clearPin()               = 0;
    };

    class ApplicationSettings : public app::Application, public SimSetter, public PinLockSetter
    class ApplicationSettings : public app::Application, public SimSetter
    {
      public:
        ApplicationSettings(std::string name                    = name_settings,


@@ 51,9 42,6 @@ namespace app
        void destroyUserInterface() override;
        bsp::Board board = bsp::Board::none;
        void setSim(Store::GSM::SIM sim) override;
        void setPin(unsigned int pin) override;
        void clearPin() override;
        void lockPassChanged(std::string value);
        void timeDateChanged(std::string value);

      private:

M module-apps/application-settings/windows/SettingsMainWindow.cpp => module-apps/application-settings/windows/SettingsMainWindow.cpp +0 -1
@@ 34,7 34,6 @@ std::list<gui::Option> mainWindowOptions(app::Application *app)
    addMenu(i18("app_settings_bt"), "Bluetooth");
    addMenu(i18("app_settings_language"), "Languages");
    addMenu("SIM SELECT", app::sim_select);
    addMenu("Change setting", app::change_setting);
    addMenu(i18("app_settings_date_and_time"), "DateTime");
    if (dynamic_cast<app::ApplicationSettings *>(app)->board == bsp::Board::T4) {
        addMenu(i18("app_settings_cellular_passthrough"), gui::window::cellular_passthrough::window_name);

M module-apps/options/OptionStyle.hpp => module-apps/options/OptionStyle.hpp +2 -0
@@ 30,6 30,8 @@ namespace gui::option
        Off,
        Bt,
        Checked,
        SIM1,
        SIM2,
        Text
    };


D module-apps/options/type/OptionChangePin.cpp => module-apps/options/type/OptionChangePin.cpp +0 -86
@@ 1,86 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 "OptionChangePin.hpp"
#include <widgets/Text.hpp>
#include <widgets/TextFixedSize.hpp>
#include <FontManager.hpp>
#include <service-db/Settings.hpp>

auto gui::option::ChangePin::build() const -> gui::ListItem *
{
    auto optionItem = new gui::ListItem();
    optionItem->setEdges(RectangleEdge::None);
    optionItem->setMinimumSize(style::window::default_body_width, style::window::label::big_h);
    optionItem->setMargins(Margins(0, 0, 0, window::option_bottom_margin));

    auto optionBodyHBox = new gui::HBox(optionItem, 0, 0, 0, 0);
    auto font           = FontManager::getInstance().getFont(style::window::font::medium);
    auto font_bold      = FontManager::getInstance().getFont(style::window::font::mediumbold);

    optionBodyHBox->setEdges(RectangleEdge::None);
    optionBodyHBox->setReverseOrder(true);

    auto text = new TextFixedSize(nullptr, 0, 0, 0, 0);
    text->setMaximumSize(style::window::default_body_width, style::window::label::big_h);
    text->setUnderline(false);
    text->setEditMode(EditMode::Browse);
    text->setFont(font_bold);
    text->setText("Change PIN");
    text->setAlignment(Alignment(Alignment::Vertical::Center));
    text->activeItem = false;
    text->setPenWidth(0);

    auto pin_text = new PinChange();

    pin_text->setMargins(Margins(0, 0, 0, 0));
    pin_text->setMinimumSize(60, style::window::label::big_h);
    pin_text->setMaximumSize(200, style::window::label::big_h);
    pin_text->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
    pin_text->setEditMode(EditMode::Edit);
    pin_text->setFont(font);
    pin_text->setText(std::to_string(lockHash));
    pin_text->setPenWidth(style::window::default_border_focus_w);
    pin_text->setInputMode(new InputMode(
        {InputMode::digit}, [=](const UTF8 &text) {}, [=]() {}, [=]() {}));
    pin_text->setEdges(RectangleEdge::All);

    optionItem->dimensionChangedCallback = [optionBodyHBox](gui::Item &, const BoundingBox &newDim) -> bool {
        optionBodyHBox->setPosition(0, 0);
        optionBodyHBox->setSize(newDim.w, newDim.h);
        return true;
    };

    optionItem->activatedCallback = [pin_text, this](gui::Item &item) {
        auto text = pin_text->getText();
        if (text.length() == 0) {
            LOG_DEBUG("remove pin");
            setter->clearPin();
        }
        else if (text.length() != 4) {
            pin_text->setText("bad value - needs 4 digits");
        }
        else {
            auto value = std::stoi(text);
            LOG_DEBUG("setting pin to: %d", value);
            setter->setPin(value);
        }
        return true;
    };

    optionItem->inputCallback = [pin_text]([[maybe_unused]] Item &item, const InputEvent &event) {
        return pin_text->onInput(event);
    };

    optionBodyHBox->addWidget(pin_text);
    optionBodyHBox->addWidget(text);

    return optionItem;
}

std::list<gui::Option> settingChangePinWindow(app::Application *app, app::PinLockSetter *setter, unsigned int lockHash)
{
    std::list<gui::Option> list;
    list.emplace_back(std::make_unique<gui::option::ChangePin>(app, setter, lockHash));
    return list;
}

D module-apps/options/type/OptionChangePin.hpp => module-apps/options/type/OptionChangePin.hpp +0 -45
@@ 1,45 0,0 @@
// 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 "Option.hpp"
#include "OptionBase.hpp"
#include "OptionStyle.hpp"
#include "Application.hpp"

#include "Text.hpp"

#include "module-apps/application-settings/ApplicationSettings.hpp"

namespace gui
{
    class PinChange : public gui::Text
    {};

} // namespace gui

namespace gui::option
{
    class ChangePin : public Base
    {
      private:
        app::Application *app      = nullptr;
        app::PinLockSetter *setter = nullptr;
        unsigned int lockHash      = 0;

      public:
        ChangePin(app::Application *app, app::PinLockSetter *setter, unsigned int lockHash)
            : app(app), setter(setter), lockHash(lockHash)
        {}

        void setLockHash(unsigned int hash)
        {
            lockHash = hash;
        }

        [[nodiscard]] auto build() const -> ListItem * override;
    };
} // namespace gui::option

std::list<gui::Option> settingChangePinWindow(app::Application *app, app::PinLockSetter *setter, unsigned int lockHash);

M module-apps/options/type/OptionSetting.cpp => module-apps/options/type/OptionSetting.cpp +6 -0
@@ 56,6 56,12 @@ namespace gui::option
        case SettingRightItem::Checked:
            imageName = "small_tick_W_M";
            break;
        case SettingRightItem::SIM1:
            imageName = "sim1_option";
            break;
        case SettingRightItem::SIM2:
            imageName = "sim2_option";
            break;
        case SettingRightItem::Text: {
            auto optionTextRight = new TextFixedSize(optionBodyHBox, 0, 0, 0, 0);
            optionTextRight->setUnderline(false);

M module-gui/gui/widgets/TopBar/SIM.cpp => module-gui/gui/widgets/TopBar/SIM.cpp +4 -4
@@ 7,10 7,10 @@ namespace gui::top_bar
{
    using namespace Store;

    constexpr auto sim1       = "sim1";       // sim 1 indicator
    constexpr auto sim2       = "sim2";       // sim 2 indicator
    constexpr auto simunknown = "simunknown"; // sim - unknown sim state indicator (i.e. no initialization was done)
    constexpr auto simfailed  = "simfail";    // sim - notification for sim failure
    constexpr auto sim1       = "sim1_status"; // sim 1 indicator
    constexpr auto sim2       = "sim2_status"; // sim 2 indicator
    constexpr auto simunknown = "simunknown";  // sim - unknown sim state indicator (i.e. no initialization was done)
    constexpr auto simfailed  = "simfail";     // sim - notification for sim failure

    SIM::SIM(Item *parent, uint32_t x, uint32_t y) : StatusBarWidgetBase(parent, x, y, 0, 0)
    {