~aleteoryx/muditaos

d0200de5d5d456b09310a95bf53bc804c6a0c23c — Przemyslaw Brudny 5 years ago 4ebfd8e
[EGD-5398] Added onBoarding application first version

Created first version of onBoarding application. Added welcome
window, configuration start window and adopted language
window. Small Icon GUI refactor. AppManager language copy removed.
30 files changed, 490 insertions(+), 143 deletions(-)

A image/assets/images/logo_no_text.vpi
M image/assets/lang/English.json
M image/assets/lang/Polski.json
M module-apps/CMakeLists.txt
M module-apps/application-notes/ApplicationNotes.cpp
A module-apps/application-onboarding/ApplicationOnBoarding.cpp
A module-apps/application-onboarding/ApplicationOnBoarding.hpp
A module-apps/application-onboarding/CMakeLists.txt
A module-apps/application-onboarding/data/OnBoardingSwitchData.hpp
A module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.cpp
A module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.hpp
A module-apps/application-onboarding/windows/OnBoardingMainWindow.cpp
A module-apps/application-onboarding/windows/OnBoardingMainWindow.hpp
A module-apps/application-onboarding/windows/StartConfigurationWindow.cpp
A module-apps/application-onboarding/windows/StartConfigurationWindow.hpp
M module-apps/application-settings-new/CMakeLists.txt
D module-apps/application-settings-new/models/LanguagesModel.cpp
D module-apps/application-settings-new/models/LanguagesModel.hpp
M module-apps/application-settings-new/windows/LanguagesWindow.cpp
M module-apps/application-settings-new/windows/LanguagesWindow.hpp
M module-gui/gui/widgets/Icon.cpp
M module-gui/gui/widgets/Icon.hpp
M module-gui/gui/widgets/Image.cpp
M module-gui/gui/widgets/Image.hpp
M module-gui/gui/widgets/InputMode.cpp
M module-services/service-appmgr/model/ApplicationManager.cpp
M module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp
M module-utils/i18n/i18n.cpp
M module-utils/i18n/i18n.hpp
M source/main.cpp
A image/assets/images/logo_no_text.vpi => image/assets/images/logo_no_text.vpi +0 -0
M image/assets/lang/English.json => image/assets/lang/English.json +34 -39
@@ 77,28 77,28 @@
  "home_modes_connected": "CONNECTED",
  "home_modes_notdisturb": "DO NOT DISTURB",
  "home_modes_offline": "OFFLINE",
  "app_alarm_clock_title_main" : "Alarm clock",
  "app_alarm_clock_repeat_never" : "Never",
  "app_alarm_clock_repeat_everyday" : "Everyday",
  "app_alarm_clock_repeat_week_days" : "Week Days",
  "app_alarm_clock_repeat_custom" : "Custom",
  "app_alarm_clock_no_alarms_information" : "<text align='center' color='9'>No alarms yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_alarm_clock_title_main": "Alarm clock",
  "app_alarm_clock_repeat_never": "Never",
  "app_alarm_clock_repeat_everyday": "Everyday",
  "app_alarm_clock_repeat_week_days": "Week Days",
  "app_alarm_clock_repeat_custom": "Custom",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='9'>No alarms yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_alarm_clock_options_title": "Options",
  "app_alarm_clock_options_edit": "Edit",
  "app_alarm_clock_options_delete": "Delete",
  "app_alarm_clock_options_turn_off_all_alarms": "Turn off all alarms",
  "app_alarm_clock_delete_confirmation": "Delete this alarm?",
  "app_alarm_clock_new_alarm_title" : "New alarm",
  "app_alarm_clock_edit_alarm_title" : "Edit alarm",
  "app_alarm_clock_sound" : "Sound",
  "app_alarm_clock_snooze" : "Snooze",
  "app_alarm_clock_repeat" :"Repeat",
  "app_alarm_clock_snooze_5_min" : "5 min",
  "app_alarm_clock_snooze_10_min" : "10 min",
  "app_alarm_clock_snooze_15_min" : "15 min",
  "app_alarm_clock_snooze_30_min" : "30 min",
  "app_alarm_clock_play_pause" : "PLAY/PAUSE",
  "app_alarm_clock_edit" : "EDIT",
  "app_alarm_clock_new_alarm_title": "New alarm",
  "app_alarm_clock_edit_alarm_title": "Edit alarm",
  "app_alarm_clock_sound": "Sound",
  "app_alarm_clock_snooze": "Snooze",
  "app_alarm_clock_repeat": "Repeat",
  "app_alarm_clock_snooze_5_min": "5 min",
  "app_alarm_clock_snooze_10_min": "10 min",
  "app_alarm_clock_snooze_15_min": "15 min",
  "app_alarm_clock_snooze_30_min": "30 min",
  "app_alarm_clock_play_pause": "PLAY/PAUSE",
  "app_alarm_clock_edit": "EDIT",
  "app_calendar_title_main": "Calendar",
  "app_calendar_options_title": "Options",
  "app_calendar_options_edit": "Edit",


