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