~aleteoryx/muditaos

5ac386b43170f717f09ef489495a4dde10d38cc4 — Mateusz Piesta 4 years ago 0247d37
[BH-794] Add temperature display

Added displaying temperature and its unit type to 
the home screen.
Integrated GUI with data models.
Moved Bell specific apps to products dir.
64 files changed, 1550 insertions(+), 71 deletions(-)

M module-apps/CMakeLists.txt
D module-apps/application-bell-main/models/TemperatureModel.cpp
M module-apps/application-bell-settings/models/TemperatureUnitModel.cpp
M module-apps/application-bell-settings/models/TemperatureUnitModel.hpp
M module-apps/application-bell-settings/models/TimeUnitsModel.cpp
M module-apps/application-bell-settings/models/TimeUnitsModel.hpp
M module-apps/application-bell-settings/presenter/TimeUnitsPresenter.hpp
M module-apps/application-bell-settings/widgets/TemperatureUnitListItem.cpp
R {module-apps/apps-common => module-utils}/Temperature.hpp
M products/BellHybrid/CMakeLists.txt
A products/BellHybrid/apps/CMakeLists.txt
A products/BellHybrid/apps/application-bell-alarm/ApplicationBellAlarm.cpp
A products/BellHybrid/apps/application-bell-alarm/CMakeLists.txt
A products/BellHybrid/apps/application-bell-alarm/data/BellAlarmStyle.hpp
A products/BellHybrid/apps/application-bell-alarm/include/application-bell-alarm/ApplicationBellAlarm.hpp
A products/BellHybrid/apps/application-bell-alarm/presenter/BellAlarmWindowPresenter.cpp
A products/BellHybrid/apps/application-bell-alarm/presenter/BellAlarmWindowPresenter.hpp
A products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmWindow.cpp
A products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmWindow.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/ApplicationBellMain.cpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/CMakeLists.txt
R {module-apps => products/BellHybrid/apps}/application-bell-main/data/BellMainStyle.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/include/application-bell-main/ApplicationBellMain.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/models/AlarmModel.cpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/models/AlarmModel.hpp
A products/BellHybrid/apps/application-bell-main/models/TemperatureModel.cpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/models/TemperatureModel.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/models/TimeModel.cpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/models/TimeModel.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/presenters/HomeScreenPresenter.cpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/presenters/HomeScreenPresenter.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/presenters/KeyMap.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/presenters/StateController.cpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/presenters/StateController.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/windows/BellHomeScreenWindow.cpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/windows/BellHomeScreenWindow.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/windows/BellMainMenuWindow.cpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/windows/BellMainMenuWindow.hpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/windows/BellMainSetHour.cpp
R {module-apps => products/BellHybrid/apps}/application-bell-main/windows/BellMainSetHour.hpp
A products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp
A products/BellHybrid/apps/application-bell-settings/CMakeLists.txt
A products/BellHybrid/apps/application-bell-settings/data/BellSettingsStyle.hpp
A products/BellHybrid/apps/application-bell-settings/include/application-bell-settings/ApplicationBellSettings.hpp
A products/BellHybrid/apps/application-bell-settings/models/TemperatureUnitModel.cpp
A products/BellHybrid/apps/application-bell-settings/models/TemperatureUnitModel.hpp
A products/BellHybrid/apps/application-bell-settings/models/TimeUnitsModel.cpp
A products/BellHybrid/apps/application-bell-settings/models/TimeUnitsModel.hpp
A products/BellHybrid/apps/application-bell-settings/presenter/TimeUnitsPresenter.cpp
A products/BellHybrid/apps/application-bell-settings/presenter/TimeUnitsPresenter.hpp
A products/BellHybrid/apps/application-bell-settings/widgets/TemperatureUnitListItem.cpp
A products/BellHybrid/apps/application-bell-settings/widgets/TemperatureUnitListItem.hpp
A products/BellHybrid/apps/application-bell-settings/widgets/TimeFormatSetListItem.cpp
A products/BellHybrid/apps/application-bell-settings/widgets/TimeFormatSetListItem.hpp
A products/BellHybrid/apps/application-bell-settings/widgets/TimeSetListItem.cpp
A products/BellHybrid/apps/application-bell-settings/widgets/TimeSetListItem.hpp
A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsAdvancedWindow.cpp
A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsAdvancedWindow.hpp
A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsFinishedWindow.cpp
A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsFinishedWindow.hpp
A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsTimeUnitsWindow.cpp
A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsTimeUnitsWindow.hpp
A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsWindow.cpp
A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsWindow.hpp
M module-apps/CMakeLists.txt => module-apps/CMakeLists.txt +0 -3
@@ 15,9 15,6 @@ option(ENABLE_APP_ANTENNA "Enable application antenna" OFF)
set(APPLICATIONS
    alarm-clock
    antenna
    bell-alarm
    bell-main
    bell-settings
    calculator
    calendar
    call

D module-apps/application-bell-main/models/TemperatureModel.cpp => module-apps/application-bell-main/models/TemperatureModel.cpp +0 -16
@@ 1,16 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 "TemperatureModel.hpp"

namespace app::home_screen
{

    home_screen::TemperatureModel::TemperatureModel(app::Application *)
    {}
    gui::temperature::Temperature TemperatureModel::getTemperature() const
    {
        // This is just a placeholder for missing functionality
        return {gui::temperature::Temperature::Unit::Celsius, 25};
    }
} // namespace app::home_screen

M module-apps/application-bell-settings/models/TemperatureUnitModel.cpp => module-apps/application-bell-settings/models/TemperatureUnitModel.cpp +9 -5
@@ 19,16 19,20 @@ namespace app::bell_settings
        settings.init(service::ServiceProxy{app->weak_from_this()});
    }

    gui::temperature::Temperature::Unit TemperatureUnitModel::get() const
    utils::temperature::Temperature::Unit TemperatureUnitModel::get() const
    {
        const auto value = settings.getValue(temperatureUnit, settings::SettingsScope::Global);
        return value == gui::temperature::celsiusSymbol ? gui::temperature::Temperature::Unit::Celsius
                                                        : gui::temperature::Temperature::Unit::Fahrenheit;
        if (auto unit = utils::temperature::strToUnit(value); unit) {
            return *unit;
        }
        else {
            return utils::temperature::Temperature::Unit::Celsius;
        }
    }

    void TemperatureUnitModel::set(gui::temperature::Temperature::Unit unit)
    void TemperatureUnitModel::set(utils::temperature::Temperature::Unit unit)
    {
        settings.setValue(gui::temperature::toStr(unit), temperatureUnit, settings::SettingsScope::Global);
        settings.setValue(temperatureUnit, utils::temperature::unitToStr(unit), settings::SettingsScope::Global);
    }

} // namespace app::bell_settings

M module-apps/application-bell-settings/models/TemperatureUnitModel.hpp => module-apps/application-bell-settings/models/TemperatureUnitModel.hpp +5 -5
@@ 3,7 3,7 @@

#pragma once

#include <apps-common/Temperature.hpp>
#include <module-utils/Temperature.hpp>
#include <service-db/Settings.hpp>

#include <memory>


@@ 20,9 20,9 @@ namespace app::bell_settings
      public:
        virtual ~AbstractTemperatureUnitModel() = default;

        virtual gui::temperature::Temperature::Unit get() const = 0;
        virtual utils::temperature::Temperature::Unit get() const = 0;

        virtual void set(gui::temperature::Temperature::Unit unit) = 0;
        virtual void set(utils::temperature::Temperature::Unit unit) = 0;
    };

    class TemperatureUnitModel : public AbstractTemperatureUnitModel


@@ 30,9 30,9 @@ namespace app::bell_settings
      public:
        explicit TemperatureUnitModel(Application *app);

        gui::temperature::Temperature::Unit get() const override;
        utils::temperature::Temperature::Unit get() const override;

        void set(gui::temperature::Temperature::Unit unit) override;
        void set(utils::temperature::Temperature::Unit unit) override;

      private:
        mutable settings::Settings settings;

M module-apps/application-bell-settings/models/TimeUnitsModel.cpp => module-apps/application-bell-settings/models/TimeUnitsModel.cpp +2 -2
@@ 119,8 119,8 @@ namespace app::bell_settings
        application->bus.sendUnicast(std::move(msg), service::name::service_time);
    }

    auto TimeUnitsModel::getTemperatureUnit() -> gui::temperature::Temperature::Unit
    auto TimeUnitsModel::getTemperatureUnit() -> utils::temperature::Temperature::Unit
    {
        return *gui::temperature::strToUnit(temperatureUnitListItem->getUnitAsStr());
        return *utils::temperature::strToUnit(temperatureUnitListItem->getUnitAsStr());
    }
} // namespace app::bell_settings

M module-apps/application-bell-settings/models/TimeUnitsModel.hpp => module-apps/application-bell-settings/models/TimeUnitsModel.hpp +2 -2
@@ 5,7 5,7 @@

#include <apps-common/Application.hpp>
#include <apps-common/InternalModel.hpp>
#include <apps-common/Temperature.hpp>
#include <module-utils/Temperature.hpp>
#include <time/time_locale.hpp>

namespace gui


@@ 42,7 42,7 @@ namespace app::bell_settings

        [[nodiscard]] auto getMinimalItemSpaceRequired() const -> unsigned int override;

        [[nodiscard]] auto getTemperatureUnit() -> gui::temperature::Temperature::Unit;
        [[nodiscard]] auto getTemperatureUnit() -> utils::temperature::Temperature::Unit;

      private:
        app::Application *application{};

