summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jean Chen <chenjean@google.com> 2025-01-13 22:13:35 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-13 22:13:35 -0800
commitd555e2c9cfdcb581556e2b863f883fa34437f444 (patch)
tree240176f8e4256c1d35171f7236689413f1ee021f
parent2be6afc350cf1f60d97742d5bdfebc34afe610fa (diff)
parent3d80511a3461e4255fb8560d8ff9acb60dcc9743 (diff)
Merge "fix(HCT):Hide HCT background when the text is only whitespace" into main
-rw-r--r--core/java/android/text/Layout.java6
-rw-r--r--core/tests/coretests/src/android/text/LayoutTest.java49
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),