Commit Graph

  • 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 bvandeusenandClaude Sonnet 4.6 2026-06-03 22:56:06 -04:00
  • 9c0013f4b6 fix(android): defer holder.active until SOAP wired -- drop transport during load bvandeusenandClaude Sonnet 4.6 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 bvandeusenandClaude Sonnet 4.6 2026-06-03 21:55:03 -04:00
  • ece37e9a92 fix(android): remove pollLoop natural-advance -- races with selectUpnp and skip bvandeusenandClaude Sonnet 4.6 2026-06-03 21:42:01 -04:00
  • 8a1203c4a1 fix(android): revert x-rincon-mp3radio Sonos URI -- plain https for music tracks bvandeusenandClaude Sonnet 4.6 2026-06-03 21:31:31 -04:00
  • 487d1bd430 fix(android): SOAP/UPnP parsers enable processNamespaces -- correct name extraction bvandeusenandClaude Sonnet 4.6 2026-06-03 20:58:59 -04:00
  • 5c99341b34 fix(android): test assertions use JUnit Jupiter for lazy-message Supplier<String> bvandeusenandClaude Sonnet 4.6 2026-06-03 20:51:28 -04:00
  • 8fe3308afd fix(android): detekt -- parseHhMmSs ReturnCount/MagicNumber + readUntilEndTag jumps bvandeusenandClaude Sonnet 4.6 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 bvandeusenandClaude Sonnet 4.6 2026-06-03 20:29:08 -04:00
  • 8652b86f40 fix(android): Sonos x-rincon-mp3radio URI transform for SetAVTransportURI bvandeusenandClaude Sonnet 4.6 2026-06-03 20:20:25 -04:00
  • 75132a2afe diag(android): log raw SOAP response body for first 3 UPnP polls bvandeusenandClaude Sonnet 4.6 2026-06-03 20:12:15 -04:00
  • 673f98487f fix(android): UPnP local pause via delegate -- no SOAP race bvandeusenandClaude Sonnet 4.6 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 bvandeusenandClaude Sonnet 4.6 2026-06-03 19:47:19 -04:00
  • edffdec2b2 fix(android): UPnP drop falls back to local; pollLoop detects natural advance bvandeusenandClaude Sonnet 4.6 2026-06-03 18:07:20 -04:00
  • 1ab21d81ca feat(android): SetNextAVTransportURI pre-queue for gap-free UPnP advance bvandeusenandClaude Sonnet 4.6 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 bvandeusenandClaude Sonnet 4.6 2026-06-03 17:43:55 -04:00
  • 70b29567fb refactor(android): service holds Player not ExoPlayer for ForwardingPlayer wrap bvandeusenandClaude Sonnet 4.6 2026-06-03 17:36:35 -04:00
  • 2f4d67d3c8 feat(android): PlayerFactory wraps ExoPlayer in ForwardingPlayer + drop events bvandeusenandClaude Sonnet 4.6 2026-06-03 17:34:35 -04:00
  • b2bfe96559 ui(android): LazyColumn stable keys for in-place output picker row continuity bvandeusenandClaude Sonnet 4.6 2026-06-03 17:33:01 -04:00
  • e9dd3e4d2a fix(android): OutputPicker -- local capture, selectUpnp mutex, shared dedup helper, suppress bvandeusenandClaude Sonnet 4.6 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 bvandeusenandClaude Sonnet 4.6 2026-06-03 17:18:53 -04:00
  • ab6c3a1354 feat(android): MinstrelForwardingPlayer wraps ExoPlayer with UPnP branching bvandeusenandClaude Opus 4.7 2026-06-03 17:12:11 -04:00
  • 3aee2276bc feat(android): RemotePlayerState container for UPnP-synthesized player state bvandeusenandClaude Sonnet 4.6 2026-06-03 17:08:04 -04:00
  • 9a7d3b2d30 feat(android): ActiveUpnpHolder singleton for picker -> player handoff bvandeusenandClaude Sonnet 4.6 2026-06-03 17:06:33 -04:00
  • 9002cf5559 refactor(android): UPnP discovery cleanup -- bareUdn helper, Timber, suppress, kdoc bvandeusenandClaude Sonnet 4.6 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 bvandeusenandClaude Sonnet 4.6 2026-06-03 16:53:29 -04:00
  • 799d50024c test(android): RenderingControl lower clamp + GetVolume request body checks bvandeusenandClaude Sonnet 4.6 2026-06-03 16:51:07 -04:00
  • 8c0c4c8600 feat(android): RenderingControl get/set volume bvandeusen 2026-06-03 16:48:40 -04:00
  • 3cdb416f94 fix(android): AVTransport test assertions escape DIDL; consolidate xmlEscape bvandeusenandClaude Sonnet 4.6 2026-06-03 16:47:18 -04:00
  • d62a3b8134 feat(android): AVTransport pause/seek/nextURI/positionInfo/transportInfo bvandeusenandClaude Sonnet 4.6 2026-06-03 16:42:04 -04:00
  • 574bf29a7e fix(android): PlayerController transport methods dispatch to controller thread bvandeusen 2026-06-03 16:00:53 -04:00
  • 24b7c92abd fix(server+android): DIDL-Lite metadata for Sonos UPnP (error 1023) bvandeusen 2026-06-03 15:54:56 -04:00
  • 3c4c27fb08 Merge pull request 'v2026.06.03 hotfix — Sonos cast URL + UPnP picker polish' (#78) from dev into main v2026.06.03 bvandeusen 2026-06-03 15:30:09 -04:00
  • 7d15f57e86 fix(server): cast token URL honors X-Forwarded-Proto / Host bvandeusen 2026-06-03 15:17:34 -04:00
  • a9edc12523 fix(android): release-build Timber tree at WARN+ for operator diagnosis bvandeusen 2026-06-03 15:01:03 -04:00
  • 96f12d6aac fix(android): UPnP select - loud logs on every code path bvandeusen 2026-06-03 14:59:57 -04:00
  • 036da9dea8 fix(android): UPnP - clean Sonos friendlyName for picker display bvandeusen 2026-06-03 14:54:39 -04:00
  • a62a20b599 Merge pull request 'v2026.06.03 — Media3 like button + Bluetooth/UPnP picker + system playlist daily rotation' (#77) from dev into main bvandeusen 2026-06-03 14:09:23 -04:00
  • 7c11cdc4d1 fix(server): handleGetStream - auth check before DB lookup bvandeusen 2026-06-03 13:43:28 -04:00
  • c3614c6333 fix(server): errcheck violations from UPnP slice bvandeusen 2026-06-03 13:41:54 -04:00
  • 9e67088fdb fix(server): TestRoutesRegisteredInMount - missing streamSecret arg bvandeusen 2026-06-03 13:30:36 -04:00
  • 6da6cb5c5a fix(server): daily-rotate all deterministic mixes + diversity top-up fallback bvandeusen 2026-06-03 13:22:23 -04:00
  • 7473e98d91 fix(server): unify discovery-mix producers + daily-rotate the deterministic ones bvandeusen 2026-06-03 13:18:17 -04:00
  • 3df5e5cb3c fix(android): playlist like state + playlist cover URL bvandeusen 2026-06-03 13:11:55 -04:00
  • 448c9f2e74 chore(android): UPnP picker - log selectUpnp failures + drop dead fetchJob bvandeusen 2026-06-03 12:56:45 -04:00
  • 03cdff547d feat(android): UPnP picker integration (UPnP slice 6/6) bvandeusen 2026-06-03 12:52:15 -04:00
  • f8c93e013d feat(android): UPnP SOAP envelope + AVTransport client (UPnP slice 5/6) bvandeusen 2026-06-03 12:43:54 -04:00
  • 1f02813cc6 fix(android): UPnP - add kxml2 to test classpath so DeviceDescriptionTest runs bvandeusen 2026-06-03 12:02:51 -04:00
  • dc5b8252bb feat(android): UPnP SSDP discovery + device description (UPnP slice 4/6) bvandeusen 2026-06-03 12:01:00 -04:00