1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.support.v4.media.session; 18 19 import android.app.PendingIntent; 20 import android.content.Context; 21 import android.content.Intent; 22 import android.media.AudioAttributes; 23 import android.media.MediaDescription; 24 import android.media.MediaMetadata; 25 import android.media.Rating; 26 import android.media.VolumeProvider; 27 import android.media.session.MediaSession; 28 import android.media.session.PlaybackState; 29 import android.os.Bundle; 30 import android.os.Handler; 31 import android.os.Parcelable; 32 import android.os.ResultReceiver; 33 34 import java.util.ArrayList; 35 import java.util.List; 36 37 class MediaSessionCompatApi21 { createSession(Context context, String tag)38 public static Object createSession(Context context, String tag) { 39 return new MediaSession(context, tag); 40 } 41 verifySession(Object mediaSession)42 public static Object verifySession(Object mediaSession) { 43 if (mediaSession instanceof MediaSession) { 44 return mediaSession; 45 } 46 throw new IllegalArgumentException("mediaSession is not a valid MediaSession object"); 47 } 48 verifyToken(Object token)49 public static Object verifyToken(Object token) { 50 if (token instanceof MediaSession.Token) { 51 return token; 52 } 53 throw new IllegalArgumentException("token is not a valid MediaSession.Token object"); 54 } 55 createCallback(Callback callback)56 public static Object createCallback(Callback callback) { 57 return new CallbackProxy<Callback>(callback); 58 } 59 setCallback(Object sessionObj, Object callbackObj, Handler handler)60 public static void setCallback(Object sessionObj, Object callbackObj, Handler handler) { 61 ((MediaSession) sessionObj).setCallback((MediaSession.Callback) callbackObj, handler); 62 } 63 setFlags(Object sessionObj, int flags)64 public static void setFlags(Object sessionObj, int flags) { 65 ((MediaSession)sessionObj).setFlags(flags); 66 } 67 setPlaybackToLocal(Object sessionObj, int stream)68 public static void setPlaybackToLocal(Object sessionObj, int stream) { 69 // TODO update APIs to use support version of AudioAttributes 70 AudioAttributes.Builder bob = new AudioAttributes.Builder(); 71 bob.setLegacyStreamType(stream); 72 ((MediaSession) sessionObj).setPlaybackToLocal(bob.build()); 73 } 74 setPlaybackToRemote(Object sessionObj, Object volumeProviderObj)75 public static void setPlaybackToRemote(Object sessionObj, Object volumeProviderObj) { 76 ((MediaSession)sessionObj).setPlaybackToRemote((VolumeProvider)volumeProviderObj); 77 } 78 setActive(Object sessionObj, boolean active)79 public static void setActive(Object sessionObj, boolean active) { 80 ((MediaSession)sessionObj).setActive(active); 81 } 82 isActive(Object sessionObj)83 public static boolean isActive(Object sessionObj) { 84 return ((MediaSession)sessionObj).isActive(); 85 } 86 sendSessionEvent(Object sessionObj, String event, Bundle extras)87 public static void sendSessionEvent(Object sessionObj, String event, Bundle extras) { 88 ((MediaSession)sessionObj).sendSessionEvent(event, extras); 89 } 90 release(Object sessionObj)91 public static void release(Object sessionObj) { 92 ((MediaSession)sessionObj).release(); 93 } 94 getSessionToken(Object sessionObj)95 public static Parcelable getSessionToken(Object sessionObj) { 96 return ((MediaSession)sessionObj).getSessionToken(); 97 } 98 setPlaybackState(Object sessionObj, Object stateObj)99 public static void setPlaybackState(Object sessionObj, Object stateObj) { 100 ((MediaSession)sessionObj).setPlaybackState((PlaybackState)stateObj); 101 } 102 setMetadata(Object sessionObj, Object metadataObj)103 public static void setMetadata(Object sessionObj, Object metadataObj) { 104 ((MediaSession)sessionObj).setMetadata((MediaMetadata)metadataObj); 105 } 106 setSessionActivity(Object sessionObj, PendingIntent pi)107 public static void setSessionActivity(Object sessionObj, PendingIntent pi) { 108 ((MediaSession) sessionObj).setSessionActivity(pi); 109 } 110 setMediaButtonReceiver(Object sessionObj, PendingIntent pi)111 public static void setMediaButtonReceiver(Object sessionObj, PendingIntent pi) { 112 ((MediaSession) sessionObj).setMediaButtonReceiver(pi); 113 } 114 setQueue(Object sessionObj, List<Object> queueObjs)115 public static void setQueue(Object sessionObj, List<Object> queueObjs) { 116 if (queueObjs == null) { 117 ((MediaSession) sessionObj).setQueue(null); 118 return; 119 } 120 ArrayList<MediaSession.QueueItem> queue = new ArrayList<MediaSession.QueueItem>(); 121 for (Object itemObj : queueObjs) { 122 queue.add((MediaSession.QueueItem) itemObj); 123 } 124 ((MediaSession) sessionObj).setQueue(queue); 125 } 126 setQueueTitle(Object sessionObj, CharSequence title)127 public static void setQueueTitle(Object sessionObj, CharSequence title) { 128 ((MediaSession) sessionObj).setQueueTitle(title); 129 } 130 setExtras(Object sessionObj, Bundle extras)131 public static void setExtras(Object sessionObj, Bundle extras) { 132 ((MediaSession) sessionObj).setExtras(extras); 133 } 134 135 interface Callback extends MediaSessionCompatApi19.Callback { onCommand(String command, Bundle extras, ResultReceiver cb)136 public void onCommand(String command, Bundle extras, ResultReceiver cb); onMediaButtonEvent(Intent mediaButtonIntent)137 public boolean onMediaButtonEvent(Intent mediaButtonIntent); onPlay()138 public void onPlay(); onPlayFromMediaId(String mediaId, Bundle extras)139 public void onPlayFromMediaId(String mediaId, Bundle extras); onPlayFromSearch(String search, Bundle extras)140 public void onPlayFromSearch(String search, Bundle extras); onSkipToQueueItem(long id)141 public void onSkipToQueueItem(long id); onPause()142 public void onPause(); onSkipToNext()143 public void onSkipToNext(); onSkipToPrevious()144 public void onSkipToPrevious(); onFastForward()145 public void onFastForward(); onRewind()146 public void onRewind(); onStop()147 public void onStop(); onCustomAction(String action, Bundle extras)148 public void onCustomAction(String action, Bundle extras); 149 } 150 151 static class CallbackProxy<T extends Callback> extends MediaSession.Callback { 152 protected final T mCallback; 153 CallbackProxy(T callback)154 public CallbackProxy(T callback) { 155 mCallback = callback; 156 } 157 158 @Override onCommand(String command, Bundle args, ResultReceiver cb)159 public void onCommand(String command, Bundle args, ResultReceiver cb) { 160 mCallback.onCommand(command, args, cb); 161 } 162 163 @Override onMediaButtonEvent(Intent mediaButtonIntent)164 public boolean onMediaButtonEvent(Intent mediaButtonIntent) { 165 return mCallback.onMediaButtonEvent(mediaButtonIntent) 166 || super.onMediaButtonEvent(mediaButtonIntent); 167 } 168 169 @Override onPlay()170 public void onPlay() { 171 mCallback.onPlay(); 172 } 173 174 @Override onPlayFromMediaId(String mediaId, Bundle extras)175 public void onPlayFromMediaId(String mediaId, Bundle extras) { 176 mCallback.onPlayFromMediaId(mediaId, extras); 177 } 178 179 @Override onPlayFromSearch(String search, Bundle extras)180 public void onPlayFromSearch(String search, Bundle extras) { 181 mCallback.onPlayFromSearch(search, extras); 182 } 183 184 @Override onSkipToQueueItem(long id)185 public void onSkipToQueueItem(long id) { 186 mCallback.onSkipToQueueItem(id); 187 } 188 189 @Override onPause()190 public void onPause() { 191 mCallback.onPause(); 192 } 193 194 @Override onSkipToNext()195 public void onSkipToNext() { 196 mCallback.onSkipToNext(); 197 } 198 199 @Override onSkipToPrevious()200 public void onSkipToPrevious() { 201 mCallback.onSkipToPrevious(); 202 } 203 204 @Override onFastForward()205 public void onFastForward() { 206 mCallback.onFastForward(); 207 } 208 209 @Override onRewind()210 public void onRewind() { 211 mCallback.onRewind(); 212 } 213 214 @Override onStop()215 public void onStop() { 216 mCallback.onStop(); 217 } 218 219 @Override onSeekTo(long pos)220 public void onSeekTo(long pos) { 221 mCallback.onSeekTo(pos); 222 } 223 224 @Override onSetRating(Rating rating)225 public void onSetRating(Rating rating) { 226 mCallback.onSetRating(rating); 227 } 228 229 @Override onCustomAction(String action, Bundle extras)230 public void onCustomAction(String action, Bundle extras) { 231 mCallback.onCustomAction(action, extras); 232 } 233 } 234 235 static class QueueItem { 236 createItem(Object mediaDescription, long id)237 public static Object createItem(Object mediaDescription, long id) { 238 return new MediaSession.QueueItem((MediaDescription) mediaDescription, id); 239 } 240 getDescription(Object queueItem)241 public static Object getDescription(Object queueItem) { 242 return ((MediaSession.QueueItem) queueItem).getDescription(); 243 } 244 getQueueId(Object queueItem)245 public static long getQueueId(Object queueItem) { 246 return ((MediaSession.QueueItem) queueItem).getQueueId(); 247 } 248 } 249 } 250