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

Commit c3a5e591 authored by Diego Perez's avatar Diego Perez Committed by Android (Google) Code Review
Browse files

Merge "Add support for the new native Builder class on StaticLayout."

parents 2b50fb61 fe12aa77
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;
    }
}