From b196f348bfb69c3525e4a860b47fc89b17cb5ae8 Mon Sep 17 00:00:00 2001 From: HayashiRyota <67968387+MKryo@users.noreply.github.com> Date: Fri, 9 May 2025 05:54:21 +0900 Subject: [PATCH] Fix Echo "check out again" recommendation logic (#7803) --- .../de/danoeh/antennapod/storage/database/DBReader.java | 7 +++++-- .../danoeh/antennapod/storage/database/PodDBAdapter.java | 8 ++++++-- .../antennapod/storage/database/StatisticsItem.java | 5 ++++- .../danoeh/antennapod/ui/echo/screen/HoarderScreen.java | 9 +++++++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/DBReader.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/DBReader.java index a5d47a163..08f9dd5a3 100644 --- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/DBReader.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/DBReader.java @@ -612,8 +612,9 @@ public final class DBReader { adapter.open(); StatisticsResult result = new StatisticsResult(); + long sixMonthsAgo = System.currentTimeMillis() - (long) (1000L * 3600 * 24 * 30.44 * 6); try (FeedCursor cursor = new FeedCursor(adapter.getFeedStatisticsCursor( - includeMarkedAsPlayed, timeFilterFrom, timeFilterTo))) { + includeMarkedAsPlayed, timeFilterFrom, timeFilterTo, sixMonthsAgo))) { int indexOldestDate = cursor.getColumnIndexOrThrow("oldest_date"); int indexNumEpisodes = cursor.getColumnIndexOrThrow("num_episodes"); int indexEpisodesStarted = cursor.getColumnIndexOrThrow("episodes_started"); @@ -621,6 +622,7 @@ public final class DBReader { int indexPlayedTime = cursor.getColumnIndexOrThrow("played_time"); int indexNumDownloaded = cursor.getColumnIndexOrThrow("num_downloaded"); int indexDownloadSize = cursor.getColumnIndexOrThrow("download_size"); + int indexNumRecentUnplayed = cursor.getColumnIndexOrThrow("num_recent_unplayed"); while (cursor.moveToNext()) { Feed feed = cursor.getFeed(); @@ -632,13 +634,14 @@ public final class DBReader { long totalDownloadSize = cursor.getLong(indexDownloadSize); long episodesDownloadCount = cursor.getLong(indexNumDownloaded); long oldestDate = cursor.getLong(indexOldestDate); + boolean hasRecentUnplayed = cursor.getLong(indexNumRecentUnplayed) > 0; if (episodes > 0 && oldestDate < Long.MAX_VALUE) { result.oldestDate = Math.min(result.oldestDate, oldestDate); } result.feedTime.add(new StatisticsItem(feed, feedTotalTime, feedPlayedTime, episodes, - episodesStarted, totalDownloadSize, episodesDownloadCount)); + episodesStarted, totalDownloadSize, episodesDownloadCount, hasRecentUnplayed)); } } adapter.close(); diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java index 84e62a759..e4b612b38 100644 --- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java @@ -1215,7 +1215,8 @@ public class PodDBAdapter { return db.rawQuery(query, null); } - public final Cursor getFeedStatisticsCursor(boolean includeMarkedAsPlayed, long timeFilterFrom, long timeFilterTo) { + public final Cursor getFeedStatisticsCursor(boolean includeMarkedAsPlayed, long timeFilterFrom, + long timeFilterTo, long sixMonthsAgo) { final String lastPlayedTime = TABLE_NAME_FEED_MEDIA + "." + KEY_LAST_PLAYED_TIME; String wasStarted = TABLE_NAME_FEED_MEDIA + "." + KEY_PLAYBACK_COMPLETION_DATE + " > 0" + " AND " + TABLE_NAME_FEED_MEDIA + "." + KEY_PLAYED_DURATION + " > 0"; @@ -1246,7 +1247,10 @@ public class PodDBAdapter { + "SUM(CASE WHEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOAD_DATE + " > 0" + " THEN 1 ELSE 0 END) AS num_downloaded, " + "SUM(CASE WHEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOAD_DATE + " > 0" - + " THEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_SIZE + " ELSE 0 END) AS download_size" + + " THEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_SIZE + " ELSE 0 END) AS download_size, " + + "SUM(CASE WHEN " + TABLE_NAME_FEED_ITEMS + "." + KEY_READ + " != " + FeedItem.PLAYED + + " AND " + TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE + " >= " + sixMonthsAgo + + " THEN 1 ELSE 0 END) AS num_recent_unplayed " + " FROM " + TABLE_NAME_FEED_ITEMS + JOIN_FEED_ITEM_AND_MEDIA + " INNER JOIN " + TABLE_NAME_FEEDS diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/StatisticsItem.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/StatisticsItem.java index 27c5e3bdd..30baef299 100644 --- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/StatisticsItem.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/StatisticsItem.java @@ -31,9 +31,11 @@ public class StatisticsItem { */ public final long episodesDownloadCount; + public final boolean hasRecentUnplayed; + public StatisticsItem(Feed feed, long time, long timePlayed, long episodes, long episodesStarted, - long totalDownloadSize, long episodesDownloadCount) { + long totalDownloadSize, long episodesDownloadCount, boolean hasRecentUnplayed) { this.feed = feed; this.time = time; this.timePlayed = timePlayed; @@ -41,5 +43,6 @@ public class StatisticsItem { this.episodesStarted = episodesStarted; this.totalDownloadSize = totalDownloadSize; this.episodesDownloadCount = episodesDownloadCount; + this.hasRecentUnplayed = hasRecentUnplayed; } } diff --git a/ui/echo/src/main/java/de/danoeh/antennapod/ui/echo/screen/HoarderScreen.java b/ui/echo/src/main/java/de/danoeh/antennapod/ui/echo/screen/HoarderScreen.java index 68ec40fff..4f1b7af13 100644 --- a/ui/echo/src/main/java/de/danoeh/antennapod/ui/echo/screen/HoarderScreen.java +++ b/ui/echo/src/main/java/de/danoeh/antennapod/ui/echo/screen/HoarderScreen.java @@ -1,6 +1,7 @@ package de.danoeh.antennapod.ui.echo.screen; import android.content.Context; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import de.danoeh.antennapod.storage.database.DBReader; @@ -62,8 +63,12 @@ public class HoarderScreen extends EchoScreen { totalActivePodcasts++; if (item.timePlayed > 0) { playedActivePodcasts++; - } else { - unplayedActive.add(item.feed.getTitle()); + } else if (item.hasRecentUnplayed) { + String title = item.feed.getTitle(); + if (TextUtils.isEmpty(title)) { + title = item.feed.getFeedIdentifier(); + } + unplayedActive.add(title); } } }