summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
Diffstat (limited to 'core/src')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java10
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java12
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java33
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/Converter.java1
-rw-r--r--core/src/main/res/values/arrays.xml9
-rw-r--r--core/src/main/res/values/strings.xml4
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithmTest.java20
7 files changed, 75 insertions, 14 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
index 8ad70c328..29e2456b2 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
@@ -58,11 +58,19 @@ class UpdateManager {
}
private static void onUpgrade(final int oldVersionCode, final int newVersionCode) {
- if(oldVersionCode < 1050004) {
+ if (oldVersionCode < 1050004) {
if(MediaPlayer.isPrestoLibraryInstalled(context) && Build.VERSION.SDK_INT >= 16) {
UserPreferences.enableSonic();
}
}
+
+ if (oldVersionCode < 1070196) {
+ // migrate episode cleanup value (unit changed from days to hours)
+ int oldValueInDays = UserPreferences.getEpisodeCleanupValue();
+ if (oldValueInDays > 0) {
+ UserPreferences.setEpisodeCleanupValue(oldValueInDays * 24);
+ } // else 0 or special negative values, no change needed
+ }
}
}
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 9870582c9..1feecd849 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
@@ -691,7 +691,7 @@ public class UserPreferences {
}
public static EpisodeCleanupAlgorithm getEpisodeCleanupAlgorithm() {
- int cleanupValue = Integer.parseInt(prefs.getString(PREF_EPISODE_CLEANUP, "-1"));
+ int cleanupValue = getEpisodeCleanupValue();
if (cleanupValue == EPISODE_CLEANUP_QUEUE) {
return new APQueueCleanupAlgorithm();
} else if (cleanupValue == EPISODE_CLEANUP_NULL) {
@@ -701,6 +701,16 @@ public class UserPreferences {
}
}
+ public static int getEpisodeCleanupValue() {
+ return Integer.parseInt(prefs.getString(PREF_EPISODE_CLEANUP, "-1"));
+ }
+
+ public static void setEpisodeCleanupValue(int episodeCleanupValue) {
+ prefs.edit()
+ .putString(PREF_EPISODE_CLEANUP, Integer.toString(episodeCleanupValue))
+ .apply();
+ }
+
/**
* 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.
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 e94874453..c63ac4416 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
@@ -2,6 +2,7 @@ package de.danoeh.antennapod.core.storage;
import android.content.Context;
import android.support.annotation.NonNull;
+import android.support.annotation.VisibleForTesting;
import android.util.Log;
import java.util.ArrayList;
@@ -20,11 +21,12 @@ import de.danoeh.antennapod.core.feed.FeedMedia;
public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm {
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;
+ /** the number of days after playback to wait before an item is eligible to be cleaned up.
+ Fractional for number of hours, e.g., 0.5 = 12 hours, 0.0416 = 1 hour. */
+ private final int numberOfHoursAfterPlayback;
- public APCleanupAlgorithm(int numberOfDaysAfterPlayback) {
- this.numberOfDaysAfterPlayback = numberOfDaysAfterPlayback;
+ public APCleanupAlgorithm(int numberOfHoursAfterPlayback) {
+ this.numberOfHoursAfterPlayback = numberOfHoursAfterPlayback;
}
/**
@@ -77,13 +79,17 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm {
return counter;
}
+ @VisibleForTesting
+ Date calcMostRecentDateForDeletion(@NonNull Date currentDate) {
+ return minusHours(currentDate, numberOfHoursAfterPlayback);
+ }
+
@NonNull
private List<FeedItem> getCandidates() {
List<FeedItem> candidates = new ArrayList<>();
List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
- Calendar cal = Calendar.getInstance();
- cal.add(Calendar.DAY_OF_MONTH, -1 * numberOfDaysAfterPlayback);
- Date mostRecentDateForDeletion = cal.getTime();
+
+ Date mostRecentDateForDeletion = calcMostRecentDateForDeletion(new Date());
for (FeedItem item : downloadedItems) {
if (item.hasMedia()
&& item.getMedia().isDownloaded()
@@ -108,5 +114,16 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm {
return getNumEpisodesToCleanup(0);
}
- public int getNumberOfDaysAfterPlayback() { return numberOfDaysAfterPlayback; }
+ @VisibleForTesting
+ public int getNumberOfHoursAfterPlayback() { return numberOfHoursAfterPlayback; }
+
+ private static Date minusHours(Date baseDate, int numberOfHours) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(baseDate);
+
+ cal.add(Calendar.HOUR_OF_DAY, -1 * numberOfHours);
+
+ return cal.getTime();
+ }
+
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java
index 3cb226add..6966667bf 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java
@@ -130,6 +130,7 @@ public final class Converter {
return String.format(Locale.getDefault(), "%.1f ", hours) + context.getString(R.string.time_hours);
}
+
/**
* Converts the volume as read as the progress from a SeekBar scaled to 100 and as saved in
* UserPreferences to the format taken by setVolume methods.
diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml
index 12961504c..157b040e1 100644
--- a/core/src/main/res/values/arrays.xml
+++ b/core/src/main/res/values/arrays.xml
@@ -68,10 +68,11 @@
<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>12</item>
+ <item>24</item>
+ <item>72</item>
+ <item>120</item>
+ <item>168</item>
<item>-2</item>
</string-array>
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index e4cd4789e..dd6053b5d 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -105,6 +105,10 @@
<string name="episode_cleanup_never">Never</string>
<string name="episode_cleanup_queue_removal">When not in queue</string>
<string name="episode_cleanup_after_listening">After finishing</string>
+ <plurals name="episode_cleanup_hours_after_listening">
+ <item quantity="one">1 hour after finishing</item>
+ <item quantity="other">%d hours after finishing</item>
+ </plurals>
<plurals name="episode_cleanup_days_after_listening">
<item quantity="one">1 day after finishing</item>
<item quantity="other">%d days after finishing</item>
diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithmTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithmTest.java
new file mode 100644
index 000000000..946181d52
--- /dev/null
+++ b/core/src/test/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithmTest.java
@@ -0,0 +1,20 @@
+package de.danoeh.antennapod.core.storage;
+
+import org.junit.Test;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import static org.junit.Assert.assertEquals;
+
+public class APCleanupAlgorithmTest {
+
+ @Test
+ public void testCalcMostRecentDateForDeletion() throws Exception {
+ APCleanupAlgorithm algo = new APCleanupAlgorithm(24);
+ Date curDateForTest = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse("2018-11-13T14:08:56-0800");
+ Date resExpected = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse("2018-11-12T14:08:56-0800");
+ Date resActual = algo.calcMostRecentDateForDeletion(curDateForTest);
+ assertEquals("cutoff for retaining most recent 1 day", resExpected, resActual);
+ }
+}