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
This commit is contained in:
@@ -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 ".."
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user