From a9f87c6dc795f2c65b03a6e00b3a6c660d049c9d Mon Sep 17 00:00:00 2001 From: Tomasz Rybarski Date: Fri, 25 Mar 2022 10:39:17 +0100 Subject: [PATCH] [BH-1433] Meditation Timer Gong Volume Chime Volume Model implementation --- .../MeditationTimer.cpp | 6 ++-- .../data/Contract.hpp | 1 + .../data/MeditationCommon.hpp | 1 + .../MeditationTimer.hpp | 2 ++ .../models/ChimeVolume.cpp | 15 ++++++-- .../models/ChimeVolume.hpp | 10 ++++-- .../presenter/SettingsPresenter.cpp | 35 +++++++++++++++++-- .../presenter/SettingsPresenter.hpp | 8 ++++- .../presenter/StatisticsPresenter.cpp | 3 ++ .../presenter/StatisticsPresenter.hpp | 1 + .../windows/MeditationRunningWindow.cpp | 3 +- .../windows/SettingsWindow.cpp | 3 ++ .../common/models/AbstractAudioModel.hpp | 3 +- .../BellHybrid/apps/common/src/AudioModel.cpp | 2 ++ 14 files changed, 80 insertions(+), 13 deletions(-) diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/MeditationTimer.cpp b/products/BellHybrid/apps/application-bell-meditation-timer/MeditationTimer.cpp index 5ee44099e1238271a9126f07835c8e4447c6b339..266a610817234f80da1007e7d4e6f60e2ed826e6 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/MeditationTimer.cpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/MeditationTimer.cpp @@ -18,6 +18,7 @@ #include "presenter/StatisticsPresenter.hpp" #include +#include #include #include @@ -38,8 +39,9 @@ namespace app return ret; } + audioModel = std::make_unique(this); chimeIntervalModel = std::make_unique(this); - chimeVolumeModel = std::make_unique(this); + chimeVolumeModel = std::make_unique(*audioModel); startDelayModel = std::make_unique(this); createUserInterface(); @@ -58,7 +60,7 @@ namespace app windowsFactory.attach(meditation::SettingsWindow::name, [this](ApplicationCommon *app, const std::string &name) { auto presenter = std::make_unique( - app, *chimeIntervalModel, *chimeVolumeModel, *startDelayModel); + app, *chimeIntervalModel, *chimeVolumeModel, *startDelayModel, *audioModel); return std::make_unique(app, std::move(presenter)); }); diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/data/Contract.hpp b/products/BellHybrid/apps/application-bell-meditation-timer/data/Contract.hpp index a51066d42f936a9f2389cd8e2e27bd23aed75b95..c301bfb161cf0cc9a0830f2e4a94b428ad8a7279 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/data/Contract.hpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/data/Contract.hpp @@ -23,5 +23,6 @@ namespace app::meditation::contract virtual void saveData() = 0; virtual void eraseProviderData() = 0; virtual void handleEnter() = 0; + virtual void exitWithoutSave() = 0; }; } // namespace app::meditation::contract diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/data/MeditationCommon.hpp b/products/BellHybrid/apps/application-bell-meditation-timer/data/MeditationCommon.hpp index 05ba03cb14642cfe066f9f3844e6aa49d80d2af6..8c8cb3146d87ea929473655199c1a9048dfef5c2 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/data/MeditationCommon.hpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/data/MeditationCommon.hpp @@ -13,4 +13,5 @@ namespace app::meditation }; // namespace windows constexpr auto meditationDBRecordName = "MeditationTimer"; + inline constexpr auto meditationAudioPath = "assets/audio/meditation/Meditation_Gong.mp3"; } // namespace app::meditation diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/include/application-bell-meditation-timer/MeditationTimer.hpp b/products/BellHybrid/apps/application-bell-meditation-timer/include/application-bell-meditation-timer/MeditationTimer.hpp index 04004966e79e18df2d726c40602bf96dc8f119d5..9bac0f5fde87b470c509f30c2b971f771f47f1cc 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/include/application-bell-meditation-timer/MeditationTimer.hpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/include/application-bell-meditation-timer/MeditationTimer.hpp @@ -4,6 +4,7 @@ #pragma once #include +#include namespace app::meditation::models { @@ -43,6 +44,7 @@ namespace app std::unique_ptr chimeIntervalModel; std::unique_ptr chimeVolumeModel; std::unique_ptr startDelayModel; + std::unique_ptr audioModel; }; template <> struct ManifestTraits diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/models/ChimeVolume.cpp b/products/BellHybrid/apps/application-bell-meditation-timer/models/ChimeVolume.cpp index be4bfc99db88fd7e2ea9c2faed0b08e51bb92c9b..7edc6ddd3bbd1c157e51391f026bc321a5b5e715 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/models/ChimeVolume.cpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/models/ChimeVolume.cpp @@ -8,11 +8,20 @@ namespace app::meditation::models void ChimeVolume::setValue(std::uint8_t value) { - /// Dummy implementation. + audioModel.setVolume(value, AbstractAudioModel::PlaybackType::Meditation, {}); } std::uint8_t ChimeVolume::getValue() const { - /// Dummy implementation - return 5; + return defaultValue; + } + + void ChimeVolume::restoreDefault() + { + setValue(defaultValue); + } + + ChimeVolume::ChimeVolume(AbstractAudioModel &audioModel) : audioModel{audioModel} + { + defaultValue = audioModel.getVolume(AbstractAudioModel::PlaybackType::Meditation).value_or(0); } } // namespace app::meditation::models diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/models/ChimeVolume.hpp b/products/BellHybrid/apps/application-bell-meditation-timer/models/ChimeVolume.hpp index 021f38ae08c421379aa332af23dbbd5dc939a2ba..7adcf5e88993412c72ca9d9721c21370834aa271 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/models/ChimeVolume.hpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/models/ChimeVolume.hpp @@ -4,15 +4,21 @@ #pragma once #include +#include namespace app::meditation::models { - class ChimeVolume : public gui::SettingsModel + class ChimeVolume : public gui::AbstractSettingsModel { public: - using SettingsModel::SettingsModel; + explicit ChimeVolume(AbstractAudioModel &audioModel); void setValue(std::uint8_t value) override; std::uint8_t getValue() const override; + void restoreDefault() override; + + private: + AbstractAudioModel &audioModel; + std::uint8_t defaultValue; }; } // namespace app::meditation::models diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/presenter/SettingsPresenter.cpp b/products/BellHybrid/apps/application-bell-meditation-timer/presenter/SettingsPresenter.cpp index fc3c642c7f20201094fe01cbdaa696dddee8f175..f7c21d484eabf85413a36cb992b0fd8619513aff 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/presenter/SettingsPresenter.cpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/presenter/SettingsPresenter.cpp @@ -3,6 +3,7 @@ #include "SettingsPresenter.hpp" #include "MeditationMainWindow.hpp" +#include "MeditationCommon.hpp" #include "models/ChimeInterval.hpp" #include "models/ChimeVolume.hpp" @@ -60,10 +61,12 @@ namespace app::meditation SettingsPresenter::SettingsPresenter(app::ApplicationCommon *app, models::ChimeInterval &chimeIntervalModel, models::ChimeVolume &chimeVolumeModel, - models::StartDelay &startDelayModel) + models::StartDelay &startDelayModel, + AbstractAudioModel &audioModel) : application{app}, chimeIntervalModel{chimeIntervalModel}, chimeVolumeModel{chimeVolumeModel}, - startDelayModel{startDelayModel} + startDelayModel{startDelayModel}, audioModel{audioModel} { + auto chimeInterval = new list_items::Fraction{list_items::Fraction::spinner_type::range{{1, 1}, {1, 2}, {1, 3}, {1, 4}}, chimeIntervalModel, @@ -82,6 +85,23 @@ namespace app::meditation listItemsProvider = std::make_shared(BellListItemProvider::Items{startDelay, chimeInterval, chimeVolume}); + chimeVolume->onEnter = [this]() { + this->audioModel.play(purefs::dir::getCurrentOSPath() / meditationAudioPath, + AbstractAudioModel::PlaybackType::Meditation, + {}); + }; + + chimeVolume->onExit = [this]() { stopSound(); }; + + chimeVolume->set_on_value_change_cb([this](const auto &val) { + this->audioModel.setVolume(val, AbstractAudioModel::PlaybackType::Meditation, {}); + if (this->audioModel.hasPlaybackFinished()) { + this->audioModel.play(purefs::dir::getCurrentOSPath() / meditationAudioPath, + AbstractAudioModel::PlaybackType::Meditation, + {}); + } + }); + for (auto &item : listItemsProvider->getListItems()) { item->setValue(); } @@ -94,6 +114,7 @@ namespace app::meditation } void SettingsPresenter::saveData() { + stopSound(); for (auto &item : listItemsProvider->getListItems()) { item->getValue(); } @@ -114,4 +135,14 @@ namespace app::meditation BellFinishedWindowData::Factory::create("circle_success_big", MeditationMainWindow::defaultName)); } + void SettingsPresenter::stopSound() + { + audioModel.stopPlayedByThis({}); + } + + void SettingsPresenter::exitWithoutSave() + { + chimeVolumeModel.restoreDefault(); + } + } // namespace app::meditation diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/presenter/SettingsPresenter.hpp b/products/BellHybrid/apps/application-bell-meditation-timer/presenter/SettingsPresenter.hpp index 0e4cba833676da77dfd45de4d59d63953ada8698..0ad7a265631b6c82bab0a139eb018b5a1c713b7e 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/presenter/SettingsPresenter.hpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/presenter/SettingsPresenter.hpp @@ -5,6 +5,8 @@ #include "data/Contract.hpp" #include +#include +#include #include namespace app @@ -27,18 +29,22 @@ namespace app::meditation SettingsPresenter(app::ApplicationCommon *app, models::ChimeInterval &chimeIntervalModel, models::ChimeVolume &chimeVolumeModel, - models::StartDelay &startDelayModel); + models::StartDelay &startDelayModel, + AbstractAudioModel &audioModel); void loadData() override; void saveData() override; auto getPagesProvider() const -> std::shared_ptr override; void eraseProviderData() override; void handleEnter() override; + void exitWithoutSave() override; private: + void stopSound(); ApplicationCommon *application{}; models::ChimeInterval &chimeIntervalModel; models::ChimeVolume &chimeVolumeModel; models::StartDelay &startDelayModel; + AbstractAudioModel &audioModel; std::shared_ptr listItemsProvider; }; } // namespace app::meditation diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/presenter/StatisticsPresenter.cpp b/products/BellHybrid/apps/application-bell-meditation-timer/presenter/StatisticsPresenter.cpp index 080dd9ebbe75a72d7bde8e45b62b3d97f5038837..c11cdc8e88810b1e843b53a02b39110c70ff1880 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/presenter/StatisticsPresenter.cpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/presenter/StatisticsPresenter.cpp @@ -19,4 +19,7 @@ namespace app::meditation } void StatisticsPresenter::handleEnter() {} + + void StatisticsPresenter::exitWithoutSave() + {} } // namespace app::meditation diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/presenter/StatisticsPresenter.hpp b/products/BellHybrid/apps/application-bell-meditation-timer/presenter/StatisticsPresenter.hpp index 9bf6567cd7a269897f5caa7ef2b56cd977b25bef..6dc3c319c707a8deb292f84ad6c9731cee12bbf4 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/presenter/StatisticsPresenter.hpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/presenter/StatisticsPresenter.hpp @@ -17,6 +17,7 @@ namespace app::meditation void saveData() override; void eraseProviderData() override; void handleEnter() override; + void exitWithoutSave() override; private: }; diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp b/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp index 076aa36a39b8959cdaca360f9c3cdf04c4276d96..0edc39328a51676d44bcbdc929964932878414ac 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp @@ -16,7 +16,6 @@ namespace inline constexpr auto meditationProgressTimerName = "MeditationProgressTimer"; inline constexpr std::chrono::seconds baseTick{1}; inline constexpr auto meditationProgressMode = app::ProgressCountdownMode::Increasing; - inline constexpr auto meditationAudioPath = "assets/audio/meditation/Meditation_Gong.mp3"; using namespace app::meditationStyle; @@ -187,7 +186,7 @@ namespace gui void MeditationRunningWindow::playGong() { auto msg = std::make_shared( - purefs::dir::getCurrentOSPath() / meditationAudioPath, audio::PlaybackType::Meditation); + purefs::dir::getCurrentOSPath() / app::meditation::meditationAudioPath, audio::PlaybackType::Meditation); application->bus.sendUnicast(std::move(msg), service::audioServiceName); } } // namespace gui diff --git a/products/BellHybrid/apps/application-bell-meditation-timer/windows/SettingsWindow.cpp b/products/BellHybrid/apps/application-bell-meditation-timer/windows/SettingsWindow.cpp index d27747890d04591593d097e723e9bbc0ea5a628e..ac3d0f89f22a6bbc3b2644fcda9967d7adda4078 100644 --- a/products/BellHybrid/apps/application-bell-meditation-timer/windows/SettingsWindow.cpp +++ b/products/BellHybrid/apps/application-bell-meditation-timer/windows/SettingsWindow.cpp @@ -56,6 +56,9 @@ namespace app::meditation presenter->handleEnter(); return true; } + if (inputEvent.isShortRelease(KeyCode::KEY_RF)) { + presenter->exitWithoutSave(); + } return AppWindow::onInput(inputEvent); } diff --git a/products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp b/products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp index d0c07f93b94bbd15841c146a4f59d04ff04782a1..1fd28a3e5624b93b04821165c4e28aa0eb6f52ee 100644 --- a/products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp +++ b/products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp @@ -28,7 +28,8 @@ namespace app Snooze, Alarm, PreWakeup, - Bedtime + Bedtime, + Meditation }; virtual ~AbstractAudioModel() noexcept = default; diff --git a/products/BellHybrid/apps/common/src/AudioModel.cpp b/products/BellHybrid/apps/common/src/AudioModel.cpp index dd06af48d7d84c3e26bf7ce8587688c5471b8006..69cd72c7e827633b982844d1134e64ea9864532c 100644 --- a/products/BellHybrid/apps/common/src/AudioModel.cpp +++ b/products/BellHybrid/apps/common/src/AudioModel.cpp @@ -22,6 +22,8 @@ namespace return audio::PlaybackType::PreWakeUp; case Type::Bedtime: return audio::PlaybackType::Bedtime; + case Type::Meditation: + return audio::PlaybackType::Meditation; default: return audio::PlaybackType::Alarm; }