1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package android.support.v4.media.session; 17 18import android.graphics.Bitmap; 19import android.media.MediaMetadataEditor; 20import android.media.MediaMetadataRetriever; 21import android.media.Rating; 22import android.media.RemoteControlClient; 23import android.os.Bundle; 24 25public class MediaSessionCompatApi19 { 26 /***** PlaybackState actions *****/ 27 private static final long ACTION_SET_RATING = 1 << 7; 28 29 /***** MediaMetadata keys ********/ 30 private static final String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING"; 31 private static final String METADATA_KEY_RATING = "android.media.metadata.RATING"; 32 private static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR"; 33 34 public static void setTransportControlFlags(Object rccObj, long actions) { 35 ((RemoteControlClient) rccObj).setTransportControlFlags( 36 getRccTransportControlFlagsFromActions(actions)); 37 } 38 39 public static Object createMetadataUpdateListener(MediaSessionCompatApi14.Callback callback) { 40 return new OnMetadataUpdateListener<MediaSessionCompatApi14.Callback>(callback); 41 } 42 43 public static void setMetadata(Object rccObj, Bundle metadata, long actions) { 44 RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata( 45 true); 46 MediaSessionCompatApi14.buildOldMetadata(metadata, editor); 47 addNewMetadata(metadata, editor); 48 if ((actions & ACTION_SET_RATING) != 0) { 49 editor.addEditableKey(RemoteControlClient.MetadataEditor.RATING_KEY_BY_USER); 50 } 51 editor.apply(); 52 } 53 54 public static void setOnMetadataUpdateListener(Object rccObj, Object onMetadataUpdateObj) { 55 ((RemoteControlClient) rccObj).setMetadataUpdateListener( 56 (RemoteControlClient.OnMetadataUpdateListener) onMetadataUpdateObj); 57 } 58 59 static int getRccTransportControlFlagsFromActions(long actions) { 60 int transportControlFlags = 61 MediaSessionCompatApi18.getRccTransportControlFlagsFromActions(actions); 62 if ((actions & ACTION_SET_RATING) != 0) { 63 transportControlFlags |= RemoteControlClient.FLAG_KEY_MEDIA_RATING; 64 } 65 return transportControlFlags; 66 } 67 68 static void addNewMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) { 69 if (metadata == null) { 70 return; 71 } 72 if (metadata.containsKey(METADATA_KEY_YEAR)) { 73 editor.putLong(MediaMetadataRetriever.METADATA_KEY_YEAR, 74 metadata.getLong(METADATA_KEY_YEAR)); 75 } 76 if (metadata.containsKey(METADATA_KEY_RATING)) { 77 editor.putObject(MediaMetadataEditor.RATING_KEY_BY_OTHERS, 78 metadata.getParcelable(METADATA_KEY_RATING)); 79 } 80 if (metadata.containsKey(METADATA_KEY_USER_RATING)) { 81 editor.putObject(MediaMetadataEditor.RATING_KEY_BY_USER, 82 metadata.getParcelable(METADATA_KEY_USER_RATING)); 83 } 84 } 85 86 static class OnMetadataUpdateListener<T extends MediaSessionCompatApi14.Callback> implements 87 RemoteControlClient.OnMetadataUpdateListener { 88 protected final T mCallback; 89 90 public OnMetadataUpdateListener(T callback) { 91 mCallback = callback; 92 } 93 94 @Override 95 public void onMetadataUpdate(int key, Object newValue) { 96 if (key == MediaMetadataEditor.RATING_KEY_BY_USER && newValue instanceof Rating) { 97 mCallback.onSetRating(newValue); 98 } 99 } 100 } 101} 102