M module-apps/application-bell-settings/presenter/TimeUnitsPresenter.hpp => module-apps/application-bell-settings/presenter/TimeUnitsPresenter.hpp +0 -1
@@ 6,7 6,6 @@
#include "TimeUnitsModel.hpp"

#include <apps-common/BasePresenter.hpp>
#include <apps-common/Temperature.hpp>

namespace app::bell_settings
{

M module-apps/application-bell-settings/widgets/TemperatureUnitListItem.cpp => module-apps/application-bell-settings/widgets/TemperatureUnitListItem.cpp +4 -3
@@ 4,8 4,8 @@
#include "BellSettingsStyle.hpp"
#include "TemperatureUnitListItem.hpp"

#include <apps-common/Temperature.hpp>
#include <gui/widgets/TextSpinner.hpp>
#include <module-utils/Temperature.hpp>

namespace gui
{


@@ 16,8 16,9 @@ namespace gui
        setEdges(RectangleEdge::None);
        setFocusItem(body);

        temperatureUnit = new TextSpinner({temperature::celsiusDegreeSymbol, temperature::fahrenheitDegreeSymbol},
                                          Boundaries::Continuous);
        temperatureUnit =
            new TextSpinner({utils::temperature::celsiusDegreeSymbol, utils::temperature::fahrenheitDegreeSymbol},
                            Boundaries::Continuous);
        temperatureUnit->setMaximumSize(style::bell_base_layout::w, style::bell_base_layout::h);
        temperatureUnit->setFont(bell_settings_style::time_fmt_set_list_item::font);
        temperatureUnit->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));

R module-apps/apps-common/Temperature.hpp => module-utils/Temperature.hpp +29 -9
@@ 4,10 4,11 @@
#pragma once

#include <cstdint>
#include <iomanip>
#include <optional>
#include <string>

namespace gui::temperature
namespace utils::temperature
{
    inline constexpr auto celsiusSymbol          = "C";
    inline constexpr auto fahrenheitSymbol       = "F";


@@ 17,29 18,48 @@ namespace gui::temperature

    struct Temperature
    {
        using Value = float;
        enum class Unit
        {
            Celsius,
            Fahrenheit
        };
        Unit unit;
        std::int32_t value;
        Value value;
    };

    inline std::string toStr(Temperature::Unit unit)
    inline float celsiusToFahrenheit(float value)
    {
        return (value * 1.8) + 32;
    }

    inline std::string unitToStr(Temperature::Unit unit)
    {
        return unit == Temperature::Unit::Celsius ? celsiusSymbol : fahrenheitSymbol;
    }

    inline std::optional<Temperature::Unit> strToUnit(std::string_view str)
    {
        if ((str == gui::temperature::celsiusDegreeSymbol) || (str == celsiusSymbol)) {
            return gui::temperature::Temperature::Unit::Celsius;
        if ((str == celsiusDegreeSymbol) || (str == celsiusSymbol)) {
            return Temperature::Unit::Celsius;
        }
        else if ((str == gui::temperature::fahrenheitDegreeSymbol) || (str == fahrenheitSymbol)) {
            return gui::temperature::Temperature::Unit::Fahrenheit;
        else if ((str == fahrenheitDegreeSymbol) || (str == fahrenheitSymbol)) {
            return Temperature::Unit::Fahrenheit;
        }

        return {};
    }
} // namespace gui::temperature

    inline std::string tempToStrFloat(Temperature temperature, const int precision = 1)
    {
        std::ostringstream stream;
        stream << std::fixed << std::setprecision(precision);
        stream << temperature.value << degree << utils::temperature::unitToStr(temperature.unit);
        return stream.str();
    }

    inline std::string tempToStrDec(Temperature temperature)
    {
        return std::to_string(static_cast<std::int32_t>(temperature.value)) + degree +
               utils::temperature::unitToStr(temperature.unit);
    }
} // namespace utils::temperature

M products/BellHybrid/CMakeLists.txt => products/BellHybrid/CMakeLists.txt +1 -0
@@ 89,3 89,4 @@ add_update_package(BellHybrid)
add_subdirectory(services)
add_subdirectory(alarms)
add_subdirectory(sys)
add_subdirectory(apps)

A products/BellHybrid/apps/CMakeLists.txt => products/BellHybrid/apps/CMakeLists.txt +3 -0
@@ 0,0 1,3 @@
add_subdirectory(application-bell-main)
add_subdirectory(application-bell-alarm)
add_subdirectory(application-bell-settings)

A products/BellHybrid/apps/application-bell-alarm/ApplicationBellAlarm.cpp => products/BellHybrid/apps/application-bell-alarm/ApplicationBellAlarm.cpp +45 -0
@@ 0,0 1,45 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <application-bell-alarm/ApplicationBellAlarm.hpp>
#include <application-bell-alarm/presenter/BellAlarmWindowPresenter.hpp>
#include <application-bell-alarm/windows/BellAlarmWindow.hpp>

namespace app
{
    ApplicationBellAlarm::ApplicationBellAlarm(std::string name,
                                               std::string parent,
                                               sys::phone_modes::PhoneMode mode,
                                               StartInBackground startInBackground)
        : Application(std::move(name), std::move(parent), mode, startInBackground)
    {}

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

        createUserInterface();

        return sys::ReturnCodes::Success;
    }

    void ApplicationBellAlarm::createUserInterface()
    {
        windowsFactory.attach(gui::name::window::main_window, [](Application *app, const std::string &name) {
            auto presenter = std::make_unique<bell_alarm::BellAlarmWindowPresenter>();
            return std::make_unique<gui::BellAlarmWindow>(app, std::move(presenter));
        });
    }

    sys::MessagePointer ApplicationBellAlarm::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        auto retMsg = Application::DataReceivedHandler(msgl);
        if (dynamic_cast<sys::ResponseMessage *>(retMsg.get())->retCode == sys::ReturnCodes::Success) {
            return retMsg;
        }
        return std::make_shared<sys::ResponseMessage>();
    }
} // namespace app

A products/BellHybrid/apps/application-bell-alarm/CMakeLists.txt => products/BellHybrid/apps/application-bell-alarm/CMakeLists.txt +27 -0
@@ 0,0 1,27 @@
add_library(application-bell-alarm)

target_sources(application-bell-alarm
    PRIVATE
        ApplicationBellAlarm.cpp
        presenter/BellAlarmWindowPresenter.cpp
        windows/BellAlarmWindow.cpp
    PRIVATE
        data/BellAlarmStyle.hpp
        presenter/BellAlarmWindowPresenter.hpp
        windows/BellAlarmWindow.hpp
    PUBLIC
        include/application-bell-alarm/ApplicationBellAlarm.hpp
)

target_include_directories(application-bell-alarm
    PRIVATE
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)

target_link_libraries(application-bell-alarm
    PRIVATE
        apps-common
        module-gui
)

A products/BellHybrid/apps/application-bell-alarm/data/BellAlarmStyle.hpp => products/BellHybrid/apps/application-bell-alarm/data/BellAlarmStyle.hpp +15 -0
@@ 0,0 1,15 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

namespace gui
{
    namespace bell_alarm_style
    {
        namespace time_set_fmt_spinner
        {
            inline constexpr auto font = "gt_pressura_regular_90";
        } // namespace time_set_fmt_spinner
    }     // namespace bell_alarm_style
} // namespace gui

A products/BellHybrid/apps/application-bell-alarm/include/application-bell-alarm/ApplicationBellAlarm.hpp => products/BellHybrid/apps/application-bell-alarm/include/application-bell-alarm/ApplicationBellAlarm.hpp +46 -0
@@ 0,0 1,46 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <apps-common/Application.hpp>

namespace gui::window::name
{
    inline constexpr auto bellAlarm = "BellAlarm";
} // namespace gui::window::name

namespace app
{
    inline constexpr auto applicationBellAlarmName = "ApplicationBellAlarm";

    class ApplicationBellAlarm : public Application
    {
      public:
        explicit ApplicationBellAlarm(std::string name                    = applicationBellAlarmName,
                                      std::string parent                  = "",
                                      sys::phone_modes::PhoneMode mode    = sys::phone_modes::PhoneMode::Offline,
                                      StartInBackground startInBackground = {false});

        sys::ReturnCodes InitHandler() override;

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

        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;

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

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

A products/BellHybrid/apps/application-bell-alarm/presenter/BellAlarmWindowPresenter.cpp => products/BellHybrid/apps/application-bell-alarm/presenter/BellAlarmWindowPresenter.cpp +12 -0
@@ 0,0 1,12 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "BellAlarmWindowPresenter.hpp"

namespace app::bell_alarm
{
    auto BellAlarmWindowPresenter::saveData() -> void
    {
        // TODO
    }
} // namespace app::bell_alarm

A products/BellHybrid/apps/application-bell-alarm/presenter/BellAlarmWindowPresenter.hpp => products/BellHybrid/apps/application-bell-alarm/presenter/BellAlarmWindowPresenter.hpp +33 -0
@@ 0,0 1,33 @@

// 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 <apps-common/BasePresenter.hpp>

namespace app::bell_alarm
{
    class BellAlarmWindowContract
    {
      public:
        class View
        {
          public:
            virtual ~View() noexcept = default;
        };

        class Presenter : public BasePresenter<BellAlarmWindowContract::View>
        {
          public:
            virtual ~Presenter() noexcept   = default;
            virtual auto saveData() -> void = 0;
        };
    };

