fix(tv): restore passthrough setting visibility

This commit is contained in:
edde746
2026-06-15 13:28:38 +02:00
parent 1b29cb3ef7
commit 1aa06ffe90
2 changed files with 122 additions and 2 deletions
@@ -547,8 +547,8 @@ class _VideoSettingsSheetState extends State<VideoSettingsSheet> {
},
),
// Audio Passthrough (desktop and Apple TV)
if (PlatformDetector.isDesktopOS() || PlatformDetector.isAppleTV())
// Audio Passthrough (desktop and Android TV)
if (PlatformDetector.supportsAudioPassthrough())
_SettingsToggleItem(
pref: SettingsService.audioPassthrough,
icon: Symbols.surround_sound_rounded,
+120
View File
@@ -0,0 +1,120 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/mpv/models.dart';
import 'package:plezy/mpv/player/player.dart';
import 'package:plezy/mpv/player/player_state.dart';
import 'package:plezy/mpv/player/player_streams.dart';
import 'package:plezy/services/settings_service.dart';
import 'package:plezy/theme/mono_tokens.dart';
import 'package:plezy/utils/platform_detector.dart';
import 'package:plezy/widgets/video_controls/sheets/video_settings_sheet.dart';
import '../test_helpers/prefs.dart';
const _testTokens = MonoTokens(
radiusSm: 4,
radiusMd: 8,
space: 8,
fast: Duration(milliseconds: 100),
normal: Duration(milliseconds: 200),
slow: Duration(milliseconds: 300),
bg: Colors.black,
surface: Color(0xFF111111),
outline: Color(0xFF333333),
text: Colors.white,
textMuted: Color(0xFFAAAAAA),
splashFactory: NoSplash.splashFactory,
);
void main() {
setUp(() async {
resetSharedPreferencesForTest();
SettingsService.resetForTesting();
await SettingsService.getInstance();
TvDetectionService.debugSetAppleTVOverride(null);
});
tearDown(() {
TvDetectionService.debugSetAppleTVOverride(null);
});
testWidgets('shows audio passthrough on supported TV-style surfaces', (tester) async {
await _pumpSheet(tester);
await tester.scrollUntilVisible(find.text('Audio Passthrough'), 500, scrollable: find.byType(Scrollable).first);
expect(find.text('Audio Passthrough'), findsOneWidget);
});
testWidgets('hides audio passthrough on Apple TV', (tester) async {
TvDetectionService.debugSetAppleTVOverride(true);
await _pumpSheet(tester);
await tester.drag(find.byType(ListView), const Offset(0, -800));
await tester.pumpAndSettle();
expect(find.text('Audio Passthrough'), findsNothing);
});
}
Future<void> _pumpSheet(WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
theme: ThemeData(extensions: const [_testTokens]),
home: Scaffold(
body: SizedBox(
width: 900,
height: 700,
child: VideoSettingsSheet(
player: _FakeSettingsPlayer(),
audioSyncOffset: 0,
subtitleSyncOffset: 0,
canControl: false,
),
),
),
),
);
await tester.pumpAndSettle();
}
class _FakeSettingsPlayer implements Player {
_FakeSettingsPlayer()
: _streams = PlayerStreams(
playing: const Stream<bool>.empty(),
completed: const Stream<bool>.empty(),
buffering: const Stream<bool>.empty(),
position: const Stream<Duration>.empty(),
duration: const Stream<Duration>.empty(),
seekable: const Stream<bool>.empty(),
buffer: const Stream<Duration>.empty(),
volume: const Stream<double>.empty(),
rate: const Stream<double>.empty(),
tracks: const Stream<Tracks>.empty(),
track: const Stream<TrackSelection>.empty(),
log: const Stream<PlayerLog>.empty(),
error: const Stream<PlayerError>.empty(),
audioDevice: const Stream<AudioDevice>.empty(),
audioDevices: const Stream<List<AudioDevice>>.empty(),
bufferRanges: const Stream<List<BufferRange>>.empty(),
playbackRestart: const Stream<void>.empty(),
backendSwitched: const Stream<void>.empty(),
);
final PlayerStreams _streams;
@override
PlayerState get state => const PlayerState();
@override
PlayerStreams get streams => _streams;
@override
String get playerType => 'exoplayer';
@override
Future<void> setAudioPassthrough(bool enabled) async {}
@override
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}