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.graphics.Bitmap;
195c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.MediaMetadataEditor;
2003a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lakeimport android.media.MediaMetadataRetriever;
215c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.Rating;
225c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.RemoteControlClient;
235c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.os.Bundle;
245c9469e010106467791b47b0fa83efda84491a21RoboErik
255c9469e010106467791b47b0fa83efda84491a21RoboErikpublic class MediaSessionCompatApi19 {
26b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    /***** PlaybackState actions *****/
27b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    private static final long ACTION_SET_RATING = 1 << 7;
28b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake
295c9469e010106467791b47b0fa83efda84491a21RoboErik    /***** MediaMetadata keys ********/
305c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
315c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_RATING = "android.media.metadata.RATING";
3203a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake    private static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
335c9469e010106467791b47b0fa83efda84491a21RoboErik
34b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    public static void setTransportControlFlags(Object rccObj, long actions) {
35b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        ((RemoteControlClient) rccObj).setTransportControlFlags(
36b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake                getRccTransportControlFlagsFromActions(actions));
37b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    }
38b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake
395c9469e010106467791b47b0fa83efda84491a21RoboErik    public static Object createMetadataUpdateListener(MediaSessionCompatApi14.Callback callback) {
405c9469e010106467791b47b0fa83efda84491a21RoboErik        return new OnMetadataUpdateListener<MediaSessionCompatApi14.Callback>(callback);
415c9469e010106467791b47b0fa83efda84491a21RoboErik    }
425c9469e010106467791b47b0fa83efda84491a21RoboErik
43b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    public static void setMetadata(Object rccObj, Bundle metadata, long actions) {
445c9469e010106467791b47b0fa83efda84491a21RoboErik        RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata(
455c9469e010106467791b47b0fa83efda84491a21RoboErik                true);
465c9469e010106467791b47b0fa83efda84491a21RoboErik        MediaSessionCompatApi14.buildOldMetadata(metadata, editor);
475c9469e010106467791b47b0fa83efda84491a21RoboErik        addNewMetadata(metadata, editor);
48b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        if ((actions & ACTION_SET_RATING) != 0) {
495c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.addEditableKey(RemoteControlClient.MetadataEditor.RATING_KEY_BY_USER);
505c9469e010106467791b47b0fa83efda84491a21RoboErik        }
515c9469e010106467791b47b0fa83efda84491a21RoboErik        editor.apply();
525c9469e010106467791b47b0fa83efda84491a21RoboErik    }
535c9469e010106467791b47b0fa83efda84491a21RoboErik
545c9469e010106467791b47b0fa83efda84491a21RoboErik    public static void setOnMetadataUpdateListener(Object rccObj, Object onMetadataUpdateObj) {
555c9469e010106467791b47b0fa83efda84491a21RoboErik        ((RemoteControlClient) rccObj).setMetadataUpdateListener(
565c9469e010106467791b47b0fa83efda84491a21RoboErik                (RemoteControlClient.OnMetadataUpdateListener) onMetadataUpdateObj);
575c9469e010106467791b47b0fa83efda84491a21RoboErik    }
585c9469e010106467791b47b0fa83efda84491a21RoboErik
59b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    static int getRccTransportControlFlagsFromActions(long actions) {
60b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        int transportControlFlags =
61b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake                MediaSessionCompatApi18.getRccTransportControlFlagsFromActions(actions);
62b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        if ((actions & ACTION_SET_RATING) != 0) {
63b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_RATING;
64b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        }
65b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        return transportControlFlags;
66b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    }
67b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake
685c9469e010106467791b47b0fa83efda84491a21RoboErik    static void addNewMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) {
69b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake        if (metadata == null) {
70b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake            return;
71b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake        }
7203a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake        if (metadata.containsKey(METADATA_KEY_YEAR)) {
7303a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake            editor.putLong(MediaMetadataRetriever.METADATA_KEY_YEAR,
7403a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake                    metadata.getLong(METADATA_KEY_YEAR));
7503a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake        }
765c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_RATING)) {
775c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putObject(MediaMetadataEditor.RATING_KEY_BY_OTHERS,
785c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getParcelable(METADATA_KEY_RATING));
795c9469e010106467791b47b0fa83efda84491a21RoboErik        }
805c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_USER_RATING)) {
815c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putObject(MediaMetadataEditor.RATING_KEY_BY_USER,
825c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getParcelable(METADATA_KEY_USER_RATING));
835c9469e010106467791b47b0fa83efda84491a21RoboErik        }
845c9469e010106467791b47b0fa83efda84491a21RoboErik    }
855c9469e010106467791b47b0fa83efda84491a21RoboErik
865c9469e010106467791b47b0fa83efda84491a21RoboErik    static class OnMetadataUpdateListener<T extends MediaSessionCompatApi14.Callback> implements
875c9469e010106467791b47b0fa83efda84491a21RoboErik            RemoteControlClient.OnMetadataUpdateListener {
885c9469e010106467791b47b0fa83efda84491a21RoboErik        protected final T mCallback;
895c9469e010106467791b47b0fa83efda84491a21RoboErik
905c9469e010106467791b47b0fa83efda84491a21RoboErik        public OnMetadataUpdateListener(T callback) {
915c9469e010106467791b47b0fa83efda84491a21RoboErik            mCallback = callback;
925c9469e010106467791b47b0fa83efda84491a21RoboErik        }
935c9469e010106467791b47b0fa83efda84491a21RoboErik
945c9469e010106467791b47b0fa83efda84491a21RoboErik        @Override
955c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onMetadataUpdate(int key, Object newValue) {
965c9469e010106467791b47b0fa83efda84491a21RoboErik            if (key == MediaMetadataEditor.RATING_KEY_BY_USER && newValue instanceof Rating) {
975c9469e010106467791b47b0fa83efda84491a21RoboErik                mCallback.onSetRating(newValue);
985c9469e010106467791b47b0fa83efda84491a21RoboErik            }
995c9469e010106467791b47b0fa83efda84491a21RoboErik        }
1005c9469e010106467791b47b0fa83efda84491a21RoboErik    }
101b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake}
102