    class BellAlarmWindowPresenter : public BellAlarmWindowContract::Presenter
    {
      public:
        auto saveData() -> void override;
    };
} // namespace app::bell_alarm

A products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmWindow.cpp => products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmWindow.cpp +56 -0
@@ 0,0 1,56 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "BellAlarmWindow.hpp"

#include <apps-common/widgets/BellBaseLayout.hpp>
#include <apps-common/widgets/TimeSetFmtSpinner.hpp>
#include <data/BellAlarmStyle.hpp>
#include <module-gui/gui/input/InputEvent.hpp>

namespace gui
{
    BellAlarmWindow::BellAlarmWindow(
        app::Application *app,
        std::unique_ptr<app::bell_alarm::BellAlarmWindowContract::Presenter> &&windowPresenter,
        std::string name)
        : AppWindow(app, std::move(name)), presenter{std::move(windowPresenter)}
    {
        presenter->attach(this);
        buildInterface();
    }

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

        statusBar->setVisible(false);
        header->setTitleVisibility(true);
        bottomBar->setVisible(false);

        body              = new BellBaseLayout(this, 0, 0, style::window_width, style::window_height);
        timeSetFmtSpinner = new TimeSetFmtSpinner(body->centerBox);
        timeSetFmtSpinner->setFont(bell_alarm_style::time_set_fmt_spinner::font);

        setFocusItem(body);
    }

    bool BellAlarmWindow::onInput(const InputEvent &inputEvent)
    {
        if (body->onInput(inputEvent)) {
            return true;
        }
        if (inputEvent.isShortRelease(KeyCode::KEY_ENTER)) {
            presenter->saveData();
            application->returnToPreviousWindow();
            return true;
        }
        return AppWindow::onInput(inputEvent);
    }

    void BellAlarmWindow::rebuild()
    {
        erase();
        buildInterface();
    }
} /* namespace gui */

A products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmWindow.hpp => products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmWindow.hpp +31 -0
@@ 0,0 1,31 @@
// 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-bell-alarm/ApplicationBellAlarm.hpp>
#include <application-bell-alarm/presenter/BellAlarmWindowPresenter.hpp>

#include <apps-common/windows/AppWindow.hpp>

namespace gui
{
    class BellBaseLayout;
    class TimeSetFmtSpinner;
    class BellAlarmWindow : public AppWindow, public app::bell_alarm::BellAlarmWindowContract::View
    {
      public:
        explicit BellAlarmWindow(app::Application *app,
                                 std::unique_ptr<app::bell_alarm::BellAlarmWindowContract::Presenter> &&windowPresenter,
                                 std::string name = window::name::bellAlarm);

        void buildInterface() override;
        bool onInput(const InputEvent &inputEvent) override;
        void rebuild() override;

      private:
        BellBaseLayout *body{nullptr};
        TimeSetFmtSpinner *timeSetFmtSpinner{nullptr};
        std::unique_ptr<app::bell_alarm::BellAlarmWindowContract::Presenter> presenter;
    };
} /* namespace gui */

R module-apps/application-bell-main/ApplicationBellMain.cpp => products/BellHybrid/apps/application-bell-main/ApplicationBellMain.cpp +0 -0
R module-apps/application-bell-main/CMakeLists.txt => products/BellHybrid/apps/application-bell-main/CMakeLists.txt +1 -0
@@ 43,5 43,6 @@ target_link_libraries(application-bell-main
        module-gui
        service-gui
        time
        bell::evtmgr
        ${TARGET_LIBRARIES}
)

R module-apps/application-bell-main/data/BellMainStyle.hpp => products/BellHybrid/apps/application-bell-main/data/BellMainStyle.hpp +12 -6
@@ 9,20 9,26 @@ namespace bellMainStyle
{
    namespace mainWindow
    {
        namespace timeLabel
        namespace time
        {
            inline constexpr auto font = "gt_pressura_light_90";
        } // namespace timeLabel
            inline constexpr auto font   = style::window::font::huge;
            inline constexpr auto width  = 504U;
            inline constexpr auto height = 198U;
        } // namespace time

        namespace alarmSetSpinner
        {
            inline constexpr auto font = style::window::font::largelight;
            inline constexpr auto font   = style::window::font::largelight;
            inline constexpr auto width  = 380U;
            inline constexpr auto height = 102U;
        } // namespace alarmSetSpinner

        namespace temperatureLabel
        namespace bottomDescription
        {
            inline constexpr auto font   = style::window::font::largelight;
        } // namespace temperatureLabel
            inline constexpr auto width  = 380U;
            inline constexpr auto height = 102U;
        } // namespace bottomDescription
    }     // namespace mainWindow

    namespace mainMenuWindow

R module-apps/application-bell-main/include/application-bell-main/ApplicationBellMain.hpp => products/BellHybrid/apps/application-bell-main/include/application-bell-main/ApplicationBellMain.hpp +0 -0
R module-apps/application-bell-main/models/AlarmModel.cpp => products/BellHybrid/apps/application-bell-main/models/AlarmModel.cpp +0 -0
R module-apps/application-bell-main/models/AlarmModel.hpp => products/BellHybrid/apps/application-bell-main/models/AlarmModel.hpp +0 -0
A products/BellHybrid/apps/application-bell-main/models/TemperatureModel.cpp => products/BellHybrid/apps/application-bell-main/models/TemperatureModel.cpp +28 -0
@@ 0,0 1,28 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "TemperatureModel.hpp"

#include <apps-common/Application.hpp>
#include <service-db/Settings.hpp>
#include <service-db/agents/settings/SystemSettings.hpp>
#include <evtmgr/api/TemperatureApi.hpp>

namespace app::home_screen
{
    TemperatureModel::TemperatureModel(app::Application *app)
    {
        settings.init(service::ServiceProxy{app->weak_from_this()});
    }
    utils::temperature::Temperature TemperatureModel::getTemperature() const
    {
        const auto unitStr = settings.getValue(settings::Temperature::unit, settings::SettingsScope::Global);
        const auto unit    = *utils::temperature::strToUnit(unitStr);
        auto temperature   = evtmgr::api::getCurrentTemperature();

        if (unit == utils::temperature::Temperature::Unit::Fahrenheit) {
            temperature = utils::temperature::celsiusToFahrenheit(temperature);
        }
        return {unit, temperature};
    }
} // namespace app::home_screen

R module-apps/application-bell-main/models/TemperatureModel.hpp => products/BellHybrid/apps/application-bell-main/models/TemperatureModel.hpp +7 -5
@@ 3,7 3,8 @@

#pragma once

#include <apps-common/Temperature.hpp>
#include <module-utils/Temperature.hpp>
#include <service-db/Settings.hpp>

#include <cstdint>
#include <functional>


@@ 19,17 20,18 @@ namespace app::home_screen
    class AbstractTemperatureModel
    {
      public:
        std::function<void(gui::temperature::Temperature)> onTemperatureUpdate;

        virtual ~AbstractTemperatureModel() noexcept = default;

        virtual gui::temperature::Temperature getTemperature() const = 0;
        virtual utils::temperature::Temperature getTemperature() const = 0;
    };

    class TemperatureModel : public AbstractTemperatureModel
    {
      public:
        explicit TemperatureModel(app::Application *app);
        gui::temperature::Temperature getTemperature() const override;
        utils::temperature::Temperature getTemperature() const override;

      private:
        mutable settings::Settings settings;
    };
} // namespace app::home_screen

