Remove TextWrapping automation
Revert ag/17152649 Enabling text wrapping by default will be done in material theme. The automation here is created for experiment and can be removed. Bug: 286957995 Test: atest StaticLayoutTest Change-Id: I35bdfee6cf69b1b519b5f3d06d3cd6d41c324684
This commit is contained in:
@@ -25,7 +25,6 @@ import android.graphics.Paint;
|
|||||||
import android.graphics.text.LineBreakConfig;
|
import android.graphics.text.LineBreakConfig;
|
||||||
import android.graphics.text.LineBreaker;
|
import android.graphics.text.LineBreaker;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.SystemProperties;
|
|
||||||
import android.text.style.LeadingMarginSpan;
|
import android.text.style.LeadingMarginSpan;
|
||||||
import android.text.style.LeadingMarginSpan.LeadingMarginSpan2;
|
import android.text.style.LeadingMarginSpan.LeadingMarginSpan2;
|
||||||
import android.text.style.LineHeightSpan;
|
import android.text.style.LineHeightSpan;
|
||||||
@@ -33,7 +32,6 @@ import android.text.style.TabStopSpan;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pools.SynchronizedPool;
|
import android.util.Pools.SynchronizedPool;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
|
||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
import com.android.internal.util.GrowingArrayUtils;
|
import com.android.internal.util.GrowingArrayUtils;
|
||||||
|
|
||||||
@@ -75,13 +73,6 @@ public class StaticLayout extends Layout {
|
|||||||
* default values.
|
* default values.
|
||||||
*/
|
*/
|
||||||
public final static class Builder {
|
public final static class Builder {
|
||||||
// The content length threshold to enable LINE_BREAK_WORD_STYLE_PHRASE.
|
|
||||||
private static final int DEFAULT_LINECOUNT_THRESHOLD_FOR_PHRASE = 3;
|
|
||||||
|
|
||||||
// The property of content length threshold to enable LINE_BREAK_WORD_STYLE_PHRASE.
|
|
||||||
private static final String PROPERTY_LINECOUNT_THRESHOLD_FOR_PHRASE =
|
|
||||||
"android.phrase.linecount.threshold";
|
|
||||||
|
|
||||||
private Builder() {}
|
private Builder() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -440,55 +431,11 @@ public class StaticLayout extends Layout {
|
|||||||
*/
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
public StaticLayout build() {
|
public StaticLayout build() {
|
||||||
reviseLineBreakConfig();
|
|
||||||
StaticLayout result = new StaticLayout(this);
|
StaticLayout result = new StaticLayout(this);
|
||||||
Builder.recycle(this);
|
Builder.recycle(this);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reviseLineBreakConfig() {
|
|
||||||
boolean autoPhraseBreaking = mLineBreakConfig.getAutoPhraseBreaking();
|
|
||||||
int wordStyle = LineBreakConfig.getResolvedLineBreakWordStyle(mLineBreakConfig);
|
|
||||||
if (autoPhraseBreaking) {
|
|
||||||
if (wordStyle != LineBreakConfig.LINE_BREAK_WORD_STYLE_PHRASE) {
|
|
||||||
if (shouldEnablePhraseBreaking()) {
|
|
||||||
mLineBreakConfig = LineBreakConfig.getLineBreakConfig(
|
|
||||||
mLineBreakConfig.getLineBreakStyle(),
|
|
||||||
LineBreakConfig.LINE_BREAK_WORD_STYLE_PHRASE,
|
|
||||||
mLineBreakConfig.getAutoPhraseBreaking());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean shouldEnablePhraseBreaking() {
|
|
||||||
if (TextUtils.isEmpty(mText) || mWidth <= 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int lineLimit = SystemProperties.getInt(
|
|
||||||
PROPERTY_LINECOUNT_THRESHOLD_FOR_PHRASE,
|
|
||||||
DEFAULT_LINECOUNT_THRESHOLD_FOR_PHRASE);
|
|
||||||
double desiredWidth = (double) Layout.getDesiredWidth(mText, mStart,
|
|
||||||
mEnd, mPaint, mTextDir);
|
|
||||||
int lineCount = (int) Math.ceil(desiredWidth / mWidth);
|
|
||||||
if (lineCount > 0 && lineCount <= lineLimit) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the line break word style.
|
|
||||||
*
|
|
||||||
* @return The current line break word style.
|
|
||||||
*
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
@VisibleForTesting
|
|
||||||
public int getLineBreakWordStyle() {
|
|
||||||
return mLineBreakConfig.getLineBreakWordStyle();
|
|
||||||
}
|
|
||||||
|
|
||||||
private CharSequence mText;
|
private CharSequence mText;
|
||||||
private int mStart;
|
private int mStart;
|
||||||
private int mEnd;
|
private int mEnd;
|
||||||
|
|||||||
@@ -86,9 +86,6 @@ public class FeatureFlagUtils {
|
|||||||
public static final String SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST =
|
public static final String SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST =
|
||||||
"settings_need_connected_ble_device_for_broadcast";
|
"settings_need_connected_ble_device_for_broadcast";
|
||||||
|
|
||||||
/** @hide */
|
|
||||||
public static final String SETTINGS_AUTO_TEXT_WRAPPING = "settings_auto_text_wrapping";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable new language and keyboard settings UI
|
* Enable new language and keyboard settings UI
|
||||||
* @hide
|
* @hide
|
||||||
@@ -225,7 +222,6 @@ public class FeatureFlagUtils {
|
|||||||
DEFAULT_FLAGS.put(SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS, "true");
|
DEFAULT_FLAGS.put(SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS, "true");
|
||||||
DEFAULT_FLAGS.put(SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME, "true");
|
DEFAULT_FLAGS.put(SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME, "true");
|
||||||
DEFAULT_FLAGS.put(SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, "true");
|
DEFAULT_FLAGS.put(SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, "true");
|
||||||
DEFAULT_FLAGS.put(SETTINGS_AUTO_TEXT_WRAPPING, "false");
|
|
||||||
DEFAULT_FLAGS.put(SETTINGS_NEW_KEYBOARD_UI, "true");
|
DEFAULT_FLAGS.put(SETTINGS_NEW_KEYBOARD_UI, "true");
|
||||||
DEFAULT_FLAGS.put(SETTINGS_NEW_KEYBOARD_MODIFIER_KEY, "true");
|
DEFAULT_FLAGS.put(SETTINGS_NEW_KEYBOARD_MODIFIER_KEY, "true");
|
||||||
DEFAULT_FLAGS.put(SETTINGS_NEW_KEYBOARD_TRACKPAD, "true");
|
DEFAULT_FLAGS.put(SETTINGS_NEW_KEYBOARD_TRACKPAD, "true");
|
||||||
@@ -253,7 +249,6 @@ public class FeatureFlagUtils {
|
|||||||
PERSISTENT_FLAGS.add(SETTINGS_SUPPORT_LARGE_SCREEN);
|
PERSISTENT_FLAGS.add(SETTINGS_SUPPORT_LARGE_SCREEN);
|
||||||
PERSISTENT_FLAGS.add(SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS);
|
PERSISTENT_FLAGS.add(SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS);
|
||||||
PERSISTENT_FLAGS.add(SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME);
|
PERSISTENT_FLAGS.add(SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME);
|
||||||
PERSISTENT_FLAGS.add(SETTINGS_AUTO_TEXT_WRAPPING);
|
|
||||||
PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_UI);
|
PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_UI);
|
||||||
PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_MODIFIER_KEY);
|
PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_MODIFIER_KEY);
|
||||||
PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_TRACKPAD);
|
PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_TRACKPAD);
|
||||||
|
|||||||
@@ -156,7 +156,6 @@ import android.text.util.Linkify;
|
|||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.FeatureFlagUtils;
|
|
||||||
import android.util.IntArray;
|
import android.util.IntArray;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseIntArray;
|
import android.util.SparseIntArray;
|
||||||
@@ -831,11 +830,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
private int mLineBreakStyle = DEFAULT_LINE_BREAK_STYLE;
|
private int mLineBreakStyle = DEFAULT_LINE_BREAK_STYLE;
|
||||||
private int mLineBreakWordStyle = DEFAULT_LINE_BREAK_WORD_STYLE;
|
private int mLineBreakWordStyle = DEFAULT_LINE_BREAK_WORD_STYLE;
|
||||||
|
|
||||||
// The auto option for LINE_BREAK_WORD_STYLE_PHRASE may not be applied in recycled view due to
|
|
||||||
// one-way flag flipping. This is a tentative limitation during experiment and will not have the
|
|
||||||
// issue once this is finalized to LINE_BREAK_WORD_STYLE_PHRASE_AUTO option.
|
|
||||||
private boolean mUserSpeficiedLineBreakwordStyle = false;
|
|
||||||
|
|
||||||
// This is used to reflect the current user preference for changing font weight and making text
|
// This is used to reflect the current user preference for changing font weight and making text
|
||||||
// more bold.
|
// more bold.
|
||||||
private int mFontWeightAdjustment;
|
private int mFontWeightAdjustment;
|
||||||
@@ -1546,9 +1540,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case com.android.internal.R.styleable.TextView_lineBreakWordStyle:
|
case com.android.internal.R.styleable.TextView_lineBreakWordStyle:
|
||||||
if (a.hasValue(attr)) {
|
|
||||||
mUserSpeficiedLineBreakwordStyle = true;
|
|
||||||
}
|
|
||||||
mLineBreakWordStyle = a.getInt(attr,
|
mLineBreakWordStyle = a.getInt(attr,
|
||||||
LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE);
|
LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE);
|
||||||
break;
|
break;
|
||||||
@@ -4350,7 +4341,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
break;
|
break;
|
||||||
case com.android.internal.R.styleable.TextAppearance_lineBreakWordStyle:
|
case com.android.internal.R.styleable.TextAppearance_lineBreakWordStyle:
|
||||||
attributes.mHasLineBreakWordStyle = true;
|
attributes.mHasLineBreakWordStyle = true;
|
||||||
mUserSpeficiedLineBreakwordStyle = true;
|
|
||||||
attributes.mLineBreakWordStyle =
|
attributes.mLineBreakWordStyle =
|
||||||
appearance.getInt(attr, attributes.mLineBreakWordStyle);
|
appearance.getInt(attr, attributes.mLineBreakWordStyle);
|
||||||
break;
|
break;
|
||||||
@@ -5086,7 +5076,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
* @param lineBreakWordStyle The line-break word style for the text.
|
* @param lineBreakWordStyle The line-break word style for the text.
|
||||||
*/
|
*/
|
||||||
public void setLineBreakWordStyle(@LineBreakConfig.LineBreakWordStyle int lineBreakWordStyle) {
|
public void setLineBreakWordStyle(@LineBreakConfig.LineBreakWordStyle int lineBreakWordStyle) {
|
||||||
mUserSpeficiedLineBreakwordStyle = true;
|
|
||||||
if (mLineBreakWordStyle != lineBreakWordStyle) {
|
if (mLineBreakWordStyle != lineBreakWordStyle) {
|
||||||
mLineBreakWordStyle = lineBreakWordStyle;
|
mLineBreakWordStyle = lineBreakWordStyle;
|
||||||
if (mLayout != null) {
|
if (mLayout != null) {
|
||||||
@@ -5122,12 +5111,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
* @see PrecomputedText
|
* @see PrecomputedText
|
||||||
*/
|
*/
|
||||||
public @NonNull PrecomputedText.Params getTextMetricsParams() {
|
public @NonNull PrecomputedText.Params getTextMetricsParams() {
|
||||||
final boolean autoPhraseBreaking =
|
|
||||||
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
|
||||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
|
||||||
return new PrecomputedText.Params(new TextPaint(mTextPaint),
|
return new PrecomputedText.Params(new TextPaint(mTextPaint),
|
||||||
LineBreakConfig.getLineBreakConfig(mLineBreakStyle, mLineBreakWordStyle,
|
LineBreakConfig.getLineBreakConfig(mLineBreakStyle, mLineBreakWordStyle),
|
||||||
autoPhraseBreaking),
|
|
||||||
getTextDirectionHeuristic(),
|
getTextDirectionHeuristic(),
|
||||||
mBreakStrategy, mHyphenationFrequency);
|
mBreakStrategy, mHyphenationFrequency);
|
||||||
}
|
}
|
||||||
@@ -5147,7 +5132,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
LineBreakConfig lineBreakConfig = params.getLineBreakConfig();
|
LineBreakConfig lineBreakConfig = params.getLineBreakConfig();
|
||||||
mLineBreakStyle = LineBreakConfig.getResolvedLineBreakStyle(lineBreakConfig);
|
mLineBreakStyle = LineBreakConfig.getResolvedLineBreakStyle(lineBreakConfig);
|
||||||
mLineBreakWordStyle = LineBreakConfig.getResolvedLineBreakWordStyle(lineBreakConfig);
|
mLineBreakWordStyle = LineBreakConfig.getResolvedLineBreakWordStyle(lineBreakConfig);
|
||||||
mUserSpeficiedLineBreakwordStyle = true;
|
|
||||||
if (mLayout != null) {
|
if (mLayout != null) {
|
||||||
nullLayouts();
|
nullLayouts();
|
||||||
requestLayout();
|
requestLayout();
|
||||||
@@ -7077,13 +7061,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
if (mTextDir == null) {
|
if (mTextDir == null) {
|
||||||
mTextDir = getTextDirectionHeuristic();
|
mTextDir = getTextDirectionHeuristic();
|
||||||
}
|
}
|
||||||
final boolean autoPhraseBreaking =
|
|
||||||
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
|
||||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
|
||||||
final @PrecomputedText.Params.CheckResultUsableResult int checkResult =
|
final @PrecomputedText.Params.CheckResultUsableResult int checkResult =
|
||||||
precomputed.getParams().checkResultUsable(getPaint(), mTextDir, mBreakStrategy,
|
precomputed.getParams().checkResultUsable(getPaint(), mTextDir, mBreakStrategy,
|
||||||
mHyphenationFrequency, LineBreakConfig.getLineBreakConfig(
|
mHyphenationFrequency, LineBreakConfig.getLineBreakConfig(
|
||||||
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking));
|
mLineBreakStyle, mLineBreakWordStyle));
|
||||||
switch (checkResult) {
|
switch (checkResult) {
|
||||||
case PrecomputedText.Params.UNUSABLE:
|
case PrecomputedText.Params.UNUSABLE:
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
@@ -10640,9 +10621,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
}
|
}
|
||||||
// TODO: code duplication with makeSingleLayout()
|
// TODO: code duplication with makeSingleLayout()
|
||||||
if (mHintLayout == null) {
|
if (mHintLayout == null) {
|
||||||
final boolean autoPhraseBreaking =
|
|
||||||
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
|
||||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
|
||||||
StaticLayout.Builder builder = StaticLayout.Builder.obtain(mHint, 0,
|
StaticLayout.Builder builder = StaticLayout.Builder.obtain(mHint, 0,
|
||||||
mHint.length(), mTextPaint, hintWidth)
|
mHint.length(), mTextPaint, hintWidth)
|
||||||
.setAlignment(alignment)
|
.setAlignment(alignment)
|
||||||
@@ -10655,7 +10633,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
.setJustificationMode(mJustificationMode)
|
.setJustificationMode(mJustificationMode)
|
||||||
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
|
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
|
||||||
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
||||||
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking));
|
mLineBreakStyle, mLineBreakWordStyle));
|
||||||
if (shouldEllipsize) {
|
if (shouldEllipsize) {
|
||||||
builder.setEllipsize(mEllipsize)
|
builder.setEllipsize(mEllipsize)
|
||||||
.setEllipsizedWidth(ellipsisWidth);
|
.setEllipsizedWidth(ellipsisWidth);
|
||||||
@@ -10704,7 +10682,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
boolean useSaved) {
|
boolean useSaved) {
|
||||||
Layout result = null;
|
Layout result = null;
|
||||||
if (useDynamicLayout()) {
|
if (useDynamicLayout()) {
|
||||||
final boolean autoPhraseBreaking = isAutoPhraseBreakingEnabled();
|
|
||||||
final DynamicLayout.Builder builder = DynamicLayout.Builder.obtain(mText, mTextPaint,
|
final DynamicLayout.Builder builder = DynamicLayout.Builder.obtain(mText, mTextPaint,
|
||||||
wantWidth)
|
wantWidth)
|
||||||
.setDisplayText(mTransformed)
|
.setDisplayText(mTransformed)
|
||||||
@@ -10717,7 +10694,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
.setHyphenationFrequency(mHyphenationFrequency)
|
.setHyphenationFrequency(mHyphenationFrequency)
|
||||||
.setJustificationMode(mJustificationMode)
|
.setJustificationMode(mJustificationMode)
|
||||||
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
||||||
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking))
|
mLineBreakStyle, mLineBreakWordStyle))
|
||||||
.setEllipsize(getKeyListener() == null ? effectiveEllipsize : null)
|
.setEllipsize(getKeyListener() == null ? effectiveEllipsize : null)
|
||||||
.setEllipsizedWidth(ellipsisWidth);
|
.setEllipsizedWidth(ellipsisWidth);
|
||||||
result = builder.build();
|
result = builder.build();
|
||||||
@@ -10762,7 +10739,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
final boolean autoPhraseBreaking = isAutoPhraseBreakingEnabled();
|
|
||||||
StaticLayout.Builder builder = StaticLayout.Builder.obtain(mTransformed,
|
StaticLayout.Builder builder = StaticLayout.Builder.obtain(mTransformed,
|
||||||
0, mTransformed.length(), mTextPaint, wantWidth)
|
0, mTransformed.length(), mTextPaint, wantWidth)
|
||||||
.setAlignment(alignment)
|
.setAlignment(alignment)
|
||||||
@@ -10775,7 +10751,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
.setJustificationMode(mJustificationMode)
|
.setJustificationMode(mJustificationMode)
|
||||||
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
|
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
|
||||||
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
||||||
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking));
|
mLineBreakStyle, mLineBreakWordStyle));
|
||||||
if (shouldEllipsize) {
|
if (shouldEllipsize) {
|
||||||
builder.setEllipsize(effectiveEllipsize)
|
builder.setEllipsize(effectiveEllipsize)
|
||||||
.setEllipsizedWidth(ellipsisWidth);
|
.setEllipsizedWidth(ellipsisWidth);
|
||||||
@@ -10785,11 +10761,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isAutoPhraseBreakingEnabled() {
|
|
||||||
return !mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
|
||||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
|
||||||
}
|
|
||||||
|
|
||||||
@UnsupportedAppUsage
|
@UnsupportedAppUsage
|
||||||
private boolean compressText(float width) {
|
private boolean compressText(float width) {
|
||||||
if (isHardwareAccelerated()) return false;
|
if (isHardwareAccelerated()) return false;
|
||||||
@@ -11138,9 +11109,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
|
|
||||||
final StaticLayout.Builder layoutBuilder = StaticLayout.Builder.obtain(
|
final StaticLayout.Builder layoutBuilder = StaticLayout.Builder.obtain(
|
||||||
text, 0, text.length(), mTempTextPaint, Math.round(availableSpace.right));
|
text, 0, text.length(), mTempTextPaint, Math.round(availableSpace.right));
|
||||||
final boolean autoPhraseBreaking =
|
|
||||||
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
|
||||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
|
||||||
layoutBuilder.setAlignment(getLayoutAlignment())
|
layoutBuilder.setAlignment(getLayoutAlignment())
|
||||||
.setLineSpacing(getLineSpacingExtra(), getLineSpacingMultiplier())
|
.setLineSpacing(getLineSpacingExtra(), getLineSpacingMultiplier())
|
||||||
.setIncludePad(getIncludeFontPadding())
|
.setIncludePad(getIncludeFontPadding())
|
||||||
@@ -11151,7 +11119,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
|
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
|
||||||
.setTextDirection(getTextDirectionHeuristic())
|
.setTextDirection(getTextDirectionHeuristic())
|
||||||
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
||||||
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking));
|
mLineBreakStyle, mLineBreakWordStyle));
|
||||||
|
|
||||||
final StaticLayout layout = layoutBuilder.build();
|
final StaticLayout layout = layoutBuilder.build();
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.Paint.FontMetricsInt;
|
import android.graphics.Paint.FontMetricsInt;
|
||||||
import android.graphics.text.LineBreakConfig;
|
|
||||||
import android.os.LocaleList;
|
import android.os.LocaleList;
|
||||||
import android.platform.test.annotations.Presubmit;
|
import android.platform.test.annotations.Presubmit;
|
||||||
import android.text.Layout.Alignment;
|
import android.text.Layout.Alignment;
|
||||||
@@ -926,24 +925,4 @@ public class StaticLayoutTest {
|
|||||||
assertEquals(0, layout.getHeight(true));
|
assertEquals(0, layout.getHeight(true));
|
||||||
assertEquals(2, layout.getLineCount());
|
assertEquals(2, layout.getLineCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testBuilder_autoPhraseBreaking() {
|
|
||||||
{
|
|
||||||
// setAutoPhraseBreaking true
|
|
||||||
LineBreakConfig lineBreakConfig = new LineBreakConfig.Builder()
|
|
||||||
.setLineBreakWordStyle(LineBreakConfig.LINE_BREAK_STYLE_NONE)
|
|
||||||
.setLineBreakWordStyle(LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE)
|
|
||||||
.setAutoPhraseBreaking(true)
|
|
||||||
.build();
|
|
||||||
final String text = "これが正解。";
|
|
||||||
// Obtain.
|
|
||||||
StaticLayout.Builder builder = StaticLayout.Builder.obtain(text, 0,
|
|
||||||
text.length(), mDefaultPaint, DEFAULT_OUTER_WIDTH);
|
|
||||||
builder.setLineBreakConfig(lineBreakConfig);
|
|
||||||
builder.build();
|
|
||||||
assertEquals(LineBreakConfig.LINE_BREAK_WORD_STYLE_PHRASE,
|
|
||||||
builder.getLineBreakWordStyle());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -147,11 +147,6 @@ public final class LineBreakConfig {
|
|||||||
private @LineBreakWordStyle int mLineBreakWordStyle =
|
private @LineBreakWordStyle int mLineBreakWordStyle =
|
||||||
LineBreakConfig.LINE_BREAK_WORD_STYLE_UNSPECIFIED;
|
LineBreakConfig.LINE_BREAK_WORD_STYLE_UNSPECIFIED;
|
||||||
|
|
||||||
// Whether or not enabling phrase breaking automatically.
|
|
||||||
// TODO(b/226012260): Remove this and add LINE_BREAK_WORD_STYLE_PHRASE_AUTO after
|
|
||||||
// the experiment.
|
|
||||||
private boolean mAutoPhraseBreaking = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builder constructor.
|
* Builder constructor.
|
||||||
*/
|
*/
|
||||||
@@ -243,16 +238,6 @@ public final class LineBreakConfig {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables or disables the automation of {@link #LINE_BREAK_WORD_STYLE_PHRASE}.
|
|
||||||
*
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
public @NonNull Builder setAutoPhraseBreaking(boolean autoPhraseBreaking) {
|
|
||||||
mAutoPhraseBreaking = autoPhraseBreaking;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds a {@link LineBreakConfig} instance.
|
* Builds a {@link LineBreakConfig} instance.
|
||||||
*
|
*
|
||||||
@@ -262,7 +247,7 @@ public final class LineBreakConfig {
|
|||||||
* @return The {@code LineBreakConfig} instance.
|
* @return The {@code LineBreakConfig} instance.
|
||||||
*/
|
*/
|
||||||
public @NonNull LineBreakConfig build() {
|
public @NonNull LineBreakConfig build() {
|
||||||
return new LineBreakConfig(mLineBreakStyle, mLineBreakWordStyle, mAutoPhraseBreaking);
|
return new LineBreakConfig(mLineBreakStyle, mLineBreakWordStyle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,23 +268,6 @@ public final class LineBreakConfig {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create the LineBreakConfig instance.
|
|
||||||
*
|
|
||||||
* @param lineBreakStyle the line break style for text wrapping.
|
|
||||||
* @param lineBreakWordStyle the line break word style for text wrapping.
|
|
||||||
* @return the {@link LineBreakConfig} instance. *
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
public static @NonNull LineBreakConfig getLineBreakConfig(@LineBreakStyle int lineBreakStyle,
|
|
||||||
@LineBreakWordStyle int lineBreakWordStyle, boolean autoPhraseBreaking) {
|
|
||||||
LineBreakConfig.Builder builder = new LineBreakConfig.Builder();
|
|
||||||
return builder.setLineBreakStyle(lineBreakStyle)
|
|
||||||
.setLineBreakWordStyle(lineBreakWordStyle)
|
|
||||||
.setAutoPhraseBreaking(autoPhraseBreaking)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
public static final LineBreakConfig NONE =
|
public static final LineBreakConfig NONE =
|
||||||
new Builder().setLineBreakStyle(LINE_BREAK_STYLE_NONE)
|
new Builder().setLineBreakStyle(LINE_BREAK_STYLE_NONE)
|
||||||
@@ -307,7 +275,6 @@ public final class LineBreakConfig {
|
|||||||
|
|
||||||
private final @LineBreakStyle int mLineBreakStyle;
|
private final @LineBreakStyle int mLineBreakStyle;
|
||||||
private final @LineBreakWordStyle int mLineBreakWordStyle;
|
private final @LineBreakWordStyle int mLineBreakWordStyle;
|
||||||
private final boolean mAutoPhraseBreaking;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor with line-break parameters.
|
* Constructor with line-break parameters.
|
||||||
@@ -316,10 +283,9 @@ public final class LineBreakConfig {
|
|||||||
* {@code LineBreakConfig} instance.
|
* {@code LineBreakConfig} instance.
|
||||||
*/
|
*/
|
||||||
private LineBreakConfig(@LineBreakStyle int lineBreakStyle,
|
private LineBreakConfig(@LineBreakStyle int lineBreakStyle,
|
||||||
@LineBreakWordStyle int lineBreakWordStyle, boolean autoPhraseBreaking) {
|
@LineBreakWordStyle int lineBreakWordStyle) {
|
||||||
mLineBreakStyle = lineBreakStyle;
|
mLineBreakStyle = lineBreakStyle;
|
||||||
mLineBreakWordStyle = lineBreakWordStyle;
|
mLineBreakWordStyle = lineBreakWordStyle;
|
||||||
mAutoPhraseBreaking = autoPhraseBreaking;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -400,20 +366,7 @@ public final class LineBreakConfig {
|
|||||||
config.mLineBreakStyle == LINE_BREAK_STYLE_UNSPECIFIED
|
config.mLineBreakStyle == LINE_BREAK_STYLE_UNSPECIFIED
|
||||||
? mLineBreakStyle : config.mLineBreakStyle,
|
? mLineBreakStyle : config.mLineBreakStyle,
|
||||||
config.mLineBreakWordStyle == LINE_BREAK_WORD_STYLE_UNSPECIFIED
|
config.mLineBreakWordStyle == LINE_BREAK_WORD_STYLE_UNSPECIFIED
|
||||||
? mLineBreakWordStyle : config.mLineBreakWordStyle,
|
? mLineBreakWordStyle : config.mLineBreakWordStyle);
|
||||||
config.mAutoPhraseBreaking
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to identify if the automation of {@link #LINE_BREAK_WORD_STYLE_PHRASE} is enabled.
|
|
||||||
*
|
|
||||||
* @return The result that records whether or not the automation of
|
|
||||||
* {@link #LINE_BREAK_WORD_STYLE_PHRASE} is enabled.
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
public boolean getAutoPhraseBreaking() {
|
|
||||||
return mAutoPhraseBreaking;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -423,8 +376,7 @@ public final class LineBreakConfig {
|
|||||||
if (!(o instanceof LineBreakConfig)) return false;
|
if (!(o instanceof LineBreakConfig)) return false;
|
||||||
LineBreakConfig that = (LineBreakConfig) o;
|
LineBreakConfig that = (LineBreakConfig) o;
|
||||||
return (mLineBreakStyle == that.mLineBreakStyle)
|
return (mLineBreakStyle == that.mLineBreakStyle)
|
||||||
&& (mLineBreakWordStyle == that.mLineBreakWordStyle)
|
&& (mLineBreakWordStyle == that.mLineBreakWordStyle);
|
||||||
&& (mAutoPhraseBreaking == that.mAutoPhraseBreaking);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user