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    /***** MediaMetadata keys ********/
46    private static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
47    private static final String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
48    private static final String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
49    private static final String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
50    private static final String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
51    private static final String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
52    private static final String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
53    private static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
54    private static final String METADATA_KEY_DATE = "android.media.metadata.DATE";
55    private static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
56    private static final String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
57    private static final String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
58    private static final String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
59    private static final String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
60    private static final String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
61
62    public static Object createRemoteControlClient(PendingIntent mbIntent) {
63        return new RemoteControlClient(mbIntent);
64    }
65
66    public static void setState(Object rccObj, int state) {
67        ((RemoteControlClient) rccObj).setPlaybackState(getRccStateFromState(state));
68    }
69
70    public static void setMetadata(Object rccObj, Bundle metadata) {
71        RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata(
72                true);
73        buildOldMetadata(metadata, editor);
74        editor.apply();
75    }
76
77    public static void registerRemoteControlClient(Context context, Object rccObj) {
78        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
79        am.registerRemoteControlClient((RemoteControlClient) rccObj);
80    }
81
82    public static void unregisterRemoteControlClient(Context context, Object rccObj) {
83        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
84        am.unregisterRemoteControlClient((RemoteControlClient) rccObj);
85    }
86
87    static int getRccStateFromState(int state) {
88        switch (state) {
89            case STATE_CONNECTING:
90            case STATE_BUFFERING:
91                return RemoteControlClient.PLAYSTATE_BUFFERING;
92            case STATE_ERROR:
93                return RemoteControlClient.PLAYSTATE_ERROR;
94            case STATE_FAST_FORWARDING:
95                return RemoteControlClient.PLAYSTATE_FAST_FORWARDING;
96            case STATE_NONE:
97                return RCC_PLAYSTATE_NONE;
98            case STATE_PAUSED:
99                return RemoteControlClient.PLAYSTATE_PAUSED;
100            case STATE_PLAYING:
101                return RemoteControlClient.PLAYSTATE_PLAYING;
102            case STATE_REWINDING:
103                return RemoteControlClient.PLAYSTATE_REWINDING;
104            case STATE_SKIPPING_TO_PREVIOUS:
105                return RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS;
106            case STATE_SKIPPING_TO_NEXT:
107                return RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS;
108            case STATE_STOPPED:
109                return RemoteControlClient.PLAYSTATE_STOPPED;
110            default:
111                return -1;
112        }
113    }
114
115    static void buildOldMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) {
116        if (metadata.containsKey(METADATA_KEY_ALBUM)) {
117            editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM,
118                    metadata.getString(METADATA_KEY_ALBUM));
119        }
120        if (metadata.containsKey(METADATA_KEY_ALBUM_ARTIST)) {
121            editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST,
122                    metadata.getString(METADATA_KEY_ALBUM_ARTIST));
123        }
124        if (metadata.containsKey(METADATA_KEY_ARTIST)) {
125            editor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST,
126                    metadata.getString(METADATA_KEY_ARTIST));
127        }
128        if (metadata.containsKey(METADATA_KEY_AUTHOR)) {
129            editor.putString(MediaMetadataRetriever.METADATA_KEY_AUTHOR,
130                    metadata.getString(METADATA_KEY_AUTHOR));
131        }
132        if (metadata.containsKey(METADATA_KEY_COMPILATION)) {
133            editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPILATION,
134                    metadata.getString(METADATA_KEY_COMPILATION));
135        }
136        if (metadata.containsKey(METADATA_KEY_COMPOSER)) {
137            editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPOSER,
138                    metadata.getString(METADATA_KEY_COMPOSER));
139        }
140        if (metadata.containsKey(METADATA_KEY_DATE)) {
141            editor.putString(MediaMetadataRetriever.METADATA_KEY_DATE,
142                    metadata.getString(METADATA_KEY_DATE));
143        }
144        if (metadata.containsKey(METADATA_KEY_DISC_NUMBER)) {
145            editor.putLong(MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER,
146                    metadata.getLong(METADATA_KEY_DISC_NUMBER));
147        }
148        if (metadata.containsKey(METADATA_KEY_DURATION)) {
149            editor.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION,
150                    metadata.getLong(METADATA_KEY_DURATION));
151        }
152        if (metadata.containsKey(METADATA_KEY_GENRE)) {
153            editor.putString(MediaMetadataRetriever.METADATA_KEY_GENRE,
154                    metadata.getString(METADATA_KEY_GENRE));
155        }
156        if (metadata.containsKey(METADATA_KEY_NUM_TRACKS)) {
157            editor.putLong(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS,
158                    metadata.getLong(METADATA_KEY_NUM_TRACKS));
159        }
160        if (metadata.containsKey(METADATA_KEY_TITLE)) {
161            editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE,
162                    metadata.getString(METADATA_KEY_TITLE));
163        }
164        if (metadata.containsKey(METADATA_KEY_TRACK_NUMBER)) {
165            editor.putLong(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER,
166                    metadata.getLong(METADATA_KEY_TRACK_NUMBER));
167        }
168        if (metadata.containsKey(METADATA_KEY_WRITER)) {
169            editor.putString(MediaMetadataRetriever.METADATA_KEY_WRITER,
170                    metadata.getString(METADATA_KEY_WRITER));
171        }
172        if (metadata.containsKey(METADATA_KEY_YEAR)) {
173            editor.putString(MediaMetadataRetriever.METADATA_KEY_YEAR,
174                    metadata.getString(METADATA_KEY_YEAR));
175        }
176    }
177
178    public static interface Callback {
179        public void onCommand(String command, Bundle extras, ResultReceiver cb);
180
181        public boolean onMediaButtonEvent(Intent mediaButtonIntent);
182
183        public void onPlay();
184
185        public void onPause();
186
187        public void onSkipToNext();
188
189        public void onSkipToPrevious();
190
191        public void onFastForward();
192
193        public void onRewind();
194
195        public void onStop();
196
197        public void onSeekTo(long pos);
198
199        public void onSetRating(Object ratingObj);
200    }
201}