R module-apps/application-bell-main/models/TimeModel.cpp => products/BellHybrid/apps/application-bell-main/models/TimeModel.cpp +0 -0
R module-apps/application-bell-main/models/TimeModel.hpp => products/BellHybrid/apps/application-bell-main/models/TimeModel.hpp +0 -0
R module-apps/application-bell-main/presenters/HomeScreenPresenter.cpp => products/BellHybrid/apps/application-bell-main/presenters/HomeScreenPresenter.cpp +2 -0
@@ 31,6 31,7 @@ namespace app::home_screen
    void HomeScreenPresenter::handleUpdateTimeEvent()
    {
        getView()->setTime(timeModel->getCurrentTime());
        stateController->handleTimeUpdateEvent();
    }
    bool HomeScreenPresenter::handleInputEvent(const gui::InputEvent &inputEvent)
    {


@@ 61,6 62,7 @@ namespace app::home_screen
        getView()->setTimeFormat(timeModel->getTimeFormat());
        getView()->setTime(timeModel->getCurrentTime());
        getView()->setAlarmTimeFormat(timeModel->getTimeFormat());
        getView()->setTemperature(temperatureModel->getTemperature());
    }
    void HomeScreenPresenter::setDefaultAlarmTime()
    {

R module-apps/application-bell-main/presenters/HomeScreenPresenter.hpp => products/BellHybrid/apps/application-bell-main/presenters/HomeScreenPresenter.hpp +3 -3
@@ 6,9 6,9 @@
#include "models/TemperatureModel.hpp"

#include <apps-common/BasePresenter.hpp>
#include <apps-common/Temperature.hpp>
#include <gui/input/InputEvent.hpp>
#include <module-sys/Timers/TimerHandle.hpp>
#include <module-utils/Temperature.hpp>
#include <time/time_locale.hpp>
#include <utf8/UTF8.hpp>



@@ 50,8 50,8 @@ namespace app::home_screen
        virtual void setTimeFormat(utils::time::Locale::TimeFormat fmt) = 0;

        /// Bottom box related API(description or time)
        virtual void setTemperature(gui::temperature::Temperature newTemp) = 0;
        virtual void setBottomDescription(const UTF8 &desc)                = 0;
        virtual void setTemperature(utils::temperature::Temperature newTemp) = 0;
        virtual void setBottomDescription(const UTF8 &desc)                  = 0;

        /// Various
        virtual void switchToMenu() = 0;

R module-apps/application-bell-main/presenters/KeyMap.hpp => products/BellHybrid/apps/application-bell-main/presenters/KeyMap.hpp +0 -0
R module-apps/application-bell-main/presenters/StateController.cpp => products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp +14 -1
@@ 23,6 23,9 @@ namespace app::home_screen
            auto switchToMenu         = [](AbstractView &view) { view.switchToMenu(); };
            auto makeAlarmEditable    = [](AbstractView &view) { view.setAlarmEdit(true); };
            auto makeAlarmNonEditable = [](AbstractView &view) { view.setAlarmEdit(false); };
            auto updateTemperature    = [](AbstractView &view, AbstractTemperatureModel &temperatureModel) {
                view.setTemperature(temperatureModel.getTemperature());
            };

            auto calculateTimeDifference = [](AbstractView &view, AbstractTimeModel &timeModel) {
                const auto now       = timeModel.getCurrentTime();


@@ 51,9 54,10 @@ namespace app::home_screen
            {};
            struct AlarmInput
            {};

            struct Timer
            {};
            struct TimeUpdate
            {};
        } // namespace Events

        namespace Deactivated


@@ 130,9 134,11 @@ namespace app::home_screen
                return make_transition_table(*"Deactivated"_s + event<Events::LightPress>/ Helpers::switchToMenu = "Deactivated"_s,
                                             "Deactivated"_s + sml::on_entry<_> / Deactivated::entry,
                                             "Deactivated"_s + event<Events::RotateRightPress> / Helpers::makeAlarmEditable = "DeactivatedEdit"_s,
                                             "Deactivated"_s + event<Events::TimeUpdate> / Helpers::updateTemperature,

                                             "DeactivatedEdit"_s + sml::on_entry<_> / AlarmEdit::entry,
                                             "DeactivatedEdit"_s + sml::on_exit<_> / AlarmEdit::exit,
                                             "DeactivatedEdit"_s + event<Events::TimeUpdate> / Helpers::updateTemperature,
                                             "DeactivatedEdit"_s + event<Events::RotateLeftPress> / AlarmEdit::processRotateLeft,
                                             "DeactivatedEdit"_s + event<Events::RotateRightPress> / AlarmEdit::processRotateRight,
                                             "DeactivatedEdit"_s + event<Events::DeepUpPress> / Helpers::detachTimer = "ActivatedWait"_s,


@@ 151,9 157,11 @@ namespace app::home_screen
                                             "Activated"_s + sml::on_entry<_> / Activated::entry,
                                             "Activated"_s + event<Events::LightPress>/ Helpers::switchToMenu = "Activated"_s,
                                             "Activated"_s + event<Events::RotateRightPress> / Helpers::makeAlarmEditable = "ActivatedEdit"_s,
                                             "Activated"_s + event<Events::TimeUpdate> / Helpers::updateTemperature,

                                             "ActivatedEdit"_s + sml::on_entry<_> / AlarmEdit::entry,
                                             "ActivatedEdit"_s + sml::on_exit<_> / AlarmEdit::exit,
                                             "ActivatedEdit"_s + event<Events::TimeUpdate> / Helpers::updateTemperature,
                                             "ActivatedEdit"_s + event<Events::RotateLeftPress> / AlarmEdit::processRotateLeft,
                                             "ActivatedEdit"_s + event<Events::RotateRightPress> / AlarmEdit::processRotateRight,
                                             "ActivatedEdit"_s + event<Events::Timer>  = "ActivatedWait"_s,


@@ 219,4 227,9 @@ namespace app::home_screen
        presenter.refreshWindow();
        return true;
    }
    bool StateController::handleTimeUpdateEvent()
    {
        pimpl->sm.process_event(Events::TimeUpdate{});
        return true;
    }
} // namespace app::home_screen

R module-apps/application-bell-main/presenters/StateController.hpp => products/BellHybrid/apps/application-bell-main/presenters/StateController.hpp +2 -0
@@ 20,6 20,7 @@ namespace app::home_screen

        virtual bool handleInputEvent(const gui::InputEvent &inputEvent) = 0;
        virtual bool handleTimerEvent()                                  = 0;
        virtual bool handleTimeUpdateEvent()                             = 0;
    };

    class StateController : public AbstractController


@@ 33,6 34,7 @@ namespace app::home_screen
        ~StateController();
        bool handleInputEvent(const gui::InputEvent &inputEvent) override;
        bool handleTimerEvent() override;
        bool handleTimeUpdateEvent() override;

      private:
        class Impl;

R module-apps/application-bell-main/windows/BellHomeScreenWindow.cpp => products/BellHybrid/apps/application-bell-main/windows/BellHomeScreenWindow.cpp +10 -9
@@ 8,6 8,7 @@
#include <apps-common/widgets/BellBaseLayout.hpp>
#include <gui/input/InputEvent.hpp>
#include <gui/widgets/TextFixedSize.hpp>
#include <gui/widgets/Style.hpp>
#include <i18n/i18n.hpp>
#include <service-time/api/TimeSettingsApi.hpp>
#include <time/time_constants.hpp>


@@ 76,7 77,7 @@ namespace gui

    void BellHomeScreenWindow::buildInterface()
    {
        using namespace bellMainStyle::mainWindow;
        using namespace bellMainStyle;
        AppWindow::buildInterface();

        statusBar->setVisible(false);


@@ 86,21 87,22 @@ namespace gui
        body = new BellBaseLayout(this, 0, 0, style::window_width, style::window_height);

        alarm = new AlarmSetSpinner(body->firstBox);
        alarm->setMinimumSize(style::bell_base_layout::w, style::bell_base_layout::outer_layouts_h);
        alarm->setFont(alarmSetSpinner::font);
        alarm->setMinimumSize(mainWindow::alarmSetSpinner::width, mainWindow::alarmSetSpinner::height);
        alarm->setFont(mainWindow::alarmSetSpinner::font);
        alarm->setEditMode(EditMode::Browse);
        alarm->setAlarmStatus(AlarmSetSpinner::Status::DEACTIVATED);
        alarm->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));

        time = new TimeSetFmtSpinner(body->centerBox);
        time->setMaximumSize(style::bell_base_layout::w, style::bell_base_layout::h);
        time->setMaximumSize(mainWindow::time::width, mainWindow::time::height);
        time->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        time->setEditMode(EditMode::Browse);
        time->setFont(mainWindow::time::font);
        time->activeItem = false;

        bottomText = new TextFixedSize(body->lastBox, 0, 0, 0, 0);
        bottomText->setMinimumSize(style::bell_base_layout::w, style::bell_base_layout::outer_layouts_h);
        bottomText->setFont(temperatureLabel::font);
        bottomText->setMinimumSize(mainWindow::bottomDescription::width, mainWindow::bottomDescription::height);
        bottomText->setFont(mainWindow::bottomDescription::font);
        bottomText->setEdges(RectangleEdge::None);
        bottomText->activeItem = false;
        bottomText->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));


@@ 126,10 128,9 @@ namespace gui
        }
    }

    void BellHomeScreenWindow::setTemperature(gui::temperature::Temperature newTemp)
    void BellHomeScreenWindow::setTemperature(utils::temperature::Temperature newTemp)
    {
        constexpr auto degreeSign{gui::temperature::degree};
        bottomText->setText(std::to_string(newTemp.value) + degreeSign + gui::temperature::toStr(newTemp.unit));
        bottomText->setText(utils::temperature::tempToStrDec(newTemp));
    }
    void BellHomeScreenWindow::setBottomDescription(const UTF8 &desc)
    {

R module-apps/application-bell-main/windows/BellHomeScreenWindow.hpp => products/BellHybrid/apps/application-bell-main/windows/BellHomeScreenWindow.hpp +1 -1
@@ 35,7 35,7 @@ namespace gui
        void incAlarmMinute() override;
        void decAlarmMinute() override;

        void setTemperature(gui::temperature::Temperature newTemp) override;
        void setTemperature(utils::temperature::Temperature newTemp) override;
        void setBottomDescription(const UTF8 &desc) override;
        void setTime(std::time_t newTime) override;
        void setTimeFormat(utils::time::Locale::TimeFormat fmt) override;

R module-apps/application-bell-main/windows/BellMainMenuWindow.cpp => products/BellHybrid/apps/application-bell-main/windows/BellMainMenuWindow.cpp +0 -0
R module-apps/application-bell-main/windows/BellMainMenuWindow.hpp => products/BellHybrid/apps/application-bell-main/windows/BellMainMenuWindow.hpp +0 -0
R module-apps/application-bell-main/windows/BellMainSetHour.cpp => products/BellHybrid/apps/application-bell-main/windows/BellMainSetHour.cpp +0 -0
R module-apps/application-bell-main/windows/BellMainSetHour.hpp => products/BellHybrid/apps/application-bell-main/windows/BellMainSetHour.hpp +0 -0
A products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp => products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp +64 -0
@@ 0,0 1,64 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "ApplicationBellSettings.hpp"
#include "TimeUnitsPresenter.hpp"
#include "models/TemperatureUnitModel.hpp"
#include "windows/BellSettingsAdvancedWindow.hpp"
#include "windows/BellSettingsFinishedWindow.hpp"
#include "windows/BellSettingsTimeUnitsWindow.hpp"
#include "windows/BellSettingsWindow.hpp"

#include <apps-common/windows/Dialog.hpp>

namespace app
{
    ApplicationBellSettings::ApplicationBellSettings(std::string name,
                                                     std::string parent,
                                                     sys::phone_modes::PhoneMode mode,
                                                     StartInBackground startInBackground)
        : Application(std::move(name), std::move(parent), mode, startInBackground)
    {}

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

    void ApplicationBellSettings::createUserInterface()
    {
        windowsFactory.attach(gui::name::window::main_window, [](Application *app, const std::string &name) {
            return std::make_unique<gui::BellSettingsWindow>(app);
        });

        windowsFactory.attach(gui::window::name::bellSettingsAdvanced, [](Application *app, const std::string &name) {
            return std::make_unique<gui::BellSettingsAdvancedWindow>(app);
        });

        windowsFactory.attach(gui::window::name::bellSettingsTimeUnits, [](Application *app, const std::string &name) {
            auto temperatureUnitModel = std::make_unique<bell_settings::TemperatureUnitModel>(app);
            auto timeUnitsProvider    = std::make_shared<bell_settings::TimeUnitsModel>(app);
            auto presenter            = std::make_unique<bell_settings::TimeUnitsWindowPresenter>(timeUnitsProvider,
                                                                                       std::move(temperatureUnitModel));
            return std::make_unique<gui::BellSettingsTimeUnitsWindow>(app, std::move(presenter));
        });

        windowsFactory.attach(gui::window::name::bellSettingsFinished, [](Application *app, const std::string &name) {
            return std::make_unique<gui::BellSettingsFinishedWindow>(app);
        });
    }

    sys::MessagePointer ApplicationBellSettings::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        auto retMsg = Application::DataReceivedHandler(msgl);
        if (dynamic_cast<sys::ResponseMessage *>(retMsg.get())->retCode == sys::ReturnCodes::Success) {
            return retMsg;
        }
        return std::make_shared<sys::ResponseMessage>();
    }
} // namespace app