@@ 136,17 136,14 @@
  "app_calendar_all_day": "All day",
  "app_calendar_new_edit_event_start": "Start",
  "app_calendar_new_edit_event_end": "End",

  "app_calculator_title_main": "Calculator",
  "app_calculator_equals": "EQUALS",
  "app_calculator_decimal_separator": ".",
  "app_calculator_error": "Error",

  "app_options_invalid_option": " <Invalid Option> ",
  "app_options_contact_details": "Contact details",
  "app_options_contact_add": "Add to contacts",
  "app_options_contact_edit": "Edit Contact",

  "app_notes_title_main": "Notes",
  "app_notes_edit_new_note": "Edit/New Note",
  "app_notes_copy_text": "Copy text",


@@ 157,7 154,6 @@
  "app_notes_note_delete_confirmation": "Do you really want to delete this note?",
  "app_notes_no_notes": "<text align='center' color='9'>No notes yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_notes_search_no_results": "No notes found.",

  "app_calllog_title_main": "Calls",
  "app_calllog_new_note": "New Note",
  "app_calllog_save": "SAVE",


@@ 173,7 169,6 @@
  "app_calllog_options_title": "Options",
  "app_calllog_options_delete_call": "Delete call",
  "app_calllog_delete_call_confirmation": "Do you really want to delete this call from the list?",

  "app_desktop_unlock": "UNLOCK",
  "app_desktop_lock": "LOCK",
  "app_desktop_menu": "MENU",


@@ 182,7 177,7 @@
  "app_desktop_info_mmi_none_specified_failed": "Operation failed",
  "app_desktop_info_mmi_none_specified_success": "Operation successful",
  "app_desktop_info_mmi_common_failed": "failed",
  "app_desktop_info_mmi_common_no_meassage" :"not",
  "app_desktop_info_mmi_common_no_meassage": "not",
  "app_desktop_info_mmi_common_mmi_not_supported": "not supported",
  "app_desktop_info_mmi_common_enabled": "enabled",
  "app_desktop_info_mmi_common_disabled": "disabled",


@@ 192,7 187,7 @@
  "app_desktop_info_mmi_common_sync": "sync",
  "app_desktop_info_mmi_common_async": "async",
  "app_desktop_info_mmi_common_all_disabled": "all disabled",
  "app_desktop_info_mmi_common_deactivated":"deactivated",
  "app_desktop_info_mmi_common_deactivated": "deactivated",
  "app_desktop_info_mmi_common_activated": "activated",
  "app_desktop_info_mmi_common_query": "query",
  "app_desktop_info_mmi_clir_according_to_subscription": "CLIR according to subscription",


@@ 221,12 216,12 @@
  "app_desktop_info_mmi_clip_unknown": "CLIP unknown",
  "app_desktop_info_mmi_call_waiting_activated": " call waiting activated",
  "app_desktop_info_mmi_call_waiting_deactivated": "call waiting deactivated",
  "app_desktop_info_mmi_call_forwarding" : "Call forwarding",
  "app_desktop_info_mmi_call_barring" : "Call barring",
  "app_desktop_info_mmi_call_waiting" : "Call waiting",
  "app_desktop_info_mmi_clip" : "Caller ID displayed (CLIP)",
  "app_desktop_info_mmi_clir" : "Caller ID suppressed (CLIR)",
  "app_desktop_info_mmi_imei" : "IMEI (MEID)",
  "app_desktop_info_mmi_call_forwarding": "Call forwarding",
  "app_desktop_info_mmi_call_barring": "Call barring",
  "app_desktop_info_mmi_call_waiting": "Call waiting",
  "app_desktop_info_mmi_clip": "Caller ID displayed (CLIP)",
  "app_desktop_info_mmi_clir": "Caller ID suppressed (CLIR)",
  "app_desktop_info_mmi_imei": "IMEI (MEID)",
  "app_desktop_info_mmi_result_success": "Success",
  "app_desktop_info_mmi_result_failed": "Failed",
  "app_desktop_header_sim_setup": "<text><token>$SIM</token> setup</text>",


@@ 275,7 270,6 @@
  "app_desktop_clear": "CLEAR",
  "app_desktop_clear_all": "CLEAR ALL",
  "app_desktop_replay": "REPLY",

  "app_call_call": "CALL",
  "app_call_clear": "CLEAR",
  "app_call_reject": "REJECT",


