145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerpackage com.android.onemedia; 245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.annotation.NonNull; 445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.annotation.Nullable; 545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.app.Notification; 645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.app.NotificationManager; 745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.app.PendingIntent; 845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.app.Service; 945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.content.BroadcastReceiver; 1045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.content.ComponentName; 1145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.content.Context; 1245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.content.Intent; 1345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.content.IntentFilter; 1445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.graphics.Bitmap; 153625bf72cb8bcf3c7f8f8cd8d708d7206824cc62RoboErikimport android.media.MediaDescription; 1645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.media.MediaMetadata; 1745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.media.session.MediaController; 1845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.media.session.MediaSession; 1945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.media.session.PlaybackState; 2045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.text.format.DateUtils; 2145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.util.Log; 2245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport android.util.SparseArray; 2345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 2445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerimport com.android.onemedia.playback.RequestUtils; 2545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 2645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler/** 2745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler * Keeps track of a notification and updates it automatically for a given 2845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler * MediaSession. 2945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler */ 3045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandlerpublic class NotificationHelper extends BroadcastReceiver { 3145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private static final String TAG = "NotificationHelper"; 3245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 3345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private static final int NOTIFICATION_ID = 433; // John Cage, 1952 3445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 3545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private final Service mService; 3645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private final MediaSession mSession; 3745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private final MediaController mController; 3845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private final MediaController.TransportControls mTransportControls; 3945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private final SparseArray<PendingIntent> mIntents = new SparseArray<PendingIntent>(); 4045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 4145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private PlaybackState mPlaybackState; 4245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private MediaMetadata mMetadata; 4345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 4445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private boolean mStarted = false; 4545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 4645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler public NotificationHelper(Service service, MediaSession session) { 4745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mService = service; 4845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mSession = session; 4945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mController = session.getController(); 5045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mTransportControls = mController.getTransportControls(); 5145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler String pkg = mService.getPackageName(); 5245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 5345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.put(R.drawable.ic_pause, PendingIntent.getBroadcast(mService, 100, new Intent( 5445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler com.android.onemedia.playback.RequestUtils.ACTION_PAUSE).setPackage(pkg), 5545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler PendingIntent.FLAG_CANCEL_CURRENT)); 5645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.put(R.drawable.ic_play_arrow, PendingIntent.getBroadcast(mService, 100, 5745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler new Intent(com.android.onemedia.playback.RequestUtils.ACTION_PLAY).setPackage(pkg), 5845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler PendingIntent.FLAG_CANCEL_CURRENT)); 5945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.put(R.drawable.ic_skip_previous, PendingIntent.getBroadcast(mService, 100, 6045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler new Intent(com.android.onemedia.playback.RequestUtils.ACTION_PREV).setPackage(pkg), 6145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler PendingIntent.FLAG_CANCEL_CURRENT)); 6245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.put(R.drawable.ic_skip_next, PendingIntent.getBroadcast(mService, 100, 6345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler new Intent(com.android.onemedia.playback.RequestUtils.ACTION_NEXT).setPackage(pkg), 6445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler PendingIntent.FLAG_CANCEL_CURRENT)); 6545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.put(R.drawable.ic_fast_rewind, PendingIntent.getBroadcast(mService, 100, 6645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler new Intent(com.android.onemedia.playback.RequestUtils.ACTION_REW).setPackage(pkg), 6745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler PendingIntent.FLAG_CANCEL_CURRENT)); 6845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.put(R.drawable.ic_fast_forward, PendingIntent.getBroadcast(mService, 100, 6945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler new Intent(com.android.onemedia.playback.RequestUtils.ACTION_FFWD).setPackage(pkg), 7045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler PendingIntent.FLAG_CANCEL_CURRENT)); 7145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 7245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 7345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler /** 7445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler * Posts the notification and starts tracking the session to keep it 7545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler * updated. The notification will automatically be removed if the session is 7645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler * destroyed before {@link #onStop} is called. 7745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler */ 7845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler public void onStart() { 7914f717a506a0d22facbec07386b06634e0c6a8eeRoboErik mController.registerCallback(mCb); 8045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler IntentFilter filter = new IntentFilter(); 8145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler filter.addAction(RequestUtils.ACTION_FFWD); 8245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler filter.addAction(RequestUtils.ACTION_NEXT); 8345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler filter.addAction(RequestUtils.ACTION_PAUSE); 8445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler filter.addAction(RequestUtils.ACTION_PLAY); 8545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler filter.addAction(RequestUtils.ACTION_PREV); 8645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler filter.addAction(RequestUtils.ACTION_REW); 8745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mService.registerReceiver(this, filter); 8845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 8945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mMetadata = mController.getMetadata(); 9045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mPlaybackState = mController.getPlaybackState(); 9145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 9245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mStarted = true; 9345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler // The notification must be updated after setting started to true 9445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler updateNotification(); 9545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 9645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 9745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler /** 9845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler * Removes the notification and stops tracking the session. If the session 9945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler * was destroyed this has no effect. 10045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler */ 10145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler public void onStop() { 10245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mStarted = false; 10314f717a506a0d22facbec07386b06634e0c6a8eeRoboErik mController.unregisterCallback(mCb); 10445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mService.unregisterReceiver(this); 10545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler updateNotification(); 10645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 10745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 10845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler @Override 10945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler public void onReceive(Context context, Intent intent) { 11045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler final String action = intent.getAction(); 11145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler Log.d(TAG, "Received intent with action " + action); 11245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler if (RequestUtils.ACTION_PAUSE.equals(action)) { 11345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mTransportControls.pause(); 11445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } else if (RequestUtils.ACTION_PLAY.equals(action)) { 11545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mTransportControls.play(); 11645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } else if (RequestUtils.ACTION_NEXT.equals(action)) { 11745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mTransportControls.skipToNext(); 11845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } else if (RequestUtils.ACTION_PREV.equals(action)) { 11945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mTransportControls.skipToPrevious(); 12045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } else if (RequestUtils.ACTION_REW.equals(action)) { 12145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mTransportControls.rewind(); 12245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } else if (RequestUtils.ACTION_FFWD.equals(action)) { 12345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mTransportControls.fastForward(); 12445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 12545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 12645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 12745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 12845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private final MediaController.Callback mCb = new MediaController.Callback() { 12945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler @Override 13045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler public void onPlaybackStateChanged(PlaybackState state) { 13145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mPlaybackState = state; 13245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler Log.d(TAG, "Received new playback state" + state); 13345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler updateNotification(); 13445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 13545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 13645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler @Override 13745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler public void onMetadataChanged(MediaMetadata metadata) { 13845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mMetadata = metadata; 13945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler Log.d(TAG, "Received new metadata " + metadata); 14045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler updateNotification(); 14145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 14245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler }; 14345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 14445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler NotificationManager mNoMan = null; 14545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 14645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler private void updateNotification() { 14745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler if (mNoMan == null) { 14845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mNoMan = (NotificationManager) mService.getSystemService(Context.NOTIFICATION_SERVICE); 14945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 15045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler if (mPlaybackState == null) { 15145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mNoMan.cancel(NOTIFICATION_ID); 15245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler return; 15345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 15445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler if (!mStarted) { 15545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mNoMan.cancel(NOTIFICATION_ID); 15645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler return; 15745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 15845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 15945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler String status; 16045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler final int state = mPlaybackState.getState(); 16145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler switch (state) { 16245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler case PlaybackState.STATE_PLAYING: 16345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler status = "PLAYING: "; 16445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler break; 16545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler case PlaybackState.STATE_PAUSED: 16645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler status = "PAUSED: "; 16745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler break; 16845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler case PlaybackState.STATE_STOPPED: 16945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler status = "STOPPED: "; 17045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler break; 17145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler case PlaybackState.STATE_ERROR: 17245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler status = "ERROR: "; 17345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler break; 17445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler case PlaybackState.STATE_BUFFERING: 17545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler status = "BUFFERING: "; 17645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler break; 17745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler case PlaybackState.STATE_NONE: 17845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler default: 17945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler status = ""; 18045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler break; 18145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 18245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler CharSequence title, text; 18345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler Bitmap art; 18445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler if (mMetadata == null) { 18545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler title = status; 18645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler text = "Empty metadata!"; 18745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler art = null; 18845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } else { 1893625bf72cb8bcf3c7f8f8cd8d708d7206824cc62RoboErik MediaDescription description = mMetadata.getDescription(); 19045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler title = description.getTitle(); 19145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler text = description.getSubtitle(); 1923625bf72cb8bcf3c7f8f8cd8d708d7206824cc62RoboErik art = description.getIconBitmap(); 19345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 19445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 19545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler String playPauseLabel = ""; 19645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler int playPauseIcon; 19745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler if (state == PlaybackState.STATE_PLAYING) { 19845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler playPauseLabel = "Pause"; 19945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler playPauseIcon = R.drawable.ic_pause; 20045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } else { 20145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler playPauseLabel = "Play"; 20245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler playPauseIcon = R.drawable.ic_play_arrow; 20345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 20445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 20545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler final long pos = mPlaybackState.getPosition(); 20645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler final long end = mMetadata == null ? 0 : mMetadata 20745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .getLong(MediaMetadata.METADATA_KEY_DURATION); 20845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler Notification notification = new Notification.Builder(mService) 20945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setSmallIcon(android.R.drawable.stat_notify_chat) 21045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setContentTitle(title) 21145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setContentText(text) 21245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setShowWhen(false) 21345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setContentInfo(DateUtils.formatElapsedTime(pos)) 21445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setProgress((int) end, (int) pos, false) 21545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setLargeIcon(art) 21645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .addAction(R.drawable.ic_skip_previous, "Previous", 21745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.get(R.drawable.ic_skip_previous)) 21845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .addAction(R.drawable.ic_fast_rewind, "Rewind", 21945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.get(R.drawable.ic_fast_rewind)) 22045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .addAction(playPauseIcon, playPauseLabel, 22145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.get(playPauseIcon)) 22245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .addAction(R.drawable.ic_fast_forward, "Fast Forward", 22345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.get(R.drawable.ic_fast_forward)) 22445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .addAction(R.drawable.ic_skip_next, "Next", 22545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mIntents.get(R.drawable.ic_skip_next)) 22645f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setStyle(new Notification.MediaStyle() 22745f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setShowActionsInCompactView(2) 22845f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setMediaSession(mSession.getSessionToken())) 22945f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .setColor(0xFFDB4437) 23045f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler .build(); 23145f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 23245f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler mService.startForeground(NOTIFICATION_ID, notification); 23345f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler } 23445f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler 23545f7ee8201efbda59b57b1fe637a1b9ffef25bb6Daniel Sandler} 236