From 79cbe1517e981ea21596d850ecec1e791266e718 Mon Sep 17 00:00:00 2001 From: tomaszkrosnowski Date: Thu, 22 Jul 2021 19:56:16 +0200 Subject: [PATCH] [EGD-7165] Stop playing music when leaving MP When Music Player (MP) app is closed the currently played track should be stopped so the music is no longer heard by user. --- .../ApplicationMusicPlayer.cpp | 22 ++++++++++++++----- .../ApplicationMusicPlayer.hpp | 2 +- .../presenters/SongsPresenter.cpp | 19 ++++++++++++++++ .../presenters/SongsPresenter.hpp | 4 ++++ .../locks/handlers/LockPolicyHandler.hpp | 3 +-- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/module-apps/application-music-player/ApplicationMusicPlayer.cpp b/module-apps/application-music-player/ApplicationMusicPlayer.cpp index 4c9b020e0ced4c2b7843e134c6a6ec4ac80c44f4..d2c1bb9955cfedbf20375f1b3fdb1a6394aec331 100644 --- a/module-apps/application-music-player/ApplicationMusicPlayer.cpp +++ b/module-apps/application-music-player/ApplicationMusicPlayer.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -45,13 +46,23 @@ namespace app priv->songsPresenter = std::make_unique(priv->songsModel, std::move(audioOperations)); - std::function stateLockCallback = [this]() -> bool { - auto isTrackPlaying = priv->songsModel->isSongPlaying(); - if (isTrackPlaying) { + // callback used when playing state is changed + using SongState = music_player::SongsModelInterface::SongState; + std::function autolockCallback = [this](SongState isPlaying) { + if (isPlaying == SongState::Playing) { LOG_DEBUG("Preventing autolock while playing track."); + lockPolicyHandler.set(locks::AutoLockPolicy::DetermineByAppState); + } + else { + LOG_DEBUG("Autolock reenabled because track is no longer playing."); + lockPolicyHandler.set(locks::AutoLockPolicy::DetermineByWindow); + app::manager::Controller::preventBlockingDevice(this); } - return isTrackPlaying; }; + priv->songsPresenter->setPlayingStateCallback(std::move(autolockCallback)); + + // callback used when track is not played and we are in DetermineByAppState + std::function stateLockCallback = []() -> bool { return true; }; lockPolicyHandler.setPreventsAutoLockByStateCallback(std::move(stateLockCallback)); } @@ -91,7 +102,8 @@ namespace app sys::ReturnCodes ApplicationMusicPlayer::DeinitHandler() { - return sys::ReturnCodes::Success; + priv->songsPresenter->stop(); + return Application::DeinitHandler(); } void ApplicationMusicPlayer::createUserInterface() diff --git a/module-apps/application-music-player/include/application-music-player/ApplicationMusicPlayer.hpp b/module-apps/application-music-player/include/application-music-player/ApplicationMusicPlayer.hpp index f6e5b34d8b0be81ed9b90b042aef532d0422f4f1..68cfbb91acaf12870565d402e8008bca02994911 100644 --- a/module-apps/application-music-player/include/application-music-player/ApplicationMusicPlayer.hpp +++ b/module-apps/application-music-player/include/application-music-player/ApplicationMusicPlayer.hpp @@ -65,7 +65,7 @@ namespace app static auto GetManifest() -> manager::ApplicationManifest { return {{manager::actions::Launch, manager::actions::PhoneModeChanged}, - locks::AutoLockPolicy::DetermineByAppState}; + locks::AutoLockPolicy::DetermineByWindow}; } }; } /* namespace app */ diff --git a/module-apps/application-music-player/presenters/SongsPresenter.cpp b/module-apps/application-music-player/presenters/SongsPresenter.cpp index 7fb673e7a46474623c7b523de0af6267eb07b7fa..5983983b3f705ada83a5d1a0b404804d10e088a5 100644 --- a/module-apps/application-music-player/presenters/SongsPresenter.cpp +++ b/module-apps/application-music-player/presenters/SongsPresenter.cpp @@ -25,6 +25,10 @@ namespace app::music_player bool SongsPresenter::play(const std::string &filePath) { songsModelInterface->setCurrentSongState(SongState::Playing); + if (changePlayingStateCallback != nullptr) { + changePlayingStateCallback(SongState::Playing); + } + return audioOperations->play(filePath, [this](audio::Token token) { songsModelInterface->setCurrentFileToken(token); }); } @@ -34,6 +38,9 @@ namespace app::music_player auto currentFileToken = songsModelInterface->getCurrentFileToken(); if (currentFileToken) { songsModelInterface->setCurrentSongState(SongState::NotPlaying); + if (changePlayingStateCallback != nullptr) { + changePlayingStateCallback(SongState::NotPlaying); + } return audioOperations->pause(currentFileToken.value()); } return false; @@ -44,6 +51,9 @@ namespace app::music_player auto currentFileToken = songsModelInterface->getCurrentFileToken(); if (currentFileToken) { songsModelInterface->setCurrentSongState(SongState::Playing); + if (changePlayingStateCallback != nullptr) { + changePlayingStateCallback(SongState::Playing); + } return audioOperations->resume(currentFileToken.value()); } return false; @@ -54,6 +64,10 @@ namespace app::music_player auto currentFileToken = songsModelInterface->getCurrentFileToken(); if (currentFileToken) { songsModelInterface->setCurrentSongState(SongState::NotPlaying); + if (changePlayingStateCallback != nullptr) { + changePlayingStateCallback(SongState::NotPlaying); + } + return audioOperations->stop(currentFileToken.value(), [this](audio::Token token) { if (token == songsModelInterface->getCurrentFileToken()) { songsModelInterface->setCurrentFileToken(std::nullopt); @@ -74,4 +88,9 @@ namespace app::music_player } } + void SongsPresenter::setPlayingStateCallback(std::function cb) + { + changePlayingStateCallback = std::move(cb); + } + } // namespace app::music_player diff --git a/module-apps/application-music-player/presenters/SongsPresenter.hpp b/module-apps/application-music-player/presenters/SongsPresenter.hpp index 32964ab6ec98a201f663b119f2149cdf8f1643ba..b5ac9f3b2fd27763eb38b83ceb5cb1208c3587f5 100644 --- a/module-apps/application-music-player/presenters/SongsPresenter.hpp +++ b/module-apps/application-music-player/presenters/SongsPresenter.hpp @@ -32,6 +32,8 @@ namespace app::music_player virtual bool resume() = 0; virtual bool stop() = 0; virtual void togglePlaying() = 0; + + virtual void setPlayingStateCallback(std::function cb) = 0; }; }; @@ -50,9 +52,11 @@ namespace app::music_player bool resume() override; bool stop() override; void togglePlaying() override; + void setPlayingStateCallback(std::function cb) override; private: std::shared_ptr songsModelInterface; std::unique_ptr audioOperations; + std::function changePlayingStateCallback = nullptr; }; } // namespace app::music_player diff --git a/module-apps/apps-common/locks/handlers/LockPolicyHandler.hpp b/module-apps/apps-common/locks/handlers/LockPolicyHandler.hpp index 24e68506c1c64868ac48ad69fb6ffe7e2b674b01..667ec08a3ae1d2c354dcc2eda5e60b087288e9a5 100644 --- a/module-apps/apps-common/locks/handlers/LockPolicyHandler.hpp +++ b/module-apps/apps-common/locks/handlers/LockPolicyHandler.hpp @@ -23,15 +23,14 @@ namespace locks class LockPolicyAccessInterface { - friend class app::ApplicationLauncher; AutoLockPolicy autoLockingPolicy = AutoLockPolicy::DetermineByWindow; - void set(AutoLockPolicy policy) noexcept; protected: [[nodiscard]] AutoLockPolicy get() const noexcept; public: virtual ~LockPolicyAccessInterface() = default; + void set(AutoLockPolicy policy) noexcept; }; class LockPolicyHandlerInterface : public LockPolicyAccessInterface