From d570d5ca3caeafd3b3779cc4ce7a04f07dc0bef7 Mon Sep 17 00:00:00 2001
From: Sungsoo
Date: Thu, 18 Aug 2016 13:17:58 +0900
Subject: [PATCH] MediaBrowser: Make ItemCallback can take a null media item
When the implementation of MediaBrowserService returns null,
ItemCallback.onError was called, but the JavaDoc is saying that
ItemCallback.onItemLoaded can be called with a null result.
This CL makes ItemCallback.onItemLoaded be able to take a null result,
and ItemCallback.onError be called when the implementation doesn't override
the onLoadItem method or when the returned object is not MediaItem.
Bug: 27808084
Change-Id: I97cfd83786f8f857dc9551e5b0a358962f98e4a2
---
media/java/android/media/browse/MediaBrowser.java | 2 +-
.../service/media/MediaBrowserService.java | 15 ++++++++++-----
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/media/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java
index 4f2d9fbc899f0..957c2d6eb09f0 100644
--- a/media/java/android/media/browse/MediaBrowser.java
+++ b/media/java/android/media/browse/MediaBrowser.java
@@ -441,7 +441,7 @@ public final class MediaBrowser {
return;
}
Parcelable item = resultData.getParcelable(MediaBrowserService.KEY_MEDIA_ITEM);
- if (!(item instanceof MediaItem)) {
+ if (item != null && !(item instanceof MediaItem)) {
cb.onError(mediaId);
return;
}
diff --git a/media/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java
index a811ad0e5a1f9..a19e347b4507c 100644
--- a/media/java/android/service/media/MediaBrowserService.java
+++ b/media/java/android/service/media/MediaBrowserService.java
@@ -91,10 +91,12 @@ public abstract class MediaBrowserService extends Service {
public static final String KEY_MEDIA_ITEM = "media_item";
private static final int RESULT_FLAG_OPTION_NOT_HANDLED = 0x00000001;
+ private static final int RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED = 0x00000002;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(flag=true, value = { RESULT_FLAG_OPTION_NOT_HANDLED })
+ @IntDef(flag=true, value = { RESULT_FLAG_OPTION_NOT_HANDLED,
+ RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED })
private @interface ResultFlags { }
private final ArrayMap mConnections = new ArrayMap<>();
@@ -433,11 +435,9 @@ public abstract class MediaBrowserService extends Service {
* been loaded.
*
* When the given {@code itemId} is invalid, implementations must call
- * {@link Result#sendResult result.sendResult} with {@code null}, which will
- * invoke {@link MediaBrowser.ItemCallback#onError}.
+ * {@link Result#sendResult result.sendResult} with {@code null}.
*
- * The default implementation calls {@link Result#sendResult result.sendResult}
- * with {@code null}.
+ * The default implementation will invoke {@link MediaBrowser.ItemCallback#onError}.
*
*
* @param itemId The id for the specific
@@ -445,6 +445,7 @@ public abstract class MediaBrowserService extends Service {
* @param result The Result to send the item to.
*/
public void onLoadItem(String itemId, Result result) {
+ result.setFlags(RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED);
result.sendResult(null);
}
@@ -703,6 +704,10 @@ public abstract class MediaBrowserService extends Service {
new Result(itemId) {
@Override
void onResultSent(MediaBrowser.MediaItem item, @ResultFlags int flag) {
+ if ((flag & RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED) != 0) {
+ receiver.send(-1, null);
+ return;
+ }
Bundle bundle = new Bundle();
bundle.putParcelable(KEY_MEDIA_ITEM, item);
receiver.send(0, bundle);