fix(android): UPnP cast resilience — drop-suppression, session adopt, recovery hardening #98
Reference in New Issue
Block a user
Delete Branch "dev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Two commits on top of the WiFi-lock release (v2026.06.12 @
9550d8da), all Android UPnP/Sonos cast resilience.d6290a3e— don't drop Sonos (or blast local audio) on a phone-side network gapA transient reachability gap (
NetworkStatus → ServerDownwhile WiFi stayed associated) starved the poll pastDROP_THRESHOLD, dropped the route, and fell back to the local player — which started blasting the song out of the phone while the Sonos was still streaming it. Gate the drop onNetworkStatusController: only drop when the phone's network isHealthy(renderer genuinely unreachable). While Unstable/ServerDown/Offline, hold the route and keep polling; reconcile on recovery.fd7d6dac— adopt a running session + anti-stickiness + faster recoveryremoveAllTracksFromQueue, no restart) — skip/seek drive its live queue. Falls through to reload when it isn't ours. (PlayerController.moveCursorToaligns the cursor without auto-playing.)upsertRouteonly ever added, so a powered-off renderer lingered forever and could pin a stale selection. StamplastSeen; prune non-responders after the picker's active scan; revert selection to phone when the selected route leaves discovery (while not casting). Picker-open-scan-tied — no background flicker.NetworkStatus → Healthywhile a route is active.Verify on device (on battery — USB masks the network-gap class)
CI green on dev (run 994: ktlint / detekt / unit).
🤖 Generated with Claude Code