From 7c235d2b84698975e8aac45041fd4646e4cbd3c7 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 18 May 2022 15:12:53 +0100 Subject: [PATCH] Remove all null-tolerant methods from BundleableUtil. In most cases it's clearer to in-line these null-checks with ternary operators. PiperOrigin-RevId: 449474621 --- .../java/androidx/media3/common/Format.java | 16 +-- .../java/androidx/media3/common/Player.java | 9 +- .../androidx/media3/common/TrackGroup.java | 9 +- .../common/TrackSelectionParameters.java | 12 ++- .../java/androidx/media3/common/Tracks.java | 18 ++-- .../androidx/media3/common/text/CueGroup.java | 10 +- .../media3/common/util/BundleableUtil.java | 69 +++---------- .../exoplayer/ExoPlaybackException.java | 10 +- .../exoplayer/source/TrackGroupArray.java | 15 +-- .../trackselection/DefaultTrackSelector.java | 25 +++-- .../media3/session/CommandButton.java | 12 ++- .../media3/session/ConnectionState.java | 37 +++---- .../media3/session/LibraryResult.java | 16 +-- .../media3/session/MediaBrowserImplBase.java | 11 +-- .../media3/session/MediaControllerStub.java | 8 +- .../media3/session/MediaSessionStub.java | 14 +-- .../session/MediaStyleNotificationHelper.java | 7 +- .../androidx/media3/session/PlayerInfo.java | 98 +++++++++---------- .../media3/session/SessionPositionInfo.java | 9 +- .../MediaControllerProviderService.java | 29 +++--- .../session/MediaSessionProviderService.java | 77 ++++++++------- .../session/MockMediaLibraryService.java | 9 +- .../media3/session/RemoteMediaBrowser.java | 11 +-- .../media3/session/RemoteMediaController.java | 8 +- .../media3/session/RemoteMediaSession.java | 7 +- 25 files changed, 270 insertions(+), 276 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/Format.java b/libraries/common/src/main/java/androidx/media3/common/Format.java index bdb48ab639..b24b043009 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Format.java +++ b/libraries/common/src/main/java/androidx/media3/common/Format.java @@ -1548,7 +1548,9 @@ public final class Format implements Bundleable { bundle.putFloat(keyForField(FIELD_PIXEL_WIDTH_HEIGHT_RATIO), pixelWidthHeightRatio); bundle.putByteArray(keyForField(FIELD_PROJECTION_DATA), projectionData); bundle.putInt(keyForField(FIELD_STEREO_MODE), stereoMode); - bundle.putBundle(keyForField(FIELD_COLOR_INFO), BundleableUtil.toNullableBundle(colorInfo)); + if (colorInfo != null) { + bundle.putBundle(keyForField(FIELD_COLOR_INFO), colorInfo.toBundle()); + } // Audio specific. bundle.putInt(keyForField(FIELD_CHANNEL_COUNT), channelCount); bundle.putInt(keyForField(FIELD_SAMPLE_RATE), sampleRate); @@ -1615,11 +1617,13 @@ public final class Format implements Bundleable { bundle.getFloat( keyForField(FIELD_PIXEL_WIDTH_HEIGHT_RATIO), DEFAULT.pixelWidthHeightRatio)) .setProjectionData(bundle.getByteArray(keyForField(FIELD_PROJECTION_DATA))) - .setStereoMode(bundle.getInt(keyForField(FIELD_STEREO_MODE), DEFAULT.stereoMode)) - .setColorInfo( - BundleableUtil.fromNullableBundle( - ColorInfo.CREATOR, bundle.getBundle(keyForField(FIELD_COLOR_INFO)))) - // Audio specific. + .setStereoMode(bundle.getInt(keyForField(FIELD_STEREO_MODE), DEFAULT.stereoMode)); + Bundle colorInfoBundle = bundle.getBundle(keyForField(FIELD_COLOR_INFO)); + if (colorInfoBundle != null) { + builder.setColorInfo(ColorInfo.CREATOR.fromBundle(colorInfoBundle)); + } + // Audio specific. + builder .setChannelCount(bundle.getInt(keyForField(FIELD_CHANNEL_COUNT), DEFAULT.channelCount)) .setSampleRate(bundle.getInt(keyForField(FIELD_SAMPLE_RATE), DEFAULT.sampleRate)) .setPcmEncoding(bundle.getInt(keyForField(FIELD_PCM_ENCODING), DEFAULT.pcmEncoding)) diff --git a/libraries/common/src/main/java/androidx/media3/common/Player.java b/libraries/common/src/main/java/androidx/media3/common/Player.java index eb67acb05e..4a414f6b37 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Player.java +++ b/libraries/common/src/main/java/androidx/media3/common/Player.java @@ -33,7 +33,6 @@ import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.media3.common.text.Cue; import androidx.media3.common.text.CueGroup; -import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; import com.google.common.base.Objects; @@ -295,7 +294,9 @@ public interface Player { public Bundle toBundle() { Bundle bundle = new Bundle(); bundle.putInt(keyForField(FIELD_MEDIA_ITEM_INDEX), mediaItemIndex); - bundle.putBundle(keyForField(FIELD_MEDIA_ITEM), BundleableUtil.toNullableBundle(mediaItem)); + if (mediaItem != null) { + bundle.putBundle(keyForField(FIELD_MEDIA_ITEM), mediaItem.toBundle()); + } bundle.putInt(keyForField(FIELD_PERIOD_INDEX), periodIndex); bundle.putLong(keyForField(FIELD_POSITION_MS), positionMs); bundle.putLong(keyForField(FIELD_CONTENT_POSITION_MS), contentPositionMs); @@ -310,10 +311,10 @@ public interface Player { private static PositionInfo fromBundle(Bundle bundle) { int mediaItemIndex = bundle.getInt(keyForField(FIELD_MEDIA_ITEM_INDEX), /* defaultValue= */ C.INDEX_UNSET); + @Nullable Bundle mediaItemBundle = bundle.getBundle(keyForField(FIELD_MEDIA_ITEM)); @Nullable MediaItem mediaItem = - BundleableUtil.fromNullableBundle( - MediaItem.CREATOR, bundle.getBundle(keyForField(FIELD_MEDIA_ITEM))); + mediaItemBundle == null ? null : MediaItem.CREATOR.fromBundle(mediaItemBundle); int periodIndex = bundle.getInt(keyForField(FIELD_PERIOD_INDEX), /* defaultValue= */ C.INDEX_UNSET); long positionMs = diff --git a/libraries/common/src/main/java/androidx/media3/common/TrackGroup.java b/libraries/common/src/main/java/androidx/media3/common/TrackGroup.java index 139a0ab0bb..6cb679368a 100644 --- a/libraries/common/src/main/java/androidx/media3/common/TrackGroup.java +++ b/libraries/common/src/main/java/androidx/media3/common/TrackGroup.java @@ -189,11 +189,12 @@ public final class TrackGroup implements Bundleable { @UnstableApi public static final Creator CREATOR = bundle -> { + @Nullable + List formatBundles = bundle.getParcelableArrayList(keyForField(FIELD_FORMATS)); List formats = - BundleableUtil.fromBundleNullableList( - Format.CREATOR, - bundle.getParcelableArrayList(keyForField(FIELD_FORMATS)), - ImmutableList.of()); + formatBundles == null + ? ImmutableList.of() + : BundleableUtil.fromBundleList(Format.CREATOR, formatBundles); String id = bundle.getString(keyForField(FIELD_ID), /* defaultValue= */ ""); return new TrackGroup(id, formats.toArray(new Format[0])); }; diff --git a/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java b/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java index 3d7696e51f..e7c4cbbc50 100644 --- a/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java +++ b/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java @@ -16,7 +16,6 @@ package androidx.media3.common; import static androidx.media3.common.util.Assertions.checkNotNull; -import static androidx.media3.common.util.BundleableUtil.fromBundleNullableList; import static androidx.media3.common.util.BundleableUtil.toBundleArrayList; import static com.google.common.base.MoreObjects.firstNonNull; @@ -28,6 +27,7 @@ import android.view.accessibility.CaptioningManager; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; import com.google.common.collect.ImmutableList; @@ -247,11 +247,13 @@ public class TrackSelectionParameters implements Bundleable { bundle.getBoolean( keyForField(FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE), DEFAULT_WITHOUT_CONTEXT.forceHighestSupportedBitrate); + @Nullable + List overrideBundleList = + bundle.getParcelableArrayList(keyForField(FIELD_SELECTION_OVERRIDES)); List overrideList = - fromBundleNullableList( - TrackSelectionOverride.CREATOR, - bundle.getParcelableArrayList(keyForField(FIELD_SELECTION_OVERRIDES)), - ImmutableList.of()); + overrideBundleList == null + ? ImmutableList.of() + : BundleableUtil.fromBundleList(TrackSelectionOverride.CREATOR, overrideBundleList); overrides = new HashMap<>(); for (int i = 0; i < overrideList.size(); i++) { TrackSelectionOverride override = overrideList.get(i); diff --git a/libraries/common/src/main/java/androidx/media3/common/Tracks.java b/libraries/common/src/main/java/androidx/media3/common/Tracks.java index dcbdfd536e..6da0a9204c 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Tracks.java +++ b/libraries/common/src/main/java/androidx/media3/common/Tracks.java @@ -17,14 +17,13 @@ package androidx.media3.common; import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkNotNull; -import static androidx.media3.common.util.BundleableUtil.fromBundleNullableList; -import static androidx.media3.common.util.BundleableUtil.fromNullableBundle; import static androidx.media3.common.util.BundleableUtil.toBundleArrayList; import static java.lang.annotation.ElementType.TYPE_USE; import android.os.Bundle; import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.UnstableApi; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; @@ -252,10 +251,10 @@ public final class Tracks implements Bundleable { @UnstableApi public static final Creator CREATOR = bundle -> { + // Can't create a Tracks.Group without a TrackGroup TrackGroup trackGroup = - fromNullableBundle( - TrackGroup.CREATOR, bundle.getBundle(keyForField(FIELD_TRACK_GROUP))); - checkNotNull(trackGroup); // Can't create a trackGroup info without a trackGroup + TrackGroup.CREATOR.fromBundle( + checkNotNull(bundle.getBundle(keyForField(FIELD_TRACK_GROUP)))); final @C.FormatSupport int[] trackSupport = MoreObjects.firstNonNull( bundle.getIntArray(keyForField(FIELD_TRACK_SUPPORT)), new int[trackGroup.length]); @@ -408,11 +407,12 @@ public final class Tracks implements Bundleable { @UnstableApi public static final Creator CREATOR = bundle -> { + @Nullable + List groupBundles = bundle.getParcelableArrayList(keyForField(FIELD_TRACK_GROUPS)); List groups = - fromBundleNullableList( - Group.CREATOR, - bundle.getParcelableArrayList(keyForField(FIELD_TRACK_GROUPS)), - /* defaultValue= */ ImmutableList.of()); + groupBundles == null + ? ImmutableList.of() + : BundleableUtil.fromBundleList(Group.CREATOR, groupBundles); return new Tracks(groups); }; diff --git a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java index b982b52274..9a26d0ec26 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java @@ -20,6 +20,7 @@ import static java.lang.annotation.ElementType.TYPE_USE; import android.graphics.Bitmap; import android.os.Bundle; import androidx.annotation.IntDef; +import androidx.annotation.Nullable; import androidx.media3.common.Bundleable; import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.UnstableApi; @@ -28,6 +29,7 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.ArrayList; import java.util.List; /** Class to represent the state of active {@link Cue Cues} at a particular time. */ @@ -74,11 +76,11 @@ public final class CueGroup implements Bundleable { @UnstableApi public static final Creator CREATOR = CueGroup::fromBundle; private static final CueGroup fromBundle(Bundle bundle) { + @Nullable ArrayList cueBundles = bundle.getParcelableArrayList(keyForField(FIELD_CUES)); List cues = - BundleableUtil.fromBundleNullableList( - Cue.CREATOR, - bundle.getParcelableArrayList(keyForField(FIELD_CUES)), - /* defaultValue= */ ImmutableList.of()); + cueBundles == null + ? ImmutableList.of() + : BundleableUtil.fromBundleList(Cue.CREATOR, cueBundles); return new CueGroup(cues); } diff --git a/libraries/common/src/main/java/androidx/media3/common/util/BundleableUtil.java b/libraries/common/src/main/java/androidx/media3/common/util/BundleableUtil.java index fc6bc7556e..e3451b78df 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/BundleableUtil.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/BundleableUtil.java @@ -31,34 +31,6 @@ import java.util.List; @UnstableApi public final class BundleableUtil { - /** - * Converts a {@link Bundleable} to a {@link Bundle}. It's a convenience wrapper of {@link - * Bundleable#toBundle} that can take nullable values. - */ - @Nullable - public static Bundle toNullableBundle(@Nullable Bundleable bundleable) { - return bundleable == null ? null : bundleable.toBundle(); - } - - /** - * Converts a {@link Bundle} to a {@link Bundleable}. It's a convenience wrapper of {@link - * Bundleable.Creator#fromBundle} that can take nullable values. - */ - @Nullable - public static T fromNullableBundle( - Bundleable.Creator creator, @Nullable Bundle bundle) { - return bundle == null ? null : creator.fromBundle(bundle); - } - - /** - * Converts a {@link Bundle} to a {@link Bundleable}. It's a convenience wrapper of {@link - * Bundleable.Creator#fromBundle} that provides default value to ensure non-null. - */ - public static T fromNullableBundle( - Bundleable.Creator creator, @Nullable Bundle bundle, T defaultValue) { - return bundle == null ? defaultValue : creator.fromBundle(bundle); - } - /** Converts a list of {@link Bundleable} to a list {@link Bundle}. */ public static ImmutableList toBundleList(List bundleableList) { ImmutableList.Builder builder = ImmutableList.builder(); @@ -81,34 +53,6 @@ public final class BundleableUtil { return builder.build(); } - /** - * Converts a list of {@link Bundle} to a list of {@link Bundleable}. Returns {@code defaultValue} - * if {@code bundleList} is null. - */ - public static List fromBundleNullableList( - Bundleable.Creator creator, @Nullable List bundleList, List defaultValue) { - return (bundleList == null) ? defaultValue : fromBundleList(creator, bundleList); - } - - /** - * Converts a {@link SparseArray} of {@link Bundle} to a {@link SparseArray} of {@link - * Bundleable}. Returns {@code defaultValue} if {@code bundleSparseArray} is null. - */ - public static SparseArray fromBundleNullableSparseArray( - Bundleable.Creator creator, - @Nullable SparseArray bundleSparseArray, - SparseArray defaultValue) { - if (bundleSparseArray == null) { - return defaultValue; - } - // Can't use ImmutableList as it doesn't support null elements. - SparseArray result = new SparseArray<>(bundleSparseArray.size()); - for (int i = 0; i < bundleSparseArray.size(); i++) { - result.put(bundleSparseArray.keyAt(i), creator.fromBundle(bundleSparseArray.valueAt(i))); - } - return result; - } - /** * Converts a collection of {@link Bundleable} to an {@link ArrayList} of {@link Bundle} so that * the returned list can be put to {@link Bundle} using {@link Bundle#putParcelableArrayList} @@ -123,6 +67,19 @@ public final class BundleableUtil { return arrayList; } + /** + * Converts a {@link SparseArray} of {@link Bundle} to a {@link SparseArray} of {@link + * Bundleable}. + */ + public static SparseArray fromBundleSparseArray( + Bundleable.Creator creator, SparseArray bundleSparseArray) { + SparseArray result = new SparseArray<>(bundleSparseArray.size()); + for (int i = 0; i < bundleSparseArray.size(); i++) { + result.put(bundleSparseArray.keyAt(i), creator.fromBundle(bundleSparseArray.valueAt(i))); + } + return result; + } + /** * Converts a {@link SparseArray} of {@link Bundleable} to an {@link SparseArray} of {@link * Bundle} so that the returned {@link SparseArray} can be put to {@link Bundle} using {@link diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlaybackException.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlaybackException.java index 52bf89b365..19d69529ca 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlaybackException.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlaybackException.java @@ -33,7 +33,6 @@ import androidx.media3.common.Format; import androidx.media3.common.MediaPeriodId; import androidx.media3.common.PlaybackException; import androidx.media3.common.util.Assertions; -import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; import androidx.media3.exoplayer.source.MediaSource; @@ -255,9 +254,9 @@ public final class ExoPlaybackException extends PlaybackException { rendererName = bundle.getString(keyForField(FIELD_RENDERER_NAME)); rendererIndex = bundle.getInt(keyForField(FIELD_RENDERER_INDEX), /* defaultValue= */ C.INDEX_UNSET); + @Nullable Bundle rendererFormatBundle = bundle.getBundle(keyForField(FIELD_RENDERER_FORMAT)); rendererFormat = - BundleableUtil.fromNullableBundle( - Format.CREATOR, bundle.getBundle(keyForField(FIELD_RENDERER_FORMAT))); + rendererFormatBundle == null ? null : Format.CREATOR.fromBundle(rendererFormatBundle); rendererFormatSupport = bundle.getInt( keyForField(FIELD_RENDERER_FORMAT_SUPPORT), /* defaultValue= */ C.FORMAT_HANDLED); @@ -424,8 +423,9 @@ public final class ExoPlaybackException extends PlaybackException { bundle.putInt(keyForField(FIELD_TYPE), type); bundle.putString(keyForField(FIELD_RENDERER_NAME), rendererName); bundle.putInt(keyForField(FIELD_RENDERER_INDEX), rendererIndex); - bundle.putBundle( - keyForField(FIELD_RENDERER_FORMAT), BundleableUtil.toNullableBundle(rendererFormat)); + if (rendererFormat != null) { + bundle.putBundle(keyForField(FIELD_RENDERER_FORMAT), rendererFormat.toBundle()); + } bundle.putInt(keyForField(FIELD_RENDERER_FORMAT_SUPPORT), rendererFormatSupport); bundle.putBoolean(keyForField(FIELD_IS_RECOVERABLE), isRecoverable); return bundle; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TrackGroupArray.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TrackGroupArray.java index d37b8802d3..0bc5a014f6 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TrackGroupArray.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TrackGroupArray.java @@ -139,12 +139,15 @@ public final class TrackGroupArray implements Bundleable { /** Object that can restores a TrackGroupArray from a {@link Bundle}. */ public static final Creator CREATOR = bundle -> { - List trackGroups = - BundleableUtil.fromBundleNullableList( - TrackGroup.CREATOR, - bundle.getParcelableArrayList(keyForField(FIELD_TRACK_GROUPS)), - /* defaultValue= */ ImmutableList.of()); - return new TrackGroupArray(trackGroups.toArray(new TrackGroup[0])); + @Nullable + List trackGroupBundles = + bundle.getParcelableArrayList(keyForField(FIELD_TRACK_GROUPS)); + if (trackGroupBundles == null) { + return new TrackGroupArray(); + } + return new TrackGroupArray( + BundleableUtil.fromBundleList(TrackGroup.CREATOR, trackGroupBundles) + .toArray(new TrackGroup[0])); }; private void verifyCorrectness() { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java index a718b5aafa..03638e7dad 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java @@ -843,18 +843,23 @@ public class DefaultTrackSelector extends MappingTrackSelector { int[] rendererIndices = bundle.getIntArray( Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES_RENDERER_INDICES)); + @Nullable + ArrayList trackGroupArrayBundles = + bundle.getParcelableArrayList( + Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS)); List trackGroupArrays = - BundleableUtil.fromBundleNullableList( - TrackGroupArray.CREATOR, - bundle.getParcelableArrayList( - Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS)), - /* defaultValue= */ ImmutableList.of()); + trackGroupArrayBundles == null + ? ImmutableList.of() + : BundleableUtil.fromBundleList(TrackGroupArray.CREATOR, trackGroupArrayBundles); + @Nullable + SparseArray selectionOverrideBundles = + bundle.getSparseParcelableArray( + Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES)); SparseArray selectionOverrides = - BundleableUtil.fromBundleNullableSparseArray( - SelectionOverride.CREATOR, - bundle.getSparseParcelableArray( - Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES)), - /* defaultValue= */ new SparseArray<>()); + selectionOverrideBundles == null + ? new SparseArray<>() + : BundleableUtil.fromBundleSparseArray( + SelectionOverride.CREATOR, selectionOverrideBundles); if (rendererIndices == null || rendererIndices.length != trackGroupArrays.size()) { return; // Incorrect format, ignore all overrides. diff --git a/libraries/session/src/main/java/androidx/media3/session/CommandButton.java b/libraries/session/src/main/java/androidx/media3/session/CommandButton.java index 070dc7e7c2..8ac74eba5b 100644 --- a/libraries/session/src/main/java/androidx/media3/session/CommandButton.java +++ b/libraries/session/src/main/java/androidx/media3/session/CommandButton.java @@ -25,7 +25,6 @@ import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.media3.common.Bundleable; import androidx.media3.common.Player; -import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.UnstableApi; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -219,8 +218,9 @@ public final class CommandButton implements Bundleable { @Override public Bundle toBundle() { Bundle bundle = new Bundle(); - bundle.putBundle( - keyForField(FIELD_SESSION_COMMAND), BundleableUtil.toNullableBundle(sessionCommand)); + if (sessionCommand != null) { + bundle.putBundle(keyForField(FIELD_SESSION_COMMAND), sessionCommand.toBundle()); + } bundle.putInt(keyForField(FIELD_PLAYER_COMMAND), playerCommand); bundle.putInt(keyForField(FIELD_ICON_RES_ID), iconResId); bundle.putCharSequence(keyForField(FIELD_DISPLAY_NAME), displayName); @@ -233,10 +233,12 @@ public final class CommandButton implements Bundleable { @UnstableApi public static final Creator CREATOR = CommandButton::fromBundle; private static CommandButton fromBundle(Bundle bundle) { + @Nullable Bundle sessionCommandBundle = bundle.getBundle(keyForField(FIELD_SESSION_COMMAND)); @Nullable SessionCommand sessionCommand = - BundleableUtil.fromNullableBundle( - SessionCommand.CREATOR, bundle.getBundle(keyForField(FIELD_SESSION_COMMAND))); + sessionCommandBundle == null + ? null + : SessionCommand.CREATOR.fromBundle(sessionCommandBundle); @Player.Command int playerCommand = bundle.getInt( diff --git a/libraries/session/src/main/java/androidx/media3/session/ConnectionState.java b/libraries/session/src/main/java/androidx/media3/session/ConnectionState.java index d073ee3e95..84faddd1ce 100644 --- a/libraries/session/src/main/java/androidx/media3/session/ConnectionState.java +++ b/libraries/session/src/main/java/androidx/media3/session/ConnectionState.java @@ -26,7 +26,6 @@ import androidx.annotation.Nullable; import androidx.core.app.BundleCompat; import androidx.media3.common.Bundleable; import androidx.media3.common.Player; -import androidx.media3.common.util.BundleableUtil; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -135,27 +134,31 @@ import java.lang.annotation.Target; checkNotNull(BundleCompat.getBinder(bundle, keyForField(FIELD_SESSION_BINDER))); @Nullable PendingIntent sessionActivity = bundle.getParcelable(keyForField(FIELD_SESSION_ACTIVITY)); + @Nullable Bundle sessionCommandsBundle = bundle.getBundle(keyForField(FIELD_SESSION_COMMANDS)); SessionCommands sessionCommands = - BundleableUtil.fromNullableBundle( - SessionCommands.CREATOR, - bundle.getBundle(keyForField(FIELD_SESSION_COMMANDS)), - SessionCommands.EMPTY); + sessionCommandsBundle == null + ? SessionCommands.EMPTY + : SessionCommands.CREATOR.fromBundle(sessionCommandsBundle); + @Nullable + Bundle playerCommandsFromPlayerBundle = + bundle.getBundle(keyForField(FIELD_PLAYER_COMMANDS_FROM_PLAYER)); Player.Commands playerCommandsFromPlayer = - BundleableUtil.fromNullableBundle( - Player.Commands.CREATOR, - bundle.getBundle(keyForField(FIELD_PLAYER_COMMANDS_FROM_PLAYER)), - Player.Commands.EMPTY); + playerCommandsFromPlayerBundle == null + ? Player.Commands.EMPTY + : Player.Commands.CREATOR.fromBundle(playerCommandsFromPlayerBundle); + @Nullable + Bundle playerCommandsFromSessionBundle = + bundle.getBundle(keyForField(FIELD_PLAYER_COMMANDS_FROM_SESSION)); Player.Commands playerCommandsFromSession = - BundleableUtil.fromNullableBundle( - Player.Commands.CREATOR, - bundle.getBundle(keyForField(FIELD_PLAYER_COMMANDS_FROM_SESSION)), - Player.Commands.EMPTY); + playerCommandsFromSessionBundle == null + ? Player.Commands.EMPTY + : Player.Commands.CREATOR.fromBundle(playerCommandsFromSessionBundle); @Nullable Bundle tokenExtras = bundle.getBundle(keyForField(FIELD_TOKEN_EXTRAS)); + @Nullable Bundle playerInfoBundle = bundle.getBundle(keyForField(FIELD_PLAYER_INFO)); PlayerInfo playerInfo = - BundleableUtil.fromNullableBundle( - PlayerInfo.CREATOR, - bundle.getBundle(keyForField(FIELD_PLAYER_INFO)), - PlayerInfo.DEFAULT); + playerInfoBundle == null + ? PlayerInfo.DEFAULT + : PlayerInfo.CREATOR.fromBundle(playerInfoBundle); return new ConnectionState( version, IMediaSession.Stub.asInterface(sessionBinder), 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 4e469926c3..2984dbc604 100644 --- a/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java +++ b/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java @@ -287,7 +287,9 @@ public final class LibraryResult implements Bundleable { Bundle bundle = new Bundle(); bundle.putInt(keyForField(FIELD_RESULT_CODE), resultCode); bundle.putLong(keyForField(FIELD_COMPLETION_TIME_MS), completionTimeMs); - bundle.putBundle(keyForField(FIELD_PARAMS), BundleableUtil.toNullableBundle(params)); + if (params != null) { + bundle.putBundle(keyForField(FIELD_PARAMS), params.toBundle()); + } bundle.putInt(keyForField(FIELD_VALUE_TYPE), valueType); if (value == null) { @@ -295,8 +297,7 @@ public final class LibraryResult implements Bundleable { } switch (valueType) { case VALUE_TYPE_ITEM: - bundle.putBundle( - keyForField(FIELD_VALUE), BundleableUtil.toNullableBundle((MediaItem) value)); + bundle.putBundle(keyForField(FIELD_VALUE), ((MediaItem) value).toBundle()); break; case VALUE_TYPE_ITEM_LIST: BundleCompat.putBinder( @@ -371,18 +372,17 @@ public final class LibraryResult implements Bundleable { bundle.getLong( keyForField(FIELD_COMPLETION_TIME_MS), /* defaultValue= */ SystemClock.elapsedRealtime()); + @Nullable Bundle paramsBundle = bundle.getBundle(keyForField(FIELD_PARAMS)); @Nullable MediaLibraryService.LibraryParams params = - BundleableUtil.fromNullableBundle( - MediaLibraryService.LibraryParams.CREATOR, bundle.getBundle(keyForField(FIELD_PARAMS))); + paramsBundle == null ? null : LibraryParams.CREATOR.fromBundle(paramsBundle); @ValueType int valueType = bundle.getInt(keyForField(FIELD_VALUE_TYPE)); @Nullable Object value; switch (valueType) { case VALUE_TYPE_ITEM: checkState(expectedType == null || expectedType == VALUE_TYPE_ITEM); - value = - BundleableUtil.fromNullableBundle( - MediaItem.CREATOR, bundle.getBundle(keyForField(FIELD_VALUE))); + @Nullable Bundle valueBundle = bundle.getBundle(keyForField(FIELD_VALUE)); + value = valueBundle == null ? null : MediaItem.CREATOR.fromBundle(valueBundle); break; case VALUE_TYPE_ITEM_LIST: checkState(expectedType == null || expectedType == VALUE_TYPE_ITEM_LIST); diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaBrowserImplBase.java b/libraries/session/src/main/java/androidx/media3/session/MediaBrowserImplBase.java index f0c4d7ccb7..f5ca3540f8 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaBrowserImplBase.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaBrowserImplBase.java @@ -31,7 +31,6 @@ import android.os.Bundle; import android.os.RemoteException; import androidx.annotation.Nullable; import androidx.media3.common.MediaItem; -import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.Log; import androidx.media3.session.MediaLibraryService.LibraryParams; import androidx.media3.session.SequencedFutureManager.SequencedFuture; @@ -59,7 +58,7 @@ import com.google.common.util.concurrent.ListenableFuture; new RemoteLibrarySessionTask() { @Override public void run(IMediaSession iSession, int seq) throws RemoteException { - iSession.getLibraryRoot(controllerStub, seq, BundleableUtil.toNullableBundle(params)); + iSession.getLibraryRoot(controllerStub, seq, params == null ? null : params.toBundle()); } }); } @@ -73,7 +72,7 @@ import com.google.common.util.concurrent.ListenableFuture; @Override public void run(IMediaSession iSession, int seq) throws RemoteException { iSession.subscribe( - controllerStub, seq, parentId, BundleableUtil.toNullableBundle(params)); + controllerStub, seq, parentId, params == null ? null : params.toBundle()); } }); } @@ -104,7 +103,7 @@ import com.google.common.util.concurrent.ListenableFuture; parentId, page, pageSize, - BundleableUtil.toNullableBundle(params)); + params == null ? null : params.toBundle()); } }); } @@ -129,7 +128,7 @@ import com.google.common.util.concurrent.ListenableFuture; new RemoteLibrarySessionTask() { @Override public void run(IMediaSession iSession, int seq) throws RemoteException { - iSession.search(controllerStub, seq, query, BundleableUtil.toNullableBundle(params)); + iSession.search(controllerStub, seq, query, params == null ? null : params.toBundle()); } }); } @@ -148,7 +147,7 @@ import com.google.common.util.concurrent.ListenableFuture; query, page, pageSize, - BundleableUtil.toNullableBundle(params)); + params == null ? null : params.toBundle()); } }); } diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaControllerStub.java b/libraries/session/src/main/java/androidx/media3/session/MediaControllerStub.java index e107c4c437..1cb2a5e62b 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaControllerStub.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaControllerStub.java @@ -209,7 +209,9 @@ import java.util.List; browser.notifySearchResultChanged( query, itemCount, - BundleableUtil.fromNullableBundle(LibraryParams.CREATOR, libraryParams))); + libraryParams == null + ? null + : LibraryParams.CREATOR.fromBundle(libraryParams))); } @Override @@ -229,7 +231,9 @@ import java.util.List; browser.notifyChildrenChanged( parentId, itemCount, - BundleableUtil.fromNullableBundle(LibraryParams.CREATOR, libraryParams))); + libraryParams == null + ? null + : LibraryParams.CREATOR.fromBundle(libraryParams))); } public void destroy() { diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSessionStub.java b/libraries/session/src/main/java/androidx/media3/session/MediaSessionStub.java index cd383d2d63..6336e72590 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSessionStub.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSessionStub.java @@ -1521,7 +1521,7 @@ import java.util.concurrent.ExecutionException; } @Nullable LibraryParams libraryParams = - BundleableUtil.fromNullableBundle(LibraryParams.CREATOR, libraryParamsBundle); + libraryParamsBundle == null ? null : LibraryParams.CREATOR.fromBundle(libraryParamsBundle); dispatchSessionTaskWithLibrarySessionCommand( caller, seq, @@ -1576,7 +1576,7 @@ import java.util.concurrent.ExecutionException; } @Nullable LibraryParams libraryParams = - BundleableUtil.fromNullableBundle(LibraryParams.CREATOR, libraryParamsBundle); + libraryParamsBundle == null ? null : LibraryParams.CREATOR.fromBundle(libraryParamsBundle); dispatchSessionTaskWithLibrarySessionCommand( caller, seq, @@ -1602,7 +1602,7 @@ import java.util.concurrent.ExecutionException; } @Nullable LibraryParams libraryParams = - BundleableUtil.fromNullableBundle(LibraryParams.CREATOR, libraryParamsBundle); + libraryParamsBundle == null ? null : LibraryParams.CREATOR.fromBundle(libraryParamsBundle); dispatchSessionTaskWithLibrarySessionCommand( caller, seq, @@ -1637,7 +1637,7 @@ import java.util.concurrent.ExecutionException; } @Nullable LibraryParams libraryParams = - BundleableUtil.fromNullableBundle(LibraryParams.CREATOR, libraryParamsBundle); + libraryParamsBundle == null ? null : LibraryParams.CREATOR.fromBundle(libraryParamsBundle); dispatchSessionTaskWithLibrarySessionCommand( caller, seq, @@ -1663,7 +1663,7 @@ import java.util.concurrent.ExecutionException; } @Nullable LibraryParams libraryParams = - BundleableUtil.fromNullableBundle(LibraryParams.CREATOR, libraryParamsBundle); + libraryParamsBundle == null ? null : LibraryParams.CREATOR.fromBundle(libraryParamsBundle); dispatchSessionTaskWithLibrarySessionCommand( caller, seq, @@ -1769,7 +1769,7 @@ import java.util.concurrent.ExecutionException; int seq, String parentId, int itemCount, @Nullable LibraryParams params) throws RemoteException { iController.onChildrenChanged( - seq, parentId, itemCount, BundleableUtil.toNullableBundle(params)); + seq, parentId, itemCount, params == null ? null : params.toBundle()); } @SuppressWarnings("nullness:argument") // params can be null. @@ -1778,7 +1778,7 @@ import java.util.concurrent.ExecutionException; int seq, String query, int itemCount, @Nullable LibraryParams params) throws RemoteException { iController.onSearchResultChanged( - seq, query, itemCount, BundleableUtil.toNullableBundle(params)); + seq, query, itemCount, params == null ? null : params.toBundle()); } @Override diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaStyleNotificationHelper.java b/libraries/session/src/main/java/androidx/media3/session/MediaStyleNotificationHelper.java index 13b0ccaf3b..082c0e36dc 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaStyleNotificationHelper.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaStyleNotificationHelper.java @@ -29,7 +29,6 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.core.app.NotificationBuilderWithBuilderAccessor; import androidx.media3.common.util.Assertions; -import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.UnstableApi; import org.checkerframework.checker.nullness.compatqual.NullableType; @@ -97,8 +96,10 @@ public class MediaStyleNotificationHelper { if (extras == null) { return null; } - return BundleableUtil.fromNullableBundle( - SessionToken.CREATOR, extras.getBundle(EXTRA_MEDIA3_SESSION)); + Bundle sessionTokenBundle = extras.getBundle(EXTRA_MEDIA3_SESSION); + return sessionTokenBundle == null + ? null + : SessionToken.CREATOR.fromBundle(sessionTokenBundle); } private static final int MAX_MEDIA_BUTTONS_IN_COMPACT = 3; diff --git a/libraries/session/src/main/java/androidx/media3/session/PlayerInfo.java b/libraries/session/src/main/java/androidx/media3/session/PlayerInfo.java index 87e3637fc4..f6bd408b7a 100644 --- a/libraries/session/src/main/java/androidx/media3/session/PlayerInfo.java +++ b/libraries/session/src/main/java/androidx/media3/session/PlayerInfo.java @@ -45,7 +45,6 @@ import androidx.media3.common.TrackSelectionParameters; import androidx.media3.common.VideoSize; import androidx.media3.common.text.CueGroup; import androidx.media3.common.util.Assertions; -import androidx.media3.common.util.BundleableUtil; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -733,14 +732,13 @@ import java.lang.annotation.Target; boolean excludeCues, boolean excludeTimeline) { Bundle bundle = new Bundle(); - bundle.putBundle( - keyForField(FIELD_PLAYBACK_ERROR), BundleableUtil.toNullableBundle(playerError)); + if (playerError != null) { + bundle.putBundle(keyForField(FIELD_PLAYBACK_ERROR), playerError.toBundle()); + } bundle.putInt(keyForField(FIELD_MEDIA_ITEM_TRANSITION_REASON), mediaItemTransitionReason); bundle.putBundle(keyForField(FIELD_SESSION_POSITION_INFO), sessionPositionInfo.toBundle()); - bundle.putBundle( - keyForField(FIELD_OLD_POSITION_INFO), BundleableUtil.toNullableBundle(oldPositionInfo)); - bundle.putBundle( - keyForField(FIELD_NEW_POSITION_INFO), BundleableUtil.toNullableBundle(newPositionInfo)); + bundle.putBundle(keyForField(FIELD_OLD_POSITION_INFO), oldPositionInfo.toBundle()); + bundle.putBundle(keyForField(FIELD_NEW_POSITION_INFO), newPositionInfo.toBundle()); bundle.putInt(keyForField(FIELD_DISCONTINUITY_REASON), discontinuityReason); bundle.putBundle(keyForField(FIELD_PLAYBACK_PARAMETERS), playbackParameters.toBundle()); bundle.putInt(keyForField(FIELD_REPEAT_MODE), repeatMode); @@ -749,11 +747,9 @@ import java.lang.annotation.Target; bundle.putBundle(keyForField(FIELD_TIMELINE), timeline.toBundle(excludeMediaItems)); } bundle.putBundle(keyForField(FIELD_VIDEO_SIZE), videoSize.toBundle()); - bundle.putBundle( - keyForField(FIELD_PLAYLIST_METADATA), - excludeMediaItemsMetadata - ? MediaMetadata.EMPTY.toBundle() - : BundleableUtil.toNullableBundle(playlistMetadata)); + if (!excludeMediaItemsMetadata) { + bundle.putBundle(keyForField(FIELD_PLAYLIST_METADATA), playlistMetadata.toBundle()); + } bundle.putFloat(keyForField(FIELD_VOLUME), volume); bundle.putBundle(keyForField(FIELD_AUDIO_ATTRIBUTES), audioAttributes.toBundle()); if (!excludeCues) { @@ -793,67 +789,69 @@ import java.lang.annotation.Target; public static final Creator CREATOR = PlayerInfo::fromBundle; private static PlayerInfo fromBundle(Bundle bundle) { + @Nullable Bundle playerErrorBundle = bundle.getBundle(keyForField(FIELD_PLAYBACK_ERROR)); @Nullable PlaybackException playerError = - BundleableUtil.fromNullableBundle( - PlaybackException.CREATOR, bundle.getBundle(keyForField(FIELD_PLAYBACK_ERROR))); + playerErrorBundle == null ? null : PlaybackException.CREATOR.fromBundle(playerErrorBundle); int mediaItemTransitionReason = bundle.getInt( keyForField(FIELD_MEDIA_ITEM_TRANSITION_REASON), MEDIA_ITEM_TRANSITION_REASON_REPEAT); + @Nullable + Bundle sessionPositionInfoBundle = bundle.getBundle(keyForField(FIELD_SESSION_POSITION_INFO)); SessionPositionInfo sessionPositionInfo = - BundleableUtil.fromNullableBundle( - SessionPositionInfo.CREATOR, - bundle.getBundle(keyForField(FIELD_SESSION_POSITION_INFO)), - SessionPositionInfo.DEFAULT); + sessionPositionInfoBundle == null + ? SessionPositionInfo.DEFAULT + : SessionPositionInfo.CREATOR.fromBundle(sessionPositionInfoBundle); + @Nullable Bundle oldPositionInfoBundle = bundle.getBundle(keyForField(FIELD_OLD_POSITION_INFO)); PositionInfo oldPositionInfo = - BundleableUtil.fromNullableBundle( - PositionInfo.CREATOR, - bundle.getBundle(keyForField(FIELD_OLD_POSITION_INFO)), - SessionPositionInfo.DEFAULT_POSITION_INFO); + oldPositionInfoBundle == null + ? SessionPositionInfo.DEFAULT_POSITION_INFO + : PositionInfo.CREATOR.fromBundle(oldPositionInfoBundle); + @Nullable Bundle newPositionInfoBundle = bundle.getBundle(keyForField(FIELD_NEW_POSITION_INFO)); PositionInfo newPositionInfo = - BundleableUtil.fromNullableBundle( - PositionInfo.CREATOR, - bundle.getBundle(keyForField(FIELD_NEW_POSITION_INFO)), - SessionPositionInfo.DEFAULT_POSITION_INFO); + newPositionInfoBundle == null + ? SessionPositionInfo.DEFAULT_POSITION_INFO + : PositionInfo.CREATOR.fromBundle(newPositionInfoBundle); int discontinuityReason = bundle.getInt( keyForField(FIELD_DISCONTINUITY_REASON), DISCONTINUITY_REASON_AUTO_TRANSITION); @Nullable Bundle playbackParametersBundle = bundle.getBundle(keyForField(FIELD_PLAYBACK_PARAMETERS)); PlaybackParameters playbackParameters = - BundleableUtil.fromNullableBundle( - PlaybackParameters.CREATOR, - playbackParametersBundle, - /* defaultValue= */ PlaybackParameters.DEFAULT); + playbackParametersBundle == null + ? PlaybackParameters.DEFAULT + : PlaybackParameters.CREATOR.fromBundle(playbackParametersBundle); @Player.RepeatMode int repeatMode = bundle.getInt(keyForField(FIELD_REPEAT_MODE), /* defaultValue= */ Player.REPEAT_MODE_OFF); boolean shuffleModeEnabled = bundle.getBoolean(keyForField(FIELD_SHUFFLE_MODE_ENABLED), /* defaultValue= */ false); + @Nullable Bundle timelineBundle = bundle.getBundle(keyForField(FIELD_TIMELINE)); Timeline timeline = - BundleableUtil.fromNullableBundle( - Timeline.CREATOR, bundle.getBundle(keyForField(FIELD_TIMELINE)), Timeline.EMPTY); + timelineBundle == null ? Timeline.EMPTY : Timeline.CREATOR.fromBundle(timelineBundle); + @Nullable Bundle videoSizeBundle = bundle.getBundle(keyForField(FIELD_VIDEO_SIZE)); VideoSize videoSize = - BundleableUtil.fromNullableBundle( - VideoSize.CREATOR, bundle.getBundle(keyForField(FIELD_VIDEO_SIZE)), VideoSize.UNKNOWN); + videoSizeBundle == null ? VideoSize.UNKNOWN : VideoSize.CREATOR.fromBundle(videoSizeBundle); + @Nullable + Bundle playlistMetadataBundle = bundle.getBundle(keyForField(FIELD_PLAYLIST_METADATA)); MediaMetadata playlistMetadata = - BundleableUtil.fromNullableBundle( - MediaMetadata.CREATOR, - bundle.getBundle(keyForField(FIELD_PLAYLIST_METADATA)), - MediaMetadata.EMPTY); + playlistMetadataBundle == null + ? MediaMetadata.EMPTY + : MediaMetadata.CREATOR.fromBundle(playlistMetadataBundle); float volume = bundle.getFloat(keyForField(FIELD_VOLUME), /* defaultValue= */ 1); + @Nullable Bundle audioAttributesBundle = bundle.getBundle(keyForField(FIELD_AUDIO_ATTRIBUTES)); AudioAttributes audioAttributes = - BundleableUtil.fromNullableBundle( - AudioAttributes.CREATOR, - bundle.getBundle(keyForField(FIELD_AUDIO_ATTRIBUTES)), - /* defaultValue= */ AudioAttributes.DEFAULT); + audioAttributesBundle == null + ? AudioAttributes.DEFAULT + : AudioAttributes.CREATOR.fromBundle(audioAttributesBundle); + @Nullable Bundle cueGroupBundle = bundle.getBundle(keyForField(FIELD_CUE_GROUP)); CueGroup cueGroup = - BundleableUtil.fromNullableBundle( - CueGroup.CREATOR, bundle.getBundle(keyForField(FIELD_CUE_GROUP)), CueGroup.EMPTY); + cueGroupBundle == null ? CueGroup.EMPTY : CueGroup.CREATOR.fromBundle(cueGroupBundle); @Nullable Bundle deviceInfoBundle = bundle.getBundle(keyForField(FIELD_DEVICE_INFO)); DeviceInfo deviceInfo = - BundleableUtil.fromNullableBundle( - DeviceInfo.CREATOR, deviceInfoBundle, /* defaultValue= */ DeviceInfo.UNKNOWN); + deviceInfoBundle == null + ? DeviceInfo.UNKNOWN + : DeviceInfo.CREATOR.fromBundle(deviceInfoBundle); int deviceVolume = bundle.getInt(keyForField(FIELD_DEVICE_VOLUME), /* defaultValue= */ 0); boolean deviceMuted = bundle.getBoolean(keyForField(FIELD_DEVICE_MUTED), /* defaultValue= */ false); @@ -873,11 +871,11 @@ import java.lang.annotation.Target; bundle.getInt(keyForField(FIELD_PLAYBACK_STATE), /* defaultValue= */ STATE_IDLE); boolean isPlaying = bundle.getBoolean(keyForField(FIELD_IS_PLAYING), /* defaultValue= */ false); boolean isLoading = bundle.getBoolean(keyForField(FIELD_IS_LOADING), /* defaultValue= */ false); + @Nullable Bundle mediaMetadataBundle = bundle.getBundle(keyForField(FIELD_MEDIA_METADATA)); MediaMetadata mediaMetadata = - BundleableUtil.fromNullableBundle( - MediaMetadata.CREATOR, - bundle.getBundle(keyForField(FIELD_MEDIA_METADATA)), - MediaMetadata.EMPTY); + mediaMetadataBundle == null + ? MediaMetadata.EMPTY + : MediaMetadata.CREATOR.fromBundle(mediaMetadataBundle); long seekBackIncrementMs = bundle.getLong(keyForField(FIELD_SEEK_BACK_INCREMENT_MS), /* defaultValue= */ 0); long seekForwardIncrementMs = diff --git a/libraries/session/src/main/java/androidx/media3/session/SessionPositionInfo.java b/libraries/session/src/main/java/androidx/media3/session/SessionPositionInfo.java index ed75a7603d..149ef552db 100644 --- a/libraries/session/src/main/java/androidx/media3/session/SessionPositionInfo.java +++ b/libraries/session/src/main/java/androidx/media3/session/SessionPositionInfo.java @@ -23,7 +23,6 @@ import androidx.annotation.Nullable; import androidx.media3.common.Bundleable; import androidx.media3.common.C; import androidx.media3.common.Player.PositionInfo; -import androidx.media3.common.util.BundleableUtil; import com.google.common.base.Objects; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -209,11 +208,11 @@ import java.lang.annotation.Target; public static final Creator CREATOR = SessionPositionInfo::fromBundle; private static SessionPositionInfo fromBundle(Bundle bundle) { + @Nullable Bundle positionInfoBundle = bundle.getBundle(keyForField(FIELD_POSITION_INFO)); PositionInfo positionInfo = - BundleableUtil.fromNullableBundle( - PositionInfo.CREATOR, - bundle.getBundle(keyForField(FIELD_POSITION_INFO)), - /* defaultValue= */ DEFAULT_POSITION_INFO); + positionInfoBundle == null + ? DEFAULT_POSITION_INFO + : PositionInfo.CREATOR.fromBundle(positionInfoBundle); boolean isPlayingAd = bundle.getBoolean(keyForField(FIELD_IS_PLAYING_AD), /* defaultValue= */ false); long eventTimeMs = diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaControllerProviderService.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaControllerProviderService.java index 33e2b4fc8c..2912517f69 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaControllerProviderService.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaControllerProviderService.java @@ -165,7 +165,9 @@ public class MediaControllerProviderService extends Service { return runOnHandler( () -> { MediaController controller = mediaControllerMap.get(controllerId); - return BundleableUtil.toNullableBundle(controller.getConnectedToken()); + return controller.getConnectedToken() == null + ? null + : controller.getConnectedToken().toBundle(); }); } @@ -679,8 +681,9 @@ public class MediaControllerProviderService extends Service { runOnHandler( () -> browser.getLibraryRoot( - BundleableUtil.fromNullableBundle( - MediaLibraryService.LibraryParams.CREATOR, libraryParams))); + libraryParams == null + ? null + : MediaLibraryService.LibraryParams.CREATOR.fromBundle(libraryParams))); LibraryResult result = getFutureResult(future); return result.toBundle(); } @@ -694,8 +697,9 @@ public class MediaControllerProviderService extends Service { () -> browser.subscribe( parentId, - BundleableUtil.fromNullableBundle( - MediaLibraryService.LibraryParams.CREATOR, libraryParams))); + libraryParams == null + ? null + : MediaLibraryService.LibraryParams.CREATOR.fromBundle(libraryParams))); LibraryResult result = getFutureResult(future); return result.toBundle(); } @@ -720,8 +724,9 @@ public class MediaControllerProviderService extends Service { parentId, page, pageSize, - BundleableUtil.fromNullableBundle( - MediaLibraryService.LibraryParams.CREATOR, libraryParams))); + libraryParams == null + ? null + : MediaLibraryService.LibraryParams.CREATOR.fromBundle(libraryParams))); LibraryResult> result = getFutureResult(future); return result.toBundle(); } @@ -743,8 +748,9 @@ public class MediaControllerProviderService extends Service { () -> browser.search( query, - BundleableUtil.fromNullableBundle( - MediaLibraryService.LibraryParams.CREATOR, libraryParams))); + libraryParams == null + ? null + : MediaLibraryService.LibraryParams.CREATOR.fromBundle(libraryParams))); LibraryResult result = getFutureResult(future); return result.toBundle(); } @@ -761,8 +767,9 @@ public class MediaControllerProviderService extends Service { query, page, pageSize, - BundleableUtil.fromNullableBundle( - MediaLibraryService.LibraryParams.CREATOR, libraryParams))); + libraryParams == null + ? null + : MediaLibraryService.LibraryParams.CREATOR.fromBundle(libraryParams))); LibraryResult> result = getFutureResult(future); return result.toBundle(); } diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java index 9d6eafcf83..a0e11fcab3 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MediaSessionProviderService.java @@ -79,7 +79,6 @@ import androidx.media3.common.Timeline; import androidx.media3.common.TrackSelectionParameters; import androidx.media3.common.VideoSize; import androidx.media3.common.text.CueGroup; -import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; @@ -261,9 +260,10 @@ public class MediaSessionProviderService extends Service { private Player createMockPlayer(Bundle config) { MockPlayer player = new MockPlayer.Builder().build(); - player.playerError = - BundleableUtil.fromNullableBundle( - PlaybackException.CREATOR, config.getBundle(KEY_PLAYER_ERROR), player.playerError); + @Nullable Bundle playerErrorBundle = config.getBundle(KEY_PLAYER_ERROR); + if (playerErrorBundle != null) { + player.playerError = PlaybackException.CREATOR.fromBundle(playerErrorBundle); + } player.currentPosition = config.getLong(KEY_CURRENT_POSITION, player.currentPosition); player.bufferedPosition = config.getLong(KEY_BUFFERED_POSITION, player.bufferedPosition); player.bufferedPercentage = config.getInt(KEY_BUFFERED_PERCENTAGE, player.bufferedPercentage); @@ -280,38 +280,38 @@ public class MediaSessionProviderService extends Service { config.getInt(KEY_CURRENT_AD_GROUP_INDEX, player.currentAdGroupIndex); player.currentAdIndexInAdGroup = config.getInt(KEY_CURRENT_AD_INDEX_IN_AD_GROUP, player.currentAdIndexInAdGroup); - player.playbackParameters = - BundleableUtil.fromNullableBundle( - PlaybackParameters.CREATOR, - config.getBundle(KEY_PLAYBACK_PARAMETERS), - player.playbackParameters); - player.timeline = - BundleableUtil.fromNullableBundle( - Timeline.CREATOR, config.getBundle(KEY_TIMELINE), player.timeline); + @Nullable Bundle playbackParametersBundle = config.getBundle(KEY_PLAYBACK_PARAMETERS); + if (playbackParametersBundle != null) { + player.playbackParameters = PlaybackParameters.CREATOR.fromBundle(playbackParametersBundle); + } + @Nullable Bundle timelineBundle = config.getBundle(KEY_TIMELINE); + if (timelineBundle != null) { + player.timeline = Timeline.CREATOR.fromBundle(timelineBundle); + } player.currentMediaItemIndex = config.getInt(KEY_CURRENT_MEDIA_ITEM_INDEX, player.currentMediaItemIndex); player.currentPeriodIndex = config.getInt(KEY_CURRENT_PERIOD_INDEX, player.currentPeriodIndex); - player.playlistMetadata = - BundleableUtil.fromNullableBundle( - MediaMetadata.CREATOR, - config.getBundle(KEY_PLAYLIST_METADATA), - player.playlistMetadata); - player.videoSize = - BundleableUtil.fromNullableBundle( - VideoSize.CREATOR, config.getBundle(KEY_VIDEO_SIZE), player.videoSize); + @Nullable Bundle playlistMetadataBundle = config.getBundle(KEY_PLAYLIST_METADATA); + if (playlistMetadataBundle != null) { + player.playlistMetadata = MediaMetadata.CREATOR.fromBundle(playlistMetadataBundle); + } + @Nullable Bundle videoSizeBundle = config.getBundle(KEY_VIDEO_SIZE); + if (videoSizeBundle != null) { + player.videoSize = VideoSize.CREATOR.fromBundle(videoSizeBundle); + } player.volume = config.getFloat(KEY_VOLUME, player.volume); - player.audioAttributes = - BundleableUtil.fromNullableBundle( - AudioAttributes.CREATOR, - config.getBundle(KEY_AUDIO_ATTRIBUTES), - player.audioAttributes); + @Nullable Bundle audioAttributesBundle = config.getBundle(KEY_AUDIO_ATTRIBUTES); + if (audioAttributesBundle != null) { + player.audioAttributes = AudioAttributes.CREATOR.fromBundle(audioAttributesBundle); + } + Bundle cueGroupBundle = config.getBundle(KEY_CURRENT_CUE_GROUP); player.cueGroup = - BundleableUtil.fromNullableBundle( - CueGroup.CREATOR, config.getBundle(KEY_CURRENT_CUE_GROUP), CueGroup.EMPTY); - player.deviceInfo = - BundleableUtil.fromNullableBundle( - DeviceInfo.CREATOR, config.getBundle(KEY_DEVICE_INFO), player.deviceInfo); + cueGroupBundle == null ? CueGroup.EMPTY : CueGroup.CREATOR.fromBundle(cueGroupBundle); + @Nullable Bundle deviceInfoBundle = config.getBundle(KEY_DEVICE_INFO); + if (deviceInfoBundle != null) { + player.deviceInfo = DeviceInfo.CREATOR.fromBundle(deviceInfoBundle); + } player.deviceVolume = config.getInt(KEY_DEVICE_VOLUME, player.deviceVolume); player.deviceMuted = config.getBoolean(KEY_DEVICE_MUTED, player.deviceMuted); player.playWhenReady = config.getBoolean(KEY_PLAY_WHEN_READY, player.playWhenReady); @@ -327,9 +327,10 @@ public class MediaSessionProviderService extends Service { config.getLong(KEY_SEEK_BACK_INCREMENT_MS, player.seekBackIncrementMs); player.seekForwardIncrementMs = config.getLong(KEY_SEEK_FORWARD_INCREMENT_MS, player.seekForwardIncrementMs); - player.mediaMetadata = - BundleableUtil.fromNullableBundle( - MediaMetadata.CREATOR, config.getBundle(KEY_MEDIA_METADATA), player.mediaMetadata); + @Nullable Bundle mediaMetadataBundle = config.getBundle(KEY_MEDIA_METADATA); + if (mediaMetadataBundle != null) { + player.mediaMetadata = MediaMetadata.CREATOR.fromBundle(mediaMetadataBundle); + } player.maxSeekToPreviousPositionMs = config.getLong(KEY_MAX_SEEK_TO_PREVIOUS_POSITION_MS, player.maxSeekToPreviousPositionMs); @Nullable @@ -420,8 +421,9 @@ public class MediaSessionProviderService extends Service { MockPlayer player = (MockPlayer) session.getPlayer(); @Nullable PlaybackException playerError = - BundleableUtil.fromNullableBundle( - PlaybackException.CREATOR, playerErrorBundle, player.playerError); + playerErrorBundle == null + ? player.playerError + : PlaybackException.CREATOR.fromBundle(playerErrorBundle); player.notifyPlayerError(playerError); }); } @@ -780,8 +782,9 @@ public class MediaSessionProviderService extends Service { MediaSession session = sessionMap.get(sessionId); MockPlayer player = (MockPlayer) session.getPlayer(); player.notifyAvailableCommandsChanged( - BundleableUtil.fromNullableBundle( - Player.Commands.CREATOR, commandsBundle, Player.Commands.EMPTY)); + commandsBundle == null + ? Player.Commands.EMPTY + : Player.Commands.CREATOR.fromBundle(commandsBundle)); }); } diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java b/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java index 49550bbb05..ab2539a1ec 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/MockMediaLibraryService.java @@ -61,7 +61,6 @@ import androidx.annotation.GuardedBy; import androidx.annotation.Nullable; import androidx.media3.common.MediaItem; import androidx.media3.common.MediaMetadata; -import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; @@ -102,6 +101,7 @@ public class MockMediaLibraryService extends MediaLibraryService { private static boolean assertLibraryParams; @GuardedBy("MockMediaLibraryService.class") + @Nullable private static LibraryParams expectedParams; MediaLibrarySession session; @@ -162,7 +162,7 @@ public class MockMediaLibraryService extends MediaLibraryService { super.attachBaseContext(base); } - public static void setAssertLibraryParams(LibraryParams expectedParams) { + public static void setAssertLibraryParams(@Nullable LibraryParams expectedParams) { synchronized (MockMediaLibraryService.class) { assertLibraryParams = true; MockMediaLibraryService.expectedParams = expectedParams; @@ -365,9 +365,10 @@ public class MockMediaLibraryService extends MediaLibraryService { return Futures.immediateFuture( new SessionResult(SessionResult.RESULT_SUCCESS, CUSTOM_ACTION_EXTRAS)); case CUSTOM_ACTION_ASSERT_PARAMS: + @Nullable Bundle paramsBundle = args.getBundle(CUSTOM_ACTION_ASSERT_PARAMS); + @Nullable LibraryParams params = - BundleableUtil.fromNullableBundle( - LibraryParams.CREATOR, args.getBundle(CUSTOM_ACTION_ASSERT_PARAMS)); + paramsBundle == null ? null : LibraryParams.CREATOR.fromBundle(paramsBundle); setAssertLibraryParams(params); return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS)); default: // fall out diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaBrowser.java b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaBrowser.java index 98cb9f3111..2024c90a6a 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaBrowser.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaBrowser.java @@ -20,7 +20,6 @@ import android.os.Bundle; import android.os.RemoteException; import androidx.annotation.Nullable; import androidx.media3.common.MediaItem; -import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.UnstableApi; import androidx.media3.session.MediaLibraryService.LibraryParams; import com.google.common.collect.ImmutableList; @@ -48,14 +47,14 @@ public class RemoteMediaBrowser extends RemoteMediaController { /** {@link MediaBrowser} methods. */ public LibraryResult getLibraryRoot(@Nullable LibraryParams params) throws RemoteException { - Bundle result = binder.getLibraryRoot(controllerId, BundleableUtil.toNullableBundle(params)); + Bundle result = binder.getLibraryRoot(controllerId, params == null ? null : params.toBundle()); return LibraryResult.ITEM_CREATOR.fromBundle(result); } public LibraryResult subscribe(String parentId, @Nullable LibraryParams params) throws RemoteException { Bundle result = - binder.subscribe(controllerId, parentId, BundleableUtil.toNullableBundle(params)); + binder.subscribe(controllerId, parentId, params == null ? null : params.toBundle()); return LibraryResult.VOID_CREATOR.fromBundle(result); } @@ -69,7 +68,7 @@ public class RemoteMediaBrowser extends RemoteMediaController { throws RemoteException { Bundle result = binder.getChildren( - controllerId, parentId, page, pageSize, BundleableUtil.toNullableBundle(params)); + controllerId, parentId, page, pageSize, params == null ? null : params.toBundle()); return LibraryResult.ITEM_LIST_CREATOR.fromBundle(result); } @@ -80,7 +79,7 @@ public class RemoteMediaBrowser extends RemoteMediaController { public LibraryResult search(String query, @Nullable LibraryParams params) throws RemoteException { - Bundle result = binder.search(controllerId, query, BundleableUtil.toNullableBundle(params)); + Bundle result = binder.search(controllerId, query, params == null ? null : params.toBundle()); return LibraryResult.VOID_CREATOR.fromBundle(result); } @@ -88,7 +87,7 @@ public class RemoteMediaBrowser extends RemoteMediaController { String query, int page, int pageSize, @Nullable LibraryParams params) throws RemoteException { Bundle result = binder.getSearchResult( - controllerId, query, page, pageSize, BundleableUtil.toNullableBundle(params)); + controllerId, query, page, pageSize, params == null ? null : params.toBundle()); return LibraryResult.ITEM_LIST_CREATOR.fromBundle(result); } diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaController.java b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaController.java index 16676e0e78..4c34fded93 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaController.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaController.java @@ -29,6 +29,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; +import androidx.annotation.Nullable; import androidx.media3.common.MediaItem; import androidx.media3.common.MediaMetadata; import androidx.media3.common.PlaybackParameters; @@ -87,9 +88,10 @@ public class RemoteMediaController { // MediaController methods //////////////////////////////////////////////////////////////////////////////// + @Nullable public SessionToken getConnectedSessionToken() throws RemoteException { - return BundleableUtil.fromNullableBundle( - SessionToken.CREATOR, binder.getConnectedSessionToken(controllerId)); + @Nullable Bundle sessionTokenBundle = binder.getConnectedSessionToken(controllerId); + return sessionTokenBundle == null ? null : SessionToken.CREATOR.fromBundle(sessionTokenBundle); } public void play() throws RemoteException { @@ -133,7 +135,7 @@ public class RemoteMediaController { } public void setPlaybackParameters(PlaybackParameters playbackParameters) throws RemoteException { - binder.setPlaybackParameters(controllerId, BundleableUtil.toNullableBundle(playbackParameters)); + binder.setPlaybackParameters(controllerId, playbackParameters.toBundle()); } public void setPlaybackSpeed(float speed) throws RemoteException { diff --git a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaSession.java b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaSession.java index 14d493be9f..65d249161b 100644 --- a/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaSession.java +++ b/libraries/test_session_current/src/main/java/androidx/media3/session/RemoteMediaSession.java @@ -79,7 +79,6 @@ import androidx.media3.common.Timeline; import androidx.media3.common.TrackSelectionParameters; import androidx.media3.common.VideoSize; import androidx.media3.common.text.CueGroup; -import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; import androidx.media3.test.session.common.IRemoteMediaSession; @@ -206,7 +205,7 @@ public class RemoteMediaSession { public class RemoteMockPlayer { public void notifyPlayerError(@Nullable PlaybackException playerError) throws RemoteException { - binder.notifyPlayerError(sessionId, BundleableUtil.toNullableBundle(playerError)); + binder.notifyPlayerError(sessionId, playerError == null ? null : playerError.toBundle()); } public void setPlayWhenReady( @@ -491,7 +490,9 @@ public class RemoteMediaSession { } public MockPlayerConfigBuilder setPlayerError(@Nullable PlaybackException playerError) { - bundle.putBundle(KEY_PLAYER_ERROR, BundleableUtil.toNullableBundle(playerError)); + if (playerError != null) { + bundle.putBundle(KEY_PLAYER_ERROR, playerError.toBundle()); + } return this; }