import 'package:flutter/foundation.dart'; import 'package:plezy/media/lyrics.dart'; import 'package:plezy/media/media_item.dart'; import 'package:plezy/services/music/music_playback_service.dart'; /// No-op base for test doubles, which override only the members under test. /// Production always binds `MusicPlaybackServiceImpl`. class StubMusicPlaybackService extends MusicPlaybackService { final ValueNotifier _volumeNotifier = ValueNotifier(100); int _playIntentGeneration = 0; int _queueSessionRevision = 0; @override MediaItem? get currentTrack => null; @override MusicPlaybackStatus get status => MusicPlaybackStatus.idle; @override Duration? get duration => null; @override Duration get position => Duration.zero; @override Stream get positionStream => const Stream.empty(); @override List get queue => const []; @override int get currentIndex => -1; @override MusicPlayContext? get playContext => null; @override bool get shuffled => false; @override MusicRepeatMode get repeatMode => MusicRepeatMode.off; @override Stream get errors => const Stream.empty(); @override int beginPlayIntent() => ++_playIntentGeneration; @override bool isPlayIntentCurrent(int intent) => intent == _playIntentGeneration; @override int get queueSessionRevision => _queueSessionRevision; @override Future playFromList({ required List tracks, MediaItem? startTrack, required MusicPlayContext playContext, bool shuffle = false, }) async { beginPlayIntent(); _queueSessionRevision++; } @override Future playInstantMix(MediaItem seed) async {} @override Future play() async {} @override Future pause() async {} @override Future togglePlayPause() async {} @override Future next() async {} @override Future previous() async {} @override Future seek(Duration position) async {} @override double get volume => 100; @override ValueListenable get volumeListenable => _volumeNotifier; @override Future setVolume(double volume, {bool persist = true}) async {} @override void setRepeatMode(MusicRepeatMode mode) {} @override void toggleShuffle() {} @override Future jumpTo(int index) async {} @override void removeAt(int index) {} @override void reorder(int from, int to) {} @override void addNext(List tracks) {} @override void addToEnd(List tracks) {} @override void clearUpcoming() {} @override Future stop() async { beginPlayIntent(); _queueSessionRevision++; } @override bool get sleepTimerActive => false; @override DateTime? get sleepTimerEndsAt => null; @override Duration? get sleepTimerDuration => null; @override bool get sleepTimerEndOfTrack => false; @override void setSleepTimer(Duration? duration, {bool endOfTrack = false}) {} @override Future fetchLyrics(MediaItem track) async => null; @override void dispose() { _volumeNotifier.dispose(); super.dispose(); } }