Add track selection option to use accessiblity captioning manager settings
This option allows to set the preferred text language and role flags based on the user's accessiblity captioning settings. Issue:#5749 PiperOrigin-RevId: 270233205
This commit is contained in:
parent
531c5638a2
commit
31b9280e0e
@ -36,6 +36,11 @@
|
|||||||
* Set `compileSdkVersion` to 29 to use Android Q APIs.
|
* Set `compileSdkVersion` to 29 to use Android Q APIs.
|
||||||
* Add `enable` and `disable` methods to `MediaSource` to improve resource
|
* Add `enable` and `disable` methods to `MediaSource` to improve resource
|
||||||
management in playlists.
|
management in playlists.
|
||||||
|
* Text selection logic:
|
||||||
|
* Allow to set preferred role flags using
|
||||||
|
`DefaultTrackSelector.ParametersBuilder.setPreferredTextRoleFlags`.
|
||||||
|
* Default text language and role flags to accessibility captioning settings
|
||||||
|
([#5749](https://github.com/google/ExoPlayer/issues/5749)).
|
||||||
* Remove `AnalyticsCollector.Factory`. Instances can be created directly and
|
* Remove `AnalyticsCollector.Factory`. Instances can be created directly and
|
||||||
the `Player` set later using `AnalyticsCollector.setPlayer`.
|
the `Player` set later using `AnalyticsCollector.setPlayer`.
|
||||||
* Replace `ExoPlayerFactory` by `SimpleExoPlayer.Builder` and
|
* Replace `ExoPlayerFactory` by `SimpleExoPlayer.Builder` and
|
||||||
|
@ -474,6 +474,13 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
|||||||
|
|
||||||
// Text
|
// Text
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ParametersBuilder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(
|
||||||
|
Context context) {
|
||||||
|
super.setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(context);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ParametersBuilder setPreferredTextLanguage(@Nullable String preferredTextLanguage) {
|
public ParametersBuilder setPreferredTextLanguage(@Nullable String preferredTextLanguage) {
|
||||||
super.setPreferredTextLanguage(preferredTextLanguage);
|
super.setPreferredTextLanguage(preferredTextLanguage);
|
||||||
@ -499,6 +506,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
|||||||
super.setDisabledTextTrackSelectionFlags(disabledTextTrackSelectionFlags);
|
super.setDisabledTextTrackSelectionFlags(disabledTextTrackSelectionFlags);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// General
|
// General
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -757,6 +765,10 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
|||||||
* <ul>
|
* <ul>
|
||||||
* <li>{@link ParametersBuilder#setViewportSizeToPhysicalDisplaySize(Context, boolean)
|
* <li>{@link ParametersBuilder#setViewportSizeToPhysicalDisplaySize(Context, boolean)
|
||||||
* Viewport constraints} configured for the primary display.
|
* Viewport constraints} configured for the primary display.
|
||||||
|
* <li>{@link
|
||||||
|
* ParametersBuilder#setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)
|
||||||
|
* Preferred text language and role flags} configured to the accessibility settings of
|
||||||
|
* {@link android.view.accessibility.CaptioningManager}.
|
||||||
* </ul>
|
* </ul>
|
||||||
*/
|
*/
|
||||||
public static final Parameters DEFAULT_WITHOUT_CONTEXT = new Parameters();
|
public static final Parameters DEFAULT_WITHOUT_CONTEXT = new Parameters();
|
||||||
@ -778,6 +790,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
|||||||
return DEFAULT_WITHOUT_CONTEXT
|
return DEFAULT_WITHOUT_CONTEXT
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setViewportSizeToPhysicalDisplaySize(context, /* viewportOrientationMayChange= */ true)
|
.setViewportSizeToPhysicalDisplaySize(context, /* viewportOrientationMayChange= */ true)
|
||||||
|
.setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(context)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -932,7 +945,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
|||||||
/* viewportHeight= */ Integer.MAX_VALUE,
|
/* viewportHeight= */ Integer.MAX_VALUE,
|
||||||
/* viewportOrientationMayChange= */ true,
|
/* viewportOrientationMayChange= */ true,
|
||||||
// Audio
|
// Audio
|
||||||
TrackSelectionParameters.DEFAULT.preferredAudioLanguage,
|
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.preferredAudioLanguage,
|
||||||
/* maxAudioChannelCount= */ Integer.MAX_VALUE,
|
/* maxAudioChannelCount= */ Integer.MAX_VALUE,
|
||||||
/* maxAudioBitrate= */ Integer.MAX_VALUE,
|
/* maxAudioBitrate= */ Integer.MAX_VALUE,
|
||||||
/* exceedAudioConstraintsIfNecessary= */ true,
|
/* exceedAudioConstraintsIfNecessary= */ true,
|
||||||
@ -940,10 +953,10 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
|||||||
/* allowAudioMixedSampleRateAdaptiveness= */ false,
|
/* allowAudioMixedSampleRateAdaptiveness= */ false,
|
||||||
/* allowAudioMixedChannelCountAdaptiveness= */ false,
|
/* allowAudioMixedChannelCountAdaptiveness= */ false,
|
||||||
// Text
|
// Text
|
||||||
TrackSelectionParameters.DEFAULT.preferredTextLanguage,
|
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.preferredTextLanguage,
|
||||||
TrackSelectionParameters.DEFAULT.preferredTextRoleFlags,
|
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.preferredTextRoleFlags,
|
||||||
TrackSelectionParameters.DEFAULT.selectUndeterminedTextLanguage,
|
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.selectUndeterminedTextLanguage,
|
||||||
TrackSelectionParameters.DEFAULT.disabledTextTrackSelectionFlags,
|
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.disabledTextTrackSelectionFlags,
|
||||||
// General
|
// General
|
||||||
/* forceLowestBitrate= */ false,
|
/* forceLowestBitrate= */ false,
|
||||||
/* forceHighestSupportedBitrate= */ false,
|
/* forceHighestSupportedBitrate= */ false,
|
||||||
|
@ -15,12 +15,16 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.trackselection;
|
package com.google.android.exoplayer2.trackselection;
|
||||||
|
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.content.Context;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.view.accessibility.CaptioningManager;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
/** Constraint parameters for track selection. */
|
/** Constraint parameters for track selection. */
|
||||||
public class TrackSelectionParameters implements Parcelable {
|
public class TrackSelectionParameters implements Parcelable {
|
||||||
@ -37,9 +41,22 @@ public class TrackSelectionParameters implements Parcelable {
|
|||||||
/* package */ boolean selectUndeterminedTextLanguage;
|
/* package */ boolean selectUndeterminedTextLanguage;
|
||||||
@C.SelectionFlags /* package */ int disabledTextTrackSelectionFlags;
|
@C.SelectionFlags /* package */ int disabledTextTrackSelectionFlags;
|
||||||
|
|
||||||
/** Creates a builder with default initial values. */
|
/**
|
||||||
|
* Creates a builder with default initial values.
|
||||||
|
*
|
||||||
|
* @param context Any context.
|
||||||
|
*/
|
||||||
|
public Builder(Context context) {
|
||||||
|
this(TrackSelectionParameters.getDefaults(context));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated {@link Context} constraints will not be set when using this constructor. Use
|
||||||
|
* {@link #Builder(Context)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public Builder() {
|
public Builder() {
|
||||||
this(DEFAULT);
|
this(DEFAULT_WITHOUT_CONTEXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -66,6 +83,23 @@ public class TrackSelectionParameters implements Parcelable {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the preferred language and role flags for text tracks based on the accessibility
|
||||||
|
* settings of {@link CaptioningManager}.
|
||||||
|
*
|
||||||
|
* <p>Does nothing for API levels < 19 or when the {@link CaptioningManager} is disabled.
|
||||||
|
*
|
||||||
|
* @param context A {@link Context}.
|
||||||
|
* @return This builder.
|
||||||
|
*/
|
||||||
|
public Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(
|
||||||
|
Context context) {
|
||||||
|
if (Util.SDK_INT >= 19) {
|
||||||
|
setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettingsV19(context);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the preferred language for text tracks.
|
* Sets the preferred language for text tracks.
|
||||||
*
|
*
|
||||||
@ -127,10 +161,52 @@ public class TrackSelectionParameters implements Parcelable {
|
|||||||
selectUndeterminedTextLanguage,
|
selectUndeterminedTextLanguage,
|
||||||
disabledTextTrackSelectionFlags);
|
disabledTextTrackSelectionFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TargetApi(19)
|
||||||
|
private void setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettingsV19(
|
||||||
|
Context context) {
|
||||||
|
CaptioningManager captioningManager =
|
||||||
|
(CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);
|
||||||
|
if (captioningManager == null || !captioningManager.isEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
preferredTextRoleFlags = C.ROLE_FLAG_CAPTION | C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND;
|
||||||
|
Locale preferredLocale = captioningManager.getLocale();
|
||||||
|
if (preferredLocale != null) {
|
||||||
|
preferredTextLanguage = Util.getLocaleLanguageTag(preferredLocale);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** An instance with default values. */
|
/**
|
||||||
public static final TrackSelectionParameters DEFAULT = new TrackSelectionParameters();
|
* An instance with default values, except those obtained from the {@link Context}.
|
||||||
|
*
|
||||||
|
* <p>If possible, use {@link #getDefaults(Context)} instead.
|
||||||
|
*
|
||||||
|
* <p>This instance will not have the following settings:
|
||||||
|
*
|
||||||
|
* <ul>
|
||||||
|
* <li>{@link Builder#setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)
|
||||||
|
* Preferred text language and role flags} configured to the accessibility settings of
|
||||||
|
* {@link CaptioningManager}.
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public static final TrackSelectionParameters DEFAULT_WITHOUT_CONTEXT =
|
||||||
|
new TrackSelectionParameters();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated This instance is not configured using {@link Context} constraints. Use {@link
|
||||||
|
* #getDefaults(Context)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated public static final TrackSelectionParameters DEFAULT = new TrackSelectionParameters();
|
||||||
|
|
||||||
|
/** Returns an instance configured with default values. */
|
||||||
|
public static TrackSelectionParameters getDefaults(Context context) {
|
||||||
|
return DEFAULT_WITHOUT_CONTEXT
|
||||||
|
.buildUpon()
|
||||||
|
.setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(context)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The preferred language for audio and forced text tracks as an IETF BCP 47 conformant tag.
|
* The preferred language for audio and forced text tracks as an IETF BCP 47 conformant tag.
|
||||||
@ -140,12 +216,15 @@ public class TrackSelectionParameters implements Parcelable {
|
|||||||
@Nullable public final String preferredAudioLanguage;
|
@Nullable public final String preferredAudioLanguage;
|
||||||
/**
|
/**
|
||||||
* The preferred language for text tracks as an IETF BCP 47 conformant tag. {@code null} selects
|
* The preferred language for text tracks as an IETF BCP 47 conformant tag. {@code null} selects
|
||||||
* the default track if there is one, or no track otherwise. The default value is {@code null}.
|
* the default track if there is one, or no track otherwise. The default value is {@code null}, or
|
||||||
|
* the language of the accessibility {@link CaptioningManager} if enabled.
|
||||||
*/
|
*/
|
||||||
@Nullable public final String preferredTextLanguage;
|
@Nullable public final String preferredTextLanguage;
|
||||||
/**
|
/**
|
||||||
* The preferred {@link C.RoleFlags} for text tracks. {@code 0} selects the default track if there
|
* The preferred {@link C.RoleFlags} for text tracks. {@code 0} selects the default track if there
|
||||||
* is one, or no track otherwise. The default value is {@code 0}.
|
* is one, or no track otherwise. The default value is {@code 0}, or {@link C#ROLE_FLAG_SUBTITLE}
|
||||||
|
* | {@link C#ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND} if the accessibility {@link CaptioningManager}
|
||||||
|
* is enabled.
|
||||||
*/
|
*/
|
||||||
@C.RoleFlags public final int preferredTextRoleFlags;
|
@C.RoleFlags public final int preferredTextRoleFlags;
|
||||||
/**
|
/**
|
||||||
|
@ -459,6 +459,20 @@ public final class Util {
|
|||||||
parcel.writeInt(value ? 1 : 0);
|
parcel.writeInt(value ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the language tag for a {@link Locale}.
|
||||||
|
*
|
||||||
|
* <p>For API levels ≥ 21, this tag is IETF BCP 47 compliant. Use {@link
|
||||||
|
* #normalizeLanguageCode(String)} to retrieve a normalized IETF BCP 47 language tag for all API
|
||||||
|
* levels if needed.
|
||||||
|
*
|
||||||
|
* @param locale A {@link Locale}.
|
||||||
|
* @return The language tag.
|
||||||
|
*/
|
||||||
|
public static String getLocaleLanguageTag(Locale locale) {
|
||||||
|
return SDK_INT >= 21 ? getLocaleLanguageTagV21(locale) : locale.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a normalized IETF BCP 47 language tag for {@code language}.
|
* Returns a normalized IETF BCP 47 language tag for {@code language}.
|
||||||
*
|
*
|
||||||
@ -1963,7 +1977,7 @@ public final class Util {
|
|||||||
Configuration config = Resources.getSystem().getConfiguration();
|
Configuration config = Resources.getSystem().getConfiguration();
|
||||||
return SDK_INT >= 24
|
return SDK_INT >= 24
|
||||||
? getSystemLocalesV24(config)
|
? getSystemLocalesV24(config)
|
||||||
: SDK_INT >= 21 ? getSystemLocaleV21(config) : new String[] {config.locale.toString()};
|
: new String[] {getLocaleLanguageTag(config.locale)};
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(24)
|
@TargetApi(24)
|
||||||
@ -1972,8 +1986,8 @@ public final class Util {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(21)
|
@TargetApi(21)
|
||||||
private static String[] getSystemLocaleV21(Configuration config) {
|
private static String getLocaleLanguageTagV21(Locale locale) {
|
||||||
return new String[] {config.locale.toLanguageTag()};
|
return locale.toLanguageTag();
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(21)
|
@TargetApi(21)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user