~aleteoryx/muditaos

84c99029d8067d01c96862ca2df6ad56fe27c625 — Krzysztof Móżdżyński 4 years ago 7a7f163
[EGD-5449] Add final prompts windows

Added Dialog windows for "configuration successful"
"no configuration" and "update OS" for Onboarding.
Refactor Dialog window implementation and usage of
DialogMetadata in other applications.
37 files changed, 647 insertions(+), 318 deletions(-)

A art/phone/application_onboarding/Info.png
A art/phone/application_onboarding/Success.png
A art/phone/application_onboarding/Update.png
A image/assets/images/info_icon_W_G.vpi
A image/assets/images/success_icon_W_G.vpi
A image/assets/images/update_icon_W_G.vpi
M image/assets/lang/English.json
M module-apps/application-alarm-clock/windows/AlarmClockOptions.cpp
M module-apps/application-calendar/ApplicationCalendar.cpp
M module-apps/application-calendar/windows/CalendarEventsOptionsWindow.cpp
M module-apps/application-call/ApplicationCall.cpp
M module-apps/application-calllog/ApplicationCallLog.cpp
M module-apps/application-messages/ApplicationMessages.cpp
M module-apps/application-notes/windows/NotesOptions.cpp
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/windows/ConfigurationSuccessfulDialogWindow.cpp
A module-apps/application-onboarding/windows/ConfigurationSuccessfulDialogWindow.hpp
A module-apps/application-onboarding/windows/NoConfigurationDialogWindow.cpp
A module-apps/application-onboarding/windows/NoConfigurationDialogWindow.hpp
A module-apps/application-onboarding/windows/SkipDialogWindow.cpp
A module-apps/application-onboarding/windows/SkipDialogWindow.hpp
M module-apps/application-onboarding/windows/StartConfigurationWindow.cpp
A module-apps/application-onboarding/windows/UpdateDialogWindow.cpp
A module-apps/application-onboarding/windows/UpdateDialogWindow.hpp
M module-apps/application-phonebook/windows/PhonebookContactOptions.cpp
M module-apps/application-phonebook/windows/PhonebookNewContact.cpp
M module-apps/application-settings-new/windows/ChangePasscodeWindow.cpp
M module-apps/application-settings-new/windows/QuotesOptionsWindow.cpp
M module-apps/windows/Dialog.cpp
M module-apps/windows/Dialog.hpp
M module-apps/windows/NoEvents.cpp
M module-gui/gui/widgets/Icon.cpp
M module-gui/gui/widgets/Icon.hpp
M module-gui/gui/widgets/Style.hpp
M module-services/service-desktop/endpoints/calendarEvents/CalendarEventsHelper.cpp
A art/phone/application_onboarding/Info.png => art/phone/application_onboarding/Info.png +0 -0
A art/phone/application_onboarding/Success.png => art/phone/application_onboarding/Success.png +0 -0
A art/phone/application_onboarding/Update.png => art/phone/application_onboarding/Update.png +0 -0
A image/assets/images/info_icon_W_G.vpi => image/assets/images/info_icon_W_G.vpi +0 -0
A image/assets/images/success_icon_W_G.vpi => image/assets/images/success_icon_W_G.vpi +0 -0
A image/assets/images/update_icon_W_G.vpi => image/assets/images/update_icon_W_G.vpi +0 -0
M image/assets/lang/English.json => image/assets/lang/English.json +8 -0
@@ 9,6 9,7 @@
  "common_use": "USE",
  "common_ok": "OK",
  "common_back": "BACK",
  "common_skip": "SKIP",
  "common_set": "SET",
  "common_yes": "Yes",
  "common_no": "No",


@@ 313,8 314,15 @@
  "app_messages_thread_not_sent": "Not sent: ",
  "app_messages_thread_from_this": "From this message",
  "app_messages_thread_you": "You: ",
  "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_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_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": "Settings",
  "app_settings_title_main_new": "Settings New",
  "app_settings_bt": "Bluetooth",

M module-apps/application-alarm-clock/windows/AlarmClockOptions.cpp => module-apps/application-alarm-clock/windows/AlarmClockOptions.cpp +13 -13
@@ 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 "AlarmClockOptions.hpp"


@@ 23,18 23,18 @@ namespace app::alarmClock
                         Application *application,
                         AbstractAlarmsRepository &alarmsRepository)
        {
            gui::DialogMetadata meta;
            meta.text   = utils::localize.get("app_alarm_clock_delete_confirmation");
            meta.title  = utils::localize.get("app_alarm_clock_title_main");
            meta.icon   = "phonebook_contact_delete_trashcan";
            meta.action = [record, application, &alarmsRepository] {
                alarmsRepository.remove(
                    record, [application](bool) { application->switchWindow(gui::name::window::main_window); });
                return true;
            };

            application->switchWindow(style::alarmClock::window::name::dialogYesNo,
                                      std::make_unique<gui::DialogMetadataMessage>(meta));
            auto metaData = std::make_unique<gui::DialogMetadataMessage>(
                gui::DialogMetadata{utils::localize.get("app_alarm_clock_title_main"),
                                    "phonebook_contact_delete_trashcan",
                                    utils::localize.get("app_alarm_clock_delete_confirmation"),
                                    "",
                                    [record, application, &alarmsRepository] {
                                        alarmsRepository.remove(record, [application](bool) {
                                            application->switchWindow(gui::name::window::main_window);
                                        });
                                        return true;
                                    }});
            application->switchWindow(style::alarmClock::window::name::dialogYesNo, std::move(metaData));
        }
    } // namespace


