summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/main/AndroidManifest.xml3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/event/FeedMediaEvent.java24
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/FeedMediaSizeService.java69
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java22
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java4
7 files changed, 136 insertions, 2 deletions
diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml
index 3ec519844..17dcb4ad8 100644
--- a/core/src/main/AndroidManifest.xml
+++ b/core/src/main/AndroidManifest.xml
@@ -23,6 +23,9 @@
<service
android:name=".service.GpodnetSyncService"
android:enabled="true" />
+ <service
+ android:name=".service.FeedMediaSizeService"
+ android:enabled="true" />
<receiver
android:name=".receiver.MediaButtonReceiver"
diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/FeedMediaEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/FeedMediaEvent.java
new file mode 100644
index 000000000..94e186b7a
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/event/FeedMediaEvent.java
@@ -0,0 +1,24 @@
+package de.danoeh.antennapod.core.event;
+
+import de.danoeh.antennapod.core.feed.FeedMedia;
+
+public class FeedMediaEvent {
+
+ public enum Action {
+ UPDATE
+ }
+
+ public final Action action;
+ public final FeedMedia media;
+
+ private FeedMediaEvent(Action action, FeedMedia media) {
+ this.action = action;
+ this.media = media;
+ }
+
+ public static FeedMediaEvent update(FeedMedia media) {
+ return new FeedMediaEvent(Action.UPDATE, media);
+ }
+
+
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/FeedMediaSizeService.java b/core/src/main/java/de/danoeh/antennapod/core/service/FeedMediaSizeService.java
new file mode 100644
index 000000000..e64a38901
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/FeedMediaSizeService.java
@@ -0,0 +1,69 @@
+package de.danoeh.antennapod.core.service;
+
+import android.app.IntentService;
+import android.content.Intent;
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.List;
+
+import de.danoeh.antennapod.core.event.FeedMediaEvent;
+import de.danoeh.antennapod.core.feed.FeedMedia;
+import de.danoeh.antennapod.core.storage.DBReader;
+import de.danoeh.antennapod.core.storage.DBWriter;
+import de.danoeh.antennapod.core.util.NetworkUtils;
+import de.greenrobot.event.EventBus;
+
+public class FeedMediaSizeService extends IntentService {
+
+ private final static String TAG = "FeedMediaSizeService";
+
+ public FeedMediaSizeService() {
+ super(TAG);
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ Log.d(TAG, "onHandleIntent()");
+ if(false == NetworkUtils.networkAvailable(this)) {
+ return;
+ }
+ List<FeedMedia> list = DBReader.getFeedMediaUnknownSize(this);
+ for (FeedMedia media : list) {
+ if(false == NetworkUtils.networkAvailable(this)) {
+ return;
+ }
+ long size = Integer.MIN_VALUE;
+ if(media.isDownloaded()) {
+ File mediaFile = new File(media.getLocalMediaUrl());
+ if(mediaFile.exists()) {
+ size = mediaFile.length();
+ }
+ } else {
+ HttpURLConnection conn = null;
+ try {
+ URL url = new URL(media.getDownload_url());
+ conn = (HttpURLConnection) url.openConnection();
+ conn.setRequestProperty("Accept-Encoding", "");
+ conn.setRequestMethod("HEAD");
+ size = conn.getContentLength();
+ conn.disconnect();
+ } catch (IOException e) {
+ Log.d(TAG, media.getDownload_url());
+ e.printStackTrace();
+ } finally {
+ if (conn != null) {
+ conn.disconnect();
+ }
+ }
+ }
+ media.setSize(size);
+ DBWriter.setFeedMedia(this, media);
+ EventBus.getDefault().post(FeedMediaEvent.update(media));
+ }
+ }
+
+}
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 634563099..53fd8c24b 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
@@ -550,6 +550,28 @@ public final class DBReader {
return itemIds;
}
+ /**
+ * Loads FeedMedia whose file size is unknown
+ *
+ * @param context A context that is used for opening a database connection.
+ * @return A list of FeedMedia items whose size is 0 (unknown and never tried to
+ * determine the correct size)
+ */
+ public static List<FeedMedia> getFeedMediaUnknownSize(Context context) {
+ PodDBAdapter adapter = new PodDBAdapter(context);
+ adapter.open();
+ Cursor cursor = adapter.getFeedMediaUnknownSizeCursor();
+ List<FeedMedia> result = new ArrayList<>(cursor.getCount());
+ if (cursor.moveToFirst()) {
+ do {
+ FeedMedia media = extractFeedMediaFromCursorRow(cursor);
+ result.add(media);
+ } while (cursor.moveToNext());
+ }
+ cursor.close();
+ return result;
+ }
+
/**
* Loads a list of FeedItems sorted by pubDate in descending order.
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 9273cf11e..a90df433e 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
@@ -5,6 +5,9 @@ import android.content.Intent;
import android.database.Cursor;
import android.util.Log;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -29,6 +32,7 @@ import de.danoeh.antennapod.core.feed.FeedImage;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
import de.danoeh.antennapod.core.preferences.UserPreferences;
+import de.danoeh.antennapod.core.service.FeedMediaSizeService;
import de.danoeh.antennapod.core.service.GpodnetSyncService;
import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
@@ -595,10 +599,9 @@ public final class DBTasks {
item.getIdentifyingValue());
if (oldItem == null) {
// item is new
- final int i = idx;
item.setFeed(savedFeed);
item.setAutoDownload(savedFeed.getPreferences().getAutoDownload());
- savedFeed.getItems().add(i, item);
+ savedFeed.getItems().add(idx, item);
if (markNewItems) {
item.setNew();
}
@@ -629,6 +632,8 @@ public final class DBTasks {
EventDistributor.getInstance().sendFeedUpdateBroadcast();
+ context.startService(new Intent(context, FeedMediaSizeService.class));
+
return resultFeeds;
}
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 c4b879091..15f35d644 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
@@ -1110,6 +1110,13 @@ public class PodDBAdapter {
return db.rawQuery(query, null);
}
+ public final Cursor getFeedMediaUnknownSizeCursor() {
+ final String query = "SELECT * "
+ + " FROM " + TABLE_NAME_FEED_MEDIA
+ + " WHERE " + KEY_SIZE + ">" + Integer.MIN_VALUE;
+ return db.rawQuery(query, null);
+ }
+
/**
* Returns a cursor which contains all items of a feed that are considered new.
* The returned cursor uses the FEEDITEM_SEL_FI_SMALL selection.
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java
index 6455332be..31eb2efd6 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java
@@ -57,6 +57,10 @@ public class NSRSS20 extends Namespace {
long size = 0;
try {
size = Long.parseLong(attributes.getValue(ENC_LEN));
+ if(size < 16384) {
+ // less than 16kb is suspicious, check manually
+ size = 0;
+ }
} catch (NumberFormatException e) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Length attribute could not be parsed.");