@@ 310,6 304,7 @@
  "app_messages_thread_not_sent": "Not sent: ",
  "app_messages_thread_from_this": "From this message",
  "app_messages_thread_you": "You: ",
  "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_settings_title_main": "Settings",
  "app_settings_title_main_new": "Settings New",
  "app_settings_bt": "Bluetooth",


@@ 390,8 385,8 @@
  "app_settings_network_sim1": "Sim1",
  "app_settings_network_sim2": "Sim2",
  "app_settings_network_sim_none": "No Sim",
  "app_settings_network_voice_over_lte" : "VoLTE (experimental)",
  "app_settings_network_apn_settings" : "APN settings",
  "app_settings_network_voice_over_lte": "VoLTE (experimental)",
  "app_settings_network_apn_settings": "APN settings",
  "app_settings_toggle_on": "ON",
  "app_settings_toggle_off": "OFF",
  "app_settings_security_lock_screen_passcode": "Lock screen passcode",


@@ 402,11 397,11 @@
  "app_settings_security_wrong_passcode": "Wrong passcode!",
  "app_settings_security_passcode_changed_successfully": "Passcode changed successfully!",
  "app_settings_security_passcode_disabled": "Passcode disabled!",
  "app_settings_apn_settings_no_apns" : "<text align='center' color='9'>No APNs yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_settings_apn_options" : "Options",
  "app_settings_apn_options_delete" : "Delete",
  "app_settings_apn_options_edit" : "Edit",
  "app_settings_apn_options_set_as_default" : "Set as default",
  "app_settings_apn_settings_no_apns": "<text align='center' color='9'>No APNs yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_settings_apn_options": "Options",
  "app_settings_apn_options_delete": "Delete",
  "app_settings_apn_options_edit": "Edit",
  "app_settings_apn_options_set_as_default": "Set as default",
  "app_settings_new_edit_apn": "New/Edit APN",
  "app_settings_apn_name": "Name",
  "app_settings_apn_APN": "APN",


@@ 414,7 409,7 @@
  "app_settings_apn_password": "Password",
  "app_settings_apn_authtype": "Authentication type",
  "app_settings_apn_apntype": "APN Type",
  "app_settings_apn_apnprotocol" : "APN Protocol",
  "app_settings_apn_apnprotocol": "APN Protocol",
  "app_settings_title_color_test": "Display available colors",
  "app_settings_toolbar_reset": "RESET",
  "app_phonebook_title_main": "Contacts",

M image/assets/lang/Polski.json => image/assets/lang/Polski.json +1 -0
@@ 102,6 102,7 @@
  "app_call_is_calling": "dzwoni",
  "app_call_call_ended": "zakończono",
  "app_call_contact": "KONTAKT",
  "app_onboarding_start_configuration": "<text font='gt_pressura' weight='light' size='46'><p>Witaj!</p></text><br></br><text font='gt_pressura' weight='regular' size='27'>Zacznijmy konfigurację Mudita Pure.</text>",
  "app_settings_title_main": "Ustawienia",
  "app_settings_bt": "Bluetooth",
  "app_settings_date_and_time": "Data i Czas",