M module-apps/application-calendar/ApplicationCalendar.cpp => module-apps/application-calendar/ApplicationCalendar.cpp +22 -20
@@ 157,28 157,30 @@ namespace app
        if (equivalentWindow == EquivalentWindow::AllEventsWindow) {
            popToWindow(gui::name::window::main_window);
        }
        gui::DialogMetadata meta;
        meta.text   = utils::localize.get("app_calendar_no_events_information");
        meta.title  = title;
        meta.icon   = "phonebook_empty_grey_circle_W_G";
        meta.action = [=]() -> bool {
            LOG_DEBUG("Switch to new event window");
            std::unique_ptr<EventRecordData> eventData = std::make_unique<EventRecordData>();
            eventData->setDescription(style::window::calendar::new_event);
            auto event       = std::make_shared<EventsRecord>();
            event->date_from = dateFilter;
            event->date_till = dateFilter + std::chrono::hours(utils::time::Locale::max_hour_24H_mode) +
                               std::chrono::minutes(utils::time::Locale::max_minutes);
            eventData->setData(event);

            switchWindow(
                style::window::calendar::name::new_edit_event, gui::ShowMode::GUI_SHOW_INIT, std::move(eventData));
            return true;
        };

        LOG_DEBUG("Switch to no events window");
        switchWindow(style::window::calendar::name::no_events_window,
                     std::make_unique<gui::DialogMetadataMessage>(meta));

        auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
            title,
            "phonebook_empty_grey_circle_W_G",
            utils::localize.get("app_calendar_no_events_information"),
            "",
            [=]() -> bool {
                LOG_DEBUG("Switch to new event window");
                std::unique_ptr<EventRecordData> eventData = std::make_unique<EventRecordData>();
                eventData->setDescription(style::window::calendar::new_event);
                auto event       = std::make_shared<EventsRecord>();
                event->date_from = dateFilter;
                event->date_till = dateFilter + std::chrono::hours(utils::time::Locale::max_hour_24H_mode) +
                                   std::chrono::minutes(utils::time::Locale::max_minutes);
                eventData->setData(event);

                switchWindow(
                    style::window::calendar::name::new_edit_event, gui::ShowMode::GUI_SHOW_INIT, std::move(eventData));
                return true;
            }});

        switchWindow(style::window::calendar::name::no_events_window, std::move(metaData));
    }

} /* namespace app */

M module-apps/application-calendar/windows/CalendarEventsOptionsWindow.cpp => module-apps/application-calendar/windows/CalendarEventsOptionsWindow.cpp +18 -17
@@ 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 "CalendarEventsOptionsWindow.hpp"


@@ 47,7 47,7 @@ namespace gui
            return false;
        }

        eventRecord      = item->getData();
        eventRecord = item->getData();
        clearOptions();
        options = eventsOptionsList();
        addOptions(options);


@@ 57,22 57,23 @@ namespace gui
    auto CalendarEventsOptions::eventDelete() -> bool
    {
        LOG_DEBUG("Switch to delete event window");
        gui::DialogMetadata meta;

        meta.action = [=]() -> bool {
            LOG_INFO("Delete calendar event %d", static_cast<int>(eventRecord->ID));
            DBServiceAPI::GetQuery(
                application, db::Interface::Name::Events, std::make_unique<db::query::events::Remove>(eventRecord->ID));
            const uint32_t numberOfIgnoredWindows = 3;
            application->returnToPreviousWindow(numberOfIgnoredWindows);
            return true;
        };
        meta.text  = utils::localize.get("app_calendar_event_delete_confirmation");
        meta.title = eventRecord->title;
        meta.icon  = "phonebook_contact_delete_trashcan";

        this->application->switchWindow(style::window::calendar::name::dialog_yes_no,
                                        std::make_unique<gui::DialogMetadataMessage>(meta));
        auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
            eventRecord->title,
            "phonebook_contact_delete_trashcan",
            utils::localize.get("app_calendar_event_delete_confirmation"),
            "",
            [=]() -> bool {
                LOG_INFO("Delete calendar event %d", static_cast<int>(eventRecord->ID));
                DBServiceAPI::GetQuery(application,
                                       db::Interface::Name::Events,
                                       std::make_unique<db::query::events::Remove>(eventRecord->ID));
                const uint32_t numberOfIgnoredWindows = 3;
                application->returnToPreviousWindow(numberOfIgnoredWindows);
                return true;
            }});
        this->application->switchWindow(
            style::window::calendar::name::dialog_yes_no, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
        return true;
    }
} // namespace gui

M module-apps/application-call/ApplicationCall.cpp => module-apps/application-call/ApplicationCall.cpp +3 -5
@@ 233,11 233,9 @@ namespace app
                                           const std::string &icon,
                                           const std::string &text)
    {
        gui::DialogMetadata meta;
        meta.icon   = icon;
        meta.text   = text;
        meta.action = std::move(action);
        switchWindow(app::window::name_dialogConfirm, std::make_unique<gui::DialogMetadataMessage>(std::move(meta)));
        auto metaData =
            std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{"", icon, text, "", std::move(action)});
        switchWindow(app::window::name_dialogConfirm, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
        return true;
    }


