DownloadHelper: Accept generic TrackSelectionParameters

DownloadHelper is in the ExoPlayer module, so there's no reason
why it can't use ExoPlayer specific track selections. That said,
we want our UI components to operate on generic
TrackSelectionParameters, and we want such UI components to be
useful for selecting tracks for download. To keep this interop,
it's necessary to have DownloadHelper accept generic
TrackSelectionParameters, or to require application code to
convert them. The first approach seems preferable!

PiperOrigin-RevId: 432158846
This commit is contained in:
olly 2022-03-03 12:05:15 +00:00 committed by Ian Baker
parent 733cd609a0
commit 2cb2f6ded4
3 changed files with 90 additions and 81 deletions

View File

@ -31,6 +31,11 @@
instead. You can also continue to use `ExoPlayer.getCurrentTrackGroups` instead. You can also continue to use `ExoPlayer.getCurrentTrackGroups`
and `ExoPlayer.getCurrentTrackSelections`, although these methods remain and `ExoPlayer.getCurrentTrackSelections`, although these methods remain
deprecated. deprecated.
* Remove `DownloadHelper`
`DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT` and
`DEFAULT_TRACK_SELECTOR_PARAMETERS` constants. Use
`getDefaultTrackSelectorParameters(Context)` instead when possible, and
`DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT` otherwise.
### 2.17.0 (2022-02-24) ### 2.17.0 (2022-02-24)

View File

