Move DefaultTrackSelector.Parameters out of DefaultTrackSelector

Including ParametersBuilder and TrackSelectionOverride.

PiperOrigin-RevId: 231609249
This commit is contained in:
aquilescanta 2019-01-30 17:32:03 +00:00 committed by Oliver Woodman
parent ab67ab1aea
commit 2bd12c2270
2 changed files with 287 additions and 122 deletions

View file

@ -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<Map<TrackGroupArray, SelectionOverride>> 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<Map<TrackGroupArray, SelectionOverride>> 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<Map<TrackGroupArray, SelectionOverride>> 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<Map<TrackGroupArray, SelectionOverride>> 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<Map<TrackGroupArray, SelectionOverride>> 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);

View file

@ -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<TrackSelectionParameters> CREATOR =
new Creator<TrackSelectionParameters>() {
@Override
public TrackSelectionParameters createFromParcel(Parcel in) {
return new TrackSelectionParameters(in);
}
@Override
public TrackSelectionParameters[] newArray(int size) {
return new TrackSelectionParameters[size];
}
};
}