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

Commit fe12aa77 authored by Diego Perez's avatar Diego Perez
Browse files

Add support for the new native Builder class on StaticLayout.

This patch updates StaticLayout_Delegate to support the new Builder
class introduced in ag/646289.

Change-Id: I9f8c528b8751ce69482e33ac6f1bc42406a0b606
parent 7f602b75
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
package android.text;

import com.android.annotations.NonNull;
import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;

import android.text.StaticLayout.LineBreaks;
@@ -27,14 +28,19 @@ public class StaticLayout_Delegate {
    private static final char CHAR_NEWLINE   = 0x0A;
    private static final char CHAR_ZWSP      = 0x200B;  // Zero width space.

    // ---- Builder delegate manager ----
    private static final DelegateManager<Builder> sBuilderManager =
        new DelegateManager<Builder>(Builder.class);

    @LayoutlibDelegate
    /*package*/ static int nComputeLineBreaks(String locale, char[] inputText, float[] widths,
    /*package*/ static int nComputeLineBreaks(long nativeBuilder, char[] inputText, float[] widths,
            int length, float firstWidth, int firstWidthLineCount, float restWidth,
            int[] variableTabStops, int defaultTabStop, boolean optimize, LineBreaks recycle,
            int[] recycleBreaks, float[] recycleWidths, boolean[] recycleFlags, int recycleLength) {

        Builder builder = sBuilderManager.getDelegate(nativeBuilder);
        // compute all possible breakpoints.
        BreakIterator it = BreakIterator.getLineInstance(new ULocale(locale));
        BreakIterator it = BreakIterator.getLineInstance(new ULocale(builder.mLocale));
        it.setText(new Segment(inputText, 0, length));
        // average word length in english is 5. So, initialize the possible breaks with a guess.
        List<Integer> breaks = new ArrayList<Integer>((int) Math.ceil(length / 5d));
@@ -97,4 +103,32 @@ public class StaticLayout_Delegate {
                PrimitiveType.PENALTY.getNewPrimitive(length, 0, -PrimitiveType.PENALTY_INFINITY));
        return primitives;
    }

    @LayoutlibDelegate
    /*package*/ static long nNewBuilder() {
        return sBuilderManager.addNewDelegate(new Builder());
    }

    @LayoutlibDelegate
    /*package*/ static void nFinishBuilder(long nativeBuilder) {
    }

    @LayoutlibDelegate
    /*package*/ static void nFreeBuilder(long nativeBuilder) {
        sBuilderManager.removeJavaReferenceFor(nativeBuilder);
    }

    @LayoutlibDelegate
    /*package*/ static void nBuilderSetLocale(long nativeBuilder, String locale) {
        Builder builder = sBuilderManager.getDelegate(nativeBuilder);
        builder.mLocale = locale;
    }

    /**
     * Java representation of the native Builder class. It currently only stores the locale
     * set by nBuilderSetLocale.
     */
    static class Builder {
        String mLocale;
    }
}