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