diff --git a/lib/class/audiostate.dart b/lib/class/audiostate.dart index 3d7a7cf..905a828 100644 --- a/lib/class/audiostate.dart +++ b/lib/class/audiostate.dart @@ -166,7 +166,7 @@ class AudioPlayerNotifier extends ChangeNotifier { await AudioService.connect(); bool running = await AudioService.running; if (running) { - await AudioService.pause(); + print(AudioService.currentMediaItem.artUri); } } diff --git a/lib/class/episodebrief.dart b/lib/class/episodebrief.dart index dccb2ed..ebc5f81 100644 --- a/lib/class/episodebrief.dart +++ b/lib/class/episodebrief.dart @@ -33,7 +33,7 @@ class EpisodeBrief { String dateToString() { DateTime date = DateTime.fromMillisecondsSinceEpoch(pubDate, isUtc: true); - var diffrence = DateTime.now().difference(date); + var diffrence = DateTime.now().toUtc().difference(date); if (diffrence.inHours < 1) { return '1 hour ago'; } else if (diffrence.inHours < 24) { @@ -44,10 +44,10 @@ class EpisodeBrief { return '${diffrence.inDays} days ago'; } else { return DateFormat.yMMMd() - .format(DateTime.fromMillisecondsSinceEpoch(pubDate)); + .format(DateTime.fromMillisecondsSinceEpoch(pubDate, isUtc: true).toLocal()); } } - + MediaItem toMediaItem() { return MediaItem( id: mediaId, @@ -56,4 +56,5 @@ class EpisodeBrief { album: feedTitle, artUri: 'file://$imagePath'); } + } diff --git a/lib/episodes/episodedetail.dart b/lib/episodes/episodedetail.dart index 5d60292..8c88f41 100644 --- a/lib/episodes/episodedetail.dart +++ b/lib/episodes/episodedetail.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:flutter_html/flutter_html.dart'; -import 'package:tsacdop/class/download_state.dart'; import 'package:tsacdop/home/audioplayer.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:fluttertoast/fluttertoast.dart'; diff --git a/lib/home/appbar/popupmenu.dart b/lib/home/appbar/popupmenu.dart index 6af4e86..0092b61 100644 --- a/lib/home/appbar/popupmenu.dart +++ b/lib/home/appbar/popupmenu.dart @@ -53,9 +53,7 @@ class _PopupMenuState extends State { return primaryColor; } - bool _showDate; - String _refreshDate; - _getRefreshDate() async { + Future _getRefreshDate() async { int refreshDate; KeyValueStorage refreshstorage = KeyValueStorage('refreshdate'); int i = await refreshstorage.getInt(); @@ -69,29 +67,19 @@ class _PopupMenuState extends State { DateTime date = DateTime.fromMillisecondsSinceEpoch(refreshDate); var diffrence = DateTime.now().difference(date); if (diffrence.inMinutes < 10) { - _refreshDate = 'Just now'; + return 'Just now'; } else if (diffrence.inHours < 1) { - _refreshDate = '1 hour ago'; + return '1 hour ago'; } else if (diffrence.inHours < 24) { - _refreshDate = '${diffrence.inHours} hours ago'; + return '${diffrence.inHours} hours ago'; } else if (diffrence.inHours == 24) { - _refreshDate = '1 day ago'; + return '1 day ago'; } else if (diffrence.inDays < 7) { - _refreshDate = '${diffrence.inDays} days ago'; + return '${diffrence.inDays} days ago'; } else { - _refreshDate = DateFormat.yMMMd() + return DateFormat.yMMMd() .format(DateTime.fromMillisecondsSinceEpoch(refreshDate)); } - setState(() { - _showDate = true; - }); - } - - @override - void initState() { - super.initState(); - _showDate = false; - _getRefreshDate(); } @override @@ -274,12 +262,17 @@ class _PopupMenuState extends State { Text( 'Refresh All', ), - _showDate - ? Text( - _refreshDate, - style: TextStyle(color: Colors.red, fontSize: 12), - ) - : Center(), + FutureBuilder( + future: _getRefreshDate(), + builder: (_, snapshot) { + if (snapshot.hasData) + return Text( + snapshot.data, + style: TextStyle(color: Colors.red, fontSize: 12), + ); + else + return Center(); + }) ], ), ], diff --git a/lib/home/audioplayer.dart b/lib/home/audioplayer.dart index dbdad0e..e2804e9 100644 --- a/lib/home/audioplayer.dart +++ b/lib/home/audioplayer.dart @@ -18,7 +18,6 @@ import 'package:tsacdop/home/audiopanel.dart'; import 'package:tsacdop/util/pageroute.dart'; import 'package:tsacdop/util/colorize.dart'; import 'package:tsacdop/util/day_night_switch.dart'; -import 'package:tsacdop/util/context_extension.dart'; class MyRectangularTrackShape extends RectangularSliderTrackShape { Rect getPreferredRect({ diff --git a/lib/home/playlist.dart b/lib/home/playlist.dart index fef7ea4..7fe5f21 100644 --- a/lib/home/playlist.dart +++ b/lib/home/playlist.dart @@ -1,5 +1,4 @@ import 'dart:io'; -import 'dart:math' as math; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -9,9 +8,9 @@ import 'package:tsacdop/episodes/episodedetail.dart'; import 'package:tuple/tuple.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:line_icons/line_icons.dart'; + import 'package:tsacdop/class/audiostate.dart'; import 'package:tsacdop/class/episodebrief.dart'; -import 'package:tsacdop/util/colorize.dart'; import 'package:tsacdop/util/context_extension.dart'; class PlaylistPage extends StatefulWidget { @@ -74,8 +73,7 @@ class _PlaylistPageState extends State { backgroundColor: Theme.of(context).primaryColor, ), body: SafeArea( - child: - Selector>( + child: Selector>( selector: (_, audio) => Tuple3(audio.queue, audio.playerRunning, audio.queueUpdate), builder: (_, data, __) { @@ -123,8 +121,7 @@ class _PlaylistPageState extends State { fontSize: 20, )), TextSpan( - text: - _sumPlaylistLength(episodes).toString(), + text: _sumPlaylistLength(episodes).toString(), style: GoogleFonts.cairo( textStyle: TextStyle( color: Theme.of(context).accentColor, @@ -142,27 +139,71 @@ class _PlaylistPageState extends State { ), ), Spacer(), - _topHeight > 65 - ? Center() - : Container( - padding: EdgeInsets.only( - right: 20, bottom: 80 - _topHeight), - child: data.item2 - ? Padding( - padding: EdgeInsets.only(right: 15), - child: SizedBox( - width: 20, - height: 15, - child: WaveLoader()), - ) - : IconButton( - icon: Icon(Icons.play_circle_filled, - size: 40, - color: - Theme.of(context).accentColor), - onPressed: () => audio.playlistLoad(), - ), - ), + Container( + padding: EdgeInsets.only( + right: 20, + ), + child: data.item2 + ? _topHeight < 90 + ? Row( + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + CircleAvatar( + radius: 12, + backgroundImage: FileImage(File( + "${episodes.first.imagePath}")), + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 15), + child: SizedBox( + width: 20, + height: 15, + child: WaveLoader()), + ), + ], + ) + : Column( + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + CircleAvatar( + radius: 15, + //backgroundColor: _c.withOpacity(0.5), + backgroundImage: FileImage(File( + "${episodes.first.imagePath}")), + ), + Container( + width: 150, + alignment: Alignment.center, + child: Text( + episodes.first.title, + maxLines: 1, + overflow: TextOverflow.fade, + ), + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 15), + child: SizedBox( + width: 20, + height: 15, + child: WaveLoader()), + ), + ], + ) + : IconButton( + icon: Icon(Icons.play_circle_filled, + size: 40, + color: Theme.of(context).accentColor), + onPressed: () => audio.playlistLoad(), + ), + ), ], ), ), @@ -171,23 +212,36 @@ class _PlaylistPageState extends State { ), Expanded( child: ReorderableListView( + scrollController: _controller, onReorder: (int oldIndex, int newIndex) { if (newIndex > oldIndex) { newIndex -= 1; } - final EpisodeBrief episodeRemove = - episodes[oldIndex]; + final EpisodeBrief episodeRemove = episodes[oldIndex]; audio.delFromPlaylist(episodeRemove); audio.addToPlaylistAt(episodeRemove, newIndex); setState(() {}); }, scrollDirection: Axis.vertical, - children: episodes - .map((episode) => DismissibleContainer( - episode: episode, - key: ValueKey(episode.enclosureUrl), - )) - .toList()), + children: data.item2 + ? episodes.map((episode) { + if (episode.enclosureUrl != + episodes.first.enclosureUrl) + return DismissibleContainer( + episode: episode, + key: ValueKey(episode.enclosureUrl), + ); + else + return Container( + key: ValueKey('sd'), + ); + }).toList() + : episodes + .map((episode) => DismissibleContainer( + episode: episode, + key: ValueKey(episode.enclosureUrl), + )) + .toList()), ), ], ); @@ -337,6 +391,7 @@ class _DismissibleContainerState extends State { ], ), ), + trailing: Icon(Icons.menu), ), // Divider( // height: 2, diff --git a/lib/local_storage/sqflite_localpodcast.dart b/lib/local_storage/sqflite_localpodcast.dart index f923886..7a07ba6 100644 --- a/lib/local_storage/sqflite_localpodcast.dart +++ b/lib/local_storage/sqflite_localpodcast.dart @@ -425,7 +425,7 @@ class DBHelper { if (url != null) { await dbClient.transaction((txn) async { - int id = await txn.rawInsert( + await txn.rawInsert( """INSERT OR IGNORE INTO Episodes(title, enclosure_url, enclosure_length, pubDate, description, feed_id, milliseconds, duration, explicit, media_id, is_new) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)""", [ @@ -440,7 +440,6 @@ class DBHelper { explicit, url, ]); - print("$id"); }); } } diff --git a/lib/util/episodegrid.dart b/lib/util/episodegrid.dart index 423def9..699e456 100644 --- a/lib/util/episodegrid.dart +++ b/lib/util/episodegrid.dart @@ -1,10 +1,7 @@ import 'dart:io'; -import 'dart:isolate'; -import 'dart:async'; import 'dart:ui'; import 'package:flutter/material.dart'; -import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart';