diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java index e4ac70a507..281ad7d1e3 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java @@ -16,18 +16,24 @@ */ package com.google.android.exoplayer2.ui; +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.util.AttributeSet; import android.util.TypedValue; +import android.view.View; import android.view.ViewGroup; import android.view.accessibility.CaptioningManager; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.text.CaptionStyleCompat; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.util.Util; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; import java.util.Collections; import java.util.List; @@ -49,20 +55,50 @@ public final class SubtitleView extends ViewGroup implements TextOutput { */ public static final float DEFAULT_BOTTOM_PADDING_FRACTION = 0.08f; - private final SubtitleTextView subtitleTextView; + /** + * Indicates a {@link SubtitleTextView} should be used to display subtitles. This is the default. + */ + public static final int VIEW_TYPE_TEXT = 1; + + /** + * Indicates a {@link SubtitleWebView} should be used to display subtitles. + * + *
This will instantiate a {@link android.webkit.WebView} and use CSS and HTML styling to + * render the subtitles. This supports some additional styling features beyond those supported by + * {@link SubtitleTextView} such as vertical text. + */ + public static final int VIEW_TYPE_WEB = 2; + + /** + * The type of {@link View} to use to display subtitles. + * + *
One of: + * + *
NOTE: {@link #VIEW_TYPE_WEB} is currently very experimental, and doesn't support most
+ * styling and layout properties of {@link Cue}.
+ */
+ public void setViewType(@ViewType int viewType) {
+ if (viewType == VIEW_TYPE_TEXT && !(innerSubtitleView instanceof SubtitleTextView)) {
+ setView(new SubtitleTextView(getContext()));
+ } else if (viewType == VIEW_TYPE_WEB && !(innerSubtitleView instanceof SubtitleWebView)) {
+ setView(new SubtitleWebView(getContext()));
+ } else {
+ throw new IllegalArgumentException();
+ }
+ }
+
+ private
- * See {@link TypedValue} for the possible dimension units.
+ *
+ * See {@link TypedValue} for the possible dimension units.
*
* @param unit The desired dimension unit.
* @param size The desired size in the given units.
@@ -144,7 +203,7 @@ public final class SubtitleView extends ViewGroup implements TextOutput {
}
private void setTextSize(@Cue.TextSizeType int textSizeType, float textSize) {
- subtitleTextView.setTextSize(textSizeType, textSize);
+ output.setTextSize(textSizeType, textSize);
}
/**
@@ -154,7 +213,7 @@ public final class SubtitleView extends ViewGroup implements TextOutput {
* @param applyEmbeddedStyles Whether styling embedded within the cues should be applied.
*/
public void setApplyEmbeddedStyles(boolean applyEmbeddedStyles) {
- subtitleTextView.setApplyEmbeddedStyles(applyEmbeddedStyles);
+ output.setApplyEmbeddedStyles(applyEmbeddedStyles);
}
/**
@@ -164,7 +223,7 @@ public final class SubtitleView extends ViewGroup implements TextOutput {
* @param applyEmbeddedFontSizes Whether font sizes embedded within the cues should be applied.
*/
public void setApplyEmbeddedFontSizes(boolean applyEmbeddedFontSizes) {
- subtitleTextView.setApplyEmbeddedFontSizes(applyEmbeddedFontSizes);
+ output.setApplyEmbeddedFontSizes(applyEmbeddedFontSizes);
}
/**
@@ -184,7 +243,7 @@ public final class SubtitleView extends ViewGroup implements TextOutput {
* @param style A style for the view.
*/
public void setStyle(CaptionStyleCompat style) {
- subtitleTextView.setStyle(style);
+ output.setStyle(style);
}
/**
@@ -197,7 +256,7 @@ public final class SubtitleView extends ViewGroup implements TextOutput {
* @param bottomPaddingFraction The bottom padding fraction.
*/
public void setBottomPaddingFraction(float bottomPaddingFraction) {
- subtitleTextView.setBottomPaddingFraction(bottomPaddingFraction);
+ output.setBottomPaddingFraction(bottomPaddingFraction);
}
@TargetApi(19)
@@ -223,15 +282,10 @@ public final class SubtitleView extends ViewGroup implements TextOutput {
/* package */ interface Output {
void onCues(List This is useful for subtitle styling not supported by Android's native text libraries such as
+ * vertical text.
+ *
+ * NOTE: This is currently extremely experimental and doesn't support most {@link Cue} styling
+ * properties.
+ */
+/* package */ final class SubtitleWebView extends ViewGroup implements SubtitleView.Output {
+
+ private final WebView webView;
+
+ private List "
+ + cueText
+ + "
");
+ }
+ cueText.append(cues.get(i).text);
+ }
+ webView.loadData(
+ "