summaryrefslogtreecommitdiff
path: root/CLAUDE.md
diff options
context:
space:
mode:
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md15
1 files changed, 15 insertions, 0 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index 67de4bd..130d3a8 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -143,6 +143,21 @@ intro/outro skipping. Schema fields for manual skip offsets exist but nothing re
- **Feeds are big.** A real subscription in testing produced 2753 episodes in one refresh. Any
per-episode work — a query in a loop, an O(n²) match — needs to be considered at that scale.
+- **The service is a `MediaLibraryService`, not a `MediaSessionService`.** Android Auto only
+ treats an app as driving-friendly if it can browse a media library. Three things are each
+ individually fatal and none of them fail loudly: the `automotive_app_desc.xml` meta-data must
+ sit at *application* level, the service must be `exported` (the controller is another
+ process), and `onConnect` must grant `DEFAULT_SESSION_AND_LIBRARY_COMMANDS` — with plain
+ `DEFAULT_SESSION_COMMANDS` a car connects successfully and then gets PERMISSION_DENIED on the
+ library root. `MediaBrowseTest` walks the tree over the real protocol to catch all three.
+
+- **Car head units show about three transport controls.** Leave `COMMAND_SEEK_TO_PREVIOUS`/`NEXT`
+ available and they take the slots, pushing skip-forward off the screen. They are removed in
+ `onConnect` so the seek buttons get the room.
+
+- **XML comments cannot contain `--`.** The house prose style uses it constantly and it makes
+ the manifest unparseable, with a merge error that doesn't name the line.
+
- **The playing episode is always the head of the queue.** `advance()` drops the head, so if
something played from a show list isn't there, finishing it deletes a queued episode unplayed.
`play()` calls `playNow()` first to hold that invariant. Don't add a playback entry point that