From 03a8d120795e145c93d6d7a39b6aae43634053ae Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sun, 16 Aug 2026 22:40:58 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20stop=20pointing=20at=20the=20deleted=20?= =?UTF-8?q?Flutter=20tree=20=E2=80=94=20#2710?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every comment naming a path in flutter_client/ now resolves to nothing, which is the failure mode this project has already been bitten by twice -- drift #572 came from delete.go describing behaviour it no longer had, and that same docstring was still wrong when it was fixed last week. A pointer to a deleted directory is the same thing in slower motion: the reader follows it, finds nothing, and cannot tell whether the comment is stale or they are looking in the wrong place. Three treatments, per what each comment was actually doing: - Naming a concept ("mirrors db.dart's CachedTracks Drift table"): keep the concept, drop the path. The Drift table is why the entity looks as it does; the file it lived in is not. - Pure port bookkeeping ("Mirrors ." and nothing else): deleted. Git history records the port; the comment only restated it. - Substance introduced by a pointer (a lifecycle list, a 200 px/s threshold, an inverted control-row placement): keep the substance, drop the lead-in. The two Go comments were the valuable ones and got more than a trim. They stated a live contract -- "field names match the client's FromJson helpers exactly, or fields are silently dropped" -- against a client that no longer exists. They now name the real consumer, SyncResponseWire.kt, and say why the failure is silent there too: kotlinx.serialization skips unknown keys, so a renamed field arrives as a default value rather than an error. The ticket counted 64 files by grepping flutter_client/. A second tier turned up during the sweep: 15 more references naming bare Dart files (player_bar.dart, now_playing_screen.dart:464, auth_provider.dart) with no directory prefix. Same dead tree, same treatment, folded in here. Comments only -- verified no non-comment line is touched in the diff. --- .../minstrel/admin/data/AdminRequestsRepository.kt | 2 -- .../main/java/com/fabledsword/minstrel/api/ErrorCopy.kt | 3 +-- .../fabledsword/minstrel/api/endpoints/AdminInvitesApi.kt | 3 +-- .../minstrel/api/endpoints/AdminQuarantineApi.kt | 3 +-- .../minstrel/api/endpoints/AdminRequestsApi.kt | 3 +-- .../fabledsword/minstrel/api/endpoints/AdminUsersApi.kt | 3 +-- .../com/fabledsword/minstrel/api/endpoints/AuthApi.kt | 3 +-- .../com/fabledsword/minstrel/api/endpoints/DiscoverApi.kt | 1 - .../com/fabledsword/minstrel/api/endpoints/EventsApi.kt | 3 +-- .../com/fabledsword/minstrel/api/endpoints/HistoryApi.kt | 7 +++---- .../com/fabledsword/minstrel/api/endpoints/HomeApi.kt | 7 +++---- .../com/fabledsword/minstrel/api/endpoints/LibraryApi.kt | 1 - .../com/fabledsword/minstrel/api/endpoints/LikesApi.kt | 3 +-- .../java/com/fabledsword/minstrel/api/endpoints/MeApi.kt | 1 - .../fabledsword/minstrel/api/endpoints/PlaylistsApi.kt | 5 ++--- .../fabledsword/minstrel/api/endpoints/QuarantineApi.kt | 5 ++--- .../com/fabledsword/minstrel/api/endpoints/RadioApi.kt | 4 +--- .../com/fabledsword/minstrel/api/endpoints/RequestsApi.kt | 3 +-- .../com/fabledsword/minstrel/api/endpoints/SearchApi.kt | 3 +-- .../java/com/fabledsword/minstrel/auth/AuthController.kt | 3 +-- .../java/com/fabledsword/minstrel/cache/ShuffleSource.kt | 3 +-- .../fabledsword/minstrel/cache/audiocache/CacheConfig.kt | 2 +- .../minstrel/cache/audiocache/CacheSettings.kt | 3 +-- .../minstrel/cache/db/dao/CachedPlaylistDao.kt | 1 - .../minstrel/cache/db/entities/AudioCacheIndexEntity.kt | 2 +- .../minstrel/cache/db/entities/CachedAlbumEntity.kt | 2 +- .../minstrel/cache/db/entities/CachedArtistEntity.kt | 2 +- .../minstrel/cache/db/entities/CachedHomeIndexEntity.kt | 2 +- .../minstrel/cache/db/entities/CachedLikeEntity.kt | 2 +- .../minstrel/cache/db/entities/CachedMutationEntity.kt | 2 +- .../minstrel/cache/db/entities/CachedPlaylistEntity.kt | 2 +- .../cache/db/entities/CachedPlaylistTrackEntity.kt | 2 +- .../minstrel/cache/db/entities/CachedQuarantineEntity.kt | 2 +- .../minstrel/cache/db/entities/CachedResumeStateEntity.kt | 2 +- .../minstrel/cache/db/entities/CachedTrackEntity.kt | 2 +- .../java/com/fabledsword/minstrel/events/EventsStream.kt | 3 +-- .../java/com/fabledsword/minstrel/events/LiveEvent.kt | 2 +- .../fabledsword/minstrel/events/LiveEventsDispatcher.kt | 3 +-- .../com/fabledsword/minstrel/history/ui/HistoryTab.kt | 3 +-- .../java/com/fabledsword/minstrel/home/ui/HomeScreen.kt | 4 ++-- .../com/fabledsword/minstrel/library/ui/LibraryScreen.kt | 2 +- .../main/java/com/fabledsword/minstrel/models/AlbumRef.kt | 2 +- .../java/com/fabledsword/minstrel/models/ArtistRef.kt | 2 +- .../main/java/com/fabledsword/minstrel/models/Discover.kt | 2 +- .../main/java/com/fabledsword/minstrel/models/Invite.kt | 2 +- .../com/fabledsword/minstrel/models/ListenBrainzStatus.kt | 2 +- .../main/java/com/fabledsword/minstrel/models/Playlist.kt | 2 +- .../main/java/com/fabledsword/minstrel/models/Request.kt | 2 +- .../fabledsword/minstrel/models/SystemPlaylistsStatus.kt | 3 +-- .../main/java/com/fabledsword/minstrel/models/TrackRef.kt | 2 +- .../java/com/fabledsword/minstrel/models/UpdateInfo.kt | 2 +- .../com/fabledsword/minstrel/models/wire/AlbumWire.kt | 2 +- .../com/fabledsword/minstrel/models/wire/ArtistWire.kt | 2 +- .../com/fabledsword/minstrel/models/wire/DiscoverWire.kt | 2 +- .../com/fabledsword/minstrel/models/wire/EventsWire.kt | 3 +-- .../com/fabledsword/minstrel/models/wire/HomeIndexWire.kt | 5 ++--- .../com/fabledsword/minstrel/models/wire/MyProfileWire.kt | 3 +-- .../minstrel/models/wire/QuarantineMineWire.kt | 2 +- .../com/fabledsword/minstrel/models/wire/RequestWire.kt | 2 +- .../com/fabledsword/minstrel/models/wire/TrackWire.kt | 2 +- .../com/fabledsword/minstrel/player/AudioPrefetcher.kt | 2 +- .../fabledsword/minstrel/player/PlaybackErrorReporter.kt | 2 +- .../java/com/fabledsword/minstrel/player/PlayerUiState.kt | 3 +-- .../com/fabledsword/minstrel/player/ResumeController.kt | 3 +-- .../com/fabledsword/minstrel/player/ui/DominantColor.kt | 4 ++-- .../java/com/fabledsword/minstrel/player/ui/MiniPlayer.kt | 7 ++++--- .../fabledsword/minstrel/player/ui/NowPlayingScreen.kt | 4 +--- .../minstrel/playlists/data/PlaylistsRepository.kt | 5 ++--- .../minstrel/playlists/widgets/PlaylistCard.kt | 1 - .../minstrel/playlists/widgets/PlaylistPlaceholderCard.kt | 1 - .../fabledsword/minstrel/requests/ui/RequestsScreen.kt | 2 +- .../minstrel/shared/widgets/HorizontalScrollRow.kt | 3 --- .../minstrel/shared/widgets/PlayCircleButton.kt | 5 +---- .../fabledsword/minstrel/shared/widgets/ShellScaffold.kt | 2 -- .../java/com/fabledsword/minstrel/theme/MinstrelTheme.kt | 2 +- internal/api/library_sync_views.go | 8 +++++--- internal/api/library_sync_views_test.go | 8 +++++--- 77 files changed, 89 insertions(+), 131 deletions(-) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/admin/data/AdminRequestsRepository.kt b/android/app/src/main/java/com/fabledsword/minstrel/admin/data/AdminRequestsRepository.kt index 18587b41..c6ee38f5 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/admin/data/AdminRequestsRepository.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/admin/data/AdminRequestsRepository.kt @@ -11,8 +11,6 @@ import javax.inject.Singleton /** * Read-through accessor for the admin cross-user requests queue. - * Mirrors `flutter_client/lib/admin/admin_providers.dart`'s - * AdminRequestsController. * * No Room caching — admin actions are infrequent and don't benefit * from offline scrollback. `approve` and `reject` fire direct REST diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/ErrorCopy.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/ErrorCopy.kt index caabc851..8456fad9 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/ErrorCopy.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/ErrorCopy.kt @@ -8,8 +8,7 @@ import java.io.IOException /** * Maps server error codes (and common transport failures) to - * friendly, sentence-case copy. Mirrors - * `flutter_client/assets/error-copy.json` + `error_copy.dart`. + * friendly, sentence-case copy. * * Server errors are `{"error":{"code":"...","message":"..."}}`. * [fromThrowable] pulls the code out of a Retrofit [HttpException]'s diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminInvitesApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminInvitesApi.kt index 04bd383c..b0af65c1 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminInvitesApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminInvitesApi.kt @@ -10,8 +10,7 @@ import retrofit2.http.POST import retrofit2.http.Path /** - * Retrofit interface for `/api/admin/invites`. Mirrors - * `flutter_client/lib/api/endpoints/admin_invites.dart`. + * Retrofit interface for `/api/admin/invites`. * * Server TTL is hardcoded at 24h; the only configurable field is the * optional `note` on create. diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminQuarantineApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminQuarantineApi.kt index 4a483849..1e8f168a 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminQuarantineApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminQuarantineApi.kt @@ -6,8 +6,7 @@ import retrofit2.http.POST import retrofit2.http.Path /** - * Retrofit interface for `/api/admin/quarantine`. Mirrors - * `flutter_client/lib/api/endpoints/admin_quarantine.dart`. + * Retrofit interface for `/api/admin/quarantine`. * * Three resolution endpoints: * - `resolve` → admin reviewed, no action taken (clears flags). diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminRequestsApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminRequestsApi.kt index ef5b86cd..ef0db4d8 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminRequestsApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminRequestsApi.kt @@ -6,8 +6,7 @@ import retrofit2.http.POST import retrofit2.http.Path /** - * Retrofit interface for `/api/admin/requests`. Mirrors - * `flutter_client/lib/api/endpoints/admin_requests.dart`. + * Retrofit interface for `/api/admin/requests`. * * Server returns the same `requestView` shape as the user-side * `/api/requests`, so RequestWire is reused. Different listing scope — diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminUsersApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminUsersApi.kt index 3a0d4622..b6ef8172 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminUsersApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AdminUsersApi.kt @@ -10,8 +10,7 @@ import retrofit2.http.PUT import retrofit2.http.Path /** - * Retrofit interface for `/api/admin/users`. Mirrors - * `flutter_client/lib/api/endpoints/admin_users.dart`. + * Retrofit interface for `/api/admin/users`. * * Note: the PUT-auto-approve body field is `auto_approve`, NOT * `auto_approve_requests` — the request shape differs from the diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AuthApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AuthApi.kt index cb8cbebb..b7dc6e3a 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AuthApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/AuthApi.kt @@ -6,8 +6,7 @@ import retrofit2.http.Body import retrofit2.http.POST /** - * Retrofit interface for `/api/auth`. Mirrors - * `flutter_client/lib/api/endpoints/auth.dart`. + * Retrofit interface for `/api/auth`. * * The actual session-cookie capture happens in * [com.fabledsword.minstrel.api.AuthCookieInterceptor]; we don't diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/DiscoverApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/DiscoverApi.kt index cd0215ea..2b8e1945 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/DiscoverApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/DiscoverApi.kt @@ -14,7 +14,6 @@ import retrofit2.http.Query /** * Retrofit interface for Discover / Lidarr search / request creation. - * Mirrors `flutter_client/lib/api/endpoints/discover.dart`. * * `/api/lidarr/search` has a 60s LRU on the server so quick re-types * of the same query are cheap. diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/EventsApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/EventsApi.kt index dff15f50..0c56f259 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/EventsApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/EventsApi.kt @@ -9,8 +9,7 @@ import retrofit2.http.Body import retrofit2.http.POST /** - * Retrofit interface for `POST /api/events`. Mirrors the relevant - * slice of `flutter_client/lib/api/endpoints/events.dart`. All four + * Retrofit interface for `POST /api/events`. All four * variants share the same URL — the discriminator is in the request * body's `type` field. Server contract is best-effort per spec; * callers (the live path in PlayEventsReporter) swallow errors and diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/HistoryApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/HistoryApi.kt index ee4dcbaf..c5e43cc5 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/HistoryApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/HistoryApi.kt @@ -5,10 +5,9 @@ import retrofit2.http.GET import retrofit2.http.Query /** - * Retrofit interface for `/api/me/history`. Mirrors the relevant - * subset of `flutter_client/lib/api/endpoints/me.dart` (only - * `history()`; profile / timezone / quarantine endpoints land with - * their respective phases). + * Retrofit interface for `/api/me/history` — history only. The profile, + * timezone and quarantine endpoints on `/api/me` live with their own + * features rather than here. */ interface HistoryApi { @GET("api/me/history") diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/HomeApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/HomeApi.kt index acfe8261..d4ece00d 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/HomeApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/HomeApi.kt @@ -4,10 +4,9 @@ import com.fabledsword.minstrel.models.wire.HomeIndexWire import retrofit2.http.GET /** - * Retrofit interface for the Home discovery endpoint. Mirrors - * `flutter_client/lib/api/endpoints/home.dart` — just the ID-only - * `/api/home/index` variant. The Flutter port has a heavier - * `/api/home` (full embedded payload) too; we don't use it because + * Retrofit interface for the Home discovery endpoint. Only the ID-only + * `/api/home/index` variant is used. The server also serves a heavier + * `/api/home` (full embedded payload); we don't use it because * the per-item hydration path (sync controller → Room → Flow) is * the only one the native client needs. */ diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/LibraryApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/LibraryApi.kt index 51156f25..5f16721f 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/LibraryApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/LibraryApi.kt @@ -13,7 +13,6 @@ import retrofit2.http.Query /** * Retrofit interface for the server's native `/api/...` library surface. - * Mirrors `flutter_client/lib/api/endpoints/library.dart` 1:1. * * Notes on shapes: * - `GET /api/artists/{id}` returns ArtistDetailWire (ArtistRef fields diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/LikesApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/LikesApi.kt index e3c914ce..0be5ba45 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/LikesApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/LikesApi.kt @@ -7,8 +7,7 @@ import retrofit2.http.POST import retrofit2.http.Path /** - * Retrofit interface for `/api/likes`. Mirrors - * `flutter_client/lib/api/endpoints/likes.dart`. + * Retrofit interface for `/api/likes`. * * Path segment `kind` is one of "artists" | "albums" | "tracks" * (plural, matching the server route). The Repository hides that diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/MeApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/MeApi.kt index 99dc9c7c..6970e767 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/MeApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/MeApi.kt @@ -11,7 +11,6 @@ import retrofit2.http.PUT /** * Retrofit interface for the `/api/me` endpoints — caller-scoped account endpoints. - * Mirrors the relevant slice of `flutter_client/lib/api/endpoints/settings.dart`. * * History + timezone + system-playlists-status live under /api/me too * but are handled by their respective feature repositories; this diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/PlaylistsApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/PlaylistsApi.kt index c322250a..6844baa1 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/PlaylistsApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/PlaylistsApi.kt @@ -11,8 +11,7 @@ import retrofit2.http.Path import retrofit2.http.Query /** - * Retrofit interface for `/api/playlists`. Mirrors - * `flutter_client/lib/api/endpoints/playlists.dart`. + * Retrofit interface for `/api/playlists`. */ interface PlaylistsApi { /** @@ -54,7 +53,7 @@ interface PlaylistsApi { * the system playlist's tracks in rotation-aware order without * rebuilding — used by the Home play-button overlay so taps on For * You / Discover / Today's mix advance rotation rather than picking - * the stored order. Mirrors `playlists.dart.systemShuffle`. + * the stored order. */ @GET("api/playlists/system/{kind}/shuffle") suspend fun systemShuffle(@Path("kind") variant: String): PlaylistDetailWire diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/QuarantineApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/QuarantineApi.kt index 574b299c..91f40d4b 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/QuarantineApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/QuarantineApi.kt @@ -8,9 +8,8 @@ import retrofit2.http.POST import retrofit2.http.Path /** - * Retrofit interface for `/api/quarantine`. Mirrors the relevant - * parts of `flutter_client/lib/api/endpoints/quarantine.dart` (flag - * and unflag) plus the `/api/quarantine/mine` endpoint from `me.dart`. + * Retrofit interface for `/api/quarantine`: flag and unflag, plus the + * `/api/quarantine/mine` listing. * * Both flag and unflag are user-scoped — callers act on their own * quarantine entries. The cross-user admin surface is a separate diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/RadioApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/RadioApi.kt index 14ea0eda..12bcecc7 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/RadioApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/RadioApi.kt @@ -5,9 +5,7 @@ import retrofit2.http.GET import retrofit2.http.Query /** - * Retrofit interface for `/api/radio`. Mirrors the relevant slice of - * `flutter_client/lib/api/endpoints/radio.dart` (a single GET that - * returns the seeded queue). The server picks a fresh shuffle each + * Retrofit interface for `/api/radio`. The server picks a fresh shuffle each * invocation — clients call this once per radio start. */ interface RadioApi { diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/RequestsApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/RequestsApi.kt index cc9ed2db..dd24e0b5 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/RequestsApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/RequestsApi.kt @@ -6,8 +6,7 @@ import retrofit2.http.GET import retrofit2.http.Path /** - * Retrofit interface for the user-side `/api/requests`. Mirrors - * `flutter_client/lib/api/endpoints/requests.dart`. + * Retrofit interface for the user-side `/api/requests`. * * Server scopes results to the caller — admins see only their own * requests through this endpoint. The cross-user admin view lives on diff --git a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/SearchApi.kt b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/SearchApi.kt index 70fd52fd..5023c6c4 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/SearchApi.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/api/endpoints/SearchApi.kt @@ -5,8 +5,7 @@ import retrofit2.http.GET import retrofit2.http.Query /** - * Retrofit interface for `GET /api/search`. Mirrors - * `flutter_client/lib/api/endpoints/search.dart`. Server returns 400 + * Retrofit interface for `GET /api/search`. Server returns 400 * on empty/whitespace-only `q` — the caller is responsible for * guarding. */ diff --git a/android/app/src/main/java/com/fabledsword/minstrel/auth/AuthController.kt b/android/app/src/main/java/com/fabledsword/minstrel/auth/AuthController.kt index 54cb281b..440efd8c 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/auth/AuthController.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/auth/AuthController.kt @@ -17,8 +17,7 @@ import javax.inject.Inject import javax.inject.Singleton /** - * Singleton facade over the auth state machine. Mirrors Flutter's - * `AuthController` from `auth_provider.dart`. + * Singleton facade over the auth state machine. * * Cookie persistence is handled by [AuthCookieInterceptor] capturing * Set-Cookie on the login response; the user identity itself diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/ShuffleSource.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/ShuffleSource.kt index 6cf6db84..d28cc2cb 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/ShuffleSource.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/ShuffleSource.kt @@ -12,8 +12,7 @@ import javax.inject.Singleton private const val POOL_LIMIT = 100 /** - * Offline play sources over the local audio-cache index. Mirrors - * `flutter_client/lib/cache/shuffle_source.dart`. + * Offline play sources over the local audio-cache index. * * Both pools are UNIONs over the cache regardless of storage bucket * (liked AND recently-played both included). The two-bucket split is diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/audiocache/CacheConfig.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/audiocache/CacheConfig.kt index dc0453c2..6b20c669 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/audiocache/CacheConfig.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/audiocache/CacheConfig.kt @@ -1,7 +1,7 @@ package com.fabledsword.minstrel.cache.audiocache /** - * Defaults for the 2-bucket audio cache. Matches the Flutter client. + * Defaults for the 2-bucket audio cache. * * - `likedCapBytes`: cap for the protected bucket — cached files for * tracks the user has liked. Evicted only after the rolling bucket diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/audiocache/CacheSettings.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/audiocache/CacheSettings.kt index 246ac2a0..4e576cf9 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/audiocache/CacheSettings.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/audiocache/CacheSettings.kt @@ -6,8 +6,7 @@ private const val FIVE_GIB_BYTES = 5L * 1024 * 1024 * 1024 private const val DEFAULT_PREFETCH_WINDOW = 5 /** - * User-tunable audio cache settings. Mirrors Flutter's `CacheSettings` - * (cache_settings_provider.dart) field-for-field. Persisted as a JSON + * User-tunable audio cache settings. Persisted as a JSON * blob on the auth_session single-row table via [AuthStore]. * * - [likedCapBytes]: budget for cached files of liked tracks. 0 means diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/dao/CachedPlaylistDao.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/dao/CachedPlaylistDao.kt index 1fc818b8..88e78401 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/dao/CachedPlaylistDao.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/dao/CachedPlaylistDao.kt @@ -59,7 +59,6 @@ interface CachedPlaylistDao { /** * Atomically reconciles the cache against the fresh list response. - * Mirrors `flutter_client/lib/playlists/playlists_provider.dart:54` — * `BuildSystemPlaylists` rotates system-playlist UUIDs every * rebuild, so upsert alone leaves stale rows whose detail fetch * 404s. Delete any of the user's rows not in [freshOwnedIds] (this diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/AudioCacheIndexEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/AudioCacheIndexEntity.kt index efdc9a87..07ead191 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/AudioCacheIndexEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/AudioCacheIndexEntity.kt @@ -8,7 +8,7 @@ import kotlinx.datetime.Instant /** * One row per fully-downloaded audio file. Mirrors - * `flutter_client/lib/cache/db.dart`'s `AudioCacheIndex` Drift table. + * the Flutter client's `AudioCacheIndex` Drift table. * * Drives the 2-bucket LRU eviction (Phase 12 AudioCacheEvictionWorker): * - `incidental` files (streamed-and-cached side effect) evict first diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedAlbumEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedAlbumEntity.kt index 6255a20b..05274bda 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedAlbumEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedAlbumEntity.kt @@ -6,7 +6,7 @@ import kotlinx.datetime.Clock import kotlinx.datetime.Instant /** - * Cache row for one album. Mirrors `flutter_client/lib/cache/db.dart`'s + * Cache row for one album. Mirrors the Flutter client's * `CachedAlbums` Drift table. */ @Entity(tableName = "cached_albums") diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedArtistEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedArtistEntity.kt index 8601805c..7ba15a50 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedArtistEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedArtistEntity.kt @@ -6,7 +6,7 @@ import kotlinx.datetime.Clock import kotlinx.datetime.Instant /** - * Cache row for one artist. Mirrors `flutter_client/lib/cache/db.dart`'s + * Cache row for one artist. Mirrors the Flutter client's * `CachedArtists` Drift table. * * Column names follow Kotlin idiom (camelCase) rather than Drift's diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedHomeIndexEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedHomeIndexEntity.kt index 7d439de7..914bccd4 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedHomeIndexEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedHomeIndexEntity.kt @@ -6,7 +6,7 @@ import kotlinx.datetime.Instant /** * Per-item row driving the Home screen sections. Mirrors - * `flutter_client/lib/cache/db.dart`'s `CachedHomeIndex` Drift table. + * the Flutter client's `CachedHomeIndex` Drift table. * * `section` is one of (matching /api/home keys): * - "recently_added_albums" diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedLikeEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedLikeEntity.kt index 6f3af1e2..34050fdc 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedLikeEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedLikeEntity.kt @@ -5,7 +5,7 @@ import kotlinx.datetime.Clock import kotlinx.datetime.Instant /** - * Like membership row. Mirrors `flutter_client/lib/cache/db.dart`'s + * Like membership row. Mirrors the Flutter client's * `CachedLikes` Drift table. Composite primary key — one user may * independently like a track AND its album AND its artist; rows are * disambiguated by the (userId, entityType, entityId) triple. diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedMutationEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedMutationEntity.kt index bbc979bb..bed65edb 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedMutationEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedMutationEntity.kt @@ -7,7 +7,7 @@ import kotlinx.datetime.Instant /** * One row per pending offline-write. Mirrors - * `flutter_client/lib/cache/db.dart`'s `CachedMutations` Drift table. + * the Flutter client's `CachedMutations` Drift table. * * MutationQueue.enqueue() inserts a row when a server-write fails with * an IOException; MutationReplayer.drain() pops and re-attempts each diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedPlaylistEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedPlaylistEntity.kt index 8b0bb20a..82701d62 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedPlaylistEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedPlaylistEntity.kt @@ -7,7 +7,7 @@ import kotlinx.datetime.Instant /** * Cache row for one playlist (user or system). Mirrors - * `flutter_client/lib/cache/db.dart`'s `CachedPlaylists` Drift table. + * the Flutter client's `CachedPlaylists` Drift table. * * `systemVariant` is null for user playlists and one of * "for_you" / "songs_like_artist" / "discover" / "todays_mix" / etc. diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedPlaylistTrackEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedPlaylistTrackEntity.kt index ef29db40..d70acbb6 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedPlaylistTrackEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedPlaylistTrackEntity.kt @@ -4,7 +4,7 @@ import androidx.room.Entity /** * Ordered membership of tracks within a playlist. Mirrors - * `flutter_client/lib/cache/db.dart`'s `CachedPlaylistTracks` Drift table. + * the Flutter client's `CachedPlaylistTracks` Drift table. * Composite PK so the same track can only appear once per playlist; * `position` carries the ordering. */ diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedQuarantineEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedQuarantineEntity.kt index 5d50238f..f3ccc73f 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedQuarantineEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedQuarantineEntity.kt @@ -7,7 +7,7 @@ import kotlinx.datetime.Instant /** * The current user's quarantine flag for one track. Mirrors - * `flutter_client/lib/cache/db.dart`'s `CachedQuarantineMine` Drift + * the Flutter client's `CachedQuarantineMine` Drift * table. * * The flat denormalized track/album/artist columns let the Quarantine diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedResumeStateEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedResumeStateEntity.kt index 1066006d..64cbf588 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedResumeStateEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedResumeStateEntity.kt @@ -8,7 +8,7 @@ import kotlinx.datetime.Instant /** * Single-row snapshot of the last playback session — queue (as JSON), * current index, position, and source tag. Mirrors - * `flutter_client/lib/cache/db.dart`'s `CachedResumeState` Drift table. + * the Flutter client's `CachedResumeState` Drift table. * * Lets a torn-down session (the player's idle/dismissed teardown) * resume on next launch; without it the headset / lock-screen play diff --git a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedTrackEntity.kt b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedTrackEntity.kt index 8653a60a..3cf501b9 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedTrackEntity.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/cache/db/entities/CachedTrackEntity.kt @@ -6,7 +6,7 @@ import kotlinx.datetime.Clock import kotlinx.datetime.Instant /** - * Cache row for one track. Mirrors `flutter_client/lib/cache/db.dart`'s + * Cache row for one track. Mirrors the Flutter client's * `CachedTracks` Drift table. */ @Entity(tableName = "cached_tracks") diff --git a/android/app/src/main/java/com/fabledsword/minstrel/events/EventsStream.kt b/android/app/src/main/java/com/fabledsword/minstrel/events/EventsStream.kt index b375756a..b7b7e32d 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/events/EventsStream.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/events/EventsStream.kt @@ -38,8 +38,7 @@ private const val BACKOFF_FACTOR = 2 * ViewModels + the central [LiveEventsDispatcher]) collect filtered * subsets of the stream. * - * Connection lifecycle mirrors - * `flutter_client/lib/shared/live_events_provider.dart`: + * Connection lifecycle: * - Gated on having a session cookie. Subscription opens when the * cookie transitions to non-null and closes when it transitions * back to null (sign-out). diff --git a/android/app/src/main/java/com/fabledsword/minstrel/events/LiveEvent.kt b/android/app/src/main/java/com/fabledsword/minstrel/events/LiveEvent.kt index c296b25f..99656fec 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/events/LiveEvent.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/events/LiveEvent.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.json.JsonObject /** * Parsed event from the server's SSE stream. Mirrors - * `flutter_client/lib/shared/live_events_provider.dart`'s `LiveEvent`. + * the Flutter client's `LiveEvent`. * * - [kind] is the SSE `event:` field (e.g. "track.liked", "playlist.deleted"). * - [userId] is the actor whose user-scoped state changed (empty for diff --git a/android/app/src/main/java/com/fabledsword/minstrel/events/LiveEventsDispatcher.kt b/android/app/src/main/java/com/fabledsword/minstrel/events/LiveEventsDispatcher.kt index 9913508d..ed69d41b 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/events/LiveEventsDispatcher.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/events/LiveEventsDispatcher.kt @@ -11,8 +11,7 @@ import javax.inject.Inject import javax.inject.Singleton /** - * Maps incoming [LiveEvent]s to cross-screen state refreshes. Mirrors - * `flutter_client/lib/shared/live_events_dispatcher.dart`. Activated + * Maps incoming [LiveEvent]s to cross-screen state refreshes. Activated * by force-@Inject in MinstrelApplication. * * Scope is deliberately narrow: this dispatcher only touches state diff --git a/android/app/src/main/java/com/fabledsword/minstrel/history/ui/HistoryTab.kt b/android/app/src/main/java/com/fabledsword/minstrel/history/ui/HistoryTab.kt index 290dc0a6..5a9d436a 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/history/ui/HistoryTab.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/history/ui/HistoryTab.kt @@ -204,8 +204,7 @@ private const val HOURS_PER_DAY = 24L private const val DAYS_PER_WEEK = 7L /** - * Lightweight relative-time formatter mirroring Flutter's - * `library_screen.dart`'s `_relativeTime`: + * Lightweight relative-time formatter: * * < 1h → "Nm ago" * < 24h → "Nh ago" diff --git a/android/app/src/main/java/com/fabledsword/minstrel/home/ui/HomeScreen.kt b/android/app/src/main/java/com/fabledsword/minstrel/home/ui/HomeScreen.kt index 83d66e9f..21a4e9cb 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/home/ui/HomeScreen.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/home/ui/HomeScreen.kt @@ -1172,7 +1172,7 @@ enum class OfflinePoolKind(val label: String) { * first / greyed after, and the "building/pending" placeholders are dropped * (they need the server to generate, so they're meaningless offline). * - * Diverges from Flutter (`flutter_client/lib/library/home_screen.dart` + * Diverges from Flutter (the Flutter client * `_buildPlaylistsRow`) which only shows the 5 fixed slots and never * surfaces the secondary kinds on Home. Operator authorized the * divergence on 2026-06-01; web UI catch-up tracked as task #53. @@ -1374,7 +1374,7 @@ private const val MOST_PLAYED_COVER_DP = 48 // 3 rows of MOST_PLAYED_TILE_HEIGHT_DP + 2 * 8dp inter-row spacing, // rounded up. Mirrors Flutter (`CompactTrackCard` in -// flutter_client/lib/library/widgets/compact_track_card.dart) which +// the Flutter client) which // uses a horizontal-row card pattern - much denser than the square // per-track tiles that web uses (operator request 2026-06-01: "in the // flutter iteration the tiles were different and smaller so more of diff --git a/android/app/src/main/java/com/fabledsword/minstrel/library/ui/LibraryScreen.kt b/android/app/src/main/java/com/fabledsword/minstrel/library/ui/LibraryScreen.kt index 47e4ab5b..7d31d1b4 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/library/ui/LibraryScreen.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/library/ui/LibraryScreen.kt @@ -55,7 +55,7 @@ import com.fabledsword.minstrel.shared.widgets.SkeletonArtistTile * Library tab. Seven-tab TabBar (Artists / Albums / Genres / Years / * History / Liked / Hidden), matching the web client's library tab bar. * Genres and Years arrived with #2467; the rest predate it and mirrored - * `flutter_client/lib/library/library_screen.dart`. + * the Flutter client. * * Artists + Albums are wired against the existing LibraryViewModel * (cache-first reads of cached_artists / cached_albums). The other diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/AlbumRef.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/AlbumRef.kt index a58369de..512565f1 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/AlbumRef.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/AlbumRef.kt @@ -2,7 +2,7 @@ package com.fabledsword.minstrel.models /** * Lightweight reference to one album. Mirrors - * `flutter_client/lib/models/album.dart`'s `AlbumRef`. + * the Flutter client's `AlbumRef`. * * `coverUrl` and `durationSec` match the server contract (not * `cover_art_url` / `duration_ms`). `year` is omitempty server-side so diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/ArtistRef.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/ArtistRef.kt index 94b78166..73dbf1f1 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/ArtistRef.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/ArtistRef.kt @@ -2,7 +2,7 @@ package com.fabledsword.minstrel.models /** * Lightweight reference to one artist. Mirrors - * `flutter_client/lib/models/artist.dart`'s `ArtistRef`. + * the Flutter client's `ArtistRef`. * * `coverUrl` is the server's field name (NOT cover_art_url). Server emits * empty string when the artist has no representative album cover; UI code diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/Discover.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/Discover.kt index bd05de60..c89d7ad5 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/Discover.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/Discover.kt @@ -14,7 +14,7 @@ enum class LidarrRequestKind { } /** - * Lidarr search hit. Mirrors `flutter_client/lib/models/lidarr.dart`'s + * Lidarr search hit. Mirrors the Flutter client's * `LidarrSearchResult` — `mbid` is the result's own MBID; `artistMbid` * and `albumMbid` are filled when the row is an album/track and the * UI needs the parent IDs to build the request. diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/Invite.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/Invite.kt index c7eadab2..5513da15 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/Invite.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/Invite.kt @@ -2,7 +2,7 @@ package com.fabledsword.minstrel.models /** * Domain shape for one admin-issued registration invite. Mirrors - * `flutter_client/lib/models/invite.dart Invite` and the server's + * the Flutter client's `Invite` and the server's * `inviteResp` from `internal/api/admin_invites.go`. * * `invitedBy` and `redeemedBy` are UUIDs of users (not usernames); diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/ListenBrainzStatus.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/ListenBrainzStatus.kt index 0813d11e..70175138 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/ListenBrainzStatus.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/ListenBrainzStatus.kt @@ -2,7 +2,7 @@ package com.fabledsword.minstrel.models /** * Caller's ListenBrainz integration state. Mirrors - * `flutter_client/lib/models/my_profile.dart ListenBrainzStatus` + * the Flutter client's `ListenBrainzStatus` * and the server's `listenBrainzResp`. * * The token itself is never read back from the server — `tokenSet` diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/Playlist.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/Playlist.kt index 7e918400..676eb33c 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/Playlist.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/Playlist.kt @@ -2,7 +2,7 @@ package com.fabledsword.minstrel.models /** * Lightweight reference to one playlist (user or system-generated). - * Mirrors `flutter_client/lib/models/playlist.dart`'s `Playlist`. + * Mirrors the Flutter client's `Playlist`. * * `systemVariant` discriminates user vs. system playlists — null for * user-owned, one of "for_you" / "discover" / "songs_like_artist" / etc. diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/Request.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/Request.kt index 45b075d6..b4cdbe0e 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/Request.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/Request.kt @@ -24,7 +24,7 @@ enum class RequestStatus { /** * One Lidarr request the user has submitted. Mirrors - * `flutter_client/lib/models/admin_request.dart AdminRequest` — + * the Flutter client's `AdminRequest` — * shared between the user-side `/api/requests` view and the admin * cross-user view since the wire shape is identical. * diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/SystemPlaylistsStatus.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/SystemPlaylistsStatus.kt index edee47ee..5204a0dc 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/SystemPlaylistsStatus.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/SystemPlaylistsStatus.kt @@ -3,8 +3,7 @@ package com.fabledsword.minstrel.models /** * Caller's most recent system_playlist_runs state, driving the Home * placeholder cards for not-yet-generated system playlists. Mirrors - * `flutter_client/lib/models/system_playlists_status.dart` and the - * server's `systemPlaylistsStatusResp`. + * the server's `systemPlaylistsStatusResp`. * * Zero values (inFlight=false, both timestamps null) mean the user * has never had a build attempted — the placeholders read as diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/TrackRef.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/TrackRef.kt index 345d0137..e32dafbd 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/TrackRef.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/TrackRef.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.Serializable /** * Lightweight reference to one track. Mirrors - * `flutter_client/lib/models/track.dart`'s `TrackRef`. + * the Flutter client's `TrackRef`. * * The `Ref` suffix matches the Flutter convention — these types carry * only the IDs + display fields needed for list rendering + the player diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/UpdateInfo.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/UpdateInfo.kt index 745de7c4..bf6d052a 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/UpdateInfo.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/UpdateInfo.kt @@ -2,7 +2,7 @@ package com.fabledsword.minstrel.models /** * Wire shape returned by `GET /api/client/version`. Mirrors - * `flutter_client/lib/update/update_info.dart UpdateInfo`. + * the Flutter client's `UpdateInfo`. * * `version` is the server-bundled APK version (may have a leading * "v" from the git tag); `apkUrl` is server-relative (e.g. diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumWire.kt index acf8f626..a01a84bf 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumWire.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** - * Wire shape for `AlbumRef`. Mirrors `flutter_client/lib/models/album.dart`. + * Wire shape for `AlbumRef`. */ @Serializable data class AlbumWire( diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistWire.kt index 1c389a6a..a9d2f551 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistWire.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** - * Wire shape for `ArtistRef`. Mirrors `flutter_client/lib/models/artist.dart`. + * Wire shape for `ArtistRef`. */ @Serializable data class ArtistWire( diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/DiscoverWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/DiscoverWire.kt index 25ae924e..d7db19fa 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/DiscoverWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/DiscoverWire.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable /** * One row of `GET /api/lidarr/search`. Mirrors * `web/src/lib/api/types.ts LidarrSearchResult` / - * `flutter_client/lib/models/lidarr.dart LidarrSearchResult`. + * the Flutter client's `LidarrSearchResult`. * * `inLibrary` and `requested` let the UI greyout rows the user can't * act on (already imported / already awaiting review). All defaults diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/EventsWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/EventsWire.kt index 47072c12..5ccecbdd 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/EventsWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/EventsWire.kt @@ -9,8 +9,7 @@ import kotlinx.serialization.Serializable /** * Wire shapes for `POST /api/events`. The endpoint multiplexes four - * variants on the `type` discriminator field, mirroring - * `flutter_client/lib/api/endpoints/events.dart`. + * variants on the `type` discriminator field. * * play_started returns the server-assigned play_event_id (nullable — * server may suppress under certain conditions); the other three diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/HomeIndexWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/HomeIndexWire.kt index 3c254e33..4f12c73f 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/HomeIndexWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/HomeIndexWire.kt @@ -5,9 +5,8 @@ import kotlinx.serialization.Serializable /** * Wire shape of `GET /api/home/index` — five flat slices of entity-ID - * strings, one per Home section. Mirrors - * `flutter_client/lib/models/home_index.dart` (and the server's - * `internal/api/types.go HomeIndexPayload`). + * strings, one per Home section. Mirrors the server's + * `HomeIndexPayload` in `internal/api/types.go`. * * Section name implies entity type; no per-entry type tag is needed: * - recentlyAddedAlbums → album diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/MyProfileWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/MyProfileWire.kt index 0086bb3e..a1e8aa58 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/MyProfileWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/MyProfileWire.kt @@ -5,8 +5,7 @@ import kotlinx.serialization.Serializable /** * Wire shape for `GET /api/me` and the return value of - * `PUT /api/me/profile`. Mirrors - * `flutter_client/lib/models/my_profile.dart`: + * `PUT /api/me/profile`. Two things the shape assumes: * - `display_name` and `email` are nullable; server returns null * when the user hasn't set them yet (registration only requires * a username). diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/QuarantineMineWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/QuarantineMineWire.kt index ac77d37c..2a9fde15 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/QuarantineMineWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/QuarantineMineWire.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable /** * One row of `GET /api/quarantine/mine`. Mirrors - * `flutter_client/lib/models/quarantine_mine.dart QuarantineMineRow` + * the Flutter client's `QuarantineMineRow` * (web `LidarrQuarantineMineRow`). * * Reason values: `bad_rip` / `wrong_file` / `wrong_tags` / `duplicate` diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/RequestWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/RequestWire.kt index faa4973c..f6be7723 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/RequestWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/RequestWire.kt @@ -7,7 +7,7 @@ import kotlinx.serialization.Serializable * Wire shape of `requestView` from `internal/api/requests.go` — the * row returned by both `GET /api/requests` (caller's own requests) and * `GET /api/admin/requests` (cross-user admin view). Mirrors - * `flutter_client/lib/models/admin_request.dart AdminRequest`. + * the Flutter client's `AdminRequest`. * * Status values: `pending` / `approved` / `rejected` / `completed` / * `failed`. Kind values: `artist` / `album` / `track`. diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/TrackWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/TrackWire.kt index dba0ab70..3b9630af 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/TrackWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/TrackWire.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable /** * Wire shape for `TrackRef` as the server emits it. Mirrors - * `flutter_client/lib/models/track.dart`'s `TrackRef.fromJson` + * the Flutter client's `TrackRef.fromJson` * field-for-field; the keys are snake_case because the server is Go * (json:"album_id" etc.). * diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/AudioPrefetcher.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/AudioPrefetcher.kt index 1ac73695..805d68d9 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/AudioPrefetcher.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/AudioPrefetcher.kt @@ -25,7 +25,7 @@ import javax.inject.Singleton * Pre-downloads the next-N tracks in the queue into the shared Media3 * [androidx.media3.datasource.cache.SimpleCache] so a skip-forward or * natural advance plays from disk instead of waiting on a fresh HTTP - * connection. Mirrors the Flutter `Prefetcher` (cache/prefetcher.dart): + * connection. Behaviour: * watches the player's current track, walks forward by * [com.fabledsword.minstrel.cache.audiocache.CacheSettings.prefetchWindow] * tracks, and pins each one. Idempotent — `CacheWriter` is a no-op when diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/PlaybackErrorReporter.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/PlaybackErrorReporter.kt index 24e6458d..929692b4 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/PlaybackErrorReporter.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/PlaybackErrorReporter.kt @@ -23,7 +23,7 @@ private const val DEBOUNCE_MS = 2_000L * operator never finds out the track is bad and the next user hits * the same wall. * - * The snackbar text mirrors Flutter's `playback_error_reporter.dart`: + * The snackbar text: * collect [PlayerController.playbackErrorEvents], debounce in a 2s * window, emit "Couldn't play 'X' — skipping" for a single error or * "Skipped N unplayable tracks" when a burst lands inside the window. diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerUiState.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerUiState.kt index 4a101ec0..ae7518cb 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerUiState.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/PlayerUiState.kt @@ -3,8 +3,7 @@ package com.fabledsword.minstrel.player import com.fabledsword.minstrel.models.TrackRef /** - * Cycle on the repeat button: off → all → one → off. Mirrors - * `AudioServiceRepeatMode` in flutter_client and maps directly to + * Cycle on the repeat button: off → all → one → off. Maps directly to * the three Media3 `Player.REPEAT_MODE_*` int constants. */ enum class RepeatMode { OFF, ALL, ONE } diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/ResumeController.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/ResumeController.kt index fddf8e46..ca8569a7 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/ResumeController.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/ResumeController.kt @@ -15,8 +15,7 @@ import javax.inject.Singleton /** * Persists the player's last queue + position to Room so a torn-down - * session can resume on next app launch. Mirrors - * `flutter_client/lib/cache/resume_controller.dart`. + * session can resume on next app launch. * * Subscribes to [PlayerController.uiState] in init; persists when the * (track-id, queueIndex) changes — captures real session transitions diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/DominantColor.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/DominantColor.kt index b4be6420..acaa72ef 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/DominantColor.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/DominantColor.kt @@ -30,8 +30,8 @@ private const val GRADIENT_TWEEN_MS = 600 * The held color is NOT reset when [coverUrl] changes — it stays on * the previous track's dominant until the new palette resolves, so the * gradient tweens old→new directly instead of dipping toward the - * fallback mid-swap. Mirrors `now_playing_screen.dart`'s preload-then- - * swap ("keep the previous dominant"); the cover image swaps smoothly + * fallback mid-swap — preload-then-swap, keeping the previous dominant + * until the new one resolves. The cover image swaps smoothly * via `CoverPrefetcher`, which warms the next track's bytes into Coil. * * Starts at [Color.Transparent] (cold mount) and resets to it only diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/MiniPlayer.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/MiniPlayer.kt index 1e378ff5..eba3ddce 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/MiniPlayer.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/MiniPlayer.kt @@ -55,8 +55,9 @@ private const val COVER_SIZE_DP = 48 private const val SCRUBBER_ROW_HEIGHT_DP = 4 // Upward flick speed (dp/s) that expands the bar into NowPlaying. -// Mirrors player_bar.dart's 200 px/s threshold; expressed in dp and -// converted via density so the gesture feels the same across screens. +// The 200 px/s threshold carries over from the Flutter player bar, +// expressed in dp and converted via density so the gesture feels the +// same across screens. private const val SWIPE_UP_VELOCITY_DP = 200 @OptIn(ExperimentalSharedTransitionApi::class) @@ -129,7 +130,7 @@ fun MiniPlayer( .collectAsStateWithLifecycle(initialValue = false) // Swipe up anywhere on the bar to expand into the full player — - // mirrors player_bar.dart. We only act on a clear upward flick + // We only act on a clear upward flick // (negative velocity past the threshold) so a slow tap-with-jitter // doesn't accidentally open the screen. The horizontal seek slider // keeps its own gestures; a vertical draggable only claims diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/NowPlayingScreen.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/NowPlayingScreen.kt index 7fb99d3d..7179063a 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/NowPlayingScreen.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/NowPlayingScreen.kt @@ -371,9 +371,7 @@ private fun NowPlayingContent( TrackHeader(title = track.title, artist = track.artistName, album = track.albumTitle) Spacer(Modifier.height(24.dp)) // Action row (like, shuffle, repeat, queue, kebab) sits ABOVE the - // scrubber — Flutter's _SecondaryControls placement - // (now_playing_screen.dart:464). Android previously had it below - // the transport row. + // scrubber. Android previously had it below the transport row. BottomActionsRow( navController = navController, track = track, diff --git a/android/app/src/main/java/com/fabledsword/minstrel/playlists/data/PlaylistsRepository.kt b/android/app/src/main/java/com/fabledsword/minstrel/playlists/data/PlaylistsRepository.kt index b62ada1a..b3d99126 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/playlists/data/PlaylistsRepository.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/playlists/data/PlaylistsRepository.kt @@ -88,7 +88,7 @@ class PlaylistsRepository @Inject constructor( // Reconcile: BuildSystemPlaylists rotates system-playlist // UUIDs every rebuild, so upsert alone leaves stale rows // whose detail fetch 404s ("That playlist no longer - // exists"). Mirrors playlists_provider.dart's deleteWhere. + // exists"). playlistDao.replaceList( userId = userId, freshOwnedIds = wire.owned.map { it.id }, @@ -111,8 +111,7 @@ class PlaylistsRepository @Inject constructor( api.get(id) } catch (e: HttpException) { // Server says this playlist is gone — drop the stale cache - // row so the list stops showing it. Mirrors - // playlists_provider.dart's deleteWhere on detail failure. + // row so the list stops showing it. if (e.code() == HttpURLConnection.HTTP_NOT_FOUND) { playlistDao.deleteByIds(listOf(id)) } diff --git a/android/app/src/main/java/com/fabledsword/minstrel/playlists/widgets/PlaylistCard.kt b/android/app/src/main/java/com/fabledsword/minstrel/playlists/widgets/PlaylistCard.kt index 55ef6cfb..afaeca0f 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/playlists/widgets/PlaylistCard.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/playlists/widgets/PlaylistCard.kt @@ -30,7 +30,6 @@ import com.fabledsword.minstrel.theme.FabledSwordFlatTokens /** * One playlist tile. Sized to match `AlbumCard` (176dp wide, 144dp * square cover) so they line up in the Home Playlists carousel. - * Mirrors `flutter_client/lib/playlists/widgets/playlist_card.dart`. * * System playlists carry a small "For You" / "Discover" / etc. label * subtitle under the name (substituting for the artist-name line on diff --git a/android/app/src/main/java/com/fabledsword/minstrel/playlists/widgets/PlaylistPlaceholderCard.kt b/android/app/src/main/java/com/fabledsword/minstrel/playlists/widgets/PlaylistPlaceholderCard.kt index 272abda5..86377ce4 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/playlists/widgets/PlaylistPlaceholderCard.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/playlists/widgets/PlaylistPlaceholderCard.kt @@ -28,7 +28,6 @@ import com.fabledsword.minstrel.theme.FabledSwordFlatTokens /** * Placeholder tile for a system playlist that hasn't generated yet. - * Mirrors `flutter_client/lib/playlists/widgets/playlist_placeholder_card.dart`. * Sized to match [PlaylistCard] so the Home Playlists row stays * visually consistent. * diff --git a/android/app/src/main/java/com/fabledsword/minstrel/requests/ui/RequestsScreen.kt b/android/app/src/main/java/com/fabledsword/minstrel/requests/ui/RequestsScreen.kt index 3a55e608..e0db9edc 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/requests/ui/RequestsScreen.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/requests/ui/RequestsScreen.kt @@ -231,7 +231,7 @@ private fun CancelConfirmDialog( @Composable private fun KindAvatar(kind: String) { // Flutter mapping: disc-3 for artist, library-big for album, - // music for track. Mirrors lib/requests/requests_screen.dart. + // music for track. val icon = when (kind) { "artist" -> Lucide.Disc3 "album" -> Lucide.LibraryBig diff --git a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/HorizontalScrollRow.kt b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/HorizontalScrollRow.kt index d1e4642f..b544f5c1 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/HorizontalScrollRow.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/HorizontalScrollRow.kt @@ -15,9 +15,6 @@ import androidx.compose.ui.unit.dp /** * Labeled horizontal-scroll section used throughout the Home screen. - * Mirrors `flutter_client/lib/library/widgets/horizontal_scroll_row.dart` - * — a Fraunces section title at 16dp gutter, then a horizontal LazyRow - * with the same gutter and 8dp inter-item spacing. * * Pass empty `title` to render a continuation row directly under a * previously-titled one (used by Rediscover when it has both album and diff --git a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/PlayCircleButton.kt b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/PlayCircleButton.kt index 933cfa75..c7c7e677 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/PlayCircleButton.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/PlayCircleButton.kt @@ -24,10 +24,7 @@ import kotlinx.coroutines.launch /** * Always-visible circular play button overlaid on Home tile cover art - * (AlbumCard / ArtistCard / PlaylistCard). Mirrors - * `flutter_client/lib/library/widgets/play_circle_button.dart`: 44dp - * accent-colored disc, parchment Play icon, drop shadow, self-managed - * loading spinner. + * (AlbumCard / ArtistCard / PlaylistCard). * * [onPlay] is a suspend lambda so the caller can await the fetch-and- * queue setup. While it runs, the icon is swapped for a spinner and diff --git a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/ShellScaffold.kt b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/ShellScaffold.kt index 5e8b6881..d445cb5d 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/ShellScaffold.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/ShellScaffold.kt @@ -54,8 +54,6 @@ val ShellContentWindowInsets: WindowInsets = WindowInsets(0, 0, 0, 0) * its own Scaffold's snackbar host as well; this one is the shell- * wide catch-all for events that outlive a single screen). * - * Mirrors the Flutter `_ShellWithPlayerBar` (lib/shared/routing.dart). - * * Top-level routes (Home / Library / Search / Discover / Playlists / * Settings / Admin / detail screens) wrap themselves with this. * Full-screen routes (NowPlaying / Queue / ServerUrl / Login) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/theme/MinstrelTheme.kt b/android/app/src/main/java/com/fabledsword/minstrel/theme/MinstrelTheme.kt index b68282f1..220e9f1b 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/theme/MinstrelTheme.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/theme/MinstrelTheme.kt @@ -8,7 +8,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider /** - * The Flutter theme's `ColorScheme` role mapping (theme_data.dart): + * The `ColorScheme` role mapping: * primary = accent (forest-teal) — same both modes * onPrimary = onAction * surface = iron diff --git a/internal/api/library_sync_views.go b/internal/api/library_sync_views.go index d33dbb9e..0454149c 100644 --- a/internal/api/library_sync_views.go +++ b/internal/api/library_sync_views.go @@ -10,9 +10,11 @@ package api // pgtype.Timestamptz / Date into strings, mirroring the pattern // playlistRowView already established for /api/playlists. // -// Field names match flutter_client/lib/cache/sync_controller.dart's -// _*FromJson helpers exactly. Adding a field server-side requires a -// matching read in the Flutter helper or it'll be silently dropped. +// Field names match what the Android client deserialises in +// models/wire/SyncResponseWire.kt (Sync{Artist,Album,Track}Wire) exactly. +// Adding a field server-side requires a matching @SerialName there or it is +// silently dropped — kotlinx.serialization ignores unknown keys, so the +// failure is a missing value at runtime, not an error at parse time. import ( "git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq" diff --git a/internal/api/library_sync_views_test.go b/internal/api/library_sync_views_test.go index 3691ed69..146ad665 100644 --- a/internal/api/library_sync_views_test.go +++ b/internal/api/library_sync_views_test.go @@ -11,9 +11,11 @@ import ( // These tests pin the wire-format keys for /api/library/sync upserts. // Without them, sqlc model field-name drift or accidental -// `json.Marshal(rawStruct)` regressions would silently break the -// Flutter client (which reads snake_case keys via _*FromJson helpers -// in flutter_client/lib/cache/sync_controller.dart). +// `json.Marshal(rawStruct)` regressions would silently break the Android +// client, which reads these snake_case keys via @SerialName in +// models/wire/SyncResponseWire.kt. "Silently" is the operative word: +// kotlinx.serialization skips unknown keys, so a renamed field arrives as +// a default value rather than an error. // validUUID is a deterministic test UUID — not a real value, just // something that pgtype.UUID.Valid will accept.