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

Commit b6be458e authored by Allen Su's avatar Allen Su
Browse files

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
parent 2f9fbcfb
Loading
Loading
Loading
Loading
+0 −53
Original line number Diff line number Diff line
@@ -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 = 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 int mStart;
        private int mEnd;
+0 −5
Original line number Diff line number Diff line
@@ -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);
+6 −38
Original line number Diff line number Diff line
@@ -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.getResolvedLineBreakStyle(lineBreakConfig);
        mLineBreakWordStyle = LineBreakConfig.getResolvedLineBreakWordStyle(lineBreakConfig);
        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);
@@ -10704,7 +10682,6 @@ 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)
@@ -10717,7 +10694,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                    .setHyphenationFrequency(mHyphenationFrequency)
                    .setJustificationMode(mJustificationMode)
                    .setLineBreakConfig(LineBreakConfig.getLineBreakConfig(
                            mLineBreakStyle, mLineBreakWordStyle, autoPhraseBreaking))
                            mLineBreakStyle, mLineBreakWordStyle))
                    .setEllipsize(getKeyListener() == null ? effectiveEllipsize : null)
                    .setEllipsizedWidth(ellipsisWidth);
            result = builder.build();
@@ -10762,7 +10739,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            }
        }
        if (result == null) {
            final boolean autoPhraseBreaking = isAutoPhraseBreakingEnabled();
            StaticLayout.Builder builder = StaticLayout.Builder.obtain(mTransformed,
                    0, mTransformed.length(), mTextPaint, wantWidth)
                    .setAlignment(alignment)
@@ -10775,7 +10751,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);
@@ -10785,11 +10761,6 @@ 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;
@@ -11138,9 +11109,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())
@@ -11151,7 +11119,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();
+0 −21
Original line number Diff line number Diff line
@@ -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());
        }
    }
}
+4 −52
Original line number Diff line number Diff line
@@ -147,11 +147,6 @@ public final class LineBreakConfig {
        private @LineBreakWordStyle int mLineBreakWordStyle =
                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.
         */
@@ -243,16 +238,6 @@ 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.
         *
@@ -262,7 +247,7 @@ public final class LineBreakConfig {
         * @return The {@code LineBreakConfig} instance.
         */
        public @NonNull LineBreakConfig build() {
            return new LineBreakConfig(mLineBreakStyle, mLineBreakWordStyle, mAutoPhraseBreaking);
            return new LineBreakConfig(mLineBreakStyle, mLineBreakWordStyle);
        }
    }

@@ -283,23 +268,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)
@@ -307,7 +275,6 @@ public final class LineBreakConfig {

    private final @LineBreakStyle int mLineBreakStyle;
    private final @LineBreakWordStyle int mLineBreakWordStyle;
    private final boolean mAutoPhraseBreaking;

    /**
     * Constructor with line-break parameters.
@@ -316,10 +283,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;
    }

    /**
@@ -400,20 +366,7 @@ public final class LineBreakConfig {
                config.mLineBreakStyle == LINE_BREAK_STYLE_UNSPECIFIED
                        ? mLineBreakStyle : config.mLineBreakStyle,
                config.mLineBreakWordStyle == LINE_BREAK_WORD_STYLE_UNSPECIFIED
                        ? 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;
                        ? mLineBreakWordStyle : config.mLineBreakWordStyle);
    }

    @Override
@@ -423,8 +376,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