From 3fc3baef83c5d4c17d280b363644ea1f0f8c1669 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Tue, 26 May 2026 12:02:48 +0200 Subject: [PATCH] fix(tv): reveal details without input --- lib/screens/media_detail_screen.dart | 24 ++++++++-------- test/screens/media_detail_screen_test.dart | 32 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/lib/screens/media_detail_screen.dart b/lib/screens/media_detail_screen.dart index 655a02c0..22c75eef 100644 --- a/lib/screens/media_detail_screen.dart +++ b/lib/screens/media_detail_screen.dart @@ -779,21 +779,19 @@ class _MediaDetailScreenState extends State _tvDetailRevealScheduled = true; WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + setState(() { + _tvDetailStableRailHeight = _tvDetailPendingRailHeight ?? railHeight; + _tvDetailRevealScheduled = false; + _tvDetailRevealed = true; + }); WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; - setState(() { - _tvDetailStableRailHeight = _tvDetailPendingRailHeight ?? railHeight; - _tvDetailRevealScheduled = false; - _tvDetailRevealed = true; - }); - WidgetsBinding.instance.addPostFrameCallback((_) { - if (!mounted) return; - if (focusPrimaryAction) { - _playButtonFocusNode.requestFocus(); - } else { - _tvDetailRailKey.currentState?.requestFocus(); - } - }); + if (focusPrimaryAction) { + _playButtonFocusNode.requestFocus(); + } else { + _tvDetailRailKey.currentState?.requestFocus(); + } }); }); } diff --git a/test/screens/media_detail_screen_test.dart b/test/screens/media_detail_screen_test.dart index abf587ac..487689dd 100644 --- a/test/screens/media_detail_screen_test.dart +++ b/test/screens/media_detail_screen_test.dart @@ -70,6 +70,38 @@ void main() { expect(titleText.style!.fontSize!, lessThan(baseFontSize)); }); + testWidgets('TV detail reveals without waiting for directional input', (tester) async { + await SettingsService.getInstance(); + + final movie = MediaItem( + id: 'movie_1', + backend: MediaBackend.jellyfin, + kind: MediaKind.movie, + title: 'Idle Reveal Movie', + summary: 'The detail foreground should appear without needing a D-pad frame.', + ); + + await tester.pumpWidget( + TranslationProvider( + child: MaterialApp( + theme: monoTheme(dark: true), + home: MediaDetailScreen(metadata: movie), + ), + ), + ); + + final revealGate = find.byWidgetPredicate( + (widget) => widget is AnimatedOpacity && widget.duration == const Duration(milliseconds: 160), + description: 'TV detail reveal AnimatedOpacity', + ); + expect(revealGate, findsOneWidget); + expect(tester.widget(revealGate).opacity, 0); + + await tester.pump(); + + expect(tester.widget(revealGate).opacity, 1); + }); + testWidgets('TV detail defaults to first regular season when specials precede it', (tester) async { await SettingsService.getInstance();