M module-apps/CMakeLists.txt => module-apps/CMakeLists.txt +1 -0
@@ 51,6 51,7 @@ set(APPLICATIONS
    settings-new
    call
    notes
    onboarding
    phonebook
    messages
    calllog

M module-apps/application-notes/ApplicationNotes.cpp => module-apps/application-notes/ApplicationNotes.cpp +3 -3
@@ 19,6 19,7 @@
#include <module-apps/windows/OptionWindow.hpp>
#include <module-apps/windows/Dialog.hpp>
#include <module-services/service-db/service-db/DBNotificationMessage.hpp>
#include <utility>

namespace app
{


@@ 28,7 29,7 @@ namespace app
    } // namespace

    ApplicationNotes::ApplicationNotes(std::string name, std::string parent, StartInBackground startInBackground)
        : Application(name, parent, startInBackground, NotesStackSize)
        : Application(std::move(name), std::move(parent), startInBackground, NotesStackSize)
    {
        bus.channels.push_back(sys::BusChannel::ServiceDBNotifications);
    }


@@ 43,8 44,7 @@ namespace app
        }

        if (msgl->messageType == MessageType::DBServiceNotification) {
            auto msg = dynamic_cast<db::NotificationMessage *>(msgl);
            if (msg != nullptr) {
            if (auto msg = dynamic_cast<db::NotificationMessage *>(msgl); msg != nullptr) {
                // window-specific actions
                if (msg->interface == db::Interface::Name::Notes) {
                    for (auto &[name, window] : windowsStack) {

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

#include <utility>

#include "ApplicationOnBoarding.hpp"

#include "windows/OnBoardingMainWindow.hpp"
#include "windows/StartConfigurationWindow.hpp"
#include "windows/OnBoardingLanguagesWindow.hpp"

#include <service-db/DBMessage.hpp>
#include <module-services/service-appmgr/service-appmgr/messages/GetCurrentDisplayLanguageResponse.hpp>
#include <module-apps/application-settings-new/data/LanguagesData.hpp>

namespace app
{
    namespace
    {
        constexpr auto OnBoardingStackSize = 4096U;
    } // namespace

    ApplicationOnBoarding::ApplicationOnBoarding(std::string name,
                                                 std::string parent,
                                                 StartInBackground startInBackground)
        : Application(std::move(name), std::move(parent), startInBackground, OnBoardingStackSize)
    {
        using namespace gui::top_bar;
        topBarManager->enableIndicators({Indicator::Signal,
                                         Indicator::Time,
                                         Indicator::Battery,
                                         Indicator::SimCard,
                                         Indicator::NetworkAccessTechnology});

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

    // Invoked upon receiving data message
    sys::MessagePointer ApplicationOnBoarding::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        auto retMsg = Application::DataReceivedHandler(msgl);
        // if message was handled by application's template there is no need to process further.
        if (reinterpret_cast<sys::ResponseMessage *>(retMsg.get())->retCode == sys::ReturnCodes::Success) {
            return retMsg;
        }

        return msgNotHandled();
    }

    sys::ReturnCodes ApplicationOnBoarding::InitHandler()
    {
        const auto ret = Application::InitHandler();
        if (ret != sys::ReturnCodes::Success) {
            return ret;
        }

        createUserInterface();
        setActiveWindow(gui::name::window::main_window);

        connect(typeid(manager::GetCurrentDisplayLanguageResponse), [&](sys::Message *msg) {
            if (gui::window::name::onBoarding_languages == getCurrentWindow()->getName()) {
                switchWindow(gui::window::name::onBoarding_start_configuration, nullptr);
                return msgHandled();
            }
            else {
                return msgNotHandled();
            }
        });

        return ret;
    }

    sys::ReturnCodes ApplicationOnBoarding::DeinitHandler()
    {
        return sys::ReturnCodes::Success;
    }

    sys::ReturnCodes ApplicationOnBoarding::SwitchPowerModeHandler(const sys::ServicePowerMode mode)
    {
        return sys::ReturnCodes::Success;
    }

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

    void ApplicationOnBoarding::destroyUserInterface()
    {}
} // namespace app

A module-apps/application-onboarding/ApplicationOnBoarding.hpp => module-apps/application-onboarding/ApplicationOnBoarding.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 "Application.hpp"

namespace gui::window::name
{
    inline constexpr auto onBoarding_languages           = "OnBoardingLanguages";
    inline constexpr auto onBoarding_start_configuration = "OnBoardingStartingConfiguration";
} // namespace gui::window::name

namespace app
{
    inline constexpr auto name_onboarding = "ApplicationOnBoarding";

    class ApplicationOnBoarding : public Application
    {
      public:
        explicit ApplicationOnBoarding(std::string name                    = name_onboarding,
                                       std::string parent                  = {},
                                       StartInBackground startInBackground = {false});

        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;
        sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override;

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

    template <> struct ManifestTraits<ApplicationOnBoarding>
    {
        static auto GetManifest() -> manager::ApplicationManifest
        {
            return {{manager::actions::Launch}};
        }
    };
} // namespace app

A module-apps/application-onboarding/CMakeLists.txt => module-apps/application-onboarding/CMakeLists.txt +28 -0
@@ 0,0 1,28 @@
include_directories( ${CMAKE_PROJECT_NAME}
	PUBLIC
		"${CMAKE_CURRENT_LIST_DIR}"
)

include_directories( ${PROJECT_NAME}
	PUBLIC
		"${CMAKE_CURRENT_LIST_DIR}"
)

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"
	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"
)
target_include_directories(${PROJECT_NAME}
    PRIVATE
        service-db
)

A module-apps/application-onboarding/data/OnBoardingSwitchData.hpp => module-apps/application-onboarding/data/OnBoardingSwitchData.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 <SwitchData.hpp>
#include <json/json11.hpp>
#include <utility>

namespace gui
{

    class OnBoardingSwitchData : public gui::SwitchData
    {
      public:
        OnBoardingSwitchData() : SwitchData("onBoardingSwitchData")
        {}
    };
} // namespace gui

A module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.cpp => module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.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 "application-onboarding/ApplicationOnBoarding.hpp"
#include "OnBoardingLanguagesWindow.hpp"
#include <module-gui/gui/input/InputEvent.hpp>

namespace gui
{
    OnBoardingLanguagesWindow::OnBoardingLanguagesWindow(app::Application *app)
        : LanguagesWindow(app, window::name::onBoarding_languages)
    {}

    void OnBoardingLanguagesWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);

        LanguagesWindow::onBeforeShow(mode, data);
    }

    bool OnBoardingLanguagesWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (inputEvent.isShortPress() && inputEvent.is(KeyCode::KEY_RF)) {
            return true;
        }
        else {
            return LanguagesWindow::onInput(inputEvent);
        }
    }
} /* namespace gui */

A module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.hpp => module-apps/application-onboarding/windows/OnBoardingLanguagesWindow.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 <module-apps/application-settings-new/windows/LanguagesWindow.hpp>

namespace gui
{
    class OnBoardingLanguagesWindow : public LanguagesWindow
    {
      public:
        explicit OnBoardingLanguagesWindow(app::Application *app);

      private:
        void onBeforeShow(ShowMode mode, SwitchData *data) override;
        bool onInput(const gui::InputEvent &inputEvent) override;
    };
} /* namespace gui */

A module-apps/application-onboarding/windows/OnBoardingMainWindow.cpp => module-apps/application-onboarding/windows/OnBoardingMainWindow.cpp +52 -0
@@ 0,0 1,52 @@
// 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 gui
{
    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::localize.get(::style::strings::common::start));

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

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

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

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

} // namespace gui

A module-apps/application-onboarding/windows/OnBoardingMainWindow.hpp => module-apps/application-onboarding/windows/OnBoardingMainWindow.hpp +23 -0
@@ 0,0 1,23 @@
// 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 <memory>

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

namespace gui
{
    class OnBoardingMainWindow : public gui::AppWindow
    {
      public:
        explicit OnBoardingMainWindow(app::Application *app);

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

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

A module-apps/application-onboarding/windows/StartConfigurationWindow.cpp => module-apps/application-onboarding/windows/StartConfigurationWindow.cpp +53 -0
@@ 0,0 1,53 @@
// 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 "StartConfigurationWindow.hpp"

namespace gui
{
    StartConfigurationWindow::StartConfigurationWindow(app::Application *app)
        : AppWindow(app, gui::window::name::onBoarding_start_configuration)
    {
        buildInterface();
    }

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

        bottomBar->setActive(gui::BottomBar::Side::CENTER, true);
        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::localize.get(::style::strings::common::start));
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, true);
        bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(::style::strings::common::back));

        new Icon(this,
                 0,
                 0,
                 style::window_width,
                 style::window::default_body_height,
                 "logo_no_text",
                 utils::localize.get("app_onboarding_start_configuration"));
    }

    bool StartConfigurationWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (inputEvent.isShortPress()) {
            if (inputEvent.is(KeyCode::KEY_RF)) {
                application->switchWindow(gui::window::name::onBoarding_languages,
                                          gui::ShowMode::GUI_SHOW_INIT,
                                          std::make_unique<gui::OnBoardingSwitchData>());
            }
            return true;
        }
        return AppWindow::onInput(inputEvent);
    }

} // namespace gui

