summaryrefslogtreecommitdiff
path: root/core/src/main/java
diff options
context:
space:
mode:
authorMartin Fietz <marf@hadiko-99-4.hadiko.uni-karlsruhe.de>2015-04-28 16:49:41 +0200
committerMartin Fietz <marf@hadiko-99-4.hadiko.uni-karlsruhe.de>2015-04-28 17:10:06 +0200
commit8050372ba0c0d0ee9f03535866a7ddf0e7c4e744 (patch)
treec5111e4f57cc99154360ed2288261956e48613af /core/src/main/java
parente83774a68414dfc3bb9d454bf65be8beec7f8666 (diff)
downloadAntennaPod-8050372ba0c0d0ee9f03535866a7ddf0e7c4e744.zip
Add ability to retry failed downloads in the download log
Diffstat (limited to 'core/src/main/java')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java91
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java8
3 files changed, 85 insertions, 21 deletions
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 d5f17c099..84822666c 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
@@ -939,6 +939,13 @@ public class DownloadService extends Service {
if (successful) {
+ // we create a 'successful' download log if the feed's last refresh failed
+ List<DownloadStatus> log = DBReader.getFeedDownloadLog(DownloadService.this, feed);
+ if(log.size() > 0 && log.get(0).isSuccessful() == false) {
+ saveDownloadStatus(new DownloadStatus(feed,
+ feed.getHumanReadableIdentifier(), DownloadError.SUCCESS, successful,
+ reasonDetailed));
+ }
return Pair.create(request, result);
} else {
numberOfDownloads.decrementAndGet();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
index a7c98c7c6..4aa133e72 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
@@ -327,6 +327,21 @@ public final class DBReader {
return feed;
}
+ private static DownloadStatus extractDownloadStatusFromCursorRow(final Cursor cursor) {
+ long id = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
+ long feedfileId = cursor.getLong(PodDBAdapter.KEY_FEEDFILE_INDEX);
+ int feedfileType = cursor.getInt(PodDBAdapter.KEY_FEEDFILETYPE_INDEX);
+ boolean successful = cursor.getInt(PodDBAdapter.KEY_SUCCESSFUL_INDEX) > 0;
+ int reason = cursor.getInt(PodDBAdapter.KEY_REASON_INDEX);
+ String reasonDetailed = cursor.getString(PodDBAdapter.KEY_REASON_DETAILED_INDEX);
+ String title = cursor.getString(PodDBAdapter.KEY_DOWNLOADSTATUS_TITLE_INDEX);
+ Date completionDate = new Date(cursor.getLong(PodDBAdapter.KEY_COMPLETION_DATE_INDEX));
+
+ return new DownloadStatus(id, title, feedfileId,
+ feedfileType, successful, DownloadError.fromCode(reason), completionDate,
+ reasonDetailed);
+ }
+
private static FeedItem getMatchingItemForMedia(long itemId,
List<FeedItem> items) {
@@ -565,27 +580,7 @@ public final class DBReader {
if (logCursor.moveToFirst()) {
do {
- long id = logCursor.getLong(PodDBAdapter.KEY_ID_INDEX);
-
- long feedfileId = logCursor
- .getLong(PodDBAdapter.KEY_FEEDFILE_INDEX);
- int feedfileType = logCursor
- .getInt(PodDBAdapter.KEY_FEEDFILETYPE_INDEX);
- boolean successful = logCursor
- .getInt(PodDBAdapter.KEY_SUCCESSFUL_INDEX) > 0;
- int reason = logCursor.getInt(PodDBAdapter.KEY_REASON_INDEX);
- String reasonDetailed = logCursor
- .getString(PodDBAdapter.KEY_REASON_DETAILED_INDEX);
- String title = logCursor
- .getString(PodDBAdapter.KEY_DOWNLOADSTATUS_TITLE_INDEX);
- Date completionDate = new Date(
- logCursor
- .getLong(PodDBAdapter.KEY_COMPLETION_DATE_INDEX)
- );
- downloadLog.add(new DownloadStatus(id, title, feedfileId,
- feedfileType, successful, DownloadError.fromCode(reason), completionDate,
- reasonDetailed));
-
+ downloadLog.add(extractDownloadStatusFromCursorRow(logCursor));
} while (logCursor.moveToNext());
}
logCursor.close();
@@ -594,6 +589,60 @@ public final class DBReader {
}
/**
+ * Loads the download log for a particular feed from the database.
+ *
+ * @param context A context that is used for opening a database connection.
+ * @param feed Feed for which the download log is loaded
+ * @return A list with DownloadStatus objects that represent the feed's download log,
+ * newest events first.
+ */
+ public static List<DownloadStatus> getFeedDownloadLog(Context context, Feed feed) {
+ Log.d(TAG, "getFeedDownloadLog(CONTEXT, " + feed.toString() + ")");
+
+ PodDBAdapter adapter = new PodDBAdapter(context);
+ adapter.open();
+ Cursor cursor = adapter.getDownloadLog(Feed.FEEDFILETYPE_FEED, feed.getId());
+ List<DownloadStatus> downloadLog = new ArrayList<DownloadStatus>(
+ cursor.getCount());
+
+ if (cursor.moveToFirst()) {
+ do {
+ downloadLog.add(extractDownloadStatusFromCursorRow(cursor));
+ } while (cursor.moveToNext());
+ }
+ cursor.close();
+ Collections.sort(downloadLog, new DownloadStatusComparator());
+ return downloadLog;
+ }
+
+ /**
+ * Loads the download log for a particular feed media from the database.
+ *
+ * @param context A context that is used for opening a database connection.
+ * @param media Feed media for which the download log is loaded
+ * @return A list with DownloadStatus objects that represent the feed media's download log,
+ * newest events first.
+ */
+ public static List<DownloadStatus> getFeedMediaDownloadLog(Context context, FeedMedia media) {
+ Log.d(TAG, "getFeedDownloadLog(CONTEXT, " + media.toString() + ")");
+
+ PodDBAdapter adapter = new PodDBAdapter(context);
+ adapter.open();
+ Cursor cursor = adapter.getDownloadLog(FeedMedia.FEEDFILETYPE_FEEDMEDIA, media.getId());
+ List<DownloadStatus> downloadLog = new ArrayList<DownloadStatus>(
+ cursor.getCount());
+
+ if (cursor.moveToFirst()) {
+ do {
+ downloadLog.add(extractDownloadStatusFromCursorRow(cursor));
+ } while (cursor.moveToNext());
+ }
+ cursor.close();
+ Collections.sort(downloadLog, new DownloadStatusComparator());
+ return downloadLog;
+ }
+
+ /**
* Loads the FeedItemStatistics objects of all Feeds in the database. This method should be preferred over
* {@link #getFeedItemList(android.content.Context, de.danoeh.antennapod.core.feed.Feed)} if only metadata about
* the FeedItems is needed.
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
index f518a4f5f..8d11f7778 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
@@ -977,6 +977,14 @@ public class PodDBAdapter {
return c;
}
+ public final Cursor getDownloadLog(final int feedFileType, final long feedFileId) {
+ final String query = "SELECT * FROM " + TABLE_NAME_DOWNLOAD_LOG +
+ " WHERE " + KEY_FEEDFILE + "=" + feedFileId + " AND " + KEY_FEEDFILETYPE + "=" + feedFileType
+ + " ORDER BY " + KEY_ID + " DESC";
+ Cursor c = db.rawQuery(query, null);
+ return c;
+ }
+
public final Cursor getDownloadLogCursor(final int limit) {
Cursor c = db.query(TABLE_NAME_DOWNLOAD_LOG, null, null, null, null,
null, KEY_COMPLETION_DATE + " DESC LIMIT " + limit);