mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Rename MediaItem.Subtitle to SubtitleConfiguration
This is more consistent with the other MediaItem inner classes which are all Configurations. The old class and fields are left deprecated for backwards compatibility. The deprecated Subtitle constructors are not moved to SubtitleConfiguration. PiperOrigin-RevId: 400144640
This commit is contained in:
parent
4e9e38f3a7
commit
7a3dedce07
2 changed files with 129 additions and 85 deletions
|
|
@ -75,7 +75,7 @@ public final class MediaItem implements Bundleable {
|
||||||
private DrmConfiguration.Builder drmConfiguration;
|
private DrmConfiguration.Builder drmConfiguration;
|
||||||
private List<StreamKey> streamKeys;
|
private List<StreamKey> streamKeys;
|
||||||
@Nullable private String customCacheKey;
|
@Nullable private String customCacheKey;
|
||||||
private List<Subtitle> subtitles;
|
private ImmutableList<SubtitleConfiguration> subtitleConfigurations;
|
||||||
@Nullable private AdsConfiguration adsConfiguration;
|
@Nullable private AdsConfiguration adsConfiguration;
|
||||||
@Nullable private Object tag;
|
@Nullable private Object tag;
|
||||||
@Nullable private MediaMetadata mediaMetadata;
|
@Nullable private MediaMetadata mediaMetadata;
|
||||||
|
|
@ -89,7 +89,7 @@ public final class MediaItem implements Bundleable {
|
||||||
clippingConfiguration = new ClippingConfiguration.Builder();
|
clippingConfiguration = new ClippingConfiguration.Builder();
|
||||||
drmConfiguration = new DrmConfiguration.Builder();
|
drmConfiguration = new DrmConfiguration.Builder();
|
||||||
streamKeys = Collections.emptyList();
|
streamKeys = Collections.emptyList();
|
||||||
subtitles = Collections.emptyList();
|
subtitleConfigurations = ImmutableList.of();
|
||||||
liveConfiguration = new LiveConfiguration.Builder();
|
liveConfiguration = new LiveConfiguration.Builder();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -105,7 +105,7 @@ public final class MediaItem implements Bundleable {
|
||||||
mimeType = localConfiguration.mimeType;
|
mimeType = localConfiguration.mimeType;
|
||||||
uri = localConfiguration.uri;
|
uri = localConfiguration.uri;
|
||||||
streamKeys = localConfiguration.streamKeys;
|
streamKeys = localConfiguration.streamKeys;
|
||||||
subtitles = localConfiguration.subtitles;
|
subtitleConfigurations = localConfiguration.subtitleConfigurations;
|
||||||
tag = localConfiguration.tag;
|
tag = localConfiguration.tag;
|
||||||
drmConfiguration =
|
drmConfiguration =
|
||||||
localConfiguration.drmConfiguration != null
|
localConfiguration.drmConfiguration != null
|
||||||
|
|
@ -354,18 +354,25 @@ public final class MediaItem implements Bundleable {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #setSubtitleConfigurations(List)} instead. Note that {@link
|
||||||
|
* #setSubtitleConfigurations(List)} doesn't accept null, use an empty list to clear the
|
||||||
|
* contents.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public Builder setSubtitles(@Nullable List<Subtitle> subtitles) {
|
||||||
|
this.subtitleConfigurations =
|
||||||
|
subtitles != null ? ImmutableList.copyOf(subtitles) : ImmutableList.of();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the optional subtitles.
|
* Sets the optional subtitles.
|
||||||
*
|
*
|
||||||
* <p>{@code null} or an empty {@link List} can be used for a reset.
|
|
||||||
*
|
|
||||||
* <p>This method should only be called if {@link #setUri} is passed a non-null value.
|
* <p>This method should only be called if {@link #setUri} is passed a non-null value.
|
||||||
*/
|
*/
|
||||||
public Builder setSubtitles(@Nullable List<Subtitle> subtitles) {
|
public Builder setSubtitleConfigurations(List<SubtitleConfiguration> subtitleConfigurations) {
|
||||||
this.subtitles =
|
this.subtitleConfigurations = ImmutableList.copyOf(subtitleConfigurations);
|
||||||
subtitles != null && !subtitles.isEmpty()
|
|
||||||
? Collections.unmodifiableList(new ArrayList<>(subtitles))
|
|
||||||
: Collections.emptyList();
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -500,7 +507,7 @@ public final class MediaItem implements Bundleable {
|
||||||
adsConfiguration,
|
adsConfiguration,
|
||||||
streamKeys,
|
streamKeys,
|
||||||
customCacheKey,
|
customCacheKey,
|
||||||
subtitles,
|
subtitleConfigurations,
|
||||||
tag);
|
tag);
|
||||||
}
|
}
|
||||||
return new MediaItem(
|
return new MediaItem(
|
||||||
|
|
@ -889,7 +896,9 @@ public final class MediaItem implements Bundleable {
|
||||||
@Nullable public final String customCacheKey;
|
@Nullable public final String customCacheKey;
|
||||||
|
|
||||||
/** Optional subtitles to be sideloaded. */
|
/** Optional subtitles to be sideloaded. */
|
||||||
public final List<Subtitle> subtitles;
|
public final ImmutableList<SubtitleConfiguration> subtitleConfigurations;
|
||||||
|
/** @deprecated Use {@link #subtitleConfigurations} instead. */
|
||||||
|
@Deprecated public final List<Subtitle> subtitles;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Optional tag for custom attributes. The tag for the media source which will be published in
|
* Optional tag for custom attributes. The tag for the media source which will be published in
|
||||||
|
|
@ -898,6 +907,7 @@ public final class MediaItem implements Bundleable {
|
||||||
*/
|
*/
|
||||||
@Nullable public final Object tag;
|
@Nullable public final Object tag;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Setting deprecated subtitles field.
|
||||||
private LocalConfiguration(
|
private LocalConfiguration(
|
||||||
Uri uri,
|
Uri uri,
|
||||||
@Nullable String mimeType,
|
@Nullable String mimeType,
|
||||||
|
|
@ -905,7 +915,7 @@ public final class MediaItem implements Bundleable {
|
||||||
@Nullable AdsConfiguration adsConfiguration,
|
@Nullable AdsConfiguration adsConfiguration,
|
||||||
List<StreamKey> streamKeys,
|
List<StreamKey> streamKeys,
|
||||||
@Nullable String customCacheKey,
|
@Nullable String customCacheKey,
|
||||||
List<Subtitle> subtitles,
|
ImmutableList<SubtitleConfiguration> subtitleConfigurations,
|
||||||
@Nullable Object tag) {
|
@Nullable Object tag) {
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
this.mimeType = mimeType;
|
this.mimeType = mimeType;
|
||||||
|
|
@ -913,7 +923,12 @@ public final class MediaItem implements Bundleable {
|
||||||
this.adsConfiguration = adsConfiguration;
|
this.adsConfiguration = adsConfiguration;
|
||||||
this.streamKeys = streamKeys;
|
this.streamKeys = streamKeys;
|
||||||
this.customCacheKey = customCacheKey;
|
this.customCacheKey = customCacheKey;
|
||||||
this.subtitles = subtitles;
|
this.subtitleConfigurations = subtitleConfigurations;
|
||||||
|
ImmutableList.Builder<Subtitle> subtitles = ImmutableList.builder();
|
||||||
|
for (int i = 0; i < subtitleConfigurations.size(); i++) {
|
||||||
|
subtitles.add(subtitleConfigurations.get(i).buildUpon().buildSubtitle());
|
||||||
|
}
|
||||||
|
this.subtitles = subtitles.build();
|
||||||
this.tag = tag;
|
this.tag = tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -933,7 +948,7 @@ public final class MediaItem implements Bundleable {
|
||||||
&& Util.areEqual(adsConfiguration, other.adsConfiguration)
|
&& Util.areEqual(adsConfiguration, other.adsConfiguration)
|
||||||
&& streamKeys.equals(other.streamKeys)
|
&& streamKeys.equals(other.streamKeys)
|
||||||
&& Util.areEqual(customCacheKey, other.customCacheKey)
|
&& Util.areEqual(customCacheKey, other.customCacheKey)
|
||||||
&& subtitles.equals(other.subtitles)
|
&& subtitleConfigurations.equals(other.subtitleConfigurations)
|
||||||
&& Util.areEqual(tag, other.tag);
|
&& Util.areEqual(tag, other.tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -945,7 +960,7 @@ public final class MediaItem implements Bundleable {
|
||||||
result = 31 * result + (adsConfiguration == null ? 0 : adsConfiguration.hashCode());
|
result = 31 * result + (adsConfiguration == null ? 0 : adsConfiguration.hashCode());
|
||||||
result = 31 * result + streamKeys.hashCode();
|
result = 31 * result + streamKeys.hashCode();
|
||||||
result = 31 * result + (customCacheKey == null ? 0 : customCacheKey.hashCode());
|
result = 31 * result + (customCacheKey == null ? 0 : customCacheKey.hashCode());
|
||||||
result = 31 * result + subtitles.hashCode();
|
result = 31 * result + subtitleConfigurations.hashCode();
|
||||||
result = 31 * result + (tag == null ? 0 : tag.hashCode());
|
result = 31 * result + (tag == null ? 0 : tag.hashCode());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -962,7 +977,7 @@ public final class MediaItem implements Bundleable {
|
||||||
@Nullable AdsConfiguration adsConfiguration,
|
@Nullable AdsConfiguration adsConfiguration,
|
||||||
List<StreamKey> streamKeys,
|
List<StreamKey> streamKeys,
|
||||||
@Nullable String customCacheKey,
|
@Nullable String customCacheKey,
|
||||||
List<Subtitle> subtitles,
|
ImmutableList<SubtitleConfiguration> subtitleConfigurations,
|
||||||
@Nullable Object tag) {
|
@Nullable Object tag) {
|
||||||
super(
|
super(
|
||||||
uri,
|
uri,
|
||||||
|
|
@ -971,7 +986,7 @@ public final class MediaItem implements Bundleable {
|
||||||
adsConfiguration,
|
adsConfiguration,
|
||||||
streamKeys,
|
streamKeys,
|
||||||
customCacheKey,
|
customCacheKey,
|
||||||
subtitles,
|
subtitleConfigurations,
|
||||||
tag);
|
tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1208,9 +1223,10 @@ public final class MediaItem implements Bundleable {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Properties for a text track. */
|
/** Properties for a text track. */
|
||||||
public static final class Subtitle {
|
// TODO: Mark this final when Subtitle is deleted.
|
||||||
|
public static class SubtitleConfiguration {
|
||||||
|
|
||||||
/** Builder for {@link Subtitle} instances. */
|
/** Builder for {@link SubtitleConfiguration} instances. */
|
||||||
public static final class Builder {
|
public static final class Builder {
|
||||||
private Uri uri;
|
private Uri uri;
|
||||||
@Nullable private String mimeType;
|
@Nullable private String mimeType;
|
||||||
|
|
@ -1228,13 +1244,13 @@ public final class MediaItem implements Bundleable {
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Builder(Subtitle subtitle) {
|
private Builder(SubtitleConfiguration subtitleConfiguration) {
|
||||||
this.uri = subtitle.uri;
|
this.uri = subtitleConfiguration.uri;
|
||||||
this.mimeType = subtitle.mimeType;
|
this.mimeType = subtitleConfiguration.mimeType;
|
||||||
this.language = subtitle.language;
|
this.language = subtitleConfiguration.language;
|
||||||
this.selectionFlags = subtitle.selectionFlags;
|
this.selectionFlags = subtitleConfiguration.selectionFlags;
|
||||||
this.roleFlags = subtitle.roleFlags;
|
this.roleFlags = subtitleConfiguration.roleFlags;
|
||||||
this.label = subtitle.label;
|
this.label = subtitleConfiguration.label;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets the {@link Uri} to the subtitle file. */
|
/** Sets the {@link Uri} to the subtitle file. */
|
||||||
|
|
@ -1273,8 +1289,12 @@ public final class MediaItem implements Bundleable {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates a {@link Subtitle} from the values of this builder. */
|
/** Creates a {@link SubtitleConfiguration} from the values of this builder. */
|
||||||
public Subtitle build() {
|
public SubtitleConfiguration build() {
|
||||||
|
return new SubtitleConfiguration(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Subtitle buildSubtitle() {
|
||||||
return new Subtitle(this);
|
return new Subtitle(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1292,6 +1312,70 @@ public final class MediaItem implements Bundleable {
|
||||||
/** The label. */
|
/** The label. */
|
||||||
@Nullable public final String label;
|
@Nullable public final String label;
|
||||||
|
|
||||||
|
private SubtitleConfiguration(
|
||||||
|
Uri uri,
|
||||||
|
String mimeType,
|
||||||
|
@Nullable String language,
|
||||||
|
@C.SelectionFlags int selectionFlags,
|
||||||
|
@C.RoleFlags int roleFlags,
|
||||||
|
@Nullable String label) {
|
||||||
|
this.uri = uri;
|
||||||
|
this.mimeType = mimeType;
|
||||||
|
this.language = language;
|
||||||
|
this.selectionFlags = selectionFlags;
|
||||||
|
this.roleFlags = roleFlags;
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SubtitleConfiguration(Builder builder) {
|
||||||
|
this.uri = builder.uri;
|
||||||
|
this.mimeType = builder.mimeType;
|
||||||
|
this.language = builder.language;
|
||||||
|
this.selectionFlags = builder.selectionFlags;
|
||||||
|
this.roleFlags = builder.roleFlags;
|
||||||
|
this.label = builder.label;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a {@link Builder} initialized with the values of this instance. */
|
||||||
|
public Builder buildUpon() {
|
||||||
|
return new Builder(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(@Nullable Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(obj instanceof SubtitleConfiguration)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SubtitleConfiguration other = (SubtitleConfiguration) obj;
|
||||||
|
|
||||||
|
return uri.equals(other.uri)
|
||||||
|
&& Util.areEqual(mimeType, other.mimeType)
|
||||||
|
&& Util.areEqual(language, other.language)
|
||||||
|
&& selectionFlags == other.selectionFlags
|
||||||
|
&& roleFlags == other.roleFlags
|
||||||
|
&& Util.areEqual(label, other.label);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = uri.hashCode();
|
||||||
|
result = 31 * result + (mimeType == null ? 0 : mimeType.hashCode());
|
||||||
|
result = 31 * result + (language == null ? 0 : language.hashCode());
|
||||||
|
result = 31 * result + selectionFlags;
|
||||||
|
result = 31 * result + roleFlags;
|
||||||
|
result = 31 * result + (label == null ? 0 : label.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @deprecated Use {@link MediaItem.SubtitleConfiguration} instead */
|
||||||
|
@Deprecated
|
||||||
|
public static final class Subtitle extends SubtitleConfiguration {
|
||||||
|
|
||||||
/** @deprecated Use {@link Builder} instead. */
|
/** @deprecated Use {@link Builder} instead. */
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public Subtitle(Uri uri, String mimeType, @Nullable String language) {
|
public Subtitle(Uri uri, String mimeType, @Nullable String language) {
|
||||||
|
|
@ -1314,56 +1398,11 @@ public final class MediaItem implements Bundleable {
|
||||||
@C.SelectionFlags int selectionFlags,
|
@C.SelectionFlags int selectionFlags,
|
||||||
@C.RoleFlags int roleFlags,
|
@C.RoleFlags int roleFlags,
|
||||||
@Nullable String label) {
|
@Nullable String label) {
|
||||||
this.uri = uri;
|
super(uri, mimeType, language, selectionFlags, roleFlags, label);
|
||||||
this.mimeType = mimeType;
|
|
||||||
this.language = language;
|
|
||||||
this.selectionFlags = selectionFlags;
|
|
||||||
this.roleFlags = roleFlags;
|
|
||||||
this.label = label;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Subtitle(Builder builder) {
|
private Subtitle(Builder builder) {
|
||||||
this.uri = builder.uri;
|
super(builder);
|
||||||
this.mimeType = builder.mimeType;
|
|
||||||
this.language = builder.language;
|
|
||||||
this.selectionFlags = builder.selectionFlags;
|
|
||||||
this.roleFlags = builder.roleFlags;
|
|
||||||
this.label = builder.label;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns a {@link Builder} initialized with the values of this instance. */
|
|
||||||
public Builder buildUpon() {
|
|
||||||
return new Builder(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(@Nullable Object obj) {
|
|
||||||
if (this == obj) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(obj instanceof Subtitle)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Subtitle other = (Subtitle) obj;
|
|
||||||
|
|
||||||
return uri.equals(other.uri)
|
|
||||||
&& Util.areEqual(mimeType, other.mimeType)
|
|
||||||
&& Util.areEqual(language, other.language)
|
|
||||||
&& selectionFlags == other.selectionFlags
|
|
||||||
&& roleFlags == other.roleFlags
|
|
||||||
&& Util.areEqual(label, other.label);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = uri.hashCode();
|
|
||||||
result = 31 * result + (mimeType == null ? 0 : mimeType.hashCode());
|
|
||||||
result = 31 * result + (language == null ? 0 : language.hashCode());
|
|
||||||
result = 31 * result + selectionFlags;
|
|
||||||
result = 31 * result + roleFlags;
|
|
||||||
result = 31 * result + (label == null ? 0 : label.hashCode());
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -258,11 +258,11 @@ public class MediaItemTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@SuppressWarnings("deprecation") // Using deprecated constructors
|
@SuppressWarnings("deprecation") // Using deprecated Subtitle type
|
||||||
public void builderSetSubtitles_setsSubtitles() {
|
public void builderSetSubtitles_setsSubtitles() {
|
||||||
List<MediaItem.Subtitle> subtitles =
|
List<MediaItem.SubtitleConfiguration> subtitleConfigurations =
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new MediaItem.Subtitle.Builder(Uri.parse(URI_STRING + "/es"))
|
new MediaItem.SubtitleConfiguration.Builder(Uri.parse(URI_STRING + "/es"))
|
||||||
.setMimeType(MimeTypes.TEXT_SSA)
|
.setMimeType(MimeTypes.TEXT_SSA)
|
||||||
.setLanguage(/* language= */ "es")
|
.setLanguage(/* language= */ "es")
|
||||||
.setSelectionFlags(C.SELECTION_FLAG_FORCED)
|
.setSelectionFlags(C.SELECTION_FLAG_FORCED)
|
||||||
|
|
@ -285,9 +285,14 @@ public class MediaItemTest {
|
||||||
"label"));
|
"label"));
|
||||||
|
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri(URI_STRING).setSubtitles(subtitles).build();
|
new MediaItem.Builder()
|
||||||
|
.setUri(URI_STRING)
|
||||||
|
.setSubtitleConfigurations(subtitleConfigurations)
|
||||||
|
.build();
|
||||||
|
|
||||||
assertThat(mediaItem.localConfiguration.subtitles).isEqualTo(subtitles);
|
assertThat(mediaItem.localConfiguration.subtitleConfigurations)
|
||||||
|
.isEqualTo(subtitleConfigurations);
|
||||||
|
assertThat(mediaItem.localConfiguration.subtitles).isEqualTo(subtitleConfigurations);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -583,9 +588,9 @@ public class MediaItemTest {
|
||||||
.setLiveMaxPlaybackSpeed(1.1f)
|
.setLiveMaxPlaybackSpeed(1.1f)
|
||||||
.setLiveMinOffsetMs(2222)
|
.setLiveMinOffsetMs(2222)
|
||||||
.setLiveMaxOffsetMs(4444)
|
.setLiveMaxOffsetMs(4444)
|
||||||
.setSubtitles(
|
.setSubtitleConfigurations(
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new MediaItem.Subtitle.Builder(Uri.parse(URI_STRING + "/en"))
|
new MediaItem.SubtitleConfiguration.Builder(Uri.parse(URI_STRING + "/en"))
|
||||||
.setMimeType(MimeTypes.APPLICATION_TTML)
|
.setMimeType(MimeTypes.APPLICATION_TTML)
|
||||||
.setLanguage("en")
|
.setLanguage("en")
|
||||||
.setSelectionFlags(C.SELECTION_FLAG_FORCED)
|
.setSelectionFlags(C.SELECTION_FLAG_FORCED)
|
||||||
|
|
@ -639,9 +644,9 @@ public class MediaItemTest {
|
||||||
.setMinOffsetMs(2222)
|
.setMinOffsetMs(2222)
|
||||||
.setMaxOffsetMs(4444)
|
.setMaxOffsetMs(4444)
|
||||||
.build())
|
.build())
|
||||||
.setSubtitles(
|
.setSubtitleConfigurations(
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new MediaItem.Subtitle.Builder(Uri.parse(URI_STRING + "/en"))
|
new MediaItem.SubtitleConfiguration.Builder(Uri.parse(URI_STRING + "/en"))
|
||||||
.setMimeType(MimeTypes.APPLICATION_TTML)
|
.setMimeType(MimeTypes.APPLICATION_TTML)
|
||||||
.setLanguage("en")
|
.setLanguage("en")
|
||||||
.setSelectionFlags(C.SELECTION_FLAG_FORCED)
|
.setSelectionFlags(C.SELECTION_FLAG_FORCED)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue