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

Commit 02193458 authored by Allen Su's avatar Allen Su Committed by Android (Google) Code Review
Browse files

Merge "Remove TextWrapping automation"

parents b3082f3c b6be458e
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