From d98fa5746836ed623463e5c6c2cd57276c3f6eab Mon Sep 17 00:00:00 2001 From: Daniel Oeh Date: Wed, 30 May 2012 14:57:11 +0200 Subject: [PATCH] Created Playback Service --- AndroidManifest.xml | 1 + .../podfetcher/activity/ItemviewActivity.java | 11 +++ src/de/podfetcher/feed/FeedManager.java | 65 ++++++++++------- .../podfetcher/fragment/FeedlistFragment.java | 2 +- .../podfetcher/service/PlaybackService.java | 71 +++++++++++++++++++ 5 files changed, 122 insertions(+), 28 deletions(-) create mode 100644 src/de/podfetcher/service/PlaybackService.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index bfbae8b30..4ec6131fb 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -29,5 +29,6 @@ + diff --git a/src/de/podfetcher/activity/ItemviewActivity.java b/src/de/podfetcher/activity/ItemviewActivity.java index 9bd800526..06c12b86a 100644 --- a/src/de/podfetcher/activity/ItemviewActivity.java +++ b/src/de/podfetcher/activity/ItemviewActivity.java @@ -17,6 +17,7 @@ import android.widget.TextView; import android.widget.ImageView; import de.podfetcher.R; import de.podfetcher.service.DownloadObserver; +import de.podfetcher.service.PlaybackService; import de.podfetcher.storage.DownloadRequester; import de.podfetcher.fragment.FeedlistFragment; @@ -52,6 +53,16 @@ public class ItemviewActivity extends SherlockActivity { getDownloadStatus(); } }); + + butPlay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent launchIntent = new Intent(v.getContext(), PlaybackService.class); + launchIntent.putExtra(PlaybackService.EXTRA_MEDIA_ID, item.getMedia().getId()); + launchIntent.putExtra(PlaybackService.EXTRA_FEED_ID, item.getFeed().getId()); + v.getContext().startService(launchIntent); + } + }); } /** Extracts FeedItem object the activity is supposed to display */ diff --git a/src/de/podfetcher/feed/FeedManager.java b/src/de/podfetcher/feed/FeedManager.java index 65692a2ea..91e897f65 100644 --- a/src/de/podfetcher/feed/FeedManager.java +++ b/src/de/podfetcher/feed/FeedManager.java @@ -17,21 +17,21 @@ import android.util.Log; * */ public class FeedManager { private static final String TAG = "FeedManager"; - + private static FeedManager singleton; - + private ArrayList feeds; private ArrayList categories; private DownloadRequester requester; - + private FeedManager() { feeds = new ArrayList(); categories = new ArrayList(); requester = DownloadRequester.getInstance(); } - + public static FeedManager getInstance(){ if(singleton == null) { singleton = new FeedManager(); @@ -53,7 +53,7 @@ public class FeedManager { setFeedItem(context, item); } } - + /** Adds a new Feeditem if its not in the list */ public void addFeedItem(Context context, FeedItem item) { @@ -129,16 +129,16 @@ public class FeedManager { PodDBAdapter adapter = new PodDBAdapter(context); return adapter.setFeedItem(item); } - + /** Updates information of an existing FeedImage */ public long setFeedImage(Context context, FeedImage image) { - PodDBAdapter adapter = new PodDBAdapter(context); - return adapter.setImage(image); + PodDBAdapter adapter = new PodDBAdapter(context); + return adapter.setImage(image); } /** Updates information of an existing FeedMedia object. */ public long setFeedMedia(Context context, FeedMedia media) { - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = new PodDBAdapter(context); return adapter.setMedia(media); } @@ -165,28 +165,39 @@ public class FeedManager { /** Get a Feed Item by its id and its feed*/ public FeedItem getFeedItem(long id, Feed feed) { - for(FeedItem item : feed.getItems()) { - if(item.getId() == id) { - return item; - } + for(FeedItem item : feed.getItems()) { + if(item.getId() == id) { + return item; } - Log.w(TAG, "Couldn't find FeedItem with id " + id); + } + Log.e(TAG, "Couldn't find FeedItem with id " + id); return null; } - + + /** Get a FeedMedia object by the id of the Media object and the feed object */ + public FeedMedia getFeedMedia(long id, Feed feed) { + for (FeedItem item : feed.getItems()) { + if(item.getMedia().getId() == id) { + return item.getMedia(); + } + } + Log.e(TAG, "Couldn't find FeedMedia with id " + id); + return null; + } + /** Reads the database */ public void loadDBData(Context context) { PodDBAdapter adapter = new PodDBAdapter(context); updateArrays(context); } - - + + public void updateArrays(Context context) { feeds.clear(); categories.clear(); extractFeedlistFromCursor(context); } - + private void extractFeedlistFromCursor(Context context) { PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); @@ -194,7 +205,7 @@ public class FeedManager { if(feedlistCursor.moveToFirst()) { do { Feed feed = new Feed(); - + feed.id = feedlistCursor.getLong(feedlistCursor.getColumnIndex(PodDBAdapter.KEY_ID)); feed.setTitle(feedlistCursor.getString(feedlistCursor.getColumnIndex(PodDBAdapter.KEY_TITLE))); feed.setLink(feedlistCursor.getString(feedlistCursor.getColumnIndex(PodDBAdapter.KEY_LINK))); @@ -202,17 +213,17 @@ public class FeedManager { feed.setImage(adapter.getFeedImage(feedlistCursor.getLong(feedlistCursor.getColumnIndex(PodDBAdapter.KEY_IMAGE)))); feed.file_url = feedlistCursor.getString(feedlistCursor.getColumnIndex(PodDBAdapter.KEY_FILE_URL)); feed.download_url = feedlistCursor.getString(feedlistCursor.getColumnIndex(PodDBAdapter.KEY_DOWNLOAD_URL)); - + // Get FeedItem-Object Cursor itemlistCursor = adapter.getAllItemsOfFeedCursor(feed); feed.setItems(extractFeedItemsFromCursor(context, feed, itemlistCursor)); - + feeds.add(feed); }while(feedlistCursor.moveToNext()); } adapter.close(); } - + private ArrayList extractFeedItemsFromCursor(Context context, Feed feed, Cursor itemlistCursor) { ArrayList items = new ArrayList(); PodDBAdapter adapter = new PodDBAdapter(context); @@ -220,7 +231,7 @@ public class FeedManager { if(itemlistCursor.moveToFirst()) { do { FeedItem item = new FeedItem(); - + item.id = itemlistCursor.getLong(itemlistCursor.getColumnIndex(PodDBAdapter.KEY_ID)); item.setFeed(feed); item.setTitle(itemlistCursor.getString(itemlistCursor.getColumnIndex(PodDBAdapter.KEY_TITLE))); @@ -231,7 +242,7 @@ public class FeedManager { itemlistCursor.getLong( itemlistCursor.getColumnIndex(PodDBAdapter.KEY_MEDIA)), item)); item.setRead((itemlistCursor.getInt(itemlistCursor.getColumnIndex(PodDBAdapter.KEY_READ)) > 0) ? true : false); - + items.add(item); } while(itemlistCursor.moveToNext()); } @@ -242,8 +253,8 @@ public class FeedManager { public ArrayList getFeeds() { return feeds; } - - - + + + } diff --git a/src/de/podfetcher/fragment/FeedlistFragment.java b/src/de/podfetcher/fragment/FeedlistFragment.java index 10e195014..6afd49dbe 100644 --- a/src/de/podfetcher/fragment/FeedlistFragment.java +++ b/src/de/podfetcher/fragment/FeedlistFragment.java @@ -25,7 +25,7 @@ import android.util.Log; public class FeedlistFragment extends SherlockListFragment { - private static final String TAG = "FeedlistActivity"; + private static final String TAG = "FeedlistFragment"; public static final String EXTRA_SELECTED_FEED = "extra.de.podfetcher.activity.selected_feed"; private FeedManager manager; diff --git a/src/de/podfetcher/service/PlaybackService.java b/src/de/podfetcher/service/PlaybackService.java new file mode 100644 index 000000000..a4043f6f4 --- /dev/null +++ b/src/de/podfetcher/service/PlaybackService.java @@ -0,0 +1,71 @@ +package de.podfetcher.service; + +import java.io.File; + +import android.app.Service; +import android.content.Intent; +import android.media.MediaPlayer; +import android.util.Log; +import android.net.Uri; +import android.os.IBinder; + +import de.podfetcher.feed.FeedMedia; +import de.podfetcher.feed.Feed; +import de.podfetcher.feed.FeedManager; + +/** Controls the MediaPlayer that plays a FeedMedia-file */ +public class PlaybackService extends Service { + /** Logging tag */ + private static final String TAG = "PlaybackService"; + /** Contains the id of the FeedMedia object. */ + public static final String EXTRA_MEDIA_ID = "extra.de.podfetcher.service.mediaId"; + /** Contains the id of the Feed object of the FeedMedia. */ + public static final String EXTRA_FEED_ID = "extra.de.podfetcher.service.feedId"; + + private MediaPlayer player; + private FeedMedia media; + private Feed feed; + private FeedManager manager; + + @Override + public void onCreate() { + super.onCreate(); + Log.d(TAG, "Service created."); + + manager = FeedManager.getInstance(); + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (player != null) { + player.stop(); + } + long mediaId = intent.getLongExtra(EXTRA_MEDIA_ID, -1); + long feedId = intent.getLongExtra(EXTRA_FEED_ID, -1); + if (mediaId == -1 || feedId == -1) { + Log.e(TAG, "Media ID or Feed ID wasn't provided to the Service."); + } else { + feed = manager.getFeed(feedId); + media = manager.getFeedMedia(mediaId, feed); + player = MediaPlayer.create(this, Uri.fromFile(new File(media.getFile_url()))); + player.setOnPreparedListener(preparedListener); + Log.d(TAG, "Preparing to play file"); + //player.prepareAsync(); + } + return Service.START_NOT_STICKY; + } + + private MediaPlayer.OnPreparedListener preparedListener = new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + Log.d(TAG, "Resource prepared"); + mp.start(); + } + }; + +}