MediaSessionCompatApi14.java revision b5d44b772175e55013d16dc58a17eff30fcc3261
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 */
16package android.support.v4.media.session;
17
18import android.app.PendingIntent;
19import android.content.Context;
20import android.content.Intent;
21import android.graphics.Bitmap;
22import android.media.AudioManager;
23import android.media.MediaMetadataRetriever;
24import android.media.RemoteControlClient;
25import android.os.Bundle;
26import android.os.ResultReceiver;
27
28public class MediaSessionCompatApi14 {
29    /***** RemoteControlClient States, we only need none as the others were public *******/
30    final static int RCC_PLAYSTATE_NONE = 0;
31
32    /***** MediaSession States *******/
33    final static int STATE_NONE = 0;
34    final static int STATE_STOPPED = 1;
35    final static int STATE_PAUSED = 2;
36    final static int STATE_PLAYING = 3;
37    final static int STATE_FAST_FORWARDING = 4;
38    final static int STATE_REWINDING = 5;
39    final static int STATE_BUFFERING = 6;
40    final static int STATE_ERROR = 7;
41    final static int STATE_CONNECTING = 8;
42    final static int STATE_SKIPPING_TO_PREVIOUS = 9;
43    final static int STATE_SKIPPING_TO_NEXT = 10;
44
45    /***** PlaybackState actions *****/
46    private static final long ACTION_STOP = 1 << 0;
47    private static final long ACTION_PAUSE = 1 << 1;
48    private static final long ACTION_PLAY = 1 << 2;
49    private static final long ACTION_REWIND = 1 << 3;
50    private static final long ACTION_SKIP_TO_PREVIOUS = 1 << 4;
51    private static final long ACTION_SKIP_TO_NEXT = 1 << 5;
52    private static final long ACTION_FAST_FORWARD = 1 << 6;
53    private static final long ACTION_PLAY_PAUSE = 1 << 9;
54
55    /***** MediaMetadata keys ********/
56    private static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
57    private static final String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
58    private static final String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
59    private static final String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
60    private static final String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
61    private static final String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
62    private static final String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
63    private static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
64    private static final String METADATA_KEY_DATE = "android.media.metadata.DATE";
65    private static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
66    private static final String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
67    private static final String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
68    private static final String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
69    private static final String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
70    private static final String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
71
72    public static Object createRemoteControlClient(PendingIntent mbIntent) {
73        return new RemoteControlClient(mbIntent);
74    }
75
76    public static void setState(Object rccObj, int state) {
77        ((RemoteControlClient) rccObj).setPlaybackState(getRccStateFromState(state));
78    }
79
80    public static void setTransportControlFlags(Object rccObj, long actions) {
81        ((RemoteControlClient) rccObj).setTransportControlFlags(
82                getRccTransportControlFlagsFromActions(actions));
83    }
84
85    public static void setMetadata(Object rccObj, Bundle metadata) {
86        RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata(
87                true);
88        buildOldMetadata(metadata, editor);
89        editor.apply();
90    }
91
92    public static void registerRemoteControlClient(Context context, Object rccObj) {
93        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
94        am.registerRemoteControlClient((RemoteControlClient) rccObj);
95    }
96
97    public static void unregisterRemoteControlClient(Context context, Object rccObj) {
98        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
99        am.unregisterRemoteControlClient((RemoteControlClient) rccObj);
100    }
101
102    static int getRccStateFromState(int state) {
103        switch (state) {
104            case STATE_CONNECTING:
105            case STATE_BUFFERING:
106                return RemoteControlClient.PLAYSTATE_BUFFERING;
107            case STATE_ERROR:
108                return RemoteControlClient.PLAYSTATE_ERROR;
109            case STATE_FAST_FORWARDING:
110                return RemoteControlClient.PLAYSTATE_FAST_FORWARDING;
111            case STATE_NONE:
112                return RCC_PLAYSTATE_NONE;
113            case STATE_PAUSED:
114                return RemoteControlClient.PLAYSTATE_PAUSED;
115            case STATE_PLAYING:
116                return RemoteControlClient.PLAYSTATE_PLAYING;
117            case STATE_REWINDING:
118                return RemoteControlClient.PLAYSTATE_REWINDING;
119            case STATE_SKIPPING_TO_PREVIOUS:
120                return RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS;
121            case STATE_SKIPPING_TO_NEXT:
122                return RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS;
123            case STATE_STOPPED:
124                return RemoteControlClient.PLAYSTATE_STOPPED;
125            default:
126                return -1;
127        }
128    }
129
130    static int getRccTransportControlFlagsFromActions(long actions) {
131        int transportControlFlags = 0;
132        if ((actions & ACTION_STOP) != 0) {
133            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_STOP;
134        }
135        if ((actions & ACTION_PAUSE) != 0) {
136            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PAUSE;
137        }
138        if ((actions & ACTION_PLAY) != 0) {
139            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PLAY;
140        }
141        if ((actions & ACTION_REWIND) != 0) {
142            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_REWIND;
143        }
144        if ((actions & ACTION_SKIP_TO_PREVIOUS) != 0) {
145            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS;
146        }
147        if ((actions & ACTION_SKIP_TO_NEXT) != 0) {
148            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_NEXT;
149        }
150        if ((actions & ACTION_FAST_FORWARD) != 0) {
151            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD;
152        }
153        if ((actions & ACTION_PLAY_PAUSE) != 0) {
154            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE;
155        }
156        return transportControlFlags;
157    }
158
159    static void buildOldMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) {
160        if (metadata == null) {
161            return;
162        }
163        if (metadata.containsKey(METADATA_KEY_ALBUM)) {
164            editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM,
165                    metadata.getString(METADATA_KEY_ALBUM));
166        }
167        if (metadata.containsKey(METADATA_KEY_ALBUM_ARTIST)) {
168            editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST,
169                    metadata.getString(METADATA_KEY_ALBUM_ARTIST));
170        }
171        if (metadata.containsKey(METADATA_KEY_ARTIST)) {
172            editor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST,
173                    metadata.getString(METADATA_KEY_ARTIST));
174        }
175        if (metadata.containsKey(METADATA_KEY_AUTHOR)) {
176            editor.putString(MediaMetadataRetriever.METADATA_KEY_AUTHOR,
177                    metadata.getString(METADATA_KEY_AUTHOR));
178        }
179        if (metadata.containsKey(METADATA_KEY_COMPILATION)) {
180            editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPILATION,
181                    metadata.getString(METADATA_KEY_COMPILATION));
182        }
183        if (metadata.containsKey(METADATA_KEY_COMPOSER)) {
184            editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPOSER,
185                    metadata.getString(METADATA_KEY_COMPOSER));
186        }
187        if (metadata.containsKey(METADATA_KEY_DATE)) {
188            editor.putString(MediaMetadataRetriever.METADATA_KEY_DATE,
189                    metadata.getString(METADATA_KEY_DATE));
190        }
191        if (metadata.containsKey(METADATA_KEY_DISC_NUMBER)) {
192            editor.putLong(MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER,
193                    metadata.getLong(METADATA_KEY_DISC_NUMBER));
194        }
195        if (metadata.containsKey(METADATA_KEY_DURATION)) {
196            editor.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION,
197                    metadata.getLong(METADATA_KEY_DURATION));
198        }
199        if (metadata.containsKey(METADATA_KEY_GENRE)) {
200            editor.putString(MediaMetadataRetriever.METADATA_KEY_GENRE,
201                    metadata.getString(METADATA_KEY_GENRE));
202        }
203        if (metadata.containsKey(METADATA_KEY_NUM_TRACKS)) {
204            editor.putLong(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS,
205                    metadata.getLong(METADATA_KEY_NUM_TRACKS));
206        }
207        if (metadata.containsKey(METADATA_KEY_TITLE)) {
208            editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE,
209                    metadata.getString(METADATA_KEY_TITLE));
210        }
211        if (metadata.containsKey(METADATA_KEY_TRACK_NUMBER)) {
212            editor.putLong(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER,
213                    metadata.getLong(METADATA_KEY_TRACK_NUMBER));
214        }
215        if (metadata.containsKey(METADATA_KEY_WRITER)) {
216            editor.putString(MediaMetadataRetriever.METADATA_KEY_WRITER,
217                    metadata.getString(METADATA_KEY_WRITER));
218        }
219        if (metadata.containsKey(METADATA_KEY_YEAR)) {
220            editor.putString(MediaMetadataRetriever.METADATA_KEY_YEAR,
221                    metadata.getString(METADATA_KEY_YEAR));
222        }
223    }
224
225    public static interface Callback {
226        public void onCommand(String command, Bundle extras, ResultReceiver cb);
227
228        public boolean onMediaButtonEvent(Intent mediaButtonIntent);
229
230        public void onPlay();
231
232        public void onPause();
233
234        public void onSkipToNext();
235
236        public void onSkipToPrevious();
237
238        public void onFastForward();
239
240        public void onRewind();
241
242        public void onStop();
243
244        public void onSeekTo(long pos);
245
246        public void onSetRating(Object ratingObj);
247    }
248}
249