MediaBrowserServiceCompatApi21.java revision 9dce8fd27814d2ce8854f21a2725d5f614c5ccf9
1/*
2 * Copyright (C) 2015 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 */
16
17package android.support.v4.media;
18
19import android.content.Intent;
20import android.media.MediaDescription;
21import android.media.browse.MediaBrowser;
22import android.os.Binder;
23import android.os.Build;
24import android.os.Bundle;
25import android.os.IBinder;
26import android.os.Parcel;
27import android.os.RemoteException;
28import android.service.media.MediaBrowserService;
29
30import java.util.ArrayList;
31import java.util.List;
32
33class MediaBrowserServiceCompatApi21 {
34    private static Object sNullParceledListSliceObj;
35    static {
36        MediaDescription nullDescription = new MediaDescription.Builder().setMediaId(
37                MediaBrowserCompatApi21.NULL_MEDIA_ITEM_ID).build();
38        MediaBrowser.MediaItem nullMediaItem = new MediaBrowser.MediaItem(nullDescription, 0);
39        List<MediaBrowser.MediaItem> nullMediaItemList = new ArrayList<>();
40        nullMediaItemList.add(nullMediaItem);
41        sNullParceledListSliceObj = ParceledListSliceAdapterApi21.newInstance(nullMediaItemList);
42    }
43
44    public static Object createService() {
45        return new MediaBrowserServiceAdaptorApi21();
46    }
47
48    public static void onCreate(Object serviceObj, ServiceImplApi21 serviceImpl) {
49        ((MediaBrowserServiceAdaptorApi21) serviceObj).onCreate(serviceImpl);
50    }
51
52    public static IBinder onBind(Object serviceObj, Intent intent) {
53        return ((MediaBrowserServiceAdaptorApi21) serviceObj).onBind(intent);
54    }
55
56    public static Object parcelListToParceledListSliceObject(List<Parcel> list) {
57        if (list == null) {
58            if (Build.VERSION.SDK_INT <= 23) {
59                return sNullParceledListSliceObj;
60            }
61            return null;
62        }
63        List<MediaBrowser.MediaItem> itemList = new ArrayList<>();
64        for (Parcel parcel : list) {
65            parcel.setDataPosition(0);
66            itemList.add(MediaBrowser.MediaItem.CREATOR.createFromParcel(parcel));
67            parcel.recycle();
68        }
69        return ParceledListSliceAdapterApi21.newInstance(itemList);
70    }
71
72    public interface ServiceImplApi21 {
73        void connect(String pkg, Bundle rootHints, ServiceCallbacksApi21 callbacks);
74        void disconnect(ServiceCallbacksApi21 callbacks);
75        void addSubscription(String id, ServiceCallbacksApi21 callbacks);
76        void removeSubscription(String id, ServiceCallbacksApi21 callbacks);
77    }
78
79    public interface ServiceCallbacksApi21 {
80        IBinder asBinder();
81        void onConnect(String root, Object session, Bundle extras) throws RemoteException;
82        void onConnectFailed() throws RemoteException;
83        void onLoadChildren(String mediaId, List<Parcel> list) throws RemoteException;
84    }
85
86    public static class ServiceCallbacksImplApi21 implements ServiceCallbacksApi21 {
87        final IMediaBrowserServiceCallbacksAdapterApi21 mCallbacks;
88
89        ServiceCallbacksImplApi21(Object callbacksObj) {
90            mCallbacks = createCallbacks(callbacksObj);
91        }
92
93        public IBinder asBinder() {
94            return mCallbacks.asBinder();
95        }
96
97        public void onConnect(String root, Object session, Bundle extras) throws RemoteException {
98            mCallbacks.onConnect(root, session, extras);
99        }
100
101        public void onConnectFailed() throws RemoteException {
102            mCallbacks.onConnectFailed();
103        }
104
105        public void onLoadChildren(String mediaId, List<Parcel> list) throws RemoteException {
106            mCallbacks.onLoadChildren(mediaId, parcelListToParceledListSliceObject(list));
107        }
108
109        IMediaBrowserServiceCallbacksAdapterApi21 createCallbacks(Object callbacksObj) {
110            return new IMediaBrowserServiceCallbacksAdapterApi21(callbacksObj);
111        }
112    }
113
114    static class MediaBrowserServiceAdaptorApi21 {
115        Binder mBinder;
116
117        public void onCreate(ServiceImplApi21 serviceImpl) {
118            mBinder = createServiceBinder(serviceImpl);
119        }
120
121        public IBinder onBind(Intent intent) {
122            if (MediaBrowserService.SERVICE_INTERFACE.equals(intent.getAction())) {
123                return mBinder;
124            }
125            return null;
126        }
127
128        protected Binder createServiceBinder(ServiceImplApi21 serviceImpl) {
129            return new IMediaBrowserServiceAdapterApi21(serviceImpl);
130        }
131    }
132}
133