From 3064bc9b376a3d140c4c7d4fe91f9768fbfea0c4 Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 5 May 2023 15:01:58 +0000 Subject: [PATCH] Fix value type when unbundling LibraryResult without expected type Calling LibraryResult.toBundle() could have caused a CastClassException. This was because when unbundled with UNKNOWN_TYPE_CREATOR.fromBundle(Bundle), the valueType was set to VALUE_TYPE_ITEM_LIST for all types and the MediaItem was attempted to be casted to a list. PiperOrigin-RevId: 529717688 (cherry picked from commit f28a5888091c5caa685117d7a6653ae6c5a29f26) --- .../media3/session/LibraryResult.java | 2 +- .../media3/session/LibraryResultTest.java | 76 +++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java b/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java index 1d123d1107..637eb38a0f 100644 --- a/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java +++ b/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java @@ -388,7 +388,7 @@ public final class LibraryResult implements Bundleable { throw new IllegalStateException(); } - return new LibraryResult<>(resultCode, completionTimeMs, params, value, VALUE_TYPE_ITEM_LIST); + return new LibraryResult<>(resultCode, completionTimeMs, params, value, valueType); } @Documented diff --git a/libraries/session/src/test/java/androidx/media3/session/LibraryResultTest.java b/libraries/session/src/test/java/androidx/media3/session/LibraryResultTest.java index a4d7afc33c..9340766c09 100644 --- a/libraries/session/src/test/java/androidx/media3/session/LibraryResultTest.java +++ b/libraries/session/src/test/java/androidx/media3/session/LibraryResultTest.java @@ -15,11 +15,17 @@ */ package androidx.media3.session; +import static androidx.media3.session.LibraryResult.RESULT_ERROR_NOT_SUPPORTED; +import static androidx.media3.session.LibraryResult.UNKNOWN_TYPE_CREATOR; +import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; +import android.os.Bundle; import androidx.media3.common.MediaItem; import androidx.media3.common.MediaMetadata; +import androidx.media3.session.MediaLibraryService.LibraryParams; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.common.collect.ImmutableList; import org.junit.Test; import org.junit.runner.RunWith; @@ -51,4 +57,74 @@ public class LibraryResultTest { assertThrows( IllegalArgumentException.class, () -> LibraryResult.ofItem(item, /* params= */ null)); } + + @Test + public void toBundle_mediaItemLibraryResultThatWasUnbundledAsAnUnknownType_noException() { + MediaItem mediaItem = + new MediaItem.Builder() + .setMediaId("rootMediaId") + .setMediaMetadata( + new MediaMetadata.Builder().setIsPlayable(false).setIsBrowsable(true).build()) + .build(); + LibraryParams params = new LibraryParams.Builder().build(); + LibraryResult libraryResult = LibraryResult.ofItem(mediaItem, params); + Bundle libraryResultBundle = libraryResult.toBundle(); + LibraryResult libraryResultFromUntyped = + UNKNOWN_TYPE_CREATOR.fromBundle(libraryResultBundle); + + Bundle bundleOfUntyped = libraryResultFromUntyped.toBundle(); + + assertThat(UNKNOWN_TYPE_CREATOR.fromBundle(bundleOfUntyped).value).isEqualTo(mediaItem); + } + + @Test + public void toBundle_mediaItemListLibraryResultThatWasUnbundledAsAnUnknownType_noException() { + MediaItem mediaItem = + new MediaItem.Builder() + .setMediaId("rootMediaId") + .setMediaMetadata( + new MediaMetadata.Builder().setIsPlayable(false).setIsBrowsable(true).build()) + .build(); + LibraryParams params = new LibraryParams.Builder().build(); + LibraryResult> libraryResult = + LibraryResult.ofItemList(ImmutableList.of(mediaItem), params); + Bundle libraryResultBundle = libraryResult.toBundle(); + LibraryResult mediaItemLibraryResultFromUntyped = + UNKNOWN_TYPE_CREATOR.fromBundle(libraryResultBundle); + + Bundle bundleOfUntyped = mediaItemLibraryResultFromUntyped.toBundle(); + + assertThat(UNKNOWN_TYPE_CREATOR.fromBundle(bundleOfUntyped).value) + .isEqualTo(ImmutableList.of(mediaItem)); + } + + @Test + public void toBundle_errorResultThatWasUnbundledAsAnUnknownType_noException() { + LibraryResult> libraryResult = + LibraryResult.ofError(LibraryResult.RESULT_ERROR_NOT_SUPPORTED); + Bundle errorLibraryResultBundle = libraryResult.toBundle(); + LibraryResult libraryResultFromUntyped = + UNKNOWN_TYPE_CREATOR.fromBundle(errorLibraryResultBundle); + + Bundle bundleOfUntyped = libraryResultFromUntyped.toBundle(); + + assertThat(UNKNOWN_TYPE_CREATOR.fromBundle(bundleOfUntyped).value).isNull(); + assertThat(UNKNOWN_TYPE_CREATOR.fromBundle(bundleOfUntyped).resultCode) + .isEqualTo(RESULT_ERROR_NOT_SUPPORTED); + } + + @Test + public void toBundle_voidResultThatWasUnbundledAsAnUnknownType_noException() { + LibraryResult> libraryResult = + LibraryResult.ofError(LibraryResult.RESULT_ERROR_NOT_SUPPORTED); + Bundle errorLibraryResultBundle = libraryResult.toBundle(); + LibraryResult libraryResultFromUntyped = + UNKNOWN_TYPE_CREATOR.fromBundle(errorLibraryResultBundle); + + Bundle bundleOfUntyped = libraryResultFromUntyped.toBundle(); + + assertThat(UNKNOWN_TYPE_CREATOR.fromBundle(bundleOfUntyped).value).isNull(); + assertThat(UNKNOWN_TYPE_CREATOR.fromBundle(bundleOfUntyped).resultCode) + .isEqualTo(RESULT_ERROR_NOT_SUPPORTED); + } }