Merge "[TextView] add setLineBreakConfig() API in DynamicLayout"

This commit is contained in:
Allen Su
2023-05-18 02:47:56 +00:00
committed by Android (Google) Code Review
3 changed files with 48 additions and 4 deletions

View File

@@ -47172,6 +47172,7 @@ 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);
@@ -47193,6 +47194,7 @@ package android.text {
method @NonNull public android.text.DynamicLayout.Builder setHyphenationFrequency(int);
method @NonNull public android.text.DynamicLayout.Builder setIncludePad(boolean);
method @NonNull public android.text.DynamicLayout.Builder setJustificationMode(int);
method @NonNull public android.text.DynamicLayout.Builder setLineBreakConfig(@NonNull android.graphics.text.LineBreakConfig);
method @NonNull public android.text.DynamicLayout.Builder setLineSpacing(float, @FloatRange(from=0.0) float);
method @NonNull public android.text.DynamicLayout.Builder setTextDirection(@NonNull android.text.TextDirectionHeuristic);
method @NonNull public android.text.DynamicLayout.Builder setUseLineSpacingFromFallbacks(boolean);

View File

@@ -23,6 +23,7 @@ import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.text.LineBreakConfig;
import android.os.Build;
import android.text.method.OffsetMapping;
import android.text.style.ReplacementSpan;
@@ -88,6 +89,7 @@ public class DynamicLayout 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;
}
@@ -267,6 +269,22 @@ public class DynamicLayout extends Layout {
return this;
}
/**
* Set the line break configuration. The line break will be passed to native used for
* calculating the text wrapping. The default value of the line break style is
* {@link LineBreakConfig#LINE_BREAK_STYLE_NONE}
*
* @param lineBreakConfig the line break configuration for text wrapping.
* @return this builder, useful for chaining.
* @see android.widget.TextView#setLineBreakStyle
* @see android.widget.TextView#setLineBreakWordStyle
*/
@NonNull
public Builder setLineBreakConfig(@NonNull LineBreakConfig lineBreakConfig) {
mLineBreakConfig = lineBreakConfig;
return this;
}
/**
* Build the {@link DynamicLayout} after options have been set.
*
@@ -298,6 +316,7 @@ public class DynamicLayout extends Layout {
private int mJustificationMode;
private TextUtils.TruncateAt mEllipsize;
private int mEllipsizedWidth;
private LineBreakConfig mLineBreakConfig = LineBreakConfig.NONE;
private final Paint.FontMetricsInt mFontMetricsInt = new Paint.FontMetricsInt();
@@ -344,7 +363,7 @@ public class DynamicLayout extends Layout {
this(base, display, paint, width, align, TextDirectionHeuristics.FIRSTSTRONG_LTR,
spacingmult, spacingadd, includepad,
Layout.BREAK_STRATEGY_SIMPLE, Layout.HYPHENATION_FREQUENCY_NONE,
Layout.JUSTIFICATION_MODE_NONE, ellipsize, ellipsizedWidth);
Layout.JUSTIFICATION_MODE_NONE, LineBreakConfig.NONE, ellipsize, ellipsizedWidth);
}
/**
@@ -365,6 +384,7 @@ public class DynamicLayout extends Layout {
boolean includepad, @BreakStrategy int breakStrategy,
@HyphenationFrequency int hyphenationFrequency,
@JustificationMode int justificationMode,
@NonNull LineBreakConfig lineBreakConfig,
@Nullable TextUtils.TruncateAt ellipsize,
@IntRange(from = 0) int ellipsizedWidth) {
super(createEllipsizer(ellipsize, display),
@@ -381,6 +401,7 @@ public class DynamicLayout extends Layout {
mBreakStrategy = breakStrategy;
mJustificationMode = justificationMode;
mHyphenationFrequency = hyphenationFrequency;
mLineBreakConfig = lineBreakConfig;
generate(b);
@@ -396,6 +417,7 @@ public class DynamicLayout extends Layout {
mBreakStrategy = b.mBreakStrategy;
mJustificationMode = b.mJustificationMode;
mHyphenationFrequency = b.mHyphenationFrequency;
mLineBreakConfig = b.mLineBreakConfig;
generate(b);
}
@@ -608,6 +630,7 @@ public class DynamicLayout extends Layout {
.setBreakStrategy(mBreakStrategy)
.setHyphenationFrequency(mHyphenationFrequency)
.setJustificationMode(mJustificationMode)
.setLineBreakConfig(mLineBreakConfig)
.setAddLastLineLineSpacing(!islast);
reflowed.generate(b, false /*includepad*/, true /*trackpad*/);
@@ -1209,6 +1232,18 @@ public class DynamicLayout extends Layout {
return mInts.getValue(line, ELLIPSIS_COUNT);
}
/**
* Gets the {@link LineBreakconfig} used in this DynamicLayout.
* Use this only to consult the LineBreakConfig's properties and not
* to change them.
*
* @return The line break config in this DynamicLayout.
*/
@NonNull
public LineBreakConfig getLineBreakConfig() {
return mLineBreakConfig;
}
private CharSequence mBase;
private CharSequence mDisplay;
private ChangeWatcher mWatcher;
@@ -1220,6 +1255,7 @@ public class DynamicLayout extends Layout {
private int mBreakStrategy;
private int mHyphenationFrequency;
private int mJustificationMode;
private LineBreakConfig mLineBreakConfig;
private PackedIntVector mInts;
private PackedObjectVector<Directions> mObjects;

View File

@@ -10688,6 +10688,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
boolean useSaved) {
Layout result = null;
if (useDynamicLayout()) {
final boolean autoPhraseBreaking = isAutoPhraseBreakingEnabled();
final DynamicLayout.Builder builder = DynamicLayout.Builder.obtain(mText, mTextPaint,
wantWidth)
.setDisplayText(mTransformed)
@@ -10699,6 +10700,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
.setBreakStrategy(mBreakStrategy)
.setHyphenationFrequency(mHyphenationFrequency)
.setJustificationMode(mJustificationMode)
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking))
.setEllipsize(getKeyListener() == null ? effectiveEllipsize : null)
.setEllipsizedWidth(ellipsisWidth);
result = builder.build();
@@ -10743,9 +10746,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
if (result == null) {
final boolean autoPhraseBreaking =
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
final boolean autoPhraseBreaking = isAutoPhraseBreakingEnabled();
StaticLayout.Builder builder = StaticLayout.Builder.obtain(mTransformed,
0, mTransformed.length(), mTextPaint, wantWidth)
.setAlignment(alignment)
@@ -10768,6 +10769,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return result;
}
private boolean isAutoPhraseBreakingEnabled() {
return !mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
}
@UnsupportedAppUsage
private boolean compressText(float width) {
if (isHardwareAccelerated()) return false;