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