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