A module-apps/application-onboarding/windows/StartConfigurationWindow.hpp => module-apps/application-onboarding/windows/StartConfigurationWindow.hpp +22 -0
@@ 0,0 1,22 @@
// 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 <memory>

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

namespace gui
{
    class StartConfigurationWindow : public gui::AppWindow
    {
      public:
        explicit StartConfigurationWindow(app::Application *app);

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

        void buildInterface() override;
    };
} // namespace gui

M module-apps/application-settings-new/CMakeLists.txt => module-apps/application-settings-new/CMakeLists.txt +0 -1
@@ 16,7 16,6 @@ target_sources( ${PROJECT_NAME}
    PRIVATE
        ApplicationSettings.cpp
        models/ApnSettingsModel.cpp
        models/LanguagesModel.cpp
        models/NewApnModel.cpp
        widgets/timeWidget.cpp
        widgets/ChangePasscodeLockHandler.cpp

D module-apps/application-settings-new/models/LanguagesModel.cpp => module-apps/application-settings-new/models/LanguagesModel.cpp +0 -12
@@ 1,12 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 <service-appmgr/service-appmgr/messages/GetCurrentDisplayLanguageRequest.hpp>
#include <service-appmgr/service-appmgr/model/ApplicationManager.hpp>
#include "LanguagesModel.hpp"

void LanguagesModel::requestCurrentDisplayLanguage()
{
    application->bus.sendUnicast(std::make_shared<app::manager::GetCurrentDisplayLanguageRequest>(),
                                 app::manager::ApplicationManager::ServiceName);
}

D module-apps/application-settings-new/models/LanguagesModel.hpp => module-apps/application-settings-new/models/LanguagesModel.hpp +0 -18
@@ 1,18 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 <Application.hpp>

class LanguagesModel
{
  public:
    explicit LanguagesModel(app::Application *application) : application(application)
    {}

    void requestCurrentDisplayLanguage();

  private:
    app::Application *application = nullptr;
};

M module-apps/application-settings-new/windows/LanguagesWindow.cpp => module-apps/application-settings-new/windows/LanguagesWindow.cpp +7 -17
@@ 4,21 4,24 @@
#include "application-settings-new/ApplicationSettings.hpp"
#include "application-settings-new/data/LanguagesData.hpp"
#include "LanguagesWindow.hpp"

#include <utility>
#include "OptionSetting.hpp"
#include "service-appmgr/Controller.hpp"

namespace gui
{
    LanguagesWindow::LanguagesWindow(app::Application *app)
        : BaseSettingsWindow(app, window::name::languages), langList(loader.getAvailableDisplayLanguages()),
          languagesModel(app)
    LanguagesWindow::LanguagesWindow(app::Application *app, std::string name)
        : BaseSettingsWindow(app, std::move(name)), langList(loader.getAvailableDisplayLanguages())
    {
        setTitle(utils::localize.get("app_settings_title_languages"));
        languagesModel.requestCurrentDisplayLanguage();
    }

    void LanguagesWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        selectedLanguage = utils::localize.getDisplayLanguage();
        setLanguageIndex();

        refreshOptionsList(selectedLanguageIndex);
    }



@@ 42,19 45,6 @@ namespace gui
        return options;
    }

    auto LanguagesWindow::handleSwitchData(SwitchData *data) -> bool
    {
        auto *languagesData = dynamic_cast<LanguagesData *>(data);
        if (languagesData == nullptr) {
            return false;
        }

        selectedLanguage = languagesData->getCurrentDisplayLanguage();
        setLanguageIndex();

        return true;
    }

    void LanguagesWindow::setLanguageIndex()
    {
        for (unsigned int langIndex = 0; langIndex < langList.size(); ++langIndex) {

M module-apps/application-settings-new/windows/LanguagesWindow.hpp => module-apps/application-settings-new/windows/LanguagesWindow.hpp +3 -5
@@ 3,7 3,7 @@

#pragma once

#include "application-settings-new/models/LanguagesModel.hpp"
#include "application-settings-new/ApplicationSettings.hpp"
#include "BaseSettingsWindow.hpp"
#include <i18n/i18n.hpp>



@@ 12,17 12,15 @@ namespace gui
    class LanguagesWindow : public BaseSettingsWindow
    {
      public:
        explicit LanguagesWindow(app::Application *app);
        explicit LanguagesWindow(app::Application *app, std::string name = window::name::languages);

      private:
      protected:
        auto buildOptionsList() -> std::list<Option> override;
        auto handleSwitchData(SwitchData *data) -> bool override;
        void onBeforeShow(ShowMode mode, SwitchData *data) override;
        void setLanguageIndex();

        utils::LangLoader loader;
        const std::vector<Language> langList;
        LanguagesModel languagesModel;
        Language selectedLanguage;
        unsigned int selectedLanguageIndex{0};
    };

M module-gui/gui/widgets/Icon.cpp => module-gui/gui/widgets/Icon.cpp +13 -20
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "Icon.hpp"


@@ 9,40 9,33 @@

using namespace gui;

namespace style
namespace style::icon
{
    namespace img
    {
        constexpr uint32_t x = 176;
        constexpr uint32_t y = 90;
    } // namespace img
    namespace text
    {
        constexpr uint32_t x = 40;
        constexpr uint32_t y = 247;
        constexpr uint32_t w = 400;
        constexpr uint32_t h = 80;
    } // namespace text
} // namespace style
    inline constexpr gui::Length image_bottom_margin = 30;
} // namespace style::icon

Icon::Icon(Item *parent,
           const uint32_t &x,
           const uint32_t &y,
           const uint32_t &w,
           const uint32_t &h,
           const UTF8 imageName,
           const UTF8 &imageName,
           const UTF8 &str)
    : Rect(parent, x, y, w, h)
    : VBox(parent, x, y, w, h)
{
    setEdges(RectangleEdge::None);
    setPenFocusWidth(style::window::default_border_no_focus_w);
    setPenWidth(style::window::default_border_no_focus_w);
    setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));

    new Image(this, style::img::x, style::img::y, imageName);
    text = new Text(this, style::text::x, style::text::y, style::text::w, style::text::h);
    text->setRichText(str);
    auto image = new Image(this, imageName);
    image->setMargins(Margins(0, 0, 0, style::icon::image_bottom_margin));

    auto text = new Text(this, 0, 0, 0, 0);
    text->setMaximumSize(w, h);
    text->setTextType(TextType::MultiLine);
    text->setEditMode(EditMode::Browse);
    text->setEdges(RectangleEdge::None);
    text->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
    text->setRichText(str);
}

