8017934334
android / Build + lint + test (push) Successful in 3m56s
Before: tapping a different playlist while Sonos was the active route updated the player view but Sonos kept the old queue and played those tracks (or whatever was last there). PlayerController.setQueue replaced the local ExoPlayer queue and called play(), which forwarded SOAP Play to Sonos -- but Sonos's native queue (loaded once at route selection via removeAllTracks + AddURIToQueue + SetAVTransportURI) was never touched on subsequent setQueue calls. Now: MinstrelForwardingPlayer.setMediaItems (all 3 overloads) clears holder.active + sets target synchronously so the immediately-following play() drops via isLoadingUpnp(). OutputPickerController observes uiState.queue identity changes; when target or active is non-null and the queue key shifted, it re-runs loadQueueOnSonos under the existing selectUpnpMutex and restores active when done. Sonos resync failures drop cleanly to local (selectedUpnpRouteIdInternal nulled). Doesn't touch addMediaItem / radio-append paths -- those leave Sonos's queue stale and need a separate AddURIToQueue extension hook; out of scope for this fix.