summaryrefslogtreecommitdiff
path: root/core/src/main/java
diff options
context:
space:
mode:
authororionlee <orionlee@yahoo.com>2019-10-26 20:03:41 -0700
committerorionlee <orionlee@yahoo.com>2019-11-06 14:03:26 -0800
commitdc6221fb8250edfd937ff39edffa141c8205fb5b (patch)
tree3f3a137a4de70935585c6bdb73500dcb3c5d6d3c /core/src/main/java
parenta6e5cd144d0734a81f37a69e1301901b473cb6b5 (diff)
downloadAntennaPod-dc6221fb8250edfd937ff39edffa141c8205fb5b.zip
respect download order - dequeue upon cancelling download
Diffstat (limited to 'core/src/main/java')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java18
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java36
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;