MediaSessionCompatApi19.java revision b3f8fe700dd755bf26475c16422e401d7ccd0a44
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; 205c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.Rating; 215c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.media.RemoteControlClient; 225c9469e010106467791b47b0fa83efda84491a21RoboErikimport android.os.Bundle; 235c9469e010106467791b47b0fa83efda84491a21RoboErik 245c9469e010106467791b47b0fa83efda84491a21RoboErikpublic class MediaSessionCompatApi19 { 255c9469e010106467791b47b0fa83efda84491a21RoboErik /***** MediaMetadata keys ********/ 265c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_ART = "android.media.metadata.ART"; 275c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART"; 285c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING"; 295c9469e010106467791b47b0fa83efda84491a21RoboErik private static final String METADATA_KEY_RATING = "android.media.metadata.RATING"; 305c9469e010106467791b47b0fa83efda84491a21RoboErik 315c9469e010106467791b47b0fa83efda84491a21RoboErik public static Object createMetadataUpdateListener(MediaSessionCompatApi14.Callback callback) { 325c9469e010106467791b47b0fa83efda84491a21RoboErik return new OnMetadataUpdateListener<MediaSessionCompatApi14.Callback>(callback); 335c9469e010106467791b47b0fa83efda84491a21RoboErik } 345c9469e010106467791b47b0fa83efda84491a21RoboErik 355c9469e010106467791b47b0fa83efda84491a21RoboErik public static void setMetadata(Object rccObj, Bundle metadata, boolean supportRating) { 365c9469e010106467791b47b0fa83efda84491a21RoboErik RemoteControlClient.MetadataEditor editor = ((RemoteControlClient) rccObj).editMetadata( 375c9469e010106467791b47b0fa83efda84491a21RoboErik true); 385c9469e010106467791b47b0fa83efda84491a21RoboErik MediaSessionCompatApi14.buildOldMetadata(metadata, editor); 395c9469e010106467791b47b0fa83efda84491a21RoboErik addNewMetadata(metadata, editor); 405c9469e010106467791b47b0fa83efda84491a21RoboErik if (supportRating && android.os.Build.VERSION.SDK_INT > 19) { 415c9469e010106467791b47b0fa83efda84491a21RoboErik editor.addEditableKey(RemoteControlClient.MetadataEditor.RATING_KEY_BY_USER); 425c9469e010106467791b47b0fa83efda84491a21RoboErik } 435c9469e010106467791b47b0fa83efda84491a21RoboErik editor.apply(); 445c9469e010106467791b47b0fa83efda84491a21RoboErik } 455c9469e010106467791b47b0fa83efda84491a21RoboErik 465c9469e010106467791b47b0fa83efda84491a21RoboErik public static void setOnMetadataUpdateListener(Object rccObj, Object onMetadataUpdateObj) { 475c9469e010106467791b47b0fa83efda84491a21RoboErik ((RemoteControlClient) rccObj).setMetadataUpdateListener( 485c9469e010106467791b47b0fa83efda84491a21RoboErik (RemoteControlClient.OnMetadataUpdateListener) onMetadataUpdateObj); 495c9469e010106467791b47b0fa83efda84491a21RoboErik } 505c9469e010106467791b47b0fa83efda84491a21RoboErik 515c9469e010106467791b47b0fa83efda84491a21RoboErik static void addNewMetadata(Bundle metadata, RemoteControlClient.MetadataEditor editor) { 52b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake if (metadata == null) { 53b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake return; 54b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake } 555c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_RATING)) { 565c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putObject(MediaMetadataEditor.RATING_KEY_BY_OTHERS, 575c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getParcelable(METADATA_KEY_RATING)); 585c9469e010106467791b47b0fa83efda84491a21RoboErik } 595c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_USER_RATING)) { 605c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putObject(MediaMetadataEditor.RATING_KEY_BY_USER, 615c9469e010106467791b47b0fa83efda84491a21RoboErik metadata.getParcelable(METADATA_KEY_USER_RATING)); 625c9469e010106467791b47b0fa83efda84491a21RoboErik } 635c9469e010106467791b47b0fa83efda84491a21RoboErik if (metadata.containsKey(METADATA_KEY_ART)) { 645c9469e010106467791b47b0fa83efda84491a21RoboErik Bitmap art = metadata.getParcelable(METADATA_KEY_ART); 655c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putBitmap(MediaMetadataEditor.BITMAP_KEY_ARTWORK, art); 665c9469e010106467791b47b0fa83efda84491a21RoboErik } else if (metadata.containsKey(METADATA_KEY_ALBUM_ART)) { 675c9469e010106467791b47b0fa83efda84491a21RoboErik // Fall back to album art if the track art wasn't available 685c9469e010106467791b47b0fa83efda84491a21RoboErik Bitmap art = metadata.getParcelable(METADATA_KEY_ALBUM_ART); 695c9469e010106467791b47b0fa83efda84491a21RoboErik editor.putBitmap(MediaMetadataEditor.BITMAP_KEY_ARTWORK, art); 705c9469e010106467791b47b0fa83efda84491a21RoboErik } 715c9469e010106467791b47b0fa83efda84491a21RoboErik } 725c9469e010106467791b47b0fa83efda84491a21RoboErik 735c9469e010106467791b47b0fa83efda84491a21RoboErik static class OnMetadataUpdateListener<T extends MediaSessionCompatApi14.Callback> implements 745c9469e010106467791b47b0fa83efda84491a21RoboErik RemoteControlClient.OnMetadataUpdateListener { 755c9469e010106467791b47b0fa83efda84491a21RoboErik protected final T mCallback; 765c9469e010106467791b47b0fa83efda84491a21RoboErik 775c9469e010106467791b47b0fa83efda84491a21RoboErik public OnMetadataUpdateListener(T callback) { 785c9469e010106467791b47b0fa83efda84491a21RoboErik mCallback = callback; 795c9469e010106467791b47b0fa83efda84491a21RoboErik } 805c9469e010106467791b47b0fa83efda84491a21RoboErik 815c9469e010106467791b47b0fa83efda84491a21RoboErik @Override 825c9469e010106467791b47b0fa83efda84491a21RoboErik public void onMetadataUpdate(int key, Object newValue) { 835c9469e010106467791b47b0fa83efda84491a21RoboErik if (key == MediaMetadataEditor.RATING_KEY_BY_USER && newValue instanceof Rating) { 845c9469e010106467791b47b0fa83efda84491a21RoboErik mCallback.onSetRating(newValue); 855c9469e010106467791b47b0fa83efda84491a21RoboErik } 865c9469e010106467791b47b0fa83efda84491a21RoboErik } 875c9469e010106467791b47b0fa83efda84491a21RoboErik } 88b3f8fe700dd755bf26475c16422e401d7ccd0a44Ian Lake} 89