summaryrefslogtreecommitdiffstats
path: root/v4/java/android
diff options
context:
space:
mode:
authorSungsoo Lim <sungsoo@google.com>2015-10-30 04:12:05 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-10-30 04:12:05 +0000
commit6b405b82065f6bfdfde43fe1a91111a76da160f4 (patch)
tree193b5d2c61045852c2ef961024350b763a6e561d /v4/java/android
parent25e01ca9bf8fb694671ab5dbd85a4ed4e94b975a (diff)
parent82cf659fd8dcc28e182274b17a401023ab879dea (diff)
downloadandroid_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')
-rw-r--r--v4/java/android/support/v4/media/MediaBrowserCompat.java209
-rw-r--r--v4/java/android/support/v4/media/MediaBrowserProtocol.java126
-rw-r--r--v4/java/android/support/v4/media/MediaBrowserServiceCompat.java98
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();