b29875fd30
android / Build + lint + test (push) Failing after 1m21s
OutputPickerController now owns selection state for the UPnP leg and runs the disconnect flow when the user picks a system route while a renderer is active. - Inject OkHttpClient + RemotePlayerState so we can build a RenderingControlClient at selection time and capture the last-known remote position on disconnect. - selectUpnp publishes ActiveUpnp(routeId, routeName, avTransport, rendering) to ActiveUpnpHolder, marks the route id in selectedUpnpRouteIdInternal, and honors Sonos topology by routing through coordinatorRouteFor before SOAP. - selectSystem now does the disconnect: AVTransport.Stop -> clear the holder -> seek local ExoPlayer to the remembered position -> resume if the remote was playing. - routesState combines 4 sources (system, UPnP, Sonos topology, upnp-selected id). Non-coordinator Sonos members are filtered out of the visible list. current resolves from the merged list when a UPnP route is selected; otherwise from the system snapshot. - sortRoutes drops the current-first rule -- BuiltIn "Phone speaker" pins to the top, everything else lowercase-alphabetical. Selection state moves to the radio-button indicator in the picker row. - RemotePlayerState gets @Singleton + @Inject constructor() so Hilt can provide the shared instance to both the picker and the forthcoming MinstrelForwardingPlayer.