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
455c9469e010106467791b47b0fa83efda84491a21RoboErik    /***** MediaMetadata keys ********/
465c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
475c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
485c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
495c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
505c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
515c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
525c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
535c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
545c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_DATE = "android.media.metadata.DATE";
555c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
565c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
575c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
585c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
595c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
605c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
615c9469e010106467791b47b0fa83efda84491a21RoboErik
625c9469e010106467791b47b0fa83efda84491a21RoboErik    public static Object createRemoteControlClient(PendingIntent mbIntent) {
635c9469e010106467791b47b0fa83efda84491a21RoboErik        return new RemoteControlClient(mbIntent);
645c9469e010106467791b47b0fa83efda84491a21RoboErik    }
655c9469e010106467791b47b0fa83efda84491a21RoboErik
665c9469e010106467791b47b0fa83efda84491a21RoboErik    public static void setState(Object rccObj, int state) {
675c9469e010106467791b47b0fa83efda84491a21RoboErik        ((RemoteControlClient) rccObj).setPlaybackState(getRccStateFromState(state));
685c9469e010106467791b47b0fa83efda84491a21RoboErik    }
695c9469e010106467791b47b0fa83efda84491a21RoboErik
705c9469e010106467791b47b0fa83efda84491a21RoboErik    public static void setMetadata(Object rccObj, Bundle metadata) {
715c9469e010106467791b47b0fa83efda84491a21RoboErik        RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata(
725c9469e010106467791b47b0fa83efda84491a21RoboErik                true);
735c9469e010106467791b47b0fa83efda84491a21RoboErik        buildOldMetadata(metadata, editor);
745c9469e010106467791b47b0fa83efda84491a21RoboErik        editor.apply();
755c9469e010106467791b47b0fa83efda84491a21RoboErik    }
765c9469e010106467791b47b0fa83efda84491a21RoboErik
775c9469e010106467791b47b0fa83efda84491a21RoboErik    public static void registerRemoteControlClient(Context context, Object rccObj) {
785c9469e010106467791b47b0fa83efda84491a21RoboErik        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
795c9469e010106467791b47b0fa83efda84491a21RoboErik        am.registerRemoteControlClient((RemoteControlClient) rccObj);
805c9469e010106467791b47b0fa83efda84491a21RoboErik    }
815c9469e010106467791b47b0fa83efda84491a21RoboErik
825c9469e010106467791b47b0fa83efda84491a21RoboErik    public static void unregisterRemoteControlClient(Context context, Object rccObj) {
835c9469e010106467791b47b0fa83efda84491a21RoboErik        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
845c9469e010106467791b47b0fa83efda84491a21RoboErik        am.unregisterRemoteControlClient((RemoteControlClient) rccObj);
855c9469e010106467791b47b0fa83efda84491a21RoboErik    }
865c9469e010106467791b47b0fa83efda84491a21RoboErik
875c9469e010106467791b47b0fa83efda84491a21RoboErik    static int getRccStateFromState(int state) {
885c9469e010106467791b47b0fa83efda84491a21RoboErik        switch (state) {
895c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_CONNECTING:
905c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_BUFFERING:
915c9469e010106467791b47b0fa83efda84491a21RoboErik                return RemoteControlClient.PLAYSTATE_BUFFERING;
925c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_ERROR:
935c9469e010106467791b47b0fa83efda84491a21RoboErik                return RemoteControlClient.PLAYSTATE_ERROR;
945c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_FAST_FORWARDING:
955c9469e010106467791b47b0fa83efda84491a21RoboErik                return RemoteControlClient.PLAYSTATE_FAST_FORWARDING;
965c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_NONE:
975c9469e010106467791b47b0fa83efda84491a21RoboErik                return RCC_PLAYSTATE_NONE;
985c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_PAUSED:
995c9469e010106467791b47b0fa83efda84491a21RoboErik                return RemoteControlClient.PLAYSTATE_PAUSED;
1005c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_PLAYING:
1015c9469e010106467791b47b0fa83efda84491a21RoboErik                return RemoteControlClient.PLAYSTATE_PLAYING;
1025c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_REWINDING:
1035c9469e010106467791b47b0fa83efda84491a21RoboErik                return RemoteControlClient.PLAYSTATE_REWINDING;
1045c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_SKIPPING_TO_PREVIOUS:
1055c9469e010106467791b47b0fa83efda84491a21RoboErik                return RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS;
1065c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_SKIPPING_TO_NEXT:
1075c9469e010106467791b47b0fa83efda84491a21RoboErik                return RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS;
1085c9469e010106467791b47b0fa83efda84491a21RoboErik            case STATE_STOPPED:
1095c9469e010106467791b47b0fa83efda84491a21RoboErik                return RemoteControlClient.PLAYSTATE_STOPPED;
1105c9469e010106467791b47b0fa83efda84491a21RoboErik            default:
1115c9469e010106467791b47b0fa83efda84491a21RoboErik                return -1;
1125c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1135c9469e010106467791b47b0fa83efda84491a21RoboErik    }
1145c9469e010106467791b47b0fa83efda84491a21RoboErik
1155c9469e010106467791b47b0fa83efda84491a21RoboErik    static void buildOldMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) {
1165c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_ALBUM)) {
1175c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM,
1185c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_ALBUM));
1195c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1205c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_ALBUM_ARTIST)) {
1215c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST,
1225c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_ALBUM_ARTIST));
1235c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1245c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_ARTIST)) {
1255c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST,
1265c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_ARTIST));
1275c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1285c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_AUTHOR)) {
1295c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_AUTHOR,
1305c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_AUTHOR));
1315c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1325c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_COMPILATION)) {
1335c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPILATION,
1345c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_COMPILATION));
1355c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1365c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_COMPOSER)) {
1375c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_COMPOSER,
1385c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_COMPOSER));
1395c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1405c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_DATE)) {
1415c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_DATE,
1425c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_DATE));
1435c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1445c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_DISC_NUMBER)) {
1455c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putLong(MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER,
1465c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getLong(METADATA_KEY_DISC_NUMBER));
1475c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1485c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_DURATION)) {
1495c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION,
1505c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getLong(METADATA_KEY_DURATION));
1515c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1525c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_GENRE)) {
1535c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_GENRE,
1545c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_GENRE));
1555c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1565c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_NUM_TRACKS)) {
1575c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putLong(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS,
1585c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getLong(METADATA_KEY_NUM_TRACKS));
1595c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1605c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_TITLE)) {
1615c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE,
1625c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_TITLE));
1635c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1645c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_TRACK_NUMBER)) {
1655c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putLong(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER,
1665c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getLong(METADATA_KEY_TRACK_NUMBER));
1675c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1685c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_WRITER)) {
1695c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_WRITER,
1705c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_WRITER));
1715c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1725c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_YEAR)) {
1735c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putString(MediaMetadataRetriever.METADATA_KEY_YEAR,
1745c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getString(METADATA_KEY_YEAR));
1755c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1765c9469e010106467791b47b0fa83efda84491a21RoboErik    }
1775c9469e010106467791b47b0fa83efda84491a21RoboErik
1785c9469e010106467791b47b0fa83efda84491a21RoboErik    public static interface Callback {
1795c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onCommand(String command, Bundle extras, ResultReceiver cb);
1805c9469e010106467791b47b0fa83efda84491a21RoboErik
1815c9469e010106467791b47b0fa83efda84491a21RoboErik        public boolean onMediaButtonEvent(Intent mediaButtonIntent);
1825c9469e010106467791b47b0fa83efda84491a21RoboErik
1835c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onPlay();
1845c9469e010106467791b47b0fa83efda84491a21RoboErik
1855c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onPause();
1865c9469e010106467791b47b0fa83efda84491a21RoboErik
1875c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onSkipToNext();
1885c9469e010106467791b47b0fa83efda84491a21RoboErik
1895c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onSkipToPrevious();
1905c9469e010106467791b47b0fa83efda84491a21RoboErik
1915c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onFastForward();
1925c9469e010106467791b47b0fa83efda84491a21RoboErik
1935c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onRewind();
1945c9469e010106467791b47b0fa83efda84491a21RoboErik
1955c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onStop();
1965c9469e010106467791b47b0fa83efda84491a21RoboErik
1975c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onSeekTo(long pos);
1985c9469e010106467791b47b0fa83efda84491a21RoboErik
1995c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onSetRating(Object ratingObj);
2005c9469e010106467791b47b0fa83efda84491a21RoboErik    }
2015c9469e010106467791b47b0fa83efda84491a21RoboErik}