From f4a3f3a03c72b6a38dc2f3f965531dc2a12460df Mon Sep 17 00:00:00 2001 From: Keisuke Kuroyanagi Date: Wed, 10 Jun 2015 09:37:32 +0900 Subject: [PATCH] Fix: Ellipsis is wrongly applied or not applied in TextView. In current implementation, ellipsis is applied after coptuting line breaks without limiting line count. As a result, ellipsis can be skipped or- wrongly applied because the breaks are computed to fit with the width. With this change, the last line and overflowed part are treated as a single line when the number of breaks exceeds the remaining line count. Bug: 6615676 Bug: 18514378 Bug: 20177499 Change-Id: I1d90e299404960cdd22746bad572411b119f7360 --- core/java/android/text/StaticLayout.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index 464710b29d2ac..b6fa4e4cf9e8f 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -714,6 +714,27 @@ public class StaticLayout extends Layout { float[] lineWidths = lineBreaks.widths; int[] flags = lineBreaks.flags; + final int remainingLineCount = mMaximumVisibleLineCount - mLineCount; + final boolean ellipsisMayBeApplied = ellipsize != null + && (ellipsize == TextUtils.TruncateAt.END + || (mMaximumVisibleLineCount == 1 + && ellipsize != TextUtils.TruncateAt.MARQUEE)); + if (remainingLineCount < breakCount && ellipsisMayBeApplied) { + // Treat the last line and overflowed lines as a single line. + breaks[remainingLineCount - 1] = breaks[breakCount - 1]; + // Calculate width and flag. + float width = 0; + int flag = 0; + for (int i = remainingLineCount - 1; i < breakCount; i++) { + width += lineWidths[i]; + flag |= flags[i] & TAB_MASK; + } + lineWidths[remainingLineCount - 1] = width; + flags[remainingLineCount - 1] = flag; + + breakCount = remainingLineCount; + } + // here is the offset of the starting character of the line we are currently measuring int here = paraStart;