diff options
| -rw-r--r-- | core/api/current.txt | 4 | ||||
| -rw-r--r-- | core/java/android/text/GraphemeClusterSegmentFinder.java | 7 | ||||
| -rw-r--r-- | core/java/android/text/Layout.java | 10 | ||||
| -rw-r--r-- | core/java/android/text/SegmentFinder.java | 5 | ||||
| -rw-r--r-- | core/java/android/text/WordSegmentFinder.java | 22 | ||||
| -rw-r--r-- | core/java/android/text/method/WordIterator.java | 9 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 13 |
7 files changed, 53 insertions, 17 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 27d5ac3efa42..b06374615730 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -45331,7 +45331,7 @@ package android.text { method public final int getParagraphLeft(int); method public final int getParagraphRight(int); method public float getPrimaryHorizontal(int); - method @Nullable public int[] getRangeForRect(@NonNull android.graphics.RectF, @NonNull android.text.SegmentFinder, @NonNull android.text.Layout.TextInclusionStrategy); + method @Nullable public android.util.Range<java.lang.Integer> getRangeForRect(@NonNull android.graphics.RectF, @NonNull android.text.SegmentFinder, @NonNull android.text.Layout.TextInclusionStrategy); method public float getSecondaryHorizontal(int); method public void getSelectionPath(int, int, android.graphics.Path); method public final float getSpacingAdd(); @@ -45746,7 +45746,7 @@ package android.text { } public class WordSegmentFinder extends android.text.SegmentFinder { - ctor public WordSegmentFinder(@NonNull CharSequence, @NonNull java.util.Locale); + ctor public WordSegmentFinder(@NonNull CharSequence, @NonNull android.icu.util.ULocale); method public int nextEndBoundary(@IntRange(from=0) int); method public int nextStartBoundary(@IntRange(from=0) int); method public int previousEndBoundary(@IntRange(from=0) int); diff --git a/core/java/android/text/GraphemeClusterSegmentFinder.java b/core/java/android/text/GraphemeClusterSegmentFinder.java index 8b3db0a51691..3335751e8817 100644 --- a/core/java/android/text/GraphemeClusterSegmentFinder.java +++ b/core/java/android/text/GraphemeClusterSegmentFinder.java @@ -34,6 +34,13 @@ public class GraphemeClusterSegmentFinder extends SegmentFinder { private final CharSequence mText; private final TextPaint mTextPaint; + /** + * Constructs a GraphemeClusterSegmentFinder instance for the specified text which uses the + * provided TextPaint to determine grapheme cluster boundaries. + * + * @param text text to be segmented + * @param textPaint TextPaint used to draw the text + */ public GraphemeClusterSegmentFinder( @NonNull CharSequence text, @NonNull TextPaint textPaint) { mText = text; diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java index 913e9cc1a246..519fc55b523d 100644 --- a/core/java/android/text/Layout.java +++ b/core/java/android/text/Layout.java @@ -36,6 +36,7 @@ import android.text.style.LineBackgroundSpan; import android.text.style.ParagraphStyle; import android.text.style.ReplacementSpan; import android.text.style.TabStopSpan; +import android.util.Range; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; @@ -1859,11 +1860,12 @@ public abstract class Layout { * text segment * @param inclusionStrategy strategy for determining whether a text segment is inside the * specified area - * @return int array of size 2 containing the start (inclusive) and end (exclusive) character - * offsets of the range, or null if there are no text segments inside the area + * @return an integer range where the endpoints are the start (inclusive) and end (exclusive) + * character offsets of the text range, or null if there are no text segments inside the + * area */ @Nullable - public int[] getRangeForRect(@NonNull RectF area, @NonNull SegmentFinder segmentFinder, + public Range<Integer> getRangeForRect(@NonNull RectF area, @NonNull SegmentFinder segmentFinder, @NonNull TextInclusionStrategy inclusionStrategy) { // Find the first line whose bottom (without line spacing) is below the top of the area. int startLine = getLineForVertical((int) area.top); @@ -1921,7 +1923,7 @@ public abstract class Layout { start = segmentFinder.previousStartBoundary(start + 1); end = segmentFinder.nextEndBoundary(end - 1); - return new int[] {start, end}; + return new Range(start, end); } /** diff --git a/core/java/android/text/SegmentFinder.java b/core/java/android/text/SegmentFinder.java index d34365dbef22..c21c5774fa0a 100644 --- a/core/java/android/text/SegmentFinder.java +++ b/core/java/android/text/SegmentFinder.java @@ -33,6 +33,11 @@ import android.graphics.RectF; * @see Layout#getRangeForRect(RectF, SegmentFinder, Layout.TextInclusionStrategy) */ public abstract class SegmentFinder { + /** + * Return value of previousStartBoundary(int), previousEndBoundary(int), nextStartBoundary(int), + * and nextEndBoundary(int) when there are no boundaries of the specified type in the specified + * direction. + */ public static final int DONE = -1; /** diff --git a/core/java/android/text/WordSegmentFinder.java b/core/java/android/text/WordSegmentFinder.java index bf31e4cb1706..be002f3102d3 100644 --- a/core/java/android/text/WordSegmentFinder.java +++ b/core/java/android/text/WordSegmentFinder.java @@ -18,12 +18,10 @@ package android.text; import android.annotation.IntRange; import android.annotation.NonNull; -import android.annotation.SuppressLint; import android.icu.text.BreakIterator; +import android.icu.util.ULocale; import android.text.method.WordIterator; -import java.util.Locale; - /** * Implementation of {@link SegmentFinder} using words as the text segment. Word boundaries are * found using {@link WordIterator}. Whitespace characters are excluded, so they are not included in @@ -39,14 +37,28 @@ public class WordSegmentFinder extends SegmentFinder { private final CharSequence mText; private final WordIterator mWordIterator; + /** + * Constructs a WordSegmentFinder instance for the specified text which uses the provided locale + * to determine word boundaries. + * + * @param text text to be segmented + * @param locale locale used for analyzing the text + */ public WordSegmentFinder( - @NonNull CharSequence text, @SuppressLint("UseIcu") @NonNull Locale locale) { + @NonNull CharSequence text, @NonNull ULocale locale) { mText = text; mWordIterator = new WordIterator(locale); mWordIterator.setCharSequence(text, 0, text.length()); } - /** @hide */ + /** + * Constructs a WordSegmentFinder instance for the specified text which uses the provided + * WordIterator to determine word boundaries. + * + * @param text text to be segmented + * @param wordIterator word iterator used to find word boundaries in the text + * @hide + */ public WordSegmentFinder(@NonNull CharSequence text, @NonNull WordIterator wordIterator) { mText = text; mWordIterator = wordIterator; diff --git a/core/java/android/text/method/WordIterator.java b/core/java/android/text/method/WordIterator.java index 6d18d2c541b6..2956f8461388 100644 --- a/core/java/android/text/method/WordIterator.java +++ b/core/java/android/text/method/WordIterator.java @@ -21,6 +21,7 @@ import android.compat.annotation.UnsupportedAppUsage; import android.icu.lang.UCharacter; import android.icu.lang.UProperty; import android.icu.text.BreakIterator; +import android.icu.util.ULocale; import android.os.Build; import android.text.CharSequenceCharacterIterator; import android.text.Selection; @@ -60,6 +61,14 @@ public class WordIterator implements Selection.PositionIterator { mIterator = BreakIterator.getWordInstance(locale); } + /** + * Constructs a new WordIterator for the specified locale. + * @param locale The locale to be used for analyzing the text. + */ + public WordIterator(ULocale locale) { + mIterator = BreakIterator.getWordInstance(locale); + } + @UnsupportedAppUsage public void setCharSequence(@NonNull CharSequence charSequence, int start, int end) { if (0 <= start && end <= charSequence.length()) { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index b339d76938af..aa3aefd5b620 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -151,6 +151,7 @@ import android.util.DisplayMetrics; import android.util.FeatureFlagUtils; import android.util.IntArray; import android.util.Log; +import android.util.Range; import android.util.SparseIntArray; import android.util.TypedValue; import android.view.AccessibilityIterators.TextSegmentIterator; @@ -9312,27 +9313,27 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener /** @hide */ public int performHandwritingSelectGesture(@NonNull SelectGesture gesture) { - int[] range = getRangeForRect( + Range<Integer> range = getRangeForRect( convertFromScreenToContentCoordinates(gesture.getSelectionArea()), gesture.getGranularity()); if (range == null) { return handleGestureFailure(gesture); } - Selection.setSelection(getEditableText(), range[0], range[1]); + Selection.setSelection(getEditableText(), range.getLower(), range.getUpper()); mEditor.startSelectionActionModeAsync(/* adjustSelection= */ false); return InputConnection.HANDWRITING_GESTURE_RESULT_SUCCESS; } /** @hide */ public int performHandwritingDeleteGesture(@NonNull DeleteGesture gesture) { - int[] range = getRangeForRect( + Range<Integer> range = getRangeForRect( convertFromScreenToContentCoordinates(gesture.getDeletionArea()), gesture.getGranularity()); if (range == null) { return handleGestureFailure(gesture); } - int start = range[0]; - int end = range[1]; + int start = range.getLower(); + int end = range.getUpper(); // For word granularity, adjust the start and end offsets to remove extra whitespace around // the deleted text. @@ -9523,7 +9524,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } @Nullable - private int[] getRangeForRect(@NonNull RectF area, int granularity) { + private Range<Integer> getRangeForRect(@NonNull RectF area, int granularity) { SegmentFinder segmentFinder; if (granularity == HandwritingGesture.GRANULARITY_WORD) { WordIterator wordIterator = getWordIterator(); |