16b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim/* 26b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * Copyright (C) 2015 The Android Open Source Project 36b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * 46b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * Licensed under the Apache License, Version 2.0 (the "License"); 56b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * you may not use this file except in compliance with the License. 66b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * You may obtain a copy of the License at 76b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * 86b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * http://www.apache.org/licenses/LICENSE-2.0 96b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * 106b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * Unless required by applicable law or agreed to in writing, software 116b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * distributed under the License is distributed on an "AS IS" BASIS, 126b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * See the License for the specific language governing permissions and 146b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim * limitations under the License. 156b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim */ 166b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 176b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limpackage android.support.v4.media; 186b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 196b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limimport android.content.ComponentName; 206b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limimport android.content.Context; 216b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limimport android.media.browse.MediaBrowser; 226b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limimport android.os.Bundle; 236b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limimport android.os.Parcel; 246b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limimport android.support.annotation.NonNull; 256b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 266b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limimport java.util.ArrayList; 276b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limimport java.util.List; 286b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 296b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Limclass MediaBrowserCompatApi21 { 30ae6d147640b8a868d2edff8ebac8d2a6bb03c594Sungsoo Lim static final String NULL_MEDIA_ITEM_ID = 31ae6d147640b8a868d2edff8ebac8d2a6bb03c594Sungsoo Lim "android.support.v4.media.MediaBrowserCompat.NULL_MEDIA_ITEM"; 326b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 336b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static Object createConnectionCallback(ConnectionCallback callback) { 346b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim return new ConnectionCallbackProxy<>(callback); 356b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 366b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 376b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static Object createBrowser(Context context, ComponentName serviceComponent, 386b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim Object callback, Bundle rootHints) { 396b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim return new MediaBrowser(context, serviceComponent, 406b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim (MediaBrowser.ConnectionCallback) callback, rootHints); 416b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 426b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 436b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static void connect(Object browserObj) { 446b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim ((MediaBrowser)browserObj).connect(); 456b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 466b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 476b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static void disconnect(Object browserObj) { 486b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim ((MediaBrowser)browserObj).disconnect(); 496b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 506b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 516b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 526b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static boolean isConnected(Object browserObj) { 536b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim return ((MediaBrowser)browserObj).isConnected(); 546b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 556b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 566b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static ComponentName getServiceComponent(Object browserObj) { 576b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim return ((MediaBrowser)browserObj).getServiceComponent(); 586b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 596b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 606b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static String getRoot(Object browserObj) { 616b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim return ((MediaBrowser)browserObj).getRoot(); 626b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 636b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 646b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static Bundle getExtras(Object browserObj) { 656b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim return ((MediaBrowser)browserObj).getExtras(); 666b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 676b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 686b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static Object getSessionToken(Object browserObj) { 696b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim return ((MediaBrowser)browserObj).getSessionToken(); 706b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 716b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 726b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static Object createSubscriptionCallback(SubscriptionCallback callback) { 736b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim return new SubscriptionCallbackProxy<>(callback); 746b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 756b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 766b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static void subscribe( 776b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim Object browserObj, String parentId, Object subscriptionCallbackObj) { 786b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim ((MediaBrowser)browserObj).subscribe(parentId, 796b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim (MediaBrowser.SubscriptionCallback) subscriptionCallbackObj); 806b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 816b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 826b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public static void unsubscribe(Object browserObj, String parentId) { 836b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim ((MediaBrowser)browserObj).unsubscribe(parentId); 846b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 856b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 866b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim interface ConnectionCallback { 876b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim void onConnected(); 886b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim void onConnectionSuspended(); 896b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim void onConnectionFailed(); 906b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 916b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 926b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim static class ConnectionCallbackProxy<T extends ConnectionCallback> 936b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim extends MediaBrowser.ConnectionCallback { 946b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim protected final T mConnectionCallback; 956b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 966b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public ConnectionCallbackProxy(T connectionCallback) { 976b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim mConnectionCallback = connectionCallback; 986b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 996b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 1006b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim @Override 1016b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public void onConnected() { 1026b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim mConnectionCallback.onConnected(); 1036b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 1046b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 1056b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim @Override 1066b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public void onConnectionSuspended() { 1076b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim mConnectionCallback.onConnectionSuspended(); 1086b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 1096b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 1106b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim @Override 1116b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public void onConnectionFailed() { 1126b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim mConnectionCallback.onConnectionFailed(); 1136b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 1146b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 1156b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 1166b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim interface SubscriptionCallback { 117ae6d147640b8a868d2edff8ebac8d2a6bb03c594Sungsoo Lim void onChildrenLoaded(@NonNull String parentId, List<Parcel> children); 1186b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim void onError(@NonNull String parentId); 1196b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 1206b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 1216b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim static class SubscriptionCallbackProxy<T extends SubscriptionCallback> 1226b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim extends MediaBrowser.SubscriptionCallback { 1236b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim protected final T mSubscriptionCallback; 1246b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 1256b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public SubscriptionCallbackProxy(T callback) { 1266b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim mSubscriptionCallback = callback; 1276b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 1286b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 1296b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim @Override 1306b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public void onChildrenLoaded(@NonNull String parentId, 131ae6d147640b8a868d2edff8ebac8d2a6bb03c594Sungsoo Lim List<MediaBrowser.MediaItem> children) { 132a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim mSubscriptionCallback.onChildrenLoaded(parentId, itemListToParcelList(children)); 1336b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 1346b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim 1356b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim @Override 1366b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim public void onError(@NonNull String parentId) { 1376b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim mSubscriptionCallback.onError(parentId); 1386b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 139a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim 140a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim static List<Parcel> itemListToParcelList(List<MediaBrowser.MediaItem> itemList) { 141a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim if (itemList == null || (itemList.size() == 1 142a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim && itemList.get(0).getMediaId().equals(NULL_MEDIA_ITEM_ID))) { 143a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim return null; 144a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim } 145a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim List<Parcel> parcelList = new ArrayList<>(); 146a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim for (MediaBrowser.MediaItem item : itemList) { 147a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim Parcel parcel = Parcel.obtain(); 148a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim item.writeToParcel(parcel, 0); 149a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim parcelList.add(parcel); 150a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim } 151a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim return parcelList; 152a7a03ae00cf642cb470e04c9a2164bad35627dbfSungsoo Lim } 1536b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim } 1546b565ded51fc2e48e9d5ac652e1fbf3d9255dd3eSungsoo Lim} 155