feat(android): offline downloads — albums, playlists, detail screen & playback

Download albums/playlists to private device storage (Room + WorkManager,
HttpURLConnection streaming). New Offline tab lists groups with progress;
tapping a group opens a detail screen (cover-art rows, play/shuffle, per-song
delete from device). Downloaded tracks play from disk on every screen.
Album/playlist cards show a downloaded badge; download button resumes missing
songs. Song storage is dedup'd by ID and reference-counted on delete.

Fixes: Android 15 download crash (dropped banned DATA_SYNC foreground service);
offline detail flash-back (initial empty state no longer mistaken for deleted).

Docs: CHANGELOG 0.10 + parity matrix; condensed README Features.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Opus 4.8 committed 2026-06-25 10:06:43 +02:00
1 parent 5a2ab54bbb
commit 73fcfae30f
29 files changed
+1326 -134

No files matched your search

+4
View File
@@ -12,6 +12,7 @@ ktor = "2.3.12"
kotlinxSerialization = "1.7.3"
kotlinxCoroutines = "1.9.0"
room = "2.6.1"
workmanager = "2.9.1"
datastore = "1.1.1"
coil = "2.7.0"
splashscreen = "1.0.1"
@@ -63,6 +64,9 @@ room-runtime = { group = "androidx.room", name = "room-runtime", version.ref =
room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
# WorkManager
work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "workmanager" }
# DataStore (settings / credentials)
datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastore" }