~aleteoryx/muditaos

cc0ec423bfc250c7828d2d8c180709a48eb3caa3 — Lefucjusz 2 years ago 1fff0a5
[MOS-1035] Fixes in new alarm window UI flow

* Fixed disappearing left functional
button label when popup appeared while
focused on sound selection field or
AM/PM field
* Fixed erasing selections on
custom alarm edit window when
popup appeared.
* Added preview playback stopping
after manually blocking the phone.
M module-apps/application-alarm-clock/ApplicationAlarmClock.cpp => module-apps/application-alarm-clock/ApplicationAlarmClock.cpp +1 -5
@@ 12,19 12,16 @@
#include "windows/AppWindow.hpp"
#include "windows/OptionWindow.hpp"
#include <service-db/DBNotificationMessage.hpp>
#include <service-db/QueryMessage.hpp>
#include <service-time/api/TimeSettingsApi.hpp>
#include <service-audio/AudioServiceAPI.hpp>

namespace app
{

    ApplicationAlarmClock::ApplicationAlarmClock(std::string name,
                                                 std::string parent,
                                                 StatusIndicators statusIndicators,
                                                 uint32_t stackDepth,
                                                 sys::ServicePriority priority)
        : Application(name, parent, statusIndicators, false, stackDepth, priority),
        : Application(std::move(name), std::move(parent), statusIndicators, false, stackDepth, priority),
          soundsPlayer{std::make_shared<SoundsPlayer>(this)}
    {
        bus.channels.push_back(sys::BusChannel::ServiceDBNotifications);


@@ 126,5 123,4 @@ namespace app
        soundsPlayer->stop(notification->token);
        return sys::MessageNone{};
    }

} /* namespace app */

M module-apps/application-alarm-clock/models/CustomRepeatModel.cpp => module-apps/application-alarm-clock/models/CustomRepeatModel.cpp +2 -2
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "CustomRepeatModel.hpp"


@@ 12,7 12,7 @@ namespace app::alarmClock
{
    CustomRepeatModel::CustomRepeatModel(app::ApplicationCommon *app,
                                         std::shared_ptr<alarmClock::AlarmRRulePresenter> rRulePresenter)
        : application(app), rRulePresenter(rRulePresenter)
        : application(app), rRulePresenter(std::move(rRulePresenter))
    {}

    unsigned int CustomRepeatModel::requestRecordsCount()

M module-apps/application-alarm-clock/models/NewEditAlarmModel.cpp => module-apps/application-alarm-clock/models/NewEditAlarmModel.cpp +6 -6
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "NewEditAlarmModel.hpp"


@@ 23,12 23,12 @@ namespace app::alarmClock
          rRulePresenter(std::move(rRulePresenter))
    {}

    unsigned int NewEditAlarmModel::requestRecordsCount()
    unsigned NewEditAlarmModel::requestRecordsCount()
    {
        return internalData.size();
    }

    unsigned int NewEditAlarmModel::getMinimalItemSpaceRequired() const
    unsigned NewEditAlarmModel::getMinimalItemSpaceRequired() const
    {
        return style::text_spinner_label::h;
    }


@@ 70,7 70,7 @@ namespace app::alarmClock
            [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); });
        internalData.push_back(repeatOption);

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


