Fix restore queueSource

Make queueSource responsive
Fix some warnings
This commit is contained in:
Pato05 2024-02-14 23:06:04 +01:00
parent 2a5a51e43f
commit e782643ee0
No known key found for this signature in database
GPG key ID: ED4C6F9C3D574FB6
4 changed files with 79 additions and 59 deletions

View file

@ -1,6 +1,5 @@
import 'package:audio_service/audio_service.dart'; import 'package:audio_service/audio_service.dart';
import 'package:audio_session/audio_session.dart'; import 'package:audio_session/audio_session.dart';
import 'package:flutter/foundation.dart';
import 'package:freezer/api/cache.dart'; import 'package:freezer/api/cache.dart';
import 'package:freezer/api/deezer.dart'; import 'package:freezer/api/deezer.dart';
import 'package:freezer/api/audio_sources/deezer_audio_source.dart'; import 'package:freezer/api/audio_sources/deezer_audio_source.dart';
@ -802,6 +801,13 @@ class AudioPlayerTask extends BaseAudioHandler {
_queueAutoIncrement = q.length; _queueAutoIncrement = q.length;
queue.add(q); queue.add(q);
await _loadQueue(preload: false); await _loadQueue(preload: false);
//Send restored queue source to ui
customEvent.add({
'action': 'onRestore',
'queueSource': queueSource!,
'repeatMode': _repeatMode
});
} }
@override @override

View file

