Show spinner when collections are ready but catalogs haven't arrived
yet. Prevents collections from grabbing focus before catalogs appear
above them. Also tracks initial auto-selected row to properly detect
when new rows appear before the focused row during loading.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Inject WatchProgressRepository and WatchedSeriesStateHolder into
FolderDetailViewModel to observe movie and series watched status
- Add movieWatchedStatus to FolderDetailUiState
- Pass isItemWatched callback to all three view modes:
Tabbed Grid (ContentCard), Rows (CatalogRowSection), and
Follow Layout (Classic/Grid/Modern home content renderers)
- Rebuild Follow Layout state when watched status changes so badges
update reactively
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Clear focusedCatalogSelection when a collection folder gets focus,
not just continue watching rows. Previously the old catalog item's
trailer request stayed active and played in the hero area after
navigating to a collection folder.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix collection row focus restoration using key-based matching instead
of positional index (survives row shifts during catalog loading)
- Add per-item FocusRequesters to CollectionRowSection for proper focus
restore when navigating back from folder detail
- Remove Copy JSON and Paste import from Android TV (keep in WebUI)
- Default import mode to File instead of Paste
- WebUI: add Collection badge pill in Home Layout tab, send to top/bottom
buttons, tab renamed to Home Layout, 2x2 grid for order buttons
- Update subtitle to "Manage addons, catalogs, and collections"
- Collections tab: rename Enable/Disable to Show/Hide All
- Folder detail header icon respects tileShape aspect ratio
- Respect hideTitle in Modern layout hero and card labels
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The default layout (MODERN) composes first on fresh start, then
preferences load and switch to CLASSIC. Modern's onDispose was
saving focus state (hasSavedFocus=true) which poisoned Classic's
initial focus logic, preventing the hero from receiving focus.
- Add suppressFocusSave flag to block outgoing layout's dispose save
- Defer Classic content focus with spinner until hero resolves
- Use heroSectionEnabled (default true) for deferral since
heroCatalogKeys arrives late via 300ms preference debounce
- 2s safety timeout prevents infinite spinner if hero has no data
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>