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

Commit daa4a95a authored by Gilles Debunne's avatar Gilles Debunne
Browse files

Fix in BreakIterator.

An index equal to the length of text is indeed a valid position,
representing a cursor located after the last character.

Also changed iterator to comply to the documentation.

Change-Id: I7b9e427e4e37df20ab7e66d99053a9d8a6af6eb3
parent 99eefad9
Loading
Loading
Loading
Loading
+17 −12
Original line number Diff line number Diff line
@@ -16,22 +16,18 @@

package android.text;

import android.util.MathUtils;

import java.text.CharacterIterator;

/** {@hide} */
public class CharSequenceIterator implements CharacterIterator {
    private final CharSequence mValue;

    private final int mStart;
    private final int mEnd;
    private final int mLength;
    private int mIndex;

    public CharSequenceIterator(CharSequence value) {
        mValue = value;
        mStart = 0;
        mEnd = value.length();
        mLength = value.length();
        mIndex = 0;
    }

@@ -46,7 +42,7 @@ public class CharSequenceIterator implements CharacterIterator {

    /** {@inheritDoc} */
    public char current() {
        if (mIndex == mEnd) {
        if (mIndex == mLength) {
            return DONE;
        }
        return mValue.charAt(mIndex);
@@ -54,12 +50,12 @@ public class CharSequenceIterator implements CharacterIterator {

    /** {@inheritDoc} */
    public int getBeginIndex() {
        return mStart;
        return 0;
    }

    /** {@inheritDoc} */
    public int getEndIndex() {
        return mEnd;
        return mLength;
    }

    /** {@inheritDoc} */
@@ -69,27 +65,36 @@ public class CharSequenceIterator implements CharacterIterator {

    /** {@inheritDoc} */
    public char first() {
        return setIndex(mStart);
        return setIndex(0);
    }

    /** {@inheritDoc} */
    public char last() {
        return setIndex(mEnd - 1);
        return setIndex(mLength - 1);
    }

    /** {@inheritDoc} */
    public char next() {
        if (mIndex == mLength) {
            return DONE;
        }
        return setIndex(mIndex + 1);
    }

    /** {@inheritDoc} */
    public char previous() {
        if (mIndex == 0) {
            return DONE;
        }
        return setIndex(mIndex - 1);
    }

    /** {@inheritDoc} */
    public char setIndex(int index) {
        mIndex = MathUtils.constrain(index, mStart, mEnd);
        if ((index < 0) || (index > mLength)) {
            throw new IllegalArgumentException("Valid range is [" + 0 + "..." + mLength + "]");
        }
        mIndex = index;
        return current();
    }
}
+3 −3
Original line number Diff line number Diff line
@@ -390,7 +390,7 @@ public class ArrowKeyMovementMethod extends BaseMovementMethod implements Moveme
        }

        private boolean isValidOffset(int offset) {
            return offset >= 0 && offset < mCurrent.length();
            return offset >= 0 && offset <= mCurrent.length();
        }

        private boolean isLetterOrDigit(int offset) {
@@ -404,7 +404,7 @@ public class ArrowKeyMovementMethod extends BaseMovementMethod implements Moveme
        /** {@inheritDoc} */
        public int preceding(int offset) {
            // always round cursor index into valid string index
            offset = MathUtils.constrain(offset, 0, mCurrent.length() - 1);
            offset = MathUtils.constrain(offset, 0, mCurrent.length());

            do {
                offset = mIterator.preceding(offset);
@@ -417,7 +417,7 @@ public class ArrowKeyMovementMethod extends BaseMovementMethod implements Moveme
        /** {@inheritDoc} */
        public int following(int offset) {
            // always round cursor index into valid string index
            offset = MathUtils.constrain(offset, 0, mCurrent.length() - 1);
            offset = MathUtils.constrain(offset, 0, mCurrent.length());

            do {
                offset = mIterator.following(offset);