diff --git a/core/api/current.txt b/core/api/current.txt index 5e8ff9f2c9ee1..3d5ab217f6a17 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -16407,12 +16407,8 @@ package android.graphics.pdf { package android.graphics.text { public final class LineBreakConfig { - ctor public LineBreakConfig(); method public int getLineBreakStyle(); method public int getLineBreakWordStyle(); - method public void set(@NonNull android.graphics.text.LineBreakConfig); - method public void setLineBreakStyle(int); - method public void setLineBreakWordStyle(int); field public static final int LINE_BREAK_STYLE_LOOSE = 1; // 0x1 field public static final int LINE_BREAK_STYLE_NONE = 0; // 0x0 field public static final int LINE_BREAK_STYLE_NORMAL = 2; // 0x2 @@ -16421,6 +16417,13 @@ package android.graphics.text { field public static final int LINE_BREAK_WORD_STYLE_PHRASE = 1; // 0x1 } + public static final class LineBreakConfig.Builder { + ctor public LineBreakConfig.Builder(); + method @NonNull public android.graphics.text.LineBreakConfig build(); + method @NonNull public android.graphics.text.LineBreakConfig.Builder setLineBreakStyle(int); + method @NonNull public android.graphics.text.LineBreakConfig.Builder setLineBreakWordStyle(int); + } + public class LineBreaker { method @NonNull public android.graphics.text.LineBreaker.Result computeLineBreaks(@NonNull android.graphics.text.MeasuredText, @NonNull android.graphics.text.LineBreaker.ParagraphConstraints, @IntRange(from=0) int); field public static final int BREAK_STRATEGY_BALANCED = 2; // 0x2 @@ -45062,7 +45065,7 @@ package android.text { public static final class PrecomputedText.Params { method public int getBreakStrategy(); method public int getHyphenationFrequency(); - method @Nullable public android.graphics.text.LineBreakConfig getLineBreakConfig(); + method @NonNull public android.graphics.text.LineBreakConfig getLineBreakConfig(); method @NonNull public android.text.TextDirectionHeuristic getTextDirection(); method @NonNull public android.text.TextPaint getTextPaint(); } @@ -57352,7 +57355,8 @@ package android.widget { method public final android.text.Layout getLayout(); method public float getLetterSpacing(); method public int getLineBounds(int, android.graphics.Rect); - method @NonNull public android.graphics.text.LineBreakConfig getLineBreakConfig(); + method public int getLineBreakStyle(); + method public int getLineBreakWordStyle(); method public int getLineCount(); method public int getLineHeight(); method public float getLineSpacingExtra(); @@ -57480,7 +57484,8 @@ package android.widget { method public void setKeyListener(android.text.method.KeyListener); method public void setLastBaselineToBottomHeight(@IntRange(from=0) @Px int); method public void setLetterSpacing(float); - method public void setLineBreakConfig(@NonNull android.graphics.text.LineBreakConfig); + method public void setLineBreakStyle(int); + method public void setLineBreakWordStyle(int); method public void setLineHeight(@IntRange(from=0) @Px int); method public void setLineSpacing(float, float); method public void setLines(int); diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java index 9307e566b5c3a..f31a690c77741 100644 --- a/core/java/android/text/PrecomputedText.java +++ b/core/java/android/text/PrecomputedText.java @@ -99,7 +99,7 @@ public class PrecomputedText implements Spannable { private final @Layout.HyphenationFrequency int mHyphenationFrequency; // The line break configuration for calculating text wrapping. - private final @Nullable LineBreakConfig mLineBreakConfig; + private final @NonNull LineBreakConfig mLineBreakConfig; /** * A builder for creating {@link Params}. @@ -119,7 +119,7 @@ public class PrecomputedText implements Spannable { Layout.HYPHENATION_FREQUENCY_NORMAL; // The line break configuration for calculating text wrapping. - private @Nullable LineBreakConfig mLineBreakConfig; + private @NonNull LineBreakConfig mLineBreakConfig = LineBreakConfig.NONE; /** * Builder constructor. @@ -212,7 +212,7 @@ public class PrecomputedText implements Spannable { // For the external developers, use Builder instead. /** @hide */ public Params(@NonNull TextPaint paint, - @Nullable LineBreakConfig lineBreakConfig, + @NonNull LineBreakConfig lineBreakConfig, @NonNull TextDirectionHeuristic textDir, @Layout.BreakStrategy int strategy, @Layout.HyphenationFrequency int frequency) { @@ -260,11 +260,12 @@ public class PrecomputedText implements Spannable { } /** - * Return the line break configuration for this text. + * Returns the {@link LineBreakConfig} for this text. * - * @return the current line break configuration, null if no line break configuration is set. + * @return the current line break configuration. The {@link LineBreakConfig} with default + * values will be returned if no line break configuration is set. */ - public @Nullable LineBreakConfig getLineBreakConfig() { + public @NonNull LineBreakConfig getLineBreakConfig() { return mLineBreakConfig; } @@ -297,9 +298,9 @@ public class PrecomputedText implements Spannable { /** @hide */ public @CheckResultUsableResult int checkResultUsable(@NonNull TextPaint paint, @NonNull TextDirectionHeuristic textDir, @Layout.BreakStrategy int strategy, - @Layout.HyphenationFrequency int frequency, @Nullable LineBreakConfig lbConfig) { + @Layout.HyphenationFrequency int frequency, @NonNull LineBreakConfig lbConfig) { if (mBreakStrategy == strategy && mHyphenationFrequency == frequency - && isLineBreakEquals(mLineBreakConfig, lbConfig) + && mLineBreakConfig.equals(lbConfig) && mPaint.equalsForTextMeasurement(paint)) { return mTextDir == textDir ? USABLE : NEED_RECOMPUTE; } else { @@ -307,29 +308,6 @@ public class PrecomputedText implements Spannable { } } - /** - * Check the two LineBreakConfig instances are equal. - * This method assumes they are equal if one parameter is null and the other parameter has - * a LineBreakStyle value of LineBreakConfig.LINE_BREAK_STYLE_NONE. - * - * @param o1 the first LineBreakConfig instance. - * @param o2 the second LineBreakConfig instance. - * @return true if the two LineBreakConfig instances are equal. - */ - private boolean isLineBreakEquals(LineBreakConfig o1, LineBreakConfig o2) { - if (Objects.equals(o1, o2)) { - return true; - } - if (o1 == null && (o2 != null - && o2.getLineBreakStyle() == LineBreakConfig.LINE_BREAK_STYLE_NONE)) { - return true; - } else if (o2 == null && (o1 != null - && o1.getLineBreakStyle() == LineBreakConfig.LINE_BREAK_STYLE_NONE)) { - return true; - } - return false; - } - /** * Check if the same text layout. * diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index b10fc37bff2fd..2f85d2b63840b 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -112,6 +112,7 @@ public class StaticLayout extends Layout { b.mBreakStrategy = Layout.BREAK_STRATEGY_SIMPLE; b.mHyphenationFrequency = Layout.HYPHENATION_FREQUENCY_NONE; b.mJustificationMode = Layout.JUSTIFICATION_MODE_NONE; + b.mLineBreakConfig = LineBreakConfig.NONE; return b; } @@ -410,7 +411,8 @@ public class StaticLayout extends Layout { * * @param lineBreakConfig the line break configuration for text wrapping. * @return this builder, useful for chaining. - * @see android.widget.TextView#setLineBreakConfig + * @see android.widget.TextView#setLineBreakStyle + * @see android.widget.TextView#setLineBreakWordStyle */ @NonNull public Builder setLineBreakConfig(@NonNull LineBreakConfig lineBreakConfig) { @@ -454,7 +456,7 @@ public class StaticLayout extends Layout { @Nullable private int[] mRightIndents; private int mJustificationMode; private boolean mAddLastLineLineSpacing; - private LineBreakConfig mLineBreakConfig; + private LineBreakConfig mLineBreakConfig = LineBreakConfig.NONE; private final Paint.FontMetricsInt mFontMetricsInt = new Paint.FontMetricsInt(); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index b076d399d44aa..3c8fcb978fbdd 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -788,7 +788,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private Layout mLayout; private boolean mLocalesChanged = false; private int mTextSizeUnit = -1; - private LineBreakConfig mLineBreakConfig = new LineBreakConfig(); + private int mLineBreakStyle = DEFAULT_LINE_BREAK_STYLE; + private int mLineBreakWordStyle = DEFAULT_LINE_BREAK_WORD_STYLE; // This is used to reflect the current user preference for changing font weight and making text // more bold. @@ -1457,13 +1458,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case com.android.internal.R.styleable.TextView_lineBreakStyle: - mLineBreakConfig.setLineBreakStyle( - a.getInt(attr, LineBreakConfig.LINE_BREAK_STYLE_NONE)); + mLineBreakStyle = a.getInt(attr, LineBreakConfig.LINE_BREAK_STYLE_NONE); break; case com.android.internal.R.styleable.TextView_lineBreakWordStyle: - mLineBreakConfig.setLineBreakWordStyle( - a.getInt(attr, LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE)); + mLineBreakWordStyle = a.getInt(attr, + LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE); break; case com.android.internal.R.styleable.TextView_autoSizeTextType: @@ -4301,13 +4301,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @LineBreakConfig.LineBreakStyle int lineBreakStyle, @LineBreakConfig.LineBreakWordStyle int lineBreakWordStyle) { boolean updated = false; - if (isLineBreakStyleSpecified && mLineBreakConfig.getLineBreakStyle() != lineBreakStyle) { - mLineBreakConfig.setLineBreakStyle(lineBreakStyle); + if (isLineBreakStyleSpecified && mLineBreakStyle != lineBreakStyle) { + mLineBreakStyle = lineBreakStyle; updated = true; } - if (isLineBreakWordStyleSpecified - && mLineBreakConfig.getLineBreakWordStyle() != lineBreakWordStyle) { - mLineBreakConfig.setLineBreakWordStyle(lineBreakWordStyle); + if (isLineBreakWordStyleSpecified && mLineBreakWordStyle != lineBreakWordStyle) { + mLineBreakWordStyle = lineBreakWordStyle; updated = true; } if (updated && mLayout != null) { @@ -4871,50 +4870,72 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** - * Sets line break configuration indicates which strategy needs to be used when calculating the - * text wrapping. - *
- * There are two types of line break rules that can be configured at the same time. One is
- * line break style(lb) and the other is line break word style(lw). The line break style
- * affects rule-based breaking. The line break word style affects dictionary-based breaking
- * and provide phrase-based breaking opportunities. There are several types for the
- * line break style:
+ * Set the line break style for text wrapping.
+ *
+ * The line break style to indicates the line break strategies can be used when
+ * calculating the text wrapping. The line break style affects rule-based breaking. It
+ * specifies the strictness of line-breaking rules.
+ * There are several types for the line break style:
* {@link LineBreakConfig#LINE_BREAK_STYLE_LOOSE},
* {@link LineBreakConfig#LINE_BREAK_STYLE_NORMAL} and
- * {@link LineBreakConfig#LINE_BREAK_STYLE_STRICT}.
- * The type for the line break word style is
- * {@link LineBreakConfig#LINE_BREAK_WORD_STYLE_PHRASE}.
- * The default values of the line break style and the line break word style are
- * {@link LineBreakConfig#LINE_BREAK_STYLE_NONE} and
- * {@link LineBreakConfig#LINE_BREAK_WORD_STYLE_NONE} respectively, indicating that no line
- * breaking rules are specified.
- * See
+ * {@link LineBreakConfig#LINE_BREAK_STYLE_STRICT}. The default values of the line break style
+ * is {@link LineBreakConfig#LINE_BREAK_STYLE_NONE}, indicating no breaking rule is specified.
+ * See
* the line-break property
*
- * @param lineBreakConfig the line break config for text wrapping.
+ * @param lineBreakStyle the line break style for the text.
*/
- public void setLineBreakConfig(@NonNull LineBreakConfig lineBreakConfig) {
- Objects.requireNonNull(lineBreakConfig);
- if (mLineBreakConfig.equals(lineBreakConfig)) {
- return;
- }
- mLineBreakConfig.set(lineBreakConfig);
- if (mLayout != null) {
- nullLayouts();
- requestLayout();
- invalidate();
+ public void setLineBreakStyle(@LineBreakConfig.LineBreakStyle int lineBreakStyle) {
+ if (mLineBreakStyle != lineBreakStyle) {
+ mLineBreakStyle = lineBreakStyle;
+ if (mLayout != null) {
+ nullLayouts();
+ requestLayout();
+ invalidate();
+ }
}
}
/**
- * Get the current line break configuration for text wrapping.
+ * Set the line break word style for text wrapping.
*
- * @return the current line break configuration to be used for text wrapping.
+ * The line break word style affects dictionary-based breaking and provide phrase-based
+ * breaking opportunities. The type for the line break word style is
+ * {@link LineBreakConfig#LINE_BREAK_WORD_STYLE_PHRASE}. The default values of the line break
+ * word style is {@link LineBreakConfig#LINE_BREAK_WORD_STYLE_NONE}, indicating no breaking rule
+ * is specified.
+ * See
+ * the word-break property
+ *
+ * @param lineBreakWordStyle the line break word style for the tet
*/
- public @NonNull LineBreakConfig getLineBreakConfig() {
- LineBreakConfig lbConfig = new LineBreakConfig();
- lbConfig.set(mLineBreakConfig);
- return lbConfig;
+ public void setLineBreakWordStyle(@LineBreakConfig.LineBreakWordStyle int lineBreakWordStyle) {
+ if (mLineBreakWordStyle != lineBreakWordStyle) {
+ mLineBreakWordStyle = lineBreakWordStyle;
+ if (mLayout != null) {
+ nullLayouts();
+ requestLayout();
+ invalidate();
+ }
+ }
+ }
+
+ /**
+ * Get the current line break style for text wrapping.
+ *
+ * @return the current line break style to be used for text wrapping.
+ */
+ public @LineBreakConfig.LineBreakStyle int getLineBreakStyle() {
+ return mLineBreakStyle;
+ }
+
+ /**
+ * Get the current line word break style for text wrapping.
+ *
+ * @return the current line break word style to be used for text wrapping.
+ */
+ public @LineBreakConfig.LineBreakWordStyle int getLineBreakWordStyle() {
+ return mLineBreakWordStyle;
}
/**
@@ -4924,7 +4945,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @see PrecomputedText
*/
public @NonNull PrecomputedText.Params getTextMetricsParams() {
- return new PrecomputedText.Params(new TextPaint(mTextPaint), mLineBreakConfig,
+ return new PrecomputedText.Params(new TextPaint(mTextPaint),
+ LineBreakConfig.getLineBreakConfig(mLineBreakStyle, mLineBreakWordStyle),
getTextDirectionHeuristic(),
mBreakStrategy, mHyphenationFrequency);
}
@@ -4941,13 +4963,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mTextDir = params.getTextDirection();
mBreakStrategy = params.getBreakStrategy();
mHyphenationFrequency = params.getHyphenationFrequency();
- if (params.getLineBreakConfig() != null) {
- mLineBreakConfig.set(params.getLineBreakConfig());
- } else {
- // Set default value if the line break config in the PrecomputedText.Params is null.
- mLineBreakConfig.setLineBreakStyle(DEFAULT_LINE_BREAK_STYLE);
- mLineBreakConfig.setLineBreakWordStyle(DEFAULT_LINE_BREAK_WORD_STYLE);
- }
+ LineBreakConfig lineBreakConfig = params.getLineBreakConfig();
+ mLineBreakStyle = lineBreakConfig.getLineBreakStyle();
+ mLineBreakWordStyle = lineBreakConfig.getLineBreakWordStyle();
if (mLayout != null) {
nullLayouts();
requestLayout();
@@ -6486,7 +6504,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
final @PrecomputedText.Params.CheckResultUsableResult int checkResult =
precomputed.getParams().checkResultUsable(getPaint(), mTextDir, mBreakStrategy,
- mHyphenationFrequency, mLineBreakConfig);
+ mHyphenationFrequency, LineBreakConfig.getLineBreakConfig(
+ mLineBreakStyle, mLineBreakWordStyle));
switch (checkResult) {
case PrecomputedText.Params.UNUSABLE:
throw new IllegalArgumentException(
@@ -9383,7 +9402,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
.setHyphenationFrequency(mHyphenationFrequency)
.setJustificationMode(mJustificationMode)
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
- .setLineBreakConfig(mLineBreakConfig);
+ .setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
+ mLineBreakStyle, mLineBreakWordStyle));
if (shouldEllipsize) {
builder.setEllipsize(mEllipsize)
.setEllipsizedWidth(ellipsisWidth);
@@ -9498,7 +9518,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
.setHyphenationFrequency(mHyphenationFrequency)
.setJustificationMode(mJustificationMode)
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
- .setLineBreakConfig(mLineBreakConfig);
+ .setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
+ mLineBreakStyle, mLineBreakWordStyle));
if (shouldEllipsize) {
builder.setEllipsize(effectiveEllipsize)
.setEllipsizedWidth(ellipsisWidth);
@@ -9866,7 +9887,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
.setJustificationMode(getJustificationMode())
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
.setTextDirection(getTextDirectionHeuristic())
- .setLineBreakConfig(mLineBreakConfig);
+ .setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
+ mLineBreakStyle, mLineBreakWordStyle));
final StaticLayout layout = layoutBuilder.build();
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index da5f8998d1565..2107f651eade6 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -5479,9 +5479,9 @@