diff options
Diffstat (limited to 'core/src/main')
3 files changed, 54 insertions, 5 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 a3d3b56e0..750f79711 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 @@ -544,6 +544,11 @@ public class UserPreferences { return prefs.getBoolean(PREF_ENABLE_AUTODL, false); } + @VisibleForTesting + public static void setEnableAutodownload(boolean enabled) { + prefs.edit().putBoolean(PREF_ENABLE_AUTODL, enabled).apply(); + } + public static boolean isEnableAutodownloadOnBattery() { return prefs.getBoolean(PREF_ENABLE_AUTODL_ON_BATTERY, true); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java index aa77c85b6..2dd46cf96 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java @@ -28,6 +28,7 @@ public class DownloadRequest implements Parcelable { private long soFar; private long size; private int statusMsg; + private boolean mediaEnqueued; public DownloadRequest(@NonNull String destination, @NonNull String source, @@ -47,6 +48,7 @@ public class DownloadRequest implements Parcelable { this.username = username; this.password = password; this.deleteOnFailure = deleteOnFailure; + this.mediaEnqueued = false; this.arguments = (arguments != null) ? arguments : new Bundle(); } @@ -78,6 +80,7 @@ public class DownloadRequest implements Parcelable { deleteOnFailure = (in.readByte() > 0); username = nullIfEmpty(in.readString()); password = nullIfEmpty(in.readString()); + mediaEnqueued = (in.readByte() > 0); arguments = in.readBundle(); } @@ -102,6 +105,7 @@ public class DownloadRequest implements Parcelable { // see: https://stackoverflow.com/a/22926342 dest.writeString(nonNullString(username)); dest.writeString(nonNullString(password)); + dest.writeByte((mediaEnqueued) ? (byte) 1 : 0); dest.writeBundle(arguments); } @@ -148,6 +152,7 @@ public class DownloadRequest implements Parcelable { if (title != null ? !title.equals(that.title) : that.title != null) return false; if (username != null ? !username.equals(that.username) : that.username != null) return false; + if (mediaEnqueued != that.mediaEnqueued) return false; return true; } @@ -167,6 +172,7 @@ public class DownloadRequest implements Parcelable { result = 31 * result + (int) (soFar ^ (soFar >>> 32)); result = 31 * result + (int) (size ^ (size >>> 32)); result = 31 * result + statusMsg; + result = 31 * result + (mediaEnqueued ? 1 : 0); return result; } @@ -248,6 +254,18 @@ public class DownloadRequest implements Parcelable { return deleteOnFailure; } + public boolean isMediaEnqueued() { + return mediaEnqueued; + } + + /** + * Set to true if the media is enqueued because of this download. + * The state is helpful if the download is cancelled, and undoing the enqueue is needed. + */ + public void setMediaEnqueued(boolean mediaEnqueued) { + this.mediaEnqueued = mediaEnqueued; + } + public Bundle getArguments() { return arguments; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index d9e898a88..cf0502c92 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -371,10 +371,20 @@ public class DownloadService extends Service { Downloader d = getDownloader(url); if (d != null) { d.cancel(); - DownloadRequester.getInstance().removeDownload(d.getDownloadRequest()); + DownloadRequest request = d.getDownloadRequest(); + DownloadRequester.getInstance().removeDownload(request); - FeedItem item = getFeedItemFromId(d.getDownloadRequest().getFeedfileId()); + FeedItem item = getFeedItemFromId(request.getFeedfileId()); if (item != null) { + // undo enqueue upon cancel + if (request.isMediaEnqueued()) { + Log.v(TAG, "Undoing enqueue upon cancelling download"); + try { + DBWriter.removeQueueItem(getApplicationContext(), false, item).get(); + } catch (Throwable t) { + Log.e(TAG, "Unexpected exception during undoing enqueue upon cancel", t); + } + } EventBus.getDefault().post(FeedItemEvent.updated(item)); } } else { @@ -418,10 +428,9 @@ public class DownloadService extends Service { Log.e(TAG, "Unexpected exception during enqueue before downloads. Abort download", e); return; } - // TODO-2448: use itemsEnqueued to handle cancel download for (DownloadRequest request : requests) { - onDownloadQueued(request); + onDownloadQueued(request, itemsEnqueued); } } @@ -443,7 +452,8 @@ public class DownloadService extends Service { return DBTasks.enqueueFeedItemsToDownload(getApplicationContext(), feedItems); } - private void onDownloadQueued(@NonNull DownloadRequest request) { + private void onDownloadQueued(@NonNull DownloadRequest request, + @NonNull List<? extends FeedItem> itemsEnqueued) { writeFileUrl(request); Downloader downloader = downloaderFactory.create(request); @@ -453,6 +463,9 @@ public class DownloadService extends Service { if (request.getFeedfileType() == Feed.FEEDFILETYPE_FEED) { downloads.add(0, downloader); } else { + if (isEnqueued(request, itemsEnqueued)) { + request.setMediaEnqueued(true); + } downloads.add(downloader); } downloadExecutor.submit(downloader); @@ -463,6 +476,19 @@ public class DownloadService extends Service { queryDownloads(); } + private static boolean isEnqueued(@NonNull DownloadRequest request, + @NonNull List<? extends FeedItem> itemsEnqueued) { + if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { + final long mediaId = request.getFeedfileId(); + for (FeedItem item : itemsEnqueued) { + if (item.getMedia() != null && item.getMedia().getId() == mediaId) { + return true; + } + } + } + return false; + } + @VisibleForTesting public static DownloaderFactory getDownloaderFactory() { return downloaderFactory; |