diff --git a/app/src/main/java/de/danoeh/antennapod/actionbutton/DeleteActionButton.java b/app/src/main/java/de/danoeh/antennapod/actionbutton/DeleteActionButton.java index 3e88270da..35086e9d5 100644 --- a/app/src/main/java/de/danoeh/antennapod/actionbutton/DeleteActionButton.java +++ b/app/src/main/java/de/danoeh/antennapod/actionbutton/DeleteActionButton.java @@ -44,7 +44,7 @@ public class DeleteActionButton extends ItemActionButton { @Override public int getVisibility() { - if (item.getMedia() != null && (item.getMedia().isDownloaded() || item.getFeed().isLocalFeed())) { + if (item.getMedia() != null && item.getMedia().isDownloaded()) { return View.VISIBLE; } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodeMultiSelectActionHandler.java b/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodeMultiSelectActionHandler.java index 5fd643c28..0b8d27773 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodeMultiSelectActionHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodeMultiSelectActionHandler.java @@ -141,7 +141,7 @@ public class EpisodeMultiSelectActionHandler { // download the check episodes in the same order as they are currently displayed int downloaded = 0; for (FeedItem episode : items) { - if (episode.hasMedia() && !episode.isDownloaded() && !episode.getFeed().isLocalFeed()) { + if (episode.hasMedia() && !episode.isDownloaded()) { DownloadServiceInterface.get().download(activity, episode); downloaded++; } @@ -155,7 +155,7 @@ public class EpisodeMultiSelectActionHandler { if (!feedItem.hasMedia()) { continue; } - if (feedItem.getMedia().isDownloaded() || feedItem.getFeed().isLocalFeed()) { + if (feedItem.getMedia().isDownloaded()) { countHasMedia++; DBWriter.deleteFeedMediaOfItem(activity, feedItem.getMedia()); } else if (DownloadServiceInterface.get().isDownloadingEpisode(feedItem.getMedia().getDownloadUrl())) { diff --git a/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/FeedItemMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/FeedItemMenuHandler.java index cc6d81c3c..56580d970 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/FeedItemMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/FeedItemMenuHandler.java @@ -86,9 +86,8 @@ public class FeedItemMenuHandler { canMarkPlayed |= !item.isPlayed(); canMarkUnplayed |= item.isPlayed(); canResetPosition |= hasMedia && item.getMedia().getPosition() != 0; - canDelete |= item.getFeed().isLocalFeed() || (hasMedia && item.getMedia().isDownloaded()) || isDownloading; - canDownload |= hasMedia && !item.getMedia().isDownloaded() - && !item.getFeed().isLocalFeed() && !isDownloading; + canDelete |= (hasMedia && item.getMedia().isDownloaded()) || isDownloading; + canDownload |= hasMedia && !item.getMedia().isDownloaded() && !isDownloading; canAddFavorite |= !item.isTagged(FeedItem.TAG_FAVORITE); canRemoveFavorite |= item.isTagged(FeedItem.TAG_FAVORITE); canShowTranscript |= item.hasTranscript(); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/swipeactions/DeleteSwipeAction.java b/app/src/main/java/de/danoeh/antennapod/ui/swipeactions/DeleteSwipeAction.java index affcfbb4b..bc6175f2f 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/swipeactions/DeleteSwipeAction.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/swipeactions/DeleteSwipeAction.java @@ -35,7 +35,7 @@ public class DeleteSwipeAction implements SwipeAction { @Override public void performAction(FeedItem item, Fragment fragment, FeedItemFilter filter) { - if (!item.isDownloaded() && !item.getFeed().isLocalFeed()) { + if (!item.isDownloaded()) { return; } LocalDeleteModal.showLocalFeedDeleteWarningIfNecessary( @@ -45,6 +45,6 @@ public class DeleteSwipeAction implements SwipeAction { @Override public boolean willRemove(FeedItemFilter filter, FeedItem item) { - return filter.showDownloaded && (item.isDownloaded() || item.getFeed().isLocalFeed()); + return filter.showDownloaded && item.isDownloaded(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/swipeactions/StartDownloadSwipeAction.java b/app/src/main/java/de/danoeh/antennapod/ui/swipeactions/StartDownloadSwipeAction.java index 6a034b88a..7c1e37b29 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/swipeactions/StartDownloadSwipeAction.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/swipeactions/StartDownloadSwipeAction.java @@ -35,7 +35,7 @@ public class StartDownloadSwipeAction implements SwipeAction { public void performAction(FeedItem item, Fragment fragment, FeedItemFilter filter) { if (item.getMedia() == null) { EventBus.getDefault().post(new MessageEvent(fragment.getString(R.string.no_media_label))); - } else if (item.getFeed().isLocalFeed() || item.isDownloaded()) { + } else if (item.isDownloaded()) { EventBus.getDefault().post(new MessageEvent(fragment.getString(R.string.already_downloaded))); } else { new DownloadActionButton(item).onClick(fragment.requireContext()); diff --git a/model/src/main/java/de/danoeh/antennapod/model/feed/FeedMedia.java b/model/src/main/java/de/danoeh/antennapod/model/feed/FeedMedia.java index 393386c11..a4c7b3a92 100644 --- a/model/src/main/java/de/danoeh/antennapod/model/feed/FeedMedia.java +++ b/model/src/main/java/de/danoeh/antennapod/model/feed/FeedMedia.java @@ -396,7 +396,7 @@ public class FeedMedia implements Playable { } public boolean isDownloaded() { - return downloadDate > 0; + return downloadDate > 0 || (item != null && item.getFeed() != null && item.getFeed().isLocalFeed()); } public long getItemId() { diff --git a/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/APCleanupAlgorithm.java b/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/APCleanupAlgorithm.java index 011f01695..b4d155f75 100644 --- a/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/APCleanupAlgorithm.java +++ b/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/APCleanupAlgorithm.java @@ -19,6 +19,7 @@ import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.database.DBWriter; +import de.danoeh.antennapod.storage.preferences.UserPreferences; /** * Implementation of the EpisodeCleanupAlgorithm interface used by AntennaPod. @@ -98,6 +99,7 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm { for (FeedItem item : downloadedItems) { if (item.hasMedia() && item.getMedia().isDownloaded() + && (!item.getFeed().isLocalFeed() || UserPreferences.isAutoDeleteLocal()) && !item.isTagged(FeedItem.TAG_QUEUE) && item.isPlayed() && !item.isTagged(FeedItem.TAG_FAVORITE)) { diff --git a/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/APQueueCleanupAlgorithm.java b/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/APQueueCleanupAlgorithm.java index 0446161f4..c54a238da 100644 --- a/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/APQueueCleanupAlgorithm.java +++ b/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/APQueueCleanupAlgorithm.java @@ -16,6 +16,7 @@ import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.database.DBWriter; +import de.danoeh.antennapod.storage.preferences.UserPreferences; /** * A cleanup algorithm that removes any item that isn't in the queue and isn't a favorite @@ -83,6 +84,7 @@ public class APQueueCleanupAlgorithm extends EpisodeCleanupAlgorithm { for (FeedItem item : downloadedItems) { if (item.hasMedia() && item.getMedia().isDownloaded() + && (!item.getFeed().isLocalFeed() || UserPreferences.isAutoDeleteLocal()) && !item.isTagged(FeedItem.TAG_QUEUE) && !item.isTagged(FeedItem.TAG_FAVORITE)) { candidates.add(item); diff --git a/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/ExceptFavoriteCleanupAlgorithm.java b/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/ExceptFavoriteCleanupAlgorithm.java index 46dfcffdc..793cce33b 100644 --- a/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/ExceptFavoriteCleanupAlgorithm.java +++ b/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/episode/autodownload/ExceptFavoriteCleanupAlgorithm.java @@ -83,6 +83,7 @@ public class ExceptFavoriteCleanupAlgorithm extends EpisodeCleanupAlgorithm { for (FeedItem item : downloadedItems) { if (item.hasMedia() && item.getMedia().isDownloaded() + && (!item.getFeed().isLocalFeed() || UserPreferences.isAutoDeleteLocal()) && !item.isTagged(FeedItem.TAG_FAVORITE)) { candidates.add(item); } 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 22a5eb9e9..2562c8472 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 @@ -1267,9 +1267,14 @@ public class PodDBAdapter { + " THEN (" + playedTime + ") ELSE 0 END), 0) AS played_time, " + "IFNULL(SUM(" + TABLE_NAME_FEED_MEDIA + "." + KEY_DURATION + "), 0) AS total_time, " + "SUM(CASE WHEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOAD_DATE + " > 0" + + " OR " + TABLE_NAME_FEEDS + "." + KEY_DOWNLOAD_URL + + " LIKE '" + Feed.PREFIX_LOCAL_FOLDER + "%'" + " 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, " + + " OR " + TABLE_NAME_FEEDS + "." + KEY_DOWNLOAD_URL + + " LIKE '" + Feed.PREFIX_LOCAL_FOLDER + "%'" + + " 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 " @@ -1309,6 +1314,8 @@ public class PodDBAdapter { public final Map getFeedCounters(FeedCounter setting, long... feedIds) { String whereRead; + String localFeedCondition = KEY_FEED + " IN (SELECT " + KEY_ID + " FROM " + TABLE_NAME_FEEDS + + " WHERE " + KEY_DOWNLOAD_URL + " LIKE '" + Feed.PREFIX_LOCAL_FOLDER + "%')"; switch (setting) { case SHOW_NEW: whereRead = KEY_READ + "=" + FeedItem.NEW; @@ -1318,12 +1325,12 @@ public class PodDBAdapter { + " OR " + KEY_READ + "=" + FeedItem.UNPLAYED + ")"; break; case SHOW_DOWNLOADED: - whereRead = KEY_DOWNLOAD_DATE + ">0"; + whereRead = "(" + KEY_DOWNLOAD_DATE + ">0 OR " + localFeedCondition + ")"; break; case SHOW_DOWNLOADED_UNPLAYED: whereRead = "(" + KEY_READ + "=" + FeedItem.NEW + " OR " + KEY_READ + "=" + FeedItem.UNPLAYED + ")" - + " AND " + KEY_DOWNLOAD_DATE + ">0"; + + " AND (" + KEY_DOWNLOAD_DATE + ">0 OR " + localFeedCondition + ")"; break; case SHOW_NONE: // deliberate fall-through diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemFilterQuery.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemFilterQuery.java index 0f70c5cc3..cd16233c2 100644 --- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemFilterQuery.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemFilterQuery.java @@ -28,6 +28,7 @@ public class FeedItemFilterQuery { String keyDownloaded = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_DOWNLOAD_DATE; String keyMediaId = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_ID; String keyItemId = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_ID; + final String keyFeedId = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_FEED; String keyFeedItem = PodDBAdapter.KEY_FEEDITEM; String tableQueue = PodDBAdapter.TABLE_NAME_QUEUE; String tableFavorites = PodDBAdapter.TABLE_NAME_FAVORITES; @@ -50,10 +51,13 @@ public class FeedItemFilterQuery { } else if (filter.showNotQueued) { statements.add(keyItemId + " NOT IN (SELECT " + keyFeedItem + " FROM " + tableQueue + ") "); } + String localFeedCondition = keyFeedId + " IN (SELECT " + PodDBAdapter.KEY_ID + + " FROM " + PodDBAdapter.TABLE_NAME_FEEDS + + " WHERE " + PodDBAdapter.KEY_DOWNLOAD_URL + " LIKE '" + Feed.PREFIX_LOCAL_FOLDER + "%')"; if (filter.showDownloaded) { - statements.add(keyDownloaded + " > 0 "); + statements.add("(" + keyDownloaded + " > 0 OR (" + localFeedCondition + ")) "); } else if (filter.showNotDownloaded) { - statements.add(keyDownloaded + " = 0 "); + statements.add("(" + keyDownloaded + " = 0 AND NOT (" + localFeedCondition + ")) "); } if (filter.showHasMedia) { statements.add(keyMediaId + " NOT NULL ");