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 80fbdf0611..5878a7612d 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 @@ -37,6 +37,7 @@ import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -630,7 +631,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { } /** A track selection override. */ - public static class SelectionOverride { + public static final class SelectionOverride implements Parcelable { public final int groupIndex; public final int[] tracks; @@ -646,6 +647,13 @@ public class DefaultTrackSelector extends MappingTrackSelector { this.length = tracks.length; } + /* package */ SelectionOverride(Parcel in) { + groupIndex = in.readInt(); + length = in.readByte(); + tracks = new int[length]; + in.readIntArray(tracks); + } + /** Returns whether this override contains the specified track index. */ public boolean containsTrack(int track) { for (int overrideTrack : tracks) { @@ -655,6 +663,51 @@ public class DefaultTrackSelector extends MappingTrackSelector { } return false; } + + @Override + public int hashCode() { + return 31 * groupIndex + Arrays.hashCode(tracks); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + SelectionOverride other = (SelectionOverride) obj; + return groupIndex == other.groupIndex && Arrays.equals(tracks, other.tracks); + } + + // Parcelable implementation. + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(groupIndex); + dest.writeInt(tracks.length); + dest.writeIntArray(tracks); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + + @Override + public SelectionOverride createFromParcel(Parcel in) { + return new SelectionOverride(in); + } + + @Override + public SelectionOverride[] newArray(int size) { + return new SelectionOverride[size]; + } + }; } /** diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java index 4415d641e3..a97b9fc567 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java @@ -34,6 +34,7 @@ import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; import com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener; import com.google.android.exoplayer2.util.MimeTypes; import java.util.HashMap; @@ -147,6 +148,24 @@ public final class DefaultTrackSelectorTest { parcel.recycle(); } + /** Tests {@link SelectionOverride}'s {@link android.os.Parcelable} implementation. */ + @Test + public void testSelectionOverrideParcelable() { + int[] tracks = new int[] {2, 3}; + SelectionOverride selectionOverrideToParcel = + new SelectionOverride(/* groupIndex= */ 1, tracks); + + Parcel parcel = Parcel.obtain(); + selectionOverrideToParcel.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + SelectionOverride selectionOverrideFromParcel = + SelectionOverride.CREATOR.createFromParcel(parcel); + assertThat(selectionOverrideFromParcel).isEqualTo(selectionOverrideToParcel); + + parcel.recycle(); + } + /** Tests that a null override clears a track selection. */ @Test public void testSelectTracksWithNullOverride() throws ExoPlaybackException {