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.Rating; 21import android.media.RemoteControlClient; 22import android.os.Bundle; 23 24public class MediaSessionCompatApi19 { 25 /***** MediaMetadata keys ********/ 26 private static final String METADATA_KEY_ART = "android.media.metadata.ART"; 27 private static final String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART"; 28 private static final String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING"; 29 private static final String METADATA_KEY_RATING = "android.media.metadata.RATING"; 30 31 public static Object createMetadataUpdateListener(MediaSessionCompatApi14.Callback callback) { 32 return new OnMetadataUpdateListener<MediaSessionCompatApi14.Callback>(callback); 33 } 34 35 public static void setMetadata(Object rccObj, Bundle metadata, boolean supportRating) { 36 RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata( 37 true); 38 MediaSessionCompatApi14.buildOldMetadata(metadata, editor); 39 addNewMetadata(metadata, editor); 40 if (supportRating && android.os.Build.VERSION.SDK_INT > 19) { 41 editor.addEditableKey(RemoteControlClient.MetadataEditor.RATING_KEY_BY_USER); 42 } 43 editor.apply(); 44 } 45 46 public static void setOnMetadataUpdateListener(Object rccObj, Object onMetadataUpdateObj) { 47 ((RemoteControlClient) rccObj).setMetadataUpdateListener( 48 (RemoteControlClient.OnMetadataUpdateListener) onMetadataUpdateObj); 49 } 50 51 static void addNewMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) { 52 if (metadata.containsKey(METADATA_KEY_RATING)) { 53 editor.putObject(MediaMetadataEditor.RATING_KEY_BY_OTHERS, 54 metadata.getParcelable(METADATA_KEY_RATING)); 55 } 56 if (metadata.containsKey(METADATA_KEY_USER_RATING)) { 57 editor.putObject(MediaMetadataEditor.RATING_KEY_BY_USER, 58 metadata.getParcelable(METADATA_KEY_USER_RATING)); 59 } 60 if (metadata.containsKey(METADATA_KEY_ART)) { 61 Bitmap art = metadata.getParcelable(METADATA_KEY_ART); 62 editor.putBitmap(MediaMetadataEditor.BITMAP_KEY_ARTWORK, art); 63 } else if (metadata.containsKey(METADATA_KEY_ALBUM_ART)) { 64 // Fall back to album art if the track art wasn't available 65 Bitmap art = metadata.getParcelable(METADATA_KEY_ALBUM_ART); 66 editor.putBitmap(MediaMetadataEditor.BITMAP_KEY_ARTWORK, art); 67 } 68 } 69 70 static class OnMetadataUpdateListener<T extends MediaSessionCompatApi14.Callback> implements 71 RemoteControlClient.OnMetadataUpdateListener { 72 protected final T mCallback; 73 74 public OnMetadataUpdateListener(T callback) { 75 mCallback = callback; 76 } 77 78 @Override 79 public void onMetadataUpdate(int key, Object newValue) { 80 if (key == MediaMetadataEditor.RATING_KEY_BY_USER && newValue instanceof Rating) { 81 mCallback.onSetRating(newValue); 82 } 83 } 84 } 85}