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