Merge pull request #1356 from TomHennen/more_notification_controls

put ff and rewind buttons on the large notification.
This commit is contained in:
Tom Hennen 2015-11-07 15:35:45 -05:00
commit aea68acc20
1 changed files with 67 additions and 60 deletions

View File

@ -1,6 +1,5 @@
package de.danoeh.antennapod.core.service.playback; package de.danoeh.antennapod.core.service.playback;
import android.annotation.SuppressLint;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
@ -212,7 +211,6 @@ public class PlaybackService extends Service {
return ClientConfig.playbackServiceCallbacks.getPlayerActivityIntent(context, mt); return ClientConfig.playbackServiceCallbacks.getPlayerActivityIntent(context, mt);
} }
@SuppressLint("NewApi")
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
@ -223,8 +221,10 @@ public class PlaybackService extends Service {
Intent.ACTION_HEADSET_PLUG)); Intent.ACTION_HEADSET_PLUG));
registerReceiver(shutdownReceiver, new IntentFilter( registerReceiver(shutdownReceiver, new IntentFilter(
ACTION_SHUTDOWN_PLAYBACK_SERVICE)); ACTION_SHUTDOWN_PLAYBACK_SERVICE));
registerReceiver(bluetoothStateUpdated, new IntentFilter( if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)); registerReceiver(bluetoothStateUpdated, new IntentFilter(
BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED));
}
registerReceiver(audioBecomingNoisy, new IntentFilter( registerReceiver(audioBecomingNoisy, new IntentFilter(
AudioManager.ACTION_AUDIO_BECOMING_NOISY)); AudioManager.ACTION_AUDIO_BECOMING_NOISY));
registerReceiver(skipCurrentEpisodeReceiver, new IntentFilter( registerReceiver(skipCurrentEpisodeReceiver, new IntentFilter(
@ -238,7 +238,6 @@ public class PlaybackService extends Service {
} }
@SuppressLint("NewApi")
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
@ -249,7 +248,9 @@ public class PlaybackService extends Service {
unregisterReceiver(headsetDisconnected); unregisterReceiver(headsetDisconnected);
unregisterReceiver(shutdownReceiver); unregisterReceiver(shutdownReceiver);
unregisterReceiver(bluetoothStateUpdated); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
unregisterReceiver(bluetoothStateUpdated);
}
unregisterReceiver(audioBecomingNoisy); unregisterReceiver(audioBecomingNoisy);
unregisterReceiver(skipCurrentEpisodeReceiver); unregisterReceiver(skipCurrentEpisodeReceiver);
unregisterReceiver(pausePlayCurrentEpisodeReceiver); unregisterReceiver(pausePlayCurrentEpisodeReceiver);
@ -785,7 +786,6 @@ public class PlaybackService extends Service {
/** /**
* Prepares notification and starts the service in the foreground. * Prepares notification and starts the service in the foreground.
*/ */
@SuppressLint("NewApi")
private void setupNotification(final PlaybackServiceMediaPlayer.PSMPInfo info) { private void setupNotification(final PlaybackServiceMediaPlayer.PSMPInfo info) {
final PendingIntent pIntent = PendingIntent.getActivity(this, 0, final PendingIntent pIntent = PendingIntent.getActivity(this, 0,
PlaybackService.getPlayerActivityIntent(this), PlaybackService.getPlayerActivityIntent(this),
@ -836,42 +836,6 @@ public class PlaybackService extends Service {
String contentTitle = info.playable.getFeedTitle(); String contentTitle = info.playable.getFeedTitle();
Notification notification = null; Notification notification = null;
Intent pauseButtonIntent = new Intent( // pause button intent
PlaybackService.this, PlaybackService.class);
pauseButtonIntent.putExtra(
MediaButtonReceiver.EXTRA_KEYCODE,
KeyEvent.KEYCODE_MEDIA_PAUSE);
PendingIntent pauseButtonPendingIntent = PendingIntent
.getService(PlaybackService.this, 0,
pauseButtonIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Intent playButtonIntent = new Intent( // play button intent
PlaybackService.this, PlaybackService.class);
playButtonIntent.putExtra(
MediaButtonReceiver.EXTRA_KEYCODE,
KeyEvent.KEYCODE_MEDIA_PLAY);
PendingIntent playButtonPendingIntent = PendingIntent
.getService(PlaybackService.this, 1,
playButtonIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Intent stopButtonIntent = new Intent( // stop button intent
PlaybackService.this, PlaybackService.class);
stopButtonIntent.putExtra(
MediaButtonReceiver.EXTRA_KEYCODE,
KeyEvent.KEYCODE_MEDIA_STOP);
PendingIntent stopButtonPendingIntent = PendingIntent
.getService(PlaybackService.this, 2,
stopButtonIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Intent skipButtonIntent = new Intent(
PlaybackService.this, PlaybackService.class);
skipButtonIntent.putExtra(
MediaButtonReceiver.EXTRA_KEYCODE,
KeyEvent.KEYCODE_MEDIA_NEXT);
PendingIntent skipButtonPendingIntent = PendingIntent
.getService(PlaybackService.this, 3,
skipButtonIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder notificationBuilder = new android.support.v7.app.NotificationCompat.Builder( NotificationCompat.Builder notificationBuilder = new android.support.v7.app.NotificationCompat.Builder(
PlaybackService.this) PlaybackService.this)
.setContentTitle(contentTitle) .setContentTitle(contentTitle)
@ -882,28 +846,57 @@ public class PlaybackService extends Service {
.setSmallIcon(smallIcon) .setSmallIcon(smallIcon)
.setWhen(0) // we don't need the time .setWhen(0) // we don't need the time
.setPriority(UserPreferences.getNotifyPriority()); // set notification priority .setPriority(UserPreferences.getNotifyPriority()); // set notification priority
IntList actionList = new IntList(); IntList compactActionList = new IntList();
int numActions = 0; // we start and 0 and then increment by 1 for each call to addAction
// always let them rewind
PendingIntent rewindButtonPendingIntent = getPendingIntentForMediaAction(
KeyEvent.KEYCODE_MEDIA_REWIND, numActions);
notificationBuilder.addAction(android.R.drawable.ic_media_rew,
getString(R.string.rewind_label),
rewindButtonPendingIntent);
numActions++;
if (playerStatus == PlayerStatus.PLAYING) { if (playerStatus == PlayerStatus.PLAYING) {
PendingIntent pauseButtonPendingIntent = getPendingIntentForMediaAction(
KeyEvent.KEYCODE_MEDIA_PAUSE, numActions);
notificationBuilder.addAction(android.R.drawable.ic_media_pause, //pause action notificationBuilder.addAction(android.R.drawable.ic_media_pause, //pause action
getString(R.string.pause_label), getString(R.string.pause_label),
pauseButtonPendingIntent); pauseButtonPendingIntent);
actionList.add(actionList.size()); compactActionList.add(numActions++);
} else { } else {
PendingIntent playButtonPendingIntent = getPendingIntentForMediaAction(
KeyEvent.KEYCODE_MEDIA_PLAY, numActions);
notificationBuilder.addAction(android.R.drawable.ic_media_play, //play action notificationBuilder.addAction(android.R.drawable.ic_media_play, //play action
getString(R.string.play_label), getString(R.string.play_label),
playButtonPendingIntent); playButtonPendingIntent);
actionList.add(actionList.size()); compactActionList.add(numActions++);
} }
// ff follows play, then we have skip (if it's present)
PendingIntent ffButtonPendingIntent = getPendingIntentForMediaAction(
KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, numActions);
notificationBuilder.addAction(android.R.drawable.ic_media_ff,
getString(R.string.fast_forward_label),
ffButtonPendingIntent);
numActions++;
if (UserPreferences.isFollowQueue()) { if (UserPreferences.isFollowQueue()) {
PendingIntent skipButtonPendingIntent = getPendingIntentForMediaAction(
KeyEvent.KEYCODE_MEDIA_NEXT, numActions);
notificationBuilder.addAction(android.R.drawable.ic_media_next, notificationBuilder.addAction(android.R.drawable.ic_media_next,
getString(R.string.skip_episode_label), getString(R.string.skip_episode_label),
skipButtonPendingIntent); skipButtonPendingIntent);
actionList.add(actionList.size()); compactActionList.add(numActions++);
} }
PendingIntent stopButtonPendingIntent = getPendingIntentForMediaAction(
KeyEvent.KEYCODE_MEDIA_STOP, numActions);
notificationBuilder.setStyle(new android.support.v7.app.NotificationCompat.MediaStyle() notificationBuilder.setStyle(new android.support.v7.app.NotificationCompat.MediaStyle()
.setMediaSession(mediaPlayer.getSessionToken()) .setMediaSession(mediaPlayer.getSessionToken())
.setShowActionsInCompactView(actionList.toArray()) .setShowActionsInCompactView(compactActionList.toArray())
.setShowCancelButton(true) .setShowCancelButton(true)
.setCancelButtonIntent(stopButtonPendingIntent)) .setCancelButtonIntent(stopButtonPendingIntent))
.setVisibility(Notification.VISIBILITY_PUBLIC) .setVisibility(Notification.VISIBILITY_PUBLIC)
@ -928,6 +921,18 @@ public class PlaybackService extends Service {
notificationSetupThread.start(); notificationSetupThread.start();
} }
private PendingIntent getPendingIntentForMediaAction(int keycodeValue, int requestCode) {
Intent intent = new Intent(
PlaybackService.this, PlaybackService.class);
intent.putExtra(
MediaButtonReceiver.EXTRA_KEYCODE,
keycodeValue);
return PendingIntent
.getService(PlaybackService.this, requestCode,
intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
/** /**
* Persists the current position and last played time of the media file. * Persists the current position and last played time of the media file.
* *
@ -1007,7 +1012,7 @@ public class PlaybackService extends Service {
* Pauses playback when the headset is disconnected and the preference is * Pauses playback when the headset is disconnected and the preference is
* set * set
*/ */
private BroadcastReceiver headsetDisconnected = new BroadcastReceiver() { private final BroadcastReceiver headsetDisconnected = new BroadcastReceiver() {
private static final String TAG = "headsetDisconnected"; private static final String TAG = "headsetDisconnected";
private static final int UNPLUGGED = 0; private static final int UNPLUGGED = 0;
private static final int PLUGGED = 1; private static final int PLUGGED = 1;
@ -1032,20 +1037,22 @@ public class PlaybackService extends Service {
} }
}; };
private BroadcastReceiver bluetoothStateUpdated = new BroadcastReceiver() { private final BroadcastReceiver bluetoothStateUpdated = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (StringUtils.equals(intent.getAction(), BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)) { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1); if (StringUtils.equals(intent.getAction(), BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)) {
if (state == BluetoothA2dp.STATE_CONNECTED) { int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1);
Log.d(TAG, "Received bluetooth connection intent"); if (state == BluetoothA2dp.STATE_CONNECTED) {
unpauseIfPauseOnDisconnect(true); Log.d(TAG, "Received bluetooth connection intent");
unpauseIfPauseOnDisconnect(true);
}
} }
} }
} }
}; };
private BroadcastReceiver audioBecomingNoisy = new BroadcastReceiver() { private final BroadcastReceiver audioBecomingNoisy = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@ -1091,7 +1098,7 @@ public class PlaybackService extends Service {
} }
} }
private BroadcastReceiver shutdownReceiver = new BroadcastReceiver() { private final BroadcastReceiver shutdownReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@ -1102,7 +1109,7 @@ public class PlaybackService extends Service {
}; };
private BroadcastReceiver skipCurrentEpisodeReceiver = new BroadcastReceiver() { private final BroadcastReceiver skipCurrentEpisodeReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (StringUtils.equals(intent.getAction(), ACTION_SKIP_CURRENT_EPISODE)) { if (StringUtils.equals(intent.getAction(), ACTION_SKIP_CURRENT_EPISODE)) {
@ -1112,7 +1119,7 @@ public class PlaybackService extends Service {
} }
}; };
private BroadcastReceiver pauseResumeCurrentEpisodeReceiver = new BroadcastReceiver() { private final BroadcastReceiver pauseResumeCurrentEpisodeReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (StringUtils.equals(intent.getAction(), ACTION_RESUME_PLAY_CURRENT_EPISODE)) { if (StringUtils.equals(intent.getAction(), ACTION_RESUME_PLAY_CURRENT_EPISODE)) {
@ -1122,7 +1129,7 @@ public class PlaybackService extends Service {
} }
}; };
private BroadcastReceiver pausePlayCurrentEpisodeReceiver = new BroadcastReceiver() { private final BroadcastReceiver pausePlayCurrentEpisodeReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (StringUtils.equals(intent.getAction(), ACTION_PAUSE_PLAY_CURRENT_EPISODE)) { if (StringUtils.equals(intent.getAction(), ACTION_PAUSE_PLAY_CURRENT_EPISODE)) {