From a68b5bcbd6d86775394debaa7fba36ff87fc99f2 Mon Sep 17 00:00:00 2001 From: tomaszkrosnowski Date: Wed, 13 Oct 2021 15:19:23 +0200 Subject: [PATCH] [EGD-7736] Fix Play Pause labels When doing sound preview label descirbing PLAY or PAUSE action depends now on current context. --- image/assets/lang/English.json | 2 +- .../ApplicationAlarmClock.cpp | 25 +++- .../ApplicationAlarmClock.hpp | 7 ++ .../models/NewEditAlarmModel.cpp | 5 +- .../models/NewEditAlarmModel.hpp | 3 + .../widgets/AlarmMusicOptionsItem.cpp | 112 +++++------------- .../widgets/AlarmMusicOptionsItem.hpp | 20 +--- .../application-settings/CMakeLists.txt | 1 - .../ApplicationSettings.hpp | 2 +- .../models/apps/SoundsModel.cpp | 38 +++++- .../models/apps/SoundsModel.hpp | 2 +- .../windows/apps/SoundSelectWindow.cpp | 1 - .../windows/apps/SoundSelectWindow.hpp | 2 +- module-apps/apps-common/CMakeLists.txt | 1 + .../audio}/AbstractSoundsPlayer.hpp | 16 +-- .../audio}/SoundsPlayer.cpp | 11 +- .../audio}/SoundsPlayer.hpp | 6 +- module-gui/gui/widgets/Style.hpp | 1 - 18 files changed, 135 insertions(+), 120 deletions(-) rename module-apps/{application-settings/models/apps => apps-common/audio}/AbstractSoundsPlayer.hpp (74%) rename module-apps/{application-settings/models/apps => apps-common/audio}/SoundsPlayer.cpp (88%) rename module-apps/{application-settings/models/apps => apps-common/audio}/SoundsPlayer.hpp (82%) diff --git a/image/assets/lang/English.json b/image/assets/lang/English.json index 62755dc8c19d6fa3e7ee92d2aa48af793d45749e..3d708e0eb870f44814814ce2c8b3523c79a7accf 100644 --- a/image/assets/lang/English.json +++ b/image/assets/lang/English.json @@ -30,6 +30,7 @@ "common_stop": "STOP", "common_resume": "RESUME", "common_pause": "PAUSE", + "common_play": "PLAY", "common_retry": "TRY AGAIN", "common_replace": "REPLACE", "common_abort": "ABORT", @@ -37,7 +38,6 @@ "common_disconnect": "DISCONNECT", "common_forget": "FORGET", "common_adjust": "ADJUST", - "common_play_pause": "PLAY/PAUSE", "common_mo": "MO", "common_tu": "TU", "common_we": "WE", diff --git a/module-apps/application-alarm-clock/ApplicationAlarmClock.cpp b/module-apps/application-alarm-clock/ApplicationAlarmClock.cpp index 890e479955f0f9c51a342f0fb8033ed0feeed658..11ab4199982091f12cc6552895580c7cb697270f 100644 --- a/module-apps/application-alarm-clock/ApplicationAlarmClock.cpp +++ b/module-apps/application-alarm-clock/ApplicationAlarmClock.cpp @@ -14,6 +14,7 @@ #include #include #include +#include namespace app { @@ -23,9 +24,11 @@ namespace app StatusIndicators statusIndicators, uint32_t stackDepth, sys::ServicePriority priority) - : Application(name, parent, statusIndicators, false, stackDepth, priority) + : Application(name, parent, statusIndicators, false, stackDepth, priority), + soundsPlayer{std::make_shared(this)} { bus.channels.push_back(sys::BusChannel::ServiceDBNotifications); + bus.channels.push_back(sys::BusChannel::ServiceAudioNotifications); } sys::MessagePointer ApplicationAlarmClock::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) @@ -57,6 +60,16 @@ namespace app return ret; } + connect(typeid(AudioStopNotification), [&](sys::Message *msg) -> sys::MessagePointer { + auto notification = static_cast(msg); + return handleAudioStop(notification); + }); + + connect(typeid(AudioEOFNotification), [&](sys::Message *msg) -> sys::MessagePointer { + auto notification = static_cast(msg); + return handleAudioStop(notification); + }); + createUserInterface(); return ret; } @@ -73,10 +86,10 @@ namespace app auto rRulePresenter = std::make_shared(); windowsFactory.attach(style::alarmClock::window::name::newEditAlarm, - [rRulePresenter](ApplicationCommon *app, const std::string &name) { + [this, rRulePresenter](ApplicationCommon *app, const std::string &name) { auto alarmsRepository = std::make_unique(app); auto alarmsProvider = std::make_shared( - app, rRulePresenter, std::move(alarmsRepository)); + app, soundsPlayer, rRulePresenter, std::move(alarmsRepository)); auto presenter = std::make_unique(alarmsProvider); return std::make_unique(app, std::move(presenter)); @@ -109,4 +122,10 @@ namespace app void ApplicationAlarmClock::destroyUserInterface() {} + sys::MessagePointer ApplicationAlarmClock::handleAudioStop(AudioStopNotification *notification) + { + soundsPlayer->stop(notification->token); + return sys::MessageNone{}; + } + } /* namespace app */ diff --git a/module-apps/application-alarm-clock/ApplicationAlarmClock.hpp b/module-apps/application-alarm-clock/ApplicationAlarmClock.hpp index 2db4e0674114939464d05ea37c10633eba80ff1e..dab709228c9d8ad90ead2b56c96862b899d6c233 100644 --- a/module-apps/application-alarm-clock/ApplicationAlarmClock.hpp +++ b/module-apps/application-alarm-clock/ApplicationAlarmClock.hpp @@ -3,6 +3,9 @@ #pragma once #include "Application.hpp" +#include + +class AudioStopNotification; namespace app { @@ -29,6 +32,10 @@ namespace app void createUserInterface() override; void destroyUserInterface() override; + + private: + sys::MessagePointer handleAudioStop(AudioStopNotification *notification); + std::shared_ptr soundsPlayer; }; template <> struct ManifestTraits diff --git a/module-apps/application-alarm-clock/models/NewEditAlarmModel.cpp b/module-apps/application-alarm-clock/models/NewEditAlarmModel.cpp index 7f6909ca198db3a06d5e354622ccc29027b70ffc..8a7ad874b6abed4be80597013ca57b705613e4ef 100644 --- a/module-apps/application-alarm-clock/models/NewEditAlarmModel.cpp +++ b/module-apps/application-alarm-clock/models/NewEditAlarmModel.cpp @@ -15,9 +15,11 @@ namespace app::alarmClock { NewEditAlarmModel::NewEditAlarmModel(app::ApplicationCommon *app, + std::shared_ptr player, std::shared_ptr rRulePresenter, std::shared_ptr alarmsRepository) - : application(app), alarmsRepository{std::move(alarmsRepository)}, rRulePresenter(rRulePresenter) + : application(app), alarmsRepository{std::move(alarmsRepository)}, soundsPlayer(player), + rRulePresenter(rRulePresenter) {} unsigned int NewEditAlarmModel::requestRecordsCount() @@ -53,6 +55,7 @@ namespace app::alarmClock internalData.push_back(new gui::AlarmMusicOptionsItem( application, utils::translate("app_alarm_clock_sound"), + soundsPlayer, [app](const UTF8 &text) { app->getCurrentWindow()->bottomBarTemporaryMode(text, false); }, [app]() { app->getCurrentWindow()->bottomBarRestoreFromTemporaryMode(); })); diff --git a/module-apps/application-alarm-clock/models/NewEditAlarmModel.hpp b/module-apps/application-alarm-clock/models/NewEditAlarmModel.hpp index 111dfeb1581b6559647fe8adb961d64ccac8caa5..eb22a57f1b4f0c29b10a70a8941b251f8d13f9b5 100644 --- a/module-apps/application-alarm-clock/models/NewEditAlarmModel.hpp +++ b/module-apps/application-alarm-clock/models/NewEditAlarmModel.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -30,11 +31,13 @@ namespace app::alarmClock { app::ApplicationCommon *application = nullptr; std::shared_ptr alarmsRepository; + std::shared_ptr soundsPlayer = nullptr; std::shared_ptr rRulePresenter; gui::AlarmInternalListItem *repeatOption = nullptr; public: NewEditAlarmModel(app::ApplicationCommon *app, + std::shared_ptr player, std::shared_ptr rRulePresenter, std::shared_ptr alarmsRepository); diff --git a/module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.cpp b/module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.cpp index b5ea85ed903bf1f3c6150cf2459e5cbc0a54a3e6..e2c3293d2502d3936288c794b0c9a04cdfb0943e 100644 --- a/module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.cpp +++ b/module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.cpp @@ -10,6 +10,7 @@ namespace gui { AlarmMusicOptionsItem::AlarmMusicOptionsItem(app::ApplicationCommon *app, const std::string &description, + std::shared_ptr player, std::function bottomBarTemporaryMode, std::function bottomBarRestoreFromTemporaryMode) : AlarmOptionsItem(description), bottomBarTemporaryMode(std::move(bottomBarTemporaryMode)), @@ -17,9 +18,6 @@ namespace gui { assert(app != nullptr); - // create audioOperations to allow sounds preview - audioOperations = std::make_unique(app); - alarmSoundList = getMusicFilesList(); std::vector printOptions; for (const auto &musicFile : getMusicFilesList()) { @@ -27,51 +25,65 @@ namespace gui } optionSpinner->setData({printOptions}); - inputCallback = [&](gui::Item &item, const gui::InputEvent &event) { + inputCallback = [=](gui::Item &item, const gui::InputEvent &event) { if (event.isShortRelease(gui::KeyCode::KEY_LF)) { - if (getFilePath(optionSpinner->getCurrentValue()) != currentlyPreviewedPath) { - playAudioPreview(getFilePath(optionSpinner->getCurrentValue())); + if (!player->previouslyPlayed(getFilePath(optionSpinner->getCurrentValue())) || + player->isInState(SoundsPlayer::State::Stopped)) { + player->play(getFilePath(optionSpinner->getCurrentValue()), [=]() { + this->bottomBarTemporaryMode(utils::translate(style::strings::common::play)); + }); + this->bottomBarTemporaryMode(utils::translate(style::strings::common::pause)); } - else if (musicStatus == MusicStatus::Stop) { - resumeAudioPreview(); + else if (player->isInState(SoundsPlayer::State::Paused)) { + player->resume(); + this->bottomBarTemporaryMode(utils::translate(style::strings::common::pause)); } else { - pauseAudioPreview(); + player->pause(); + this->bottomBarTemporaryMode(utils::translate(style::strings::common::play)); } } // stop preview playback when we go back - if (musicStatus == MusicStatus::Play && event.isShortRelease(gui::KeyCode::KEY_RF)) { - stopAudioPreview(); + if (player->isInState(SoundsPlayer::State::Playing) && event.isShortRelease(gui::KeyCode::KEY_RF)) { + player->stop(); + } + auto res = optionSpinner->onInput(event); + + if (res && player->previouslyPlayed(getFilePath(optionSpinner->getCurrentValue())) && + player->isInState(SoundsPlayer::State::Playing)) { + this->bottomBarTemporaryMode(utils::translate(style::strings::common::pause)); + } + else if (res) { + this->bottomBarTemporaryMode(utils::translate(style::strings::common::play)); } - return optionSpinner->onInput(event); + return res; }; - focusChangedCallback = [&](Item &item) { + focusChangedCallback = [=](Item &item) { setFocusItem(focus ? optionSpinner : nullptr); if (focus) { - this->bottomBarTemporaryMode(utils::translate(style::strings::common::play_pause)); + this->bottomBarTemporaryMode(utils::translate(style::strings::common::play)); } else { this->bottomBarRestoreFromTemporaryMode(); } // stop preview playback when we loose focus - if (musicStatus != MusicStatus::Stop) { - stopAudioPreview(); + if (!player->isInState(SoundsPlayer::State::Stopped)) { + player->stop(); } return true; }; - onSaveCallback = [&](std::shared_ptr alarm) { + onSaveCallback = [=](std::shared_ptr alarm) { // stop preview playback if it is played - if (musicStatus != MusicStatus::Stop) { - stopAudioPreview(); + if (!player->isInState(SoundsPlayer::State::Stopped)) { + player->stop(); } - alarm->musicTone = getFilePath(optionSpinner->getCurrentValue()); }; @@ -97,66 +109,6 @@ namespace gui return musicFiles; } - bool AlarmMusicOptionsItem::playAudioPreview(const std::string &path) - { - return audioOperations->play(path, [this, path](audio::RetCode retCode, audio::Token token) { - if (retCode != audio::RetCode::Success || !token.IsValid()) { - LOG_ERROR("Audio preview callback failed with retcode = %s. Token validity: %d", - str(retCode).c_str(), - token.IsValid()); - return; - } - musicStatus = MusicStatus::Play; - currentlyPreviewedToken = token; - currentlyPreviewedPath = path; - }); - } - - bool AlarmMusicOptionsItem::pauseAudioPreview() - { - return audioOperations->pause(currentlyPreviewedToken, [this](audio::RetCode retCode, audio::Token token) { - if (token != currentlyPreviewedToken) { - LOG_ERROR("Audio preview pause failed: wrong token"); - return; - } - if (retCode != audio::RetCode::Success || !token.IsValid()) { - LOG_ERROR("Audio preview pause failed with retcode = %s. Token validity: %d", - str(retCode).c_str(), - token.IsValid()); - return; - } - musicStatus = MusicStatus::Pause; - }); - } - - bool AlarmMusicOptionsItem::resumeAudioPreview() - { - return audioOperations->resume(currentlyPreviewedToken, [this](audio::RetCode retCode, audio::Token token) { - if (token != currentlyPreviewedToken) { - LOG_ERROR("Audio preview resume failed: wrong token"); - return; - } - - if (retCode != audio::RetCode::Success || !token.IsValid()) { - LOG_ERROR("Audio preview pause failed with retcode = %s. Token validity: %d", - str(retCode).c_str(), - token.IsValid()); - return; - } - musicStatus = MusicStatus::Play; - }); - } - - bool AlarmMusicOptionsItem::stopAudioPreview() - { - if (currentlyPreviewedToken.IsValid()) { - musicStatus = MusicStatus::Stop; - currentlyPreviewedPath = ""; - return audioOperations->stop(currentlyPreviewedToken, [](audio::RetCode, audio::Token) {}); - } - return false; - } - std::string AlarmMusicOptionsItem::getTitle(const std::string &filePath) { for (const auto &musicFile : alarmSoundList) { diff --git a/module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.hpp b/module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.hpp index a3cba678ec7c5041679136f350470585b4af69f3..9b58e63295bb345cc84293d6f0ef40dfb0f03055 100644 --- a/module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.hpp +++ b/module-apps/application-alarm-clock/widgets/AlarmMusicOptionsItem.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include namespace gui @@ -15,38 +16,23 @@ namespace gui class AlarmMusicOptionsItem : public AlarmOptionsItem { private: - enum class MusicStatus - { - Stop, - Pause, - Play - }; - std::function bottomBarTemporaryMode = nullptr; std::function bottomBarRestoreFromTemporaryMode = nullptr; /// pointer to audio operations which allows to make audio preview - std::unique_ptr audioOperations; std::vector alarmSoundList; - MusicStatus musicStatus = MusicStatus::Stop; - audio::Token currentlyPreviewedToken; - std::string currentlyPreviewedPath; - std::vector getMusicFilesList(); public: explicit AlarmMusicOptionsItem(app::ApplicationCommon *app, const std::string &description, + std::shared_ptr player, std::function bottomBarTemporaryMode = nullptr, std::function bottomBarRestoreFromTemporaryMode = nullptr); private: [[nodiscard]] std::string getTitle(const std::string &filePath); [[nodiscard]] std::string getFilePath(const std::string &title); - bool playAudioPreview(const std::string &path); - bool pauseAudioPreview(); - bool resumeAudioPreview(); - bool stopAudioPreview(); }; -} /* namespace gui */ \ No newline at end of file +} /* namespace gui */ diff --git a/module-apps/application-settings/CMakeLists.txt b/module-apps/application-settings/CMakeLists.txt index 82022092f641be545d09134a1abdbbf3d8d27405..dd760b842bc4d4cc9e0292e84a4e441999186d7b 100644 --- a/module-apps/application-settings/CMakeLists.txt +++ b/module-apps/application-settings/CMakeLists.txt @@ -15,7 +15,6 @@ target_sources(application-settings models/apps/AudioSettingsModel.cpp models/apps/SoundsModel.cpp models/apps/SoundsModel.cpp - models/apps/SoundsPlayer.cpp models/bluetooth/BluetoothSettingsModel.cpp models/display-keypad/CategoriesModel.cpp models/display-keypad/CategoriesModel.cpp diff --git a/module-apps/application-settings/include/application-settings/ApplicationSettings.hpp b/module-apps/application-settings/include/application-settings/ApplicationSettings.hpp index 05b815868bdd06c41c3b2e515fde4a798c2ea113..a8dff84d494d896948c6a7e5eaa2d25fb741d31d 100644 --- a/module-apps/application-settings/include/application-settings/ApplicationSettings.hpp +++ b/module-apps/application-settings/include/application-settings/ApplicationSettings.hpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include #include diff --git a/module-apps/application-settings/models/apps/SoundsModel.cpp b/module-apps/application-settings/models/apps/SoundsModel.cpp index d233b9a3653525b17036e5ce9493699ff2ba91c9..057e007eb6ffcc3341839d04834bcb828feffc65 100644 --- a/module-apps/application-settings/models/apps/SoundsModel.cpp +++ b/module-apps/application-settings/models/apps/SoundsModel.cpp @@ -139,12 +139,21 @@ void SoundsModel::applyItems(const std::vector &sounds, else if (event.isShortRelease(gui::KeyCode::KEY_LF)) { if (!soundsPlayer->previouslyPlayed(fileRelativePath) || soundsPlayer->isInState(AbstractSoundsPlayer::State::Stopped)) { - return soundsPlayer->play(fileRelativePath); + app->getCurrentWindow()->bottomBarTemporaryMode( + utils::translate(style::strings::common::pause), gui::BottomBar::Side::LEFT, false); + return soundsPlayer->play(fileRelativePath, [=]() { + app->getCurrentWindow()->bottomBarTemporaryMode( + utils::translate(style::strings::common::play), gui::BottomBar::Side::LEFT, false); + }); } else if (soundsPlayer->isInState(AbstractSoundsPlayer::State::Playing)) { + app->getCurrentWindow()->bottomBarTemporaryMode( + utils::translate(style::strings::common::play), gui::BottomBar::Side::LEFT, false); return soundsPlayer->pause(); } else if (soundsPlayer->isInState(AbstractSoundsPlayer::State::Paused)) { + app->getCurrentWindow()->bottomBarTemporaryMode( + utils::translate(style::strings::common::pause), gui::BottomBar::Side::LEFT, false); return soundsPlayer->resume(); } } @@ -152,6 +161,33 @@ void SoundsModel::applyItems(const std::vector &sounds, return false; }; + item->focusChangedCallback = [=](gui::Item &item) { + if (!item.focus) { + app->getCurrentWindow()->bottomBarRestoreFromTemporaryMode(); + return true; + } + + auto fileRelativePath = sound.lexically_relative(purefs::dir::getCurrentOSPath()); + if (!soundsPlayer->previouslyPlayed(fileRelativePath)) { + app->getCurrentWindow()->bottomBarTemporaryMode( + utils::translate(style::strings::common::play), gui::BottomBar::Side::LEFT, false); + return true; + } + + if (soundsPlayer->isInState(AbstractSoundsPlayer::State::Playing)) { + app->getCurrentWindow()->bottomBarTemporaryMode( + utils::translate(style::strings::common::pause), gui::BottomBar::Side::LEFT, false); + return true; + } + + else { + app->getCurrentWindow()->bottomBarTemporaryMode( + utils::translate(style::strings::common::play), gui::BottomBar::Side::LEFT, false); + return true; + } + + return false; + }; break; default: diff --git a/module-apps/application-settings/models/apps/SoundsModel.hpp b/module-apps/application-settings/models/apps/SoundsModel.hpp index c45e296e1c39fe3c30a04f5df426836d64beaf4a..c29304104c907a43d8994dfc75164128eb530c65 100644 --- a/module-apps/application-settings/models/apps/SoundsModel.hpp +++ b/module-apps/application-settings/models/apps/SoundsModel.hpp @@ -4,7 +4,7 @@ #pragma once #include "AbstractSoundsModel.hpp" -#include "AbstractSoundsPlayer.hpp" +#include #include #include