7024549e35
CacheIndexer observes PlayerController.uiState and records each played track into audio_cache_index (source=INCIDENTAL), bumping lastPlayedAt on re-play. This gives the offline ShuffleSource pools their data source — previously the index was never written, so the pools were inert. MediaItems now set a custom cache key of trackId so Media3's SimpleCache is keyed per track (sets up slice 2's residency queries). Intentional divergence from Flutter's file-per-track index: SimpleCache (span-based) is the real byte store, so the index is a lightweight play-recency record. Slice 2 (#33) queries SimpleCache for true residency + size + eviction-sync to drive the cached indicator dot. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>