public Cea708Cue build() { if (isEmpty()) { // The cue is empty. return null; } SpannableStringBuilder cueString = new SpannableStringBuilder(); // Add any rolled up captions, separated by new lines. for (int i = 0; i < rolledUpCaptions.size(); i++) { cueString.append(rolledUpCaptions.get(i)); cueString.append('\n'); } // Add the current line. cueString.append(buildSpannableString()); // TODO: Add support for right-to-left languages (i.e. where right would correspond to normal // alignment). Alignment alignment; switch (justification) { case JUSTIFICATION_FULL: // TODO: Add support for full justification. case JUSTIFICATION_LEFT: alignment = Alignment.ALIGN_NORMAL; break; case JUSTIFICATION_RIGHT: alignment = Alignment.ALIGN_OPPOSITE; break; case JUSTIFICATION_CENTER: alignment = Alignment.ALIGN_CENTER; break; default: throw new IllegalArgumentException("Unexpected justification value: " + justification); } float position; float line; if (relativePositioning) { position = (float) horizontalAnchor / RELATIVE_CUE_SIZE; line = (float) verticalAnchor / RELATIVE_CUE_SIZE; } else { position = (float) horizontalAnchor / HORIZONTAL_SIZE; line = (float) verticalAnchor / VERTICAL_SIZE; } // Apply screen-edge padding to the line and position. position = (position * 0.9f) + 0.05f; line = (line * 0.9f) + 0.05f; // anchorId specifies where the anchor should be placed on the caption cue/window. The 9 // possible configurations are as follows: // 0-----1-----2 // | | // 3 4 5 // | | // 6-----7-----8 @AnchorType int verticalAnchorType; if (anchorId % 3 == 0) { verticalAnchorType = Cue.ANCHOR_TYPE_START; } else if (anchorId % 3 == 1) { verticalAnchorType = Cue.ANCHOR_TYPE_MIDDLE; } else { verticalAnchorType = Cue.ANCHOR_TYPE_END; } // TODO: Add support for right-to-left languages (i.e. where start is on the right). @AnchorType int horizontalAnchorType; if (anchorId / 3 == 0) { horizontalAnchorType = Cue.ANCHOR_TYPE_START; } else if (anchorId / 3 == 1) { horizontalAnchorType = Cue.ANCHOR_TYPE_MIDDLE; } else { horizontalAnchorType = Cue.ANCHOR_TYPE_END; } boolean windowColorSet = (windowFillColor != COLOR_SOLID_BLACK); return new Cea708Cue(cueString, alignment, line, Cue.LINE_TYPE_FRACTION, verticalAnchorType, position, horizontalAnchorType, Cue.DIMEN_UNSET, windowColorSet, windowFillColor, priority); }