M module-apps/application-calllog/ApplicationCallLog.cpp => module-apps/application-calllog/ApplicationCallLog.cpp +14 -13
@@ 107,19 107,20 @@ namespace app
    bool ApplicationCallLog::removeCalllogEntry(const CalllogRecord &record)
    {
        LOG_DEBUG("Removing CalllogRecord: %" PRIu32, record.ID);
        gui::DialogMetadata meta;
        meta.action = [=]() -> bool {
            if (DBServiceAPI::CalllogRemove(this, record.ID) == false) {
                LOG_ERROR("CalllogRemove id=%" PRIu32 " failed", record.ID);
                return false;
            }
            this->switchWindow(calllog::settings::MainWindowStr);
            return true;
        };
        meta.title = record.name;
        meta.text  = utils::localize.get("app_calllog_delete_call_confirmation");
        meta.icon  = "phonebook_contact_delete_trashcan";
        switchWindow(calllog::settings::DialogYesNoStr, std::make_unique<gui::DialogMetadataMessage>(meta));
        auto metaData = std::make_unique<gui::DialogMetadataMessage>(
            gui::DialogMetadata{record.name,
                                "phonebook_contact_delete_trashcan",
                                utils::localize.get("app_calllog_delete_call_confirmation"),
                                "",
                                [=]() -> bool {
                                    if (DBServiceAPI::CalllogRemove(this, record.ID) == false) {
                                        LOG_ERROR("CalllogRemove id=%" PRIu32 " failed", record.ID);
                                        return false;
                                    }
                                    this->switchWindow(calllog::settings::MainWindowStr);
                                    return true;
                                }});
        switchWindow(calllog::settings::DialogYesNoStr, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
        return true;
    }


M module-apps/application-messages/ApplicationMessages.cpp => module-apps/application-messages/ApplicationMessages.cpp +15 -14
@@ 190,12 190,13 @@ namespace app
            auto result = dynamic_cast<ContactGetByIDResult *>(response);
            if (result != nullptr) {
                const auto &contact = result->getResult();
                gui::DialogMetadata meta;
                meta.action = [this, record]() { return onRemoveSmsThreadConfirmed(*record); };
                meta.text   = utils::localize.get("app_messages_thread_delete_confirmation");
                meta.title  = contact.getFormattedName();
                meta.icon   = "phonebook_contact_delete_trashcan";
                switchWindow(gui::name::window::dialog_yes_no, std::make_unique<gui::DialogMetadataMessage>(meta));
                auto metaData       = std::make_unique<gui::DialogMetadataMessage>(
                    gui::DialogMetadata{contact.getFormattedName(),
                                        "phonebook_contact_delete_trashcan",
                                        utils::localize.get("app_messages_thread_delete_confirmation"),
                                        "",
                                        [this, record]() { return onRemoveSmsThreadConfirmed(*record); }});
                switchWindow(gui::name::window::dialog_yes_no, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
                return true;
            }
            return false;


@@ 227,14 228,13 @@ namespace app
    bool ApplicationMessages::removeSms(const SMSRecord &record)
    {
        LOG_DEBUG("Removing sms: %" PRIu32, record.ID);

        gui::DialogMetadata meta;
        meta.action = [this, record] { return onRemoveSmsConfirmed(record); };
        meta.text   = utils::localize.get("app_messages_message_delete_confirmation");
        meta.title  = record.body;
        meta.icon   = "phonebook_contact_delete_trashcan";

        switchWindow(gui::name::window::dialog_yes_no, std::make_unique<gui::DialogMetadataMessage>(meta));
        auto metaData = std::make_unique<gui::DialogMetadataMessage>(
            gui::DialogMetadata{record.body,
                                "phonebook_contact_delete_trashcan",
                                utils::localize.get("app_messages_message_delete_confirmation"),
                                "",
                                [this, record] { return onRemoveSmsConfirmed(record); }});
        switchWindow(gui::name::window::dialog_yes_no, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
        return true;
    }



@@ 285,6 285,7 @@ namespace app
        auto data                        = std::make_unique<gui::DialogMetadataMessage>(meta);
        data->ignoreCurrentWindowOnStack = true;
        switchWindow(gui::name::window::dialog, std::make_unique<gui::DialogMetadataMessage>(meta));

        return true;
    }


M module-apps/application-notes/windows/NotesOptions.cpp => module-apps/application-notes/windows/NotesOptions.cpp +14 -11
@@ 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 "NotesOptions.hpp"


@@ 26,16 26,19 @@ namespace app::notes

        void removeNote(const NotesRecord &record, Application *application, AbstractNotesRepository &notesRepository)
        {
            gui::DialogMetadata meta;
            meta.action = [record, application, &notesRepository] {
                notesRepository.remove(
                    record, [application](bool) { application->switchWindow(gui::name::window::main_window); });
                return true;
            };
            meta.text = utils::localize.get("app_notes_note_delete_confirmation");
            meta.icon = "phonebook_contact_delete_trashcan";
            application->switchWindow(gui::name::window::note_confirm_dialog,
                                      std::make_unique<gui::DialogMetadataMessage>(meta));
            auto metaData = std::make_unique<gui::DialogMetadataMessage>(
                gui::DialogMetadata{utils::localize.get("app_alarm_clock_title_main"),
                                    "phonebook_contact_delete_trashcan",
                                    utils::localize.get("app_notes_note_delete_confirmation"),
                                    "",
                                    [record, application, &notesRepository] {
                                        notesRepository.remove(record, [application](bool) {
                                            application->switchWindow(gui::name::window::main_window);
                                        });
                                        return true;
                                    }});
            application->switchWindow(
                gui::name::window::note_confirm_dialog, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
        }
    } // namespace


M module-apps/application-onboarding/ApplicationOnBoarding.cpp => module-apps/application-onboarding/ApplicationOnBoarding.cpp +20 -0
@@ 9,11 9,16 @@
#include "windows/StartConfigurationWindow.hpp"
#include "windows/OnBoardingLanguagesWindow.hpp"
#include "windows/EULALicenseWindow.hpp"
#include "windows/ConfigurationSuccessfulDialogWindow.hpp"
#include "windows/NoConfigurationDialogWindow.hpp"
#include "windows/UpdateDialogWindow.hpp"
#include "windows/SkipDialogWindow.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>
#include <module-services/service-db/agents/settings/SystemSettings.hpp>
#include <module-apps/windows/Dialog.hpp>

namespace app
{


@@ 105,6 110,21 @@ namespace app
                                                                                           std::move(eulaRepository));
            return std::make_unique<app::onBoarding::EULALicenseWindow>(app, std::move(presenter));
        });
        windowsFactory.attach(gui::window::name::onBoarding_configuration_successful,
                              [](Application *app, const std::string &name) {
                                  return std::make_unique<app::onBoarding::ConfigurationSuccessfulDialogWindow>(app);
                              });
        windowsFactory.attach(gui::window::name::onBoarding_no_configuration,
                              [](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_skip, [](Application *app, const std::string &name) {
            return std::make_unique<app::onBoarding::SkipDialogWindow>(app);
        });

        attachPopups({gui::popup::ID::Volume});
    }

M module-apps/application-onboarding/ApplicationOnBoarding.hpp => module-apps/application-onboarding/ApplicationOnBoarding.hpp +7 -3
@@ 7,9 7,13 @@

namespace gui::window::name
{
    inline constexpr auto onBoarding_languages           = "OnBoardingLanguages";
    inline constexpr auto onBoarding_start_configuration = "OnBoardingStartingConfiguration";
    inline constexpr auto onBoarding_eula                = "OnBoardingEula";
    inline constexpr auto onBoarding_languages                = "OnBoardingLanguages";
    inline constexpr auto onBoarding_start_configuration      = "OnBoardingStartingConfiguration";
    inline constexpr auto onBoarding_eula                     = "OnBoardingEula";
    inline constexpr auto onBoarding_configuration_successful = "OnBoardingConfigurationSuccessful";
    inline constexpr auto onBoarding_no_configuration         = "OnBoardingNoConfiguration";
    inline constexpr auto onBoarding_update                   = "OnBoardingUpdate";
    inline constexpr auto onBoarding_skip                     = "OnBoardingSkipConfirm";
} // namespace gui::window::name

namespace app

