diff options
| author | Sungsoo Lim <sungsoo@google.com> | 2015-10-30 04:12:05 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-10-30 04:12:05 +0000 |
| commit | 6b405b82065f6bfdfde43fe1a91111a76da160f4 (patch) | |
| tree | 193b5d2c61045852c2ef961024350b763a6e561d /v4/java/android | |
| parent | 25e01ca9bf8fb694671ab5dbd85a4ed4e94b975a (diff) | |
| parent | 82cf659fd8dcc28e182274b17a401023ab879dea (diff) | |
| download | android_frameworks_support-6b405b82065f6bfdfde43fe1a91111a76da160f4.tar.gz android_frameworks_support-6b405b82065f6bfdfde43fe1a91111a76da160f4.tar.bz2 android_frameworks_support-6b405b82065f6bfdfde43fe1a91111a76da160f4.zip | |
Merge "Support API 23 methods in MBC and MBSC" into mnc-ub-dev
Diffstat (limited to 'v4/java/android')
3 files changed, 350 insertions, 83 deletions
diff --git a/v4/java/android/support/v4/media/MediaBrowserCompat.java b/v4/java/android/support/v4/media/MediaBrowserCompat.java index 4884cf27be..d46dc65009 100644 --- a/v4/java/android/support/v4/media/MediaBrowserCompat.java +++ b/v4/java/android/support/v4/media/MediaBrowserCompat.java @@ -31,6 +31,7 @@ import android.os.RemoteException; import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.BundleCompat; import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.os.ResultReceiver; import android.support.v4.util.ArrayMap; @@ -43,6 +44,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static android.support.v4.media.MediaBrowserProtocol.*; + /** * Browses media content offered by a {@link MediaBrowserServiceCompat}. * <p> @@ -52,13 +55,7 @@ import java.util.List; * @hide */ public final class MediaBrowserCompat { - public static final String DATA_RESULT_RECEIVER = "data_result_receiver"; - - // TODO: Consider introducing version numbers for MediaBrowserCompat and - // MediaBrowserServiceCompat. - public static final int MSG_ON_CONNECT = 1; - public static final int MSG_ON_CONNECT_FAILED = 2; - public static final int MSG_ON_LOAD_CHILDREN = 3; + private static final String TAG = "MediaBrowserCompat"; private final MediaBrowserImpl mImpl; @@ -75,8 +72,9 @@ public final class MediaBrowserCompat { */ public MediaBrowserCompat(Context context, ComponentName serviceComponent, ConnectionCallback callback, Bundle rootHints) { - // TODO: Implement MediaBrowserImplApi23. - if (android.os.Build.VERSION.SDK_INT >= 21) { + if (android.os.Build.VERSION.SDK_INT >= 23) { + mImpl = new MediaBrowserImplApi23(context, serviceComponent, callback, rootHints); + } else if (android.os.Build.VERSION.SDK_INT >= 21) { mImpl = new MediaBrowserImplApi21(context, serviceComponent, callback, rootHints); } else { mImpl = new MediaBrowserImplBase(context, serviceComponent, callback, rootHints); @@ -442,6 +440,16 @@ public final class MediaBrowserCompat { * Callback for receiving the result of {@link #getItem}. */ public static abstract class ItemCallback { + final Object mItemCallbackObj; + + public ItemCallback() { + if (android.os.Build.VERSION.SDK_INT >= 23) { + mItemCallbackObj = MediaBrowserCompatApi23.createItemCallback(new StubApi23()); + } else { + mItemCallbackObj = null; + } + } + /** * Called when the item has been returned by the browser service. * @@ -457,6 +465,21 @@ public final class MediaBrowserCompat { */ public void onError(@NonNull String itemId) { } + + private class StubApi23 implements MediaBrowserCompatApi23.ItemCallback { + @Override + public void onItemLoaded(Parcel itemParcel) { + itemParcel.setDataPosition(0); + MediaItem item = MediaBrowserCompat.MediaItem.CREATOR.createFromParcel(itemParcel); + itemParcel.recycle(); + ItemCallback.this.onItemLoaded(item); + } + + @Override + public void onError(@NonNull String itemId) { + ItemCallback.this.onError(itemId); + } + } } interface MediaBrowserImpl { @@ -473,7 +496,6 @@ public final class MediaBrowserCompat { } static class MediaBrowserImplBase implements MediaBrowserImpl { - private static final String TAG = "MediaBrowserCompat"; private static final boolean DBG = false; private static final int CONNECT_STATE_DISCONNECTED = 0; @@ -831,30 +853,30 @@ public final class MediaBrowserCompat { private final void onLoadChildren(final Messenger callback, final String parentId, final List list) { - // Check that there hasn't been a disconnect or a different ServiceConnection. - if (!isCurrent(callback, "onLoadChildren")) { - return; - } - - List<MediaItem> data = list; - if (DBG) { - Log.d(TAG, "onLoadChildren for " + mServiceComponent + " id=" + parentId); - } - if (data == null) { - data = Collections.emptyList(); - } + // Check that there hasn't been a disconnect or a different ServiceConnection. + if (!isCurrent(callback, "onLoadChildren")) { + return; + } - // Check that the subscription is still subscribed. - final Subscription subscription = mSubscriptions.get(parentId); - if (subscription == null) { + List<MediaItem> data = list; if (DBG) { - Log.d(TAG, "onLoadChildren for id that isn't subscribed id=" + parentId); + Log.d(TAG, "onLoadChildren for " + mServiceComponent + " id=" + parentId); + } + if (data == null) { + data = Collections.emptyList(); } - return; - } - // Tell the app. - subscription.callback.onChildrenLoaded(parentId, data); + // Check that the subscription is still subscribed. + final Subscription subscription = mSubscriptions.get(parentId); + if (subscription == null) { + if (DBG) { + Log.d(TAG, "onLoadChildren for id that isn't subscribed id=" + parentId); + } + return; + } + + // Tell the app. + subscription.callback.onChildrenLoaded(parentId, data); } /** @@ -896,35 +918,33 @@ public final class MediaBrowserCompat { } void connect() throws RemoteException { - sendRequest(MediaBrowserServiceCompat.MSG_CONNECT, mContext.getPackageName(), - mRootHints, mCallbacksMessenger); + sendRequest(CLIENT_MSG_CONNECT, mContext.getPackageName(), mRootHints, + mCallbacksMessenger); } void disconnect() throws RemoteException { - sendRequest(MediaBrowserServiceCompat.MSG_DISCONNECT, null, null, - mCallbacksMessenger); + sendRequest(CLIENT_MSG_DISCONNECT, null, null, mCallbacksMessenger); } void addSubscription(String parentId) throws RemoteException { - sendRequest(MediaBrowserServiceCompat.MSG_ADD_SUBSCRIPTION, parentId, null, - mCallbacksMessenger); + sendRequest(CLIENT_MSG_ADD_SUBSCRIPTION, parentId, null, mCallbacksMessenger); } void removeSubscription(String parentId) throws RemoteException { - sendRequest(MediaBrowserServiceCompat.MSG_REMOVE_SUBSCRIPTION, parentId, null, - mCallbacksMessenger); + sendRequest(CLIENT_MSG_REMOVE_SUBSCRIPTION, parentId, null, mCallbacksMessenger); } void getMediaItem(String mediaId, ResultReceiver receiver) throws RemoteException { Bundle data = new Bundle(); - data.putParcelable(DATA_RESULT_RECEIVER, receiver); - sendRequest(MediaBrowserServiceCompat.MSG_GET_MEDIA_ITEM, mediaId, data, null); + data.putParcelable(SERVICE_DATA_RESULT_RECEIVER, receiver); + sendRequest(CLIENT_MSG_GET_MEDIA_ITEM, mediaId, data, null); } private void sendRequest(int what, Object obj, Bundle data, Messenger cbMessenger) throws RemoteException { Message msg = Message.obtain(); msg.what = what; + msg.arg1 = CLIENT_VERSION_CURRENT; msg.obj = obj; msg.setData(data); msg.replyTo = cbMessenger; @@ -1023,22 +1043,23 @@ public final class MediaBrowserCompat { public void handleMessage(Message msg) { Bundle data = msg.getData(); switch (msg.what) { - case MSG_ON_CONNECT: + case SERVICE_MSG_ON_CONNECT: onServiceConnected(mCallbacksMessenger, (String) msg.obj, (MediaSessionCompat.Token) data.getParcelable( - MediaBrowserServiceCompat.DATA_MEDIA_SESSION_TOKEN), - data.getBundle(MediaBrowserServiceCompat.DATA_EXTRAS)); + SERVICE_DATA_MEDIA_SESSION_TOKEN), + data.getBundle(SERVICE_DATA_EXTRAS)); break; - case MSG_ON_CONNECT_FAILED: + case SERVICE_MSG_ON_CONNECT_FAILED: onConnectionFailed(mCallbacksMessenger); break; - case MSG_ON_LOAD_CHILDREN: + case SERVICE_MSG_ON_LOAD_CHILDREN: onLoadChildren(mCallbacksMessenger, (String) msg.obj, - data.getParcelableArrayList( - MediaBrowserServiceCompat.DATA_MEDIA_ITEM_LIST)); + data.getParcelableArrayList(SERVICE_DATA_MEDIA_ITEM_LIST)); break; default: - super.handleMessage(msg); + Log.w(TAG, "Unhandled message: " + msg + + "\n Client version: " + CLIENT_VERSION_CURRENT + + "\n Service version: " + msg.arg1); } } } @@ -1054,7 +1075,9 @@ public final class MediaBrowserCompat { } static class MediaBrowserImplApi21 implements MediaBrowserImpl { - Object mBrowserObj; + protected Object mBrowserObj; + protected Messenger mMessenger; + protected Handler mHandler = new Handler(); public MediaBrowserImplApi21(Context context, ComponentName serviceComponent, ConnectionCallback callback, Bundle rootHints) { @@ -1113,9 +1136,93 @@ public final class MediaBrowserCompat { } @Override + public void getItem(@NonNull final String mediaId, @NonNull final ItemCallback cb) { + if (TextUtils.isEmpty(mediaId)) { + throw new IllegalArgumentException("mediaId is empty."); + } + if (cb == null) { + throw new IllegalArgumentException("cb is null."); + } + if (!MediaBrowserCompatApi21.isConnected(mBrowserObj)) { + Log.i(TAG, "Not connected, unable to retrieve the MediaItem."); + mHandler.post(new Runnable() { + @Override + public void run() { + cb.onError(mediaId); + } + }); + return; + } + if (mMessenger == null) { + Bundle extras = MediaBrowserCompatApi21.getExtras(mBrowserObj); + IBinder serviceBinder = BundleCompat.getBinder(extras, EXTRA_MESSENGER_BINDER); + if (serviceBinder != null) { + mMessenger = new Messenger(serviceBinder); + } + } + if (mMessenger == null) { + mHandler.post(new Runnable() { + @Override + public void run() { + // Default framework implementation. + cb.onItemLoaded(null); + } + }); + return; + } + ResultReceiver receiver = new ResultReceiver(mHandler) { + @Override + protected void onReceiveResult(int resultCode, Bundle resultData) { + if (resultCode != 0 || resultData == null + || !resultData.containsKey(MediaBrowserServiceCompat.KEY_MEDIA_ITEM)) { + cb.onError(mediaId); + return; + } + Parcelable item = + resultData.getParcelable(MediaBrowserServiceCompat.KEY_MEDIA_ITEM); + if (!(item instanceof MediaItem)) { + cb.onError(mediaId); + return; + } + cb.onItemLoaded((MediaItem)item); + } + }; + try { + Bundle data = new Bundle(); + data.putParcelable(SERVICE_DATA_RESULT_RECEIVER, receiver); + sendRequest(CLIENT_MSG_GET_MEDIA_ITEM, mediaId, data, null); + } catch (RemoteException e) { + Log.i(TAG, "Remote error getting media item."); + mHandler.post(new Runnable() { + @Override + public void run() { + cb.onError(mediaId); + } + }); + } + } + + private void sendRequest(int what, Object obj, Bundle data, Messenger cbMessenger) + throws RemoteException { + Message msg = Message.obtain(); + msg.what = what; + msg.arg1 = CLIENT_VERSION_CURRENT; + msg.obj = obj; + msg.setData(data); + msg.replyTo = cbMessenger; + mMessenger.send(msg); + } + } + + static class MediaBrowserImplApi23 extends MediaBrowserImplApi21 { + public MediaBrowserImplApi23(Context context, ComponentName serviceComponent, + ConnectionCallback callback, Bundle rootHints) { + super(context, serviceComponent, callback, rootHints); + } + + @Override public void getItem(@NonNull String mediaId, @NonNull ItemCallback cb) { - // TODO Implement individual item loading on API 21-22 devices - cb.onItemLoaded(null); + MediaBrowserCompatApi23.getItem(mBrowserObj, mediaId, cb.mItemCallbackObj); } } } diff --git a/v4/java/android/support/v4/media/MediaBrowserProtocol.java b/v4/java/android/support/v4/media/MediaBrowserProtocol.java new file mode 100644 index 0000000000..7c8feb31c4 --- /dev/null +++ b/v4/java/android/support/v4/media/MediaBrowserProtocol.java @@ -0,0 +1,126 @@ +/* + * 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; + +/*** + * Defines the communication protocol for media browsers and media browser services. + * @hide + */ +class MediaBrowserProtocol { + + /** + * MediaBrowserCompat will check the version of the connected MediaBrowserServiceCompat, + * and it will not send messages if they are introduced in the higher version of the + * MediaBrowserServiceCompat. + */ + public static final int SERVICE_VERSION_1 = 1; + public static final int SERVICE_VERSION_CURRENT = SERVICE_VERSION_1; + + /* + * Messages sent from the media browser service compat to the media browser compat. + * (Compat implementation for IMediaBrowserServiceCallbacks) + * DO NOT RENUMBER THESE! + */ + + /** (service v1) + * Sent after {@link MediaBrowserCompat#connect()} when the request has successfully + * completed. + * - arg1 : The service version + * - obj : The root media item id + * - data + * SERVICE_DATA_MEDIA_SESSION_TOKEN : Media session token + * SERVICE_DATA_EXTRAS : An extras bundle which contains EXTRA_SERVICE_VERSION + */ + public static final int SERVICE_MSG_ON_CONNECT = 1; + + /** (service v1) + * Sent after {@link MediaBrowserCompat#connect()} when the connection to the media browser + * failed. + * - arg1 : service version + */ + public static final int SERVICE_MSG_ON_CONNECT_FAILED = 2; + + /** (service v1) + * Sent when the list of children is loaded or updated. + * - arg1 : The service version + * - obj : The parent media item id + * - data + * SERVICE_DATA_MEDIA_ITEM_LIST : An array list for the media item children + */ + public static final int SERVICE_MSG_ON_LOAD_CHILDREN = 3; + + public static final String SERVICE_DATA_MEDIA_SESSION_TOKEN = "data_media_session_token"; + public static final String SERVICE_DATA_EXTRAS = "data_extras"; + public static final String SERVICE_DATA_MEDIA_ITEM_LIST = "data_media_item_list"; + public static final String SERVICE_DATA_RESULT_RECEIVER = "data_result_receiver"; + + public static final String EXTRA_SERVICE_VERSION = "extra_service_version"; + public static final String EXTRA_MESSENGER_BINDER = "extra_messenger"; + + /** + * MediaBrowserServiceCompat will check the version of the MediaBrowserCompat, and it will not + * send messages if they are introduced in the higher version of the MediaBrowserCompat. + */ + public static final int CLIENT_VERSION_1 = 1; + public static final int CLIENT_VERSION_CURRENT = CLIENT_VERSION_1; + + /* + * Messages sent from the media browser compat to the media browser service compat. + * (Compat implementation for IMediaBrowserService) + * DO NOT RENUMBER THESE! + */ + + /** (client v1) + * Sent to connect to the media browse service compat. + * - arg1 : The client version + * - obj : The package name + * - data : An optional root hints bundle of service-specific arguments + * - replayTo : Client messenger + */ + public static final int CLIENT_MSG_CONNECT = 1; + + /** (client v1) + * Sent to disconnect from the media browse service compat. + * - arg1 : The client version + * - replayTo : Client messenger + */ + public static final int CLIENT_MSG_DISCONNECT = 2; + + /** (client v1) + * Sent to subscribe for changes to the children of the specified media id. + * - arg1 : The client version + * - obj : The media item id + * - replayTo : Client messenger + */ + public static final int CLIENT_MSG_ADD_SUBSCRIPTION = 3; + + /** (client v1) + * Sent to unsubscribe for changes to the children of the specified media id. + * - arg1 : The client version + * - obj : The media item id + * - replayTo : Client messenger + */ + public static final int CLIENT_MSG_REMOVE_SUBSCRIPTION = 4; + + /** (client v1) + * Sent to retrieves a specific media item from the connected service. + * - arg1 : The client version + * - obj : The media item id + * - data + * SERVICE_DATA_RESULT_RECEIVER : Result receiver to get the result + */ + public static final int CLIENT_MSG_GET_MEDIA_ITEM = 5; +} diff --git a/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java b/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java index ded7e7ef24..c618e4bce5 100644 --- a/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java +++ b/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java @@ -30,6 +30,7 @@ import android.os.Parcel; import android.os.RemoteException; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.BundleCompat; import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.os.ResultReceiver; import android.support.v4.util.ArrayMap; @@ -42,6 +43,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import static android.support.v4.media.MediaBrowserProtocol.*; + /** * Base class for media browse services. * <p> @@ -68,16 +71,6 @@ public abstract class MediaBrowserServiceCompat extends Service { private static final String TAG = "MediaBrowserServiceCompat"; private static final boolean DBG = false; - public static final String DATA_MEDIA_SESSION_TOKEN = "data_media_session_token"; - public static final String DATA_EXTRAS = "data_extras"; - public static final String DATA_MEDIA_ITEM_LIST = "data_media_item_list"; - - public static final int MSG_CONNECT = 1; - public static final int MSG_DISCONNECT = 2; - public static final int MSG_ADD_SUBSCRIPTION = 3; - public static final int MSG_REMOVE_SUBSCRIPTION = 4; - public static final int MSG_GET_MEDIA_ITEM = 5; - private MediaBrowserServiceImpl mImpl; /** @@ -124,8 +117,7 @@ public abstract class MediaBrowserServiceCompat extends Service { @Override public void onCreate() { mServiceObj = MediaBrowserServiceCompatApi21.createService(); - MediaBrowserServiceCompatApi21.onCreate(mServiceObj, - new ServiceImplApi21(mHandler.getServiceImpl())); + MediaBrowserServiceCompatApi21.onCreate(mServiceObj, new ServiceImplApi21()); } @Override @@ -134,33 +126,50 @@ public abstract class MediaBrowserServiceCompat extends Service { } } + class MediaBrowserServiceImplApi23 implements MediaBrowserServiceImpl { + private Object mServiceObj; + + @Override + public void onCreate() { + mServiceObj = MediaBrowserServiceCompatApi23.createService(); + MediaBrowserServiceCompatApi23.onCreate(mServiceObj, new ServiceImplApi23()); + } + + @Override + public IBinder onBind(Intent intent) { + return MediaBrowserServiceCompatApi23.onBind(mServiceObj, intent); + } + } + private final class ServiceHandler extends Handler { private final ServiceImpl mServiceImpl = new ServiceImpl(); @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_CONNECT: + case CLIENT_MSG_CONNECT: mServiceImpl.connect((String) msg.obj, msg.getData(), new ServiceCallbacksCompat(msg.replyTo)); break; - case MSG_DISCONNECT: + case CLIENT_MSG_DISCONNECT: mServiceImpl.disconnect(new ServiceCallbacksCompat(msg.replyTo)); break; - case MSG_ADD_SUBSCRIPTION: + case CLIENT_MSG_ADD_SUBSCRIPTION: mServiceImpl.addSubscription((String) msg.obj, new ServiceCallbacksCompat(msg.replyTo)); break; - case MSG_REMOVE_SUBSCRIPTION: + case CLIENT_MSG_REMOVE_SUBSCRIPTION: mServiceImpl.removeSubscription((String) msg.obj, new ServiceCallbacksCompat(msg.replyTo)); break; - case MSG_GET_MEDIA_ITEM: + case CLIENT_MSG_GET_MEDIA_ITEM: mServiceImpl.getMediaItem((String) msg.obj, (ResultReceiver) msg.getData() - .getParcelable(MediaBrowserCompat.DATA_RESULT_RECEIVER)); + .getParcelable(SERVICE_DATA_RESULT_RECEIVER)); break; default: - super.handleMessage(msg); + Log.w(TAG, "Unhandled message: " + msg + + "\n Service version: " + SERVICE_VERSION_CURRENT + + "\n Client version: " + msg.arg1); } } @@ -371,11 +380,11 @@ public abstract class MediaBrowserServiceCompat extends Service { } } - private class ServiceImplApi21 implements MediaBrowserServiceCompatApi21.ServiceImpl { + private class ServiceImplApi21 implements MediaBrowserServiceCompatApi21.ServiceImplApi21 { final ServiceImpl mServiceImpl; - ServiceImplApi21(ServiceImpl serviceImpl) { - mServiceImpl = serviceImpl; + ServiceImplApi21() { + mServiceImpl = mHandler.getServiceImpl(); } @Override @@ -401,13 +410,23 @@ public abstract class MediaBrowserServiceCompat extends Service { final MediaBrowserServiceCompatApi21.ServiceCallbacks callbacks) { mServiceImpl.removeSubscription(id, new ServiceCallbacksApi21(callbacks)); } + } + private class ServiceImplApi23 extends ServiceImplApi21 + implements MediaBrowserServiceCompatApi23.ServiceImplApi23 { @Override - public void getMediaItem(final String mediaId, final android.os.ResultReceiver receiver) { + public void getMediaItem(final String mediaId, + final MediaBrowserServiceCompatApi23.ItemCallback cb) { ResultReceiver receiverCompat = new ResultReceiver(mHandler) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { - receiver.send(resultCode, resultData); + MediaBrowserCompat.MediaItem item = resultData.getParcelable(KEY_MEDIA_ITEM); + Parcel itemParcel = null; + if (item != null) { + itemParcel = Parcel.obtain(); + item.writeToParcel(itemParcel, 0); + } + cb.onItemLoaded(resultCode, resultData, itemParcel); } }; mServiceImpl.getMediaItem(mediaId, receiverCompat); @@ -436,27 +455,33 @@ public abstract class MediaBrowserServiceCompat extends Service { public void onConnect(String root, MediaSessionCompat.Token session, Bundle extras) throws RemoteException { + if (extras == null) { + extras = new Bundle(); + } + extras.putInt(EXTRA_SERVICE_VERSION, SERVICE_VERSION_CURRENT); Bundle data = new Bundle(); - data.putParcelable(DATA_MEDIA_SESSION_TOKEN, session); - data.putBundle(DATA_EXTRAS, extras); - sendRequest(MediaBrowserCompat.MSG_ON_CONNECT, root, data); + data.putParcelable(SERVICE_DATA_MEDIA_SESSION_TOKEN, session); + data.putBundle(SERVICE_DATA_EXTRAS, extras); + sendRequest(SERVICE_MSG_ON_CONNECT, root, data); } public void onConnectFailed() throws RemoteException { - sendRequest(MediaBrowserCompat.MSG_ON_CONNECT_FAILED, null, null); + sendRequest(SERVICE_MSG_ON_CONNECT_FAILED, null, null); } public void onLoadChildren(String mediaId, List<MediaBrowserCompat.MediaItem> list) throws RemoteException { Bundle data = new Bundle(); - data.putParcelableArrayList(DATA_MEDIA_ITEM_LIST, + data.putParcelableArrayList(SERVICE_DATA_MEDIA_ITEM_LIST, list instanceof ArrayList ? (ArrayList) list : new ArrayList<>(list)); - sendRequest(MediaBrowserCompat.MSG_ON_LOAD_CHILDREN, mediaId, data); + sendRequest(SERVICE_MSG_ON_LOAD_CHILDREN, mediaId, data); } - private void sendRequest(int what, Object obj, Bundle data) throws RemoteException { + private void sendRequest(int what, Object obj, Bundle data) + throws RemoteException { Message msg = Message.obtain(); msg.what = what; + msg.arg1 = SERVICE_VERSION_CURRENT; msg.obj = obj; msg.setData(data); mCallbacks.send(msg); @@ -465,6 +490,7 @@ public abstract class MediaBrowserServiceCompat extends Service { private class ServiceCallbacksApi21 implements ServiceCallbacks { final MediaBrowserServiceCompatApi21.ServiceCallbacks mCallbacks; + Messenger mMessenger; ServiceCallbacksApi21(MediaBrowserServiceCompatApi21.ServiceCallbacks callbacks) { mCallbacks = callbacks; @@ -476,6 +502,12 @@ public abstract class MediaBrowserServiceCompat extends Service { public void onConnect(String root, MediaSessionCompat.Token session, Bundle extras) throws RemoteException { + if (extras == null) { + extras = new Bundle(); + } + mMessenger = new Messenger(mHandler); + BundleCompat.putBinder(extras, EXTRA_MESSENGER_BINDER, mMessenger.getBinder()); + extras.putInt(EXTRA_SERVICE_VERSION, SERVICE_VERSION_CURRENT); mCallbacks.onConnect(root, session.getToken(), extras); } @@ -501,7 +533,9 @@ public abstract class MediaBrowserServiceCompat extends Service { @Override public void onCreate() { super.onCreate(); - if (Build.VERSION.SDK_INT >= 21) { + if (Build.VERSION.SDK_INT >= 23) { + mImpl = new MediaBrowserServiceImplApi23(); + } else if (Build.VERSION.SDK_INT >= 21) { mImpl = new MediaBrowserServiceImplApi21(); } else { mImpl = new MediaBrowserServiceImplBase(); |
