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}