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);