diff options
author | Neil Fuller <nfuller@google.com> | 2015-02-06 10:03:08 +0000 |
---|---|---|
committer | Neil Fuller <nfuller@google.com> | 2015-02-06 10:29:54 +0000 |
commit | d29bdb266d54b4551f42776bb790e80147a279d0 (patch) | |
tree | 63f0a7f0b1d04f47a6d650e955a9f2b94a3006b3 /core | |
parent | dcce25a9a7fb3458f2fb65b23912b5f7eb42c596 (diff) | |
download | frameworks_base-d29bdb266d54b4551f42776bb790e80147a279d0.zip frameworks_base-d29bdb266d54b4551f42776bb790e80147a279d0.tar.gz frameworks_base-d29bdb266d54b4551f42776bb790e80147a279d0.tar.bz2 |
Avoid static initialization of Layout from TextUtils
This works around a bug in standalone (e.g. non-Zygote)
runtimes when a device is attached to a host that is running
DDM.
There is a race condition:
When the runtime receives a HELLO from DDM it calls
TextUtils.isEmpty().
Calling any TextUtils methods statically initializes
Layout. Layout has dependencies on other classes, which in
turn have dependencies on native methods that are not always
registered when the call takes place. Registration and DDM
handling are done in separate threads.
This is not a fix, merely a workaround until the race can
be resolved.
Bug: 18081539
Change-Id: If1bd3de6597bc93da381c8f86dacf40156449561
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/text/Layout.java | 6 | ||||
-rw-r--r-- | core/java/android/text/StaticLayout.java | 2 | ||||
-rw-r--r-- | core/java/android/text/TextUtils.java | 9 |
3 files changed, 9 insertions, 8 deletions
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java index 2b53c48..b84c3aa 100644 --- a/core/java/android/text/Layout.java +++ b/core/java/android/text/Layout.java @@ -1754,8 +1754,8 @@ public abstract class Layout { private char getEllipsisChar(TextUtils.TruncateAt method) { return (method == TextUtils.TruncateAt.END_SMALL) ? - ELLIPSIS_TWO_DOTS[0] : - ELLIPSIS_NORMAL[0]; + TextUtils.ELLIPSIS_TWO_DOTS[0] : + TextUtils.ELLIPSIS_NORMAL[0]; } private void ellipsize(int start, int end, int line, @@ -1952,6 +1952,4 @@ public abstract class Layout { /* package */ static final Directions DIRS_ALL_RIGHT_TO_LEFT = new Directions(new int[] { 0, RUN_LENGTH_MASK | RUN_RTL_FLAG }); - /* package */ static final char[] ELLIPSIS_NORMAL = { '\u2026' }; // this is "..." - /* package */ static final char[] ELLIPSIS_TWO_DOTS = { '\u2025' }; // this is ".." } diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index 74b7b69..07505a9 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -652,7 +652,7 @@ public class StaticLayout extends Layout { float ellipsisWidth = paint.measureText( (where == TextUtils.TruncateAt.END_SMALL) ? - ELLIPSIS_TWO_DOTS : ELLIPSIS_NORMAL, 0, 1); + TextUtils.ELLIPSIS_TWO_DOTS : TextUtils.ELLIPSIS_NORMAL, 0, 1); int ellipsisStart = 0; int ellipsisCount = 0; int len = lineEnd - lineStart; diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java index 8a8c6d8..48bb5dd 100644 --- a/core/java/android/text/TextUtils.java +++ b/core/java/android/text/TextUtils.java @@ -63,9 +63,12 @@ import java.util.regex.Pattern; public class TextUtils { private static final String TAG = "TextUtils"; - private static final String ELLIPSIS = new String(Layout.ELLIPSIS_NORMAL); - private static final String ELLIPSIS_TWO_DOTS = new String(Layout.ELLIPSIS_TWO_DOTS); + /* package */ static final char[] ELLIPSIS_NORMAL = { '\u2026' }; // this is "..." + private static final String ELLIPSIS_STRING = new String(ELLIPSIS_NORMAL); + + /* package */ static final char[] ELLIPSIS_TWO_DOTS = { '\u2025' }; // this is ".." + private static final String ELLIPSIS_TWO_DOTS_STRING = new String(ELLIPSIS_TWO_DOTS); private TextUtils() { /* cannot be instantiated */ } @@ -1085,7 +1088,7 @@ public class TextUtils { EllipsizeCallback callback) { return ellipsize(text, paint, avail, where, preserveLength, callback, TextDirectionHeuristics.FIRSTSTRONG_LTR, - (where == TruncateAt.END_SMALL) ? ELLIPSIS_TWO_DOTS : ELLIPSIS); + (where == TruncateAt.END_SMALL) ? ELLIPSIS_TWO_DOTS_STRING : ELLIPSIS_STRING); } /** |