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