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.media.MediaMetadataEditor;
1903a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lakeimport android.media.MediaMetadataRetriever;
205c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.Rating;
215c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.RemoteControlClient;
225c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.os.Bundle;
235c9469e010106467791b47b0fa83efda84491a21RoboErik
24bd0822174be5562e88b213ae2970708ab974ee0fSungsoo Limclass MediaSessionCompatApi19 {
25b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    /***** PlaybackState actions *****/
26b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    private static final long ACTION_SET_RATING = 1 << 7;
27b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake
285c9469e010106467791b47b0fa83efda84491a21RoboErik    /***** MediaMetadata keys ********/
295c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
305c9469e010106467791b47b0fa83efda84491a21RoboErik    private static final String METADATA_KEY_RATING = "android.media.metadata.RATING";
3103a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake    private static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
325c9469e010106467791b47b0fa83efda84491a21RoboErik
33b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    public static void setTransportControlFlags(Object rccObj, long actions) {
34b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        ((RemoteControlClient) rccObj).setTransportControlFlags(
35b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake                getRccTransportControlFlagsFromActions(actions));
36b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    }
37b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake
389961e6e72ded525e84a78ee3b6fba6a3f374c93eSungsoo Lim    public static Object createMetadataUpdateListener(Callback callback) {
399961e6e72ded525e84a78ee3b6fba6a3f374c93eSungsoo Lim        return new OnMetadataUpdateListener<Callback>(callback);
405c9469e010106467791b47b0fa83efda84491a21RoboErik    }
415c9469e010106467791b47b0fa83efda84491a21RoboErik
42b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    public static void setMetadata(Object rccObj, Bundle metadata, long actions) {
435c9469e010106467791b47b0fa83efda84491a21RoboErik        RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata(
445c9469e010106467791b47b0fa83efda84491a21RoboErik                true);
455c9469e010106467791b47b0fa83efda84491a21RoboErik        MediaSessionCompatApi14.buildOldMetadata(metadata, editor);
465c9469e010106467791b47b0fa83efda84491a21RoboErik        addNewMetadata(metadata, editor);
47b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        if ((actions & ACTION_SET_RATING) != 0) {
485c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.addEditableKey(RemoteControlClient.MetadataEditor.RATING_KEY_BY_USER);
495c9469e010106467791b47b0fa83efda84491a21RoboErik        }
505c9469e010106467791b47b0fa83efda84491a21RoboErik        editor.apply();
515c9469e010106467791b47b0fa83efda84491a21RoboErik    }
525c9469e010106467791b47b0fa83efda84491a21RoboErik
535c9469e010106467791b47b0fa83efda84491a21RoboErik    public static void setOnMetadataUpdateListener(Object rccObj, Object onMetadataUpdateObj) {
545c9469e010106467791b47b0fa83efda84491a21RoboErik        ((RemoteControlClient) rccObj).setMetadataUpdateListener(
555c9469e010106467791b47b0fa83efda84491a21RoboErik                (RemoteControlClient.OnMetadataUpdateListener) onMetadataUpdateObj);
565c9469e010106467791b47b0fa83efda84491a21RoboErik    }
575c9469e010106467791b47b0fa83efda84491a21RoboErik
58b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    static int getRccTransportControlFlagsFromActions(long actions) {
59b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        int transportControlFlags =
60b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake                MediaSessionCompatApi18.getRccTransportControlFlagsFromActions(actions);
61b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        if ((actions & ACTION_SET_RATING) != 0) {
62b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake            transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_RATING;
63b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        }
64b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake        return transportControlFlags;
65b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake    }
66b5d44b772175e55013d16dc58a17eff30fcc3261Ian Lake
675c9469e010106467791b47b0fa83efda84491a21RoboErik    static void addNewMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) {
68b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake        if (metadata == null) {
69b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake            return;
70b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake        }
7103a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake        if (metadata.containsKey(METADATA_KEY_YEAR)) {
7203a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake            editor.putLong(MediaMetadataRetriever.METADATA_KEY_YEAR,
7303a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake                    metadata.getLong(METADATA_KEY_YEAR));
7403a7a35a3bcfbc3597c779d3f260d1475c5d0f11Ian Lake        }
755c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_RATING)) {
765c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putObject(MediaMetadataEditor.RATING_KEY_BY_OTHERS,
775c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getParcelable(METADATA_KEY_RATING));
785c9469e010106467791b47b0fa83efda84491a21RoboErik        }
795c9469e010106467791b47b0fa83efda84491a21RoboErik        if (metadata.containsKey(METADATA_KEY_USER_RATING)) {
805c9469e010106467791b47b0fa83efda84491a21RoboErik            editor.putObject(MediaMetadataEditor.RATING_KEY_BY_USER,
815c9469e010106467791b47b0fa83efda84491a21RoboErik                    metadata.getParcelable(METADATA_KEY_USER_RATING));
825c9469e010106467791b47b0fa83efda84491a21RoboErik        }
835c9469e010106467791b47b0fa83efda84491a21RoboErik    }
845c9469e010106467791b47b0fa83efda84491a21RoboErik
859961e6e72ded525e84a78ee3b6fba6a3f374c93eSungsoo Lim    static class OnMetadataUpdateListener<T extends Callback> implements
865c9469e010106467791b47b0fa83efda84491a21RoboErik            RemoteControlClient.OnMetadataUpdateListener {
875c9469e010106467791b47b0fa83efda84491a21RoboErik        protected final T mCallback;
885c9469e010106467791b47b0fa83efda84491a21RoboErik
895c9469e010106467791b47b0fa83efda84491a21RoboErik        public OnMetadataUpdateListener(T callback) {
905c9469e010106467791b47b0fa83efda84491a21RoboErik            mCallback = callback;
915c9469e010106467791b47b0fa83efda84491a21RoboErik        }
925c9469e010106467791b47b0fa83efda84491a21RoboErik
935c9469e010106467791b47b0fa83efda84491a21RoboErik        @Override
945c9469e010106467791b47b0fa83efda84491a21RoboErik        public void onMetadataUpdate(int key, Object newValue) {
955c9469e010106467791b47b0fa83efda84491a21RoboErik            if (key == MediaMetadataEditor.RATING_KEY_BY_USER && newValue instanceof Rating) {
965c9469e010106467791b47b0fa83efda84491a21RoboErik                mCallback.onSetRating(newValue);
975c9469e010106467791b47b0fa83efda84491a21RoboErik            }
985c9469e010106467791b47b0fa83efda84491a21RoboErik        }
995c9469e010106467791b47b0fa83efda84491a21RoboErik    }
1009961e6e72ded525e84a78ee3b6fba6a3f374c93eSungsoo Lim
1019961e6e72ded525e84a78ee3b6fba6a3f374c93eSungsoo Lim    interface Callback extends MediaSessionCompatApi18.Callback {
1029961e6e72ded525e84a78ee3b6fba6a3f374c93eSungsoo Lim        public void onSetRating(Object ratingObj);
1039961e6e72ded525e84a78ee3b6fba6a3f374c93eSungsoo Lim    }
104b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake}
105