MediaSessionCompatApi14.java revision 55642c06219b6c5c41cd97a389797131d00cb595
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 setTransportControlFlags(Object rccObj, int actions) { 71 ((RemoteControlClient) rccObj).setTransportControlFlags( 72 getRccTransportControlFlagsFromActions(actions)); 73 } 74 75 public static void setMetadata(Object rccObj, Bundle metadata) { 76 RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata( 77 true); 78 buildOldMetadata(metadata, editor); 79 editor.apply(); 80 } 81 82 public static void registerRemoteControlClient(Context context, Object rccObj) { 83 AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 84 am.registerRemoteControlClient((RemoteControlClient) rccObj); 85 } 86 87 public static void unregisterRemoteControlClient(Context context, Object rccObj) { 88 AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 89 am.unregisterRemoteControlClient((RemoteControlClient) rccObj); 90 } 91 92 static int getRccStateFromState(int state) { 93 switch (state) { 94 case STATE_CONNECTING: 95 case STATE_BUFFERING: 96 return RemoteControlClient.PLAYSTATE_BUFFERING; 97 case STATE_ERROR: 98 return RemoteControlClient.PLAYSTATE_ERROR; 99 case STATE_FAST_FORWARDING: 100 return RemoteControlClient.PLAYSTATE_FAST_FORWARDING; 101 case STATE_NONE: 102 return RCC_PLAYSTATE_NONE; 103 case STATE_PAUSED: 104 return RemoteControlClient.PLAYSTATE_PAUSED; 105 case STATE_PLAYING: 106 return RemoteControlClient.PLAYSTATE_PLAYING; 107 case STATE_REWINDING: 108 return RemoteControlClient.PLAYSTATE_REWINDING; 109 case STATE_SKIPPING_TO_PREVIOUS: 110 return RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS; 111 case STATE_SKIPPING_TO_NEXT: 112 return RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS; 113 case STATE_STOPPED: 114 return RemoteControlClient.PLAYSTATE_STOPPED; 115 default: 116 return -1; 117 } 118 } 119 120 static int getRccTransportControlFlagsFromActions(int actions) { 121 int transportControlFlags = 0; 122 if ((actions & PlaybackStateCompat.ACTION_FAST_FORWARD) != 0) { 123 transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD; 124 } 125 if ((actions & PlaybackStateCompat.ACTION_SKIP_TO_NEXT) != 0) { 126 transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_NEXT; 127 } 128 if ((actions & PlaybackStateCompat.ACTION_PAUSE) != 0) { 129 transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PAUSE; 130 } 131 if ((actions & PlaybackStateCompat.ACTION_PLAY) != 0) { 132 transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PLAY; 133 } 134 if ((actions & PlaybackStateCompat.ACTION_PLAY_PAUSE) != 0) { 135 transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE; 136 } 137 if ((actions & PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) != 0) { 138 transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS; 139 } 140 if ((actions & PlaybackStateCompat.ACTION_REWIND) != 0) { 141 transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_REWIND; 142 } 143 if ((actions & PlaybackStateCompat.ACTION_STOP) != 0) { 144 transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_STOP; 145 } 146 return transportControlFlags; 147 } 148 149 static void buildOldMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) { 150 if (metadata.containsKey(METADATA_KEY_ALBUM)) { 151 editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, 152 metadata.getString(METADATA_KEY_ALBUM)); 153 } 154 if (metadata.containsKey(METADATA_KEY_ALBUM_ARTIST)) { 155 editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST, 156 metadata.getString(METADATA_KEY_ALBUM_ARTIST)); 157 } 158 if (metadata.containsKey(METADATA_KEY_ARTIST)) { 159 editor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, 160 metadata.getString(METADATA_KEY_ARTIST)); 161 } 162 if (metadata.containsKey(METADATA_KEY_AUTHOR)) { 163 editor.putString(MediaMetadataRetriever.METADATA_KEY_AUTHOR, 164 metadata.getString(METADATA_KEY_AUTHOR)); 165 } 166 if (metadata.containsKey(METADATA_KEY_COMPILATION)) { 167 editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPILATION, 168 metadata.getString(METADATA_KEY_COMPILATION)); 169 } 170 if (metadata.containsKey(METADATA_KEY_COMPOSER)) { 171 editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPOSER, 172 metadata.getString(METADATA_KEY_COMPOSER)); 173 } 174 if (metadata.containsKey(METADATA_KEY_DATE)) { 175 editor.putString(MediaMetadataRetriever.METADATA_KEY_DATE, 176 metadata.getString(METADATA_KEY_DATE)); 177 } 178 if (metadata.containsKey(METADATA_KEY_DISC_NUMBER)) { 179 editor.putLong(MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER, 180 metadata.getLong(METADATA_KEY_DISC_NUMBER)); 181 } 182 if (metadata.containsKey(METADATA_KEY_DURATION)) { 183 editor.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, 184 metadata.getLong(METADATA_KEY_DURATION)); 185 } 186 if (metadata.containsKey(METADATA_KEY_GENRE)) { 187 editor.putString(MediaMetadataRetriever.METADATA_KEY_GENRE, 188 metadata.getString(METADATA_KEY_GENRE)); 189 } 190 if (metadata.containsKey(METADATA_KEY_NUM_TRACKS)) { 191 editor.putLong(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS, 192 metadata.getLong(METADATA_KEY_NUM_TRACKS)); 193 } 194 if (metadata.containsKey(METADATA_KEY_TITLE)) { 195 editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, 196 metadata.getString(METADATA_KEY_TITLE)); 197 } 198 if (metadata.containsKey(METADATA_KEY_TRACK_NUMBER)) { 199 editor.putLong(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER, 200 metadata.getLong(METADATA_KEY_TRACK_NUMBER)); 201 } 202 if (metadata.containsKey(METADATA_KEY_WRITER)) { 203 editor.putString(MediaMetadataRetriever.METADATA_KEY_WRITER, 204 metadata.getString(METADATA_KEY_WRITER)); 205 } 206 if (metadata.containsKey(METADATA_KEY_YEAR)) { 207 editor.putString(MediaMetadataRetriever.METADATA_KEY_YEAR, 208 metadata.getString(METADATA_KEY_YEAR)); 209 } 210 } 211 212 public static interface Callback { 213 public void onCommand(String command, Bundle extras, ResultReceiver cb); 214 215 public boolean onMediaButtonEvent(Intent mediaButtonIntent); 216 217 public void onPlay(); 218 219 public void onPause(); 220 221 public void onSkipToNext(); 222 223 public void onSkipToPrevious(); 224 225 public void onFastForward(); 226 227 public void onRewind(); 228 229 public void onStop(); 230 231 public void onSeekTo(long pos); 232 233 public void onSetRating(Object ratingObj); 234 } 235} 236