Remove TextWrapping automation
Revert ag/17152649 Enabling text wrapping by default will be done in material theme. The automation here can be removed. Bug: 286957995 Test: atest StaticLayoutTest Change-Id: I35bdfee6cf69b1b519b5f3d06d3cd6d41c324684 Merged-In: I35bdfee6cf69b1b519b5f3d06d3cd6d41c324684
This commit is contained in:
@@ -25,7 +25,6 @@ import android.graphics.Paint;
|
||||
import android.graphics.text.LineBreakConfig;
|
||||
import android.graphics.text.LineBreaker;
|
||||
import android.os.Build;
|
||||
import android.os.SystemProperties;
|
||||
import android.text.style.LeadingMarginSpan;
|
||||
import android.text.style.LeadingMarginSpan.LeadingMarginSpan2;
|
||||
import android.text.style.LineHeightSpan;
|
||||
@@ -33,7 +32,6 @@ import android.text.style.TabStopSpan;
|
||||
import android.util.Log;
|
||||
import android.util.Pools.SynchronizedPool;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.internal.util.GrowingArrayUtils;
|
||||
|
||||
@@ -75,13 +73,6 @@ public class StaticLayout extends Layout {
|
||||
* default values.
|
||||
*/
|
||||
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() {}
|
||||
|
||||
/**
|
||||
@@ -440,55 +431,11 @@ public class StaticLayout extends Layout {
|
||||
*/
|
||||
@NonNull
|
||||
public StaticLayout build() {
|
||||
reviseLineBreakConfig();
|
||||
StaticLayout result = new StaticLayout(this);
|
||||
Builder.recycle(this);
|
||||
return result;
|
||||
}
|
||||
|
||||
private void reviseLineBreakConfig() {
|
||||
boolean autoPhraseBreaking = mLineBreakConfig.getAutoPhraseBreaking();
|
||||
int wordStyle = mLineBreakConfig.getLineBreakWordStyle();
|
||||
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 int mStart;
|
||||
private int mEnd;
|
||||
|
||||
@@ -86,9 +86,6 @@ public class FeatureFlagUtils {
|
||||
public static final String 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
|
||||
* @hide
|
||||
@@ -225,7 +222,6 @@ public class FeatureFlagUtils {
|
||||
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_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_MODIFIER_KEY, "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_ENABLE_MONITOR_PHANTOM_PROCS);
|
||||
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_MODIFIER_KEY);
|
||||
PERSISTENT_FLAGS.add(SETTINGS_NEW_KEYBOARD_TRACKPAD);
|
||||
|
||||
@@ -156,7 +156,6 @@ import android.text.util.Linkify;
|
||||
import android.util.ArraySet;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.FeatureFlagUtils;
|
||||
import android.util.IntArray;
|
||||
import android.util.Log;
|
||||
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 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
|
||||
// more bold.
|
||||
private int mFontWeightAdjustment;
|
||||
@@ -1546,9 +1540,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
break;
|
||||
|
||||
case com.android.internal.R.styleable.TextView_lineBreakWordStyle:
|
||||
if (a.hasValue(attr)) {
|
||||
mUserSpeficiedLineBreakwordStyle = true;
|
||||
}
|
||||
mLineBreakWordStyle = a.getInt(attr,
|
||||
LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE);
|
||||
break;
|
||||
@@ -4350,7 +4341,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
break;
|
||||
case com.android.internal.R.styleable.TextAppearance_lineBreakWordStyle:
|
||||
attributes.mHasLineBreakWordStyle = true;
|
||||
mUserSpeficiedLineBreakwordStyle = true;
|
||||
attributes.mLineBreakWordStyle =
|
||||
appearance.getInt(attr, attributes.mLineBreakWordStyle);
|
||||
break;
|
||||
@@ -5086,7 +5076,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
* @param lineBreakWordStyle The line-break word style for the text.
|
||||
*/
|
||||
public void setLineBreakWordStyle(@LineBreakConfig.LineBreakWordStyle int lineBreakWordStyle) {
|
||||
mUserSpeficiedLineBreakwordStyle = true;
|
||||
if (mLineBreakWordStyle != lineBreakWordStyle) {
|
||||
mLineBreakWordStyle = lineBreakWordStyle;
|
||||
if (mLayout != null) {
|
||||
@@ -5122,12 +5111,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
* @see PrecomputedText
|
||||
*/
|
||||
public @NonNull PrecomputedText.Params getTextMetricsParams() {
|
||||
final boolean autoPhraseBreaking =
|
||||
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
||||
return new PrecomputedText.Params(new TextPaint(mTextPaint),
|
||||
LineBreakConfig.getLineBreakConfig(mLineBreakStyle, mLineBreakWordStyle,
|
||||
autoPhraseBreaking),
|
||||
LineBreakConfig.getLineBreakConfig(mLineBreakStyle, mLineBreakWordStyle),
|
||||
getTextDirectionHeuristic(),
|
||||
mBreakStrategy, mHyphenationFrequency);
|
||||
}
|
||||
@@ -5147,7 +5132,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
LineBreakConfig lineBreakConfig = params.getLineBreakConfig();
|
||||
mLineBreakStyle = lineBreakConfig.getLineBreakStyle();
|
||||
mLineBreakWordStyle = lineBreakConfig.getLineBreakWordStyle();
|
||||
mUserSpeficiedLineBreakwordStyle = true;
|
||||
if (mLayout != null) {
|
||||
nullLayouts();
|
||||
requestLayout();
|
||||
@@ -7077,13 +7061,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
if (mTextDir == null) {
|
||||
mTextDir = getTextDirectionHeuristic();
|
||||
}
|
||||
final boolean autoPhraseBreaking =
|
||||
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
||||
final @PrecomputedText.Params.CheckResultUsableResult int checkResult =
|
||||
precomputed.getParams().checkResultUsable(getPaint(), mTextDir, mBreakStrategy,
|
||||
mHyphenationFrequency, LineBreakConfig.getLineBreakConfig(
|
||||
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking));
|
||||
mLineBreakStyle, mLineBreakWordStyle));
|
||||
switch (checkResult) {
|
||||
case PrecomputedText.Params.UNUSABLE:
|
||||
throw new IllegalArgumentException(
|
||||
@@ -10640,9 +10621,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
}
|
||||
// TODO: code duplication with makeSingleLayout()
|
||||
if (mHintLayout == null) {
|
||||
final boolean autoPhraseBreaking =
|
||||
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
||||
StaticLayout.Builder builder = StaticLayout.Builder.obtain(mHint, 0,
|
||||
mHint.length(), mTextPaint, hintWidth)
|
||||
.setAlignment(alignment)
|
||||
@@ -10655,7 +10633,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
.setJustificationMode(mJustificationMode)
|
||||
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
|
||||
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
||||
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking));
|
||||
mLineBreakStyle, mLineBreakWordStyle));
|
||||
if (shouldEllipsize) {
|
||||
builder.setEllipsize(mEllipsize)
|
||||
.setEllipsizedWidth(ellipsisWidth);
|
||||
@@ -10759,9 +10737,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
}
|
||||
}
|
||||
if (result == null) {
|
||||
final boolean autoPhraseBreaking =
|
||||
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
||||
StaticLayout.Builder builder = StaticLayout.Builder.obtain(mTransformed,
|
||||
0, mTransformed.length(), mTextPaint, wantWidth)
|
||||
.setAlignment(alignment)
|
||||
@@ -10774,7 +10749,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
.setJustificationMode(mJustificationMode)
|
||||
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
|
||||
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
||||
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking));
|
||||
mLineBreakStyle, mLineBreakWordStyle));
|
||||
if (shouldEllipsize) {
|
||||
builder.setEllipsize(effectiveEllipsize)
|
||||
.setEllipsizedWidth(ellipsisWidth);
|
||||
@@ -11132,9 +11107,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
|
||||
final StaticLayout.Builder layoutBuilder = StaticLayout.Builder.obtain(
|
||||
text, 0, text.length(), mTempTextPaint, Math.round(availableSpace.right));
|
||||
final boolean autoPhraseBreaking =
|
||||
!mUserSpeficiedLineBreakwordStyle && FeatureFlagUtils.isEnabled(mContext,
|
||||
FeatureFlagUtils.SETTINGS_AUTO_TEXT_WRAPPING);
|
||||
layoutBuilder.setAlignment(getLayoutAlignment())
|
||||
.setLineSpacing(getLineSpacingExtra(), getLineSpacingMultiplier())
|
||||
.setIncludePad(getIncludeFontPadding())
|
||||
@@ -11145,7 +11117,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
.setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE)
|
||||
.setTextDirection(getTextDirectionHeuristic())
|
||||
.setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
|
||||
mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking));
|
||||
mLineBreakStyle, mLineBreakWordStyle));
|
||||
|
||||
final StaticLayout layout = layoutBuilder.build();
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ import static org.junit.Assert.assertTrue;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Paint.FontMetricsInt;
|
||||
import android.graphics.text.LineBreakConfig;
|
||||
import android.os.LocaleList;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.text.Layout.Alignment;
|
||||
@@ -926,24 +925,4 @@ public class StaticLayoutTest {
|
||||
assertEquals(0, layout.getHeight(true));
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,11 +94,6 @@ public final class LineBreakConfig {
|
||||
private @LineBreakWordStyle int mLineBreakWordStyle =
|
||||
LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE;
|
||||
|
||||
// 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.
|
||||
*/
|
||||
@@ -127,23 +122,13 @@ public final class LineBreakConfig {
|
||||
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.
|
||||
*
|
||||
* @return The {@code LineBreakConfig} instance.
|
||||
*/
|
||||
public @NonNull LineBreakConfig build() {
|
||||
return new LineBreakConfig(mLineBreakStyle, mLineBreakWordStyle, mAutoPhraseBreaking);
|
||||
return new LineBreakConfig(mLineBreakStyle, mLineBreakWordStyle);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,23 +149,6 @@ public final class LineBreakConfig {
|
||||
.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 */
|
||||
public static final LineBreakConfig NONE =
|
||||
new Builder().setLineBreakStyle(LINE_BREAK_STYLE_NONE)
|
||||
@@ -188,7 +156,6 @@ public final class LineBreakConfig {
|
||||
|
||||
private final @LineBreakStyle int mLineBreakStyle;
|
||||
private final @LineBreakWordStyle int mLineBreakWordStyle;
|
||||
private final boolean mAutoPhraseBreaking;
|
||||
|
||||
/**
|
||||
* Constructor with line-break parameters.
|
||||
@@ -197,10 +164,9 @@ public final class LineBreakConfig {
|
||||
* {@code LineBreakConfig} instance.
|
||||
*/
|
||||
private LineBreakConfig(@LineBreakStyle int lineBreakStyle,
|
||||
@LineBreakWordStyle int lineBreakWordStyle, boolean autoPhraseBreaking) {
|
||||
@LineBreakWordStyle int lineBreakWordStyle) {
|
||||
mLineBreakStyle = lineBreakStyle;
|
||||
mLineBreakWordStyle = lineBreakWordStyle;
|
||||
mAutoPhraseBreaking = autoPhraseBreaking;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -221,17 +187,6 @@ public final class LineBreakConfig {
|
||||
return mLineBreakWordStyle;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
public boolean equals(Object o) {
|
||||
if (o == null) return false;
|
||||
@@ -239,8 +194,7 @@ public final class LineBreakConfig {
|
||||
if (!(o instanceof LineBreakConfig)) return false;
|
||||
LineBreakConfig that = (LineBreakConfig) o;
|
||||
return (mLineBreakStyle == that.mLineBreakStyle)
|
||||
&& (mLineBreakWordStyle == that.mLineBreakWordStyle)
|
||||
&& (mAutoPhraseBreaking == that.mAutoPhraseBreaking);
|
||||
&& (mLineBreakWordStyle == that.mLineBreakWordStyle);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user