7b619152ab
PlayerController only ran the UI-state copy on Media3 Player.Events callbacks (track change, pause/play, buffer state) - none of which fire on normal position advancement during playback. The seek bar appeared to update every 20-30 seconds, whenever a buffer event happened to fire, instead of ticking smoothly. Adds a startPositionPolling() coroutine launched on Dispatchers.Main.immediate after the controller is connected. Samples controller.currentPosition + bufferedPosition every 500ms while isPlaying; skips state updates while paused (positionMs stays at the last value, which is the correct paused-state behavior). The poll patches only the position fields via .copy() so stale event-driven snapshots can't clobber the latest state. Cadence reference: Flutter via just_audio positionStream runs at ~200ms (audio_handler.dart:75); Spotify / Apple Music sit around 250-500ms in-app. 500ms is the battery-friendly middle ground that still reads as smooth on a slider. Lock-screen / notification surfaces are driven by Media3's MediaSession separately and don't need this poll.