M module-apps/application-onboarding/CMakeLists.txt => module-apps/application-onboarding/CMakeLists.txt +12 -3
@@ 10,7 10,7 @@ include_directories( ${PROJECT_NAME}

target_sources(${PROJECT_NAME}

	PRIVATE
		PRIVATE
		"${CMAKE_CURRENT_LIST_DIR}/ApplicationOnBoarding.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingMainWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/StartConfigurationWindow.cpp"


@@ 18,7 18,11 @@ target_sources(${PROJECT_NAME}
		"${CMAKE_CURRENT_LIST_DIR}/windows/EULALicenseWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/presenter/EULALicenseWindowPresenter.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/model/EULARepository.cpp"
	PUBLIC
		"${CMAKE_CURRENT_LIST_DIR}/windows/ConfigurationSuccessfulDialogWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/NoConfigurationDialogWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/UpdateDialogWindow.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/SkipDialogWindow.cpp"
		PUBLIC
		"${CMAKE_CURRENT_LIST_DIR}/ApplicationOnBoarding.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/OnBoardingMainWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/StartConfigurationWindow.hpp"


@@ 27,7 31,12 @@ target_sources(${PROJECT_NAME}
		"${CMAKE_CURRENT_LIST_DIR}/windows/EULALicenseWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/presenter/EULALicenseWindowPresenter.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/model/EULARepository.hpp"
)
		"${CMAKE_CURRENT_LIST_DIR}/windows/ConfigurationSuccessfulDialogWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/NoConfigurationDialogWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/UpdateDialogWindow.hpp"
		"${CMAKE_CURRENT_LIST_DIR}/windows/SkipDialogWindow.hpp"

		)
target_include_directories(${PROJECT_NAME}
    PRIVATE
        service-db

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

#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>

namespace app::onBoarding
{
    ConfigurationSuccessfulDialogWindow::ConfigurationSuccessfulDialogWindow(app::Application *app)
        : gui::Dialog(app, gui::window::name::onBoarding_configuration_successful)
    {
        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::localize.get(style::strings::common::start));
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);
    }

    bool ConfigurationSuccessfulDialogWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (inputEvent.isShortPress()) {
            if (inputEvent.is(gui::KeyCode::KEY_ENTER)) {
                auto metaData = std::make_unique<gui::DialogMetadataMessage>(
                    gui::DialogMetadata{utils::localize.get("app_onboarding_title_update_info"),
                                        "update_icon_W_G",
                                        utils::localize.get("app_onboarding_update_info"),
                                        "",
                                        [=]() -> bool { return true; }});
                application->switchWindow(
                    gui::window::name::onBoarding_update, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
                return true;
            }

            if (inputEvent.isShortPress() && inputEvent.is(gui::KeyCode::KEY_RF)) {
                return true;
            }
        }
        return AppWindow::onInput(inputEvent);
    }
} // namespace app::onBoarding

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

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

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

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

#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>

namespace app::onBoarding
{
    NoConfigurationDialogWindow::NoConfigurationDialogWindow(app::Application *app)
        : gui::Dialog(app, gui::window::name::onBoarding_no_configuration)
    {
        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::localize.get(style::strings::common::start));
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);
    }

    bool NoConfigurationDialogWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (inputEvent.isShortPress()) {
            if (inputEvent.is(gui::KeyCode::KEY_ENTER)) {
                auto metaData = std::make_unique<gui::DialogMetadataMessage>(
                    gui::DialogMetadata{utils::localize.get("app_onboarding_title_update_info"),
                                        "update_icon_W_G",
                                        utils::localize.get("app_onboarding_update_info"),
                                        "",
                                        [=]() -> bool { return true; }});
                application->switchWindow(
                    gui::window::name::onBoarding_update, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
                return true;
            }

            if (inputEvent.isShortPress() && inputEvent.is(gui::KeyCode::KEY_RF)) {
                return true;
            }
        }
        return AppWindow::onInput(inputEvent);
    }
} // namespace app::onBoarding

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

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

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

A module-apps/application-onboarding/windows/SkipDialogWindow.cpp => module-apps/application-onboarding/windows/SkipDialogWindow.cpp +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

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

namespace app::onBoarding
{
    SkipDialogWindow::SkipDialogWindow(app::Application *app)
        : gui::DialogYesNo(app, gui::window::name::onBoarding_skip)
    {
        topBar->configure(configureTopBar(application->getTopBarConfiguration()));
    }

    gui::top_bar::Configuration SkipDialogWindow::configureTopBar(gui::top_bar::Configuration appConfiguration)
    {
        appConfiguration.set(gui::top_bar::Indicator::Time, true);
        appConfiguration.set(gui::top_bar::Indicator::Battery, false);
        appConfiguration.set(gui::top_bar::Indicator::SimCard, false);
        appConfiguration.set(gui::top_bar::Indicator::Signal, false);
        return appConfiguration;
    }
} // namespace app::onBoarding

A module-apps/application-onboarding/windows/SkipDialogWindow.hpp => module-apps/application-onboarding/windows/SkipDialogWindow.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 "Dialog.hpp"

namespace app::onBoarding
{
    class SkipDialogWindow : public gui::DialogYesNo
    {
      public:
        explicit SkipDialogWindow(app::Application *app);

        gui::top_bar::Configuration configureTopBar(gui::top_bar::Configuration appConfiguration) override;
    };
} // namespace app::onBoarding

M module-apps/application-onboarding/windows/StartConfigurationWindow.cpp => module-apps/application-onboarding/windows/StartConfigurationWindow.cpp +41 -1
@@ 7,7 7,10 @@
#include <InputEvent.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"



