~aleteoryx/muditaos

79cbe1517e981ea21596d850ecec1e791266e718 — tomaszkrosnowski 4 years ago 97b30f8
[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.
M module-apps/application-music-player/ApplicationMusicPlayer.cpp => module-apps/application-music-player/ApplicationMusicPlayer.cpp +17 -5
@@ 8,6 8,7 @@
#include <presenters/SongsPresenter.hpp>
#include <models/SongsRepository.hpp>
#include <models/SongsModel.hpp>
#include <service-appmgr/Controller.hpp>

#include <filesystem>
#include <log.hpp>


@@ 45,13 46,23 @@ namespace app
        priv->songsPresenter =
            std::make_unique<app::music_player::SongsPresenter>(priv->songsModel, std::move(audioOperations));

        std::function<bool()> 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<void(SongState)> 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<bool()> 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()

M module-apps/application-music-player/include/application-music-player/ApplicationMusicPlayer.hpp => module-apps/application-music-player/include/application-music-player/ApplicationMusicPlayer.hpp +1 -1
@@ 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 */

M module-apps/application-music-player/presenters/SongsPresenter.cpp => module-apps/application-music-player/presenters/SongsPresenter.cpp +19 -0
@@ 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<void(SongState)> cb)
    {
        changePlayingStateCallback = std::move(cb);
    }

} // namespace app::music_player

M module-apps/application-music-player/presenters/SongsPresenter.hpp => module-apps/application-music-player/presenters/SongsPresenter.hpp +4 -0
@@ 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<void(SongsModelInterface::SongState)> cb) = 0;
        };
    };



@@ 50,9 52,11 @@ namespace app::music_player
        bool resume() override;
        bool stop() override;
        void togglePlaying() override;
        void setPlayingStateCallback(std::function<void(SongsModelInterface::SongState)> cb) override;

      private:
        std::shared_ptr<SongsModelInterface> songsModelInterface;
        std::unique_ptr<AbstractAudioOperations> audioOperations;
        std::function<void(SongsModelInterface::SongState)> changePlayingStateCallback = nullptr;
    };
} // namespace app::music_player

M module-apps/apps-common/locks/handlers/LockPolicyHandler.hpp => module-apps/apps-common/locks/handlers/LockPolicyHandler.hpp +1 -2
@@ 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