fix(live-tv): cinematic 3D depth transition, smooth mini-player fade, EPG focus & drawer navigation overhaul - #672
Conversation
…ation - Decouple focus outline from active channel state so navigating channels preserves the playing channel background and cyan indicator. - Prevent DPAD Right on channels without EPG programs from dropping focus to the row below. - Fix drawer re-entry focus trap when scrolling away from the selected playlist by implementing viewport-aware focus requester fallback in CategorySidebar.
…tModificationException
…ng, and category persistence
… channel 0/1 focus bounce, and program time clipping
…r fade - Replace slide/crossfade fullscreen transition with centered 3D depth-push (0.92 → 1.0 scale) for a premium cinematic feel - Add consistent enter/exit animation using graphicsLayer with centered pivot - Implement smooth alpha fade-in on VideoCard when returning to mini-player - Fix EPG focus anchoring to last-played channel with (resolvedIdx - 2) offset - Enable native 60fps channel list scrolling via LazyColumn D-pad handling
0be6384 to
8abb061
Compare
|
Added 49f241f on top of this PR: compact 16:9 mini-player, unframed programme information, unified column backgrounds with focus tint transitions, inset channel outlines without focus scaling, narrower channel spacing, less clutter in short EPG cells, and a viewport-clamped NOW label. Programme cells cannot steal vertical focus in channel mode; sticky text reads horizontal scroll during measurement instead of row composition. Added a vertical channel navigation regression test. Verification: signed sideload release builds successfully; all 3 GuideRenderingDeviceTest instrumentation tests passed on Android 12 emulator, including large-list rendering and offscreen EPG navigation. Installed on TCL with matching existing certificate and no data clear. Drawer open/close and 12-down/6-up channel navigation checked on TV. Caveats: a mixed TV measurement recorded 17.21% janky frames, so this is not a 60fps guarantee. NPO playback failed with PARSING_CONTAINER_UNSUPPORTED on both the previously installed build and this build; playback is not validated by this change. PR remains open for review. |
|
Follow-up 933c535: focus colours now invalidate drawing rather than row composition; removed redundant programme scale/border animations; cached the full startup channel-ID set instead of rebuilding it during screen recomposition. Focused programmes now show readable title/time/description beside the mini-player. Diagnostic banners expire after 8 seconds. Unsupported live containers get one explicit format probe rather than 3 identical retries; error/HTML redirects are not cached as valid media targets. Verification: 6 resolver unit tests passed; 4 guide instrumentation tests passed on a 2GB Android 12 emulator configuration, including 60 down / 40 up and programme focus reporting. Final release build succeeded and installed on TCL using the existing signing certificate. Visually verified NPO 1 HD and NPO 3 HD playback, fullscreen return, drawer/category changes, and first-click Add to Favorites (test change restored). IMPORTANT: performance acceptance is still FAILED. Short rapid-key stress runs with live playback measured 55-59% janky frames on final build, versus 29% on an earlier non-playing run; these are not controlled like-for-like benchmarks and do not establish a speed improvement. Do not merge on a claim of smoothness. Remaining work is profiling the live-playback/guide CPU contention and sustained real-device navigation before release. |
Summary
Comprehensive overhaul of the Live TV experience across 8 files (+814 / -341 lines). This PR replaces the previous jarring zoom/crossfade with a centered 3D cinematic depth-push transition, adds smooth mini-player alpha fade-in, fixes D-pad navigation traps, eliminates focus bounce, resolves drawer collapse jumps, and fixes EPG text clipping.
🎬 Cinematic 3D Depth Transition & Mini-Player Smoothness
(0.5f, 0.5f):0.921.0scale, withalpha0f1f).1.00.92scale).playerAlphaanimated state (FastOutSlowInEasing, 280ms) inMiniPlayer.kttoVideoCardandLiveBug. When returning from fullscreen, the mini-player gracefully fades in rather than snapping into view.miniPlayerActiveis only active when completely out of fullscreen (!isFullScreen && fsProgress == 0f), preventing surface stealing or black flicker mid-animation. Focus restoration is deferred until the transition is 100% complete.🧭 EPG Grid Navigation & Focus Anchoring
(resolvedIdx - 2).coerceAtLeast(0)on launch/return, providing 2 channels of visible context above the selected channel rather than snapping it to the edge.LazyColumnto handle D-pad vertical movement naturally instead of intercepting every step with synthetic focus updates. This eliminates focus bounce between channels 0 and 1 and restores native smooth scrolling.hasFocusablePrograms): Moving vertically between EPG program rows checks if the target channel actually has focusable programs (including catchup window validation). If no programs are focusable, focus gracefully drops to the channel header (onExitEpg) instead of getting trapped or dropping to unrelated rows.placement.isNow) where applicable.contentStartOffsetDpcalculation inProgramsRowandProgramCellso that when scrolling past the start of a long program, the title and synopsis shift into view (scrolledPastPx.coerceAtMost(maxShiftPx)), keeping metadata readable.visuallyFocusedLiveColors.PanelRaised) from the playing channel indicator (isActiveLiveColors.FocusBgwith cyan indicator). Fixed the issue where navigating away from a playing channel turned the entire EPG row solid blue.📂 Category Sidebar & Drawer Robustness
LazyColumnlayout infoConcurrentModificationException: Captured a snapshot list (categoryFocusRequesters.values.toList()) before iterating over requesters during rapid navigation.clipToBounds()and width containment to prevent layout jumping when opening/closing the drawer.expandedPlaylistIdsbased on the selected category so returning from home or navigating within a playlist does not collapse the section.favcategory when item count is 0 in bothCategorySidebarandTouchCategoryRail.🎨 Typography & Layout Fixes
ProgramCelltypography (CellTitleto 9.5sp / 12sp line-height, synopsis and timestamps to 8sp / 10sp line-height) and reduced padding (4dp.clipToBounds()to the channel title column inChannelRow.ktto prevent text bleed during quick scroll transitions.lastFocusedZone = "GUIDE"and allowed optional parameters inTvViewModel.rememberTvSessionfor clean partial updates.Files Changed
LiveTvScreen.ktMiniPlayer.ktplayerAlphafade-in, bounds reporting, conditional player attachmentEpgGrid.ktCategorySidebar.ktChannelRow.ktProgramCell.ktcontentStartOffsetDpsupportTouchCategoryRail.ktTvViewModel.ktrememberTvSessionVerification & Testing