15c9469e010106467791b47b0fa83efda84491a21RoboErik/* 25c9469e010106467791b47b0fa83efda84491a21RoboErik * Copyright (C) 2014 The Android Open Source Project 35c9469e010106467791b47b0fa83efda84491a21RoboErik * 45c9469e010106467791b47b0fa83efda84491a21RoboErik * Licensed under the Apache License, Version 2.0 (the "License"); 55c9469e010106467791b47b0fa83efda84491a21RoboErik * you may not use this file except in compliance with the License. 65c9469e010106467791b47b0fa83efda84491a21RoboErik * You may obtain a copy of the License at 75c9469e010106467791b47b0fa83efda84491a21RoboErik * 85c9469e010106467791b47b0fa83efda84491a21RoboErik * http://www.apache.org/licenses/LICENSE-2.0 95c9469e010106467791b47b0fa83efda84491a21RoboErik * 105c9469e010106467791b47b0fa83efda84491a21RoboErik * Unless required by applicable law or agreed to in writing, software 115c9469e010106467791b47b0fa83efda84491a21RoboErik * distributed under the License is distributed on an "AS IS" BASIS, 125c9469e010106467791b47b0fa83efda84491a21RoboErik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c9469e010106467791b47b0fa83efda84491a21RoboErik * See the License for the specific language governing permissions and 145c9469e010106467791b47b0fa83efda84491a21RoboErik * limitations under the License. 155c9469e010106467791b47b0fa83efda84491a21RoboErik */ 165c9469e010106467791b47b0fa83efda84491a21RoboErikpackage android.support.v4.media.session; 175c9469e010106467791b47b0fa83efda84491a21RoboErik 185c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.app.PendingIntent; 195c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.content.Context; 205c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.content.Intent; 215c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.graphics.Bitmap; 225c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.AudioManager; 235c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.MediaMetadataRetriever; 245c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.RemoteControlClient; 255c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.os.Bundle; 265c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.os.ResultReceiver; 275c9469e010106467791b47b0fa83efda84491a21RoboErik 285c9469e010106467791b47b0fa83efda84491a21RoboErikpublic class MediaSessionCompatApi14 { 295c9469e010106467791b47b0fa83efda84491a21RoboErik /***** RemoteControlClient States, we only need none as the others were public *******/ 305c9469e010106467791b47b0fa83efda84491a21RoboErik final static int RCC_PLAYSTATE_NONE = 0; 315c9469e010106467791b47b0fa83efda84491a21RoboErik 325c9469e010106467791b47b0fa83efda84491a21RoboErik /***** MediaSession States *******/ 335c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_NONE = 0; 345c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_STOPPED = 1; 355c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_PAUSED = 2; 365c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_PLAYING = 3; 375c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_FAST_FORWARDING = 4; 385c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_REWINDING = 5; 395c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_BUFFERING = 6; 405c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_ERROR = 7; 415c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_CONNECTING = 8; 425c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_SKIPPING_TO_PREVIOUS = 9; 435c9469e010106467791b47b0fa83efda84491a21RoboErik final static int STATE_SKIPPING_TO_NEXT = 10; 44bdffe798d762566626c161a613db777e80d9a786Ian Lake final static int STATE_SKIPPING_TO_QUEUE_ITEM = 11; 455c9469e010106467791b47b0fa83efda84491a21RoboErik 46b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake /***** PlaybackState actions *****/ 47b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_STOP = 1 << 0; 48b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_PAUSE = 1 << 1; 49b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_PLAY = 1 << 2; 50b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_REWIND = 1 << 3; 51b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_SKIP_TO_PREVIOUS = 1 << 4; 52b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_SKIP_TO_NEXT = 1 << 5; 53b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_FAST_FORWARD = 1 << 6; 54b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_PLAY_PAUSE = 1 << 9; 55b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake 565c9469e010106467791b47b0fa83efda84491a21RoboErik /***** MediaMetadata keys ********/ 57ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake private static final String METADATA_KEY_ART = "android.media.metadata.ART"; 58ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake private static final String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART"; 595c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE"; 605c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST"; 615c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_DURATION = "android.media.metadata.DURATION"; 625c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM"; 635c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR"; 645c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_WRITER = "android.media.metadata.WRITER"; 655c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER"; 665c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION"; 675c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_DATE = "android.media.metadata.DATE"; 685c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_GENRE = "android.media.metadata.GENRE"; 695c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER"; 705c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER"; 715c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST"; 725c9469e010106467791b47b0fa83efda84491a21RoboErik 735c9469e010106467791b47b0fa83efda84491a21RoboErik public static Object createRemoteControlClient(PendingIntent mbIntent) { 745c9469e010106467791b47b0fa83efda84491a21RoboErik return new RemoteControlClient(mbIntent); 755c9469e010106467791b47b0fa83efda84491a21RoboErik } 765c9469e010106467791b47b0fa83efda84491a21RoboErik 775c9469e010106467791b47b0fa83efda84491a21RoboErik public static void setState(Object rccObj, int state) { 785c9469e010106467791b47b0fa83efda84491a21RoboErik ((RemoteControlClient) rccObj).setPlaybackState(getRccStateFromState(state)); 795c9469e010106467791b47b0fa83efda84491a21RoboErik } 805c9469e010106467791b47b0fa83efda84491a21RoboErik 81b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake public static void setTransportControlFlags(Object rccObj, long actions) { 82b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake ((RemoteControlClient) rccObj).setTransportControlFlags( 83b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake getRccTransportControlFlagsFromActions(actions)); 84b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 85b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake 865c9469e010106467791b47b0fa83efda84491a21RoboErik public static void setMetadata(Object rccObj, Bundle metadata) { 875c9469e010106467791b47b0fa83efda84491a21RoboErik RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata( 885c9469e010106467791b47b0fa83efda84491a21RoboErik true); 895c9469e010106467791b47b0fa83efda84491a21RoboErik buildOldMetadata(metadata, editor); 905c9469e010106467791b47b0fa83efda84491a21RoboErik editor.apply(); 915c9469e010106467791b47b0fa83efda84491a21RoboErik } 925c9469e010106467791b47b0fa83efda84491a21RoboErik 935c9469e010106467791b47b0fa83efda84491a21RoboErik public static void registerRemoteControlClient(Context context, Object rccObj) { 945c9469e010106467791b47b0fa83efda84491a21RoboErik AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 955c9469e010106467791b47b0fa83efda84491a21RoboErik am.registerRemoteControlClient((RemoteControlClient) rccObj); 965c9469e010106467791b47b0fa83efda84491a21RoboErik } 975c9469e010106467791b47b0fa83efda84491a21RoboErik 985c9469e010106467791b47b0fa83efda84491a21RoboErik public static void unregisterRemoteControlClient(Context context, Object rccObj) { 995c9469e010106467791b47b0fa83efda84491a21RoboErik AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 1005c9469e010106467791b47b0fa83efda84491a21RoboErik am.unregisterRemoteControlClient((RemoteControlClient) rccObj); 1015c9469e010106467791b47b0fa83efda84491a21RoboErik } 1025c9469e010106467791b47b0fa83efda84491a21RoboErik 1035c9469e010106467791b47b0fa83efda84491a21RoboErik static int getRccStateFromState(int state) { 1045c9469e010106467791b47b0fa83efda84491a21RoboErik switch (state) { 1055c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_CONNECTING: 1065c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_BUFFERING: 1075c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_BUFFERING; 1085c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_ERROR: 1095c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_ERROR; 1105c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_FAST_FORWARDING: 1115c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_FAST_FORWARDING; 1125c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_NONE: 1135c9469e010106467791b47b0fa83efda84491a21RoboErik return RCC_PLAYSTATE_NONE; 1145c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_PAUSED: 1155c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_PAUSED; 1165c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_PLAYING: 1175c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_PLAYING; 1185c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_REWINDING: 1195c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_REWINDING; 1205c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_SKIPPING_TO_PREVIOUS: 1215c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS; 1225c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_SKIPPING_TO_NEXT: 123bdffe798d762566626c161a613db777e80d9a786Ian Lake case STATE_SKIPPING_TO_QUEUE_ITEM: 1245c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS; 1255c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_STOPPED: 1265c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_STOPPED; 1275c9469e010106467791b47b0fa83efda84491a21RoboErik default: 1285c9469e010106467791b47b0fa83efda84491a21RoboErik return -1; 1295c9469e010106467791b47b0fa83efda84491a21RoboErik } 1305c9469e010106467791b47b0fa83efda84491a21RoboErik } 1315c9469e010106467791b47b0fa83efda84491a21RoboErik 132b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake static int getRccTransportControlFlagsFromActions(long actions) { 133b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake int transportControlFlags = 0; 134b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_STOP) != 0) { 135b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_STOP; 136b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 137b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_PAUSE) != 0) { 138b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PAUSE; 139b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 140b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_PLAY) != 0) { 141b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PLAY; 142b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 143b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_REWIND) != 0) { 144b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_REWIND; 145b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 146b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_SKIP_TO_PREVIOUS) != 0) { 147b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS; 148b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 149b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_SKIP_TO_NEXT) != 0) { 150b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_NEXT; 151b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 152b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_FAST_FORWARD) != 0) { 153b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD; 154b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 155b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_PLAY_PAUSE) != 0) { 156b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE; 157b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 158b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake return transportControlFlags; 159b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 160b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake 1615c9469e010106467791b47b0fa83efda84491a21RoboErik static void buildOldMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) { 162b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake if (metadata == null) { 163b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake return; 164b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake } 165ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake if (metadata.containsKey(METADATA_KEY_ART)) { 166ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake Bitmap art = metadata.getParcelable(METADATA_KEY_ART); 167ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake editor.putBitmap(RemoteControlClient.MetadataEditor.BITMAP_KEY_ARTWORK, art); 168ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake } else if (metadata.containsKey(METADATA_KEY_ALBUM_ART)) { 169ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake // Fall back to album art if the track art wasn't available 170ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake Bitmap art = metadata.getParcelable(METADATA_KEY_ALBUM_ART); 171ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake editor.putBitmap(RemoteControlClient.MetadataEditor.BITMAP_KEY_ARTWORK, art); 172ceb823a0d1bb74097920b3397dfe55febdfe85a7Ian Lake } 1735c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_ALBUM)) { 1745c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, 1755c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_ALBUM)); 1765c9469e010106467791b47b0fa83efda84491a21RoboErik } 1775c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_ALBUM_ARTIST)) { 1785c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST, 1795c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_ALBUM_ARTIST)); 1805c9469e010106467791b47b0fa83efda84491a21RoboErik } 1815c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_ARTIST)) { 1825c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, 1835c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_ARTIST)); 1845c9469e010106467791b47b0fa83efda84491a21RoboErik } 1855c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_AUTHOR)) { 1865c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_AUTHOR, 1875c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_AUTHOR)); 1885c9469e010106467791b47b0fa83efda84491a21RoboErik } 1895c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_COMPILATION)) { 1905c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPILATION, 1915c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_COMPILATION)); 1925c9469e010106467791b47b0fa83efda84491a21RoboErik } 1935c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_COMPOSER)) { 1945c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPOSER, 1955c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_COMPOSER)); 1965c9469e010106467791b47b0fa83efda84491a21RoboErik } 1975c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_DATE)) { 1985c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_DATE, 1995c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_DATE)); 2005c9469e010106467791b47b0fa83efda84491a21RoboErik } 2015c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_DISC_NUMBER)) { 2025c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putLong(MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER, 2035c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getLong(METADATA_KEY_DISC_NUMBER)); 2045c9469e010106467791b47b0fa83efda84491a21RoboErik } 2055c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_DURATION)) { 2065c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, 2075c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getLong(METADATA_KEY_DURATION)); 2085c9469e010106467791b47b0fa83efda84491a21RoboErik } 2095c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_GENRE)) { 2105c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_GENRE, 2115c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_GENRE)); 2125c9469e010106467791b47b0fa83efda84491a21RoboErik } 2135c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_TITLE)) { 2145c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, 2155c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_TITLE)); 2165c9469e010106467791b47b0fa83efda84491a21RoboErik } 2175c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_TRACK_NUMBER)) { 2185c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putLong(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER, 2195c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getLong(METADATA_KEY_TRACK_NUMBER)); 2205c9469e010106467791b47b0fa83efda84491a21RoboErik } 2215c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_WRITER)) { 2225c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_WRITER, 2235c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_WRITER)); 2245c9469e010106467791b47b0fa83efda84491a21RoboErik } 2255c9469e010106467791b47b0fa83efda84491a21RoboErik } 2265c9469e010106467791b47b0fa83efda84491a21RoboErik 2275c9469e010106467791b47b0fa83efda84491a21RoboErik public static interface Callback { 2285c9469e010106467791b47b0fa83efda84491a21RoboErik public void onCommand(String command, Bundle extras, ResultReceiver cb); 2295c9469e010106467791b47b0fa83efda84491a21RoboErik 2305c9469e010106467791b47b0fa83efda84491a21RoboErik public boolean onMediaButtonEvent(Intent mediaButtonIntent); 2315c9469e010106467791b47b0fa83efda84491a21RoboErik 2325c9469e010106467791b47b0fa83efda84491a21RoboErik public void onPlay(); 2335c9469e010106467791b47b0fa83efda84491a21RoboErik 2345c9469e010106467791b47b0fa83efda84491a21RoboErik public void onPause(); 2355c9469e010106467791b47b0fa83efda84491a21RoboErik 2365c9469e010106467791b47b0fa83efda84491a21RoboErik public void onSkipToNext(); 2375c9469e010106467791b47b0fa83efda84491a21RoboErik 2385c9469e010106467791b47b0fa83efda84491a21RoboErik public void onSkipToPrevious(); 2395c9469e010106467791b47b0fa83efda84491a21RoboErik 2405c9469e010106467791b47b0fa83efda84491a21RoboErik public void onFastForward(); 2415c9469e010106467791b47b0fa83efda84491a21RoboErik 2425c9469e010106467791b47b0fa83efda84491a21RoboErik public void onRewind(); 2435c9469e010106467791b47b0fa83efda84491a21RoboErik 2445c9469e010106467791b47b0fa83efda84491a21RoboErik public void onStop(); 2455c9469e010106467791b47b0fa83efda84491a21RoboErik 2465c9469e010106467791b47b0fa83efda84491a21RoboErik public void onSeekTo(long pos); 2475c9469e010106467791b47b0fa83efda84491a21RoboErik 2485c9469e010106467791b47b0fa83efda84491a21RoboErik public void onSetRating(Object ratingObj); 2495c9469e010106467791b47b0fa83efda84491a21RoboErik } 250b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake} 251