@@ 27,6 30,8 @@ namespace app::onBoarding
        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));
        bottomBar->setActive(gui::BottomBar::Side::LEFT, true);
        bottomBar->setText(gui::BottomBar::Side::LEFT, utils::localize.get(::style::strings::common::skip));

        new gui::Icon(this,
                      0,


@@ 45,9 50,44 @@ namespace app::onBoarding
                                          gui::ShowMode::GUI_SHOW_INIT,
                                          std::make_unique<OnBoardingSwitchData>());
            }
            if (inputEvent.is(gui::KeyCode::KEY_ENTER)) {
                auto metaData = std::make_unique<gui::DialogMetadataMessage>(
                    gui::DialogMetadata{utils::localize.get("app_onboarding_title_configuration"),
                                        "success_icon_W_G",
                                        utils::localize.get("app_onboarding_configuration_successful"),
                                        "",
                                        [=]() -> bool { return true; }});
                application->switchWindow(gui::window::name::onBoarding_configuration_successful,
                                          gui::ShowMode::GUI_SHOW_INIT,
                                          std::move(metaData));
            }
            if (inputEvent.is(gui::KeyCode::KEY_LF)) {

                auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
                    utils::localize.get("app_onboarding_title"),
                    "info_icon_W_G",
                    utils::localize.get("app_onboarding_skip_confirm"),
                    "",
                    [=]() -> bool {
                        auto metaData = std::make_unique<gui::DialogMetadataMessage>(
                            gui::DialogMetadata{utils::localize.get("app_onboarding_title_configuration"),
                                                "info_icon_W_G",
                                                utils::localize.get("app_onboarding_no_configuration"),
                                                "",
                                                [=]() -> bool { return true; }});

                        application->switchWindow(gui::window::name::onBoarding_no_configuration,
                                                  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
} // namespace app::onBoarding

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

#include "UpdateDialogWindow.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>

namespace app::onBoarding
{
    UpdateDialogWindow::UpdateDialogWindow(app::Application *app)
        : gui::Dialog(app, gui::window::name::onBoarding_update)
    {
        bottomBar->setText(gui::BottomBar::Side::CENTER, utils::localize.get(style::strings::common::ok));
        bottomBar->setActive(gui::BottomBar::Side::RIGHT, false);
    }

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

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

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

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

M module-apps/application-phonebook/windows/PhonebookContactOptions.cpp => module-apps/application-phonebook/windows/PhonebookContactOptions.cpp +51 -44
@@ 80,33 80,32 @@ namespace gui
    auto PhonebookContactOptions::contactBlock(bool shouldBeBlocked) -> bool
    {
        LOG_DEBUG("Blocking contact: %" PRIu32, contact->ID);
        std::unique_ptr<DialogMetadata> meta = std::make_unique<DialogMetadata>();
        std::string dialogText;

        meta->action = [=]() -> bool {
            contact->addToBlocked(shouldBeBlocked);
            DBServiceAPI::ContactUpdate(this->application, *contact);
            if (shouldBeBlocked) {
                showNotification(NotificationType::Block);
            }
            else {
                showNotification(NotificationType::Unblock);
            }

            return true;
        };
        if (shouldBeBlocked) {
            meta->text = utils::localize.get("app_phonebook_options_block_confirm");
            dialogText = utils::localize.get("app_phonebook_options_block_confirm");
        }
        else {
            meta->text = utils::localize.get("app_phonebook_options_unblock_confirm");
            dialogText = utils::localize.get("app_phonebook_options_unblock_confirm");
        }

        auto contactRec = DBServiceAPI::ContactGetByID(this->application, contact->ID);
        auto cont       = !contactRec->empty() ? contactRec->front() : ContactRecord{};
        meta->title     = cont.getFormattedName();
        meta->icon      = "phonebook_contact_delete_trashcan";
        application->switchWindow(gui::window::name::dialog_yes_no,
                                  std::make_unique<gui::DialogMetadataMessage>(std::move(*meta)));

        auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
            cont.getFormattedName(), "phonebook_contact_delete_trashcan", dialogText, "", [=]() -> bool {
                contact->addToBlocked(shouldBeBlocked);
                DBServiceAPI::ContactUpdate(this->application, *contact);
                if (shouldBeBlocked) {
                    showNotification(NotificationType::Block);
                }
                else {
                    showNotification(NotificationType::Unblock);
                }
                return true;
            }});

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



@@ 115,46 114,54 @@ namespace gui
        LOG_DEBUG("Removing contact: %" PRIu32, contact->ID);
        std::unique_ptr<DialogMetadata> meta = std::make_unique<DialogMetadata>();

        meta->action = [=]() -> bool {
            if (!DBServiceAPI::ContactRemove(this->application, contact->ID)) {
                LOG_ERROR("Contact id=%" PRIu32 "  remove failed", contact->ID);
                return false;
            }
            showNotification(NotificationType::Delete);
            return true;
        };
        meta->text      = utils::localize.get("app_phonebook_options_delete_confirm");
        auto contactRec = DBServiceAPI::ContactGetByID(this->application, contact->ID);
        auto cont       = !contactRec->empty() ? contactRec->front() : ContactRecord{};
        meta->title     = cont.getFormattedName();
        meta->icon      = "phonebook_contact_delete_trashcan";
        application->switchWindow(gui::window::name::dialog_yes_no,
                                  std::make_unique<DialogMetadataMessage>(std::move(*meta)));

        auto metaData = std::make_unique<gui::DialogMetadataMessage>(
            gui::DialogMetadata{cont.getFormattedName(),
                                "phonebook_contact_delete_trashcan",
                                utils::localize.get("app_phonebook_options_delete_confirm"),
                                "",
                                [=]() -> bool {
                                    if (!DBServiceAPI::ContactRemove(this->application, contact->ID)) {
                                        LOG_ERROR("Contact id=%" PRIu32 "  remove failed", contact->ID);
                                        return false;
                                    }
                                    showNotification(NotificationType::Delete);
                                    return true;
                                }});

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

    auto PhonebookContactOptions::showNotification(NotificationType notificationType) -> bool
    {
        DialogMetadata meta;
        meta.icon = "info_big_circle_W_G";
        std::string dialogText;

        switch (notificationType) {
        case NotificationType::Block:
            meta.text = utils::localize.get("app_phonebook_options_block_notification");
            dialogText = utils::localize.get("app_phonebook_options_block_notification");
            break;
        case NotificationType::Delete:
            meta.text = utils::localize.get("app_phonebook_options_delete_notification");
            dialogText = utils::localize.get("app_phonebook_options_delete_notification");
            break;
        case NotificationType::Unblock:
            meta.text = utils::localize.get("app_phonebook_options_unblock_notification");
            dialogText = utils::localize.get("app_phonebook_options_unblock_notification");
            break;
        }
        meta.action = [=]() -> bool {
            this->application->switchWindow(gui::name::window::main_window);
            return true;
        };
        meta.title = contact->getFormattedName(ContactRecord::NameFormatType::Title);
        application->switchWindow(gui::window::name::dialog_confirm,
                                  std::make_unique<gui::DialogMetadataMessage>(std::move(meta)));

        auto metaData = std::make_unique<gui::DialogMetadataMessage>(
            gui::DialogMetadata{contact->getFormattedName(ContactRecord::NameFormatType::Title),
                                "info_big_circle_W_G",
                                dialogText,
                                "",
                                [=]() -> bool {
                                    this->application->switchWindow(gui::name::window::main_window);
                                    return true;
                                }});

        application->switchWindow(gui::window::name::dialog_confirm, std::move(metaData));
        return true;
    }
} // namespace gui

M module-apps/application-phonebook/windows/PhonebookNewContact.cpp => module-apps/application-phonebook/windows/PhonebookNewContact.cpp +25 -29
@@ 204,7 204,6 @@ namespace gui

    void PhonebookNewContact::showDialogDuplicatedNumber(const utils::PhoneNumber::View &duplicatedNumber)
    {
        std::unique_ptr<DialogMetadata> meta = std::make_unique<DialogMetadata>();
        auto matchedContact   = DBServiceAPI::MatchContactByPhoneNumber(application, duplicatedNumber);
        auto oldContactRecord = (matchedContact != nullptr) ? *matchedContact : ContactRecord{};



@@ 212,21 211,19 @@ namespace gui
            contact->ID = oldContactRecord.ID;
        }

        meta->action = [=]() -> bool {
            if (!DBServiceAPI::ContactUpdate(application, *contact)) {
                LOG_ERROR("Contact id=%" PRIu32 " update failed", contact->ID);
                return false;
            }
            application->switchWindow(gui::name::window::main_window);
            return true;
        };
        std::string duplicatedNumberPhrase = utils::localize.get("app_phonebook_duplicate_numbers");
        phonebookUtils::fillContactData(duplicatedNumberPhrase, oldContactRecord);
        meta->text  = duplicatedNumberPhrase;
        meta->title = duplicatedNumber.getFormatted();
        meta->icon  = "info_big_circle_W_G";
        application->switchWindow(gui::window::name::dialog_yes_no,
                                  std::make_unique<gui::DialogMetadataMessage>(std::move(*meta)));

        auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
            duplicatedNumber.getFormatted(), "info_big_circle_W_G", duplicatedNumberPhrase, "", [=]() -> bool {
                if (!DBServiceAPI::ContactUpdate(application, *contact)) {
                    LOG_ERROR("Contact id=%" PRIu32 " update failed", contact->ID);
                    return false;
                }
                application->switchWindow(gui::name::window::main_window);
                return true;
            }});
        application->switchWindow(gui::window::name::dialog_yes_no, std::move(metaData));
    }

    void PhonebookNewContact::showDialogDuplicatedSpeedDialNumber()


