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