From 82d1c443330785ae9561393880b92cbc44de7db2 Mon Sep 17 00:00:00 2001 From: Keisuke Kuroyanagi Date: Wed, 14 Sep 2016 14:30:14 +0900 Subject: [PATCH] Make ellipsis START and MIDDLE grapheme cluster aware. When text contains 2 emojis and each emoji has 2-code units, the width array will be like [10, 0, 10, 0]. In this case, without this CL, just the first code unit can be replaced with the ellipsis marker. This CL makes ellipsis START and MIDDLE grapheme cluster aware. Note that ellipsis END is working properly even without this CL. Bug: 30613917 Change-Id: I38ff9793f2ea381460c50465c5470e0ad9a405b9 --- core/java/android/text/MeasuredText.java | 4 +++- core/java/android/text/StaticLayout.java | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/java/android/text/MeasuredText.java b/core/java/android/text/MeasuredText.java index 55df2069ea353..ce3e2822fa22a 100644 --- a/core/java/android/text/MeasuredText.java +++ b/core/java/android/text/MeasuredText.java @@ -279,7 +279,9 @@ class MeasuredText { if (width < 0.0f) break; i--; } - while (i < limit - 1 && mChars[i + 1] == ' ') i++; + while (i < limit - 1 && (mChars[i + 1] == ' ' || w[i + 1] == 0.0f)) { + i++; + } return limit - i - 1; } } diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index 70d183d4cbe25..bdbe8b0f9a241 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -1029,8 +1029,10 @@ public class StaticLayout extends Layout { for (i = len; i > 0; i--) { float w = widths[i - 1 + lineStart - widthStart]; - if (w + sum + ellipsisWidth > avail) { + while (i < len && widths[i + lineStart - widthStart] == 0.0f) { + i++; + } break; } @@ -1076,9 +1078,11 @@ public class StaticLayout extends Layout { float w = widths[right - 1 + lineStart - widthStart]; if (w + rsum > ravail) { + while (right < len && widths[right + lineStart - widthStart] == 0.0f) { + right++; + } break; } - rsum += w; }