@@ 238,26 235,25 @@ namespace gui
            contact->ID = oldContactRecord.ID;
        }

        std::unique_ptr<DialogMetadata> metadata = std::make_unique<DialogMetadata>();
        metadata->action                         = [=]() -> bool {
            if (!DBServiceAPI::ContactUpdate(application, *contact)) {
                LOG_ERROR("Contact id=%" PRIu32 " update failed", contact->ID);
                return false;
            }
            application->switchWindow(gui::name::window::main_window);
            return true;
        };
        std::string duplicatedSpeedDialPhrase = utils::localize.get("app_phonebook_duplicate_numbers");
        phonebookUtils::fillContactData(duplicatedSpeedDialPhrase, oldContactRecord);
        std::string duplicatedSpeedDialTitle = utils::localize.get("app_phonebook_duplicate_speed_dial_title");
        phonebookUtils::fillContactData(duplicatedSpeedDialTitle, oldContactRecord);
        metadata->text     = duplicatedSpeedDialPhrase;
        metadata->title    = duplicatedSpeedDialTitle;
        metadata->icon     = "phonebook_empty_grey_circle_speed_dial";
        metadata->iconText = contact->speeddial;

        application->switchWindow(gui::window::name::dialog_yes_no_icon_txt,
                                  std::make_unique<gui::DialogMetadataMessage>(std::move(*metadata)));
        auto metaData = std::make_unique<gui::DialogMetadataMessage>(
            gui::DialogMetadata{duplicatedSpeedDialTitle,
                                "phonebook_empty_grey_circle_speed_dial",
                                duplicatedSpeedDialPhrase,
                                contact->speeddial,
                                [=]() -> bool {
                                    if (!DBServiceAPI::ContactUpdate(application, *contact)) {
                                        LOG_ERROR("Contact id=%" PRIu32 " update failed", contact->ID);
                                        return false;
                                    }
                                    application->switchWindow(gui::name::window::main_window);
                                    return true;
                                }});
        application->switchWindow(gui::window::name::dialog_yes_no_icon_txt, std::move(metaData));
    }

} // namespace gui

M module-apps/application-settings-new/windows/ChangePasscodeWindow.cpp => module-apps/application-settings-new/windows/ChangePasscodeWindow.cpp +24 -20
@@ 102,17 102,19 @@ namespace gui
            lockState = lockHandler.checkPasscode(app->getLockPassHash());
            if (ChangePasscodeAction::OnlyCheckCurrentPasscode == changePasscodeAction &&
                lockState == PinLock::LockState::NewPasscodeRequired) {
                DialogMetadata meta;
                meta.icon   = "big_circle_placeholder";
                meta.text   = utils::localize.get("app_settings_security_passcode_disabled");
                meta.title  = utils::localize.get("app_settings_security_change_passcode");
                meta.action = [this]() {
                    application->switchWindow(gui::window::name::security);
                    return true;
                };
                application->setLockScreenPasscodeOn(false);
                application->switchWindow(gui::window::name::dialog_confirm,
                                          std::make_unique<gui::DialogMetadataMessage>(meta));

                auto metaData = std::make_unique<gui::DialogMetadataMessage>(
                    gui::DialogMetadata{utils::localize.get("app_settings_security_change_passcode"),
                                        "big_circle_placeholder",
                                        utils::localize.get("app_settings_security_passcode_disabled"),
                                        "",
                                        [this]() {
                                            application->switchWindow(gui::window::name::security);
                                            return true;
                                        }});
                application->switchWindow(
                    gui::window::name::dialog_confirm, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
                return;
            }
            break;


@@ 162,17 164,19 @@ namespace gui
            break;
        }
        case PinLock::LockState::Unlocked: {
            DialogMetadata meta;
            meta.icon   = "big_circle_placeholder";
            meta.text   = utils::localize.get("app_settings_security_passcode_changed_successfully");
            meta.title  = utils::localize.get("app_settings_security_change_passcode");
            meta.action = [this]() {
                application->switchWindow(gui::window::name::security);
                return true;
            };
            application->setLockScreenPasscodeOn(true);
            application->switchWindow(gui::window::name::dialog_confirm,
                                      std::make_unique<gui::DialogMetadataMessage>(meta));

            auto metaData = std::make_unique<gui::DialogMetadataMessage>(
                gui::DialogMetadata{utils::localize.get("app_settings_security_change_passcode"),
                                    "big_circle_placeholder",
                                    utils::localize.get("app_settings_security_passcode_changed_successfully"),
                                    "",
                                    [this]() {
                                        application->switchWindow(gui::window::name::security);
                                        return true;
                                    }});
            application->switchWindow(
                gui::window::name::dialog_confirm, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
            break;
        }
        default: {

M module-apps/application-settings-new/windows/QuotesOptionsWindow.cpp => module-apps/application-settings-new/windows/QuotesOptionsWindow.cpp +13 -13
@@ 46,19 46,19 @@ namespace gui
        optionsList.emplace_back(std::make_unique<gui::option::OptionSettings>(
            utils::translateI18("app_settings_display_wallpaper_quotes_delete"),
            [=](gui::Item &item) {
                gui::DialogMetadata meta;
                meta.text   = utils::localize.get("app_settings_display_wallpaper_quotes_delete_confirmation");
                meta.title  = quote.quote;
                meta.icon   = "phonebook_contact_delete_trashcan";
                meta.action = [this]() {
                    auto backToQuotesMainWindow = 2;
                    quotesModel->remove(quote);
                    application->returnToPreviousWindow(backToQuotesMainWindow);
                    return true;
                };

                application->switchWindow(gui::window::name::quotes_dialog_yes_no,
                                          std::make_unique<gui::DialogMetadataMessage>(meta));
                auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
                    quote.quote,
                    "phonebook_contact_delete_trashcan",
                    utils::localize.get("app_settings_display_wallpaper_quotes_delete_confirmation"),
                    "",
                    [this]() {
                        auto backToQuotesMainWindow = 2;
                        quotesModel->remove(quote);
                        application->returnToPreviousWindow(backToQuotesMainWindow);
                        return true;
                    }});
                application->switchWindow(
                    gui::window::name::quotes_dialog_yes_no, gui::ShowMode::GUI_SHOW_INIT, std::move(metaData));
                return true;
            },
            [=](gui::Item &item) {

M module-apps/windows/Dialog.cpp => module-apps/windows/Dialog.cpp +62 -89
@@ 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 "Dialog.hpp"


@@ 9,69 9,31 @@

using namespace gui;

namespace style
{
    namespace image
    {
        constexpr uint32_t x = 176;
        constexpr uint32_t y = 132;
    } // namespace image
    namespace text
    {
        constexpr uint32_t x = 40;
        constexpr uint32_t y = 290;
        constexpr uint32_t w = 400;
        constexpr uint32_t h = 132;
    } // namespace text
    namespace no
    {
        constexpr uint32_t x = 75;
        constexpr uint32_t y = 415;
        constexpr uint32_t w = 150;
        constexpr uint32_t h = 75;
    } // namespace no
    namespace yes
    {
        constexpr uint32_t x = 255;
        constexpr uint32_t y = 415;
        constexpr uint32_t w = 150;
        constexpr uint32_t h = 75;
    } // namespace yes
    namespace icontext
    {
        constexpr uint32_t x = image::x;
        constexpr uint32_t y = image::y + 40;
        constexpr uint32_t w = 130;
        constexpr uint32_t h = 100;
    } // namespace icontext

} // namespace style

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

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

    setTitle("");

    icon = new Image(this, style::image::x, style::image::y, "");
    icon = new Icon(this,
                    style::window::default_left_margin,
                    style::header::height,
                    style::window::default_body_width,
                    style::window::default_body_height,
                    "",
                    "");

    text = new Text(this, style::text::x, style::text::y, style::text::w, style::text::h);
    text->setRichText("lol");
    text->setTextType(TextType::MultiLine);
    text->setEditMode(EditMode::Browse);
    text->setEdges(RectangleEdge::None);
    text->setFont(style::window::font::medium);
    text->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
    icon->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Top));
    icon->image->setMargins(Margins(0, icon::image_top_margin, 0, icon::image_bottom_margin));
}

