From 69368057b9af6aa7e152e91db0744beec989deaa Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 17 Sep 2026 21:07:24 +0300 Subject: [PATCH] Fixed system media controls state after video story with stopped player. --- .../media/system_media_controls_manager.cpp | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/Telegram/SourceFiles/media/system_media_controls_manager.cpp b/Telegram/SourceFiles/media/system_media_controls_manager.cpp index c51df77552..ee6cefc630 100644 --- a/Telegram/SourceFiles/media/system_media_controls_manager.cpp +++ b/Telegram/SourceFiles/media/system_media_controls_manager.cpp @@ -45,6 +45,19 @@ constexpr auto kSkipMs = crl::time(15 * 1000); Unexpected("RepeatModeToLoopStatus in SystemMediaControlsManager"); } +[[nodiscard]] std::optional ActivePlayerType() { + using namespace Media::Player; + const auto player = instance(); + using Type = AudioMsgId::Type; + for (const auto type : { Type::Voice, Type::Song }) { + if (player->current(type) + && !IsStoppedOrStopping(player->getState(type).state)) { + return type; + } + } + return std::nullopt; +} + } // namespace bool SystemMediaControlsManager::Supported() { @@ -175,11 +188,8 @@ void SystemMediaControlsManager::syncPlayerStateToControls() { = base::Platform::SystemMediaControls::PlaybackStatus; using namespace Media::Player; const auto mediaPlayer = Media::Player::instance(); - const auto type = mediaPlayer->current(AudioMsgId::Type::Song) - ? AudioMsgId::Type::Song - : AudioMsgId::Type::Voice; - const auto current = mediaPlayer->current(type); - if (!current) { + const auto type = ActivePlayerType(); + if (!type) { _cachedMediaView = nullptr; _streamed = nullptr; _controls->setEnabled(false); @@ -189,16 +199,16 @@ void SystemMediaControlsManager::syncPlayerStateToControls() { _controls->setEnabled(true); _controls->setIsPlayPauseEnabled(true); _controls->setIsStopEnabled(true); - _controls->setIsNextEnabled(mediaPlayer->nextAvailable(type)); - _controls->setIsPreviousEnabled(mediaPlayer->previousAvailable(type)); - const auto state = mediaPlayer->getState(type); + _controls->setIsNextEnabled(mediaPlayer->nextAvailable(*type)); + _controls->setIsPreviousEnabled(mediaPlayer->previousAvailable(*type)); + const auto state = mediaPlayer->getState(*type); _controls->setPlaybackStatus(IsStoppedOrStopping(state.state) ? PlaybackStatus::Stopped : IsPausedOrPausing(state.state) ? PlaybackStatus::Paused : PlaybackStatus::Playing); _lastAudioMsgId = AudioMsgId(); - applyPlayerTrack(type); + applyPlayerTrack(*type); _controls->updateDisplay(); } @@ -288,12 +298,9 @@ SystemMediaControlsManager::SystemMediaControlsManager() auto unlocked = Core::App().passcodeLockChanges( ) | rpl::filter([=](bool locked) { - return !locked && (mediaPlayer->current(AudioMsgId::Type::Song) - || mediaPlayer->current(AudioMsgId::Type::Voice)); - }) | rpl::map([=]() -> AudioMsgId::Type { - return mediaPlayer->current(AudioMsgId::Type::Song) - ? AudioMsgId::Type::Song - : AudioMsgId::Type::Voice; + return !locked && ActivePlayerType().has_value(); + }) | rpl::map([=] { + return *ActivePlayerType(); }) | rpl::before_next([=] { if (_videoDelegate) { return;