Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d950ad03 authored by Neil Fuller's avatar Neil Fuller
Browse files

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
(cherry-picked from commit d29bdb26)

Change-Id: Id0d8578eab9e59d479a7c1b2e7ea1890ac0c8de6
parent c565a567
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -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 ".."
}
+1 −1
Original line number Diff line number Diff line
@@ -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;
+6 −3
Original line number Diff line number Diff line
@@ -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);
    }

    /**