145aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptapackage android.text;
245aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta
345aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptaimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
445aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta
545aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptaimport java.text.CharacterIterator;
645aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptaimport java.util.Arrays;
745aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptaimport java.util.Locale;
845aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta
945aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptaimport com.ibm.icu.lang.UCharacter;
1045aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptaimport com.ibm.icu.text.BreakIterator;
1145aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptaimport com.ibm.icu.util.ULocale;
1245aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptaimport javax.swing.text.Segment;
1345aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta
1445aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta/**
1545aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta * Delegate that provides implementation for native methods in {@link android.text.StaticLayout}
1610bb1371dca38b5b59f083ee963f7987da6511f2Deepanshu Gupta * <p/>
1710bb1371dca38b5b59f083ee963f7987da6511f2Deepanshu Gupta * Through the layoutlib_create tool, selected methods of StaticLayout have been replaced
1845aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta * by calls to methods of the same name in this delegate class.
1945aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta *
2045aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta */
2145aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Guptapublic class StaticLayout_Delegate {
2245aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta
2345aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta    /**
2445aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta     * Fills the recycle array with positions that are suitable to break the text at. The array
2545aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta     * must be terminated by '-1'.
2645aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta     */
2745aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta    @LayoutlibDelegate
2845aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta    /*package*/ static int[] nLineBreakOpportunities(String locale, char[] text, int length,
2945aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta            int[] recycle) {
3045aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        BreakIterator iterator = BreakIterator.getLineInstance(new ULocale(locale));
3145aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        Segment segment = new Segment(text, 0, length);
3245aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        iterator.setText(segment);
3345aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        if (recycle == null) {
3445aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta            // Because 42 is the answer to everything.
3545aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta            recycle = new int[42];
3645aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        }
3745aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        int breakOpp = iterator.first();
3845aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        recycle[0] = breakOpp;
3945aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        //noinspection ConstantConditions
4045aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        assert BreakIterator.DONE == -1;
4145aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        for (int i = 1; breakOpp != BreakIterator.DONE; ++i) {
4245aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta            if (i >= recycle.length) {
4345aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta                recycle = doubleSize(recycle);
4445aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta            }
4545aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta            assert (i < recycle.length);
4645aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta            breakOpp = iterator.next();
4745aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta            recycle[i] = breakOpp;
4845aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        }
4945aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        return recycle;
5045aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta    }
5145aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta
5245aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta    private static int[] doubleSize(int[] array) {
5345aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta        return Arrays.copyOf(array, array.length * 2);
5445aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta    }
5545aab0eb8f479b9967e7c3c43d0342412fb49b57Deepanshu Gupta}
56