bulk remove from queue - backend - implement the new API

This commit is contained in:
orionlee 2019-04-02 15:59:27 -07:00
parent 70287a740e
commit 364c9a308d
2 changed files with 96 additions and 24 deletions

View File

@ -7,6 +7,8 @@ import android.preference.PreferenceManager;
import android.test.InstrumentationTestCase; import android.test.InstrumentationTestCase;
import android.util.Log; import android.util.Log;
import org.awaitility.Awaitility;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -24,8 +26,7 @@ import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.storage.PodDBAdapter;
import de.danoeh.antennapod.core.util.Consumer;
import org.awaitility.Awaitility;
/** /**
* Test class for DBWriter * Test class for DBWriter
@ -574,24 +575,11 @@ public class DBWriterTest extends InstrumentationTestCase {
public void testRemoveQueueItem() throws InterruptedException, ExecutionException, TimeoutException { public void testRemoveQueueItem() throws InterruptedException, ExecutionException, TimeoutException {
final int NUM_ITEMS = 10; final int NUM_ITEMS = 10;
final Context context = getInstrumentation().getTargetContext(); final Context context = getInstrumentation().getTargetContext();
Feed feed = new Feed("url", null, "title"); Feed feed = createTestFeed(NUM_ITEMS);
feed.setItems(new ArrayList<>());
for (int i = 0; i < NUM_ITEMS; i++) {
FeedItem item = new FeedItem(0, "title " + i, "id " + i, "link " + i, new Date(), FeedItem.PLAYED, feed);
feed.getItems().add(item);
}
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
adapter.setCompleteFeed(feed);
adapter.close();
for (FeedItem item : feed.getItems()) {
assertTrue(item.getId() != 0);
}
for (int removeIndex = 0; removeIndex < NUM_ITEMS; removeIndex++) { for (int removeIndex = 0; removeIndex < NUM_ITEMS; removeIndex++) {
final FeedItem item = feed.getItems().get(removeIndex); final FeedItem item = feed.getItems().get(removeIndex);
adapter = PodDBAdapter.getInstance(); PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open(); adapter.open();
adapter.setQueue(feed.getItems()); adapter.setQueue(feed.getItems());
adapter.close(); adapter.close();
@ -616,6 +604,43 @@ public class DBWriterTest extends InstrumentationTestCase {
} }
} }
public void testRemoveQueueItemMultipleItems() throws InterruptedException, ExecutionException, TimeoutException {
// Setup test data
//
final int NUM_ITEMS = 5;
final int NUM_IN_QUEUE = NUM_ITEMS - 1; // the last one not in queue for boundary condition
final Context context = getInstrumentation().getTargetContext();
Feed feed = createTestFeed(NUM_ITEMS);
List<FeedItem> itemsToAdd = feed.getItems().subList(0, NUM_IN_QUEUE);
withPodDB(adapter -> adapter.setQueue(itemsToAdd) );
// Actual tests
//
// Use array rather than List to make codes more succinct
Long[] itemIds = toItemIds(feed.getItems()).toArray(new Long[0]);
DBWriter.removeQueueItem(context, false,
itemIds[1], itemIds[3]).get(TIMEOUT, TimeUnit.SECONDS);
assertQueueByItemIds("Average case - 2 items removed successfully",
itemIds[0], itemIds[2]);
DBWriter.removeQueueItem(context, false).get(TIMEOUT, TimeUnit.SECONDS);
assertQueueByItemIds("Boundary case - no items supplied. queue should see no change",
itemIds[0], itemIds[2]);
DBWriter.removeQueueItem(context, false,
itemIds[0], itemIds[4], -1L).get(TIMEOUT, TimeUnit.SECONDS);
assertQueueByItemIds("Boundary case - items not in queue ignored",
itemIds[2]);
DBWriter.removeQueueItem(context, false,
itemIds[2], -1L).get(TIMEOUT, TimeUnit.SECONDS);
assertQueueByItemIds("Boundary case - invalid itemIds ignored"); // the queue is empty
}
public void testMoveQueueItem() throws InterruptedException, ExecutionException, TimeoutException { public void testMoveQueueItem() throws InterruptedException, ExecutionException, TimeoutException {
final int NUM_ITEMS = 10; final int NUM_ITEMS = 10;
Feed feed = new Feed("url", null, "title"); Feed feed = new Feed("url", null, "title");
@ -713,4 +738,53 @@ public class DBWriterTest extends InstrumentationTestCase {
assertTrue(item.isPlayed()); assertTrue(item.isPlayed());
} }
} }
private static Feed createTestFeed(int numItems) {
Feed feed = new Feed("url", null, "title");
feed.setItems(new ArrayList<>());
for (int i = 0; i < numItems; i++) {
FeedItem item = new FeedItem(0, "title " + i, "id " + i, "link " + i, new Date(), FeedItem.PLAYED, feed);
feed.getItems().add(item);
}
withPodDB(adapter -> adapter.setCompleteFeed(feed));
for (FeedItem item : feed.getItems()) {
assertTrue(item.getId() != 0);
}
return feed;
}
private static void withPodDB(Consumer<PodDBAdapter> action) {
PodDBAdapter adapter = PodDBAdapter.getInstance();
try {
adapter.open();
action.accept(adapter);
} finally {
adapter.close();
}
}
private static void assertQueueByItemIds(
String message,
long... itemIdsExpected
) {
List<FeedItem> queue = DBReader.getQueue();
List<Long> itemIdsActualList = toItemIds(queue);
List<Long> itemIdsExpectedList = new ArrayList<Long>(itemIdsExpected.length);
for (long id : itemIdsExpected) {
itemIdsExpectedList.add(id);
}
assertEquals(message, itemIdsExpectedList, itemIdsActualList);
}
private static List<Long> toItemIds(List<FeedItem> items) {
List<Long> itemIds = new ArrayList<Long>(items.size());
for(FeedItem item : items) {
itemIds.add(item.getId());
}
return itemIds;
}
} }

View File

@ -6,7 +6,6 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import org.shredzone.flattr4j.model.Flattr; import org.shredzone.flattr4j.model.Flattr;
@ -434,6 +433,11 @@ public class DBWriter {
return dbExec.submit(() -> removeQueueItemSynchronous(context, performAutoDownload, item.getId())); return dbExec.submit(() -> removeQueueItemSynchronous(context, performAutoDownload, item.getId()));
} }
public static Future<?> removeQueueItem(final Context context, final boolean performAutoDownload,
final long... itemIds) {
return dbExec.submit(() -> removeQueueItemSynchronous(context, performAutoDownload, itemIds));
}
private static void removeQueueItemSynchronous(final Context context, private static void removeQueueItemSynchronous(final Context context,
final boolean performAutoDownload, final boolean performAutoDownload,
final long... itemIds) { final long... itemIds) {
@ -484,12 +488,6 @@ public class DBWriter {
} }
} }
public static Future<?> removeQueueItem(final Context context, final boolean performAutoDownload,
final long... itemIds) {
Toast.makeText(context, "To implement: remove from queue. ids=" + itemIds, Toast.LENGTH_SHORT).show();
return dbExec.submit(() -> { });
}
public static Future<?> addFavoriteItem(final FeedItem item) { public static Future<?> addFavoriteItem(final FeedItem item) {
return dbExec.submit(() -> { return dbExec.submit(() -> {
final PodDBAdapter adapter = PodDBAdapter.getInstance().open(); final PodDBAdapter adapter = PodDBAdapter.getInstance().open();