M module-gui/gui/widgets/Icon.hpp => module-gui/gui/widgets/Icon.hpp +4 -5
@@ 1,24 1,23 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// 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 <Text.hpp>
#include <Image.hpp>

namespace gui
{
    class Icon : public Rect
    class Icon : public VBox
    {
        Text *text = nullptr;

      public:
        Icon(Item *parent,
             const uint32_t &x,
             const uint32_t &y,
             const uint32_t &w,
             const uint32_t &h,
             const UTF8 imageName,
             const UTF8 &imageName,
             const UTF8 &text);

        ~Icon() override = default;

M module-gui/gui/widgets/Image.cpp => module-gui/gui/widgets/Image.cpp +7 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "../core/DrawCommand.hpp"


@@ 25,6 25,12 @@ namespace gui
        setPosition(x, y);
    }

    Image::Image(Item *parent, const UTF8 &imageName) : Rect(parent, 0, 0, 0, 0), imageMap{nullptr}
    {
        type = ItemType::IMAGE;
        set(imageName);
    }

    Image::Image(const UTF8 &imageName) : imageMap{nullptr}
    {
        type = ItemType::IMAGE;

M module-gui/gui/widgets/Image.hpp => module-gui/gui/widgets/Image.hpp +2 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 24,6 24,7 @@ namespace gui
        Image();
        /// create new Image element and resize it to size needed by selected Image
        Image(const UTF8 &);
        Image(Item *parent, const UTF8 &imageName);
        /// Create new Image element on position x,y w&h will be *ignored*
        Image(Item *parent, uint32_t x, uint32_t y, uint32_t w, uint32_t h, const UTF8 = UTF8{""});
        Image(Item *parent, uint32_t x, uint32_t y, const UTF8 imgName = UTF8{""})

M module-gui/gui/widgets/InputMode.cpp => module-gui/gui/widgets/InputMode.cpp +1 -1
@@ 66,7 66,7 @@ const std::string &InputMode::get()
        actualInputMode == input_mode.find(InputMode::phone)->second) {
        return input_mode.at(modeNow());
    }
    return utils::localize.getInputLanguage(actualInputMode);
    return utils::localize.getInputLanguageFilename(actualInputMode);
}

