blob: a1506d3f2256d454e0cfadc05b55cc5cfa7ae4c7 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.v4.media;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
import android.media.MediaDescription;
import android.media.browse.MediaBrowser;
import android.media.session.MediaSession;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.service.media.IMediaBrowserService;
import android.service.media.IMediaBrowserServiceCallbacks;
import android.service.media.MediaBrowserService;
import java.util.ArrayList;
import java.util.List;
class MediaBrowserServiceCompatApi21 {
public static Object createService() {
return new MediaBrowserServiceAdaptorApi21();
}
public static void onCreate(Object serviceObj, ServiceImplApi21 serviceImpl) {
((MediaBrowserServiceAdaptorApi21) serviceObj).onCreate(serviceImpl);
}
public static IBinder onBind(Object serviceObj, Intent intent) {
return ((MediaBrowserServiceAdaptorApi21) serviceObj).onBind(intent);
}
public interface ServiceImplApi21 {
void connect(final String pkg, final Bundle rootHints, final ServiceCallbacks callbacks);
void disconnect(final ServiceCallbacks callbacks);
void addSubscription(final String id, final ServiceCallbacks callbacks);
void removeSubscription(final String id, final ServiceCallbacks callbacks);
}
public interface ServiceCallbacks {
IBinder asBinder();
void onConnect(String root, Object session, Bundle extras) throws RemoteException;
void onConnectFailed() throws RemoteException;
void onLoadChildren(String mediaId, List<Parcel> list) throws RemoteException;
}
public static class ServiceCallbacksApi21 implements ServiceCallbacks {
private static final ParceledListSlice sNullParceledListSlice;
static {
MediaDescription nullDescription = new MediaDescription.Builder().setMediaId(
MediaBrowserCompatApi21.NULL_MEDIA_ITEM_ID).build();
MediaBrowser.MediaItem nullMediaItem = new MediaBrowser.MediaItem(nullDescription, 0);
List<MediaBrowser.MediaItem> nullMediaItemList = new ArrayList<>();
nullMediaItemList.add(nullMediaItem);
sNullParceledListSlice = new ParceledListSlice(nullMediaItemList);
}
private final IMediaBrowserServiceCallbacks mCallbacks;
ServiceCallbacksApi21(IMediaBrowserServiceCallbacks callbacks) {
mCallbacks = callbacks;
}
public IBinder asBinder() {
return mCallbacks.asBinder();
}
public void onConnect(String root, Object session, Bundle extras) throws RemoteException {
mCallbacks.onConnect(root, (MediaSession.Token) session, extras);
}
public void onConnectFailed() throws RemoteException {
mCallbacks.onConnectFailed();
}
public void onLoadChildren(String mediaId, List<Parcel> list) throws RemoteException {
List<MediaBrowser.MediaItem> itemList = null;
if (list != null) {
itemList = new ArrayList<>();
for (Parcel parcel : list) {
parcel.setDataPosition(0);
itemList.add(MediaBrowser.MediaItem.CREATOR.createFromParcel(parcel));
parcel.recycle();
}
}
ParceledListSlice<MediaBrowser.MediaItem> pls;
if (Build.VERSION.SDK_INT > 23) {
pls = itemList == null ? null : new ParceledListSlice(itemList);
} else {
pls = itemList == null ? sNullParceledListSlice : new ParceledListSlice(itemList);
}
mCallbacks.onLoadChildren(mediaId, pls);
}
}
static class MediaBrowserServiceAdaptorApi21 {
ServiceBinderProxyApi21 mBinder;
public void onCreate(ServiceImplApi21 serviceImpl) {
mBinder = new ServiceBinderProxyApi21(serviceImpl);
}
public IBinder onBind(Intent intent) {
if (MediaBrowserService.SERVICE_INTERFACE.equals(intent.getAction())) {
return mBinder;
}
return null;
}
static class ServiceBinderProxyApi21 extends IMediaBrowserService.Stub {
final ServiceImplApi21 mServiceImpl;
ServiceBinderProxyApi21(ServiceImplApi21 serviceImpl) {
mServiceImpl = serviceImpl;
}
@Override
public void connect(final String pkg, final Bundle rootHints,
final IMediaBrowserServiceCallbacks callbacks) {
mServiceImpl.connect(pkg, rootHints, new ServiceCallbacksApi21(callbacks));
}
@Override
public void disconnect(final IMediaBrowserServiceCallbacks callbacks) {
mServiceImpl.disconnect(new ServiceCallbacksApi21(callbacks));
}
@Override
public void addSubscription(final String id,
final IMediaBrowserServiceCallbacks callbacks) {
mServiceImpl.addSubscription(id, new ServiceCallbacksApi21(callbacks));
}
@Override
public void removeSubscription(final String id,
final IMediaBrowserServiceCallbacks callbacks) {
mServiceImpl.removeSubscription(id, new ServiceCallbacksApi21(callbacks));
}
@Override
public void getMediaItem(final String mediaId, final ResultReceiver receiver) {
// No operation since this method is added in API 23.
}
}
}
}