From 418d4fa4d4b2e983888ce92bc54cecae82c534fe Mon Sep 17 00:00:00 2001 From: orionlee Date: Fri, 11 Oct 2019 13:17:33 -0700 Subject: bugfix respect download order - obey user settings "Enqueue Downloaded" --- .../core/preferences/UserPreferences.java | 20 +++++++++++++-- .../de/danoeh/antennapod/core/storage/DBTasks.java | 29 +++++++++++++++++++++- 2 files changed, 46 insertions(+), 3 deletions(-) (limited to 'core/src/main/java/de/danoeh/antennapod') 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 edd5e61d1..16561779e 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 @@ -4,11 +4,13 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; import android.preference.PreferenceManager; +import android.text.TextUtils; +import android.util.Log; + import androidx.annotation.IntRange; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import androidx.core.app.NotificationCompat; -import android.text.TextUtils; -import android.util.Log; import org.json.JSONArray; import org.json.JSONException; @@ -285,10 +287,24 @@ public class UserPreferences { return prefs.getBoolean(PREF_ENQUEUE_DOWNLOADED, true); } + @VisibleForTesting + public static void setEnqueueDownloadedEpisodes(boolean enqueueDownloadedEpisodes) { + prefs.edit() + .putBoolean(PREF_ENQUEUE_DOWNLOADED, enqueueDownloadedEpisodes) + .apply(); + } + public static boolean enqueueAtFront() { return prefs.getBoolean(PREF_QUEUE_ADD_TO_FRONT, false); } + @VisibleForTesting + public static void setEnqueueAtFront(boolean enqueueAtFront) { + prefs.edit() + .putBoolean(PREF_QUEUE_ADD_TO_FRONT, enqueueAtFront) + .apply(); + } + /** * * @return {@code true} if in enqueuing items/podcast episodes, when the existing front item is 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 def4d84b5..7dc53f8b3 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 @@ -7,6 +7,8 @@ import android.os.Looper; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.VisibleForTesting; + import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -26,6 +28,7 @@ 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.feed.FeedPreferences; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.GpodnetSyncService; import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.service.playback.PlaybackService; @@ -331,7 +334,12 @@ public final class DBTasks { } // #2448: First, add to-download items to the queue before actual download // so that the resulting queue order is the same as when download is clicked - DBWriter.addQueueItem(context, items); + try { + enqueueFeedItemsToDownload(context, items); + } catch (Throwable t) { + throw new DownloadRequestException("Unexpected exception during enqueue before downloads", t); + } + // Then, download them for (FeedItem item : items) { if (item.getMedia() != null @@ -358,6 +366,25 @@ public final class DBTasks { } } + @VisibleForTesting + public static List enqueueFeedItemsToDownload(final Context context, + FeedItem... items) + throws InterruptedException, ExecutionException { + List itemsToEnqueue = new ArrayList<>(); + if (UserPreferences.enqueueDownloadedEpisodes()) { + LongList queueIDList = DBReader.getQueueIDList(); + for (FeedItem item : items) { + if (!queueIDList.contains(item.getId())) { + itemsToEnqueue.add(item); + } + } + DBWriter.addQueueItem(context, + itemsToEnqueue.toArray(new FeedItem[0])) + .get(); + } + return itemsToEnqueue; + } + /** * Looks for undownloaded episodes in the queue or list of unread items and request a download if * 1. Network is available -- cgit v1.2.3