void Dialog::onBeforeShow(ShowMode mode, SwitchData *data)
{
    if (auto metadata = dynamic_cast<DialogMetadataMessage *>(data); metadata != nullptr) {
        setTitle(metadata->get().title);
        text->setRichText(metadata->get().text);
        icon->set(metadata->get().icon);
        icon->text->setRichText(metadata->get().text);
        icon->image->set(metadata->get().icon);
        icon->resizeItems();
    }
}



@@ 100,43 62,44 @@ void DialogConfirm::onBeforeShow(ShowMode mode, SwitchData *data)

DialogYesNo::DialogYesNo(app::Application *app, const std::string &name) : Dialog(app, name)
{
    no = new Label(
        this, style::no::x, style::no::y, style::no::w, style::no::h, utils::localize.get(style::strings::common::no));
    no->setPenWidth(0);
    no->setPenFocusWidth(3);
    no->setFilled(false);
    no->setBorderColor(ColorFullBlack);
    no->setEdges(RectangleEdge::Bottom | RectangleEdge::Top);
    no->setFont(style::window::font::big);
    no->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
    no->activatedCallback = [=](Item &) -> bool {
        application->returnToPreviousWindow();
        return true;
    };
    icon->text->setMinimumSize(style::window::default_body_width, dialog::style::option::iconTextH);
    icon->text->setMaximumSize(style::window::default_body_width, dialog::style::option::iconTextH);
    icon->text->setMargins(Margins(0, 0, 0, icon::image_bottom_margin));
    icon->text->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top));

    hBox = new HBox(icon, 0, 0, 0, 0);
    hBox->setMinimumSize(style::window::default_body_width, dialog::style::option::h);
    hBox->setAlignment(Alignment(gui::Alignment::Horizontal::Center));
    hBox->setEdges(RectangleEdge::None);

    yes = new Label(this,
                    style::yes::x,
                    style::yes::y,
                    style::yes::w,
                    style::yes::h,
                    utils::localize.get(style::strings::common::yes));
    yes->setPenWidth(0);
    yes->setPenFocusWidth(3);
    yes->setFilled(false);
    yes->setBorderColor(ColorFullBlack);
    yes->setEdges(RectangleEdge::Bottom | RectangleEdge::Top);
    yes->setFont(style::window::font::big);
    yes->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
    yes->activatedCallback = [=](Item &) -> bool { return false; };

    no->setNavigationItem(NavigationDirection::RIGHT, yes);
    yes->setNavigationItem(NavigationDirection::LEFT, no);
    no->setNavigationItem(NavigationDirection::LEFT, yes);
    yes->setNavigationItem(NavigationDirection::RIGHT, no);
    no  = createYesNoOption(hBox, gui::dialog::Option::NO);
    yes = createYesNoOption(hBox, gui::dialog::Option::YES);

    bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get("common_confirm"));
}

    setFocusItem(no);
Label *DialogYesNo::createYesNoOption(Item *parent, const gui::dialog::Option &optionName)
{
    Label *option = new Label(parent, 0, 0, 0, 0, "");
    if (optionName == gui::dialog::Option::YES) {
        option->setText(utils::localize.get(style::strings::common::yes));
        option->activatedCallback = [=](Item &) -> bool { return false; };
    }
    else if (optionName == gui::dialog::Option::NO) {
        option->setText(utils::localize.get(style::strings::common::no));
        option->setMargins(Margins(0, 0, dialog::style::option::margin, 0));
        option->activatedCallback = [=](Item &) -> bool {
            application->returnToPreviousWindow();
            return true;
        };
    }
    option->setMinimumSize(dialog::style::option::w, dialog::style::option::h);
    option->setPenWidth(0);
    option->setPenFocusWidth(3);
    option->setEdges(RectangleEdge::Bottom | RectangleEdge::Top);
    option->setFont(style::window::font::big);
    option->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
    return option;
}

void DialogYesNo::onBeforeShow(ShowMode mode, SwitchData *data)


