124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown/*
224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Copyright (C) 2014 The Android Open Source Project
324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *
424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * you may not use this file except in compliance with the License.
624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * You may obtain a copy of the License at
724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *
824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *
1024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Unless required by applicable law or agreed to in writing, software
1124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * See the License for the specific language governing permissions and
1424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * limitations under the License.
1524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown */
1624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
1724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownpackage android.support.v4.media.session;
1824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
1985d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErikimport android.app.PendingIntent;
2024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.content.Context;
2124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.content.Intent;
221435afe32073dee10e721dfb6122ce6a194a6412RoboErikimport android.media.AudioAttributes;
23ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikimport android.media.MediaDescription;
2424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.media.MediaMetadata;
2524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.media.Rating;
2624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.media.VolumeProvider;
2724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.media.session.MediaSession;
2824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.media.session.PlaybackState;
2924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Bundle;
3024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Handler;
3124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Parcelable;
3224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.ResultReceiver;
3324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
34ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikimport java.util.ArrayList;
35ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikimport java.util.List;
36ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
3724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownclass MediaSessionCompatApi21 {
3824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static Object createSession(Context context, String tag) {
39f87e8513ce55303168acd9c698acd5bbd33b9badRoboErik        return new MediaSession(context, tag);
4024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
4124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
42bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik    public static Object verifySession(Object mediaSession) {
43bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik        if (mediaSession instanceof MediaSession) {
44bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik            return mediaSession;
45bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik        }
46bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik        throw new IllegalArgumentException("mediaSession is not a valid MediaSession object");
47bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik    }
48bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik
49ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik    public static Object verifyToken(Object token) {
50ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik        if (token instanceof MediaSession.Token) {
51ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik            return token;
52ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik        }
53ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik        throw new IllegalArgumentException("token is not a valid MediaSession.Token object");
54ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik    }
55ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik
5624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static Object createCallback(Callback callback) {
5724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return new CallbackProxy<Callback>(callback);
5824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
5924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
608af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    public static void setCallback(Object sessionObj, Object callbackObj, Handler handler) {
618af0092e2d7409e79779af396d63ca4146f1fb21RoboErik        ((MediaSession) sessionObj).setCallback((MediaSession.Callback) callbackObj, handler);
6224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
6324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
6424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static void setFlags(Object sessionObj, int flags) {
6524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        ((MediaSession)sessionObj).setFlags(flags);
6624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
6724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
6824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static void setPlaybackToLocal(Object sessionObj, int stream) {
691435afe32073dee10e721dfb6122ce6a194a6412RoboErik        // TODO update APIs to use support version of AudioAttributes
701435afe32073dee10e721dfb6122ce6a194a6412RoboErik        AudioAttributes.Builder bob = new AudioAttributes.Builder();
711435afe32073dee10e721dfb6122ce6a194a6412RoboErik        bob.setLegacyStreamType(stream);
721435afe32073dee10e721dfb6122ce6a194a6412RoboErik        ((MediaSession) sessionObj).setPlaybackToLocal(bob.build());
7324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
7424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
7524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static void setPlaybackToRemote(Object sessionObj, Object volumeProviderObj) {
7624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        ((MediaSession)sessionObj).setPlaybackToRemote((VolumeProvider)volumeProviderObj);
7724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
7824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
7924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static void setActive(Object sessionObj, boolean active) {
8024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        ((MediaSession)sessionObj).setActive(active);
8124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
8224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
8324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static boolean isActive(Object sessionObj) {
8424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return ((MediaSession)sessionObj).isActive();
8524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
8624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
8724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static void sendSessionEvent(Object sessionObj, String event, Bundle extras) {
8824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        ((MediaSession)sessionObj).sendSessionEvent(event, extras);
8924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
9024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static void release(Object sessionObj) {
9224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        ((MediaSession)sessionObj).release();
9324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
9424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static Parcelable getSessionToken(Object sessionObj) {
9624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return ((MediaSession)sessionObj).getSessionToken();
9724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
9824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static void setPlaybackState(Object sessionObj, Object stateObj) {
10024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        ((MediaSession)sessionObj).setPlaybackState((PlaybackState)stateObj);
10124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
10224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
10324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static void setMetadata(Object sessionObj, Object metadataObj) {
10424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        ((MediaSession)sessionObj).setMetadata((MediaMetadata)metadataObj);
10524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
10624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
10785d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik    public static void setSessionActivity(Object sessionObj, PendingIntent pi) {
10885d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik        ((MediaSession) sessionObj).setSessionActivity(pi);
10985d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik    }
11085d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik
111ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    public static void setMediaButtonReceiver(Object sessionObj, PendingIntent pi) {
112ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        ((MediaSession) sessionObj).setMediaButtonReceiver(pi);
113ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    }
114ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
115ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    public static void setQueue(Object sessionObj, List<Object> queueObjs) {
116ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        if (queueObjs == null) {
117ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik            ((MediaSession) sessionObj).setQueue(null);
118ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik            return;
119ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        }
120ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        ArrayList<MediaSession.QueueItem> queue = new ArrayList<MediaSession.QueueItem>();
121ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        for (Object itemObj : queueObjs) {
122ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik            queue.add((MediaSession.QueueItem) itemObj);
123ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        }
124ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        ((MediaSession) sessionObj).setQueue(queue);
125ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    }
126ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
127ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    public static void setQueueTitle(Object sessionObj, CharSequence title) {
128ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        ((MediaSession) sessionObj).setQueueTitle(title);
129ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    }
130ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
131ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    public static void setExtras(Object sessionObj, Bundle extras) {
132ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        ((MediaSession) sessionObj).setExtras(extras);
133ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    }
134ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
13524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static interface Callback {
136b530c89bba371d2d575f10480b2e90914b0d3f3fGabriel Peal        public void onCommand(String command, Bundle extras, ResultReceiver cb);
1378af0092e2d7409e79779af396d63ca4146f1fb21RoboErik        public boolean onMediaButtonEvent(Intent mediaButtonIntent);
13824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onPlay();
139e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        public void onPlayFromMediaId(String mediaId, Bundle extras);
140e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        public void onPlayFromSearch(String search, Bundle extras);
141e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        public void onSkipToQueueItem(long id);
14224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onPause();
14324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onSkipToNext();
14424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onSkipToPrevious();
14524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onFastForward();
14624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onRewind();
14724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onStop();
14824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onSeekTo(long pos);
14924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onSetRating(Object ratingObj);
150e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        public void onCustomAction(String action, Bundle extras);
15124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
15224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
15324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    static class CallbackProxy<T extends Callback> extends MediaSession.Callback {
15424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        protected final T mCallback;
15524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
15624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public CallbackProxy(T callback) {
15724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback = callback;
15824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
15924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
16024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
161b530c89bba371d2d575f10480b2e90914b0d3f3fGabriel Peal        public void onCommand(String command, Bundle args, ResultReceiver cb) {
162b530c89bba371d2d575f10480b2e90914b0d3f3fGabriel Peal            mCallback.onCommand(command, args, cb);
16324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
16424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
1658af0092e2d7409e79779af396d63ca4146f1fb21RoboErik        @Override
1668af0092e2d7409e79779af396d63ca4146f1fb21RoboErik        public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
167944a4e92d6d9619fa1a2172a4ec9dc683eb65b40Ian Lake            return mCallback.onMediaButtonEvent(mediaButtonIntent)
168944a4e92d6d9619fa1a2172a4ec9dc683eb65b40Ian Lake                    || super.onMediaButtonEvent(mediaButtonIntent);
16924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
17024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
17124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
17224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onPlay() {
17324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback.onPlay();
17424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
17524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
17624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
17726d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        public void onPlayFromMediaId(String mediaId, Bundle extras) {
17826d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake            mCallback.onPlayFromMediaId(mediaId, extras);
17926d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        }
18026d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake
18126d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        @Override
18226d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        public void onPlayFromSearch(String search, Bundle extras) {
18326d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake            mCallback.onPlayFromSearch(search, extras);
18426d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        }
18526d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake
18626d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        @Override
18726d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        public void onSkipToQueueItem(long id) {
18826d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake            mCallback.onSkipToQueueItem(id);
18926d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        }
19026d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake
19126d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        @Override
19224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onPause() {
19324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback.onPause();
19424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
19524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
19624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
19724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onSkipToNext() {
19824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback.onSkipToNext();
19924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
20024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
20124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
20224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onSkipToPrevious() {
20324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback.onSkipToPrevious();
20424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
20524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
20624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
20724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onFastForward() {
20824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback.onFastForward();
20924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
21024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
21124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
21224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onRewind() {
21324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback.onRewind();
21424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
21524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
21624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
21724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onStop() {
21824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback.onStop();
21924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
22024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
22124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
22224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onSeekTo(long pos) {
22324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback.onSeekTo(pos);
22424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
22524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
22624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
22724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public void onSetRating(Rating rating) {
22824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            mCallback.onSetRating(rating);
22924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
23026d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake
23126d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        @Override
23226d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        public void onCustomAction(String action, Bundle extras) {
23326d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake            mCallback.onCustomAction(action, extras);
23426d994357fa4dbcd813f1c066ce09d5fdaa301a9Ian Lake        }
23524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
236ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
237ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    static class QueueItem {
238ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
239ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        public static Object createItem(Object mediaDescription, long id) {
240ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik            return new MediaSession.QueueItem((MediaDescription) mediaDescription, id);
241ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        }
242ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
243ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        public static Object getDescription(Object queueItem) {
244ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik            return ((MediaSession.QueueItem) queueItem).getDescription();
245ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        }
246ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
247ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        public static long getQueueId(Object queueItem) {
248ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik            return ((MediaSession.QueueItem) queueItem).getQueueId();
249ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        }
250ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    }
25124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
252