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 17package android.support.v4.media.session; 18 19import android.app.PendingIntent; 20import android.content.Context; 21import android.content.Intent; 22import android.media.AudioAttributes; 23import android.media.MediaDescription; 24import android.media.MediaMetadata; 25import android.media.Rating; 26import android.media.VolumeProvider; 27import android.media.session.MediaSession; 28import android.media.session.PlaybackState; 29import android.os.Bundle; 30import android.os.Handler; 31import android.os.Parcelable; 32import android.os.ResultReceiver; 33 34import java.util.ArrayList; 35import java.util.List; 36 37class MediaSessionCompatApi21 { 38 public static Object createSession(Context context, String tag) { 39 return new MediaSession(context, tag); 40 } 41 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 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 56 public static Object createCallback(Callback callback) { 57 return new CallbackProxy<Callback>(callback); 58 } 59 60 public static void setCallback(Object sessionObj, Object callbackObj, Handler handler) { 61 ((MediaSession) sessionObj).setCallback((MediaSession.Callback) callbackObj, handler); 62 } 63 64 public static void setFlags(Object sessionObj, int flags) { 65 ((MediaSession)sessionObj).setFlags(flags); 66 } 67 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 75 public static void setPlaybackToRemote(Object sessionObj, Object volumeProviderObj) { 76 ((MediaSession)sessionObj).setPlaybackToRemote((VolumeProvider)volumeProviderObj); 77 } 78 79 public static void setActive(Object sessionObj, boolean active) { 80 ((MediaSession)sessionObj).setActive(active); 81 } 82 83 public static boolean isActive(Object sessionObj) { 84 return ((MediaSession)sessionObj).isActive(); 85 } 86 87 public static void sendSessionEvent(Object sessionObj, String event, Bundle extras) { 88 ((MediaSession)sessionObj).sendSessionEvent(event, extras); 89 } 90 91 public static void release(Object sessionObj) { 92 ((MediaSession)sessionObj).release(); 93 } 94 95 public static Parcelable getSessionToken(Object sessionObj) { 96 return ((MediaSession)sessionObj).getSessionToken(); 97 } 98 99 public static void setPlaybackState(Object sessionObj, Object stateObj) { 100 ((MediaSession)sessionObj).setPlaybackState((PlaybackState)stateObj); 101 } 102 103 public static void setMetadata(Object sessionObj, Object metadataObj) { 104 ((MediaSession)sessionObj).setMetadata((MediaMetadata)metadataObj); 105 } 106 107 public static void setSessionActivity(Object sessionObj, PendingIntent pi) { 108 ((MediaSession) sessionObj).setSessionActivity(pi); 109 } 110 111 public static void setMediaButtonReceiver(Object sessionObj, PendingIntent pi) { 112 ((MediaSession) sessionObj).setMediaButtonReceiver(pi); 113 } 114 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 127 public static void setQueueTitle(Object sessionObj, CharSequence title) { 128 ((MediaSession) sessionObj).setQueueTitle(title); 129 } 130 131 public static void setExtras(Object sessionObj, Bundle extras) { 132 ((MediaSession) sessionObj).setExtras(extras); 133 } 134 135 interface Callback extends MediaSessionCompatApi19.Callback { 136 public void onCommand(String command, Bundle extras, ResultReceiver cb); 137 public boolean onMediaButtonEvent(Intent mediaButtonIntent); 138 public void onPlay(); 139 public void onPlayFromMediaId(String mediaId, Bundle extras); 140 public void onPlayFromSearch(String search, Bundle extras); 141 public void onSkipToQueueItem(long id); 142 public void onPause(); 143 public void onSkipToNext(); 144 public void onSkipToPrevious(); 145 public void onFastForward(); 146 public void onRewind(); 147 public void onStop(); 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 154 public CallbackProxy(T callback) { 155 mCallback = callback; 156 } 157 158 @Override 159 public void onCommand(String command, Bundle args, ResultReceiver cb) { 160 mCallback.onCommand(command, args, cb); 161 } 162 163 @Override 164 public boolean onMediaButtonEvent(Intent mediaButtonIntent) { 165 return mCallback.onMediaButtonEvent(mediaButtonIntent) 166 || super.onMediaButtonEvent(mediaButtonIntent); 167 } 168 169 @Override 170 public void onPlay() { 171 mCallback.onPlay(); 172 } 173 174 @Override 175 public void onPlayFromMediaId(String mediaId, Bundle extras) { 176 mCallback.onPlayFromMediaId(mediaId, extras); 177 } 178 179 @Override 180 public void onPlayFromSearch(String search, Bundle extras) { 181 mCallback.onPlayFromSearch(search, extras); 182 } 183 184 @Override 185 public void onSkipToQueueItem(long id) { 186 mCallback.onSkipToQueueItem(id); 187 } 188 189 @Override 190 public void onPause() { 191 mCallback.onPause(); 192 } 193 194 @Override 195 public void onSkipToNext() { 196 mCallback.onSkipToNext(); 197 } 198 199 @Override 200 public void onSkipToPrevious() { 201 mCallback.onSkipToPrevious(); 202 } 203 204 @Override 205 public void onFastForward() { 206 mCallback.onFastForward(); 207 } 208 209 @Override 210 public void onRewind() { 211 mCallback.onRewind(); 212 } 213 214 @Override 215 public void onStop() { 216 mCallback.onStop(); 217 } 218 219 @Override 220 public void onSeekTo(long pos) { 221 mCallback.onSeekTo(pos); 222 } 223 224 @Override 225 public void onSetRating(Rating rating) { 226 mCallback.onSetRating(rating); 227 } 228 229 @Override 230 public void onCustomAction(String action, Bundle extras) { 231 mCallback.onCustomAction(action, extras); 232 } 233 } 234 235 static class QueueItem { 236 237 public static Object createItem(Object mediaDescription, long id) { 238 return new MediaSession.QueueItem((MediaDescription) mediaDescription, id); 239 } 240 241 public static Object getDescription(Object queueItem) { 242 return ((MediaSession.QueueItem) queueItem).getDescription(); 243 } 244 245 public static long getQueueId(Object queueItem) { 246 return ((MediaSession.QueueItem) queueItem).getQueueId(); 247 } 248 } 249} 250