From aef2f154a762b84186815626ef21e8e7b6cc5a84 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 --- .../com/google/android/exoplayer2/Format.java | 16 +++-- .../com/google/android/exoplayer2/Player.java | 9 +-- .../com/google/android/exoplayer2/Tracks.java | 18 ++--- .../android/exoplayer2/source/TrackGroup.java | 9 +-- .../android/exoplayer2/text/CueGroup.java | 10 +-- .../TrackSelectionParameters.java | 12 ++-- .../exoplayer2/util/BundleableUtil.java | 69 ++++--------------- .../exoplayer2/ExoPlaybackException.java | 10 +-- .../exoplayer2/source/TrackGroupArray.java | 15 ++-- .../trackselection/DefaultTrackSelector.java | 25 ++++--- 10 files changed, 84 insertions(+), 109 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Format.java b/library/common/src/main/java/com/google/android/exoplayer2/Format.java index 6fc802ec9f..2d95d3b461 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Format.java @@ -1527,7 +1527,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); @@ -1594,11 +1596,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/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index ebf2d158a6..7fcfd60954 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -36,7 +36,6 @@ import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.CueGroup; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; -import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.FlagSet; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; @@ -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/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java b/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java index 37f86e28ad..32ddfb78af 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java @@ -17,8 +17,6 @@ package com.google.android.exoplayer2; import static com.google.android.exoplayer2.util.Assertions.checkArgument; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; -import static com.google.android.exoplayer2.util.BundleableUtil.fromBundleNullableList; -import static com.google.android.exoplayer2.util.BundleableUtil.fromNullableBundle; import static com.google.android.exoplayer2.util.BundleableUtil.toBundleArrayList; import static java.lang.annotation.ElementType.TYPE_USE; @@ -26,6 +24,7 @@ import android.os.Bundle; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.util.BundleableUtil; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; import com.google.common.primitives.Booleans; @@ -249,10 +248,10 @@ public final class Tracks implements Bundleable { /** Object that can restore a group of tracks from a {@link Bundle}. */ 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]); @@ -400,11 +399,12 @@ public final class Tracks implements Bundleable { /** Object that can restore tracks from a {@link Bundle}. */ 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/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java index 8ec348fc11..30da11da69 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java @@ -185,11 +185,12 @@ public final class TrackGroup implements Bundleable { /** Object that can restore {@code TrackGroup} from a {@link Bundle}. */ 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/library/common/src/main/java/com/google/android/exoplayer2/text/CueGroup.java b/library/common/src/main/java/com/google/android/exoplayer2/text/CueGroup.java index 5ee0658984..f2df1d1bb4 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/text/CueGroup.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/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 com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.util.BundleableUtil; import com.google.common.collect.ImmutableList; @@ -27,6 +28,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. */ @@ -71,11 +73,11 @@ public final class CueGroup implements Bundleable { 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/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java index f25ac0dc21..ded4271516 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java @@ -16,7 +16,6 @@ package com.google.android.exoplayer2.trackselection; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; -import static com.google.android.exoplayer2.util.BundleableUtil.fromBundleNullableList; import static com.google.android.exoplayer2.util.BundleableUtil.toBundleArrayList; import static com.google.common.base.MoreObjects.firstNonNull; @@ -31,6 +30,7 @@ import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -246,11 +246,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/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java index 7b59db54e8..295ff13292 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java @@ -30,34 +30,6 @@ import java.util.List; /** Utilities for {@link Bundleable}. */ 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(); @@ -80,34 +52,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} @@ -122,6 +66,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/library/core/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java index c12843aadb..05473f25cc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java @@ -31,7 +31,6 @@ import com.google.android.exoplayer2.C.FormatSupport; import com.google.android.exoplayer2.source.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.util.Assertions; -import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.lang.annotation.Documented; @@ -245,9 +244,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); @@ -409,8 +408,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/library/core/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java b/library/core/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java index 12c79f5da9..d88781e0bc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java @@ -136,12 +136,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/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java index 5689eb0918..b2df19909e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java @@ -839,18 +839,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.