A products/BellHybrid/apps/application-bell-settings/CMakeLists.txt => products/BellHybrid/apps/application-bell-settings/CMakeLists.txt +59 -0
@@ 0,0 1,59 @@
# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
# For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

add_library(application-bell-settings STATIC)

target_include_directories(application-bell-settings
    PRIVATE
        $<BUILD_INTERFACE:
            ${CMAKE_CURRENT_SOURCE_DIR}
            data
            include/application-bell-settings
            models
            presenter
            widgets
            windows
        >
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)

target_sources(application-bell-settings
    PRIVATE
        ApplicationBellSettings.cpp
        models/TimeUnitsModel.cpp
        models/TemperatureUnitModel.cpp
        presenter/TimeUnitsPresenter.cpp
        widgets/TimeSetListItem.cpp
        widgets/TimeFormatSetListItem.cpp
        widgets/TemperatureUnitListItem.cpp
        windows/BellSettingsWindow.cpp
        windows/BellSettingsAdvancedWindow.cpp
        windows/BellSettingsTimeUnitsWindow.cpp
        windows/BellSettingsFinishedWindow.cpp

        models/TimeUnitsModel.hpp
        models/TemperatureUnitModel.hpp
        presenter/TimeUnitsPresenter.hpp
        widgets/TimeSetListItem.hpp
        widgets/TimeFormatSetListItem.hpp
        widgets/TemperatureUnitListItem.hpp
        windows/BellSettingsWindow.hpp
        windows/BellSettingsAdvancedWindow.hpp
        windows/BellSettingsTimeUnitsWindow.hpp

    PRIVATE
        windows/BellSettingsFinishedWindow.hpp

    PUBLIC
        include/application-bell-settings/ApplicationBellSettings.hpp
)

target_link_libraries(application-bell-settings
    PRIVATE
        bellgui
        service-appmgr
    PUBLIC
        apps-common
        module-gui
)

A products/BellHybrid/apps/application-bell-settings/data/BellSettingsStyle.hpp => products/BellHybrid/apps/application-bell-settings/data/BellSettingsStyle.hpp +25 -0
@@ 0,0 1,25 @@
// 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 <gui/Common.hpp>
#include <Style.hpp>

namespace gui
{
    namespace bell_settings_style
    {
        namespace settings_window
        {
            inline constexpr auto options_list_margin_x = 40;
            inline constexpr auto options_list_margin_y = 85;
            inline constexpr auto default_body_width    = 400;
        } // namespace settings_window

        namespace time_fmt_set_list_item
        {
            inline constexpr auto font = style::window::font::supersizemelight;
        } // namespace time_fmt_set_list_item
    }     // namespace bell_settings_style
} // namespace gui

A products/BellHybrid/apps/application-bell-settings/include/application-bell-settings/ApplicationBellSettings.hpp => products/BellHybrid/apps/application-bell-settings/include/application-bell-settings/ApplicationBellSettings.hpp +51 -0
@@ 0,0 1,51 @@
// 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 <apps-common/Application.hpp>

namespace gui::window::name
{
    inline constexpr auto bellSettings          = "BellSettings";
    inline constexpr auto bellSettingsAdvanced  = "BellSettingsAdvanced";
    inline constexpr auto bellSettingsTimeUnits = "BellSettingsTimeUnits";
    inline constexpr auto bellSettingsDialog    = "BellSettingsDialog";
    inline constexpr auto bellSettingsFinished  = "BellSettingsFinished";

} // namespace gui::window::name

namespace app
{
    inline constexpr auto applicationBellSettingsName = "ApplicationBellSettings";

    class ApplicationBellSettings : public Application
    {
      public:
        ApplicationBellSettings(std::string name                    = applicationBellSettingsName,
                                std::string parent                  = "",
                                sys::phone_modes::PhoneMode mode    = sys::phone_modes::PhoneMode::Offline,
                                StartInBackground startInBackground = {false});

        sys::ReturnCodes InitHandler() override;

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

        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;

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

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

A products/BellHybrid/apps/application-bell-settings/models/TemperatureUnitModel.cpp => products/BellHybrid/apps/application-bell-settings/models/TemperatureUnitModel.cpp +38 -0
@@ 0,0 1,38 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "TemperatureUnitModel.hpp"

#include <apps-common/Application.hpp>
#include <service-db/Settings.hpp>
#include <service-db/agents/settings/SystemSettings.hpp>

namespace
{
    constexpr auto temperatureUnit = settings::Temperature::unit;
} // namespace

namespace app::bell_settings
{
    TemperatureUnitModel::TemperatureUnitModel(app::Application *app)
    {
        settings.init(service::ServiceProxy{app->weak_from_this()});
    }

    utils::temperature::Temperature::Unit TemperatureUnitModel::get() const
    {
        const auto value = settings.getValue(temperatureUnit, settings::SettingsScope::Global);
        if (auto unit = utils::temperature::strToUnit(value); unit) {
            return *unit;
        }
        else {
            return utils::temperature::Temperature::Unit::Celsius;
        }
    }

    void TemperatureUnitModel::set(utils::temperature::Temperature::Unit unit)
    {
        settings.setValue(temperatureUnit, utils::temperature::unitToStr(unit), settings::SettingsScope::Global);
    }

} // namespace app::bell_settings

A products/BellHybrid/apps/application-bell-settings/models/TemperatureUnitModel.hpp => products/BellHybrid/apps/application-bell-settings/models/TemperatureUnitModel.hpp +40 -0
@@ 0,0 1,40 @@
// 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-utils/Temperature.hpp>
#include <service-db/Settings.hpp>

#include <memory>

namespace app
{
    class Application;
}

namespace app::bell_settings
{
    class AbstractTemperatureUnitModel
    {
      public:
        virtual ~AbstractTemperatureUnitModel() = default;

        virtual utils::temperature::Temperature::Unit get() const = 0;

        virtual void set(utils::temperature::Temperature::Unit unit) = 0;
    };

    class TemperatureUnitModel : public AbstractTemperatureUnitModel
    {
      public:
        explicit TemperatureUnitModel(Application *app);

        utils::temperature::Temperature::Unit get() const override;

        void set(utils::temperature::Temperature::Unit unit) override;

      private:
        mutable settings::Settings settings;
    };
} // namespace app::bell_settings

A products/BellHybrid/apps/application-bell-settings/models/TimeUnitsModel.cpp => products/BellHybrid/apps/application-bell-settings/models/TimeUnitsModel.cpp +126 -0
@@ 0,0 1,126 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "TimeUnitsModel.hpp"
#include "widgets/TimeFormatSetListItem.hpp"
#include "widgets/TimeSetListItem.hpp"
#include "widgets/TemperatureUnitListItem.hpp"

#include <gui/widgets/ListViewEngine.hpp>
#include <gui/widgets/Style.hpp>
#include <gui/widgets/Text.hpp>
#include <service-time/Constants.hpp>
#include <service-time/api/TimeSettingsApi.hpp>
#include <service-time/service-time/TimeMessage.hpp>
#include <widgets/TimeSetFmtSpinner.hpp>

#include <ctime>

namespace app::bell_settings
{
    TimeUnitsModel::TimeUnitsModel(app::Application *app) : application(app)
    {}

    TimeUnitsModel::~TimeUnitsModel()
    {
        clearData();
    }

    auto TimeUnitsModel::requestRecordsCount() -> unsigned int
    {
        return internalData.size();
    }

    auto TimeUnitsModel::getMinimalItemSpaceRequired() const -> unsigned int
    {
        return style::sidelistview::list_item::w;
    }

    auto TimeUnitsModel::getItem(gui::Order order) -> gui::ListItem *
    {
        return getRecord(order);
    }

