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