summaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
authorByteHamster <info@bytehamster.com>2022-01-06 15:04:01 +0100
committerByteHamster <info@bytehamster.com>2022-01-06 15:19:32 +0100
commit7e27c8ce2ef6987ddc26e50bcfbd5b6cc91935d5 (patch)
treef98e02032e2dc5522728b1025a1d31892ec458a5 /core/src/main
parent849bf4ad854973d39698613c3a356c09c87e687c (diff)
downloadantennapod-7e27c8ce2ef6987ddc26e50bcfbd5b6cc91935d5.zip
Refresh local feeds in DownloadService
This allows displaying the refresh state. Also, it is faster because multiple local feeds can be refreshed in parallel.
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java21
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequestCreator.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java40
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/LocalFeedStubDownloader.java17
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java23
5 files changed, 74 insertions, 31 deletions
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 5dfbdf85a..789cde714 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
@@ -8,8 +8,9 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import de.danoeh.antennapod.model.feed.FeedFile;
+import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.core.util.URLChecker;
+import de.danoeh.antennapod.model.feed.FeedMedia;
public class DownloadRequest implements Parcelable {
public static final String REQUEST_ARG_PAGE_NR = "page";
@@ -273,12 +274,20 @@ public class DownloadRequest implements Parcelable {
private Bundle arguments = new Bundle();
private boolean initiatedByUser = true;
- public Builder(@NonNull String destination, @NonNull FeedFile item) {
+ public Builder(@NonNull String destination, @NonNull FeedMedia media) {
this.destination = destination;
- this.source = URLChecker.prepareURL(item.getDownload_url());
- this.title = item.getHumanReadableIdentifier();
- this.feedfileId = item.getId();
- this.feedfileType = item.getTypeAsInt();
+ this.source = URLChecker.prepareURL(media.getDownload_url());
+ this.title = media.getHumanReadableIdentifier();
+ this.feedfileId = media.getId();
+ this.feedfileType = media.getTypeAsInt();
+ }
+
+ public Builder(@NonNull String destination, @NonNull Feed feed) {
+ this.destination = destination;
+ this.source = feed.isLocalFeed() ? feed.getDownload_url() : URLChecker.prepareURL(feed.getDownload_url());
+ this.title = feed.getHumanReadableIdentifier();
+ this.feedfileId = feed.getId();
+ this.feedfileType = feed.getTypeAsInt();
}
public void setInitiatedByUser(boolean initiatedByUser) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequestCreator.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequestCreator.java
index 80ce4620a..c33e6b4d6 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequestCreator.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequestCreator.java
@@ -14,13 +14,13 @@ import java.io.File;
* Creates download requests that can be sent to the DownloadService.
*/
public class DownloadRequestCreator {
- private static final String TAG = "DownloadRequester";
+ private static final String TAG = "DownloadRequestCreat";
private static final String FEED_DOWNLOADPATH = "cache/";
private static final String MEDIA_DOWNLOADPATH = "media/";
public static DownloadRequest.Builder create(Feed feed) {
File dest = new File(getFeedfilePath(), getFeedfileName(feed));
- if (!isFilenameAvailable(dest.toString())) {
+ if (!isFilenameAvailable(dest.toString()) && !feed.isLocalFeed()) {
dest = findUnusedFile(dest);
}
Log.d(TAG, "Requesting download of url " + feed.getDownload_url());
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 9fb624bc2..dd445258e 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
@@ -20,6 +20,7 @@ import androidx.core.app.ServiceCompat;
import androidx.core.content.ContextCompat;
import de.danoeh.antennapod.core.R;
+import de.danoeh.antennapod.core.feed.LocalFeedUpdater;
import org.apache.commons.io.FileUtils;
import org.greenrobot.eventbus.EventBus;
@@ -274,6 +275,10 @@ public class DownloadService extends Service {
DBTasks.autodownloadUndownloadedItems(getApplicationContext());
}
+ /**
+ * This method MUST NOT, in any case, throw an exception.
+ * Otherwise, it hangs up the refresh thread pool.
+ */
private void performDownload(Downloader downloader) {
try {
downloader.call();
@@ -295,6 +300,24 @@ public class DownloadService extends Service {
});
}
+ /**
+ * This method MUST NOT, in any case, throw an exception.
+ * Otherwise, it hangs up the refresh thread pool.
+ */
+ private void performLocalFeedRefresh(Downloader downloader, DownloadRequest request) {
+ try {
+ Feed feed = DBReader.getFeed(request.getFeedfileId());
+ LocalFeedUpdater.updateFeed(feed, DownloadService.this);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ downloadEnqueueExecutor.submit(() -> {
+ downloads.remove(downloader);
+ stopServiceIfEverythingDone();
+ });
+ }
+
+
private void handleSuccessfulDownload(Downloader downloader) {
DownloadRequest request = downloader.getDownloadRequest();
DownloadStatus status = downloader.getResult();
@@ -479,7 +502,7 @@ public class DownloadService extends Service {
boolean initiatedByUser = intent.getBooleanExtra(EXTRA_INITIATED_BY_USER, false);
List<Feed> feeds = DBReader.getFeedList();
for (Feed feed : feeds) {
- if (feed.getPreferences().getKeepUpdated() && !feed.isLocalFeed()) {
+ if (feed.getPreferences().getKeepUpdated()) {
DownloadRequest.Builder builder = DownloadRequestCreator.create(feed);
builder.setInitiatedByUser(initiatedByUser);
addNewRequest(builder.build());
@@ -494,11 +517,18 @@ public class DownloadService extends Service {
Log.d(TAG, "Skipped enqueueing request. Already running.");
return;
}
- writeFileUrl(request);
- Downloader downloader = downloaderFactory.create(request);
- if (downloader != null) {
+ Log.d(TAG, "Add new request: " + request.getSource());
+ if (request.getSource().startsWith(Feed.PREFIX_LOCAL_FOLDER)) {
+ Downloader downloader = new LocalFeedStubDownloader(request);
downloads.add(downloader);
- downloadHandleExecutor.submit(() -> performDownload(downloader));
+ downloadHandleExecutor.submit(() -> performLocalFeedRefresh(downloader, request));
+ } else {
+ writeFileUrl(request);
+ Downloader downloader = downloaderFactory.create(request);
+ if (downloader != null) {
+ downloads.add(downloader);
+ downloadHandleExecutor.submit(() -> performDownload(downloader));
+ }
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/LocalFeedStubDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/LocalFeedStubDownloader.java
new file mode 100644
index 000000000..feb5fc6be
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/LocalFeedStubDownloader.java
@@ -0,0 +1,17 @@
+package de.danoeh.antennapod.core.service.download;
+
+import androidx.annotation.NonNull;
+
+/**
+ * This does not actually download, but it keeps track of a local feed's refresh state.
+ */
+public class LocalFeedStubDownloader extends Downloader {
+
+ public LocalFeedStubDownloader(@NonNull DownloadRequest request) {
+ super(request);
+ }
+
+ @Override
+ protected void download() {
+ }
+} \ No newline at end of file
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 b5bd6fca4..d1c041723 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
@@ -31,7 +31,6 @@ import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.event.FeedItemEvent;
import de.danoeh.antennapod.event.FeedListUpdateEvent;
import de.danoeh.antennapod.event.MessageEvent;
-import de.danoeh.antennapod.core.feed.LocalFeedUpdater;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.storage.mapper.FeedCursorMapper;
@@ -114,14 +113,6 @@ public final class DBTasks {
* @param initiatedByUser a boolean indicating if the refresh was triggered by user action.
*/
public static void refreshAllFeeds(final Context context, boolean initiatedByUser) {
- new Thread(() -> {
- List<Feed> feeds = DBReader.getFeedList();
- for (Feed feed : feeds) {
- if (feed.isLocalFeed() && feed.getPreferences().getKeepUpdated()) {
- LocalFeedUpdater.updateFeed(feed, context);
- }
- }
- }).start();
DownloadService.refreshAllFeeds(context, initiatedByUser);
SharedPreferences prefs = context.getSharedPreferences(PREF_NAME, MODE_PRIVATE);
@@ -169,15 +160,11 @@ public final class DBTasks {
}
private static void forceRefreshFeed(Context context, Feed feed, boolean loadAllPages, boolean initiatedByUser) {
- if (feed.isLocalFeed()) {
- new Thread(() -> LocalFeedUpdater.updateFeed(feed, context)).start();
- } else {
- DownloadRequest.Builder builder = DownloadRequestCreator.create(feed);
- builder.setInitiatedByUser(initiatedByUser);
- builder.setForce(true);
- builder.loadAllPages(loadAllPages);
- DownloadService.download(context, false, builder.build());
- }
+ DownloadRequest.Builder builder = DownloadRequestCreator.create(feed);
+ builder.setInitiatedByUser(initiatedByUser);
+ builder.setForce(true);
+ builder.loadAllPages(loadAllPages);
+ DownloadService.download(context, false, builder.build());
}
/**