From 3abce4c597bc74b95d9cbdb88e2bf3671047c811 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Tue, 18 Aug 2015 17:38:51 +0200 Subject: Load feed media size on demand --- .../core/service/FeedMediaSizeService.java | 64 -------------------- .../danoeh/antennapod/core/storage/DBReader.java | 23 -------- .../de/danoeh/antennapod/core/storage/DBTasks.java | 8 --- .../antennapod/core/storage/PodDBAdapter.java | 7 --- .../danoeh/antennapod/core/util/NetworkUtils.java | 68 ++++++++++++++++++++++ 5 files changed, 68 insertions(+), 102 deletions(-) delete mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/FeedMediaSizeService.java (limited to 'core/src/main/java') 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 deleted file mode 100644 index a8375bce3..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/service/FeedMediaSizeService.java +++ /dev/null @@ -1,64 +0,0 @@ -package de.danoeh.antennapod.core.service; - -import android.app.IntentService; -import android.content.Intent; -import android.util.Log; - -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()"); - return; -// if(false == NetworkUtils.isDownloadAllowed()) { -// return; -// } -// List list = DBReader.getFeedMediaUnknownSize(this); -// for (FeedMedia media : list) { -// Log.d(TAG, "Getting size currently " + media.getSize() + " for " + media.getDownload_url()); -// if(false == NetworkUtils.isDownloadAllowed()) { -// return; -// } -// long size = Integer.MIN_VALUE; -// if (media.isDownloaded()) { -// File mediaFile = new File(media.getLocalMediaUrl()); -// if(mediaFile.exists()) { -// size = mediaFile.length(); -// } -// } else if (false == media.checkedOnSizeButUnknown()) { -// // only query the network if we haven't already checked -// 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(); -// } catch (IOException e) { -// Log.d(TAG, media.getDownload_url()); -// e.printStackTrace(); -// } finally { -// if (conn != null) { -// conn.disconnect(); -// } -// } -// } -// if (size <= 0) { -// // they didn't tell us the size, but we don't want to keep querying on it -// media.setCheckedOnSizeButUnknown(); -// } else { -// media.setSize(size); -// } -// Log.d(TAG, "Size now: " + media.getSize()); -// 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 5ed0a6ee3..86e788c7a 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 @@ -521,29 +521,6 @@ 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 getFeedMediaUnknownSize(Context context) { - PodDBAdapter adapter = new PodDBAdapter(context); - adapter.open(); - Cursor cursor = adapter.getFeedMediaUnknownSizeCursor(); - List 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 6ced03c0e..5a3822a81 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,9 +5,6 @@ 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; @@ -28,11 +25,8 @@ import de.danoeh.antennapod.core.asynctask.FlattrClickWorker; import de.danoeh.antennapod.core.asynctask.FlattrStatusFetcher; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; -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; @@ -578,8 +572,6 @@ 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 edb7598ab..c14365911 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,13 +1110,6 @@ public class PodDBAdapter { return db.rawQuery(query, null); } - public final Cursor getFeedMediaUnknownSizeCursor() { - final String query = "SELECT * " - + " FROM " + TABLE_NAME_FEED_MEDIA - + " WHERE " + KEY_SIZE + "<= 0"; - 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/util/NetworkUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java index 9296039f0..1b57baa11 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java @@ -7,10 +7,23 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.util.Log; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; + +import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.List; +import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.service.download.AntennapodHttpClient; +import de.danoeh.antennapod.core.storage.DBWriter; +import rx.Observable; +import rx.Subscriber; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; public class NetworkUtils { @@ -78,4 +91,59 @@ public class NetworkUtils { return mWifi.isConnected(); } + public static Observable getFeedMediaSizeObservable(FeedMedia media) { + return Observable.create(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + if (false == NetworkUtils.isDownloadAllowed()) { + subscriber.onNext(0L); + subscriber.onCompleted(); + return; + } + long size = Integer.MIN_VALUE; + if (media.isDownloaded()) { + File mediaFile = new File(media.getLocalMediaUrl()); + if (mediaFile.exists()) { + size = mediaFile.length(); + } + } else if (false == media.checkedOnSizeButUnknown()) { + // only query the network if we haven't already checked + OkHttpClient client = AntennapodHttpClient.getHttpClient(); + Request.Builder httpReq = new Request.Builder() + .url(media.getDownload_url()) + .header("Accept-Encoding", "identity") + .head(); + try { + Response response = client.newCall(httpReq.build()).execute(); + if (response.isSuccessful()) { + String contentLength = response.header("Content-Length"); + try { + size = Integer.parseInt(contentLength); + } catch (NumberFormatException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + } + } catch (IOException e) { + subscriber.onNext(0L); + subscriber.onCompleted(); + Log.e(TAG, Log.getStackTraceString(e)); + return; // better luck next time + } + } + Log.d(TAG, "new size: " + size); + if (size <= 0) { + // they didn't tell us the size, but we don't want to keep querying on it + media.setCheckedOnSizeButUnknown(); + } else { + media.setSize(size); + } + subscriber.onNext(size); + subscriber.onCompleted(); + DBWriter.setFeedMedia(context, media); + } + }) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()); + } + } -- cgit v1.2.3