diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index aa7bcf22a..f5af6ed1d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -33,8 +33,14 @@
-
+
+
-
+
+
+
+
+
+
diff --git a/src/de/podfetcher/service/MediaButtonReceiver.java b/src/de/podfetcher/service/MediaButtonReceiver.java
new file mode 100644
index 000000000..9558b0e1d
--- /dev/null
+++ b/src/de/podfetcher/service/MediaButtonReceiver.java
@@ -0,0 +1,31 @@
+package de.podfetcher.service;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.util.Log;
+import android.view.KeyEvent;
+
+/** Receives media button events. */
+public class MediaButtonReceiver extends BroadcastReceiver {
+ private static final String TAG = "MediaButtonReceiver";
+ public static final String EXTRA_KEYCODE = "de.podfetcher.service.extra.MediaButtonReceiver.KEYCODE";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, "Received intent");
+ KeyEvent event = (KeyEvent) intent.getExtras().get(
+ Intent.EXTRA_KEY_EVENT);
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ Intent serviceIntent = new Intent(context, PlaybackService.class);
+ int keycode = event.getKeyCode();
+ serviceIntent.putExtra(EXTRA_KEYCODE, keycode);
+ context.startService(serviceIntent);
+ }
+
+ }
+
+}
diff --git a/src/de/podfetcher/service/PlaybackService.java b/src/de/podfetcher/service/PlaybackService.java
index 7815ca287..ccba7277a 100644
--- a/src/de/podfetcher/service/PlaybackService.java
+++ b/src/de/podfetcher/service/PlaybackService.java
@@ -7,6 +7,7 @@ import android.R;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -17,6 +18,7 @@ import android.media.AudioManager.OnAudioFocusChangeListener;
import android.media.MediaPlayer;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
+import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.net.Uri;
import android.os.AsyncTask;
@@ -62,6 +64,8 @@ public class PlaybackService extends Service {
private NotificationCompat.Builder notificationBuilder;
private AudioManager audioManager;
+ private ComponentName mediaButtonReceiver;
+
private MediaPlayer player;
private FeedMedia media;
@@ -96,6 +100,10 @@ public class PlaybackService extends Service {
player.setOnPreparedListener(preparedListener);
player.setOnCompletionListener(completionListener);
player.setOnSeekCompleteListener(onSeekCompleteListener);
+ mediaButtonReceiver = new ComponentName(getPackageName(),
+ MediaButtonReceiver.class.getName());
+ audioManager.registerMediaButtonEventReceiver(mediaButtonReceiver);
+
}
@Override
@@ -103,6 +111,7 @@ public class PlaybackService extends Service {
super.onDestroy();
isRunning = false;
Log.d(TAG, "Service is about to be destroyed");
+ audioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiver);
audioManager.abandonAudioFocus(audioFocusChangeListener);
player.release();
}
@@ -140,47 +149,78 @@ public class PlaybackService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
- long mediaId = intent.getLongExtra(EXTRA_MEDIA_ID, -1);
- long feedId = intent.getLongExtra(EXTRA_FEED_ID, -1);
- boolean playbackType = intent
- .getBooleanExtra(EXTRA_SHOULD_STREAM, true);
- if (mediaId == -1 || feedId == -1) {
- Log.e(TAG, "Media ID or Feed ID wasn't provided to the Service.");
- if (media == null || feed == null) {
- stopSelf();
- }
- // Intent values appear to be valid
- // check if already playing and playbackType is the same
- } else if (media == null || mediaId != media.getId()
- || playbackType != shouldStream) {
- pause();
- player.reset();
- if (media == null || mediaId != media.getId()) {
- feed = manager.getFeed(feedId);
- media = manager.getFeedMedia(mediaId, feed);
- }
+ int keycode = intent.getIntExtra(MediaButtonReceiver.EXTRA_KEYCODE, -1);
+ if (keycode != -1) {
+ Log.d(TAG, "Received media button event");
+ handleKeycode(keycode);
+ } else {
- if (media != null) {
- shouldStream = playbackType;
- startWhenPrepared = intent.getBooleanExtra(
- EXTRA_START_WHEN_PREPARED, false);
- setupMediaplayer();
+ long mediaId = intent.getLongExtra(EXTRA_MEDIA_ID, -1);
+ long feedId = intent.getLongExtra(EXTRA_FEED_ID, -1);
+ boolean playbackType = intent.getBooleanExtra(EXTRA_SHOULD_STREAM,
+ true);
+ if (mediaId == -1 || feedId == -1) {
+ Log.e(TAG,
+ "Media ID or Feed ID wasn't provided to the Service.");
+ if (media == null || feed == null) {
+ stopSelf();
+ }
+ // Intent values appear to be valid
+ // check if already playing and playbackType is the same
+ } else if (media == null || mediaId != media.getId()
+ || playbackType != shouldStream) {
+ pause();
+ player.reset();
+ if (media == null || mediaId != media.getId()) {
+ feed = manager.getFeed(feedId);
+ media = manager.getFeedMedia(mediaId, feed);
+ }
+
+ if (media != null) {
+ shouldStream = playbackType;
+ startWhenPrepared = intent.getBooleanExtra(
+ EXTRA_START_WHEN_PREPARED, false);
+ setupMediaplayer();
+
+ } else {
+ Log.e(TAG, "Media is null");
+ stopSelf();
+ }
+
+ } else if (media != null) {
+ if (status == PlayerStatus.PAUSED) {
+ play();
+ }
} else {
- Log.e(TAG, "Media is null");
+ Log.w(TAG, "Something went wrong. Shutting down...");
stopSelf();
}
+ }
+ return Service.START_NOT_STICKY;
+ }
- } else if (media != null) {
+ /** Handles media button events */
+ private void handleKeycode(int keycode) {
+ switch (keycode) {
+ case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+ if (status == PlayerStatus.PLAYING) {
+ pause();
+ } else if (status == PlayerStatus.PAUSED) {
+ play();
+ }
+ break;
+ case KeyEvent.KEYCODE_MEDIA_PLAY:
if (status == PlayerStatus.PAUSED) {
play();
}
-
- } else {
- Log.w(TAG, "Something went wrong. Shutting down...");
- stopSelf();
+ break;
+ case KeyEvent.KEYCODE_MEDIA_PAUSE:
+ if (status == PlayerStatus.PLAYING) {
+ pause();
+ }
+ break;
}
- return Service.START_NOT_STICKY;
}
/**
@@ -215,7 +255,7 @@ public class PlaybackService extends Service {
}
}
-
+
/** Called when the surface holder of the mediaplayer has to be changed. */
public void resetVideoSurface() {
positionSaver.cancel(true);
@@ -343,7 +383,6 @@ public class PlaybackService extends Service {
if (focusGained == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d(TAG, "Audiofocus successfully requested");
-
Log.d(TAG, "Resuming/Starting playback");
SharedPreferences.Editor editor = getApplicationContext()
.getSharedPreferences(PodcastApp.PREF_NAME, 0).edit();