ab6c3a1354
android / Build + lint + test (push) Failing after 1m25s
Task 7 of UPnP transport-parity slice. Introduces the central ForwardingPlayer that branches between local ExoPlayer and the active UPnP renderer: - MinstrelForwardingPlayer wraps the delegate Player; play/pause/seek and the next/previous transport calls translate to AVTransport SOAP when an ActiveUpnp is set, otherwise forward to super. Position + isPlaying + duration + playbackState reads pull from RemotePlayerState while remote. - 1Hz poll loop drives GetPositionInfo + GetTransportInfo, feeding RemotePlayerState; the rolling-3 failure heuristic fires onDrop on the looper for the factory to surface as a snackbar. - StreamTokenProvider extracts the CastApi.create() Retrofit wiring into a Hilt singleton so the service-side player and the controller-side picker share one CastApi instance. - OutputPickerController constructor swaps Retrofit for StreamTokenProvider + ActiveUpnpHolder (the holder is wired now for Task 8). selectUpnp now mints via streamTokens.mint(trackId). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>