feat: persistent audio mini-player docked above bottom nav#487
Merged
feat: persistent audio mini-player docked above bottom nav#487
Conversation
Replaces the basic inline audio widget with a global mini-player that persists across feed scrolling and tab navigation. Playback continues with system notification / lock-screen transport controls via MediaSessionService. The dock has two states: a collapsed row showing the author's avatar and name with rewind-15 / play-pause / forward-15; swipe up to expand for a scrub slider, speed cycling, and close. Single ExoPlayer is owned by AudioPlayerController and shared with the inline tap-to-play widget, which now reflects global playback state.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
MediaSessionService.ExoPlayerowned byAudioPlayerController; the inline tap-to-play widget now reflects global playback state and hands off to the controller. Starting audio pauses any active PiP video so they don't fight.Architecture
AudioPlayerController— singleton withStateFlow<AudioPlaybackState>exposingplay/togglePlayPause/seekTo/skipForward/skipBackward/cycleSpeed/close.AudioMediaSession— parallel to the existingVideoMediaSession; both register with the renamedWispPlaybackService(wasVideoPlaybackService) which keeps the service alive while either session is active.FloatingAudioPlayermounts in the rootScaffold'sbottomBarslot aboveWispBottomBarso content naturally reserves space rather than being covered.RichContentgets an optionalauthorPubkey;PostCardpassesevent.pubkeysoAudioTrackcarries the kind-0 name + avatar into the dock.Test plan