Add bitmap support to SubtitleWebView using SubtitleTextView

PiperOrigin-RevId: 309389571
This commit is contained in:
ibaker 2020-05-01 12:35:16 +01:00 committed by Oliver Woodman
parent 222231dd8e
commit 79c003f5a8

View File

@ -34,7 +34,7 @@ import com.google.android.exoplayer2.text.CaptionStyleCompat;
import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.Cue;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Collections; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -48,9 +48,17 @@ import java.util.List;
*/ */
/* package */ final class SubtitleWebView extends FrameLayout implements SubtitleView.Output { /* package */ final class SubtitleWebView extends FrameLayout implements SubtitleView.Output {
private final WebView webView; /**
* A {@link SubtitleTextView} used for displaying bitmap cues.
*
* <p>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<Cue> cues;
private List<Cue> cues;
@Cue.TextSizeType private int defaultTextSizeType; @Cue.TextSizeType private int defaultTextSizeType;
private float defaultTextSize; private float defaultTextSize;
private boolean applyEmbeddedStyles; private boolean applyEmbeddedStyles;
@ -64,7 +72,7 @@ import java.util.List;
public SubtitleWebView(Context context, @Nullable AttributeSet attrs) { public SubtitleWebView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs); super(context, attrs);
cues = Collections.emptyList(); cues = new ArrayList<>();
defaultTextSizeType = Cue.TEXT_SIZE_TYPE_FRACTIONAL; defaultTextSizeType = Cue.TEXT_SIZE_TYPE_FRACTIONAL;
defaultTextSize = DEFAULT_TEXT_SIZE_FRACTION; defaultTextSize = DEFAULT_TEXT_SIZE_FRACTION;
applyEmbeddedStyles = true; applyEmbeddedStyles = true;
@ -72,6 +80,7 @@ import java.util.List;
style = CaptionStyleCompat.DEFAULT; style = CaptionStyleCompat.DEFAULT;
bottomPaddingFraction = DEFAULT_BOTTOM_PADDING_FRACTION; bottomPaddingFraction = DEFAULT_BOTTOM_PADDING_FRACTION;
subtitleTextView = new SubtitleTextView(context, attrs);
webView = webView =
new WebView(context, attrs) { new WebView(context, attrs) {
@Override @Override
@ -89,12 +98,26 @@ import java.util.List;
} }
}; };
webView.setBackgroundColor(Color.TRANSPARENT); webView.setBackgroundColor(Color.TRANSPARENT);
addView(subtitleTextView);
addView(webView); addView(webView);
} }
@Override @Override
public void onCues(List<Cue> cues) { public void onCues(List<Cue> cues) {
this.cues = cues; List<Cue> 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(); updateWebView();
} }
@ -105,6 +128,7 @@ import java.util.List;
} }
this.defaultTextSizeType = textSizeType; this.defaultTextSizeType = textSizeType;
this.defaultTextSize = textSize; this.defaultTextSize = textSize;
invalidate();
updateWebView(); updateWebView();
} }
@ -116,6 +140,7 @@ import java.util.List;
} }
this.applyEmbeddedStyles = applyEmbeddedStyles; this.applyEmbeddedStyles = applyEmbeddedStyles;
this.applyEmbeddedFontSizes = applyEmbeddedStyles; this.applyEmbeddedFontSizes = applyEmbeddedStyles;
invalidate();
updateWebView(); updateWebView();
} }
@ -125,6 +150,7 @@ import java.util.List;
return; return;
} }
this.applyEmbeddedFontSizes = applyEmbeddedFontSizes; this.applyEmbeddedFontSizes = applyEmbeddedFontSizes;
invalidate();
updateWebView(); updateWebView();
} }
@ -134,6 +160,7 @@ import java.util.List;
return; return;
} }
this.style = style; this.style = style;
invalidate();
updateWebView(); updateWebView();
} }
@ -143,6 +170,7 @@ import java.util.List;
return; return;
} }
this.bottomPaddingFraction = bottomPaddingFraction; this.bottomPaddingFraction = bottomPaddingFraction;
invalidate();
updateWebView(); updateWebView();
} }