    void TimeUnitsModel::createData()
    {

        timeFmtSetListItem =
            new gui::TimeFormatSetListItem(0,
                                           0,
                                           0,
                                           0,
                                           utils::translate("app_bell_settings_time_units_time_fmt_top_message"),
                                           utils::translate("app_bell_settings_time_units_time_fmt_bottom_message"));
        internalData.push_back(timeFmtSetListItem);

        timeSetListItem =
            new gui::TimeSetListItem(0U, 0U, 0, 0, utils::translate("app_bell_settings_time_units_time_message"));
        internalData.push_back(timeSetListItem);

        timeFmtSetListItem->onNextCallback = [this](gui::Item &) {
            timeSetListItem->timeSetFmtSpinner->setTimeFormat(timeFmtSetListItem->getTimeFmt());
        };

        temperatureUnitListItem =
            new gui::TemperatureUnitListItem(utils::translate("app_bell_settings_advanced_temp_scale"));
        internalData.push_back(temperatureUnitListItem);

        for (auto item : internalData) {
            item->deleteByList = false;
        }
    }

    void TimeUnitsModel::clearData()
    {
        eraseInternalData();
    }

    void TimeUnitsModel::saveData()
    {
        const auto now     = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
        const auto newTime = std::localtime(&now);
        newTime->tm_hour   = timeSetListItem->timeSetFmtSpinner->getHour();
        newTime->tm_min    = timeSetListItem->timeSetFmtSpinner->getMinute();
        const auto newFmt  = timeFmtSetListItem->getTimeFmt();
        LOG_INFO("Setting new time: %d:%d fmt: %s",
                 newTime->tm_hour,
                 newTime->tm_min,
                 utils::time::Locale::format(newFmt).c_str());
        sendRtcUpdateTimeMessage(std::mktime(newTime));
        sendTimeFmtUpdateMessage(newFmt);
    }

    void TimeUnitsModel::loadData()
    {
        const auto now        = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
        const auto time       = std::localtime(&now);
        const auto timeFormat = stm::api::timeFormat();
        timeSetListItem->timeSetFmtSpinner->setHour(time->tm_hour);
        timeSetListItem->timeSetFmtSpinner->setMinute(time->tm_min);
        timeSetListItem->timeSetFmtSpinner->setTimeFormat(timeFormat);
        timeFmtSetListItem->setTimeFmt(timeFormat);
    }

    auto TimeUnitsModel::requestRecords(uint32_t offset, uint32_t limit) -> void
    {
        setupModel(offset, limit);
        list->onProviderDataUpdate();
    }

    void TimeUnitsModel::sendRtcUpdateTimeMessage(time_t newTime)
    {
        auto msg = std::make_shared<stm::message::TimeChangeRequestMessage>(newTime);
        application->bus.sendUnicast(std::move(msg), service::name::service_time);
    }

    void TimeUnitsModel::sendTimeFmtUpdateMessage(utils::time::Locale::TimeFormat newFmt)
    {
        auto msg = std::make_shared<stm::message::SetTimeFormatRequest>(newFmt);
        application->bus.sendUnicast(std::move(msg), service::name::service_time);
    }

    auto TimeUnitsModel::getTemperatureUnit() -> utils::temperature::Temperature::Unit
    {
        return *utils::temperature::strToUnit(temperatureUnitListItem->getUnitAsStr());
    }
} // namespace app::bell_settings

A products/BellHybrid/apps/application-bell-settings/models/TimeUnitsModel.hpp => products/BellHybrid/apps/application-bell-settings/models/TimeUnitsModel.hpp +57 -0
@@ 0,0 1,57 @@
// 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 <apps-common/Application.hpp>
#include <apps-common/InternalModel.hpp>
#include <module-utils/Temperature.hpp>
#include <time/time_locale.hpp>

namespace gui
{
    class TimeSetListItem;

    class TimeFormatSetListItem;

    class TemperatureUnitListItem;
} // namespace gui

namespace app::bell_settings
{
    class TimeUnitsModel : public app::InternalModel<gui::ListItem *>, public gui::ListItemProvider
    {
      public:
        explicit TimeUnitsModel(app::Application *app);

        ~TimeUnitsModel();

        auto clearData() -> void;

        auto saveData() -> void;

        auto loadData() -> void;

        auto createData() -> void;

        auto requestRecords(uint32_t offset, uint32_t limit) -> void;

        [[nodiscard]] auto getItem(gui::Order order) -> gui::ListItem * override;

        [[nodiscard]] auto requestRecordsCount() -> unsigned int override;

        [[nodiscard]] auto getMinimalItemSpaceRequired() const -> unsigned int override;

        [[nodiscard]] auto getTemperatureUnit() -> utils::temperature::Temperature::Unit;

      private:
        app::Application *application{};
        gui::TimeSetListItem *timeSetListItem{};
        gui::TimeFormatSetListItem *timeFmtSetListItem{};
        gui::TemperatureUnitListItem *temperatureUnitListItem{};

        void sendRtcUpdateTimeMessage(time_t newTime);

        void sendTimeFmtUpdateMessage(utils::time::Locale::TimeFormat newFmt);
    };
} // namespace app::bell_settings

A products/BellHybrid/apps/application-bell-settings/presenter/TimeUnitsPresenter.cpp => products/BellHybrid/apps/application-bell-settings/presenter/TimeUnitsPresenter.cpp +40 -0
@@ 0,0 1,40 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "TemperatureUnitModel.hpp"
#include "TimeUnitsPresenter.hpp"

namespace app::bell_settings
{
    TimeUnitsWindowPresenter::TimeUnitsWindowPresenter(
        std::shared_ptr<TimeUnitsModel> pagesProvider,
        std::unique_ptr<AbstractTemperatureUnitModel> temperatureUnitModel)
        : pagesProvider(std::move(pagesProvider)), temperatureUnitModel{std::move(temperatureUnitModel)}
    {}

    auto TimeUnitsWindowPresenter::getPagesProvider() const -> std::shared_ptr<gui::ListItemProvider>
    {
        return pagesProvider;
    }

    auto TimeUnitsWindowPresenter::clearData() -> void
    {
        pagesProvider->clearData();
    }

    auto TimeUnitsWindowPresenter::saveData() -> void
    {
        pagesProvider->saveData();
        temperatureUnitModel->set(pagesProvider->getTemperatureUnit());
    }

    auto TimeUnitsWindowPresenter::loadData() -> void
    {
        pagesProvider->loadData();
    }

    auto TimeUnitsWindowPresenter::createData() -> void
    {
        pagesProvider->createData();
    }
} // namespace app::bell_settings

A products/BellHybrid/apps/application-bell-settings/presenter/TimeUnitsPresenter.hpp => products/BellHybrid/apps/application-bell-settings/presenter/TimeUnitsPresenter.hpp +51 -0
@@ 0,0 1,51 @@
// 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 "TimeUnitsModel.hpp"

#include <apps-common/BasePresenter.hpp>

namespace app::bell_settings
{
    class AbstractTemperatureUnitModel;

    class TimeUnitsWindowContract
    {
      public:
        class View
        {
          public:
            virtual ~View() noexcept = default;
        };

        class Presenter : public BasePresenter<TimeUnitsWindowContract::View>
        {
          public:
            virtual ~Presenter() noexcept                                                   = default;
            virtual auto getPagesProvider() const -> std::shared_ptr<gui::ListItemProvider> = 0;
            virtual auto clearData() -> void                                                = 0;
            virtual auto saveData() -> void                                                 = 0;
            virtual auto loadData() -> void                                                 = 0;
            virtual auto createData() -> void                                               = 0;
        };
    };

    class TimeUnitsWindowPresenter : public TimeUnitsWindowContract::Presenter
    {
      public:
        explicit TimeUnitsWindowPresenter(std::shared_ptr<TimeUnitsModel> pagesProvider,
                                          std::unique_ptr<AbstractTemperatureUnitModel> temperatureUnitModel);

        auto getPagesProvider() const -> std::shared_ptr<gui::ListItemProvider> override;
        auto clearData() -> void;
        auto saveData() -> void;
        auto loadData() -> void;
        auto createData() -> void;

      private:
        std::shared_ptr<TimeUnitsModel> pagesProvider;
        std::unique_ptr<AbstractTemperatureUnitModel> temperatureUnitModel;
    };
} // namespace app::bell_settings

A products/BellHybrid/apps/application-bell-settings/widgets/TemperatureUnitListItem.cpp => products/BellHybrid/apps/application-bell-settings/widgets/TemperatureUnitListItem.cpp +44 -0
@@ 0,0 1,44 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "BellSettingsStyle.hpp"
#include "TemperatureUnitListItem.hpp"

#include <gui/widgets/TextSpinner.hpp>
#include <module-utils/Temperature.hpp>

namespace gui
{
    TemperatureUnitListItem::TemperatureUnitListItem(const UTF8 &topDesc, Length x, Length y, Length w, Length h)
        : BellSideListItem(topDesc)
    {
        setMinimumSize(style::sidelistview::list_item::w, style::sidelistview::list_item::h);
        setEdges(RectangleEdge::None);
        setFocusItem(body);

        temperatureUnit =
            new TextSpinner({utils::temperature::celsiusDegreeSymbol, utils::temperature::fahrenheitDegreeSymbol},
                            Boundaries::Continuous);
        temperatureUnit->setMaximumSize(style::bell_base_layout::w, style::bell_base_layout::h);
        temperatureUnit->setFont(bell_settings_style::time_fmt_set_list_item::font);
        temperatureUnit->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        temperatureUnit->setFocusEdges(RectangleEdge::None);
        body->centerBox->addWidget(temperatureUnit);

        dimensionChangedCallback = [&](Item &, const BoundingBox &newDim) -> bool {
            body->setArea({0, 0, newDim.w, newDim.h});
            return true;
        };
        focusChangedCallback = [&](Item &) {
            setFocusItem(focus ? body : nullptr);
            return true;
        };

        inputCallback = [&](Item &, const InputEvent &inputEvent) -> bool { return body->onInput(inputEvent); };
    }

