diff --git a/Telegram/SourceFiles/window/system_media_controls_manager.cpp b/Telegram/SourceFiles/window/system_media_controls_manager.cpp index abb1a6a09..57d5d6b5f 100644 --- a/Telegram/SourceFiles/window/system_media_controls_manager.cpp +++ b/Telegram/SourceFiles/window/system_media_controls_manager.cpp @@ -39,12 +39,15 @@ SystemMediaControlsManager::SystemMediaControlsManager( } const auto type = AudioMsgId::Type::Song; + using TrackState = Media::Player::TrackState; const auto mediaPlayer = Media::Player::instance(); + auto trackFilter = rpl::filter([=](const TrackState &state) { + return (state.id.type() == type); + }); + mediaPlayer->updatedNotifier( - ) | rpl::filter([=](const Media::Player::TrackState &state) { - return state.id.type() == type; - }) | rpl::map([=](const Media::Player::TrackState &state) { + ) | trackFilter | rpl::map([=](const TrackState &state) { using namespace Media::Player; if (IsStoppedOrStopping(state.state)) { return PlaybackStatus::Stopped; @@ -57,6 +60,24 @@ SystemMediaControlsManager::SystemMediaControlsManager( _controls->setPlaybackStatus(status); }, _lifetime); + if (_controls->seekingSupported()) { + mediaPlayer->updatedNotifier( + ) | trackFilter | rpl::map([=](const TrackState &state) { + return state.position; + }) | rpl::distinct_until_changed( + ) | rpl::start_with_next([=](int position) { + _controls->setPosition(position); + }, _lifetime); + + mediaPlayer->updatedNotifier( + ) | trackFilter | rpl::map([=](const TrackState &state) { + return state.length; + }) | rpl::distinct_until_changed( + ) | rpl::start_with_next([=](int length) { + _controls->setDuration(length); + }, _lifetime); + } + rpl::merge( mediaPlayer->stops(type) | rpl::map_to(false), mediaPlayer->startsPlay(type) | rpl::map_to(true) @@ -135,6 +156,7 @@ SystemMediaControlsManager::SystemMediaControlsManager( _controls->commandRequests( ) | rpl::start_with_next([=](Command command) { switch (command) { + case Command::PlayPause: mediaPlayer->playPause(type); break; case Command::Play: mediaPlayer->play(type); break; case Command::Pause: mediaPlayer->pause(type); break; case Command::Next: mediaPlayer->next(type); break; @@ -143,6 +165,13 @@ SystemMediaControlsManager::SystemMediaControlsManager( } }, _lifetime); + if (_controls->seekingSupported()) { + _controls->seekRequests( + ) | rpl::start_with_next([=](float64 progress) { + mediaPlayer->finishSeeking(type, progress); + }, _lifetime); + } + Core::App().passcodeLockValue( ) | rpl::filter([=](bool locked) { return locked && Core::App().maybeActiveSession();