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 public static interface 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 onSeekTo(long pos); 149 public void onSetRating(Object ratingObj); 150 public void onCustomAction(String action, Bundle extras); 151 } 152 153 static class CallbackProxy<T extends Callback> extends MediaSession.Callback { 154 protected final T mCallback; 155 156 public CallbackProxy(T callback) { 157 mCallback = callback; 158 } 159 160 @Override 161 public void onCommand(String command, Bundle args, ResultReceiver cb) { 162 mCallback.onCommand(command, args, cb); 163 } 164 165 @Override 166 public boolean onMediaButtonEvent(Intent mediaButtonIntent) { 167 return mCallback.onMediaButtonEvent(mediaButtonIntent); 168 } 169 170 @Override 171 public void onPlay() { 172 mCallback.onPlay(); 173 } 174 175 @Override 176 public void onPause() { 177 mCallback.onPause(); 178 } 179 180 @Override 181 public void onSkipToNext() { 182 mCallback.onSkipToNext(); 183 } 184 185 @Override 186 public void onSkipToPrevious() { 187 mCallback.onSkipToPrevious(); 188 } 189 190 @Override 191 public void onFastForward() { 192 mCallback.onFastForward(); 193 } 194 195 @Override 196 public void onRewind() { 197 mCallback.onRewind(); 198 } 199 200 @Override 201 public void onStop() { 202 mCallback.onStop(); 203 } 204 205 @Override 206 public void onSeekTo(long pos) { 207 mCallback.onSeekTo(pos); 208 } 209 210 @Override 211 public void onSetRating(Rating rating) { 212 mCallback.onSetRating(rating); 213 } 214 } 215 216 static class QueueItem { 217 218 public static Object createItem(Object mediaDescription, long id) { 219 return new MediaSession.QueueItem((MediaDescription) mediaDescription, id); 220 } 221 222 public static Object getDescription(Object queueItem) { 223 return ((MediaSession.QueueItem) queueItem).getDescription(); 224 } 225 226 public static long getQueueId(Object queueItem) { 227 return ((MediaSession.QueueItem) queueItem).getQueueId(); 228 } 229 } 230} 231