import 'dart:ui' as ui; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:smplayer/core/contracts/cancellation.dart'; import 'package:smplayer/core/infra/player_engine/player_engine.dart'; class FakePlayerEngine implements PlayerEngine { FakePlayerEngine({ required bool playing, PlayerTracks tracks = const PlayerTracks(), }) { state ..playing = playing ..tracks = tracks; } final PlayerStreams _streams = PlayerStreams(); final ValueNotifier _textureId = ValueNotifier(null); final ValueNotifier _textureVersion = ValueNotifier(0); final ValueNotifier _videoSize = ValueNotifier(null); final ValueNotifier _debugStats = ValueNotifier(null); @override final PlayerState state = PlayerState(); int playCalls = 0; int pauseCalls = 0; @override PlayerStreams get stream => _streams; @override ValueListenable get textureId => _textureId; @override ValueListenable get textureVersion => _textureVersion; @override ValueNotifier get videoSize => _videoSize; @override String get displayName => 'fake'; @override bool get usesPlatformSurface => false; @override Future totalRxBytes() async => null; @override bool isNetworkStreamError(String error) => false; @override ValueListenable get debugStats => _debugStats; @override void configureHardwareDecoding(String mode) {} @override Future open( String url, { Duration start = Duration.zero, bool play = true, Map? headers, CancellationToken? cancel, }) async {} @override Future play() async { playCalls++; state.playing = true; stream.addPlaying(true); } @override Future pause() async { pauseCalls++; state.playing = false; stream.addPlaying(false); } @override Future stop() async {} @override Future seek(Duration position) async {} @override Future setRate(double rate) async {} @override Future setVolume(double volume) async {} @override Future toggleMute() async {} @override Future setAudioTrack(AudioTrack track) async {} @override Future setSubtitleTrack(SubtitleTrack track) async {} void addTracks(PlayerTracks tracks) { state.tracks = tracks; stream.addTracks(tracks); } @override void setNativeSubtitleRendering(bool enabled) {} @override void setSubtitleStyle({ required double fontSize, required double bgOpacity, required int position, }) {} @override Widget buildVideoView(BuildContext context, ValueListenable fit) { return const SizedBox.shrink(); } Future getProperty(String name) async => ''; @override Future dispose() async { _streams.dispose(); _textureId.dispose(); _textureVersion.dispose(); _videoSize.dispose(); _debugStats.dispose(); } }