MediaSessionCompatApi14.java revision b5d44b772175e55013d16dc58a17eff30fcc3261
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; 445c9469e010106467791b47b0fa83efda84491a21RoboErik 45b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake /***** PlaybackState actions *****/ 46b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_STOP = 1 << 0; 47b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_PAUSE = 1 << 1; 48b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_PLAY = 1 << 2; 49b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_REWIND = 1 << 3; 50b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_SKIP_TO_PREVIOUS = 1 << 4; 51b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_SKIP_TO_NEXT = 1 << 5; 52b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_FAST_FORWARD = 1 << 6; 53b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake private static final long ACTION_PLAY_PAUSE = 1 << 9; 54b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake 555c9469e010106467791b47b0fa83efda84491a21RoboErik /***** MediaMetadata keys ********/ 565c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE"; 575c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST"; 585c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_DURATION = "android.media.metadata.DURATION"; 595c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM"; 605c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR"; 615c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_WRITER = "android.media.metadata.WRITER"; 625c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER"; 635c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION"; 645c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_DATE = "android.media.metadata.DATE"; 655c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR"; 665c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_GENRE = "android.media.metadata.GENRE"; 675c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER"; 685c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS"; 695c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER"; 705c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST"; 715c9469e010106467791b47b0fa83efda84491a21RoboErik 725c9469e010106467791b47b0fa83efda84491a21RoboErik public static Object createRemoteControlClient(PendingIntent mbIntent) { 735c9469e010106467791b47b0fa83efda84491a21RoboErik return new RemoteControlClient(mbIntent); 745c9469e010106467791b47b0fa83efda84491a21RoboErik } 755c9469e010106467791b47b0fa83efda84491a21RoboErik 765c9469e010106467791b47b0fa83efda84491a21RoboErik public static void setState(Object rccObj, int state) { 775c9469e010106467791b47b0fa83efda84491a21RoboErik ((RemoteControlClient) rccObj).setPlaybackState(getRccStateFromState(state)); 785c9469e010106467791b47b0fa83efda84491a21RoboErik } 795c9469e010106467791b47b0fa83efda84491a21RoboErik 80b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake public static void setTransportControlFlags(Object rccObj, long actions) { 81b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake ((RemoteControlClient) rccObj).setTransportControlFlags( 82b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake getRccTransportControlFlagsFromActions(actions)); 83b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 84b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake 855c9469e010106467791b47b0fa83efda84491a21RoboErik public static void setMetadata(Object rccObj, Bundle metadata) { 865c9469e010106467791b47b0fa83efda84491a21RoboErik RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata( 875c9469e010106467791b47b0fa83efda84491a21RoboErik true); 885c9469e010106467791b47b0fa83efda84491a21RoboErik buildOldMetadata(metadata, editor); 895c9469e010106467791b47b0fa83efda84491a21RoboErik editor.apply(); 905c9469e010106467791b47b0fa83efda84491a21RoboErik } 915c9469e010106467791b47b0fa83efda84491a21RoboErik 925c9469e010106467791b47b0fa83efda84491a21RoboErik public static void registerRemoteControlClient(Context context, Object rccObj) { 935c9469e010106467791b47b0fa83efda84491a21RoboErik AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 945c9469e010106467791b47b0fa83efda84491a21RoboErik am.registerRemoteControlClient((RemoteControlClient) rccObj); 955c9469e010106467791b47b0fa83efda84491a21RoboErik } 965c9469e010106467791b47b0fa83efda84491a21RoboErik 975c9469e010106467791b47b0fa83efda84491a21RoboErik public static void unregisterRemoteControlClient(Context context, Object rccObj) { 985c9469e010106467791b47b0fa83efda84491a21RoboErik AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 995c9469e010106467791b47b0fa83efda84491a21RoboErik am.unregisterRemoteControlClient((RemoteControlClient) rccObj); 1005c9469e010106467791b47b0fa83efda84491a21RoboErik } 1015c9469e010106467791b47b0fa83efda84491a21RoboErik 1025c9469e010106467791b47b0fa83efda84491a21RoboErik static int getRccStateFromState(int state) { 1035c9469e010106467791b47b0fa83efda84491a21RoboErik switch (state) { 1045c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_CONNECTING: 1055c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_BUFFERING: 1065c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_BUFFERING; 1075c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_ERROR: 1085c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_ERROR; 1095c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_FAST_FORWARDING: 1105c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_FAST_FORWARDING; 1115c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_NONE: 1125c9469e010106467791b47b0fa83efda84491a21RoboErik return RCC_PLAYSTATE_NONE; 1135c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_PAUSED: 1145c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_PAUSED; 1155c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_PLAYING: 1165c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_PLAYING; 1175c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_REWINDING: 1185c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_REWINDING; 1195c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_SKIPPING_TO_PREVIOUS: 1205c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS; 1215c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_SKIPPING_TO_NEXT: 1225c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS; 1235c9469e010106467791b47b0fa83efda84491a21RoboErik case STATE_STOPPED: 1245c9469e010106467791b47b0fa83efda84491a21RoboErik return RemoteControlClient.PLAYSTATE_STOPPED; 1255c9469e010106467791b47b0fa83efda84491a21RoboErik default: 1265c9469e010106467791b47b0fa83efda84491a21RoboErik return -1; 1275c9469e010106467791b47b0fa83efda84491a21RoboErik } 1285c9469e010106467791b47b0fa83efda84491a21RoboErik } 1295c9469e010106467791b47b0fa83efda84491a21RoboErik 130b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake static int getRccTransportControlFlagsFromActions(long actions) { 131b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake int transportControlFlags = 0; 132b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_STOP) != 0) { 133b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_STOP; 134b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 135b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_PAUSE) != 0) { 136b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PAUSE; 137b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 138b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_PLAY) != 0) { 139b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PLAY; 140b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 141b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_REWIND) != 0) { 142b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_REWIND; 143b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 144b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_SKIP_TO_PREVIOUS) != 0) { 145b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS; 146b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 147b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_SKIP_TO_NEXT) != 0) { 148b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_NEXT; 149b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 150b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_FAST_FORWARD) != 0) { 151b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD; 152b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 153b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake if ((actions & ACTION_PLAY_PAUSE) != 0) { 154b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE; 155b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 156b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake return transportControlFlags; 157b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake } 158b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake 1595c9469e010106467791b47b0fa83efda84491a21RoboErik static void buildOldMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) { 160b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake if (metadata == null) { 161b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake return; 162b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake } 1635c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_ALBUM)) { 1645c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, 1655c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_ALBUM)); 1665c9469e010106467791b47b0fa83efda84491a21RoboErik } 1675c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_ALBUM_ARTIST)) { 1685c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST, 1695c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_ALBUM_ARTIST)); 1705c9469e010106467791b47b0fa83efda84491a21RoboErik } 1715c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_ARTIST)) { 1725c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, 1735c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_ARTIST)); 1745c9469e010106467791b47b0fa83efda84491a21RoboErik } 1755c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_AUTHOR)) { 1765c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_AUTHOR, 1775c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_AUTHOR)); 1785c9469e010106467791b47b0fa83efda84491a21RoboErik } 1795c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_COMPILATION)) { 1805c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPILATION, 1815c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_COMPILATION)); 1825c9469e010106467791b47b0fa83efda84491a21RoboErik } 1835c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_COMPOSER)) { 1845c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPOSER, 1855c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_COMPOSER)); 1865c9469e010106467791b47b0fa83efda84491a21RoboErik } 1875c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_DATE)) { 1885c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_DATE, 1895c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_DATE)); 1905c9469e010106467791b47b0fa83efda84491a21RoboErik } 1915c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_DISC_NUMBER)) { 1925c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putLong(MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER, 1935c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getLong(METADATA_KEY_DISC_NUMBER)); 1945c9469e010106467791b47b0fa83efda84491a21RoboErik } 1955c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_DURATION)) { 1965c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, 1975c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getLong(METADATA_KEY_DURATION)); 1985c9469e010106467791b47b0fa83efda84491a21RoboErik } 1995c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_GENRE)) { 2005c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_GENRE, 2015c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_GENRE)); 2025c9469e010106467791b47b0fa83efda84491a21RoboErik } 2035c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_NUM_TRACKS)) { 2045c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putLong(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS, 2055c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getLong(METADATA_KEY_NUM_TRACKS)); 2065c9469e010106467791b47b0fa83efda84491a21RoboErik } 2075c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_TITLE)) { 2085c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, 2095c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_TITLE)); 2105c9469e010106467791b47b0fa83efda84491a21RoboErik } 2115c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_TRACK_NUMBER)) { 2125c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putLong(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER, 2135c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getLong(METADATA_KEY_TRACK_NUMBER)); 2145c9469e010106467791b47b0fa83efda84491a21RoboErik } 2155c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_WRITER)) { 2165c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_WRITER, 2175c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_WRITER)); 2185c9469e010106467791b47b0fa83efda84491a21RoboErik } 2195c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_YEAR)) { 2205c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putString(MediaMetadataRetriever.METADATA_KEY_YEAR, 2215c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getString(METADATA_KEY_YEAR)); 2225c9469e010106467791b47b0fa83efda84491a21RoboErik } 2235c9469e010106467791b47b0fa83efda84491a21RoboErik } 2245c9469e010106467791b47b0fa83efda84491a21RoboErik 2255c9469e010106467791b47b0fa83efda84491a21RoboErik public static interface Callback { 2265c9469e010106467791b47b0fa83efda84491a21RoboErik public void onCommand(String command, Bundle extras, ResultReceiver cb); 2275c9469e010106467791b47b0fa83efda84491a21RoboErik 2285c9469e010106467791b47b0fa83efda84491a21RoboErik public boolean onMediaButtonEvent(Intent mediaButtonIntent); 2295c9469e010106467791b47b0fa83efda84491a21RoboErik 2305c9469e010106467791b47b0fa83efda84491a21RoboErik public void onPlay(); 2315c9469e010106467791b47b0fa83efda84491a21RoboErik 2325c9469e010106467791b47b0fa83efda84491a21RoboErik public void onPause(); 2335c9469e010106467791b47b0fa83efda84491a21RoboErik 2345c9469e010106467791b47b0fa83efda84491a21RoboErik public void onSkipToNext(); 2355c9469e010106467791b47b0fa83efda84491a21RoboErik 2365c9469e010106467791b47b0fa83efda84491a21RoboErik public void onSkipToPrevious(); 2375c9469e010106467791b47b0fa83efda84491a21RoboErik 2385c9469e010106467791b47b0fa83efda84491a21RoboErik public void onFastForward(); 2395c9469e010106467791b47b0fa83efda84491a21RoboErik 2405c9469e010106467791b47b0fa83efda84491a21RoboErik public void onRewind(); 2415c9469e010106467791b47b0fa83efda84491a21RoboErik 2425c9469e010106467791b47b0fa83efda84491a21RoboErik public void onStop(); 2435c9469e010106467791b47b0fa83efda84491a21RoboErik 2445c9469e010106467791b47b0fa83efda84491a21RoboErik public void onSeekTo(long pos); 2455c9469e010106467791b47b0fa83efda84491a21RoboErik 2465c9469e010106467791b47b0fa83efda84491a21RoboErik public void onSetRating(Object ratingObj); 2475c9469e010106467791b47b0fa83efda84491a21RoboErik } 248b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake} 249