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