1900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim/*
2900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim * Copyright (C) 2016 The Android Open Source Project
3900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim *
4900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim * Licensed under the Apache License, Version 2.0 (the "License");
5900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim * you may not use this file except in compliance with the License.
6900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim * You may obtain a copy of the License at
7900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim *
8900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim *      http://www.apache.org/licenses/LICENSE-2.0
9900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim *
10900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim * Unless required by applicable law or agreed to in writing, software
11900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim * distributed under the License is distributed on an "AS IS" BASIS,
12900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim * See the License for the specific language governing permissions and
14900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim * limitations under the License.
15900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim */
16900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
17900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limpackage android.support.v4.media;
18900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
19900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limimport android.content.Context;
20900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limimport android.media.browse.MediaBrowser;
21900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limimport android.os.Bundle;
22900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limimport android.os.Parcel;
23900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limimport android.service.media.MediaBrowserService;
24900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limimport android.util.Log;
25900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
26900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limimport java.lang.reflect.Field;
27900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limimport java.util.ArrayList;
28900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limimport java.util.List;
29900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
30900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Limclass MediaBrowserServiceCompatApi24 {
31900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    private static final String TAG = "MBSCompatApi24";
32900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
33900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    private static Field sResultFlags;
34900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    static {
35900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        try {
36900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            sResultFlags = MediaBrowserService.Result.class.getDeclaredField("mFlags");
37900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            sResultFlags.setAccessible(true);
38900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        } catch (NoSuchFieldException e) {
39900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            Log.w(TAG, e);
40900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        }
41900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    }
42900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
43900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    public static Object createService(Context context, ServiceCompatProxy serviceProxy) {
44900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        return new MediaBrowserServiceAdaptor(context, serviceProxy);
45900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    }
46900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
47900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    public static void notifyChildrenChanged(Object serviceObj, String parentId, Bundle options) {
48900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        ((MediaBrowserService) serviceObj).notifyChildrenChanged(parentId, options);
49900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    }
50900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
51fda621da7916073852394d14fcd2cb37f202287dSungsoo Lim    public static Bundle getBrowserRootHints(Object serviceObj) {
52fda621da7916073852394d14fcd2cb37f202287dSungsoo Lim        return ((MediaBrowserService) serviceObj).getBrowserRootHints();
53fda621da7916073852394d14fcd2cb37f202287dSungsoo Lim    }
54fda621da7916073852394d14fcd2cb37f202287dSungsoo Lim
552e7d3a28e00195c160cc4f5668e2d7f64eb590daSungsoo Lim    public interface ServiceCompatProxy extends MediaBrowserServiceCompatApi23.ServiceCompatProxy {
56900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        void onLoadChildren(String parentId, ResultWrapper result, Bundle options);
57900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    }
58900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
59900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    static class ResultWrapper {
60900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        MediaBrowserService.Result mResultObj;
61900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
62900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        ResultWrapper(MediaBrowserService.Result result) {
63900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            mResultObj = result;
64900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        }
65900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
66900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        public void sendResult(List<Parcel> result, int flags) {
67900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            try {
68900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim                sResultFlags.setInt(mResultObj, flags);
69900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            } catch (IllegalAccessException e) {
70900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim                Log.w(TAG, e);
71900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            }
72900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            mResultObj.sendResult(parcelListToItemList(result));
73900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        }
74900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
75900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        public void detach() {
76900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            mResultObj.detach();
77900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        }
78900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
79900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        List<MediaBrowser.MediaItem> parcelListToItemList(List<Parcel> parcelList) {
80900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            if (parcelList == null) {
81900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim                return null;
82900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            }
83900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            List<MediaBrowser.MediaItem> items = new ArrayList<>();
84900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            for (Parcel parcel : parcelList) {
85900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim                parcel.setDataPosition(0);
86900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim                items.add(MediaBrowser.MediaItem.CREATOR.createFromParcel(parcel));
87900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim                parcel.recycle();
88900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            }
89900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            return items;
90900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        }
91900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    }
92900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
93900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    static class MediaBrowserServiceAdaptor extends
942e7d3a28e00195c160cc4f5668e2d7f64eb590daSungsoo Lim            MediaBrowserServiceCompatApi23.MediaBrowserServiceAdaptor {
95900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        MediaBrowserServiceAdaptor(Context context, ServiceCompatProxy serviceWrapper) {
96900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            super(context, serviceWrapper);
97900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        }
98900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim
99900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        @Override
100900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        public void onLoadChildren(String parentId, Result<List<MediaBrowser.MediaItem>> result,
101900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim                Bundle options) {
102900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim            ((ServiceCompatProxy) mServiceProxy).onLoadChildren(
103900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim                    parentId, new ResultWrapper(result), options);
104900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim        }
105900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim    }
106900e852d4f8b423ec2d8374f8e6743129e8f331bSungsoo Lim}
107