03a6dc4e5d
Closes audit #3 — PlayerController gains toggleShuffle / cycleRepeat methods backed by Media3's Player.shuffleModeEnabled + Player.repeatMode. PlayerUiState surfaces both via a new shuffleEnabled flag and a RepeatMode enum (OFF/ALL/ONE) mapped from Media3's int constants. NowPlaying's BottomActionsRow grows two IconButtons: shuffle toggles (accent when on, muted when off) and repeat cycles off → all → one → off (Lucide.Repeat ↔ Lucide.Repeat1 swap; accent when not-off). PlayerViewModel exposes the two new methods as thin pass-throughs matching the existing transport pattern. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>