Commit Graph

  • 5f5ab69da6 feat(android): track UPnP play-intent surviving SOAP errors bvandeusen 2026-06-06 17:29:19 -04:00
  • 5386ae870f feat(android): revert UPnP output to phone after 5-min idle bvandeusen 2026-06-06 17:28:32 -04:00
  • d7b011e52f feat(android): pure idle-revert decision for UPnP output bvandeusen 2026-06-06 17:27:52 -04:00
  • 11466e1525 Merge pull request 'Unify offline detection + offline playlist UX (NetworkStatusController)' (#86) from dev into main v2026.06.05 bvandeusen 2026-06-05 13:27:36 -04:00
  • e185b36138 fix(android): arbitrate op-failure probe off the reducer thread bvandeusen 2026-06-05 12:47:46 -04:00
  • 31d8c30dfe feat(android): grey offline-unavailable playlists, lead with cached pools bvandeusen 2026-06-05 12:40:30 -04:00
  • 69ccd7b25d feat(android): per-playlist fullyCached via cache-index join bvandeusen 2026-06-05 12:29:59 -04:00
  • 8b77c6be97 feat(android): 4-state connection banner with unstable + back-online flash bvandeusen 2026-06-05 12:23:55 -04:00
  • c33ef18a50 fix(android): extract OfflineGatedDataSource gate to satisfy detekt ThrowsCount bvandeusen 2026-06-05 12:19:29 -04:00
  • 4c9450c117 feat(android): feed API/playback/pull-refresh signals into NetworkStatusController bvandeusen 2026-06-05 12:14:50 -04:00
  • b467cb7532 refactor(android): unify offline detection into NetworkStatusController bvandeusen 2026-06-05 12:06:22 -04:00
  • c78bbb7ba5 feat(android): pure ReachabilityMachine + 4-state ServerHealth enum bvandeusen 2026-06-05 11:35:22 -04:00
  • 301c3bfb86 Merge pull request 'fix(android): don't flip offline on WAN-validation flicker — trust /healthz' (#85) from dev into main v2026.06.04 bvandeusen 2026-06-04 23:02:28 -04:00
  • 5c0db429b3 fix(android): don't flip offline on WAN-validation flicker — trust /healthz bvandeusen 2026-06-04 22:57:57 -04:00
  • 4d8c7d6566 Merge pull request 'fix(android): notification art uses album cover, not embedded stream tags' (#84) from dev into main bvandeusen 2026-06-04 22:35:21 -04:00
  • 58810a860b fix(android): notification art uses album cover, not embedded stream tags bvandeusen 2026-06-04 22:24:20 -04:00
  • d6e6caa223 Merge pull request 'Sonos queue resync + cold-start prefetcher gate' (#83) from dev into main bvandeusen 2026-06-04 17:36:31 -04:00
  • 9a31955fa4 perf(android): gate audio prefetch on isPlaying bvandeusen 2026-06-04 17:29:19 -04:00
  • e7d7cb2471 fix(android): incremental Sonos queue sync for playNext + radio-append bvandeusen 2026-06-04 17:07:26 -04:00
  • 8017934334 fix(android): re-prime Sonos queue when user plays a different playlist bvandeusen 2026-06-04 17:00:24 -04:00
  • 8b08482d13 Merge pull request 'fix(android): hysteresis on /healthz reachable signal' (#82) from dev into main bvandeusen 2026-06-04 14:23:49 -04:00
  • faa0c7024b fix(android): hysteresis on /healthz reachable signal — 3 consecutive failures bvandeusen 2026-06-04 13:40:49 -04:00
  • 7cf04fe24b Merge pull request 'Android #618 offline-mode UX + Sonos polish + server DRY' (#81) from dev into main bvandeusen 2026-06-04 12:53:59 -04:00
  • 1e17eeda72 feat(android): #618 Phase 5 — confirm offline writes via shell snackbar bvandeusen 2026-06-04 12:40:59 -04:00
  • 1daea79f64 feat(android): #618 Phase 4 — row-level offline-unavailable affordance bvandeusen 2026-06-04 12:37:42 -04:00
  • 48de720514 feat(android): #618 Phase 2 — search falls back to cached entities when offline bvandeusen 2026-06-04 12:35:01 -04:00
  • fced6b681e feat(android): cache-only audio path when ServerHealth != Healthy bvandeusen 2026-06-04 11:27:11 -04:00
  • 80a6be25aa feat(android): ServerHealth tri-state composite + banner distinguishes offline vs server-down bvandeusen 2026-06-04 11:25:22 -04:00
  • 4d0a0b8e09 fix(android): throttle UPnP extend with 50ms delay per successful AddURIToQueue bvandeusen 2026-06-04 11:03:55 -04:00
  • 6184c62721 feat(android): MediaSession picks up UPnP state via direct listener invocation bvandeusen 2026-06-04 11:02:51 -04:00
  • 222a0ff636 Merge pull request 'dev → main: collage center-crop, server DRY, CI durability-off' (#80) from dev into main bvandeusen 2026-06-04 08:42:36 -04:00
  • 28300e19fd perf(ci): turn off Postgres durability in integration tests bvandeusen 2026-06-04 08:31:06 -04:00
  • 024493f2a7 refactor(server): unify stream URL builders + MIME tables + cover-path helper bvandeusen 2026-06-04 08:29:51 -04:00
  • edd198cdf5 fix(server): collage drawScaled uses center-crop instead of stretch bvandeusen 2026-06-04 08:22:59 -04:00
  • d75c1ae37f Merge pull request 'dev → main: Android UPnP/Sonos transport parity + server stream URL extension' (#79) from dev into main bvandeusen 2026-06-04 08:15:15 -04:00
  • 8cd2383a42 test(server): seed track for cast-token tests + assert file-ext in URL bvandeusen 2026-06-04 07:44:33 -04:00
  • 27bd38e005 feat(server): stream URL gets file extension so Sonos can probe duration bvandeusen 2026-06-04 07:29:28 -04:00
  • aa23a72693 fix(android): effectiveDuration uses desiredIdx so duration tracks the displayed title bvandeusen 2026-06-04 07:17:17 -04:00
  • 4021938046 fix(android): polling tick no longer force-syncs controller -- avoids Sonos seek-to-0 bvandeusen 2026-06-04 07:06:07 -04:00
  • 7486bc2444 fix(android): split tickPositionPoll into helpers for detekt complexity bvandeusen 2026-06-04 07:04:01 -04:00
  • ee8a1fdc93 fix(android): event-driven pending-transport clear (Sonos ack OR 5s safety) bvandeusen 2026-06-04 07:00:22 -04:00
  • 8e578d2068 fix(android): 2s transport-ack lockout so Prev/Next isn't undone by stale poll bvandeusen 2026-06-04 06:55:39 -04:00
  • cacb280832 fix(android): polling tick track update is forward-only so user Next isn't undone bvandeusen 2026-06-04 06:50:35 -04:00
  • 36054506c2 fix(android): polling tick owns track-change updates when delegate.seekTo silent bvandeusen 2026-06-04 06:46:38 -04:00
  • 5db90844cb fix(android): DIDL-Lite includes Rincon namespace + cdudn desc for Sonos bvandeusen 2026-06-04 06:34:00 -04:00
  • d5437d517e fix(android): single break in extend loop for detekt LoopWithTooManyJumpStatements bvandeusen 2026-06-04 01:07:57 -04:00
  • 3085d6f409 fix(android): DIDL-Lite restricted=true / id=-1 so Sonos accepts metadata bvandeusen 2026-06-04 00:59:31 -04:00
  • c5b326c620 fix(android): UPnP extend captures SOAP fault, aborts after 3 failures bvandeusen 2026-06-04 00:56:48 -04:00
  • 389c896d65 fix(android): force poll on ON_RESUME + cap interpolation drift at 5s bvandeusen 2026-06-04 00:55:10 -04:00
  • 41230b5afb fix(android): single jump per polling loop for detekt LoopWithTooManyJumpStatements bvandeusen 2026-06-04 00:42:35 -04:00
  • c245b1ef0b fix(android): hold UI patch until cursor sync lands; reanchor on track flip bvandeusen 2026-06-04 00:37:34 -04:00
  • 2425a305eb fix(android): interpolate UPnP position between polls + suppress post-seek race bvandeusen 2026-06-04 00:16:57 -04:00
  • 88b161193d fix(android): TrackRef.durationSec is final fallback so duration is never 0 bvandeusen 2026-06-04 00:03:48 -04:00
  • 9628ed1749 fix(android): duration falls back to local while Sonos hasn't reported one bvandeusen 2026-06-04 00:00:45 -04:00
  • 85926f4ec0 fix(android): keep service alive when UPnP is playing -- override playWhenReady bvandeusen 2026-06-03 23:51:54 -04:00
  • 47b0894ad6 test(android): update RemotePlayerState threshold expectation to 30 bvandeusen 2026-06-03 23:50:37 -04:00
  • e62fac3a0e fix(android): onEvents reads UPnP state so resume keeps duration bvandeusen 2026-06-03 23:48:52 -04:00
  • eae5dcad23 fix(android): correct ErrorCopy import path in PlaylistPlayback bvandeusen 2026-06-03 23:42:18 -04:00
  • 3576e241c0 fix(android): split playPlaylistShuffled to satisfy detekt ReturnCount bvandeusen 2026-06-03 23:37:30 -04:00
  • 8f89279fa4 fix(android): UPnP survives screen-off + cursor catches up to Sonos bvandeusen 2026-06-03 23:36:43 -04:00
  • b1a66f18bd feat(android): shuffle on system playlist tile play -- Home + Playlists list bvandeusen 2026-06-03 23:29:42 -04:00
  • 6a7958c921 fix(android): debounce non-PLAYING poll to suppress UPnP track-change flicker bvandeusen 2026-06-03 23:19:29 -04:00
  • 33285b53c6 fix(android): refresh uiState.isPlaying from remoteState during UPnP bvandeusen 2026-06-03 23:08:32 -04:00
  • 87ad7f4dc2 feat(android): lazy queue activation + loading spinner during UPnP load bvandeusen 2026-06-03 22:56:06 -04:00
  • 9c0013f4b6 fix(android): defer holder.active until SOAP wired -- drop transport during load bvandeusen 2026-06-03 22:46:57 -04:00
  • 6129536153 diag(android): log ForwardingPlayer transport overrides on entry bvandeusen 2026-06-03 22:32:33 -04:00
  • e6c3c959fa fix(android): handleZeroDurationIfNeeded ReturnCount within cap bvandeusen 2026-06-03 22:25:53 -04:00
  • e011b04e04 fix(android): remove pollLoop cursor sync -- races with queue load and SOAP bvandeusen 2026-06-03 22:24:34 -04:00
  • e2866795ef fix(android): skip zero-duration auto-advance during UPnP playback bvandeusen 2026-06-03 22:18:11 -04:00
  • e20d7b1438 fix(android): correct SOAPACTION assertions in next/previous tests bvandeusen 2026-06-03 22:06:54 -04:00
  • 2a098a78fe feat(android): Sonos queue mode -- ClearQueue + AddURIToQueue + x-rincon-queue bvandeusen 2026-06-03 21:55:03 -04:00
  • ece37e9a92 fix(android): remove pollLoop natural-advance -- races with selectUpnp and skip bvandeusen 2026-06-03 21:42:01 -04:00
  • 8a1203c4a1 fix(android): revert x-rincon-mp3radio Sonos URI -- plain https for music tracks bvandeusen 2026-06-03 21:31:31 -04:00
  • 487d1bd430 fix(android): SOAP/UPnP parsers enable processNamespaces -- correct name extraction bvandeusen 2026-06-03 20:58:59 -04:00
  • 5c99341b34 fix(android): test assertions use JUnit Jupiter for lazy-message Supplier<String> bvandeusen 2026-06-03 20:51:28 -04:00
  • 8fe3308afd fix(android): detekt -- parseHhMmSs ReturnCount/MagicNumber + readUntilEndTag jumps bvandeusen 2026-06-03 20:45:00 -04:00
  • 96594ba52b fix(android): Sonos ZGT robust extraction -- escaped + nested element fallback + diag bvandeusen 2026-06-03 20:40:52 -04:00
  • 2c61d7a333 fix(android): Sonos UDN comparison strips _MR/_MS suffix -- coordinator routing bvandeusen 2026-06-03 20:29:08 -04:00
  • 8652b86f40 fix(android): Sonos x-rincon-mp3radio URI transform for SetAVTransportURI bvandeusen 2026-06-03 20:20:25 -04:00
  • 75132a2afe diag(android): log raw SOAP response body for first 3 UPnP polls bvandeusen 2026-06-03 20:12:15 -04:00
  • 673f98487f fix(android): UPnP local pause via delegate -- no SOAP race bvandeusen 2026-06-03 19:53:41 -04:00
  • c556388a6b fix(android): UPnP activation order -- pause local before holder.set; sync+preQueue sequential; diagnostic Timber.w bvandeusen 2026-06-03 19:47:19 -04:00
  • edffdec2b2 fix(android): UPnP drop falls back to local; pollLoop detects natural advance bvandeusen 2026-06-03 18:07:20 -04:00
  • 1ab21d81ca feat(android): SetNextAVTransportURI pre-queue for gap-free UPnP advance bvandeusen 2026-06-03 17:53:10 -04:00
  • 81794e2475 fix(android): UPnP volume cache keyed to active route id bvandeusen 2026-06-03 17:52:00 -04:00
  • 29309d9bfb ui(android): drop snackbar + hardware volume keys when UPnP route active bvandeusen 2026-06-03 17:43:55 -04:00
  • 70b29567fb refactor(android): service holds Player not ExoPlayer for ForwardingPlayer wrap bvandeusen 2026-06-03 17:36:35 -04:00
  • 2f4d67d3c8 feat(android): PlayerFactory wraps ExoPlayer in ForwardingPlayer + drop events bvandeusen 2026-06-03 17:34:35 -04:00
  • b2bfe96559 ui(android): LazyColumn stable keys for in-place output picker row continuity bvandeusen 2026-06-03 17:33:01 -04:00
  • e9dd3e4d2a fix(android): OutputPicker -- local capture, selectUpnp mutex, shared dedup helper, suppress bvandeusen 2026-06-03 17:31:40 -04:00
  • b29875fd30 feat(android): UPnP selection state, disconnect, BuiltIn-pinned alphabetical sort bvandeusen 2026-06-03 17:24:08 -04:00
  • 85cea8d559 fix(android): UPnP forwarding -- route mint failures through drop, no double drop bvandeusen 2026-06-03 17:18:53 -04:00
  • ab6c3a1354 feat(android): MinstrelForwardingPlayer wraps ExoPlayer with UPnP branching bvandeusen 2026-06-03 17:12:11 -04:00
  • 3aee2276bc feat(android): RemotePlayerState container for UPnP-synthesized player state bvandeusen 2026-06-03 17:08:04 -04:00
  • 9a7d3b2d30 feat(android): ActiveUpnpHolder singleton for picker -> player handoff bvandeusen 2026-06-03 17:06:33 -04:00
  • 9002cf5559 refactor(android): UPnP discovery cleanup -- bareUdn helper, Timber, suppress, kdoc bvandeusen 2026-06-03 17:05:31 -04:00
  • a5e4570f01 feat(android): UPnP in-place updates + Sonos topology aggregation bvandeusen 2026-06-03 16:59:31 -04:00
  • bfcb9c42a0 feat(android): Sonos ZoneGroupTopology client + parser bvandeusen 2026-06-03 16:53:29 -04:00
  • 799d50024c test(android): RenderingControl lower clamp + GetVolume request body checks bvandeusen 2026-06-03 16:51:07 -04:00
  • 8c0c4c8600 feat(android): RenderingControl get/set volume bvandeusen 2026-06-03 16:48:40 -04:00