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 28242167ad..afb2175972 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 @@ -159,10 +159,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { * A builder for {@link Parameters}. See the {@link Parameters} documentation for explanations of * the parameters that can be configured using this builder. */ - public static final class ParametersBuilder { - - private final SparseArray> selectionOverrides; - private final SparseBooleanArray rendererDisabledFlags; + public static final class ParametersBuilder extends TrackSelectionParameters.Builder { // Video private int maxVideoWidth; @@ -176,22 +173,20 @@ public class DefaultTrackSelector extends MappingTrackSelector { private int viewportHeight; private boolean viewportOrientationMayChange; // Audio - @Nullable private String preferredAudioLanguage; private int maxAudioChannelCount; private int maxAudioBitrate; private boolean exceedAudioConstraintsIfNecessary; private boolean allowAudioMixedMimeTypeAdaptiveness; private boolean allowAudioMixedSampleRateAdaptiveness; - // Text - @Nullable private String preferredTextLanguage; - private boolean selectUndeterminedTextLanguage; - private int disabledTextTrackSelectionFlags; // General private boolean forceLowestBitrate; private boolean forceHighestSupportedBitrate; private boolean exceedRendererCapabilitiesIfNecessary; private int tunnelingAudioSessionId; + private final SparseArray> selectionOverrides; + private final SparseBooleanArray rendererDisabledFlags; + /** Creates a builder with default initial values. */ public ParametersBuilder() { this(Parameters.DEFAULT); @@ -202,6 +197,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { * obtained. */ private ParametersBuilder(Parameters initialValues) { + super(initialValues); // Video maxVideoWidth = initialValues.maxVideoWidth; maxVideoHeight = initialValues.maxVideoHeight; @@ -214,16 +210,11 @@ public class DefaultTrackSelector extends MappingTrackSelector { viewportHeight = initialValues.viewportHeight; viewportOrientationMayChange = initialValues.viewportOrientationMayChange; // Audio - preferredAudioLanguage = initialValues.preferredAudioLanguage; maxAudioChannelCount = initialValues.maxAudioChannelCount; maxAudioBitrate = initialValues.maxAudioBitrate; exceedAudioConstraintsIfNecessary = initialValues.exceedAudioConstraintsIfNecessary; allowAudioMixedMimeTypeAdaptiveness = initialValues.allowAudioMixedMimeTypeAdaptiveness; allowAudioMixedSampleRateAdaptiveness = initialValues.allowAudioMixedSampleRateAdaptiveness; - // Text - preferredTextLanguage = initialValues.preferredTextLanguage; - selectUndeterminedTextLanguage = initialValues.selectUndeterminedTextLanguage; - disabledTextTrackSelectionFlags = initialValues.disabledTextTrackSelectionFlags; // General forceLowestBitrate = initialValues.forceLowestBitrate; forceHighestSupportedBitrate = initialValues.forceHighestSupportedBitrate; @@ -362,15 +353,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { // Audio - /** - * See {@link Parameters#preferredAudioLanguage}. - * - * @param preferredAudioLanguage Preferred audio language as an ISO 639-1 two-letter or ISO - * 639-2 three-letter code. - * @return This builder. - */ + @Override public ParametersBuilder setPreferredAudioLanguage(String preferredAudioLanguage) { - this.preferredAudioLanguage = preferredAudioLanguage; + super.setPreferredAudioLanguage(preferredAudioLanguage); return this; } @@ -429,40 +414,25 @@ public class DefaultTrackSelector extends MappingTrackSelector { // Text - /** - * See {@link Parameters#preferredTextLanguage}. - * - * @param preferredTextLanguage Preferred text language as an ISO 639-1 two-letter or ISO 639-2 - * three-letter code. - * @return This builder. - */ + @Override public ParametersBuilder setPreferredTextLanguage(String preferredTextLanguage) { - this.preferredTextLanguage = preferredTextLanguage; + super.setPreferredTextLanguage(preferredTextLanguage); return this; } - /** - * See {@link Parameters#selectUndeterminedTextLanguage}. - * - * @return This builder. - */ + @Override public ParametersBuilder setSelectUndeterminedTextLanguage( boolean selectUndeterminedTextLanguage) { - this.selectUndeterminedTextLanguage = selectUndeterminedTextLanguage; + super.setSelectUndeterminedTextLanguage(selectUndeterminedTextLanguage); return this; } - /** - * See {@link Parameters#disabledTextTrackSelectionFlags}. - * - * @return This builder. - */ + @Override public ParametersBuilder setDisabledTextTrackSelectionFlags( - int disabledTextTrackSelectionFlags) { - this.disabledTextTrackSelectionFlags = disabledTextTrackSelectionFlags; + @C.SelectionFlags int disabledTextTrackSelectionFlags) { + super.setDisabledTextTrackSelectionFlags(disabledTextTrackSelectionFlags); return this; } - // General /** @@ -526,10 +496,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { * C#AUDIO_SESSION_ID_UNSET} to disable tunneling. */ public ParametersBuilder setTunnelingAudioSessionId(int tunnelingAudioSessionId) { - if (this.tunnelingAudioSessionId != tunnelingAudioSessionId) { - this.tunnelingAudioSessionId = tunnelingAudioSessionId; - return this; - } + this.tunnelingAudioSessionId = tunnelingAudioSessionId; return this; } @@ -670,7 +637,6 @@ public class DefaultTrackSelector extends MappingTrackSelector { forceHighestSupportedBitrate, exceedRendererCapabilitiesIfNecessary, tunnelingAudioSessionId, - // Overrides selectionOverrides, rendererDisabledFlags); } @@ -685,16 +651,15 @@ public class DefaultTrackSelector extends MappingTrackSelector { } } - /** Constraint parameters for {@link DefaultTrackSelector}. */ - public static final class Parameters implements Parcelable { + /** + * Extends {@link TrackSelectionParameters} by adding fields that are specific to {@link + * DefaultTrackSelector}. + */ + public static final class Parameters extends TrackSelectionParameters { /** An instance with default values. */ public static final Parameters DEFAULT = new Parameters(); - // Overrides - private final SparseArray> selectionOverrides; - private final SparseBooleanArray rendererDisabledFlags; - // Video /** * Maximum allowed video width. The default value is {@link Integer#MAX_VALUE} (i.e. no @@ -759,14 +724,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { * The default value is {@code true}. */ public final boolean viewportOrientationMayChange; - // Audio - /** - * The preferred language for audio and forced text tracks, as an ISO 639-2/T tag. {@code null} - * selects the default track, or the first track if there's no default. The default value is - * {@code null}. - */ - @Nullable public final String preferredAudioLanguage; /** * Maximum allowed audio channel count. The default value is {@link Integer#MAX_VALUE} (i.e. no * constraint). @@ -792,24 +750,6 @@ public class DefaultTrackSelector extends MappingTrackSelector { */ public final boolean allowAudioMixedSampleRateAdaptiveness; - // Text - /** - * The preferred language for text tracks as an ISO 639-2/T tag. {@code null} selects the - * default track if there is one, or no track otherwise. The default value is {@code null}. - */ - @Nullable public final String preferredTextLanguage; - /** - * Whether a text track with undetermined language should be selected if no track with {@link - * #preferredTextLanguage} is available, or if {@link #preferredTextLanguage} is unset. The - * default value is {@code false}. - */ - public final boolean selectUndeterminedTextLanguage; - /** - * Bitmask of selection flags that are disabled for text track selections. See {@link - * C.SelectionFlags}. The default value is {@code 0} (i.e. no flags). - */ - public final int disabledTextTrackSelectionFlags; - // General /** * Whether to force selection of the single lowest bitrate audio and video tracks that comply @@ -845,6 +785,10 @@ public class DefaultTrackSelector extends MappingTrackSelector { */ public final int tunnelingAudioSessionId; + // Overrides + private final SparseArray> selectionOverrides; + private final SparseBooleanArray rendererDisabledFlags; + private Parameters() { this( // Video @@ -859,24 +803,23 @@ public class DefaultTrackSelector extends MappingTrackSelector { /* viewportHeight= */ Integer.MAX_VALUE, /* viewportOrientationMayChange= */ true, // Audio - /* preferredAudioLanguage= */ null, + TrackSelectionParameters.DEFAULT.preferredAudioLanguage, /* maxAudioChannelCount= */ Integer.MAX_VALUE, /* maxAudioBitrate= */ Integer.MAX_VALUE, /* exceedAudioConstraintsIfNecessary= */ true, /* allowAudioMixedMimeTypeAdaptiveness= */ false, /* allowAudioMixedSampleRateAdaptiveness= */ false, // Text - /* preferredTextLanguage= */ null, - /* selectUndeterminedTextLanguage= */ false, - /* disabledTextTrackSelectionFlags= */ 0, + TrackSelectionParameters.DEFAULT.preferredTextLanguage, + TrackSelectionParameters.DEFAULT.selectUndeterminedTextLanguage, + TrackSelectionParameters.DEFAULT.disabledTextTrackSelectionFlags, // General /* forceLowestBitrate= */ false, /* forceHighestSupportedBitrate= */ false, /* exceedRendererCapabilitiesIfNecessary= */ true, /* tunnelingAudioSessionId= */ C.AUDIO_SESSION_ID_UNSET, - // Overrides - /* selectionOverrides= */ new SparseArray<>(), - /* rendererDisabledFlags= */ new SparseBooleanArray()); + new SparseArray<>(), + new SparseBooleanArray()); } /* package */ Parameters( @@ -901,7 +844,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { // Text @Nullable String preferredTextLanguage, boolean selectUndeterminedTextLanguage, - int disabledTextTrackSelectionFlags, + @C.SelectionFlags int disabledTextTrackSelectionFlags, // General boolean forceLowestBitrate, boolean forceHighestSupportedBitrate, @@ -910,6 +853,11 @@ public class DefaultTrackSelector extends MappingTrackSelector { // Overrides SparseArray> selectionOverrides, SparseBooleanArray rendererDisabledFlags) { + super( + preferredAudioLanguage, + preferredTextLanguage, + selectUndeterminedTextLanguage, + disabledTextTrackSelectionFlags); // Video this.maxVideoWidth = maxVideoWidth; this.maxVideoHeight = maxVideoHeight; @@ -922,30 +870,26 @@ public class DefaultTrackSelector extends MappingTrackSelector { this.viewportHeight = viewportHeight; this.viewportOrientationMayChange = viewportOrientationMayChange; // Audio - this.preferredAudioLanguage = Util.normalizeLanguageCode(preferredAudioLanguage); this.maxAudioChannelCount = maxAudioChannelCount; this.maxAudioBitrate = maxAudioBitrate; this.exceedAudioConstraintsIfNecessary = exceedAudioConstraintsIfNecessary; this.allowAudioMixedMimeTypeAdaptiveness = allowAudioMixedMimeTypeAdaptiveness; this.allowAudioMixedSampleRateAdaptiveness = allowAudioMixedSampleRateAdaptiveness; - // Text - this.preferredTextLanguage = Util.normalizeLanguageCode(preferredTextLanguage); - this.selectUndeterminedTextLanguage = selectUndeterminedTextLanguage; - this.disabledTextTrackSelectionFlags = disabledTextTrackSelectionFlags; // General this.forceLowestBitrate = forceLowestBitrate; this.forceHighestSupportedBitrate = forceHighestSupportedBitrate; this.exceedRendererCapabilitiesIfNecessary = exceedRendererCapabilitiesIfNecessary; this.tunnelingAudioSessionId = tunnelingAudioSessionId; - // Overrides - this.selectionOverrides = selectionOverrides; - this.rendererDisabledFlags = rendererDisabledFlags; // Deprecated fields. this.allowMixedMimeAdaptiveness = allowVideoMixedMimeTypeAdaptiveness; this.allowNonSeamlessAdaptiveness = allowVideoNonSeamlessAdaptiveness; + // Overrides + this.selectionOverrides = selectionOverrides; + this.rendererDisabledFlags = rendererDisabledFlags; } /* package */ Parameters(Parcel in) { + super(in); // Video this.maxVideoWidth = in.readInt(); this.maxVideoHeight = in.readInt(); @@ -958,16 +902,11 @@ public class DefaultTrackSelector extends MappingTrackSelector { this.viewportHeight = in.readInt(); this.viewportOrientationMayChange = Util.readBoolean(in); // Audio - this.preferredAudioLanguage = in.readString(); this.maxAudioChannelCount = in.readInt(); this.maxAudioBitrate = in.readInt(); this.exceedAudioConstraintsIfNecessary = Util.readBoolean(in); this.allowAudioMixedMimeTypeAdaptiveness = Util.readBoolean(in); this.allowAudioMixedSampleRateAdaptiveness = Util.readBoolean(in); - // Text - this.preferredTextLanguage = in.readString(); - this.selectUndeterminedTextLanguage = Util.readBoolean(in); - this.disabledTextTrackSelectionFlags = in.readInt(); // General this.forceLowestBitrate = Util.readBoolean(in); this.forceHighestSupportedBitrate = Util.readBoolean(in); @@ -1016,9 +955,8 @@ public class DefaultTrackSelector extends MappingTrackSelector { return overrides != null ? overrides.get(groups) : null; } - /** - * Creates a new {@link ParametersBuilder}, copying the initial values from this instance. - */ + /** Creates a new {@link ParametersBuilder}, copying the initial values from this instance. */ + @Override public ParametersBuilder buildUpon() { return new ParametersBuilder(this); } @@ -1032,7 +970,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { return false; } Parameters other = (Parameters) obj; - return maxVideoWidth == other.maxVideoWidth + return super.equals(obj) + // Video + && maxVideoWidth == other.maxVideoWidth && maxVideoHeight == other.maxVideoHeight && maxVideoFrameRate == other.maxVideoFrameRate && maxVideoBitrate == other.maxVideoBitrate @@ -1043,16 +983,11 @@ public class DefaultTrackSelector extends MappingTrackSelector { && viewportWidth == other.viewportWidth && viewportHeight == other.viewportHeight // Audio - && TextUtils.equals(preferredAudioLanguage, other.preferredAudioLanguage) && maxAudioChannelCount == other.maxAudioChannelCount && maxAudioBitrate == other.maxAudioBitrate && exceedAudioConstraintsIfNecessary == other.exceedAudioConstraintsIfNecessary && allowAudioMixedMimeTypeAdaptiveness == other.allowAudioMixedMimeTypeAdaptiveness && allowAudioMixedSampleRateAdaptiveness == other.allowAudioMixedSampleRateAdaptiveness - // Text - && TextUtils.equals(preferredTextLanguage, other.preferredTextLanguage) - && selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage - && disabledTextTrackSelectionFlags == other.disabledTextTrackSelectionFlags // General && forceLowestBitrate == other.forceLowestBitrate && forceHighestSupportedBitrate == other.forceHighestSupportedBitrate @@ -1065,7 +1000,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { @Override public int hashCode() { - int result = 1; + int result = super.hashCode(); // Video result = 31 * result + maxVideoWidth; result = 31 * result + maxVideoHeight; @@ -1078,17 +1013,11 @@ public class DefaultTrackSelector extends MappingTrackSelector { result = 31 * result + viewportWidth; result = 31 * result + viewportHeight; // Audio - result = - 31 * result + (preferredAudioLanguage == null ? 0 : preferredAudioLanguage.hashCode()); result = 31 * result + maxAudioChannelCount; result = 31 * result + maxAudioBitrate; result = 31 * result + (exceedAudioConstraintsIfNecessary ? 1 : 0); result = 31 * result + (allowAudioMixedMimeTypeAdaptiveness ? 1 : 0); result = 31 * result + (allowAudioMixedSampleRateAdaptiveness ? 1 : 0); - // Text - result = 31 * result + (preferredTextLanguage == null ? 0 : preferredTextLanguage.hashCode()); - result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0); - result = 31 * result + disabledTextTrackSelectionFlags; // General result = 31 * result + (forceLowestBitrate ? 1 : 0); result = 31 * result + (forceHighestSupportedBitrate ? 1 : 0); @@ -1107,6 +1036,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { @Override public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); // Video dest.writeInt(maxVideoWidth); dest.writeInt(maxVideoHeight); @@ -1119,16 +1049,11 @@ public class DefaultTrackSelector extends MappingTrackSelector { dest.writeInt(viewportHeight); Util.writeBoolean(dest, viewportOrientationMayChange); // Audio - dest.writeString(preferredAudioLanguage); dest.writeInt(maxAudioChannelCount); dest.writeInt(maxAudioBitrate); Util.writeBoolean(dest, exceedAudioConstraintsIfNecessary); Util.writeBoolean(dest, allowAudioMixedMimeTypeAdaptiveness); Util.writeBoolean(dest, allowAudioMixedSampleRateAdaptiveness); - // Text - dest.writeString(preferredTextLanguage); - Util.writeBoolean(dest, selectUndeterminedTextLanguage); - dest.writeInt(disabledTextTrackSelectionFlags); // General Util.writeBoolean(dest, forceLowestBitrate); Util.writeBoolean(dest, forceHighestSupportedBitrate); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java new file mode 100644 index 0000000000..2bbd81854c --- /dev/null +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.trackselection; + +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.Nullable; +import android.text.TextUtils; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.util.Util; + +/** Constraint parameters for track selection. */ +public class TrackSelectionParameters implements Parcelable { + + /** + * A builder for {@link TrackSelectionParameters}. See the {@link TrackSelectionParameters} + * documentation for explanations of the parameters that can be configured using this builder. + */ + public static class Builder { + + // Audio + @Nullable /* package */ String preferredAudioLanguage; + // Text + @Nullable /* package */ String preferredTextLanguage; + /* package */ boolean selectUndeterminedTextLanguage; + @C.SelectionFlags /* package */ int disabledTextTrackSelectionFlags; + + /** Creates a builder with default initial values. */ + public Builder() { + this(DEFAULT); + } + + /** + * @param initialValues The {@link TrackSelectionParameters} from which the initial values of + * the builder are obtained. + */ + /* package */ Builder(TrackSelectionParameters initialValues) { + // Audio + preferredAudioLanguage = initialValues.preferredAudioLanguage; + // Text + preferredTextLanguage = initialValues.preferredTextLanguage; + selectUndeterminedTextLanguage = initialValues.selectUndeterminedTextLanguage; + disabledTextTrackSelectionFlags = initialValues.disabledTextTrackSelectionFlags; + } + + /** + * See {@link TrackSelectionParameters#preferredAudioLanguage}. + * + * @param preferredAudioLanguage Preferred audio language as an ISO 639-1 two-letter or ISO + * 639-2 three-letter code. + * @return This builder. + */ + public Builder setPreferredAudioLanguage(String preferredAudioLanguage) { + this.preferredAudioLanguage = preferredAudioLanguage; + return this; + } + + // Text + + /** + * See {@link TrackSelectionParameters#preferredTextLanguage}. + * + * @param preferredTextLanguage Preferred text language as an ISO 639-1 two-letter or ISO 639-2 + * three-letter code. + * @return This builder. + */ + public Builder setPreferredTextLanguage(String preferredTextLanguage) { + this.preferredTextLanguage = preferredTextLanguage; + return this; + } + + /** + * See {@link TrackSelectionParameters#selectUndeterminedTextLanguage}. + * + * @return This builder. + */ + public Builder setSelectUndeterminedTextLanguage(boolean selectUndeterminedTextLanguage) { + this.selectUndeterminedTextLanguage = selectUndeterminedTextLanguage; + return this; + } + + /** + * See {@link TrackSelectionParameters#disabledTextTrackSelectionFlags}. + * + * @return This builder. + */ + public Builder setDisabledTextTrackSelectionFlags( + @C.SelectionFlags int disabledTextTrackSelectionFlags) { + this.disabledTextTrackSelectionFlags = disabledTextTrackSelectionFlags; + return this; + } + + /** Builds a {@link TrackSelectionParameters} instance with the selected values. */ + public TrackSelectionParameters build() { + return new TrackSelectionParameters( + // Audio + preferredAudioLanguage, + // Text + preferredTextLanguage, + selectUndeterminedTextLanguage, + disabledTextTrackSelectionFlags); + } + } + + /** An instance with default values. */ + public static final TrackSelectionParameters DEFAULT = new TrackSelectionParameters(); + + /** + * The preferred language for audio and forced text tracks, as an ISO 639-2/T tag. {@code null} + * selects the default track, or the first track if there's no default. The default value is + * {@code null}. + */ + @Nullable public final String preferredAudioLanguage; + // Text + /** + * The preferred language for text tracks as an ISO 639-2/T tag. {@code null} selects the default + * track if there is one, or no track otherwise. The default value is {@code null}. + */ + @Nullable public final String preferredTextLanguage; + /** + * Whether a text track with undetermined language should be selected if no track with {@link + * #preferredTextLanguage} is available, or if {@link #preferredTextLanguage} is unset. The + * default value is {@code false}. + */ + public final boolean selectUndeterminedTextLanguage; + /** + * Bitmask of selection flags that are disabled for text track selections. See {@link + * C.SelectionFlags}. The default value is {@code 0} (i.e. no flags). + */ + @C.SelectionFlags public final int disabledTextTrackSelectionFlags; + + /* package */ TrackSelectionParameters() { + this( + /* preferredAudioLanguage= */ null, + // Text + /* preferredTextLanguage= */ null, + /* selectUndeterminedTextLanguage= */ false, + /* disabledTextTrackSelectionFlags= */ 0); + } + + /* package */ TrackSelectionParameters( + @Nullable String preferredAudioLanguage, + @Nullable String preferredTextLanguage, + boolean selectUndeterminedTextLanguage, + @C.SelectionFlags int disabledTextTrackSelectionFlags) { + // Audio + this.preferredAudioLanguage = Util.normalizeLanguageCode(preferredAudioLanguage); + // Text + this.preferredTextLanguage = Util.normalizeLanguageCode(preferredTextLanguage); + this.selectUndeterminedTextLanguage = selectUndeterminedTextLanguage; + this.disabledTextTrackSelectionFlags = disabledTextTrackSelectionFlags; + } + + /* package */ TrackSelectionParameters(Parcel in) { + // Audio + this.preferredAudioLanguage = in.readString(); + // Text + this.preferredTextLanguage = in.readString(); + this.selectUndeterminedTextLanguage = Util.readBoolean(in); + this.disabledTextTrackSelectionFlags = in.readInt(); + } + + /** Creates a new {@link Builder}, copying the initial values from this instance. */ + public Builder buildUpon() { + return new Builder(this); + } + + @Override + @SuppressWarnings("EqualsGetClass") + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + TrackSelectionParameters other = (TrackSelectionParameters) obj; + return TextUtils.equals(preferredAudioLanguage, other.preferredAudioLanguage) + // Text + && TextUtils.equals(preferredTextLanguage, other.preferredTextLanguage) + && selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage + && disabledTextTrackSelectionFlags == other.disabledTextTrackSelectionFlags; + } + + @Override + public int hashCode() { + int result = 1; + // Audio + result = 31 * result + (preferredAudioLanguage == null ? 0 : preferredAudioLanguage.hashCode()); + // Text + result = 31 * result + (preferredTextLanguage == null ? 0 : preferredTextLanguage.hashCode()); + result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0); + result = 31 * result + disabledTextTrackSelectionFlags; + return result; + } + + // Parcelable implementation. + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + // Audio + dest.writeString(preferredAudioLanguage); + // Text + dest.writeString(preferredTextLanguage); + Util.writeBoolean(dest, selectUndeterminedTextLanguage); + dest.writeInt(disabledTextTrackSelectionFlags); + } + + public static final Creator CREATOR = + new Creator() { + + @Override + public TrackSelectionParameters createFromParcel(Parcel in) { + return new TrackSelectionParameters(in); + } + + @Override + public TrackSelectionParameters[] newArray(int size) { + return new TrackSelectionParameters[size]; + } + }; +}