void InputMode::show_input_type()

M module-services/service-appmgr/model/ApplicationManager.cpp => module-services/service-appmgr/model/ApplicationManager.cpp +10 -15
@@ 117,8 117,6 @@ namespace app::manager
    {
        blockingTimer->setInterval(default_application_locktime_ms);
        utils::localize.setFallbackLanguage(utils::localize.DefaultLanguage);
        utils::localize.setDisplayLanguage(displayLanguage);
        utils::localize.setInputLanguage(inputLanguage);
        settings->registerValueChange(
            settings::SystemProperties::displayLanguage,
            [this](std::string value) { displayLanguageChanged(value); },


@@ 243,7 241,7 @@ namespace app::manager
        connect(typeid(DisplayLanguageChangeRequest), [this](sys::Message *request) {
            auto msg = static_cast<DisplayLanguageChangeRequest *>(request);
            handleDisplayLanguageChange(msg);
            return msgHandled();
            return std::make_shared<GetCurrentDisplayLanguageResponse>(utils::localize.getDisplayLanguage());
        });
        connect(typeid(InputLanguageChangeRequest), [this](sys::Message *request) {
            auto msg = static_cast<InputLanguageChangeRequest *>(request);


@@ 281,7 279,7 @@ namespace app::manager
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(GetCurrentDisplayLanguageRequest), [&](sys::Message *request) {
            return std::make_shared<GetCurrentDisplayLanguageResponse>(displayLanguage);
            return std::make_shared<GetCurrentDisplayLanguageResponse>(utils::localize.getDisplayLanguage());
        });
        connect(typeid(UpdateInProgress), [this](sys::Message *) {
            closeApplicationsOnUpdate();


@@ 613,14 611,13 @@ namespace app::manager
    {
        const auto &requestedLanguage = msg->getLanguage();

        if (requestedLanguage == displayLanguage) {
        if (requestedLanguage == utils::localize.getDisplayLanguage()) {
            LOG_WARN("The selected language is already set. Ignore.");
            return false;
        }
        displayLanguage = requestedLanguage;
        settings->setValue(
            settings::SystemProperties::displayLanguage, displayLanguage, settings::SettingsScope::Global);
        utils::localize.setDisplayLanguage(displayLanguage);
            settings::SystemProperties::displayLanguage, requestedLanguage, settings::SettingsScope::Global);
        utils::localize.setDisplayLanguage(requestedLanguage);
        rebuildActiveApplications();
        return true;
    }


@@ 629,13 626,13 @@ namespace app::manager
    {
        const auto &requestedLanguage = msg->getLanguage();

        if (requestedLanguage == inputLanguage) {
        if (requestedLanguage == utils::localize.getInputLanguage()) {
            LOG_WARN("The selected language is already set. Ignore.");
            return false;
        }
        inputLanguage = requestedLanguage;
        settings->setValue(settings::SystemProperties::inputLanguage, inputLanguage, settings::SettingsScope::Global);
        utils::localize.setInputLanguage(inputLanguage);
        settings->setValue(
            settings::SystemProperties::inputLanguage, requestedLanguage, settings::SettingsScope::Global);
        utils::localize.setInputLanguage(requestedLanguage);
        return true;
    }



@@ 817,8 814,7 @@ namespace app::manager
        if (value.empty()) {
            return;
        }
        displayLanguage = value;
        utils::localize.setDisplayLanguage(displayLanguage);
        utils::localize.setDisplayLanguage(value);
        rebuildActiveApplications();
    }
    void ApplicationManager::lockTimeChanged(std::string value)


@@ 834,7 830,6 @@ namespace app::manager
        if (value.empty()) {
            return;
        }
        inputLanguage = value;
        utils::localize.setInputLanguage(value);
    }
} // namespace app::manager

M module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp => module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp +0 -2
@@ 157,8 157,6 @@ namespace app::manager
        void displayLanguageChanged(std::string value);
        void lockTimeChanged(std::string value);
        void inputLanguageChanged(std::string value);
        std::string inputLanguage;
        std::string displayLanguage;
    };
} // namespace app::manager


M module-utils/i18n/i18n.cpp => module-utils/i18n/i18n.cpp +11 -2
@@ 74,7 74,7 @@ namespace utils
        inputLanguage = lang;
    }

    const std::string &i18n::getInputLanguage(const std::string &inputMode)
    const std::string &i18n::getInputLanguageFilename(const std::string &inputMode)
    {
        // if language pack returned nothing then try default language
        if (inputLanguage.empty()) {


@@ 86,6 86,16 @@ namespace utils
        return inputLanguageFilename;
    }

    const std::string &i18n::getInputLanguage()
    {
        return inputLanguage;
    }

    const std::string &i18n::getDisplayLanguage()
    {
        return currentDisplayLanguage;
    }

    const std::string &i18n::get(const std::string &str)
    {
        // if language pack returned nothing then try default language


@@ 122,5 132,4 @@ namespace utils
    {
        fallbackLanguageName = std::move(lang);
    }

} // namespace utils

M module-utils/i18n/i18n.hpp => module-utils/i18n/i18n.hpp +3 -1
@@ 44,7 44,9 @@ namespace utils

        virtual ~i18n() = default;
        void setInputLanguage(const Language &lang);
        const std::string &getInputLanguage(const std::string &inputMode);
        const std::string &getInputLanguageFilename(const std::string &inputMode);
        const std::string &getInputLanguage();
        const std::string &getDisplayLanguage();
        const std::string &get(const std::string &str);
        void setDisplayLanguage(const Language &lang);
        void setFallbackLanguage(const Language &lang);

M source/main.cpp => source/main.cpp +4 -0
@@ 19,6 19,7 @@
#include <application-meditation/ApplicationMeditation.hpp>
#include <application-calculator/ApplicationCalculator.hpp>
#include <application-alarm-clock/ApplicationAlarmClock.hpp>
#include <application-onboarding/ApplicationOnBoarding.hpp>

// services
#include <service-appmgr/model/ApplicationManager.hpp>


@@ 154,6 155,9 @@ int main()
#ifdef ENABLE_APP_ALARM_CLOCK
            applications.push_back(app::CreateLauncher<app::ApplicationAlarmClock>(app::name_alarm_clock));
#endif
#ifdef ENABLE_APP_ONBOARDING
            applications.push_back(app::CreateLauncher<app::ApplicationOnBoarding>(app::name_onboarding));
#endif
            // start application manager
            return sysmgr->RunService(
                std::make_shared<app::manager::ApplicationManager>(