summaryrefslogtreecommitdiffstats
path: root/lib/musicPage.dart
diff options
context:
space:
mode:
Diffstat (limited to 'lib/musicPage.dart')
-rw-r--r--lib/musicPage.dart462
1 files changed, 462 insertions, 0 deletions
diff --git a/lib/musicPage.dart b/lib/musicPage.dart
new file mode 100644
index 0000000..ea01a4e
--- /dev/null
+++ b/lib/musicPage.dart
@@ -0,0 +1,462 @@
+// SPDX-License-Identifier: Apache-2.0
+
+import 'dart:async';
+
+import 'package:badges/badges.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter/material.dart';
+
+import 'package:musicplayer/size.dart';
+
+import 'music_methods/controller.dart';
+import 'music_methods/modeClass.dart';
+import 'music_methods/musicProvider.dart';
+
+class MusicPageTest extends ConsumerStatefulWidget {
+ List<Map<String, String>> list;
+
+ MusicPageTest({Key? key, required this.list}) : super(key: key);
+
+ @override
+ _MusicPageTestState createState() => _MusicPageTestState();
+}
+
+
+
+class _MusicPageTestState extends ConsumerState<MusicPageTest> {
+
+
+ MPDTalker mpdTalker = MPDTalker();
+ bool isPlaying = false;
+ late int currindex;
+ String currSongTime = '0';
+ late Timer timer;
+
+ late Mode mode;
+
+
+
+ @override
+ void initState() {
+ // TODO: implement initState
+ super.initState();
+ WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
+
+ ref.read(CurrentSongProvider.notifier).update(artist:widget.list[0]['Artist'].toString(), title:widget.list[0]['file'].toString(),
+ duration: convertToMin(widget.list[0]['Time'].toString()), time: '0');
+
+ //timer for progress bar
+
+ timer = Timer.periodic(Duration(seconds: 1), (timer) async{
+
+ Map info = await mpdTalker.cmdMap('status');
+ ref.read(CurrentSongProvider.notifier).update(time: info['time']);
+
+
+
+
+ if(int.parse(currSongTime) == int.parse(convertTosimpleStr(widget.list[currindex]['Time'].toString()))-1 && mode.isSingle == false){
+
+
+
+
+ ref.read(CurrentSongProvider.notifier).update(isPlaying: true);
+
+ if(currindex == widget.list.length-1){
+ currindex = 0;
+ ref.read(currIndexProvider.notifier).update(currindex);
+ ref.read(CurrentSongProvider.notifier).update(artist:widget.list[currindex]['Artist'].toString(), title: widget.list[currindex]['file'].toString(),
+ duration: convertToMin(widget.list[currindex]['Time'].toString(),));
+ }
+ else{
+ currindex++;
+ ref.read(currIndexProvider.notifier).update(currindex);
+
+
+ ref.read(CurrentSongProvider.notifier).update(artist:widget.list[currindex]['Artist'].toString(), title: widget.list[currindex]['file'].toString(),
+ duration: convertToMin(widget.list[currindex]['Time'].toString(),));
+ }
+
+
+
+ }
+
+
+
+
+
+
+
+
+ });
+
+
+ });
+
+
+
+
+ }
+
+ @override
+ void dispose() {
+ timer.cancel();
+ super.dispose();
+ }
+
+
+
+
+ String convertToMin(String str){
+ String strforint = '';
+ for(int i = 0; i<str.length;i++){
+ if(str[i] == '.'){
+ break;
+ }
+ strforint += str[i];
+ }
+ int num = int.parse(strforint);
+ double min = num/60;
+ double sec = num%60;
+ String ans = min.toInt().toString()+':' + sec.toInt().toString();
+ return ans;
+
+ }
+ String convertTosimpleStr(String str){
+ String strforint = '';
+ for(int i = 0; i<str.length;i++){
+ if(str[i] == '.'){
+ break;
+ }
+ strforint += str[i];
+ }
+ return strforint;
+
+ }
+
+
+
+
+
+
+
+ @override
+ Widget build(BuildContext context) {
+ isPlaying = ref.watch(CurrentSongProvider).isPlaying;
+ currSongTime = ref.watch(CurrentSongProvider).time;
+ SizeConfig().init(context);
+
+ mode = ref.watch(Modeprovider);
+ currindex = ref.watch(currIndexProvider);
+
+
+
+
+
+
+
+
+
+ return Scaffold(
+
+ body: Flex(
+ direction: Axis.vertical,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.center,
+
+ children: [
+ Flexible(
+ flex: 4,
+ child: Flex(direction: Axis.horizontal,
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ Flexible(
+ flex: 1,
+ child: Container(
+
+ height: SizeConfig.screenHeight*0.5,
+ width: SizeConfig.screenWidth*0.4,
+ // color: Colors.blueGrey,
+ decoration: BoxDecoration(
+ color: Colors.blueGrey,
+ borderRadius: BorderRadius.circular(10)),
+ child: Padding(
+ padding: const EdgeInsets.all(15.0),
+ child: Flex(
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ direction: Axis.vertical,
+ children: [
+ Flexible(
+ flex: 3,
+ child: Image.asset('assets/music.png')),
+ Flexible(
+ flex: 1,
+ child: Flex(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ direction: Axis.horizontal,
+ children: [Flexible(
+ flex: 3,
+ child: SingleChildScrollView(
+ scrollDirection: Axis.vertical,
+ child: Text(ref.watch(CurrentSongProvider).title,
+ style: TextStyle(
+ color: Colors.white,
+ fontSize: SizeConfig.fontsize/2,
+
+
+ ),),
+ ),
+ ),
+ Flexible(
+ flex: 1,
+ child: Text(ref.watch(CurrentSongProvider).duration,
+ style: TextStyle(color: Colors.white,fontSize: SizeConfig.fontsize*0.4),)),
+ ],)),
+
+ Flexible(
+ flex: 1,
+ child:ref.watch(CurrentSongProvider).artist == 'null' ? const Text("Artist: unknown") : Text('Artist: ${ref.watch(CurrentSongProvider).artist}',
+ style: TextStyle(color: Colors.white,fontSize: SizeConfig.fontsize*0.4),),
+ )
+ ],
+ ),
+ ),
+
+ ),),
+ Flexible(flex : 1,
+ child: Container(
+ height: SizeConfig.screenHeight*0.5,
+ width: SizeConfig.screenWidth*0.4,
+ child: ListView.builder(
+ controller: ScrollController(),
+ scrollDirection: Axis.vertical,
+ itemCount: widget.list.length,
+ itemBuilder: ((context, index) => Card(
+ color: Colors.blueGrey,
+ shadowColor: Colors.blueAccent,
+ elevation: 5,
+
+ child: ListTile(
+ minLeadingWidth: 4,
+ textColor: Color.fromARGB(199, 255, 255, 255),
+
+ title: Text(widget.list[index]['file'].toString()),
+ subtitle: Text(widget.list[index]['Artist'] == null ? '' : widget.list[index]['Artist'].toString(),
+ style: TextStyle(color: Colors.black),),
+ trailing: Text(
+ convertToMin(widget.list[index]['Time'].toString(),),
+ style: TextStyle(color: Colors.black),
+ ),
+ onTap: (){
+
+
+ ref.read(CurrentSongProvider.notifier).update(artist:widget.list[index]['Artist'] == null ? "Unknown": widget.list[index]['Artist'].toString(),
+ title: widget.list[index]['file'].toString(),
+ duration: convertToMin(widget.list[index]['Time'].toString(),) ,isPlaying: true,);
+
+ mpdTalker.cmdStr('playid ' +widget.list[index]['Id'].toString());
+
+ currindex = index;
+ ref.read(currIndexProvider.notifier).update(currindex);
+
+
+ },
+ ),
+ ))),
+ ),),
+
+
+ ],
+ )),
+ Flexible(
+ flex: 2,
+ child: Flex(
+ direction: Axis.vertical,
+ children: [
+ Flexible(
+ flex: 1,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Flexible(
+ flex: 1,
+
+ child: Text(convertToMin(currSongTime))),
+ Flexible(
+ flex: 6,
+ child: RotatedBox(
+ quarterTurns: 4,
+ child: Slider(
+ activeColor: Colors.blueGrey,
+
+ thumbColor: Colors.transparent,
+ value: int.parse(currSongTime).toDouble()/((int.parse(convertTosimpleStr(widget.list[currindex]['Time'].toString())).toDouble())),
+ onChanged:(value){
+ double seekTime = value*int.parse(convertTosimpleStr(widget.list[currindex]['Time'].toString())).toDouble();
+ int seektime = seekTime.toInt();
+ mpdTalker.cmd('seekcur $seektime');
+ },
+ max: 1,
+ min: 0,
+ ),
+ ),
+ ),
+ Flexible(
+ flex: 1,
+ child: Text(convertToMin(widget.list[currindex]['Time'].toString()))),
+
+
+ ],
+ ),),
+ Flex(
+ direction: Axis.horizontal,
+
+ children: [
+ Flexible(
+ flex: 1,
+ child: SizedBox(
+ width: SizeConfig.screenWidth/3,
+ )),
+ Flexible(
+ flex : 1,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+
+ Badge(
+ badgeContent: mode.isSingle ? const Text('1') : null,
+ elevation: 0,
+ badgeColor: Colors.greenAccent,
+ child: IconButton(
+ icon: const Icon(Icons.loop),
+ color: Colors.greenAccent,
+ onPressed: (() {
+ if(mode.isSingle){
+ ref.read(Modeprovider.notifier).update(isSingle: false);
+ mpdTalker.cmd('single 0');
+ }
+ if(mode.isSingle == false ){
+ ref.read(Modeprovider.notifier).update(isSingle: true);
+ mpdTalker.cmd('single 1');
+
+
+
+
+ }
+
+
+
+ }),),
+ ),
+
+
+ IconButton(onPressed: (){
+
+ mpdTalker.cmdStr('previous');
+ ref.read(CurrentSongProvider.notifier).update(isPlaying: true);
+
+ if(currindex == 0){
+
+ ref.read(currIndexProvider.notifier).update(widget.list.length-1);
+ currindex = widget.list.length-1;
+
+ ref.read(CurrentSongProvider.notifier).update(artist:widget.list[currindex]['Artist'].toString(), title: widget.list[currindex]['file'].toString(),
+ duration: convertToMin(widget.list[currindex]['Time'].toString(),));
+ }
+ else{
+ currindex--;
+ ref.read(currIndexProvider.notifier).update(currindex);
+ ref.read(CurrentSongProvider.notifier).update(artist:widget.list[currindex]['Artist'].toString(), title: widget.list[currindex]['file'].toString(),
+ duration: convertToMin(widget.list[currindex]['Time'].toString(),));
+ }
+
+
+
+ }, icon: Icon(Icons.skip_previous)),
+ IconButton(
+ onPressed: (){
+
+ if(isPlaying){
+ mpdTalker.cmdStr('pause 1');
+ }
+ else{
+ mpdTalker.cmdStr('pause 0');
+ }
+ ref.read(CurrentSongProvider.notifier).update( isPlaying: !isPlaying);
+
+
+
+
+
+ },
+ icon: isPlaying ? Icon(Icons.pause): Icon(Icons.play_arrow)
+ ),
+ IconButton(onPressed: (){
+
+ mpdTalker.cmdStr('next');
+ ref.read(CurrentSongProvider.notifier).update(isPlaying: true);
+
+ if(currindex == widget.list.length-1){
+ ref.read(currIndexProvider.notifier).update(0);
+
+
+ ref.read(CurrentSongProvider.notifier).update(artist:widget.list[0]['Artist'].toString(), title: widget.list[0]['file'].toString(),
+ duration: convertToMin(widget.list[0]['Time'].toString(),));
+ }
+ else{
+ currindex++;
+ ref.read(currIndexProvider.notifier).update(currindex);
+
+ ref.read(CurrentSongProvider.notifier).update(artist:widget.list[currindex]['Artist'].toString(), title: widget.list[currindex]['file'].toString(),
+ duration: convertToMin(widget.list[currindex]['Time'].toString(),));
+ }
+
+
+
+
+ }, icon: Icon(Icons.skip_next)),
+
+
+ ],
+ ),),
+ Flexible(
+ flex: 1,
+ child: Row(
+ children: [
+ Icon(Icons.volume_up),
+ SizedBox(
+ width: SizeConfig.screenWidth/4,
+ child: RotatedBox(
+ quarterTurns: 4,
+ child: Slider(value: ref.watch(VolumeProvider).toDouble()/100, onChanged: (Value){
+ double vol = Value*100;
+ int songVol = vol.toInt();
+ mpdTalker.cmd('setvol $songVol');
+ ref.read(VolumeProvider.notifier).update(songVol);
+
+ }),
+ ),
+ ),
+ ],
+ ),
+
+ )
+ ],
+ ),
+ ],
+ ),
+ ),
+
+ ],
+
+
+
+ ),
+ );
+
+
+
+ }
+} \ No newline at end of file