@@ 88,7 88,7 @@ namespace app::alarmClock
        rRulePresenter->loadRecord(record);
        createData();

        for (auto &item : internalData) {
        for (auto item : internalData) {
            if (item->onLoadCallback) {
                item->onLoadCallback(record);
            }


@@ 106,7 106,7 @@ namespace app::alarmClock

    void NewEditAlarmModel::saveData(std::shared_ptr<AlarmEventRecord> alarm, AlarmAction action)
    {
        for (auto &item : internalData) {
        for (auto item : internalData) {
            if (item->onSaveCallback) {
                item->onSaveCallback(alarm);
            }

M module-apps/application-alarm-clock/models/NewEditAlarmModel.hpp => module-apps/application-alarm-clock/models/NewEditAlarmModel.hpp +3 -3
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 48,8 48,8 @@ namespace app::alarmClock
        void clearData() override;
        void createData();

        [[nodiscard]] unsigned int getMinimalItemSpaceRequired() const override;
        [[nodiscard]] unsigned int requestRecordsCount() override;
        [[nodiscard]] unsigned getMinimalItemSpaceRequired() const override;
        [[nodiscard]] unsigned requestRecordsCount() override;
        [[nodiscard]] gui::ListItem *getItem(gui::Order order) override;
        void requestRecords(uint32_t offset, uint32_t limit) override;
    };

M module-apps/application-alarm-clock/presenter/AlarmClockEditWindowPresenter.cpp => module-apps/application-alarm-clock/presenter/AlarmClockEditWindowPresenter.cpp +1 -2
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "AlarmClockEditWindowPresenter.hpp"


@@ 34,5 34,4 @@ namespace app::alarmClock
    {
        alarmFieldsProvider->clearData();
    }

} // namespace app::alarmClock

M module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.cpp => module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.cpp +12 -7
@@ 2,8 2,6 @@
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "AlarmMusicOptionsItem.hpp"

#include <service-audio/AudioServiceAPI.hpp>
#include <purefs/filesystem_paths.hpp>

namespace gui


@@ 20,12 18,13 @@ namespace gui

        alarmSoundList = getMusicFilesList();
        std::vector<UTF8> printOptions;
        for (const auto &musicFile : getMusicFilesList()) {
        printOptions.reserve(alarmSoundList.size());
        for (const auto &musicFile : alarmSoundList) {
            printOptions.push_back(musicFile.title);
        }
        optionSpinner->setData({printOptions});
        optionSpinner->setData(printOptions);

        inputCallback = [=](gui::Item &item, const gui::InputEvent &event) {
        inputCallback = [=]([[maybe_unused]] gui::Item &item, const gui::InputEvent &event) {
            if (event.isShortRelease(gui::KeyCode::KEY_LF)) {
                if (!player->previouslyPlayed(getFilePath(optionSpinner->getCurrentValue())) ||
                    player->isInState(SoundsPlayer::State::Stopped)) {


@@ 43,11 42,17 @@ namespace gui
                }
            }

            // stop preview playback when we go back
            /* Stop preview playback when going back */
            if (player->isInState(SoundsPlayer::State::Playing) && event.isShortRelease(gui::KeyCode::KEY_RF)) {
                player->stop();
            }

            /* Stop preview playback when manually locking the phone */
            if (player->isInState(SoundsPlayer::State::Playing) && event.isLongRelease(KeyCode::KEY_PND)) {
                player->stop();
                this->navBarTemporaryMode(utils::translate(style::strings::common::play));
            }

            const auto actionHandled = optionSpinner->onInput(event);
            if (actionHandled && player->isInState(SoundsPlayer::State::Playing)) {
                player->play(getFilePath(optionSpinner->getCurrentValue()),


@@ 56,7 61,7 @@ namespace gui
            return actionHandled;
        };

        focusChangedCallback = [=](Item &item) {
        focusChangedCallback = [=]([[maybe_unused]] Item &item) {
            setFocusItem(focus ? optionSpinner : nullptr);

            if (focus) {

M module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.hpp => module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.hpp +6 -6
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 24,11 24,11 @@ namespace gui
        std::vector<tags::fetcher::Tags> getMusicFilesList();

      public:
        explicit AlarmMusicOptionsItem(app::ApplicationCommon *app,
                                       const std::string &description,
                                       std::shared_ptr<SoundsPlayer> player,
                                       std::function<void(const UTF8 &text)> navBarTemporaryMode = nullptr,
                                       std::function<void()> navBarRestoreFromTemporaryMode      = nullptr);
        AlarmMusicOptionsItem(app::ApplicationCommon *app,
                              const std::string &description,
                              std::shared_ptr<SoundsPlayer> player,
                              std::function<void(const UTF8 &text)> navBarTemporaryMode = nullptr,
                              std::function<void()> navBarRestoreFromTemporaryMode      = nullptr);

      private:
        [[nodiscard]] std::string getTitle(const std::string &filePath);

M module-apps/application-alarm-clock/widgets/AlarmRRuleOptionsItem.cpp => module-apps/application-alarm-clock/widgets/AlarmRRuleOptionsItem.cpp +21 -13
@@ 18,10 18,10 @@ namespace gui
    {
        printOptions();

        inputCallback = [&](gui::Item &item, const gui::InputEvent &event) {
            auto ret = optionSpinner->onInput(event);
        inputCallback = [&]([[maybe_unused]] gui::Item &item, const gui::InputEvent &event) {
            const auto ret = optionSpinner->onInput(event);

            if (getRRuleOption(optionSpinner->getCurrentValue()) == RRule::Custom) {
            if (isCurrentSpinnerOptionCustom()) {
                this->navBarTemporaryMode(utils::translate(style::strings::common::edit));
                if (event.isShortRelease(gui::KeyCode::KEY_LF)) {
                    this->app->switchWindow(style::alarmClock::window::name::customRepeat);


@@ 34,10 34,10 @@ namespace gui
            return ret;
        };

        focusChangedCallback = [&](Item &item) {
        focusChangedCallback = [&]([[maybe_unused]] Item &item) {
            setFocusItem(focus ? optionSpinner : nullptr);

            if (focus && (getRRuleOption(optionSpinner->getCurrentValue()) == RRule::Custom)) {
            if (focus && isCurrentSpinnerOptionCustom()) {
                this->navBarTemporaryMode(utils::translate(style::strings::common::edit));
            }
            else {


@@ 48,7 48,7 @@ namespace gui
        };

        onSaveCallback = [&]([[maybe_unused]] std::shared_ptr<AlarmEventRecord> alarm) {
            if (getRRuleOption(optionSpinner->getCurrentValue()) != RRule::Custom) {
            if (!isCurrentSpinnerOptionCustom()) {
                getPresenter()->setOption(getRRuleOption(optionSpinner->getCurrentValue()));
            }
        };


@@ 56,13 56,15 @@ namespace gui
        onLoadCallback = [&]([[maybe_unused]] std::shared_ptr<AlarmEventRecord> alarm) {
            checkCustomOption(getPresenter()->getDescription());
            optionSpinner->setCurrentValue(getPresenter()->getDescription());
            if (optionSpinner->focus && getRRuleOption(optionSpinner->getCurrentValue()) == RRule::Custom) {
                this->navBarTemporaryMode(utils::translate(style::strings::common::edit));
            }
            else {
                this->navBarRestoreFromTemporaryMode();
            }

            if (optionSpinner->focus) {
                if (isCurrentSpinnerOptionCustom()) {
                    this->navBarTemporaryMode(utils::translate(style::strings::common::edit));
                }
                else {
                    this->navBarRestoreFromTemporaryMode();
                }
            }
        };
    }



@@ 101,9 103,15 @@ namespace gui
    void AlarmRRuleOptionsItem::printOptions()
    {
        std::vector<UTF8> printOptions;
        printOptions.reserve(rRuleOptions.size());
        for (auto const &option : rRuleOptions) {
            printOptions.push_back(option.second);
        }
        optionSpinner->setData({printOptions});
        optionSpinner->setData(printOptions);
    }

    bool AlarmRRuleOptionsItem::isCurrentSpinnerOptionCustom()
    {
        return (getRRuleOption(optionSpinner->getCurrentValue()) == RRule::Custom);
    }
} /* namespace gui */

M module-apps/application-alarm-clock/widgets/AlarmRRuleOptionsItem.hpp => module-apps/application-alarm-clock/widgets/AlarmRRuleOptionsItem.hpp +7 -6
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 28,12 28,13 @@ namespace gui
        [[nodiscard]] RRule getRRuleOption(const std::string &selectedOption);
        void checkCustomOption(const std::string &selectedOption);
        void printOptions();
        bool isCurrentSpinnerOptionCustom();

      public:
        explicit AlarmRRuleOptionsItem(app::ApplicationCommon *app,
                                       const std::string &description,
                                       std::shared_ptr<app::alarmClock::AlarmRRulePresenter> presenter,
                                       std::function<void(const UTF8 &text)> navBarTemporaryMode = nullptr,
                                       std::function<void()> navBarRestoreFromTemporaryMode      = nullptr);
        AlarmRRuleOptionsItem(app::ApplicationCommon *app,
                              const std::string &description,
                              std::shared_ptr<app::alarmClock::AlarmRRulePresenter> presenter,
                              std::function<void(const UTF8 &text)> navBarTemporaryMode = nullptr,
                              std::function<void()> navBarRestoreFromTemporaryMode      = nullptr);
    };
} /* namespace gui */

M module-apps/application-alarm-clock/windows/CustomRepeatWindow.cpp => module-apps/application-alarm-clock/windows/CustomRepeatWindow.cpp +13 -5
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "CustomRepeatWindow.hpp"


@@ 10,7 10,6 @@

namespace app::alarmClock
{

    CustomRepeatWindow::CustomRepeatWindow(app::ApplicationCommon *app,
                                           std::unique_ptr<CustomRepeatWindowContract::Presenter> &&windowPresenter)
        : AppWindow(app, style::alarmClock::window::name::customRepeat), presenter{std::move(windowPresenter)}


@@ 36,19 35,28 @@ namespace app::alarmClock
                                 style::alarmClock::window::listView_h,
                                 presenter->getItemProvider(),
                                 gui::listview::ScrollBarType::None);
        list->setBoundaries(gui::Boundaries::Continuous);

        setFocusItem(list);
    }

    void CustomRepeatWindow::onClose(gui::Window::CloseReason reason)
    {
        if (reason != CloseReason::PhoneLock) {
        switch (reason) {
        case CloseReason::ApplicationClose:
        case CloseReason::WindowSwitch:
            presenter->eraseProviderData();
            break;
        default:
            break;
        }
    }

    void CustomRepeatWindow::onBeforeShow(gui::ShowMode mode, gui::SwitchData *data)
    void CustomRepeatWindow::onBeforeShow(gui::ShowMode mode, [[maybe_unused]] gui::SwitchData *data)
    {
        presenter->loadData();
        if (mode == gui::ShowMode::GUI_SHOW_INIT) {
            presenter->loadData();
        }
    }

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

M module-apps/application-alarm-clock/windows/CustomRepeatWindow.hpp => module-apps/application-alarm-clock/windows/CustomRepeatWindow.hpp +1 -2
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 25,5 25,4 @@ namespace app::alarmClock
        bool onInput(const gui::InputEvent &inputEvent) override;
        void buildInterface() override;
    };

} // namespace app::alarmClock

M module-apps/application-alarm-clock/windows/NewEditAlarmWindow.cpp => module-apps/application-alarm-clock/windows/NewEditAlarmWindow.cpp +2 -3
@@ 1,11 1,10 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "NewEditAlarmWindow.hpp"

namespace app::alarmClock
{

    NewEditAlarmWindow::NewEditAlarmWindow(app::ApplicationCommon *app,
                                           std::unique_ptr<AlarmClockEditWindowContract::Presenter> &&windowPresenter)
        : AppWindow(app, style::alarmClock::window::name::newEditAlarm), presenter{std::move(windowPresenter)}


@@ 45,7 44,7 @@ namespace app::alarmClock
        }

        if (mode == gui::ShowMode::GUI_SHOW_INIT) {
            auto rec = dynamic_cast<AlarmRecordData *>(data);
            const auto rec = dynamic_cast<AlarmRecordData *>(data);
            if (rec != nullptr) {
                alarmRecord = rec->getData();
            }

M pure_changelog.md => pure_changelog.md +2 -0
@@ 48,6 48,8 @@
* Fixed invalid elapsed time in music player after playing and pausing track from songs list view
* Fixed disappearing "Call" label in Phonebook app
* Fixed phone number input style unification
* Fixed disappearing selections when setting custom alarm after popup is shown
* Fixed alarm preview playback behavior

## [1.7.2 2023-07-28]