Phase 3: Subsonic browsing API + real library UI

Replaces Phase 2's sample-data placeholders with real Navidrome
browsing: artists, albums, songs, and search, per the Phase 2+
roadmap's Phase 3.

- SubsonicApi grows from just ping to getArtists/getArtist/
  getAlbumList2/getAlbum/search3, with DTOs split per-domain
  (ArtistModels/AlbumModels/SongModels/SearchModels) and mapped to
  plain domain models (data/model) by the new LibraryRepository
- Coil wired in for cover art, sharing the same signed OkHttpClient
  as Retrofit via a Hilt EntryPoint (SubsonicRequestInterceptor signs
  cover-art requests identically to every other Subsonic call) -
  Artwork() falls back to the Phase 2 placeholder icon when no cover
  art id is known
- ui/library replaces the Phase 2 placeholders: HomeScreen now shows
  real Recently Added/Played and a random "Made For You" row,
  ArtistsScreen is the real Library tab, ArtistDetailScreen and
  AlbumDetailScreen are new drill-down screens (typed nav routes,
  ViewModels resolve their id via SavedStateHandle.toRoute()), and
  SearchScreen does debounced search3 across artists/albums/songs
- TrackRow gained a `circular` option so it can double as an artist
  row in the Library list, not just a track row

First real test coverage in the repo: LibraryRepositoryTest (DTO to
domain-model mapping against MockWebServer) and
SubsonicRequestInterceptorTest (rewritten URL + signed query params).
CredentialsStore/ServerRepository tests are deliberately still out of
scope - CredentialsStore's Tink/Android Keystore usage isn't testable
in a plain JVM unit test without Robolectric, which felt like a
bigger side quest than this phase called for.

Coil pinned to 3.3.0 rather than the newer 3.6.x latest: newer Coil
requires Kotlin 2.4+, which conflicts with this project's Kotlin
2.2.10; 3.3.0 was the last release built against Kotlin 2.2.x.

Verified end-to-end against a real Navidrome server on-device: Home
rows, artist list/detail, album detail, and search all load real data
and real cover art.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
christopher
2026-09-17 03:59:53 -04:00
co-authored by Claude Sonnet 5
parent a07868b688
commit 08b3a9a0df
37 changed files with 1616 additions and 146 deletions
+6 -3
View File
@@ -18,13 +18,16 @@
<string name="settings_title">Settings</string>
<string name="settings_log_out">Log out</string>
<string name="search_placeholder">Search coming soon</string>
<string name="library_placeholder">Your library coming soon</string>
<string name="player_nothing_playing">Nothing playing</string>
<string name="player_play">Play</string>
<string name="home_row_recently_added">Recently Added</string>
<string name="home_row_recently_played">Recently Played</string>
<string name="home_row_made_for_you">Made For You</string>
<string name="search_hint">Artists, albums, songs</string>
<string name="search_no_results">No results</string>
<string name="search_section_artists">Artists</string>
<string name="search_section_albums">Albums</string>
<string name="search_section_songs">Songs</string>
</resources>