diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleWebView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleWebView.java index dc76e4e372..d56249a7af 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleWebView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleWebView.java @@ -34,7 +34,7 @@ import com.google.android.exoplayer2.text.CaptionStyleCompat; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.util.Util; import java.nio.charset.Charset; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; /** @@ -48,9 +48,17 @@ import java.util.List; */ /* package */ final class SubtitleWebView extends FrameLayout implements SubtitleView.Output { - private final WebView webView; + /** + * A {@link SubtitleTextView} used for displaying bitmap cues. + * + *

There's no advantage to displaying bitmap cues in a {@link WebView}, so we re-use the + * existing logic. + */ + private final SubtitleTextView subtitleTextView; + + private final WebView webView; + private final List cues; - private List cues; @Cue.TextSizeType private int defaultTextSizeType; private float defaultTextSize; private boolean applyEmbeddedStyles; @@ -64,7 +72,7 @@ import java.util.List; public SubtitleWebView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); - cues = Collections.emptyList(); + cues = new ArrayList<>(); defaultTextSizeType = Cue.TEXT_SIZE_TYPE_FRACTIONAL; defaultTextSize = DEFAULT_TEXT_SIZE_FRACTION; applyEmbeddedStyles = true; @@ -72,6 +80,7 @@ import java.util.List; style = CaptionStyleCompat.DEFAULT; bottomPaddingFraction = DEFAULT_BOTTOM_PADDING_FRACTION; + subtitleTextView = new SubtitleTextView(context, attrs); webView = new WebView(context, attrs) { @Override @@ -89,12 +98,26 @@ import java.util.List; } }; webView.setBackgroundColor(Color.TRANSPARENT); + + addView(subtitleTextView); addView(webView); } @Override public void onCues(List cues) { - this.cues = cues; + List bitmapCues = new ArrayList<>(); + this.cues.clear(); + for (int i = 0; i < cues.size(); i++) { + Cue cue = cues.get(i); + if (cue.bitmap != null) { + bitmapCues.add(cue); + } else { + this.cues.add(cue); + } + } + subtitleTextView.onCues(bitmapCues); + // Invalidate to trigger subtitleTextView to draw. + invalidate(); updateWebView(); } @@ -105,6 +128,7 @@ import java.util.List; } this.defaultTextSizeType = textSizeType; this.defaultTextSize = textSize; + invalidate(); updateWebView(); } @@ -116,6 +140,7 @@ import java.util.List; } this.applyEmbeddedStyles = applyEmbeddedStyles; this.applyEmbeddedFontSizes = applyEmbeddedStyles; + invalidate(); updateWebView(); } @@ -125,6 +150,7 @@ import java.util.List; return; } this.applyEmbeddedFontSizes = applyEmbeddedFontSizes; + invalidate(); updateWebView(); } @@ -134,6 +160,7 @@ import java.util.List; return; } this.style = style; + invalidate(); updateWebView(); } @@ -143,6 +170,7 @@ import java.util.List; return; } this.bottomPaddingFraction = bottomPaddingFraction; + invalidate(); updateWebView(); }