You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
PulsingLiveDot: rememberInfiniteTransition fires a 800ms scale animation every frame while Live tab visible — 3 concurrent animation sources on the screen. Switch to RepeatMode.Reverse with 1200ms cycle, or replace scale with alpha pulse. (perf Audio track selection (multi-language) #12)
EpgChannelMatcher mutable state: has var totalResolved, var totalMissed, val loggedMisses = mutableSetOf() mutated on every resolve() — not thread-safe if called concurrently. Move diagnostic counting out or use AtomicInteger. (quality Favourite channel zapping (Sky-style) #11)
HomeViewModel.isInWatchlist() redundant: uses .first() on a Flow while watchlist: StateFlow already exists on the same VM. Delete and have callers check watchlist.value. (idioms Last-watched channel memory #6)
Two LaunchedEffect(Unit) in Shell.kt for unrelated effects: replace with named keys like LaunchedEffect("splashTimeout") and LaunchedEffect("initialFocus"). (idioms Stream error recovery (auto-retry) #7)
Shell.kt holds second HomeViewModel subscription just for splash dismiss. Move the "first data arrived" signal into EnrichmentProgressTracker or a dedicated SplashViewModel. (perf Search result poster thumbnails #15)
Catch-all for the smaller cleanups flagged in the review. Each is independently trivial but they share the theme of "tidy while in the neighbourhood".
From various:
architect.md#13,quality.md#10, #11, #12,idioms.md#6, #7,perf.md#12, #15ContentTypeenum:ContentType.ktexists but every DB/UI site uses raw"live"/"movie"/"show"strings. Add.dbValueand roll out. (arch 'More Like This' rail on detail screens #13, quality Background sync via WorkManager #10)PulsingLiveDot:rememberInfiniteTransitionfires a 800ms scale animation every frame while Live tab visible — 3 concurrent animation sources on the screen. Switch toRepeatMode.Reversewith 1200ms cycle, or replace scale with alpha pulse. (perf Audio track selection (multi-language) #12)EpgChannelMatchermutable state: hasvar totalResolved,var totalMissed,val loggedMisses = mutableSetOf()mutated on everyresolve()— not thread-safe if called concurrently. Move diagnostic counting out or useAtomicInteger. (quality Favourite channel zapping (Sky-style) #11)M3uParser.currentExtinf!!after null-check: smart-cast blocked by mutablevar. Copy to local val or useletblock. (quality Audio track selection (multi-language) #12)HomeViewModel.isInWatchlist()redundant: uses.first()on a Flow whilewatchlist: StateFlowalready exists on the same VM. Delete and have callers checkwatchlist.value. (idioms Last-watched channel memory #6)LaunchedEffect(Unit)in Shell.kt for unrelated effects: replace with named keys likeLaunchedEffect("splashTimeout")andLaunchedEffect("initialFocus"). (idioms Stream error recovery (auto-retry) #7)HomeViewModelsubscription just for splash dismiss. Move the "first data arrived" signal intoEnrichmentProgressTrackeror a dedicatedSplashViewModel. (perf Search result poster thumbnails #15)