diff options
| author | 2025-01-13 22:13:35 -0800 | |
|---|---|---|
| committer | 2025-01-13 22:13:35 -0800 | |
| commit | d555e2c9cfdcb581556e2b863f883fa34437f444 (patch) | |
| tree | 240176f8e4256c1d35171f7236689413f1ee021f | |
| parent | 2be6afc350cf1f60d97742d5bdfebc34afe610fa (diff) | |
| parent | 3d80511a3461e4255fb8560d8ff9acb60dcc9743 (diff) | |
Merge "fix(HCT):Hide HCT background when the text is only whitespace" into main
| -rw-r--r-- | core/java/android/text/Layout.java | 6 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/text/LayoutTest.java | 49 |
2 files changed, 55 insertions, 0 deletions
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java index 3c53506990d1..323d83b92143 100644 --- a/core/java/android/text/Layout.java +++ b/core/java/android/text/Layout.java @@ -1066,6 +1066,12 @@ public abstract class Layout { var hasBgColorChanged = newBackground != bgPaint.getColor(); if (lineNum != mLastLineNum || hasBgColorChanged) { + // Skip processing if the character is a space or a tap to avoid + // rendering an abrupt, empty rectangle. + if (Character.isWhitespace(mText.charAt(index))) { + return; + } + // Draw what we have so far, then reset the rect and update its color drawRect(); mLineBackground.set(left, top, right, bottom); diff --git a/core/tests/coretests/src/android/text/LayoutTest.java b/core/tests/coretests/src/android/text/LayoutTest.java index c7d85d4b9b76..9e78af57b470 100644 --- a/core/tests/coretests/src/android/text/LayoutTest.java +++ b/core/tests/coretests/src/android/text/LayoutTest.java @@ -1024,6 +1024,55 @@ public class LayoutTest { expect.that(backgroundCommands.size()).isEqualTo(backgroundRectsDrawn); } + @Test + @RequiresFlagsEnabled(FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT) + public void highContrastTextEnabled_testWhitespaceText_DrawsBackgroundsWithAdjacentLetters() { + mTextPaint.setColor(Color.BLACK); + SpannableString spannedText = new SpannableString("Test\tTap and Space"); + + // Set the entire text to white initially + spannedText.setSpan( + new ForegroundColorSpan(Color.WHITE), + /* start= */ 0, + /* end= */ spannedText.length(), + Spanned.SPAN_INCLUSIVE_EXCLUSIVE + ); + + // Find the whitespace character and set its color to black + for (int i = 0; i < spannedText.length(); i++) { + if (Character.isWhitespace(spannedText.charAt(i))) { + spannedText.setSpan( + new ForegroundColorSpan(Color.BLACK), + i, + i + 1, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE + ); + } + } + + Layout layout = new StaticLayout(spannedText, mTextPaint, mWidth, + mAlign, mSpacingMult, mSpacingAdd, /* includePad= */ false); + + MockCanvas c = new MockCanvas(/* width= */ 256, /* height= */ 256); + c.setHighContrastTextEnabled(true); + layout.draw( + c, + /* highlightPaths= */ null, + /* highlightPaints= */ null, + /* selectionPath= */ null, + /* selectionPaint= */ null, + /* cursorOffsetVertical= */ 0 + ); + + List<MockCanvas.DrawCommand> drawCommands = c.getDrawCommands(); + for (int i = 0; i < drawCommands.size(); i++) { + MockCanvas.DrawCommand drawCommand = drawCommands.get(i); + if (drawCommand.rect != null) { + expect.that(removeAlpha(drawCommand.paint.getColor())).isEqualTo(Color.BLACK); + } + } + } + private int removeAlpha(int color) { return Color.rgb( Color.red(color), |