94871437dd
Fast-follow of #54. After the #52 idle/dismiss teardown, pressing play on a headset / watch / lock screen did nothing (handler.play() was just _player.play() with nothing loaded; the handler is Riverpod-agnostic). - audio_handler: _resumeHook + setResumeHook(); play() is now async — when mediaItem == null and a hook is set it awaits the hook (which restores + plays) and returns, else _player.play() - resume_controller: extract shared _loadAndRestore() (bool); _restore() keeps the paused launch path; new resumeFromMediaButton() restores then starts playback; start() registers it via setResumeHook Recursion-safe (post-restore mediaItem != null so the re-play hits _player.play()); no-op when nothing to resume / auth missing / a session is already active. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>