From fc4b8a275e847ea9b0ce824d85fda5147e040137 Mon Sep 17 00:00:00 2001 From: stonegate Date: Thu, 27 Aug 2020 16:35:18 +0800 Subject: [PATCH] Fix bug hide listened mode load more broken. --- lib/home/search_podcast.dart | 26 +- lib/local_storage/sqflite_localpodcast.dart | 627 ++++++++++++-------- lib/podcasts/podcast_detail.dart | 2 +- 3 files changed, 382 insertions(+), 273 deletions(-) diff --git a/lib/home/search_podcast.dart b/lib/home/search_podcast.dart index c40c639..eced3b9 100644 --- a/lib/home/search_podcast.dart +++ b/lib/home/search_podcast.dart @@ -197,6 +197,8 @@ class _RssResultState extends State { !_isSubscribed ? OutlineButton( highlightedBorderColor: context.accentColor, + borderSide: BorderSide( + color: context.accentColor, width: 2), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(100.0), side: @@ -514,30 +516,30 @@ class SearchResult extends StatelessWidget { return Container( decoration: BoxDecoration( border: Border( - bottom: Divider.createBorderSide(context), - ), + // bottom: Divider.createBorderSide(context), + ), ), child: Column( mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ ListTile( - contentPadding: EdgeInsets.symmetric(horizontal: 20.0), + contentPadding: EdgeInsets.fromLTRB(20, 10, 20, 10), onTap: () { onSelect(onlinePodcast); }, leading: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(20.0)), + borderRadius: BorderRadius.circular(25.0), child: CachedNetworkImage( - height: 40.0, - width: 40.0, + height: 50.0, + width: 50.0, fit: BoxFit.fitWidth, alignment: Alignment.center, imageUrl: onlinePodcast.image, progressIndicatorBuilder: (context, url, downloadProgress) => Container( - height: 40, - width: 40, + height: 50, + width: 50, alignment: Alignment.center, color: context.primaryColorDark, child: SizedBox( @@ -548,8 +550,8 @@ class SearchResult extends StatelessWidget { ), ), errorWidget: (context, url, error) => Container( - width: 40, - height: 40, + width: 50, + height: 50, alignment: Alignment.center, color: context.primaryColorDark, child: Icon(Icons.error)), @@ -560,6 +562,7 @@ class SearchResult extends StatelessWidget { trailing: !isSubscribed ? OutlineButton( highlightedBorderColor: context.accentColor, + borderSide: BorderSide(color: context.accentColor), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(100.0), side: BorderSide(color: context.accentColor)), @@ -807,6 +810,9 @@ class _SearchResultDetailState extends State ? OutlineButton( highlightedBorderColor: context.accentColor, + borderSide: BorderSide( + color: context.accentColor, + width: 2), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(100.0), diff --git a/lib/local_storage/sqflite_localpodcast.dart b/lib/local_storage/sqflite_localpodcast.dart index b35741c..b84541c 100644 --- a/lib/local_storage/sqflite_localpodcast.dart +++ b/lib/local_storage/sqflite_localpodcast.dart @@ -292,15 +292,10 @@ class DBHelper { var dbClient = await database; var i = 0; List list = await dbClient.rawQuery( - "SELECT listen_time FROM PlayHistory WHERE enclosure_url = ?", [url]); - if (list.length == 0) { - return 0; - } else { - for (var element in list) { - i += element['listen_time']; - } - return i; - } + "SELECT SUM(listen_time) FROM PlayHistory WHERE enclosure_url = ?", + [url]); + i = list.first['SUM(listen_time)']; + return i ?? 0; } Future markNotListened(String url) async { @@ -596,143 +591,254 @@ class DBHelper { var dbClient = await database; var episodes = []; var list = []; - if (count == -1) { - switch (filter) { - case Filter.all: - list = await dbClient - .rawQuery("""SELECT E.title, E.enclosure_url, E.enclosure_length, + if (hideListened) { + if (count == -1) { + switch (filter) { + case Filter.all: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id - WHERE P.id = ? ORDER BY E.milliseconds ASC""", [id]); - break; - case Filter.liked: - list = await dbClient - .rawQuery("""SELECT E.title, E.enclosure_url, E.enclosure_length, + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id = ? AND H.SUM(listen_time) > 0 ORDER BY E.milliseconds ASC""", + [id]); + break; + case Filter.liked: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds ASC""", [id]); - break; - case Filter.downloaded: - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, + break; + case Filter.downloaded: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? AND E.media_id != E.enclosure_url ORDER BY E.milliseconds ASC""", - [id]); - break; - case Filter.search: - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, + [id]); + break; + case Filter.search: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds ASC""", - [id, '%$query%']); - break; - default: + [id, '%$query%']); + break; + default: + } + } else if (reverse) { + switch (filter) { + case Filter.all: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id = ? GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds ASC LIMIT ?""", + [id, count]); + break; + case Filter.liked: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id = ? AND E.liked = 1 GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds ASC LIMIT ?""", + [id, count]); + break; + case Filter.downloaded: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id = ? AND E.enclosure_url != E.media_id + GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds ASC LIMIT ?""", + [id, count]); + break; + case Filter.search: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id = ? AND E.title LIKE ? GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds ASC LIMIT ?""", + [id, '%$query%', count]); + break; + default: + } + } else { + switch (filter) { + case Filter.all: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id = ? GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""", + [id, count]); + break; + case Filter.liked: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id = ? AND E.liked = 1 GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""", + [id, count]); + break; + case Filter.downloaded: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id = ? AND E.enclosure_url != E.media_id GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""", + [id, count]); + break; + case Filter.search: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id = ? AND E.title LIKE ? GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""", + [id, '%$query%', count]); + break; + default: + } } - } else if (reverse) { - switch (filter) { - case Filter.all: - list = await dbClient - .rawQuery("""SELECT E.title, E.enclosure_url, E.enclosure_length, + } else { + if (count == -1) { + switch (filter) { + case Filter.all: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + WHERE P.id = ? ORDER BY E.milliseconds ASC""", [id]); + break; + case Filter.liked: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds ASC""", [id]); + break; + case Filter.downloaded: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + WHERE P.id = ? AND E.media_id != E.enclosure_url ORDER BY E.milliseconds ASC""", + [id]); + break; + case Filter.search: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, + E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, + P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds ASC""", + [id, '%$query%']); + break; + default: + } + } else if (reverse) { + switch (filter) { + case Filter.all: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? ORDER BY E.milliseconds ASC LIMIT ?""", [id, count]); - break; - case Filter.liked: - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, + break; + case Filter.liked: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds ASC LIMIT ?""", - [id, count]); - break; - case Filter.downloaded: - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, + [id, count]); + break; + case Filter.downloaded: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? AND E.enclosure_url != E.media_id ORDER BY E.milliseconds ASC LIMIT ?""", - [id, count]); - break; - case Filter.search: - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, + [id, count]); + break; + case Filter.search: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds ASC LIMIT ?""", - [id, '%$query%', count]); - break; - default: - } - } else { - switch (filter) { - case Filter.all: - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + [id, '%$query%', count]); + break; + default: + } + } else { + switch (filter) { + case Filter.all: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? ORDER BY E.milliseconds DESC LIMIT ?""", [id, count]); - break; - case Filter.liked: - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + break; + case Filter.liked: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds DESC LIMIT ?""", - [id, count]); - break; - case Filter.downloaded: - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + [id, count]); + break; + case Filter.downloaded: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? AND E.enclosure_url != E.media_id ORDER BY E.milliseconds DESC LIMIT ?""", - [id, count]); - break; - case Filter.search: - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + [id, count]); + break; + case Filter.search: + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds DESC LIMIT ?""", - [id, '%$query%', count]); - break; - default: + [id, '%$query%', count]); + break; + default: + } } } + if (list.isNotEmpty) { - if (!hideListened) { - for (var i in list) { - episodes.add(EpisodeBrief( - i['title'], - i['enclosure_url'], - i['enclosure_length'], - i['milliseconds'], - i['feedTitle'], - i['primaryColor'], - i['duration'], - i['explicit'], - i['imagePath'], - i['is_new'])); - } - } else { - for (var i in list) { - var listened = await isListened(i['enclosure_url']); - if (listened == 0) { - episodes.add(EpisodeBrief( - i['title'], - i['enclosure_url'], - i['enclosure_length'], - i['milliseconds'], - i['feedTitle'], - i['primaryColor'], - i['duration'], - i['explicit'], - i['imagePath'], - i['is_new'])); - } - } + for (var i in list) { + episodes.add(EpisodeBrief( + i['title'], + i['enclosure_url'], + i['enclosure_length'], + i['milliseconds'], + i['feedTitle'], + i['primaryColor'], + i['duration'], + i['explicit'], + i['imagePath'], + i['is_new'])); } } return episodes; @@ -804,13 +910,65 @@ class DBHelper { var dbClient = await database; var episodes = []; var list = []; - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + if (hideListened) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + E.milliseconds, P.title as feed_title, E.duration, E.explicit, + P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ? """, + [top]); + } else { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, E.milliseconds, P.title as feed_title, E.duration, E.explicit, P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id ORDER BY E.milliseconds DESC LIMIT ? """, [top]); + } if (list.isNotEmpty) { - if (!hideListened) { + for (var i in list) { + episodes.add(EpisodeBrief( + i['title'], + i['enclosure_url'], + i['enclosure_length'], + i['milliseconds'], + i['feedTitle'], + i['primaryColor'], + i['duration'], + i['explicit'], + i['imagePath'], + i['is_new'])); + } + } + return episodes; + } + + Future> getGroupRssItem(int top, List group, + {bool hideListened = false}) async { + var dbClient = await database; + var episodes = []; + if (group.length > 0) { + var s = group.map((e) => "'$e'").toList(); + var list = []; + if (hideListened) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + E.milliseconds, P.title as feed_title, E.duration, E.explicit, + P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE P.id in (${s.join(',')}) GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ? """, + [top]); + } else { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, + E.milliseconds, P.title as feed_title, E.duration, E.explicit, + P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + WHERE P.id in (${s.join(',')}) + ORDER BY E.milliseconds DESC LIMIT ? """, [top]); + } + if (list.isNotEmpty) { for (var i in list) { episodes.add(EpisodeBrief( i['title'], @@ -824,73 +982,6 @@ class DBHelper { i['imagePath'], i['is_new'])); } - } else { - for (var i in list) { - var listened = await isListened(i['enclosure_url']); - if (listened == 0) { - episodes.add(EpisodeBrief( - i['title'], - i['enclosure_url'], - i['enclosure_length'], - i['milliseconds'], - i['feedTitle'], - i['primaryColor'], - i['duration'], - i['explicit'], - i['imagePath'], - i['is_new'])); - } - } - } - } - return episodes; - } - - Future> getGroupRssItem(int top, List group, - {bool hideListened = false}) async { - var dbClient = await database; - var episodes = []; - if (group.length > 0) { - var s = group.map((e) => "'$e'").toList(); - List list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, - E.milliseconds, P.title as feed_title, E.duration, E.explicit, - P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id - WHERE P.id in (${s.join(',')}) - ORDER BY E.milliseconds DESC LIMIT ? """, [top]); - if (list.isNotEmpty) { - if (!hideListened) { - for (var i in list) { - episodes.add(EpisodeBrief( - i['title'], - i['enclosure_url'], - i['enclosure_length'], - i['milliseconds'], - i['feedTitle'], - i['primaryColor'], - i['duration'], - i['explicit'], - i['imagePath'], - i['is_new'])); - } - } else { - for (var i in list) { - var listened = await isListened(i['enclosure_url']); - if (listened == 0) { - episodes.add(EpisodeBrief( - i['title'], - i['enclosure_url'], - i['enclosure_length'], - i['milliseconds'], - i['feedTitle'], - i['primaryColor'], - i['duration'], - i['explicit'], - i['imagePath'], - i['is_new'])); - } - } - } } } return episodes; @@ -952,66 +1043,77 @@ class DBHelper { var dbClient = await database; var episodes = []; List list; - //Ordered by date - if (mode == 0) { - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date, E.is_new, + if (hideListened) { + if (mode == 0) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date, E.is_new, + E.milliseconds, P.title as feed_title, E.duration, E.explicit, + P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE E.enclosure_url != E.media_id GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.download_date DESC""", + ); + } else if (mode == 1) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new, + E.milliseconds, P.title as feed_title, E.duration, E.explicit, + P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE E.enclosure_url != E.media_id GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.download_date ASC""", + ); + } else if (mode == 2) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new, + E.milliseconds, P.title as feed_title, E.duration, E.explicit, + P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE E.enclosure_url != E.media_id GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.enclosure_length DESC""", + ); + } + } else //Ordered by date + { + if (mode == 0) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date, E.is_new, E.milliseconds, P.title as feed_title, E.duration, E.explicit, P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE E.enclosure_url != E.media_id ORDER BY E.download_date DESC""", - ); - } else if (mode == 1) { - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new, + ); + } else if (mode == 1) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new, E.milliseconds, P.title as feed_title, E.duration, E.explicit, P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE E.enclosure_url != E.media_id ORDER BY E.download_date ASC""", - ); - } else if (mode == 2) { - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new, + ); + } else if (mode == 2) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new, E.milliseconds, P.title as feed_title, E.duration, E.explicit, P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE E.enclosure_url != E.media_id ORDER BY E.enclosure_length DESC""", - ); + ); + } } if (list.isNotEmpty) { - if (!hideListened) { - for (var i in list) { - episodes.add(EpisodeBrief( - i['title'], - i['enclosure_url'], - i['enclosure_length'], - i['milliseconds'], - i['feedTitle'], - i['primaryColor'], - i['duration'], - i['explicit'], - i['imagePath'], - i['is_new'], - downloadDate: i['download_date'])); - } - } else { - for (var i in list) { - var listened = await isListened(i['enclosure_url']); - if (listened == 0) { - episodes.add(EpisodeBrief( - i['title'], - i['enclosure_url'], - i['enclosure_length'], - i['milliseconds'], - i['feedTitle'], - i['primaryColor'], - i['duration'], - i['explicit'], - i['imagePath'], - i['is_new'], - downloadDate: i['download_date'])); - } - } + for (var i in list) { + episodes.add(EpisodeBrief( + i['title'], + i['enclosure_url'], + i['enclosure_length'], + i['milliseconds'], + i['feedTitle'], + i['primaryColor'], + i['duration'], + i['explicit'], + i['imagePath'], + i['is_new'], + downloadDate: i['download_date'])); } } return episodes; @@ -1054,7 +1156,7 @@ class DBHelper { return episodes; } - removeGroupNewMark(List group) async { + Future removeGroupNewMark(List group) async { var dbClient = await database; if (group.length > 0) { var s = group.map((e) => "'$e'").toList(); @@ -1065,7 +1167,7 @@ class DBHelper { } } - removeEpisodeNewMark(String url) async { + Future removeEpisodeNewMark(String url) async { var dbClient = await database; await dbClient.transaction((txn) async { await txn.rawUpdate( @@ -1079,51 +1181,52 @@ class DBHelper { var dbClient = await database; var episodes = []; var list = []; - if (sortBy == 0) { - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, + if (hideListened) { + if (sortBy == 0) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, + P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new + FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE E.liked = 1 GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""", [i]); + } else { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, + P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new + FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id + LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url + WHERE E.liked = 1 GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null + OR SUM(H.listen_time) = 0 ORDER BY E.liked_date DESC LIMIT ?""", [i]); + } + } else { + if (sortBy == 0) { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE E.liked = 1 ORDER BY E.milliseconds DESC LIMIT ?""", [i]); - } else { - list = await dbClient.rawQuery( - """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, + } else { + list = await dbClient.rawQuery( + """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id WHERE E.liked = 1 ORDER BY E.liked_date DESC LIMIT ?""", [i]); + } } if (list.isNotEmpty) { - if (!hideListened) { - for (var i in list) { - episodes.add(EpisodeBrief( - i['title'], - i['enclosure_url'], - i['enclosure_length'], - i['milliseconds'], - i['feedTitle'], - i['primaryColor'], - i['duration'], - i['explicit'], - i['imagePath'], - i['is_new'])); - } - } else { - for (var i in list) { - var listened = await isListened(i['enclosure_url']); - if (listened == 0) { - episodes.add(EpisodeBrief( - i['title'], - i['enclosure_url'], - i['enclosure_length'], - i['milliseconds'], - i['feedTitle'], - i['primaryColor'], - i['duration'], - i['explicit'], - i['imagePath'], - i['is_new'])); - } - } + for (var i in list) { + episodes.add(EpisodeBrief( + i['title'], + i['enclosure_url'], + i['enclosure_length'], + i['milliseconds'], + i['feedTitle'], + i['primaryColor'], + i['duration'], + i['explicit'], + i['imagePath'], + i['is_new'])); } } diff --git a/lib/podcasts/podcast_detail.dart b/lib/podcasts/podcast_detail.dart index 3085a13..aa7b918 100644 --- a/lib/podcasts/podcast_detail.dart +++ b/lib/podcasts/podcast_detail.dart @@ -695,7 +695,7 @@ class _PodcastDetailState extends State { setState(() => _loadMore = true); } await Future.delayed(Duration(seconds: 3)); - if (mounted) { + if (mounted && _loadMore) { setState(() { _top = _top + 36; _loadMore = false;