| 
									
										
										
										
											2020-05-13 19:27:57 +02:00
										 |  |  | import 'dart:async'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-02 21:05:49 +01:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							| 
									
										
										
										
											2020-05-04 21:49:44 +02:00
										 |  |  | import 'package:musicus_common/musicus_common.dart'; | 
					
						
							| 
									
										
										
										
											2020-04-24 22:41:52 +02:00
										 |  |  | import 'package:musicus_database/musicus_database.dart'; | 
					
						
							| 
									
										
										
										
											2019-12-02 21:05:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import '../screens/program.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import 'play_pause_button.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 19:27:57 +02:00
										 |  |  | class PlayerBar extends StatefulWidget { | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   _PlayerBarState createState() => _PlayerBarState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _PlayerBarState extends State<PlayerBar> { | 
					
						
							|  |  |  |   MusicusBackendState _backend; | 
					
						
							|  |  |  |   StreamSubscription<InternalTrack> _currentTrackSubscribtion; | 
					
						
							|  |  |  |   WorkInfo _workInfo; | 
					
						
							|  |  |  |   List<int> _partIds; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void didChangeDependencies() { | 
					
						
							|  |  |  |     super.didChangeDependencies(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _backend = MusicusBackend.of(context); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _currentTrackSubscribtion?.cancel(); | 
					
						
							|  |  |  |     _currentTrackSubscribtion = _backend.playback.currentTrack.listen((track) { | 
					
						
							|  |  |  |       if (track != null) { | 
					
						
							|  |  |  |         _setTrack(track.track); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> _setTrack(Track track) async { | 
					
						
							|  |  |  |     final recording = | 
					
						
							|  |  |  |         await _backend.db.recordingById(track.recordingId).getSingle(); | 
					
						
							|  |  |  |     final workInfo = await _backend.db.getWork(recording.work); | 
					
						
							|  |  |  |     final partIds = track.partIds; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (mounted) { | 
					
						
							|  |  |  |       setState(() { | 
					
						
							|  |  |  |         _workInfo = workInfo; | 
					
						
							|  |  |  |         _partIds = partIds; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-02 21:05:49 +01:00
										 |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2020-05-13 19:27:57 +02:00
										 |  |  |     String title; | 
					
						
							|  |  |  |     String subtitle; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (_workInfo != null) { | 
					
						
							|  |  |  |       title = _workInfo.composers | 
					
						
							|  |  |  |           .map((p) => '${p.firstName} ${p.lastName}') | 
					
						
							|  |  |  |           .join(', '); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       final subtitleBuffer = StringBuffer(_workInfo.work.title); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (_partIds.isNotEmpty) { | 
					
						
							|  |  |  |         subtitleBuffer.write(': '); | 
					
						
							| 
									
										
										
										
											2020-05-13 20:52:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 22:05:18 +02:00
										 |  |  |         final section = _workInfo.sections.lastWhere( | 
					
						
							|  |  |  |           (s) => s.beforePartIndex <= _partIds[0], | 
					
						
							|  |  |  |           orElse: () => null, | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 20:52:25 +02:00
										 |  |  |         if (section != null) { | 
					
						
							|  |  |  |           subtitleBuffer.write(section.title); | 
					
						
							|  |  |  |           subtitleBuffer.write(': '); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 19:27:57 +02:00
										 |  |  |         subtitleBuffer.write( | 
					
						
							|  |  |  |             _partIds.map((i) => _workInfo.parts[i].part.title).join(', ')); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       subtitle = subtitleBuffer.toString(); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       title = '...'; | 
					
						
							|  |  |  |       subtitle = '...'; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-12-02 21:05:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return BottomAppBar( | 
					
						
							|  |  |  |       child: InkWell( | 
					
						
							|  |  |  |         child: Column( | 
					
						
							|  |  |  |           mainAxisSize: MainAxisSize.min, | 
					
						
							|  |  |  |           children: <Widget>[ | 
					
						
							|  |  |  |             StreamBuilder( | 
					
						
							| 
									
										
										
										
											2020-05-13 19:27:57 +02:00
										 |  |  |               stream: _backend.playback.normalizedPosition, | 
					
						
							| 
									
										
										
										
											2019-12-02 21:05:49 +01:00
										 |  |  |               builder: (context, snapshot) => LinearProgressIndicator( | 
					
						
							|  |  |  |                 value: snapshot.data, | 
					
						
							|  |  |  |               ), | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             Row( | 
					
						
							|  |  |  |               children: <Widget>[ | 
					
						
							|  |  |  |                 Padding( | 
					
						
							|  |  |  |                   padding: const EdgeInsets.all(8.0), | 
					
						
							|  |  |  |                   child: Icon(Icons.keyboard_arrow_up), | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 Expanded( | 
					
						
							| 
									
										
										
										
											2020-05-13 19:27:57 +02:00
										 |  |  |                   child: Column( | 
					
						
							|  |  |  |                     crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							|  |  |  |                     children: <Widget>[ | 
					
						
							|  |  |  |                       DefaultTextStyle.merge( | 
					
						
							|  |  |  |                         style: TextStyle(fontWeight: FontWeight.bold), | 
					
						
							|  |  |  |                         child: Text(title), | 
					
						
							|  |  |  |                       ), | 
					
						
							|  |  |  |                       Text(subtitle), | 
					
						
							|  |  |  |                     ], | 
					
						
							| 
									
										
										
										
											2019-12-02 21:05:49 +01:00
										 |  |  |                   ), | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 PlayPauseButton(), | 
					
						
							|  |  |  |               ], | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |           ], | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |         onTap: () => Navigator.push( | 
					
						
							|  |  |  |           context, | 
					
						
							|  |  |  |           MaterialPageRoute( | 
					
						
							|  |  |  |             builder: (context) => ProgramScreen(), | 
					
						
							|  |  |  |           ), | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-05-13 19:27:57 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void dispose() { | 
					
						
							|  |  |  |     super.dispose(); | 
					
						
							|  |  |  |     _currentTrackSubscribtion?.cancel(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-12-02 21:05:49 +01:00
										 |  |  | } |