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