import 'package:audio_service/audio_service.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../shared/cover.dart'; import '../shared/theme.dart'; import 'audio_handler.dart'; import 'now_playing_screen.dart'; /// Kompakte Wiedergabe-Leiste über der Bottom-Nav. /// Blendet sich aus, wenn nichts läuft. class MiniPlayer extends StatelessWidget { const MiniPlayer({super.key}); @override Widget build(BuildContext context) { final handler = context.read(); return StreamBuilder( stream: handler.mediaItem, builder: (context, snapshot) { final item = snapshot.data; if (item == null) return const SizedBox.shrink(); return Material( color: MeloTheme.surface, child: InkWell( onTap: () => Navigator.of(context).push(MaterialPageRoute( builder: (_) => const NowPlayingScreen(), )), child: Column( children: [ Expanded( child: SizedBox( height: 80, child: Row( children: [ const SizedBox(width: 12), Padding( padding: const EdgeInsets.all(8), child: CoverImage(artUri: item.artUri, size: 64, radius: 8), ), const SizedBox(width: 12), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(item.title, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.w600)), Text(item.artist ?? 'Unbekannt', maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( color: Colors.white54, fontSize: 12)), ], ), ), StreamBuilder( stream: handler.playbackState, builder: (context, snap) { final playing = snap.data?.playing ?? false; return Row( mainAxisSize: MainAxisSize.min, children: [ IconButton( icon: const Icon(Icons.skip_previous), onPressed: handler.skipToPrevious, ), IconButton( tooltip: playing ? 'Pause' : 'Abspielen', icon: Icon(playing ? Icons.pause : Icons.play_arrow, size: 28), onPressed: playing ? handler.pause : handler.play, ), IconButton( icon: const Icon(Icons.skip_next), onPressed: handler.skipToNext, ), ], ); }, ), const SizedBox(width: 8), ], ), ), ), StreamBuilder( stream: handler.durationStream, builder: (context, dSnap) { final duration = dSnap.data ?? Duration.zero; return StreamBuilder( stream: handler.positionStream, builder: (context, pSnap) { final position = pSnap.data ?? Duration.zero; return LinearProgressIndicator( value: duration.inMilliseconds > 0 ? (position.inMilliseconds / duration.inMilliseconds).clamp(0.0, 1.0) : 0, minHeight: 3, backgroundColor: Colors.white12, valueColor: const AlwaysStoppedAnimation(MeloTheme.red), ); }, ); }, ), ], ), ), ); }, ); } }