diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java b/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java new file mode 100644 index 000000000..d4f0d8ca2 --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java @@ -0,0 +1,257 @@ +package de.test.antennapod.storage; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.test.FlakyTest; +import android.test.InstrumentationTestCase; +import android.util.Log; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import de.danoeh.antennapod.core.feed.Feed; +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.storage.DBTasks; +import de.danoeh.antennapod.core.storage.PodDBAdapter; + +import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; + +/** + * Test class for DBTasks + */ +public class DBCleanupTests extends InstrumentationTestCase { + + private static final String TAG = "DBTasksTest"; + protected static final int EPISODE_CACHE_SIZE = 5; + private final int cleanupAlgorithm; + + protected Context context; + + protected File destFolder; + + public DBCleanupTests() { + this.cleanupAlgorithm = UserPreferences.EPISODE_CLEANUP_DEFAULT; + } + + public DBCleanupTests(int cleanupAlgorithm) { + this.cleanupAlgorithm = cleanupAlgorithm; + } + + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + + assertTrue(PodDBAdapter.deleteDatabase()); + + cleanupDestFolder(destFolder); + assertTrue(destFolder.delete()); + } + + private void cleanupDestFolder(File destFolder) { + for (File f : destFolder.listFiles()) { + assertTrue(f.delete()); + } + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + context = getInstrumentation().getTargetContext(); + destFolder = context.getExternalCacheDir(); + cleanupDestFolder(destFolder); + assertNotNull(destFolder); + assertTrue(destFolder.exists()); + assertTrue(destFolder.canWrite()); + + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.close(); + + SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()).edit(); + prefEdit.putString(UserPreferences.PREF_EPISODE_CACHE_SIZE, Integer.toString(EPISODE_CACHE_SIZE)); + prefEdit.putInt(UserPreferences.PREF_EPISODE_CLEANUP, cleanupAlgorithm); + prefEdit.commit(); + + UserPreferences.init(context); + } + + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldDelete() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List items = new ArrayList<>(); + feed.setItems(items); + List files = new ArrayList<>(); + for (int i = 0; i < NUM_ITEMS; i++) { + Date itemDate = new Date(NUM_ITEMS - i); + FeedItem item = new FeedItem(0, "title", "id", "link", itemDate, FeedItem.PLAYED, feed); + + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, itemDate, 0)); + items.add(item); + } + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + DBTasks.performAutoCleanup(context); + for (int i = 0; i < files.size(); i++) { + if (i < EPISODE_CACHE_SIZE) { + assertTrue(files.get(i).exists()); + } else { + assertFalse(files.get(i).exists()); + } + } + } + + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupHandleUnplayed() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List items = new ArrayList(); + feed.setItems(items); + List files = new ArrayList(); + for (int i = 0; i < NUM_ITEMS; i++) { + Date itemDate = new Date(NUM_ITEMS - i); + FeedItem item = new FeedItem(0, "title", "id", "link", itemDate, FeedItem.UNPLAYED, feed); + + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + assertTrue(f.exists()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, itemDate, 0)); + items.add(item); + } + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + DBTasks.performAutoCleanup(context); + for (File file : files) { + assertTrue(file.exists()); + } + } + + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List items = new ArrayList<>(); + feed.setItems(items); + List files = new ArrayList<>(); + for (int i = 0; i < NUM_ITEMS; i++) { + Date itemDate = new Date(NUM_ITEMS - i); + FeedItem item = new FeedItem(0, "title", "id", "link", itemDate, FeedItem.PLAYED, feed); + + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + assertTrue(f.exists()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, itemDate, 0)); + items.add(item); + } + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.setQueue(items); + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + DBTasks.performAutoCleanup(context); + for (File file : files) { + assertTrue(file.exists()); + } + } + + /** + * Reproduces a bug where DBTasks.performAutoCleanup(android.content.Context) would use the ID of the FeedItem in the + * call to DBWriter.deleteFeedMediaOfItem instead of the ID of the FeedMedia. This would cause the wrong item to be deleted. + * @throws IOException + */ + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue_withFeedsWithNoMedia() throws IOException { + // add feed with no enclosures so that item ID != media ID + saveFeedlist(1, 10, false); + + // add candidate for performAutoCleanup + List feeds = saveFeedlist(1, 1, true); + FeedMedia m = feeds.get(0).getItems().get(0).getMedia(); + m.setDownloaded(true); + m.setFile_url("file"); + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setMedia(m); + adapter.close(); + + testPerformAutoCleanupShouldNotDeleteBecauseInQueue(); + } + + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldNotDeleteBecauseFavorite() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List items = new ArrayList<>(); + feed.setItems(items); + List files = new ArrayList<>(); + for (int i = 0; i < NUM_ITEMS; i++) { + Date itemDate = new Date(NUM_ITEMS - i); + FeedItem item = new FeedItem(0, "title", "id", "link", itemDate, FeedItem.PLAYED, feed); + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + assertTrue(f.exists()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, itemDate, 0)); + items.add(item); + } + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.setFavorites(items); + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + DBTasks.performAutoCleanup(context); + for (File file : files) { + assertTrue(file.exists()); + } + } +} diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java new file mode 100644 index 000000000..91a6e0b62 --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java @@ -0,0 +1,115 @@ +package de.test.antennapod.storage; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.test.FlakyTest; +import android.test.InstrumentationTestCase; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import de.danoeh.antennapod.core.feed.Feed; +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.storage.DBTasks; +import de.danoeh.antennapod.core.storage.PodDBAdapter; + +import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; + +/** + * Tests that the APNullCleanupAlgorithm is working correctly. + */ +public class DBNullCleanupAlgorithmTest extends InstrumentationTestCase { + + private static final String TAG = "DBNullCleanupAlgorithmTest"; + private static final int EPISODE_CACHE_SIZE = 5; + + private Context context; + + private File destFolder; + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + + assertTrue(PodDBAdapter.deleteDatabase()); + + cleanupDestFolder(destFolder); + assertTrue(destFolder.delete()); + } + + private void cleanupDestFolder(File destFolder) { + for (File f : destFolder.listFiles()) { + assertTrue(f.delete()); + } + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + context = getInstrumentation().getTargetContext(); + destFolder = context.getExternalCacheDir(); + cleanupDestFolder(destFolder); + assertNotNull(destFolder); + assertTrue(destFolder.exists()); + assertTrue(destFolder.canWrite()); + + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.close(); + + SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()).edit(); + prefEdit.putString(UserPreferences.PREF_EPISODE_CACHE_SIZE, Integer.toString(EPISODE_CACHE_SIZE)); + prefEdit.putInt(UserPreferences.PREF_EPISODE_CLEANUP, UserPreferences.EPISODE_CLEANUP_NULL); + prefEdit.commit(); + + UserPreferences.init(context); + } + + /** + * A test with no items in the queue, but multiple items downloaded. + * The null algorithm should never delete any items, even if they're played and not in the queue. + * @throws IOException + */ + @FlakyTest(tolerance = 3) + public void testPerformAutoCleanupShouldNotDelete() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List items = new ArrayList<>(); + feed.setItems(items); + List files = new ArrayList<>(); + for (int i = 0; i < NUM_ITEMS; i++) { + FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); + + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, + new Date(NUM_ITEMS - i), 0)); + items.add(item); + } + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + DBTasks.performAutoCleanup(context); + for (int i = 0; i < files.size(); i++) { + assertTrue(files.get(i).exists()); + } + } +} diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBQueueCleanupAlgorithmTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBQueueCleanupAlgorithmTest.java index 7ee66c6d2..7e63df159 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBQueueCleanupAlgorithmTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBQueueCleanupAlgorithmTest.java @@ -1,10 +1,6 @@ package de.test.antennapod.storage; -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; import android.test.FlakyTest; -import android.test.InstrumentationTestCase; import java.io.File; import java.io.IOException; @@ -19,67 +15,23 @@ import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.PodDBAdapter; -import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; - /** * Tests that the APQueueCleanupAlgorithm is working correctly. */ -public class DBQueueCleanupAlgorithmTest extends InstrumentationTestCase { +public class DBQueueCleanupAlgorithmTest extends DBCleanupTests { private static final String TAG = "DBQueueCleanupAlgorithmTest"; - private static final int EPISODE_CACHE_SIZE = 5; - private Context context; - - private File destFolder; - - @Override - protected void tearDown() throws Exception { - super.tearDown(); - - assertTrue(PodDBAdapter.deleteDatabase()); - - cleanupDestFolder(destFolder); - assertTrue(destFolder.delete()); - } - - private void cleanupDestFolder(File destFolder) { - for (File f : destFolder.listFiles()) { - assertTrue(f.delete()); - } - } - - @Override - protected void setUp() throws Exception { - super.setUp(); - context = getInstrumentation().getTargetContext(); - destFolder = context.getExternalCacheDir(); - cleanupDestFolder(destFolder); - assertNotNull(destFolder); - assertTrue(destFolder.exists()); - assertTrue(destFolder.canWrite()); - - // create new database - PodDBAdapter.deleteDatabase(); - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.close(); - - SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()).edit(); - prefEdit.putString(UserPreferences.PREF_EPISODE_CACHE_SIZE, Integer.toString(EPISODE_CACHE_SIZE)); - prefEdit.putInt(UserPreferences.PREF_EPISODE_CLEANUP, UserPreferences.EPISODE_CLEANUP_QUEUE); - prefEdit.commit(); - - UserPreferences.init(context); + public DBQueueCleanupAlgorithmTest() { + super(UserPreferences.EPISODE_CLEANUP_QUEUE); } /** - * A test with no items in the queue, but multiple items downloaded. A certain - * number of items should be removed to make room in in the cache/queue. - * @throws IOException + * For APQueueCleanupAlgorithm we expect even unplayed episodes to be deleted if needed + * if they aren't in the queue */ @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldDelete() throws IOException { + public void testPerformAutoCleanupHandleUnplayed() throws IOException { final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; Feed feed = new Feed("url", new Date(), "title"); @@ -115,63 +67,4 @@ public class DBQueueCleanupAlgorithmTest extends InstrumentationTestCase { } } } - - @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue() throws IOException { - final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; - - Feed feed = new Feed("url", new Date(), "title"); - List items = new ArrayList<>(); - feed.setItems(items); - List files = new ArrayList<>(); - for (int i = 0; i < NUM_ITEMS; i++) { - FeedItem item = new FeedItem(0, "title", "id", "link", new Date(NUM_ITEMS - i), FeedItem.PLAYED, feed); - - File f = new File(destFolder, "file " + i); - assertTrue(f.createNewFile()); - assertTrue(f.exists()); - files.add(f); - item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i), 0)); - items.add(item); - } - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setCompleteFeed(feed); - adapter.setQueue(items); - adapter.close(); - - assertTrue(feed.getId() != 0); - for (FeedItem item : items) { - assertTrue(item.getId() != 0); - assertTrue(item.getMedia().getId() != 0); - } - DBTasks.performAutoCleanup(context); - for (File file : files) { - assertTrue(file.exists()); - } - } - - /** - * Reproduces a bug where DBTasks.performAutoCleanup(android.content.Context) would use the ID of the FeedItem in the - * call to DBWriter.deleteFeedMediaOfItem instead of the ID of the FeedMedia. This would cause the wrong item to be deleted. - * @throws IOException - */ - @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue_withFeedsWithNoMedia() throws IOException { - // add feed with no enclosures so that item ID != media ID - saveFeedlist(1, 10, false); - - // add candidate for performAutoCleanup - List feeds = saveFeedlist(1, 1, true); - FeedMedia m = feeds.get(0).getItems().get(0).getMedia(); - m.setDownloaded(true); - m.setFile_url("file"); - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setMedia(m); - adapter.close(); - - testPerformAutoCleanupShouldNotDeleteBecauseInQueue(); - } } diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java index 359e7a90c..1894d6585 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java @@ -29,33 +29,20 @@ import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; public class DBTasksTest extends InstrumentationTestCase { private static final String TAG = "DBTasksTest"; - private static final int EPISODE_CACHE_SIZE = 5; private Context context; - - private File destFolder; @Override protected void tearDown() throws Exception { super.tearDown(); assertTrue(PodDBAdapter.deleteDatabase()); - - for (File f : destFolder.listFiles()) { - assertTrue(f.delete()); - } - assertTrue(destFolder.delete()); - } @Override protected void setUp() throws Exception { super.setUp(); context = getInstrumentation().getTargetContext(); - destFolder = context.getExternalCacheDir(); - assertNotNull(destFolder); - assertTrue(destFolder.exists()); - assertTrue(destFolder.canWrite()); // create new database PodDBAdapter.deleteDatabase(); @@ -63,146 +50,9 @@ public class DBTasksTest extends InstrumentationTestCase { adapter.open(); adapter.close(); - SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()).edit(); - prefEdit.putString(UserPreferences.PREF_EPISODE_CACHE_SIZE, Integer.toString(EPISODE_CACHE_SIZE)); - prefEdit.putInt(UserPreferences.PREF_EPISODE_CLEANUP, UserPreferences.EPISODE_CLEANUP_DEFAULT); - prefEdit.commit(); - UserPreferences.init(context); } - @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldDelete() throws IOException { - final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; - - Feed feed = new Feed("url", new Date(), "title"); - List items = new ArrayList<>(); - feed.setItems(items); - List files = new ArrayList<>(); - for (int i = 0; i < NUM_ITEMS; i++) { - FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); - - File f = new File(destFolder, "file " + i); - assertTrue(f.createNewFile()); - files.add(f); - item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i), 0)); - items.add(item); - } - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setCompleteFeed(feed); - adapter.close(); - - assertTrue(feed.getId() != 0); - for (FeedItem item : items) { - assertTrue(item.getId() != 0); - assertTrue(item.getMedia().getId() != 0); - } - DBTasks.performAutoCleanup(context); - for (int i = 0; i < files.size(); i++) { - if (i < EPISODE_CACHE_SIZE) { - assertTrue(files.get(i).exists()); - } else { - assertFalse(files.get(i).exists()); - } - } - } - - @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldNotDeleteBecauseUnplayed() throws IOException { - final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; - - Feed feed = new Feed("url", new Date(), "title"); - List items = new ArrayList(); - feed.setItems(items); - List files = new ArrayList(); - for (int i = 0; i < NUM_ITEMS; i++) { - FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.UNPLAYED, feed); - - File f = new File(destFolder, "file " + i); - assertTrue(f.createNewFile()); - assertTrue(f.exists()); - files.add(f); - item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i), 0)); - items.add(item); - } - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setCompleteFeed(feed); - adapter.close(); - - assertTrue(feed.getId() != 0); - for (FeedItem item : items) { - assertTrue(item.getId() != 0); - assertTrue(item.getMedia().getId() != 0); - } - DBTasks.performAutoCleanup(context); - for (File file : files) { - assertTrue(file.exists()); - } - } - - @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue() throws IOException { - final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; - - Feed feed = new Feed("url", new Date(), "title"); - List items = new ArrayList<>(); - feed.setItems(items); - List files = new ArrayList<>(); - for (int i = 0; i < NUM_ITEMS; i++) { - FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); - - File f = new File(destFolder, "file " + i); - assertTrue(f.createNewFile()); - assertTrue(f.exists()); - files.add(f); - item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i), 0)); - items.add(item); - } - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setCompleteFeed(feed); - adapter.setQueue(items); - adapter.close(); - - assertTrue(feed.getId() != 0); - for (FeedItem item : items) { - assertTrue(item.getId() != 0); - assertTrue(item.getMedia().getId() != 0); - } - DBTasks.performAutoCleanup(context); - for (File file : files) { - assertTrue(file.exists()); - } - } - - /** - * Reproduces a bug where DBTasks.performAutoCleanup(android.content.Context) would use the ID of the FeedItem in the - * call to DBWriter.deleteFeedMediaOfItem instead of the ID of the FeedMedia. This would cause the wrong item to be deleted. - * @throws IOException - */ - @FlakyTest(tolerance = 3) - public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue_withFeedsWithNoMedia() throws IOException { - // add feed with no enclosures so that item ID != media ID - saveFeedlist(1, 10, false); - - // add candidate for performAutoCleanup - List feeds = saveFeedlist(1, 1, true); - FeedMedia m = feeds.get(0).getItems().get(0).getMedia(); - m.setDownloaded(true); - m.setFile_url("file"); - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setMedia(m); - adapter.close(); - - testPerformAutoCleanupShouldNotDeleteBecauseInQueue(); - } - @FlakyTest(tolerance = 3) public void testUpdateFeedNewFeed() { final int NUM_ITEMS = 10; 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 b4fbdaea1..2b6a1ac65 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 @@ -32,14 +32,16 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm { public int performCleanup(Context context, int numberOfEpisodesToDelete) { List candidates = new ArrayList<>(); List downloadedItems = DBReader.getDownloadedItems(); - LongList queue = DBReader.getQueueIDList(); List 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()) { + if (item.hasMedia() + && item.getMedia().isDownloaded() + && !item.isTagged(FeedItem.TAG_QUEUE) + && item.isPlayed() + && !item.isTagged(FeedItem.TAG_FAVORITE)) { FeedMedia media = item.getMedia(); // make sure this candidate was played at least the proper amount of days prior // to now 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 index 549b4e02c..234d6162c 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java @@ -26,10 +26,12 @@ public class APQueueCleanupAlgorithm extends EpisodeCleanupAlgorithm { public int performCleanup(Context context, int numberOfEpisodesToDelete) { List candidates = new ArrayList<>(); List downloadedItems = DBReader.getDownloadedItems(); - LongList queue = DBReader.getQueueIDList(); List delete; for (FeedItem item : downloadedItems) { - if (!queue.contains(item.getId())) { + if (item.hasMedia() + && item.getMedia().isDownloaded() + && !item.isTagged(FeedItem.TAG_QUEUE) + && !item.isTagged(FeedItem.TAG_FAVORITE)) { candidates.add(item); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 9e20693a3..d55d4c231 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -790,6 +790,21 @@ public class PodDBAdapter { db.execSQL(sql); } + public void setFavorites(List favorites) { + ContentValues values = new ContentValues(); + db.beginTransaction(); + db.delete(TABLE_NAME_FAVORITES, null, null); + for (int i = 0; i < favorites.size(); i++) { + FeedItem item = favorites.get(i); + values.put(KEY_ID, i); + values.put(KEY_FEEDITEM, item.getId()); + values.put(KEY_FEED, item.getFeed().getId()); + db.insertWithOnConflict(TABLE_NAME_FAVORITES, null, values, SQLiteDatabase.CONFLICT_REPLACE); + } + db.setTransactionSuccessful(); + db.endTransaction(); + } + /** * Adds the item to favorites */