diff options
Diffstat (limited to 'core/java/android/widget/TextView.java')
| -rw-r--r-- | core/java/android/widget/TextView.java | 81 |
1 files changed, 67 insertions, 14 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 014340197393..7327214c5389 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -48,6 +48,9 @@ import android.annotation.XmlRes; import android.app.Activity; import android.app.PendingIntent; import android.app.assist.AssistStructure; +import android.app.compat.CompatChanges; +import android.compat.annotation.ChangeId; +import android.compat.annotation.EnabledSince; import android.compat.annotation.UnsupportedAppUsage; import android.content.ClipData; import android.content.ClipDescription; @@ -453,6 +456,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private static final int FLOATING_TOOLBAR_SELECT_ALL_REFRESH_DELAY = 500; + /** + * This change ID enables the fallback text line spacing (line height) for BoringLayout. + * @hide + */ + @ChangeId + @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU) + public static final long BORINGLAYOUT_FALLBACK_LINESPACING = 210923482L; // buganizer id + + /** + * This change ID enables the fallback text line spacing (line height) for StaticLayout. + * @hide + */ + @ChangeId + @EnabledSince(targetSdkVersion = Build.VERSION_CODES.P) + public static final long STATICLAYOUT_FALLBACK_LINESPACING = 37756858; // buganizer id + // System wide time for last cut, copy or text changed action. static long sLastCutCopyOrTextChangedTime; @@ -766,8 +785,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private boolean mListenerChanged = false; // True if internationalized input should be used for numbers and date and time. private final boolean mUseInternationalizedInput; - // True if fallback fonts that end up getting used should be allowed to affect line spacing. - /* package */ boolean mUseFallbackLineSpacing; + + // Fallback fonts that end up getting used should be allowed to affect line spacing. + private static final int FALLBACK_LINE_SPACING_NONE = 0; + private static final int FALLBACK_LINE_SPACING_STATIC_LAYOUT_ONLY = 1; + private static final int FALLBACK_LINE_SPACING_ALL = 2; + + private int mUseFallbackLineSpacing; // True if the view text can be padded for compat reasons, when the view is translated. private final boolean mUseTextPaddingForUiTranslation; @@ -1479,7 +1503,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final int targetSdkVersion = context.getApplicationInfo().targetSdkVersion; mUseInternationalizedInput = targetSdkVersion >= VERSION_CODES.O; - mUseFallbackLineSpacing = targetSdkVersion >= VERSION_CODES.P; + if (CompatChanges.isChangeEnabled(BORINGLAYOUT_FALLBACK_LINESPACING)) { + mUseFallbackLineSpacing = FALLBACK_LINE_SPACING_ALL; + } else if (CompatChanges.isChangeEnabled(STATICLAYOUT_FALLBACK_LINESPACING)) { + mUseFallbackLineSpacing = FALLBACK_LINE_SPACING_STATIC_LAYOUT_ONLY; + } else { + mUseFallbackLineSpacing = FALLBACK_LINE_SPACING_NONE; + } // TODO(b/179693024): Use a ChangeId instead. mUseTextPaddingForUiTranslation = targetSdkVersion <= Build.VERSION_CODES.R; @@ -4541,8 +4571,18 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @attr ref android.R.styleable#TextView_fallbackLineSpacing */ public void setFallbackLineSpacing(boolean enabled) { - if (mUseFallbackLineSpacing != enabled) { - mUseFallbackLineSpacing = enabled; + int fallbackStrategy; + if (enabled) { + if (CompatChanges.isChangeEnabled(BORINGLAYOUT_FALLBACK_LINESPACING)) { + fallbackStrategy = FALLBACK_LINE_SPACING_ALL; + } else { + fallbackStrategy = FALLBACK_LINE_SPACING_STATIC_LAYOUT_ONLY; + } + } else { + fallbackStrategy = FALLBACK_LINE_SPACING_NONE; + } + if (mUseFallbackLineSpacing != fallbackStrategy) { + mUseFallbackLineSpacing = fallbackStrategy; if (mLayout != null) { nullLayouts(); requestLayout(); @@ -4560,7 +4600,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ @InspectableProperty public boolean isFallbackLineSpacing() { - return mUseFallbackLineSpacing; + return mUseFallbackLineSpacing != FALLBACK_LINE_SPACING_NONE; + } + + private boolean isFallbackLineSpacingForBoringLayout() { + return mUseFallbackLineSpacing == FALLBACK_LINE_SPACING_ALL; + } + + // Package privte for accessing from Editor.java + /* package */ boolean isFallbackLineSpacingForStaticLayout() { + return mUseFallbackLineSpacing == FALLBACK_LINE_SPACING_ALL + || mUseFallbackLineSpacing == FALLBACK_LINE_SPACING_STATIC_LAYOUT_ONLY; } /** @@ -9148,7 +9198,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (hintBoring == UNKNOWN_BORING) { hintBoring = BoringLayout.isBoring(mHint, mTextPaint, mTextDir, - mHintBoring); + isFallbackLineSpacingForBoringLayout(), mHintBoring); if (hintBoring != null) { mHintBoring = hintBoring; } @@ -9190,7 +9240,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener .setTextDirection(mTextDir) .setLineSpacing(mSpacingAdd, mSpacingMult) .setIncludePad(mIncludePad) - .setUseLineSpacingFromFallbacks(mUseFallbackLineSpacing) + .setUseLineSpacingFromFallbacks(isFallbackLineSpacingForStaticLayout()) .setBreakStrategy(mBreakStrategy) .setHyphenationFrequency(mHyphenationFrequency) .setJustificationMode(mJustificationMode) @@ -9250,7 +9300,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener .setTextDirection(mTextDir) .setLineSpacing(mSpacingAdd, mSpacingMult) .setIncludePad(mIncludePad) - .setUseLineSpacingFromFallbacks(mUseFallbackLineSpacing) + .setUseLineSpacingFromFallbacks(isFallbackLineSpacingForStaticLayout()) .setBreakStrategy(mBreakStrategy) .setHyphenationFrequency(mHyphenationFrequency) .setJustificationMode(mJustificationMode) @@ -9259,7 +9309,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener result = builder.build(); } else { if (boring == UNKNOWN_BORING) { - boring = BoringLayout.isBoring(mTransformed, mTextPaint, mTextDir, mBoring); + boring = BoringLayout.isBoring(mTransformed, mTextPaint, mTextDir, + isFallbackLineSpacingForBoringLayout(), mBoring); if (boring != null) { mBoring = boring; } @@ -9303,7 +9354,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener .setTextDirection(mTextDir) .setLineSpacing(mSpacingAdd, mSpacingMult) .setIncludePad(mIncludePad) - .setUseLineSpacingFromFallbacks(mUseFallbackLineSpacing) + .setUseLineSpacingFromFallbacks(isFallbackLineSpacingForStaticLayout()) .setBreakStrategy(mBreakStrategy) .setHyphenationFrequency(mHyphenationFrequency) .setJustificationMode(mJustificationMode) @@ -9430,7 +9481,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } if (des < 0) { - boring = BoringLayout.isBoring(mTransformed, mTextPaint, mTextDir, mBoring); + boring = BoringLayout.isBoring(mTransformed, mTextPaint, mTextDir, + isFallbackLineSpacingForBoringLayout(), mBoring); if (boring != null) { mBoring = boring; } @@ -9463,7 +9515,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } if (hintDes < 0) { - hintBoring = BoringLayout.isBoring(mHint, mTextPaint, mTextDir, mHintBoring); + hintBoring = BoringLayout.isBoring(mHint, mTextPaint, mTextDir, + isFallbackLineSpacingForBoringLayout(), mHintBoring); if (hintBoring != null) { mHintBoring = hintBoring; } @@ -9667,7 +9720,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener layoutBuilder.setAlignment(getLayoutAlignment()) .setLineSpacing(getLineSpacingExtra(), getLineSpacingMultiplier()) .setIncludePad(getIncludeFontPadding()) - .setUseLineSpacingFromFallbacks(mUseFallbackLineSpacing) + .setUseLineSpacingFromFallbacks(isFallbackLineSpacingForStaticLayout()) .setBreakStrategy(getBreakStrategy()) .setHyphenationFrequency(getHyphenationFrequency()) .setJustificationMode(getJustificationMode()) |
