Revert "Revert "Fix NPE which occurs when MediaBrowserService.onLoadItem gives null""

Although the original CL (http://ag/1915341) is not related to the test 
failure, it was reverted. So this change makes the original CL be merged
again.

This reverts commit 6fea533c390999295d37b0debe97f88aa693d22c.

Change-Id: I10c0dea3fe45a203387ffac54d29f11e8b88ff65
diff --git a/media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java b/media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java
index 308c490..dfab20b 100644
--- a/media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java
+++ b/media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java
@@ -48,9 +48,13 @@
 
         @Override
         public void onItemLoaded(MediaBrowser.MediaItem item) {
-            Parcel parcel = Parcel.obtain();
-            item.writeToParcel(parcel, 0);
-            mItemCallback.onItemLoaded(parcel);
+            if (item == null) {
+                mItemCallback.onItemLoaded(null);
+            } else {
+                Parcel parcel = Parcel.obtain();
+                item.writeToParcel(parcel, 0);
+                mItemCallback.onItemLoaded(parcel);
+            }
         }
 
         @Override
diff --git a/media-compat/java/android/support/v4/media/MediaBrowserCompat.java b/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
index 214c815..414662a 100644
--- a/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
+++ b/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
@@ -778,10 +778,15 @@
 
             @Override
             public void onItemLoaded(Parcel itemParcel) {
-                itemParcel.setDataPosition(0);
-                MediaItem item = MediaBrowserCompat.MediaItem.CREATOR.createFromParcel(itemParcel);
-                itemParcel.recycle();
-                ItemCallback.this.onItemLoaded(item);
+                if (itemParcel == null) {
+                    ItemCallback.this.onItemLoaded(null);
+                } else {
+                    itemParcel.setDataPosition(0);
+                    MediaItem item =
+                            MediaBrowserCompat.MediaItem.CREATOR.createFromParcel(itemParcel);
+                    itemParcel.recycle();
+                    ItemCallback.this.onItemLoaded(item);
+                }
             }
 
             @Override
diff --git a/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java b/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java
index 04a4410..fd87a76 100644
--- a/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java
@@ -19,6 +19,7 @@
 import static android.support.test.InstrumentationRegistry.getInstrumentation;
 
 import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNull;
 
 import static org.junit.Assert.fail;
 
@@ -408,11 +409,12 @@
 
     @Test
     @SmallTest
-    public void testGetItemFailure() {
+    public void testGetItemWhenOnLoadItemIsNotImplemented() {
         resetCallbacks();
         createMediaBrowser(TEST_BROWSER_SERVICE);
         connectMediaBrowserService();
-        mMediaBrowser.getItem(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, mItemCallback);
+        mMediaBrowser.getItem(StubMediaBrowserServiceCompat.MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED,
+                mItemCallback);
         new PollingCheck(TIME_OUT_MS) {
             @Override
             protected boolean check() {
@@ -420,7 +422,30 @@
             }
         }.run();
 
-        assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, mItemCallback.mLastErrorId);
+        assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED,
+                mItemCallback.mLastErrorId);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetItemWhenMediaIdIsInvalid() {
+        resetCallbacks();
+        mItemCallback.mLastMediaItem = new MediaItem(new MediaDescriptionCompat.Builder()
+                .setMediaId("dummy_id").build(), MediaItem.FLAG_BROWSABLE);
+
+        createMediaBrowser(TEST_BROWSER_SERVICE);
+        connectMediaBrowserService();
+        mMediaBrowser.getItem(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, mItemCallback);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                // MediaBrowserServiceCompat.onLoadItem implementations must send null result when
+                // the given media id is invalid.
+                return mItemCallback.mLastMediaItem == null;
+            }
+        }.run();
+
+        assertNull(mItemCallback.mLastErrorId);
     }
 
     private void createMediaBrowser(final ComponentName component) {
diff --git a/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java b/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java
index 3995200..b943594 100644
--- a/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java
+++ b/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java
@@ -36,6 +36,8 @@
     static final String MEDIA_ID_INVALID = "test_media_id_invalid";
     static final String MEDIA_ID_ROOT = "test_media_id_root";
     static final String MEDIA_ID_CHILDREN_DELAYED = "test_media_id_children_delayed";
+    static final String MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED =
+            "test_media_id_on_load_item_not_implemented";
 
     static final String[] MEDIA_ID_CHILDREN = new String[]{
             "test_media_id_children_0", "test_media_id_children_1",
@@ -98,6 +100,11 @@
             return;
         }
 
+        if (MEDIA_ID_INVALID.equals(itemId)) {
+            result.sendResult(null);
+            return;
+        }
+
         for (String id : MEDIA_ID_CHILDREN) {
             if (id.equals(itemId)) {
                 result.sendResult(createMediaItem(id));
@@ -105,6 +112,7 @@
             }
         }
 
+        // Test the case where onLoadItem is not implemented.
         super.onLoadItem(itemId, result);
     }