    auto TemperatureUnitListItem::getUnitAsStr() const noexcept -> UTF8
    {
        return temperatureUnit->getCurrentText();
    }
} // namespace gui

A products/BellHybrid/apps/application-bell-settings/widgets/TemperatureUnitListItem.hpp => products/BellHybrid/apps/application-bell-settings/widgets/TemperatureUnitListItem.hpp +25 -0
@@ 0,0 1,25 @@
// 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 <widgets/BellSideListItem.hpp>
#include <utf8/UTF8.hpp>

namespace gui
{
    class TextSpinner;

    class TemperatureUnitListItem : public BellSideListItem
    {
      public:
        explicit TemperatureUnitListItem(
            const UTF8 &topDesc = "", Length x = 0, Length y = 0, Length w = 0, Length h = 0);

        auto getUnitAsStr() const noexcept -> UTF8;

      private:
        TextSpinner *temperatureUnit{};
    };

} // namespace gui

A products/BellHybrid/apps/application-bell-settings/widgets/TimeFormatSetListItem.cpp => products/BellHybrid/apps/application-bell-settings/widgets/TimeFormatSetListItem.cpp +88 -0
@@ 0,0 1,88 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "TimeFormatSetListItem.hpp"
#include "BellSettingsStyle.hpp"

#include <gui/core/FontManager.hpp>
#include <gui/core/RawFont.hpp>
#include <gui/widgets/Label.hpp>
#include <gui/widgets/Spinner.hpp>

#include <widgets/TimeSetFmtSpinner.hpp>

namespace
{
    constexpr auto fmtSpinnerMin  = 12U;
    constexpr auto fmtSpinnerMax  = 24U;
    constexpr auto fmtSpinnerStep = 12U;
} // namespace

namespace gui
{
    TimeFormatSetListItem::TimeFormatSetListItem(
        Length x, Length y, Length w, Length h, const UTF8 &topDesc, const UTF8 &botDesc)
        : BellSideListItem(topDesc)
    {
        setMinimumSize(style::sidelistview::list_item::w, style::sidelistview::list_item::h);
        setEdges(RectangleEdge::None);
        setFocusItem(body);

        timeFormat = new Spinner(fmtSpinnerMin, fmtSpinnerMax, fmtSpinnerStep, Boundaries::Continuous);
        timeFormat->setMaximumSize(style::bell_base_layout::w, style::bell_base_layout::h);
        timeFormat->setFont(bell_settings_style::time_fmt_set_list_item::font);

        timeFormat->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        timeFormat->setFixedFieldWidth(2);
        timeFormat->setEdges(RectangleEdge::None);
        timeFormat->setCurrentValue(fmtSpinnerMin);
        timeFormat->setFocusEdges(RectangleEdge::None);
        body->centerBox->addWidget(timeFormat);

        bottomDescription = new Label(body->lastBox);
        bottomDescription->setMaximumSize(style::bell_base_layout::w, style::bell_base_layout::outer_layouts_h);
        bottomDescription->setFont(style::bell_sidelist_item::description_font);
        bottomDescription->setEdges(RectangleEdge::None);
        bottomDescription->activeItem = false;
        bottomDescription->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        bottomDescription->setText(botDesc);

        dimensionChangedCallback = [&](Item &, const BoundingBox &newDim) -> bool {
            body->setArea({0, 0, newDim.w, newDim.h});
            return true;
        };

        focusChangedCallback = [&](Item &) {
            setFocusItem(focus ? body : nullptr);
            if (focus) {
                setFocusItem(body);
            }
            else {
                setFocusItem(nullptr);
                if (onNextCallback) {
                    onNextCallback(*this);
                }
            }
            return true;
        };

        inputCallback = [&](Item &, const InputEvent &inputEvent) -> bool { return body->onInput(inputEvent); };
    }

    auto TimeFormatSetListItem::getTimeFmt() const noexcept -> utils::time::Locale::TimeFormat
    {
        return timeFormat->getCurrentValue() == fmtSpinnerMin ? utils::time::Locale::TimeFormat::FormatTime12H
                                                              : utils::time::Locale::TimeFormat::FormatTime24H;
    }

    auto TimeFormatSetListItem::setTimeFmt(utils::time::Locale::TimeFormat fmt) noexcept -> void
    {
        using namespace utils::time;
        if (fmt == Locale::TimeFormat::FormatTime12H) {
            timeFormat->setCurrentValue(fmtSpinnerMin);
        }
        else if (fmt == Locale::TimeFormat::FormatTime24H) {
            timeFormat->setCurrentValue(fmtSpinnerMax);
        }
    }
} // namespace gui
\ No newline at end of file

A products/BellHybrid/apps/application-bell-settings/widgets/TimeFormatSetListItem.hpp => products/BellHybrid/apps/application-bell-settings/widgets/TimeFormatSetListItem.hpp +36 -0
@@ 0,0 1,36 @@
// 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 <time/time_locale.hpp>
#include <utf8/UTF8.hpp>
#include <widgets/BellSideListItem.hpp>

#include <functional>

namespace gui
{
    class Spinner;
    class Label;

    class TimeFormatSetListItem : public gui::BellSideListItem
    {
      public:
        TimeFormatSetListItem() = delete;
        TimeFormatSetListItem(
            gui::Length x, gui::Length y, gui::Length w, gui::Length h, const UTF8 &topDesc, const UTF8 &botDesc);

        auto getTimeFmt() const noexcept -> utils::time::Locale::TimeFormat;
        auto setTimeFmt(utils::time::Locale::TimeFormat fmt) noexcept -> void;

        /// called before next SideListItem is activated
        /// @param `this` : item
        std::function<void(Item &)> onNextCallback;

      private:
        Label *bottomDescription{};
        Spinner *timeFormat{};
    };

} // namespace gui

A products/BellHybrid/apps/application-bell-settings/widgets/TimeSetListItem.cpp => products/BellHybrid/apps/application-bell-settings/widgets/TimeSetListItem.cpp +33 -0
@@ 0,0 1,33 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "TimeSetListItem.hpp"
#include "BellSettingsStyle.hpp"

#include <gui/input/InputEvent.hpp>
#include <widgets/TimeSetFmtSpinner.hpp>

namespace gui
{
    TimeSetListItem::TimeSetListItem(
        gui::Length x, gui::Length y, gui::Length w, gui::Length h, std::string description)
        : BellSideListItem(std::move(description))
    {
        setMinimumSize(style::sidelistview::list_item::w, style::sidelistview::list_item::h);
        timeSetFmtSpinner = new TimeSetFmtSpinner(body->centerBox);
        timeSetFmtSpinner->setMaximumSize(style::bell_base_layout::w, style::bell_base_layout::h);
        setFocusItem(body);

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

        focusChangedCallback = [&](Item &item) {
            setFocusItem(focus ? body : nullptr);
            return true;
        };

        inputCallback = [&](Item &, const InputEvent &inputEvent) -> bool { return body->onInput(inputEvent); };
    }
} /* namespace gui */

A products/BellHybrid/apps/application-bell-settings/widgets/TimeSetListItem.hpp => products/BellHybrid/apps/application-bell-settings/widgets/TimeSetListItem.hpp +21 -0
@@ 0,0 1,21 @@
// 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 <widgets/BellSideListItem.hpp>

#include <string>

namespace gui
{
    class TimeSetFmtSpinner;

    class TimeSetListItem : public BellSideListItem
    {
      public:
        TimeSetFmtSpinner *timeSetFmtSpinner = nullptr;

        TimeSetListItem(gui::Length x, gui::Length y, gui::Length w, gui::Length h, std::string description);
    };
} /* namespace gui */

A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsAdvancedWindow.cpp => products/BellHybrid/apps/application-bell-settings/windows/BellSettingsAdvancedWindow.cpp +64 -0
@@ 0,0 1,64 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "application-bell-settings/ApplicationBellSettings.hpp"
#include "BellSettingsAdvancedWindow.hpp"
#include "BellSettingsStyle.hpp"

#include <apps-common/options/type/OptionBellMenu.hpp>
#include <apps-common/messages/DialogMetadataMessage.hpp>
#include <apps-common/windows/Dialog.hpp>
#include <service-appmgr/Controller.hpp>

namespace gui
{

    BellSettingsAdvancedWindow::BellSettingsAdvancedWindow(app::Application *app)
        : OptionWindow(app, gui::window::name::bellSettingsAdvanced)
    {
        addOptions(settingsOptionsList());
        buildInterface();
    }

    void BellSettingsAdvancedWindow::buildInterface()
    {
        statusBar->setVisible(false);
        header->setTitleVisibility(false);
        bottomBar->setVisible(false);

        optionsList->setPosition(bell_settings_style::settings_window::options_list_margin_x,
                                 bell_settings_style::settings_window::options_list_margin_y);
        optionsList->setMaximumWidth(bell_settings_style::settings_window::default_body_width);
        optionsList->setBoundaries(gui::Boundaries::Continuous);
    }

