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