diff options
Diffstat (limited to 'src')
4 files changed, 62 insertions, 11 deletions
diff --git a/src/de/danoeh/antennapod/feed/FeedMedia.java b/src/de/danoeh/antennapod/feed/FeedMedia.java index 4096c6cca..1368cf854 100644 --- a/src/de/danoeh/antennapod/feed/FeedMedia.java +++ b/src/de/danoeh/antennapod/feed/FeedMedia.java @@ -198,9 +198,18 @@ public class FeedMedia extends FeedFile implements Playable { @Override public void loadMetadata() throws PlayableException { - if (getChapters() == null) { + } + + @Override + public void loadChapterMarks() { + if (getChapters() == null && !localFileAvailable()) { ChapterUtils.loadChaptersFromStreamUrl(this); + if (getChapters() != null) { + FeedManager.getInstance().setFeedItem(PodcastApp.getInstance(), + item); + } } + } @Override @@ -337,7 +346,8 @@ public class FeedMedia extends FeedFile implements Playable { @Override public String getImageLoaderCacheKey() { - String out = new Playable.DefaultPlayableImageLoader(this).getImageLoaderCacheKey(); + String out = new Playable.DefaultPlayableImageLoader(this) + .getImageLoaderCacheKey(); if (out == null) { if (item.getFeed().getImage() != null) { return item.getFeed().getImage().getImageLoaderCacheKey(); diff --git a/src/de/danoeh/antennapod/service/PlaybackService.java b/src/de/danoeh/antennapod/service/PlaybackService.java index e169eaa0f..c414e0992 100644 --- a/src/de/danoeh/antennapod/service/PlaybackService.java +++ b/src/de/danoeh/antennapod/service/PlaybackService.java @@ -152,6 +152,8 @@ public class PlaybackService extends Service { /** True if mediaplayer was paused because it lost audio focus temporarily */ private boolean pausedBecauseOfTransientAudiofocusLoss; + private Thread chapterLoader; + private final IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { @@ -272,6 +274,9 @@ public class PlaybackService extends Service { if (AppConfig.DEBUG) Log.d(TAG, "Service is about to be destroyed"); isRunning = false; + if (chapterLoader != null) { + chapterLoader.interrupt(); + } disableSleepTimer(); unregisterReceiver(headsetDisconnected); unregisterReceiver(shutdownReceiver); @@ -337,7 +342,7 @@ public class PlaybackService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); - + if (AppConfig.DEBUG) Log.d(TAG, "OnStartCommand called"); int keycode = intent.getIntExtra(MediaButtonReceiver.EXTRA_KEYCODE, -1); @@ -617,6 +622,27 @@ public class PlaybackService extends Service { media.setDuration(mp.getDuration()); } setStatus(PlayerStatus.PREPARED); + if (chapterLoader != null) { + chapterLoader.interrupt(); + } + chapterLoader = new Thread() { + @Override + public void run() { + if (AppConfig.DEBUG) + Log.d(TAG, "Chapter loader started"); + if (media != null && media.getChapters() == null) { + media.loadChapterMarks(); + if (!isInterrupted() && media.getChapters() != null) { + sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, + 0); + } + } + if (AppConfig.DEBUG) + Log.d(TAG, "Chapter loader stopped"); + } + }; + chapterLoader.start(); + if (startWhenPrepared) { play(); } @@ -962,7 +988,8 @@ public class PlaybackService extends Service { if (media != null && media != null) { int iconSize = getResources().getDimensionPixelSize( android.R.dimen.notification_large_icon_width); - icon = BitmapDecoder.decodeBitmapFromWorkerTaskResource(iconSize, media); + icon = BitmapDecoder.decodeBitmapFromWorkerTaskResource( + iconSize, media); } } diff --git a/src/de/danoeh/antennapod/util/playback/ExternalMedia.java b/src/de/danoeh/antennapod/util/playback/ExternalMedia.java index 46f3dfcd8..55a37413b 100644 --- a/src/de/danoeh/antennapod/util/playback/ExternalMedia.java +++ b/src/de/danoeh/antennapod/util/playback/ExternalMedia.java @@ -62,8 +62,6 @@ public class ExternalMedia implements Playable { @Override public void loadMetadata() throws PlayableException { - final String tmpFileName = "tmpExternalMediaimage"; - MediaMetadataRetriever mmr = new MediaMetadataRetriever(); try { mmr.setDataSource(source); @@ -80,6 +78,11 @@ public class ExternalMedia implements Playable { .extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); ChapterUtils.loadChaptersFromFileUrl(this); } + + @Override + public void loadChapterMarks() { + + } @Override public String getEpisodeTitle() { @@ -214,12 +217,14 @@ public class ExternalMedia implements Playable { @Override public String getImageLoaderCacheKey() { - return new Playable.DefaultPlayableImageLoader(this).getImageLoaderCacheKey(); + return new Playable.DefaultPlayableImageLoader(this) + .getImageLoaderCacheKey(); } @Override public InputStream reopenImageInputStream(InputStream input) { - return new Playable.DefaultPlayableImageLoader(this).reopenImageInputStream(input); + return new Playable.DefaultPlayableImageLoader(this) + .reopenImageInputStream(input); } } diff --git a/src/de/danoeh/antennapod/util/playback/Playable.java b/src/de/danoeh/antennapod/util/playback/Playable.java index ae87d5903..0404379e2 100644 --- a/src/de/danoeh/antennapod/util/playback/Playable.java +++ b/src/de/danoeh/antennapod/util/playback/Playable.java @@ -31,11 +31,19 @@ public interface Playable extends Parcelable, /** * This method is called from a separate thread by the PlaybackService. - * Playable objects should load their metadata in this method (for example: - * chapter marks). + * Playable objects should load their metadata in this method. This method + * should execute as quickly as possible and NOT load chapter marks if no + * local file is available. */ public void loadMetadata() throws PlayableException; + /** + * This method is called from a separate thread by the PlaybackService. + * Playable objects should load their chapter marks in this method if no + * local file was available when loadMetadata() was called. + */ + public void loadChapterMarks(); + /** Returns the title of the episode that this playable represents */ public String getEpisodeTitle(); @@ -240,7 +248,8 @@ public interface Playable extends Parcelable, public InputStream reopenImageInputStream(InputStream input) { if (input instanceof PublicByteArrayInputStream) { IOUtils.closeQuietly(input); - byte[] imgData = ((PublicByteArrayInputStream) input).getByteArray(); + byte[] imgData = ((PublicByteArrayInputStream) input) + .getByteArray(); if (imgData != null) { ByteArrayInputStream out = new ByteArrayInputStream(imgData); return out; |