@@ 145,20 108,30 @@ void DialogYesNo::onBeforeShow(ShowMode mode, SwitchData *data)
        Dialog::onBeforeShow(mode, metadata);
        auto foo               = metadata->get().action;
        yes->activatedCallback = [=](Item &) -> bool { return foo(); };
        hBox->resizeItems();

        no->setNavigationItem(NavigationDirection::RIGHT, yes);
        yes->setNavigationItem(NavigationDirection::LEFT, no);
        no->setNavigationItem(NavigationDirection::LEFT, yes);
        yes->setNavigationItem(NavigationDirection::RIGHT, no);

        setFocusItem(no);
    }
}

DialogYesNoIconTxt::DialogYesNoIconTxt(app::Application *app, const std::string &name) : DialogYesNo(app, name)
{
    iconText = new Text(this, style::icontext::x, style::icontext::y, style::icontext::w, style::icontext::h);
    iconText = new Label(this,
                         style::window::default_left_margin,
                         style::header::height,
                         style::window::default_body_width,
                         dialog::style::iconTextLabel::h,
                         "");

    iconText->setText("");
    iconText->setTextType(TextType::SingleLine);
    iconText->setEditMode(EditMode::Browse);
    iconText->setEdges(RectangleEdge::None);
    iconText->setFont(style::window::font::largelight);
    iconText->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::None));
    setFocusItem(no);
    iconText->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
}

void DialogYesNoIconTxt::onBeforeShow(ShowMode mode, SwitchData *data)

M module-apps/windows/Dialog.hpp => module-apps/windows/Dialog.hpp +35 -6
@@ 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


@@ 7,6 7,7 @@
#include <Text.hpp>
#include <functional>
#include <DialogMetadata.hpp>
#include <module-gui/gui/widgets/Icon.hpp>

namespace gui::window::name
{


@@ 16,7 17,31 @@ namespace gui::window::name

namespace gui
{
    class Image;
    namespace dialog
    {
        enum Option
        {
            YES,
            NO
        };

        namespace style
        {
            namespace option
            {
                inline constexpr auto w         = 150;
                inline constexpr auto h         = 75;
                inline constexpr auto margin    = 30;
                inline constexpr auto iconTextH = 99;
            } // namespace option

            namespace iconTextLabel
            {
                inline constexpr auto h = 188;
            } // namespace iconTextLabel

        } // namespace style
    }     // namespace dialog

    /// @brief base Dialog class
    ///


@@ 24,8 49,7 @@ namespace gui
    class Dialog : public AppWindow
    {
      protected:
        Text *text  = nullptr;
        Image *icon = nullptr;
        Icon *icon = nullptr;

      public:
        Dialog(app::Application *app, const std::string &name);


@@ 51,12 75,17 @@ namespace gui
    class DialogYesNo : public Dialog
    {
      protected:
        Label *yes = nullptr, *no = nullptr;
        Label *yes = nullptr;
        Label *no  = nullptr;
        HBox *hBox = nullptr;

      public:
        DialogYesNo(app::Application *app, const std::string &name);

        void onBeforeShow(ShowMode mode, SwitchData *data) override;

      private:
        Label *createYesNoOption(Item *parent, const gui::dialog::Option &optionName);
    };

    /// @brief Yes/No Icon Text  Dialog class


@@ 65,7 94,7 @@ namespace gui
    class DialogYesNoIconTxt : public DialogYesNo
    {
      protected:
        Text *iconText = nullptr;
        Label *iconText = nullptr;

      public:
        DialogYesNoIconTxt(app::Application *app, const std::string &name);

M module-apps/windows/NoEvents.cpp => module-apps/windows/NoEvents.cpp +0 -3
@@ 42,9 42,6 @@ NoEvents::NoEvents(app::Application *app, const std::string &name) : gui::Dialog
{
    arrow = new gui::Image(this, style::arrow::x, style::arrow::y, 0, 0, "arrow_left");
    cross = new gui::Image(this, style::cross::x, style::cross::y, 0, 0, "cross");

    icon->setPosition(style::icon::x, style::icon::y);
    text->setPosition(style::text::x, style::text::y);
}

void NoEvents::onBeforeShow(ShowMode mode, SwitchData *data)

M module-gui/gui/widgets/Icon.cpp => module-gui/gui/widgets/Icon.cpp +4 -10
@@ 9,11 9,6 @@

using namespace gui;

namespace style::icon
{
    inline constexpr gui::Length image_bottom_margin = 30;
} // namespace style::icon

Icon::Icon(Item *parent,
           const uint32_t &x,
           const uint32_t &y,


@@ 24,18 19,17 @@ Icon::Icon(Item *parent,
    : 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));

    auto image = new Image(this, imageName);
    image->setMargins(Margins(0, 0, 0, style::icon::image_bottom_margin));
    image = new Image(this, imageName);
    image->setMargins(Margins(0, 0, 0, icon::image_bottom_margin));

    auto text = new Text(this, 0, 0, 0, 0);
    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->setFont(style::window::font::medium);
    text->setRichText(str);
}

M module-gui/gui/widgets/Icon.hpp => module-gui/gui/widgets/Icon.hpp +9 -0
@@ 9,6 9,12 @@

namespace gui
{
    namespace icon
    {
        inline constexpr auto image_top_margin    = 30;
        inline constexpr auto image_bottom_margin = 33;
    } // namespace icon

    class Icon : public VBox
    {
      public:


@@ 21,6 27,9 @@ namespace gui
             const UTF8 &text);

        ~Icon() override = default;

        Text *text   = nullptr;
        Image *image = nullptr;
    };

}; // namespace gui

M module-gui/gui/widgets/Style.hpp => module-gui/gui/widgets/Style.hpp +1 -0
@@ 147,6 147,7 @@ namespace style
            inline constexpr auto use            = "common_use";
            inline constexpr auto ok             = "common_ok";
            inline constexpr auto back           = "common_back";
            inline constexpr auto skip           = "common_skip";
            inline constexpr auto set            = "common_set";
            inline constexpr auto yes            = "common_yes";
            inline constexpr auto no             = "common_no";

M module-services/service-desktop/endpoints/calendarEvents/CalendarEventsHelper.cpp => module-services/service-desktop/endpoints/calendarEvents/CalendarEventsHelper.cpp +4 -4
@@ 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 "EventsRecord.hpp"


@@ 356,9 356,9 @@ auto CalendarEventsHelper::ICalEventFromJson(json11::Json eventObj) const -> ICa

auto CalendarEventsHelper::createDBEntry(Context &context) -> sys::ReturnCodes
{
    auto eventsJsonObj   = context.getBody();
    auto eventsJsonArray = eventsJsonObj[json::calendar::events].array_items();
    bool ret             = true;
    const auto eventsJsonObj   = context.getBody();
    const auto eventsJsonArray = eventsJsonObj[json::calendar::events].array_items();
    bool ret                   = true;
    for (auto event : eventsJsonArray) {

        auto icalEvent = ICalEventFromJson(event);