Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f573da3 authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Add Layout#Builder

This CL includes
- Add Layout#Builder for building BoringLayout or StaticLayout.
- Deprecate static builder functions of BoringLayout

Bug: 294769643
Test: atest CtsTextTestCases:LayoutBuilderTest
Change-Id: I25e727adada268a535928794b5eab7b309b27c15
parent 49ac12fa
Loading
Loading
Loading
Loading
+46 −15
Original line number Diff line number Diff line
@@ -47271,9 +47271,9 @@ package android.text {
  }
  public class BoringLayout extends android.text.Layout implements android.text.TextUtils.EllipsizeCallback {
    ctor public BoringLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
    ctor public BoringLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
    ctor public BoringLayout(@NonNull CharSequence, @NonNull android.text.TextPaint, @IntRange(from=0) int, @NonNull android.text.Layout.Alignment, float, float, @NonNull android.text.BoringLayout.Metrics, boolean, @Nullable android.text.TextUtils.TruncateAt, @IntRange(from=0) int, boolean);
    ctor @Deprecated public BoringLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
    ctor @Deprecated public BoringLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
    ctor @Deprecated public BoringLayout(@NonNull CharSequence, @NonNull android.text.TextPaint, @IntRange(from=0) int, @NonNull android.text.Layout.Alignment, float, float, @NonNull android.text.BoringLayout.Metrics, boolean, @Nullable android.text.TextUtils.TruncateAt, @IntRange(from=0) int, boolean);
    method public void ellipsized(int, int);
    method public int getBottomPadding();
    method public int getEllipsisCount(int);
@@ -47286,12 +47286,12 @@ package android.text {
    method public int getLineTop(int);
    method public int getParagraphDirection(int);
    method public int getTopPadding();
    method public static android.text.BoringLayout.Metrics isBoring(CharSequence, android.text.TextPaint);
    method public static android.text.BoringLayout.Metrics isBoring(CharSequence, android.text.TextPaint, android.text.BoringLayout.Metrics);
    method @Nullable public static android.text.BoringLayout.Metrics isBoring(@NonNull CharSequence, @NonNull android.text.TextPaint, @NonNull android.text.TextDirectionHeuristic, boolean, @Nullable android.text.BoringLayout.Metrics);
    method public static android.text.BoringLayout make(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
    method public static android.text.BoringLayout make(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
    method @NonNull public static android.text.BoringLayout make(@NonNull CharSequence, @NonNull android.text.TextPaint, @IntRange(from=0) int, @NonNull android.text.Layout.Alignment, @NonNull android.text.BoringLayout.Metrics, boolean, @Nullable android.text.TextUtils.TruncateAt, @IntRange(from=0) int, boolean);
    method @Deprecated public static android.text.BoringLayout.Metrics isBoring(CharSequence, android.text.TextPaint);
    method @Deprecated public static android.text.BoringLayout.Metrics isBoring(CharSequence, android.text.TextPaint, android.text.BoringLayout.Metrics);
    method @Deprecated @Nullable public static android.text.BoringLayout.Metrics isBoring(@NonNull CharSequence, @NonNull android.text.TextPaint, @NonNull android.text.TextDirectionHeuristic, boolean, @Nullable android.text.BoringLayout.Metrics);
    method @Deprecated public static android.text.BoringLayout make(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
    method @Deprecated public static android.text.BoringLayout make(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
    method @Deprecated @NonNull public static android.text.BoringLayout make(@NonNull CharSequence, @NonNull android.text.TextPaint, @IntRange(from=0) int, @NonNull android.text.Layout.Alignment, @NonNull android.text.BoringLayout.Metrics, boolean, @Nullable android.text.TextUtils.TruncateAt, @IntRange(from=0) int, boolean);
    method public android.text.BoringLayout replaceOrMake(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
    method @NonNull public android.text.BoringLayout replaceOrMake(@NonNull CharSequence, @NonNull android.text.TextPaint, @IntRange(from=0) int, @NonNull android.text.Layout.Alignment, @NonNull android.text.BoringLayout.Metrics, boolean, @Nullable android.text.TextUtils.TruncateAt, @IntRange(from=0) int, boolean);
    method public android.text.BoringLayout replaceOrMake(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
@@ -47316,7 +47316,6 @@ package android.text {
    method public int getBottomPadding();
    method public int getEllipsisCount(int);
    method public int getEllipsisStart(int);
    method @NonNull public android.graphics.text.LineBreakConfig getLineBreakConfig();
    method public boolean getLineContainsTab(int);
    method public int getLineCount();
    method public int getLineDescent(int);
@@ -47489,20 +47488,26 @@ package android.text {
    method public void drawBackground(@NonNull android.graphics.Canvas);
    method public void drawText(@NonNull android.graphics.Canvas);
    method public void fillCharacterBounds(@IntRange(from=0) int, @IntRange(from=0) int, @NonNull float[], @IntRange(from=0) int);
    method public final android.text.Layout.Alignment getAlignment();
    method @NonNull public final android.text.Layout.Alignment getAlignment();
    method public abstract int getBottomPadding();
    method public final int getBreakStrategy();
    method public void getCursorPath(int, android.graphics.Path, CharSequence);
    method public static float getDesiredWidth(CharSequence, android.text.TextPaint);
    method public static float getDesiredWidth(CharSequence, int, int, android.text.TextPaint);
    method public abstract int getEllipsisCount(int);
    method public abstract int getEllipsisStart(int);
    method public int getEllipsizedWidth();
    method @Nullable public final android.text.TextUtils.TruncateAt getEllipsize();
    method @IntRange(from=0) public int getEllipsizedWidth();
    method public int getHeight();
    method public final int getHyphenationFrequency();
    method public final int getJustificationMode();
    method @Nullable public final int[] getLeftIndents();
    method public final int getLineAscent(int);
    method public final int getLineBaseline(int);
    method public final int getLineBottom(int);
    method public int getLineBottom(int, boolean);
    method public int getLineBounds(int, android.graphics.Rect);
    method @NonNull public android.graphics.text.LineBreakConfig getLineBreakConfig();
    method public abstract boolean getLineContainsTab(int);
    method public abstract int getLineCount();
    method public abstract int getLineDescent(int);
@@ -47513,29 +47518,35 @@ package android.text {
    method public float getLineLeft(int);
    method public float getLineMax(int);
    method public float getLineRight(int);
    method public final float getLineSpacingAmount();
    method public final float getLineSpacingMultiplier();
    method public abstract int getLineStart(int);
    method public abstract int getLineTop(int);
    method public int getLineVisibleEnd(int);
    method public float getLineWidth(int);
    method @IntRange(from=1) public final int getMaxLines();
    method public int getOffsetForHorizontal(int, float);
    method public int getOffsetToLeftOf(int);
    method public int getOffsetToRightOf(int);
    method public final android.text.TextPaint getPaint();
    method @NonNull public final android.text.TextPaint getPaint();
    method public final android.text.Layout.Alignment getParagraphAlignment(int);
    method public abstract int getParagraphDirection(int);
    method public final int getParagraphLeft(int);
    method public final int getParagraphRight(int);
    method public float getPrimaryHorizontal(int);
    method @Nullable public int[] getRangeForRect(@NonNull android.graphics.RectF, @NonNull android.text.SegmentFinder, @NonNull android.text.Layout.TextInclusionStrategy);
    method @Nullable public final int[] getRightIndents();
    method public float getSecondaryHorizontal(int);
    method public void getSelectionPath(int, int, android.graphics.Path);
    method public final float getSpacingAdd();
    method public final float getSpacingMultiplier();
    method public final CharSequence getText();
    method @NonNull public final CharSequence getText();
    method @NonNull public final android.text.TextDirectionHeuristic getTextDirectionHeuristic();
    method public abstract int getTopPadding();
    method public final int getWidth();
    method @IntRange(from=0) public final int getWidth();
    method public final void increaseWidthTo(int);
    method public boolean isFallbackLineSpacingEnabled();
    method public final boolean isIncludeFontPadding();
    method public boolean isRtlCharAt(int);
    method protected final boolean isSpanned();
    field public static final int BREAK_STRATEGY_BALANCED = 2; // 0x2
@@ -47563,6 +47574,26 @@ package android.text {
    enum_constant public static final android.text.Layout.Alignment ALIGN_OPPOSITE;
  }
  public static final class Layout.Builder {
    ctor public Layout.Builder(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @NonNull android.text.TextPaint, @IntRange(from=0) int);
    method @NonNull public android.text.Layout build();
    method @NonNull public android.text.Layout.Builder setAlignment(@NonNull android.text.Layout.Alignment);
    method @NonNull public android.text.Layout.Builder setBreakStrategy(int);
    method @NonNull public android.text.Layout.Builder setEllipsize(@Nullable android.text.TextUtils.TruncateAt);
    method @NonNull public android.text.Layout.Builder setEllipsizedWidth(@IntRange(from=0) int);
    method @NonNull public android.text.Layout.Builder setFallbackLineSpacingEnabled(boolean);
    method @NonNull public android.text.Layout.Builder setHyphenationFrequency(int);
    method @NonNull public android.text.Layout.Builder setIncludeFontPadding(boolean);
    method @NonNull public android.text.Layout.Builder setJustificationMode(int);
    method @NonNull public android.text.Layout.Builder setLeftIndents(@Nullable int[]);
    method @NonNull public android.text.Layout.Builder setLineBreakConfig(@NonNull android.graphics.text.LineBreakConfig);
    method @NonNull public android.text.Layout.Builder setLineSpacingAmount(float);
    method @NonNull public android.text.Layout.Builder setLineSpacingMultiplier(float);
    method @NonNull public android.text.Layout.Builder setMaxLines(@IntRange(from=1) int);
    method @NonNull public android.text.Layout.Builder setRightIndents(@Nullable int[]);
    method @NonNull public android.text.Layout.Builder setTextDirectionHeuristic(@NonNull android.text.TextDirectionHeuristic);
  }
  public static class Layout.Directions {
  }
+64 −7
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.text.LineBreakConfig;
import android.text.style.ParagraphStyle;

/**
@@ -53,7 +54,9 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
     *                line width
     * @param includePad set whether to include extra space beyond font ascent and descent which is
     *                   needed to avoid clipping in some scripts
     * @deprecated Use {@link android.text.Layout.Builder} instead.
     */
    @Deprecated
    public static BoringLayout make(CharSequence source, TextPaint paint, int outerWidth,
            Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics,
            boolean includePad) {
@@ -79,7 +82,9 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
     * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is
     *                        {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is
     *                        not used, {@code outerWidth} is used instead
     * @deprecated Use {@link android.text.Layout.Builder} instead.
     */
    @Deprecated
    public static BoringLayout make(CharSequence source, TextPaint paint, int outerWidth,
            Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics,
            boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
@@ -111,7 +116,9 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
     *                              False for keeping the first font's line height. If some glyphs
     *                              requires larger vertical spaces, by passing true to this
     *                              argument, the layout increase the line height to fit all glyphs.
     * @deprecated Use {@link android.text.Layout.Builder} instead.
     */
    @Deprecated
    public static @NonNull BoringLayout make(
            @NonNull CharSequence source, @NonNull TextPaint paint,
            @IntRange(from = 0) int outerWidth,
@@ -247,10 +254,17 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
     *                line width
     * @param includePad set whether to include extra space beyond font ascent and descent which is
     *                   needed to avoid clipping in some scripts
     * @deprecated Use {@link android.text.Layout.Builder} instead.
     */
    @Deprecated
    public BoringLayout(CharSequence source, TextPaint paint, int outerwidth, Alignment align,
            float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad) {
        super(source, paint, outerwidth, align, spacingMult, spacingAdd);
        super(source, paint, outerwidth, align, TextDirectionHeuristics.LTR, spacingMult,
                spacingAdd, includePad, false /* fallbackLineSpacing */,
                outerwidth /* ellipsizedWidth */, null /* ellipsize */, 1 /* maxLines */,
                BREAK_STRATEGY_SIMPLE, HYPHENATION_FREQUENCY_NONE, null /* leftIndents */,
                null /* rightIndents */, JUSTIFICATION_MODE_NONE,
                LineBreakConfig.NONE);

        mEllipsizedWidth = outerwidth;
        mEllipsizedStart = 0;
@@ -277,7 +291,9 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
     * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is
     *                        {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is
     *                        not used, {@code outerWidth} is used instead
     * @deprecated Use {@link android.text.Layout.Builder} instead.
     */
    @Deprecated
    public BoringLayout(CharSequence source, TextPaint paint, int outerWidth, Alignment align,
            float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad,
            TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
@@ -306,7 +322,9 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
     *                              False for keeping the first font's line height. If some glyphs
     *                              requires larger vertical spaces, by passing true to this
     *                              argument, the layout increase the line height to fit all glyphs.
     * @deprecated Use {@link android.text.Layout.Builder} instead.
     */
    @Deprecated
    public BoringLayout(
            @NonNull CharSequence source, @NonNull TextPaint paint,
            @IntRange(from = 0) int outerWidth, @NonNull Alignment align, float spacingMult,
@@ -318,25 +336,58 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
         * but we can't use "this" for the callback until the call to
         * super() finishes.
         */
        super(source, paint, outerWidth, align, spacingMult, spacingAdd);
        this(source, paint, outerWidth, align, TextDirectionHeuristics.LTR, spacingMult,
                spacingAdd, includePad, useFallbackLineSpacing,
                ellipsizedWidth, ellipsize, 1 /* maxLines */,
                BREAK_STRATEGY_SIMPLE, HYPHENATION_FREQUENCY_NONE, null /* leftIndents */,
                null /* rightIndents */, JUSTIFICATION_MODE_NONE,
                LineBreakConfig.NONE, metrics);
    }

    /* package */ BoringLayout(
            CharSequence text,
            TextPaint paint,
            int width,
            Alignment align,
            TextDirectionHeuristic textDir,
            float spacingMult,
            float spacingAdd,
            boolean includePad,
            boolean fallbackLineSpacing,
            int ellipsizedWidth,
            TextUtils.TruncateAt ellipsize,
            int maxLines,
            int breakStrategy,
            int hyphenationFrequency,
            int[] leftIndents,
            int[] rightIndents,
            int justificationMode,
            LineBreakConfig lineBreakConfig,
            Metrics metrics) {

        super(text, paint, width, align, textDir, spacingMult, spacingAdd, includePad,
                fallbackLineSpacing, ellipsizedWidth, ellipsize, maxLines, breakStrategy,
                hyphenationFrequency, leftIndents, rightIndents, justificationMode,
                lineBreakConfig);


        boolean trust;

        if (ellipsize == null || ellipsize == TextUtils.TruncateAt.MARQUEE) {
            mEllipsizedWidth = outerWidth;
            mEllipsizedWidth = width;
            mEllipsizedStart = 0;
            mEllipsizedCount = 0;
            trust = true;
        } else {
            replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this),
                        paint, outerWidth, align, spacingMult, spacingAdd);
            replaceWith(TextUtils.ellipsize(text, paint, ellipsizedWidth, ellipsize, true, this),
                        paint, width, align, spacingMult, spacingAdd);

            mEllipsizedWidth = ellipsizedWidth;
            trust = false;
        }

        mUseFallbackLineSpacing = useFallbackLineSpacing;
        init(getText(), paint, align, metrics, includePad, trust, useFallbackLineSpacing);
        mUseFallbackLineSpacing = fallbackLineSpacing;
        init(getText(), paint, align, metrics, includePad, trust, fallbackLineSpacing);
    }

    /* package */ void init(CharSequence source, TextPaint paint, Alignment align,
@@ -391,7 +442,9 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
     * @param paint a paint
     * @return layout metric for the given text. null if given text is unable to be handled by
     *         BoringLayout.
     * @deprecated Use {@link android.text.Layout.Builder} instead.
     */
    @Deprecated
    public static Metrics isBoring(CharSequence text, TextPaint paint) {
        return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, null);
    }
@@ -406,7 +459,9 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
     * @return layout metric for the given text. If metrics is not null, this method fills values
     *         to given metrics object instead of allocating new metrics object. null if given text
     *         is unable to be handled by BoringLayout.
     * @deprecated Use {@link android.text.Layout.Builder} instead.
     */
    @Deprecated
    public static Metrics isBoring(CharSequence text, TextPaint paint, Metrics metrics) {
        return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, metrics);
    }
@@ -466,7 +521,9 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
     *                              argument, the layout increase the line height to fit all glyphs.
     * @param metrics the out metrics.
     * @return metrics on success. null if text cannot be rendered by BoringLayout.
     * @deprecated Use {@link android.text.Layout.Builder} instead.
     */
    @Deprecated
    public static @Nullable Metrics isBoring(@NonNull CharSequence text, @NonNull TextPaint paint,
            @NonNull TextDirectionHeuristic textDir, boolean useFallbackLineSpacing,
            @Nullable Metrics metrics) {
+13 −5
Original line number Diff line number Diff line
@@ -388,7 +388,11 @@ public class DynamicLayout extends Layout {
                         @Nullable TextUtils.TruncateAt ellipsize,
                         @IntRange(from = 0) int ellipsizedWidth) {
        super(createEllipsizer(ellipsize, display),
              paint, width, align, textDir, spacingmult, spacingadd);
              paint, width, align, textDir, spacingmult, spacingadd, includepad,
                false /* fallbackLineSpacing */, ellipsizedWidth, ellipsize,
                Integer.MAX_VALUE /* maxLines */, breakStrategy, hyphenationFrequency,
                null /* leftIndents */, null /* rightIndents */, justificationMode,
                lineBreakConfig);

        final Builder b = Builder.obtain(base, paint, width)
                .setAlignment(align)
@@ -410,7 +414,11 @@ public class DynamicLayout extends Layout {

    private DynamicLayout(@NonNull Builder b) {
        super(createEllipsizer(b.mEllipsize, b.mDisplay),
                b.mPaint, b.mWidth, b.mAlignment, b.mTextDir, b.mSpacingMult, b.mSpacingAdd);
                b.mPaint, b.mWidth, b.mAlignment, b.mTextDir, b.mSpacingMult, b.mSpacingAdd,
                b.mIncludePad, b.mFallbackLineSpacing, b.mEllipsizedWidth, b.mEllipsize,
                Integer.MAX_VALUE /* maxLines */, b.mBreakStrategy, b.mHyphenationFrequency,
                null /* leftIndents */, null /* rightIndents */, b.mJustificationMode,
                b.mLineBreakConfig);

        mDisplay = b.mDisplay;
        mIncludePad = b.mIncludePad;
@@ -615,7 +623,6 @@ public class DynamicLayout extends Layout {
        }

        if (reflowed == null) {
            reflowed = new StaticLayout(null);
            b = StaticLayout.Builder.obtain(text, where, where + after, getPaint(), getWidth());
        }

@@ -631,9 +638,10 @@ public class DynamicLayout extends Layout {
                .setHyphenationFrequency(mHyphenationFrequency)
                .setJustificationMode(mJustificationMode)
                .setLineBreakConfig(mLineBreakConfig)
                .setAddLastLineLineSpacing(!islast);
                .setAddLastLineLineSpacing(!islast)
                .setIncludePad(false);

        reflowed.generate(b, false /*includepad*/, true /*trackpad*/);
        reflowed = b.regenerate(true /* trackpadding */, reflowed);
        int n = reflowed.getLineCount();
        // If the new layout has a blank line at the end, but it is not
        // the very end of the buffer, then we already have a line that
+735 −77

File changed.

Preview size limit exceeded, changes collapsed.

+33 −92

File changed.

Preview size limit exceeded, changes collapsed.