package android.text;

import com.android.tools.layoutlib.annotations.LayoutlibDelegate;

import java.text.CharacterIterator;
import java.util.Arrays;
import java.util.Locale;

import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.text.BreakIterator;
import com.ibm.icu.util.ULocale;
import javax.swing.text.Segment;

/**
 * Delegate that provides implementation for native methods in {@link android.text.StaticLayout}
 *
 * Through the layoutlib_create tool, selected methods of Handler have been replaced
 * by calls to methods of the same name in this delegate class.
 *
 */
public class StaticLayout_Delegate {

    /**
     * Fills the recycle array with positions that are suitable to break the text at. The array
     * must be terminated by '-1'.
     */
    @LayoutlibDelegate
    /*package*/ static int[] nLineBreakOpportunities(String locale, char[] text, int length,
            int[] recycle) {
        BreakIterator iterator = BreakIterator.getLineInstance(new ULocale(locale));
        Segment segment = new Segment(text, 0, length);
        iterator.setText(segment);
        if (recycle == null) {
            // Because 42 is the answer to everything.
            recycle = new int[42];
        }
        int breakOpp = iterator.first();
        recycle[0] = breakOpp;
        //noinspection ConstantConditions
        assert BreakIterator.DONE == -1;
        for (int i = 1; breakOpp != BreakIterator.DONE; ++i) {
            if (i >= recycle.length) {
                recycle = doubleSize(recycle);
            }
            assert (i < recycle.length);
            breakOpp = iterator.next();
            recycle[i] = breakOpp;
        }
        return recycle;
    }

    private static int[] doubleSize(int[] array) {
        return Arrays.copyOf(array, array.length * 2);
    }
}