    std::list<Option> BellSettingsAdvancedWindow::settingsOptionsList()
    {
        std::list<gui::Option> settingsOptionList;
        auto addWinSettings = [&](const UTF8 &name, const std::string &window) {
            settingsOptionList.emplace_back(std::make_unique<gui::option::OptionBellMenu>(
                name,
                [=](gui::Item &item) {
                    if (window.empty()) {
                        return false;
                    }
                    application->switchWindow(
                        window,
                        gui::ShowMode::GUI_SHOW_INIT,
                        std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{name, "search_big", " "}));
                    return true;
                },
                [=](gui::Item &item) {
                    // put focus change callback here
                    return true;
                },
                this));
        };

        addWinSettings(utils::translate("app_bell_settings_advanced_time_units"),
                       gui::window::name::bellSettingsTimeUnits);

        return settingsOptionList;
    }

} // namespace gui

A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsAdvancedWindow.hpp => products/BellHybrid/apps/application-bell-settings/windows/BellSettingsAdvancedWindow.hpp +21 -0
@@ 0,0 1,21 @@
// 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 <apps-common/windows/OptionWindow.hpp>

namespace gui
{

    class BellSettingsAdvancedWindow : public OptionWindow
    {
      public:
        explicit BellSettingsAdvancedWindow(app::Application *app);

      private:
        std::list<Option> settingsOptionsList();
        void buildInterface() override;
    };

} // namespace gui

A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsFinishedWindow.cpp => products/BellHybrid/apps/application-bell-settings/windows/BellSettingsFinishedWindow.cpp +61 -0
@@ 0,0 1,61 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "BellSettingsFinishedWindow.hpp"

#include <gui/input/InputEvent.hpp>
#include <gui/widgets/Icon.hpp>

namespace
{
    constexpr auto appNameToReturn = gui::window::name::bellSettingsAdvanced;
}

namespace gui
{

    BellSettingsFinishedWindow::BellSettingsFinishedWindow(app::Application *app, const std::string &name)
        : WindowWithTimer(app, name)
    {
        buildInterface();

        timerCallback = [this](Item &, sys::Timer &) {
            application->switchWindow(appNameToReturn);
            return true;
        };
    }
    void BellSettingsFinishedWindow::buildInterface()
    {
        WindowWithTimer::buildInterface();

        statusBar->setVisible(false);
        header->setTitleVisibility(false);
        bottomBar->setVisible(false);

        icon = new Icon(this,
                        0,
                        0,
                        style::window_width,
                        style::window_height,
                        "circle_success",
                        utils::translate("app_bell_settings_time_units_finished_message"));
    }
    bool BellSettingsFinishedWindow::onInput(const InputEvent &inputEvent)
    {
        if (inputEvent.isShortRelease(KeyCode::KEY_ENTER) || inputEvent.isShortRelease(KeyCode::KEY_RF)) {
            application->switchWindow(appNameToReturn);
            return true;
        }
        if (AppWindow::onInput(inputEvent)) {
            return true;
        }

        return AppWindow::onInput(inputEvent);
    }
    void BellSettingsFinishedWindow::rebuild()
    {
        erase();
        buildInterface();
    }

} // namespace gui

A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsFinishedWindow.hpp => products/BellHybrid/apps/application-bell-settings/windows/BellSettingsFinishedWindow.hpp +27 -0
@@ 0,0 1,27 @@
// 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-bell-settings/ApplicationBellSettings.hpp"

#include <apps-common/popups/WindowWithTimer.hpp>

namespace gui
{
    class Icon;

    class BellSettingsFinishedWindow : public WindowWithTimer
    {
      public:
        BellSettingsFinishedWindow(app::Application *app, const std::string &name = window::name::bellSettingsFinished);

      private:
        void buildInterface() override;
        bool onInput(const InputEvent &inputEvent) override;
        void rebuild() override;

        Icon *icon{};
    };

} // namespace gui

A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsTimeUnitsWindow.cpp => products/BellHybrid/apps/application-bell-settings/windows/BellSettingsTimeUnitsWindow.cpp +65 -0
@@ 0,0 1,65 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "application-bell-settings/ApplicationBellSettings.hpp"
#include "BellSettingsStyle.hpp"
#include "BellSettingsTimeUnitsWindow.hpp"

#include <gui/input/InputEvent.hpp>
#include <apps-common/options/OptionStyle.hpp>

namespace gui
{
    BellSettingsTimeUnitsWindow::BellSettingsTimeUnitsWindow(
        app::Application *app,
        std::unique_ptr<app::bell_settings::TimeUnitsWindowContract::Presenter> &&windowPresenter,
        std::string name)
        : AppWindow(app, name), presenter{std::move(windowPresenter)}
    {
        presenter->attach(this);
        buildInterface();
    }

    void BellSettingsTimeUnitsWindow::rebuild()
    {
        erase();
        buildInterface();
    }

    void BellSettingsTimeUnitsWindow::buildInterface()
    {
        AppWindow::buildInterface();
        statusBar->setVisible(false);
        header->setTitleVisibility(false);
        bottomBar->setVisible(false);

        presenter->createData();

        sidelistview = new SideListView(
            this, 0U, 0U, this->getWidth(), this->getHeight(), presenter->getPagesProvider(), PageBarType::None);
        sidelistview->setEdges(RectangleEdge::None);

        sidelistview->rebuildList(listview::RebuildType::Full);

        presenter->loadData();

        setFocusItem(sidelistview);
    }

    bool BellSettingsTimeUnitsWindow::onInput(const gui::InputEvent &inputEvent)
    {
        if (sidelistview->onInput(inputEvent)) {
            return true;
        }
        if (inputEvent.isShortRelease(KeyCode::KEY_ENTER)) {
            presenter->saveData();
            application->switchWindow(window::name::bellSettingsFinished);
            return true;
        }
        if (AppWindow::onInput(inputEvent)) {
            return true;
        }

        return AppWindow::onInput(inputEvent);
    }
} /* namespace gui */

A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsTimeUnitsWindow.hpp => products/BellHybrid/apps/application-bell-settings/windows/BellSettingsTimeUnitsWindow.hpp +33 -0
@@ 0,0 1,33 @@
// 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-bell-settings/ApplicationBellSettings.hpp"
#include "TimeUnitsPresenter.hpp"
#include "TimeUnitsModel.hpp"

#include <apps-common/windows/AppWindow.hpp>
#include <widgets/SideListView.hpp>

namespace gui
{
    class SideListView;

    class BellSettingsTimeUnitsWindow : public AppWindow, public app::bell_settings::TimeUnitsWindowContract::View
    {
      public:
        explicit BellSettingsTimeUnitsWindow(
            app::Application *app,
            std::unique_ptr<app::bell_settings::TimeUnitsWindowContract::Presenter> &&windowPresenter,
            std::string name = gui::window::name::bellSettingsTimeUnits);

        void buildInterface() override;
        bool onInput(const InputEvent &inputEvent) override;
        void rebuild() override;

      private:
        SideListView *sidelistview = nullptr;
        std::unique_ptr<app::bell_settings::TimeUnitsWindowContract::Presenter> presenter;
    };
} /* namespace gui */

A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsWindow.cpp => products/BellHybrid/apps/application-bell-settings/windows/BellSettingsWindow.cpp +60 -0
@@ 0,0 1,60 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "BellSettingsWindow.hpp"

#include <application-bell-settings/ApplicationBellSettings.hpp>
#include <data/BellSettingsStyle.hpp>

#include <apps-common/messages/DialogMetadataMessage.hpp>
#include <apps-common/options/type/OptionBellMenu.hpp>
#include <apps-common/windows/Dialog.hpp>
#include <service-appmgr/Controller.hpp>

namespace gui
{

    BellSettingsWindow::BellSettingsWindow(app::Application *app) : OptionWindow(app, gui::window::name::bellSettings)
    {
        addOptions(settingsOptionsList());
        buildInterface();
    }

    void BellSettingsWindow::buildInterface()
    {
        statusBar->setVisible(false);
        header->setTitleVisibility(false);
        bottomBar->setVisible(false);

        optionsList->setPosition(bell_settings_style::settings_window::options_list_margin_x,
                                 bell_settings_style::settings_window::options_list_margin_y);
        optionsList->setMaximumWidth(bell_settings_style::settings_window::default_body_width);
        optionsList->setBoundaries(gui::Boundaries::Continuous);
    }

    std::list<Option> BellSettingsWindow::settingsOptionsList()
    {
        std::list<gui::Option> settingsOptionList;
        auto addWinSettings = [&](const UTF8 &name, const std::string &window) {
            settingsOptionList.emplace_back(std::make_unique<gui::option::OptionBellMenu>(
                name,
                [=](gui::Item &item) {
                    if (window.empty()) {
                        return false;
                    }
                    application->switchWindow(window, gui::ShowMode::GUI_SHOW_INIT);
                    return true;
                },
                [=](gui::Item &item) {
                    // put focus change callback here
                    return true;
                },
                this));
        };

        addWinSettings(utils::translate("app_bell_settings_advanced"), gui::window::name::bellSettingsAdvanced);

        return settingsOptionList;
    }

} // namespace gui

A products/BellHybrid/apps/application-bell-settings/windows/BellSettingsWindow.hpp => products/BellHybrid/apps/application-bell-settings/windows/BellSettingsWindow.hpp +21 -0
@@ 0,0 1,21 @@
// 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 <apps-common/windows/OptionWindow.hpp>

namespace gui
{

    class BellSettingsWindow : public OptionWindow
    {
      public:
        explicit BellSettingsWindow(app::Application *app);

      private:
        std::list<Option> settingsOptionsList();
        void buildInterface() override;
    };

} // namespace gui