This website requires JavaScript.
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