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 0dc5c9db2..9153fb957 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 @@ -424,6 +424,8 @@ public class DownloadService extends Service { "ACTION_ENQUEUE_DOWNLOAD intent needs request extra"); } + writeFileUrl(request); + Downloader downloader = getDownloader(request); if (downloader != null) { numberOfDownloads.incrementAndGet(); @@ -905,6 +907,42 @@ public class DownloadService extends Service { } + /** + * Creates the destination file and writes FeedMedia File_url directly after starting download + * to make it possible to resume download after the service was killed by the system. + */ + private void writeFileUrl(DownloadRequest request) { + if (request.getFeedfileType() != FeedMedia.FEEDFILETYPE_FEEDMEDIA) { + return; + } + + File dest = new File(request.getDestination()); + if (!dest.exists()) { + try { + dest.createNewFile(); + } catch (IOException e) { + Log.e(TAG, "Unable to create file"); + } + } + + if (dest.exists()) { + Log.d(TAG, "Writing file url"); + FeedMedia media = DBReader.getFeedMedia(request.getFeedfileId()); + if (media == null) { + Log.d(TAG, "No media"); + return; + } + media.setFile_url(request.getDestination()); + try { + DBWriter.setFeedMedia(media).get(); + } catch (InterruptedException e) { + Log.e(TAG, "writeFileUrl was interrupted"); + } catch (ExecutionException e) { + Log.e(TAG, "ExecutionException in writeFileUrl: " + e.getMessage()); + } + } + } + /** * Handles failed downloads. *

@@ -929,23 +967,6 @@ public class DownloadService extends Service { DBWriter.setFeedLastUpdateFailed(request.getFeedfileId(), true); } else if (request.isDeleteOnFailure()) { Log.d(TAG, "Ignoring failed download, deleteOnFailure=true"); - } else { - File dest = new File(request.getDestination()); - if (dest.exists() && request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { - Log.d(TAG, "File has been partially downloaded. Writing file url"); - FeedMedia media = DBReader.getFeedMedia(request.getFeedfileId()); - if (media == null) { - return; - } - media.setFile_url(request.getDestination()); - try { - DBWriter.setFeedMedia(media).get(); - } catch (InterruptedException e) { - Log.e(TAG, "FailedDownloadHandler was interrupted"); - } catch (ExecutionException e) { - Log.e(TAG, "ExecutionException in FailedDownloadHandler: " + e.getMessage()); - } - } } } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java index 7051d7f4d..71880e609 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java @@ -11,8 +11,10 @@ import android.webkit.URLUtil; import org.apache.commons.io.FilenameUtils; import java.io.File; +import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.feed.Feed; @@ -89,7 +91,9 @@ public class DownloadRequester { private void download(Context context, FeedFile item, FeedFile container, File dest, boolean overwriteIfExists, String username, String password, String lastModified, boolean deleteOnFailure, Bundle arguments) { - final boolean partiallyDownloadedFileExists = item.getFile_url() != null; + final boolean partiallyDownloadedFileExists = item.getFile_url() != null && new File(item.getFile_url()).exists(); + + Log.d(TAG, "partiallyDownloadedFileExists: " + partiallyDownloadedFileExists); if (isDownloadingFile(item)) { Log.e(TAG, "URL " + item.getDownload_url() + " is already being downloaded");