• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package android.text;
2 
3 import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
4 
5 import java.text.CharacterIterator;
6 import java.util.Arrays;
7 import java.util.Locale;
8 
9 import com.ibm.icu.lang.UCharacter;
10 import com.ibm.icu.text.BreakIterator;
11 import com.ibm.icu.util.ULocale;
12 import javax.swing.text.Segment;
13 
14 /**
15  * Delegate that provides implementation for native methods in {@link android.text.StaticLayout}
16  * <p/>
17  * Through the layoutlib_create tool, selected methods of StaticLayout have been replaced
18  * by calls to methods of the same name in this delegate class.
19  *
20  */
21 public class StaticLayout_Delegate {
22 
23     /**
24      * Fills the recycle array with positions that are suitable to break the text at. The array
25      * must be terminated by '-1'.
26      */
27     @LayoutlibDelegate
nLineBreakOpportunities(String locale, char[] text, int length, int[] recycle)28     /*package*/ static int[] nLineBreakOpportunities(String locale, char[] text, int length,
29             int[] recycle) {
30         BreakIterator iterator = BreakIterator.getLineInstance(new ULocale(locale));
31         Segment segment = new Segment(text, 0, length);
32         iterator.setText(segment);
33         if (recycle == null) {
34             // Because 42 is the answer to everything.
35             recycle = new int[42];
36         }
37         int breakOpp = iterator.first();
38         recycle[0] = breakOpp;
39         //noinspection ConstantConditions
40         assert BreakIterator.DONE == -1;
41         for (int i = 1; breakOpp != BreakIterator.DONE; ++i) {
42             if (i >= recycle.length) {
43                 recycle = doubleSize(recycle);
44             }
45             assert (i < recycle.length);
46             breakOpp = iterator.next();
47             recycle[i] = breakOpp;
48         }
49         return recycle;
50     }
51 
52     private static int[] doubleSize(int[] array) {
53         return Arrays.copyOf(array, array.length * 2);
54     }
55 }
56