Follow-up to #251. The Android TV app was rebuilt around a cinematic TV-native UI with new design tokens, a slide-from-right settings drawer, a server-picker grid, fullscreen-first playback, and a focused recovery model (Retry / Reload). Behavioural decisions are documented in android/InfiniteStreamPlayer/BEHAVIOR.md.
This issue covers porting that rework across the Apple targets — iPhone, iPad, and Apple TV. The existing project already shares one /InfiniteStreamPlayer/ source folder between the iOS and tvOS targets, so the rewrite lands across all three at once with platform branches where layout has to differ.
Scope
- Design tokens — Fraunces / Inter Tight / JetBrains Mono via SwiftUI fonts, warm gold accent, coral LIVE badge, focus-ring + scale rules where the platform supports them.
- Server picker — cinematic grid replacing the current button row + AddServerSheet. Pairing + mDNS discovery + manual entry preserved.
- Home — Continue Watching hero + frequency-ordered live preview tiles + bottom nav removed. iPhone/iPad get adapted layouts; tvOS matches Android TV's spec closely.
- Playback — fullscreen first; HUD reveal on tap (iOS) / D-pad-Down (tvOS). Same metadata pills, transport, scrubber.
- Settings drawer — slide-from-right (46% on tvOS/iPad, full-width sheet on iPhone). Picker-list-pop-then-close Back semantics. Six Advanced toggles parity with Android.
- Recovery — Retry (re-prepare same URL on same AVPlayer) + Reload (replace AVPlayer instance and re-issue original proxy URL). No Restart. Auto-recovery: codec retry up to 3× with backoff, non-codec single retry when flag enabled.
- Persistence — UserDefaults parity with Android's SharedPreferences: server list, flags, lastPlayed, viewCounts (per
clip_id), /api/content cache (stale-while-revalidate).
- State layer — single
PlayerViewModel analogue holding all state, persisted bits hydrated on init.
Out of scope (this issue)
Follow-up to #251. The Android TV app was rebuilt around a cinematic TV-native UI with new design tokens, a slide-from-right settings drawer, a server-picker grid, fullscreen-first playback, and a focused recovery model (Retry / Reload). Behavioural decisions are documented in
android/InfiniteStreamPlayer/BEHAVIOR.md.This issue covers porting that rework across the Apple targets — iPhone, iPad, and Apple TV. The existing project already shares one
/InfiniteStreamPlayer/source folder between the iOS and tvOS targets, so the rewrite lands across all three at once with platform branches where layout has to differ.Scope
clip_id),/api/contentcache (stale-while-revalidate).PlayerViewModelanalogue holding all state, persisted bits hydrated on init.Out of scope (this issue)