diff options
author | Tom Hennen <tom.hennen@gmail.com> | 2015-09-29 20:29:53 -0400 |
---|---|---|
committer | Tom Hennen <tom.hennen@gmail.com> | 2015-09-29 20:29:53 -0400 |
commit | f5801c218119d5f4f9015e805f9462d02d4b3c16 (patch) | |
tree | ecfcd14e4f2115a722ec81a9570257310f052398 /core | |
parent | 057900bc1b69c4fe24ac244a5c5ccb60d336a0a5 (diff) | |
download | AntennaPod-f5801c218119d5f4f9015e805f9462d02d4b3c16.zip |
Implement cleanup that only removes epiosdes older than a certain number of days
Also set the stage for the queue cleanup algorithm.
Diffstat (limited to 'core')
9 files changed, 108 insertions, 52 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java index 7349423c3..1474180e2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java @@ -27,6 +27,10 @@ import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.receiver.FeedUpdateReceiver; +import de.danoeh.antennapod.core.storage.APCleanupAlgorithm; +import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm; +import de.danoeh.antennapod.core.storage.APQueueCleanupAlgorithm; +import de.danoeh.antennapod.core.storage.EpisodeCleanupAlgorithm; /** * Provides access to preferences set by the user in the settings screen. A @@ -218,8 +222,6 @@ public class UserPreferences { return prefs.getBoolean(PREF_FOLLOW_QUEUE, true); } - public static int getEpisodeCleanupDays() { return Integer.valueOf(prefs.getString(PREF_EPISODE_CLEANUP, "3")); } - public static boolean shouldSkipRemoveFromQueue() { return prefs.getBoolean(PREF_SKIP_REMOVES, false); } public static boolean isAutoDelete() { @@ -489,6 +491,18 @@ public class UserPreferences { .apply(); } + + public static EpisodeCleanupAlgorithm<Integer> getEpisodeCleanupAlgorithm() { + int cleanupValue = prefs.getInt(PREF_EPISODE_CLEANUP, -1); + if (cleanupValue == -1) { + return new APQueueCleanupAlgorithm(); + } else if (cleanupValue == -2) { + return new APNullCleanupAlgorithm(); + } else { + return new APCleanupAlgorithm(cleanupValue); + } + } + /** * Return the folder where the app stores all of its data. This method will * return the standard data folder if none has been set by the user. @@ -648,5 +662,4 @@ public class UserPreferences { public static int readEpisodeCacheSize(String valueFromPrefs) { return readEpisodeCacheSizeInternal(valueFromPrefs); } - } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java index 70b3aa90a..e28c902dd 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java @@ -4,12 +4,14 @@ import android.content.Context; import android.util.Log; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.concurrent.ExecutionException; import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.LongList; @@ -19,19 +21,34 @@ import de.danoeh.antennapod.core.util.LongList; public class APCleanupAlgorithm implements EpisodeCleanupAlgorithm<Integer> { private static final String TAG = "APCleanupAlgorithm"; + /** the number of days after playback to wait before an item is eligible to be cleaned up */ + private final int numberOfDaysAfterPlayback; + + public APCleanupAlgorithm(int numberOfDaysAfterPlayback) { + this.numberOfDaysAfterPlayback = numberOfDaysAfterPlayback; + } @Override - public int performCleanup(Context context, Integer episodeNumber) { + public int performCleanup(Context context, Integer numberOfEpisodesToDelete) { List<FeedItem> candidates = new ArrayList<>(); List<FeedItem> downloadedItems = DBReader.getDownloadedItems(); LongList queue = DBReader.getQueueIDList(); List<FeedItem> delete; + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DAY_OF_MONTH, -1 * numberOfDaysAfterPlayback); + Date mostRecentDateForDeletion = cal.getTime(); for (FeedItem item : downloadedItems) { if (item.hasMedia() && item.getMedia().isDownloaded() && !queue.contains(item.getId()) && item.isPlayed()) { - candidates.add(item); + FeedMedia media = item.getMedia(); + // make sure this candidate was played at least the proper amount of days prior + // to now + if (media != null + && media.getPlaybackCompletionDate() != null + && media.getPlaybackCompletionDate().before(mostRecentDateForDeletion)) { + candidates.add(item); + } } - } Collections.sort(candidates, (lhs, rhs) -> { @@ -47,8 +64,8 @@ public class APCleanupAlgorithm implements EpisodeCleanupAlgorithm<Integer> { return l.compareTo(r); }); - if (candidates.size() > episodeNumber) { - delete = candidates.subList(0, episodeNumber); + if (candidates.size() > numberOfEpisodesToDelete) { + delete = candidates.subList(0, numberOfEpisodesToDelete); } else { delete = candidates; } @@ -66,34 +83,13 @@ public class APCleanupAlgorithm implements EpisodeCleanupAlgorithm<Integer> { Log.i(TAG, String.format( "Auto-delete deleted %d episodes (%d requested)", counter, - episodeNumber)); + numberOfEpisodesToDelete)); return counter; } @Override public Integer getDefaultCleanupParameter() { - return getPerformAutoCleanupArgs(0); - } - - @Override - public Integer getPerformCleanupParameter(List<FeedItem> items) { - return getPerformAutoCleanupArgs(items.size()); - } - - static int getPerformAutoCleanupArgs(final int episodeNumber) { - if (episodeNumber >= 0 - && UserPreferences.getEpisodeCacheSize() != UserPreferences - .getEpisodeCacheSizeUnlimited()) { - int downloadedEpisodes = DBReader - .getNumberOfDownloadedEpisodes(); - if (downloadedEpisodes + episodeNumber >= UserPreferences - .getEpisodeCacheSize()) { - - return downloadedEpisodes + episodeNumber - - UserPreferences.getEpisodeCacheSize(); - } - } return 0; } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java index f2c56ee79..748f842b9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java @@ -19,8 +19,6 @@ import de.danoeh.antennapod.core.util.PowerUtils; public class APDownloadAlgorithm implements AutomaticDownloadAlgorithm { private static final String TAG = "APDownloadAlgorithm"; - private final APCleanupAlgorithm cleanupAlgorithm = new APCleanupAlgorithm(); - /** * Looks for undownloaded episodes in the queue or list of new items and request a download if * 1. Network is available @@ -72,8 +70,8 @@ public class APDownloadAlgorithm implements AutomaticDownloadAlgorithm { int autoDownloadableEpisodes = candidates.size(); int downloadedEpisodes = DBReader.getNumberOfDownloadedEpisodes(); - int deletedEpisodes = cleanupAlgorithm.performCleanup(context, - APCleanupAlgorithm.getPerformAutoCleanupArgs(autoDownloadableEpisodes)); + int deletedEpisodes = UserPreferences.getEpisodeCleanupAlgorithm().performCleanup(context, + getPerformAutoCleanupArgs(autoDownloadableEpisodes)); boolean cacheIsUnlimited = UserPreferences.getEpisodeCacheSize() == UserPreferences .getEpisodeCacheSizeUnlimited(); int episodeCacheSize = UserPreferences.getEpisodeCacheSize(); @@ -102,4 +100,20 @@ public class APDownloadAlgorithm implements AutomaticDownloadAlgorithm { }; } + private int getPerformAutoCleanupArgs(final int numberOfEpisodesToDownload) { + if (numberOfEpisodesToDownload >= 0 + && UserPreferences.getEpisodeCacheSize() != UserPreferences + .getEpisodeCacheSizeUnlimited()) { + int downloadedEpisodes = DBReader + .getNumberOfDownloadedEpisodes(); + if (downloadedEpisodes + numberOfEpisodesToDownload >= UserPreferences + .getEpisodeCacheSize()) { + + return downloadedEpisodes + numberOfEpisodesToDownload + - UserPreferences.getEpisodeCacheSize(); + } + } + return 0; + } + } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java new file mode 100644 index 000000000..27396de4b --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java @@ -0,0 +1,19 @@ +package de.danoeh.antennapod.core.storage; + +import android.content.Context; + +/** + * A cleanup algorithm that never removes anything + */ +public class APNullCleanupAlgorithm implements EpisodeCleanupAlgorithm<Integer> { + @Override + public int performCleanup(Context context, Integer parameter) { + // never clean anything up + return 0; + } + + @Override + public Integer getDefaultCleanupParameter() { + return 0; + } +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java new file mode 100644 index 000000000..c45f30e62 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java @@ -0,0 +1,19 @@ +package de.danoeh.antennapod.core.storage; + +import android.content.Context; + +/** + * A cleanup algorithm that removes any item that isn't in the queue and isn't a favorite + * but only if space is needed. + */ +public class APQueueCleanupAlgorithm implements EpisodeCleanupAlgorithm<Integer> { + @Override + public int performCleanup(Context context, Integer parameter) { + return 0; + } + + @Override + public Integer getDefaultCleanupParameter() { + return 0; + } +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java index 3f9cece77..2fc7e52bd 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java @@ -334,7 +334,7 @@ public final class DBTasks { ClientConfig.dbTasksCallbacks.getEpisodeCacheCleanupAlgorithm() .performCleanup(context, ClientConfig.dbTasksCallbacks.getEpisodeCacheCleanupAlgorithm() - .getPerformCleanupParameter(Arrays.asList(items))); + .getPerformCleanupParameter(items.length)); } }.start(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java index 91f221f39..484263f97 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java @@ -17,20 +17,12 @@ public interface EpisodeCleanupAlgorithm<T> { * or getPerformCleanupParameter. * @return The number of episodes that were deleted. */ - public int performCleanup(Context context, T parameter); + int performCleanup(Context context, T parameter); /** * Returns a parameter for performCleanup. The implementation of this interface should decide how much * space to free to satisfy the episode cache conditions. If the conditions are already satisfied, this * method should not have any effects. */ - public T getDefaultCleanupParameter(); - - /** - * Returns a parameter for performCleanup. - * - * @param items A list of FeedItems that are about to be downloaded. The implementation of this interface - * should decide how much space to free to satisfy the episode cache conditions. - */ - public T getPerformCleanupParameter(List<FeedItem> items); + T getDefaultCleanupParameter(); } diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index aefcac2e8..34339783e 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -55,7 +55,8 @@ </string-array> <string-array name="episode_cleanup_entries"> - <item>@string/episode_cleanup_immediately</item> + <item>@string/episode_cleanup_queue_removal</item> + <item>0</item> <item>1</item> <item>3</item> <item>5</item> @@ -64,12 +65,13 @@ </string-array> <string-array name="episode_cleanup_values"> + <item>-1</item> <item>0</item> <item>1</item> <item>3</item> <item>5</item> <item>7</item> - <item>-1</item> + <item>-2</item> </string-array> <string-array name="playback_speed_values"> diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 4feef0ecd..f3a17a8cc 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -87,7 +87,12 @@ <string name="feed_auto_download_never">Never</string> <string name="send_label">Send...</string> <string name="episode_cleanup_never">Never</string> - <string name="episode_cleanup_immediately">when not in queue</string> + <string name="episode_cleanup_queue_removal">When not in queue</string> + <string name="episode_cleanup_after_listening">After listening</string> + <plurals name="episode_cleanup_days_after_listening"> + <item quantity="one">1 day after listening</item> + <item quantity="other">%d days after listening</item> + </plurals> <!-- 'Add Feed' Activity labels --> <string name="feedurl_label">Feed URL</string> @@ -421,10 +426,6 @@ <item quantity="other">%d hours</item> </plurals> - <plurals name="time_days_quantified"> - <item quantity="one">1 day</item> - <item quantity="other">%d days</item> - </plurals> <!-- gpodder.net --> <string name="gpodnet_taglist_header">CATEGORIES</string> <string name="gpodnet_toplist_header">TOP PODCASTS</string> |