Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3cc4fa15 authored by Justin Ghan's avatar Justin Ghan Committed by Android (Google) Code Review
Browse files

Merge changes from topics "inclusion-strategy", "segment-finder"

* changes:
  Rename SegmentIterator to SegmentFinder
  Layout#getRangeForRect support different text inclusion strategies
parents cedd60e7 88cd111c
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -21,16 +21,16 @@ import android.annotation.NonNull;
import android.graphics.Paint;

/**
 * Implementation of {@code SegmentIterator} using grapheme clusters as the text segment. Whitespace
 * Implementation of {@code SegmentFinder} using grapheme clusters as the text segment. Whitespace
 * characters are included as segments.
 *
 * @hide
 */
public class GraphemeClusterSegmentIterator extends SegmentIterator {
public class GraphemeClusterSegmentFinder extends SegmentFinder {
    private final CharSequence mText;
    private final TextPaint mTextPaint;

    public GraphemeClusterSegmentIterator(
    public GraphemeClusterSegmentFinder(
            @NonNull CharSequence text, @NonNull TextPaint textPaint) {
        mText = text;
        mTextPaint = textPaint;
+246 −173

File changed.

Preview size limit exceeded, changes collapsed.

+4 −55
Original line number Diff line number Diff line
@@ -22,21 +22,18 @@ import android.annotation.IntRange;
 * Finds text segment boundaries within text. Subclasses can implement different types of text
 * segments. Grapheme clusters and words are examples of possible text segments.
 *
 * <p>Granular units may not overlap, so every character belongs to at most one text segment. A
 * <p>Text segments may not overlap, so every character belongs to at most one text segment. A
 * character may belong to no text segments.
 *
 * <p>For example, a word level text segment iterator may subdivide the text "Hello, World!" into
 * four text segments: "Hello", ",", "World", "!". The space character does not belong to any text
 * <p>For example, a word level text segment finder may subdivide the text "Hello, World!" into four
 * text segments: "Hello", ",", "World", "!". The space character does not belong to any text
 * segments.
 *
 * @hide
 */
public abstract class SegmentIterator {
public abstract class SegmentFinder {
    public static final int DONE = -1;

    private int mRunStartOffset;
    private int mRunEndOffset;

    /**
     * Returns the character offset of the previous text segment start boundary before the specified
     * character offset, or {@code DONE} if there are none.
@@ -60,52 +57,4 @@ public abstract class SegmentIterator {
     * character offset, or {@code DONE} if there are none.
     */
    public abstract int nextEndBoundary(@IntRange(from = 0) int offset);

    /**
     * Sets the start and end of a run which can be used to constrain the scope of the iterator's
     * search.
     *
     * @hide
     */
    void setRunLimits(
            @IntRange(from = 0) int runStartOffset, @IntRange(from = 0) int runEndOffset) {
        mRunStartOffset = runStartOffset;
        mRunEndOffset = runEndOffset;
    }

    /** @hide */
    int previousStartBoundaryOrRunStart(@IntRange(from = 0) int offset) {
        int start = previousStartBoundary(offset);
        if (start == DONE) {
            return DONE;
        }
        return Math.max(start, mRunStartOffset);
    }

    /** @hide */
    int previousEndBoundaryWithinRunLimits(@IntRange(from = 0) int offset) {
        int end = previousEndBoundary(offset);
        if (end <= mRunStartOffset) {
            return DONE;
        }
        return end;
    }

    /** @hide */
    int nextStartBoundaryWithinRunLimits(@IntRange(from = 0) int offset) {
        int start = nextStartBoundary(offset);
        if (start >= mRunEndOffset) {
            return DONE;
        }
        return start;
    }

    /** @hide */
    int nextEndBoundaryOrRunEnd(@IntRange(from = 0) int offset) {
        int end = nextEndBoundary(offset);
        if (end == DONE) {
            return DONE;
        }
        return Math.min(end, mRunEndOffset);
    }
}
+3 −3
Original line number Diff line number Diff line
@@ -22,17 +22,17 @@ import android.icu.text.BreakIterator;
import android.text.method.WordIterator;

/**
 * Implementation of {@code SegmentIterator} using words as the text segment. Word boundaries are
 * Implementation of {@code SegmentFinder} using words as the text segment. Word boundaries are
 * found using {@code WordIterator}. Whitespace characters are excluded, so they are not included in
 * any text segments.
 *
 * @hide
 */
public class WordSegmentIterator extends SegmentIterator {
public class WordSegmentFinder extends SegmentFinder {
    private final CharSequence mText;
    private final WordIterator mWordIterator;

    public WordSegmentIterator(@NonNull CharSequence text, @NonNull WordIterator wordIterator) {
    public WordSegmentFinder(@NonNull CharSequence text, @NonNull WordIterator wordIterator) {
        mText = text;
        mWordIterator = wordIterator;
    }
+8 −7
Original line number Diff line number Diff line
@@ -99,14 +99,14 @@ import android.text.BoringLayout;
import android.text.DynamicLayout;
import android.text.Editable;
import android.text.GetChars;
import android.text.GraphemeClusterSegmentIterator;
import android.text.GraphemeClusterSegmentFinder;
import android.text.GraphicsOperations;
import android.text.InputFilter;
import android.text.InputType;
import android.text.Layout;
import android.text.ParcelableSpan;
import android.text.PrecomputedText;
import android.text.SegmentIterator;
import android.text.SegmentFinder;
import android.text.Selection;
import android.text.SpanWatcher;
import android.text.Spannable;
@@ -120,7 +120,7 @@ import android.text.TextPaint;
import android.text.TextUtils;
import android.text.TextUtils.TruncateAt;
import android.text.TextWatcher;
import android.text.WordSegmentIterator;
import android.text.WordSegmentFinder;
import android.text.method.AllCapsTransformationMethod;
import android.text.method.ArrowKeyMovementMethod;
import android.text.method.DateKeyListener;
@@ -9515,16 +9515,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
    @Nullable
    private int[] getRangeForRect(@NonNull RectF area, int granularity) {
        SegmentIterator segmentIterator;
        SegmentFinder segmentFinder;
        if (granularity == HandwritingGesture.GRANULARITY_WORD) {
            WordIterator wordIterator = getWordIterator();
            wordIterator.setCharSequence(mText, 0, mText.length());
            segmentIterator = new WordSegmentIterator(mText, wordIterator);
            segmentFinder = new WordSegmentFinder(mText, wordIterator);
        } else {
            segmentIterator = new GraphemeClusterSegmentIterator(mText, mTextPaint);
            segmentFinder = new GraphemeClusterSegmentFinder(mText, mTextPaint);
        }
        return mLayout.getRangeForRect(area, segmentIterator);
        return mLayout.getRangeForRect(
                area, segmentFinder, Layout.INCLUSION_STRATEGY_CONTAINS_CENTER);
    }
    private Pattern getWhitespacePattern() {
Loading