diff options
Diffstat (limited to 'tuner/src/com/android/tv/tuner/cc/CaptionWindowLayout.java')
-rw-r--r-- | tuner/src/com/android/tv/tuner/cc/CaptionWindowLayout.java | 120 |
1 files changed, 94 insertions, 26 deletions
diff --git a/tuner/src/com/android/tv/tuner/cc/CaptionWindowLayout.java b/tuner/src/com/android/tv/tuner/cc/CaptionWindowLayout.java index 8a8916c7..4f3623f8 100644 --- a/tuner/src/com/android/tv/tuner/cc/CaptionWindowLayout.java +++ b/tuner/src/com/android/tv/tuner/cc/CaptionWindowLayout.java @@ -39,6 +39,8 @@ import android.view.accessibility.CaptioningManager; import android.view.accessibility.CaptioningManager.CaptionStyle; import android.view.accessibility.CaptioningManager.CaptioningChangeListener; import android.widget.RelativeLayout; + +import com.android.tv.common.flags.TunerFlags; import com.android.tv.tuner.data.Cea708Data.CaptionPenAttr; import com.android.tv.tuner.data.Cea708Data.CaptionPenColor; import com.android.tv.tuner.data.Cea708Data.CaptionWindow; @@ -46,12 +48,15 @@ import com.android.tv.tuner.data.Cea708Data.CaptionWindowAttr; import com.android.tv.tuner.exoplayer.text.SubtitleView; import com.android.tv.tuner.layout.ScaledLayout; import com.google.android.exoplayer.text.CaptionStyleCompat; +import com.google.android.exoplayer2.text.Cue; import com.google.auto.factory.AutoFactory; +import com.google.auto.factory.Provided; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -92,9 +97,11 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout private CaptionLayout mCaptionLayout; private CaptionStyleCompat mCaptionStyleCompat; + private com.google.android.exoplayer2.text.CaptionStyleCompat mCaptionStyleCompatExoV2; // TODO: Replace SubtitleView to {@link com.google.android.exoplayer.text.SubtitleLayout}. private final SubtitleView mSubtitleView; + private final com.google.android.exoplayer2.ui.SubtitleView mSubtitleViewExoV2; private int mRowLimit = 0; private final SpannableStringBuilder mBuilder = new SpannableStringBuilder(); private final List<CharacterStyle> mCharacterStyles = new ArrayList<>(); @@ -107,12 +114,19 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout private int mLastCaptionLayoutHeight; private int mWindowJustify; private int mPrintDirection; + private final TunerFlags mTunerFlags; private class SystemWideCaptioningChangeListener extends CaptioningChangeListener { @Override public void onUserStyleChanged(CaptionStyle userStyle) { - mCaptionStyleCompat = CaptionStyleCompat.createFromCaptionStyle(userStyle); - mSubtitleView.setStyle(mCaptionStyleCompat); + if (mTunerFlags.useExoplayerV2()) { + mCaptionStyleCompatExoV2 = com.google.android.exoplayer2.text.CaptionStyleCompat + .createFromCaptionStyle(userStyle); + mSubtitleViewExoV2.setStyle(mCaptionStyleCompatExoV2); + } else { + mCaptionStyleCompat = CaptionStyleCompat.createFromCaptionStyle(userStyle); + mSubtitleView.setStyle(mCaptionStyleCompat); + } updateWidestChar(); } @@ -134,32 +148,46 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout } @AutoFactory(implementing = Factory.class) - public CaptionWindowLayout(Context context) { - this(context, null); + public CaptionWindowLayout(Context context, @Provided TunerFlags tunerFlags) { + this(context, null, tunerFlags); } - public CaptionWindowLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); + public CaptionWindowLayout(Context context, AttributeSet attrs, TunerFlags tunerFlags) { + this(context, attrs, 0, tunerFlags); } - public CaptionWindowLayout(Context context, AttributeSet attrs, int defStyleAttr) { + public CaptionWindowLayout( + Context context, + AttributeSet attrs, + int defStyleAttr, + TunerFlags tunerFlags) { super(context, attrs, defStyleAttr); - // Add a subtitle view to the layout. - mSubtitleView = new SubtitleView(context); + mTunerFlags = tunerFlags; LayoutParams params = new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - addView(mSubtitleView, params); - // Set the system wide cc preferences to the subtitle view. CaptioningManager captioningManager = (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE); mFontScale = captioningManager.getFontScale(); - mCaptionStyleCompat = - CaptionStyleCompat.createFromCaptionStyle(captioningManager.getUserStyle()); - mSubtitleView.setStyle(mCaptionStyleCompat); - mSubtitleView.setText(""); + + // Add a subtitle view to the layout. + mSubtitleViewExoV2 = new com.google.android.exoplayer2.ui.SubtitleView(context); + mSubtitleView = new SubtitleView(context); + if (mTunerFlags.useExoplayerV2()) { + addView(mSubtitleViewExoV2, params); + mCaptionStyleCompatExoV2 = + com.google.android.exoplayer2.text.CaptionStyleCompat + .createFromCaptionStyle(captioningManager.getUserStyle()); + mSubtitleViewExoV2.setStyle(mCaptionStyleCompatExoV2); + } else { + addView(mSubtitleView, params); + mCaptionStyleCompat = + CaptionStyleCompat.createFromCaptionStyle(captioningManager.getUserStyle()); + mSubtitleView.setStyle(mCaptionStyleCompat); + mSubtitleView.setText(""); + } captioningManager.addCaptioningChangeListener(new SystemWideCaptioningChangeListener()); updateWidestChar(); } @@ -361,7 +389,7 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout switch (horizontalMode) { case ANCHOR_HORIZONTAL_MODE_LEFT: gravity = Gravity.LEFT; - mSubtitleView.setTextAlignment(Alignment.ALIGN_NORMAL); + setCaptionsTextAlignment(Alignment.ALIGN_NORMAL); scaleStartCol = scaleCol; break; case ANCHOR_HORIZONTAL_MODE_CENTER: @@ -379,7 +407,9 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout widestTextBuilder.append(mWidestChar); } Paint paint = new Paint(); - paint.setTypeface(mCaptionStyleCompat.typeface); + if (!mTunerFlags.useExoplayerV2()) { + paint.setTypeface(mCaptionStyleCompat.typeface); + } paint.setTextSize(mTextSize); float maxWindowWidth = paint.measureText(widestTextBuilder.toString()); float halfMaxWidthScale = @@ -391,7 +421,7 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout // caption window multiplied by average alphabets char width, then align the // left side of the window with the left side of the expected max window. gravity = Gravity.LEFT; - mSubtitleView.setTextAlignment(Alignment.ALIGN_NORMAL); + setCaptionsTextAlignment(Alignment.ALIGN_NORMAL); scaleStartCol = scaleCol - halfMaxWidthScale; scaleEndCol = 1.0f; } else { @@ -402,14 +432,14 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout // The anchor point is located at the horizontal center of the window in both // cases. gravity = Gravity.CENTER_HORIZONTAL; - mSubtitleView.setTextAlignment(Alignment.ALIGN_CENTER); + setCaptionsTextAlignment(Alignment.ALIGN_CENTER); scaleStartCol = scaleCol - gap; scaleEndCol = scaleCol + gap; } break; case ANCHOR_HORIZONTAL_MODE_RIGHT: gravity = Gravity.RIGHT; - mSubtitleView.setTextAlignment(Alignment.ALIGN_OPPOSITE); + setCaptionsTextAlignment(Alignment.ALIGN_OPPOSITE); scaleEndCol = scaleCol; break; } @@ -440,7 +470,7 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout setGravity(gravity); setWindowStyle(captionWindow.windowStyle); if (mWindowJustify == CaptionWindowAttr.JUSTIFY_CENTER) { - mSubtitleView.setTextAlignment(Alignment.ALIGN_CENTER); + setCaptionsTextAlignment(Alignment.ALIGN_CENTER); } if (captionWindow.visible) { show(); @@ -487,7 +517,9 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout mWidestChar = KOR_ALPHABET; } else { Paint paint = new Paint(); - paint.setTypeface(mCaptionStyleCompat.typeface); + if (!mTunerFlags.useExoplayerV2()) { + paint.setTypeface(mCaptionStyleCompat.typeface); + } Charset latin1 = Charset.forName("ISO-8859-1"); float widestCharWidth = 0f; for (int i = 0; i < 256; ++i) { @@ -502,6 +534,27 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout updateTextSize(); } + private void setCaptionsTextAlignment(Alignment textAlignment){ + if (mTunerFlags.useExoplayerV2()){ + switch (textAlignment) { + case ALIGN_NORMAL: + mSubtitleViewExoV2.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); + break; + case ALIGN_OPPOSITE: + mSubtitleViewExoV2.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); + break; + case ALIGN_CENTER: + mSubtitleViewExoV2.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); + break; + default: + mSubtitleViewExoV2.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); + break; + } + } else { + mSubtitleView.setTextAlignment(textAlignment); + } + } + private void updateTextSize() { if (mCaptionLayout == null) return; @@ -513,7 +566,9 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout } String widestText = widestTextBuilder.toString(); Paint paint = new Paint(); - paint.setTypeface(mCaptionStyleCompat.typeface); + if (!mTunerFlags.useExoplayerV2()) { + paint.setTypeface(mCaptionStyleCompat.typeface); + } float startFontSize = 0f; float endFontSize = 255f; Rect boundRect = new Rect(); @@ -536,8 +591,13 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout mTextSize = endFontSize * mFontScale; paint.setTextSize(mTextSize); float whiteSpaceWidth = paint.measureText(" "); - mSubtitleView.setWhiteSpaceWidth(whiteSpaceWidth); - mSubtitleView.setTextSize(mTextSize); + + if (mTunerFlags.useExoplayerV2()) { + mSubtitleViewExoV2.setFixedTextSize(0, mTextSize); + } else { + mSubtitleView.setWhiteSpaceWidth(whiteSpaceWidth); + mSubtitleView.setTextSize(mTextSize); + } } private int getScreenColumnCount() { @@ -577,7 +637,15 @@ public class CaptionWindowLayout extends RelativeLayout implements View.OnLayout public void clearText() { mBuilder.clear(); - mSubtitleView.setText(""); + if (mTunerFlags.useExoplayerV2()) { + mSubtitleViewExoV2.setCues(Collections.emptyList()); + } else { + mSubtitleView.setText(""); + } + } + + public void setCues(List<Cue> cues) { + mSubtitleViewExoV2.setCues(cues); } private void updateText(String text, boolean appended) { |