@ -15,7 +15,6 @@ class PlayerHelper {
late StreamSubscription _customEventSubscription; late StreamSubscription _customEventSubscription;
late StreamSubscription _mediaItemSubscription; late StreamSubscription _mediaItemSubscription;
late StreamSubscription _playbackStateStreamSubscription; late StreamSubscription _playbackStateStreamSubscription;
QueueSource? queueSource;
AudioServiceRepeatMode repeatType = AudioServiceRepeatMode.none; AudioServiceRepeatMode repeatType = AudioServiceRepeatMode.none;
bool equalizerOpen = false; bool equalizerOpen = false;
bool _shuffleEnabled = false; bool _shuffleEnabled = false;
@ -30,6 +29,9 @@ class PlayerHelper {
// StreamController _visualizerController = StreamController.broadcast(); // StreamController _visualizerController = StreamController.broadcast();
// Stream get visualizerStream => _visualizerController.stream; // Stream get visualizerStream => _visualizerController.stream;
final _queueSourceSubject = BehaviorSubject<QueueSource>();
ValueStream<QueueSource> get queueSource => _queueSourceSubject.stream;
final _streamInfoSubject = BehaviorSubject<StreamQualityInfo>(); final _streamInfoSubject = BehaviorSubject<StreamQualityInfo>();
ValueStream<StreamQualityInfo> get streamInfo => _streamInfoSubject.stream; ValueStream<StreamQualityInfo> get streamInfo => _streamInfoSubject.stream;
@ -92,7 +94,7 @@ class PlayerHelper {
switch (event['action']) { switch (event['action']) {
case 'onRestore': case 'onRestore':
//Load queueSource from isolate //Load queueSource from isolate
queueSource = event['queueSource'] as QueueSource; _queueSourceSubject.add(event['queueSource'] as QueueSource);
repeatType = event['repeatMode'] as AudioServiceRepeatMode; repeatType = event['repeatMode'] as AudioServiceRepeatMode;
_queueIndex = getQueueIndex(); _queueIndex = getQueueIndex();
break; break;
@ -202,7 +204,7 @@ class PlayerHelper {
//Play mix by track //Play mix by track
Future playMix(String trackId, String trackTitle) async { Future playMix(String trackId, String trackTitle) async {
List<Track> tracks = (await deezerAPI.playMix(trackId))!; List<Track> tracks = await deezerAPI.playMix(trackId);
await playFromTrackList( await playFromTrackList(
tracks, tracks,
tracks[0].id, tracks[0].id,
@ -277,7 +279,7 @@ class PlayerHelper {
Future<void> playFromTrackList( Future<void> playFromTrackList(
List<Track> tracks, String? trackId, QueueSource queueSource) async { List<Track> tracks, String? trackId, QueueSource queueSource) async {
final queue = final queue =
tracks.map<MediaItem>((track) => track!.toMediaItem()).toList(); tracks.map<MediaItem>((track) => track.toMediaItem()).toList();
await setQueueSource(queueSource); await setQueueSource(queueSource);
await _loadQueuePlay( await _loadQueuePlay(
queue, trackId == null ? 0 : queue.indexWhere((m) => m.id == trackId)); queue, trackId == null ? 0 : queue.indexWhere((m) => m.id == trackId));
@ -311,7 +313,7 @@ class PlayerHelper {
} }
Future setQueueSource(QueueSource queueSource) async { Future setQueueSource(QueueSource queueSource) async {
this.queueSource = queueSource; _queueSourceSubject.add(queueSource);
await audioHandler.customAction('queueSource', queueSource.toJson()); await audioHandler.customAction('queueSource', queueSource.toJson());
} }

View file

@ -536,7 +536,7 @@ class _LibraryTracksState extends State<LibraryTracks> {
), ),
const SizedBox(height: 8.0), const SizedBox(height: 8.0),
for (final track in allTracks) for (final track in allTracks)
TrackTile.fromTrack(track!, onTap: () { TrackTile.fromTrack(track, onTap: () {
playerHelper.playFromTrackList( playerHelper.playFromTrackList(
allTracks, allTracks,
track.id, track.id,

View file

@ -787,41 +787,46 @@ class PlaybackControls extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0), padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Row( child: StreamBuilder<QueueSource>(
mainAxisAlignment: MainAxisAlignment.spaceBetween, stream: playerHelper.queueSource,
mainAxisSize: MainAxisSize.max, builder: (context, snapshot) {
children: [ final queueSource = snapshot.data;
playerHelper.queueSource?.source != 'show' return Row(
? ShuffleButton(iconSize: size * 0.75) mainAxisAlignment: MainAxisAlignment.spaceBetween,
: const ForwardReplay30Button(forward: false), mainAxisSize: MainAxisSize.max,
PrevNextButton(size, prev: true), children: [
if (settings.enableFilledPlayButton) queueSource?.source != 'show'
Consumer<BackgroundProvider>(builder: (context, provider, _) { ? ShuffleButton(iconSize: size * 0.75)
final color = provider.dominantColor == null : const ForwardReplay30Button(forward: false),
? Colors.transparent PrevNextButton(size, prev: true),
: Theme.of(context).brightness == Brightness.light if (settings.enableFilledPlayButton)
? provider.dominantColor! Consumer<BackgroundProvider>(builder: (context, provider, _) {
: darken(provider.dominantColor!); final color = provider.dominantColor == null
return PlayPauseButton(size * 2.25, ? Colors.transparent
filled: true, : Theme.of(context).brightness == Brightness.light
material3: settings.enableMaterial3PlayButton, ? provider.dominantColor!
color: color, : darken(provider.dominantColor!);
iconColor: Color.lerp( return PlayPauseButton(size * 2.25,
(ThemeData.estimateBrightnessForColor(color) == filled: true,
Brightness.light material3: settings.enableMaterial3PlayButton,
? Colors.black color: color,
: Colors.white), iconColor: Color.lerp(
color, (ThemeData.estimateBrightnessForColor(color) ==
0.25)); Brightness.light
}) ? Colors.black
else : Colors.white),
PlayPauseButton(size * 1.25), color,
PrevNextButton(size), 0.25));
playerHelper.queueSource?.source != 'show' })
? RepeatButton(size * 0.75) else
: const ForwardReplay30Button(forward: true), PlayPauseButton(size * 1.25),
], PrevNextButton(size),
), queueSource?.source != 'show'
? RepeatButton(size * 0.75)
: const ForwardReplay30Button(forward: true),
],
);
}),
); );
} }
} }
@ -997,22 +1002,29 @@ class PlayerScreenTopRow extends StatelessWidget {
iconSize: size, iconSize: size,
splashRadius: size * 1.5, splashRadius: size * 1.5,
), ),
if (playerHelper.queueSource != null) Expanded(
Expanded( child: StreamBuilder<QueueSource>(
child: RichText( stream: playerHelper.queueSource,
textAlign: TextAlign.center, builder: (context, snapshot) {
maxLines: 2, final queueSource = snapshot.data;
text: TextSpan(children: [ if (queueSource == null) {
if (!short) return const SizedBox.shrink();
TextSpan( }
text: '${'PLAYING FROM'.i18n}\n', return RichText(
style: TextStyle( textAlign: TextAlign.center,
fontWeight: FontWeight.bold, maxLines: 2,
letterSpacing: 1.5, text: TextSpan(children: [
fontSize: (textSize ?? 38.sp) * 0.85)), if (!short)
TextSpan(text: playerHelper.queueSource!.text ?? '') TextSpan(
], style: TextStyle(fontSize: textSize ?? 38.sp))), text: '${'PLAYING FROM'.i18n}\n',
), style: TextStyle(
fontWeight: FontWeight.bold,
letterSpacing: 1.5,
fontSize: (textSize ?? 38.sp) * 0.85)),
TextSpan(text: queueSource.text ?? '')
], style: TextStyle(fontSize: textSize ?? 38.sp)));
}),
),
showQueueButton showQueueButton
? IconButton( ? IconButton(
icon: Icon( icon: Icon(
@ -1158,7 +1170,7 @@ class BottomBarControls extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final iconSize = size * 0.9; final iconSize = size * 0.9;
if (playerHelper.queueSource?.source == 'show') { if (playerHelper.queueSource.valueOrNull?.source == 'show') {
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,