@ -47,10 +47,10 @@ import com.google.android.exoplayer2.source.chunk.MediaChunk;
import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; import com.google.android.exoplayer2.source.chunk.MediaChunkIterator;
import com.google.android.exoplayer2.trackselection.BaseTrackSelection; import com.google.android.exoplayer2.trackselection.BaseTrackSelection;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride;
import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.trackselection.ExoTrackSelection;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
import com.google.android.exoplayer2.trackselection.TrackSelectionParameters;
import com.google.android.exoplayer2.trackselection.TrackSelectorResult; import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
@ -83,8 +83,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
* <li>Prepare the helper using {@link #prepare(Callback)} and wait for the callback. * <li>Prepare the helper using {@link #prepare(Callback)} and wait for the callback.
* <li>Optional: Inspect the selected tracks using {@link #getMappedTrackInfo(int)} and {@link * <li>Optional: Inspect the selected tracks using {@link #getMappedTrackInfo(int)} and {@link
* #getTrackSelections(int, int)}, and make adjustments using {@link * #getTrackSelections(int, int)}, and make adjustments using {@link
* #clearTrackSelections(int)}, {@link #replaceTrackSelections(int, Parameters)} and {@link * #clearTrackSelections(int)}, {@link #replaceTrackSelections(int, TrackSelectionParameters)}
* #addTrackSelection(int, Parameters)}. * and {@link #addTrackSelection(int, TrackSelectionParameters)}.
* <li>Create a download request for the selected track using {@link #getDownloadRequest(byte[])}. * <li>Create a download request for the selected track using {@link #getDownloadRequest(byte[])}.
* <li>Release the helper using {@link #release()}. * <li>Release the helper using {@link #release()}.
* </ol> * </ol>
@ -97,30 +97,18 @@ public final class DownloadHelper {
* *
* <p>If possible, use {@link #getDefaultTrackSelectorParameters(Context)} instead. * <p>If possible, use {@link #getDefaultTrackSelectorParameters(Context)} instead.
* *
* @see Parameters#DEFAULT_WITHOUT_CONTEXT * @see DefaultTrackSelector.Parameters#DEFAULT_WITHOUT_CONTEXT
*/ */
public static final Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT = public static final DefaultTrackSelector.Parameters
Parameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().setForceHighestSupportedBitrate(true).build(); DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT =
DefaultTrackSelector.Parameters.DEFAULT_WITHOUT_CONTEXT
/** .buildUpon()
* @deprecated This instance does not have {@link Context} constraints. Use {@link .setForceHighestSupportedBitrate(true)
* #getDefaultTrackSelectorParameters(Context)} instead. .build();
*/
@Deprecated
public static final Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT =
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT;
/**
* @deprecated This instance does not have {@link Context} constraints. Use {@link
* #getDefaultTrackSelectorParameters(Context)} instead.
*/
@Deprecated
public static final DefaultTrackSelector.Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS =
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT;
/** Returns the default parameters used for track selection for downloading. */ /** Returns the default parameters used for track selection for downloading. */
public static DefaultTrackSelector.Parameters getDefaultTrackSelectorParameters(Context context) { public static DefaultTrackSelector.Parameters getDefaultTrackSelectorParameters(Context context) {
return Parameters.getDefaults(context) return DefaultTrackSelector.Parameters.getDefaults(context)
.buildUpon() .buildUpon()
.setForceHighestSupportedBitrate(true) .setForceHighestSupportedBitrate(true)
.build(); .build();
@ -188,7 +176,7 @@ public final class DownloadHelper {
} }
/** /**
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
* DataSource.Factory)} instead. * DataSource.Factory)} instead.
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -207,7 +195,7 @@ public final class DownloadHelper {
} }
/** /**
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
* DataSource.Factory, DrmSessionManager)} instead. * DataSource.Factory, DrmSessionManager)} instead.
*/ */
@Deprecated @Deprecated
@ -216,17 +204,17 @@ public final class DownloadHelper {
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
@Nullable DrmSessionManager drmSessionManager, @Nullable DrmSessionManager drmSessionManager,
DefaultTrackSelector.Parameters trackSelectorParameters) { TrackSelectionParameters trackSelectionParameters) {
return forMediaItem( return forMediaItem(
new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_MPD).build(), new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_MPD).build(),
trackSelectorParameters, trackSelectionParameters,
renderersFactory, renderersFactory,
dataSourceFactory, dataSourceFactory,
drmSessionManager); drmSessionManager);
} }
/** /**
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
* DataSource.Factory)} instead. * DataSource.Factory)} instead.
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -245,7 +233,7 @@ public final class DownloadHelper {
} }
/** /**
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
* DataSource.Factory, DrmSessionManager)} instead. * DataSource.Factory, DrmSessionManager)} instead.
*/ */
@Deprecated @Deprecated
@ -254,17 +242,17 @@ public final class DownloadHelper {
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
@Nullable DrmSessionManager drmSessionManager, @Nullable DrmSessionManager drmSessionManager,
DefaultTrackSelector.Parameters trackSelectorParameters) { TrackSelectionParameters trackSelectionParameters) {
return forMediaItem( return forMediaItem(
new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_M3U8).build(), new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_M3U8).build(),
trackSelectorParameters, trackSelectionParameters,
renderersFactory, renderersFactory,
dataSourceFactory, dataSourceFactory,
drmSessionManager); drmSessionManager);
} }
/** /**
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
* DataSource.Factory)} instead. * DataSource.Factory)} instead.
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -280,7 +268,7 @@ public final class DownloadHelper {
} }
/** /**
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
* DataSource.Factory)} instead. * DataSource.Factory)} instead.
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -299,7 +287,7 @@ public final class DownloadHelper {
} }
/** /**
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
* DataSource.Factory, DrmSessionManager)} instead. * DataSource.Factory, DrmSessionManager)} instead.
*/ */
@Deprecated @Deprecated
@ -308,10 +296,10 @@ public final class DownloadHelper {
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
@Nullable DrmSessionManager drmSessionManager, @Nullable DrmSessionManager drmSessionManager,
DefaultTrackSelector.Parameters trackSelectorParameters) { TrackSelectionParameters trackSelectionParameters) {
return forMediaItem( return forMediaItem(
new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_SS).build(), new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_SS).build(),
trackSelectorParameters, trackSelectionParameters,
renderersFactory, renderersFactory,
dataSourceFactory, dataSourceFactory,
drmSessionManager); drmSessionManager);
@ -369,7 +357,7 @@ public final class DownloadHelper {
* @param mediaItem A {@link MediaItem}. * @param mediaItem A {@link MediaItem}.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are * @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
* selected. * selected.
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for * @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for
* downloading. * downloading.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive * @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
* streams. This argument is required for adaptive streams and ignored for progressive * streams. This argument is required for adaptive streams and ignored for progressive
@ -381,12 +369,12 @@ public final class DownloadHelper {
*/ */
public static DownloadHelper forMediaItem( public static DownloadHelper forMediaItem(
MediaItem mediaItem, MediaItem mediaItem,
DefaultTrackSelector.Parameters trackSelectorParameters, TrackSelectionParameters trackSelectionParameters,
@Nullable RenderersFactory renderersFactory, @Nullable RenderersFactory renderersFactory,
@Nullable DataSource.Factory dataSourceFactory) { @Nullable DataSource.Factory dataSourceFactory) {
return forMediaItem( return forMediaItem(
mediaItem, mediaItem,
trackSelectorParameters, trackSelectionParameters,
renderersFactory, renderersFactory,
dataSourceFactory, dataSourceFactory,
/* drmSessionManager= */ null); /* drmSessionManager= */ null);
@ -398,7 +386,7 @@ public final class DownloadHelper {
* @param mediaItem A {@link MediaItem}. * @param mediaItem A {@link MediaItem}.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are * @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
* selected. * selected.
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for * @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for
* downloading. * downloading.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive * @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
* streams. This argument is required for adaptive streams and ignored for progressive * streams. This argument is required for adaptive streams and ignored for progressive
@ -412,7 +400,7 @@ public final class DownloadHelper {
*/ */
public static DownloadHelper forMediaItem( public static DownloadHelper forMediaItem(
MediaItem mediaItem, MediaItem mediaItem,
DefaultTrackSelector.Parameters trackSelectorParameters, TrackSelectionParameters trackSelectionParameters,
@Nullable RenderersFactory renderersFactory, @Nullable RenderersFactory renderersFactory,
@Nullable DataSource.Factory dataSourceFactory, @Nullable DataSource.Factory dataSourceFactory,
@Nullable DrmSessionManager drmSessionManager) { @Nullable DrmSessionManager drmSessionManager) {
@ -424,7 +412,7 @@ public final class DownloadHelper {
? null ? null
: createMediaSourceInternal( : createMediaSourceInternal(
mediaItem, castNonNull(dataSourceFactory), drmSessionManager), mediaItem, castNonNull(dataSourceFactory), drmSessionManager),
trackSelectorParameters, trackSelectionParameters,
renderersFactory != null renderersFactory != null
? getRendererCapabilities(renderersFactory) ? getRendererCapabilities(renderersFactory)
: new RendererCapabilities[0]); : new RendererCapabilities[0]);
@ -480,7 +468,7 @@ public final class DownloadHelper {
* @param mediaItem The media item. * @param mediaItem The media item.
* @param mediaSource A {@link MediaSource} for which tracks are selected, or null if no track * @param mediaSource A {@link MediaSource} for which tracks are selected, or null if no track
* selection needs to be made. * selection needs to be made.
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for * @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for
* downloading. * downloading.
* @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks * @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks
* are selected. * are selected.
@ -488,12 +476,12 @@ public final class DownloadHelper {
public DownloadHelper( public DownloadHelper(
MediaItem mediaItem, MediaItem mediaItem,
@Nullable MediaSource mediaSource, @Nullable MediaSource mediaSource,
DefaultTrackSelector.Parameters trackSelectorParameters, TrackSelectionParameters trackSelectionParameters,
RendererCapabilities[] rendererCapabilities) { RendererCapabilities[] rendererCapabilities) {
this.localConfiguration = checkNotNull(mediaItem.localConfiguration); this.localConfiguration = checkNotNull(mediaItem.localConfiguration);
this.mediaSource = mediaSource; this.mediaSource = mediaSource;
this.trackSelector = this.trackSelector =
new DefaultTrackSelector(trackSelectorParameters, new DownloadTrackSelection.Factory()); new DefaultTrackSelector(trackSelectionParameters, new DownloadTrackSelection.Factory());
this.rendererCapabilities = rendererCapabilities; this.rendererCapabilities = rendererCapabilities;
this.scratchSet = new SparseIntArray(); this.scratchSet = new SparseIntArray();
trackSelector.init(/* listener= */ () -> {}, new FakeBandwidthMeter()); trackSelector.init(/* listener= */ () -> {}, new FakeBandwidthMeter());
@ -609,13 +597,13 @@ public final class DownloadHelper {
* completes. * completes.
* *
* @param periodIndex The period index for which the track selection is replaced. * @param periodIndex The period index for which the track selection is replaced.
* @param trackSelectorParameters The {@link DefaultTrackSelector.Parameters} to obtain the new * @param trackSelectionParameters The {@link TrackSelectionParameters} to obtain the new
* selection of tracks. * selection of tracks.
*/ */
public void replaceTrackSelections( public void replaceTrackSelections(
int periodIndex, DefaultTrackSelector.Parameters trackSelectorParameters) { int periodIndex, TrackSelectionParameters trackSelectionParameters) {
clearTrackSelections(periodIndex); clearTrackSelections(periodIndex);
addTrackSelection(periodIndex, trackSelectorParameters); addTrackSelection(periodIndex, trackSelectionParameters);
} }
/** /**
@ -623,13 +611,13 @@ public final class DownloadHelper {
* completes. * completes.
* *
* @param periodIndex The period index this track selection is added for. * @param periodIndex The period index this track selection is added for.
* @param trackSelectorParameters The {@link DefaultTrackSelector.Parameters} to obtain the new * @param trackSelectionParameters The {@link TrackSelectionParameters} to obtain the new
* selection of tracks. * selection of tracks.
*/ */
public void addTrackSelection( public void addTrackSelection(
int periodIndex, DefaultTrackSelector.Parameters trackSelectorParameters) { int periodIndex, TrackSelectionParameters trackSelectionParameters) {
assertPreparedWithMedia(); assertPreparedWithMedia();
trackSelector.setParameters(trackSelectorParameters); trackSelector.setParameters(trackSelectionParameters);
runTrackSelection(periodIndex); runTrackSelection(periodIndex);
} }
@ -643,19 +631,25 @@ public final class DownloadHelper {
*/ */
public void addAudioLanguagesToSelection(String... languages) { public void addAudioLanguagesToSelection(String... languages) {
assertPreparedWithMedia(); assertPreparedWithMedia();
for (int periodIndex = 0; periodIndex < mappedTrackInfos.length; periodIndex++) {
DefaultTrackSelector.ParametersBuilder parametersBuilder = TrackSelectionParameters.Builder parametersBuilder =
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon(); DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon();
MappedTrackInfo mappedTrackInfo = mappedTrackInfos[periodIndex]; // Prefer highest supported bitrate for downloads.
int rendererCount = mappedTrackInfo.getRendererCount(); parametersBuilder.setForceHighestSupportedBitrate(true);
for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) { // Disable all non-audio track types supported by the renderers.
if (mappedTrackInfo.getRendererType(rendererIndex) != C.TRACK_TYPE_AUDIO) { for (RendererCapabilities capabilities : rendererCapabilities) {
parametersBuilder.setRendererDisabled(rendererIndex, /* disabled= */ true); @C.TrackType int trackType = capabilities.getTrackType();
} parametersBuilder.setTrackTypeDisabled(
} trackType, /* disabled= */ trackType != C.TRACK_TYPE_AUDIO);
for (String language : languages) { }
parametersBuilder.setPreferredAudioLanguage(language);
addTrackSelection(periodIndex, parametersBuilder.build()); // Add a track selection to each period for each of the languages.
int periodCount = getPeriodCount();
for (String language : languages) {
TrackSelectionParameters parameters =
parametersBuilder.setPreferredAudioLanguage(language).build();
for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) {
addTrackSelection(periodIndex, parameters);
} }
} }
} }
@ -673,20 +667,26 @@ public final class DownloadHelper {
public void addTextLanguagesToSelection( public void addTextLanguagesToSelection(
boolean selectUndeterminedTextLanguage, String... languages) { boolean selectUndeterminedTextLanguage, String... languages) {
assertPreparedWithMedia(); assertPreparedWithMedia();
for (int periodIndex = 0; periodIndex < mappedTrackInfos.length; periodIndex++) {
DefaultTrackSelector.ParametersBuilder parametersBuilder = TrackSelectionParameters.Builder parametersBuilder =
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon(); DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon();
MappedTrackInfo mappedTrackInfo = mappedTrackInfos[periodIndex]; parametersBuilder.setSelectUndeterminedTextLanguage(selectUndeterminedTextLanguage);
int rendererCount = mappedTrackInfo.getRendererCount(); // Prefer highest supported bitrate for downloads.
for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) { parametersBuilder.setForceHighestSupportedBitrate(true);
if (mappedTrackInfo.getRendererType(rendererIndex) != C.TRACK_TYPE_TEXT) { // Disable all non-text track types supported by the renderers.
parametersBuilder.setRendererDisabled(rendererIndex, /* disabled= */ true); for (RendererCapabilities capabilities : rendererCapabilities) {
} @C.TrackType int trackType = capabilities.getTrackType();
} parametersBuilder.setTrackTypeDisabled(
parametersBuilder.setSelectUndeterminedTextLanguage(selectUndeterminedTextLanguage); trackType, /* disabled= */ trackType != C.TRACK_TYPE_TEXT);
for (String language : languages) { }
parametersBuilder.setPreferredTextLanguage(language);
addTrackSelection(periodIndex, parametersBuilder.build()); // Add a track selection to each period for each of the languages.
int periodCount = getPeriodCount();
for (String language : languages) {
TrackSelectionParameters parameters =
parametersBuilder.setPreferredTextLanguage(language).build();
for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) {
addTrackSelection(periodIndex, parameters);
} }
} }
} }

View File

@ -1516,13 +1516,17 @@ public class DefaultTrackSelector extends MappingTrackSelector {
} }
/** /**
* @param parameters Initial {@link Parameters}. * @param parameters Initial {@link TrackSelectionParameters}.
* @param trackSelectionFactory A factory for {@link ExoTrackSelection}s. * @param trackSelectionFactory A factory for {@link ExoTrackSelection}s.
*/ */
public DefaultTrackSelector( public DefaultTrackSelector(
Parameters parameters, ExoTrackSelection.Factory trackSelectionFactory) { TrackSelectionParameters parameters, ExoTrackSelection.Factory trackSelectionFactory) {
this.trackSelectionFactory = trackSelectionFactory; this.trackSelectionFactory = trackSelectionFactory;
parametersReference = new AtomicReference<>(parameters); parametersReference =
new AtomicReference<>(
parameters instanceof Parameters
? (Parameters) parameters
: Parameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().set(parameters).build());
} }
@Override @Override