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.