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

Commit ea843f2a authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Make WordComposer aware of capitalized word

Change-Id: If6c0edef2334f018f2e04c6034f8ce747206f150
parent 6602b03e
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -192,7 +192,6 @@ public class Recorrection implements SharedPreferences.OnSharedPreferenceChangeL
                        new int[] { touching.mWord.charAt(i) }, WordComposer.NOT_A_COORDINATE,
                        WordComposer.NOT_A_COORDINATE);
            }
            foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.mWord.charAt(0)));
        }
        // Found a match, show suggestions
        if (foundWord != null || alternatives != null) {
+0 −4
Original line number Diff line number Diff line
@@ -1408,10 +1408,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
            }
        }
        if (mHasUncommittedTypedChars) {
            if (mComposingStringBuilder.length() == 0 && switcher.isAlphabetMode()
                    && switcher.isShiftedOrShiftLocked()) {
                mWordComposer.setFirstCharCapitalized(true);
            }
            mComposingStringBuilder.append((char) code);
            mWordComposer.add(code, keyCodes, x, y);
            final InputConnection ic = getCurrentInputConnection();
+27 −52
Original line number Diff line number Diff line
@@ -33,15 +33,9 @@ public class WordComposer {
     */
    private ArrayList<int[]> mCodes;

    private int mTypedLength;
    private int[] mXCoordinates;
    private int[] mYCoordinates;

    /**
     * The word chosen from the candidate list, until it is committed.
     */
    private String mPreferredWord;

    private StringBuilder mTypedWord;

    private int mCapsCount;
@@ -57,7 +51,6 @@ public class WordComposer {
        final int N = BinaryDictionary.MAX_WORD_LENGTH;
        mCodes = new ArrayList<int[]>(N);
        mTypedWord = new StringBuilder(N);
        mTypedLength = 0;
        mXCoordinates = new int[N];
        mYCoordinates = new int[N];
    }
@@ -68,14 +61,12 @@ public class WordComposer {

    public void init(WordComposer source) {
        mCodes = new ArrayList<int[]>(source.mCodes);
        mPreferredWord = source.mPreferredWord;
        mTypedWord = new StringBuilder(source.mTypedWord);
        mCapsCount = source.mCapsCount;
        mAutoCapitalized = source.mAutoCapitalized;
        mIsFirstCharCapitalized = source.mIsFirstCharCapitalized;
        mTypedLength = source.mTypedLength;
        mXCoordinates = source.mXCoordinates;
        mYCoordinates = source.mYCoordinates;
        mCapsCount = source.mCapsCount;
        mIsFirstCharCapitalized = source.mIsFirstCharCapitalized;
        mAutoCapitalized = source.mAutoCapitalized;
    }

    /**
@@ -83,19 +74,17 @@ public class WordComposer {
     */
    public void reset() {
        mCodes.clear();
        mTypedLength = 0;
        mIsFirstCharCapitalized = false;
        mPreferredWord = null;
        mTypedWord.setLength(0);
        mCapsCount = 0;
        mIsFirstCharCapitalized = false;
    }

    /**
     * Number of keystrokes in the composing word.
     * @return the number of keystrokes
     */
    public int size() {
        return mCodes.size();
    public final int size() {
        return mTypedWord.length();
    }

    /**
@@ -115,21 +104,28 @@ public class WordComposer {
        return mYCoordinates;
    }

    private static boolean isFirstCharCapitalized(int index, int codePoint, boolean previous) {
        if (index == 0) return Character.isUpperCase(codePoint);
        return previous && Character.isLowerCase(codePoint);
    }

    /**
     * Add a new keystroke, with codes[0] containing the pressed key's unicode and the rest of
     * the array containing unicode for adjacent keys, sorted by reducing probability/proximity.
     * @param codes the array of unicode values
     */
    public void add(int primaryCode, int[] codes, int x, int y) {
        final int newIndex = size();
        mTypedWord.append((char) primaryCode);
        correctPrimaryJuxtapos(primaryCode, codes);
        mCodes.add(codes);
        if (mTypedLength < BinaryDictionary.MAX_WORD_LENGTH) {
            mXCoordinates[mTypedLength] = x;
            mYCoordinates[mTypedLength] = y;
        if (newIndex < BinaryDictionary.MAX_WORD_LENGTH) {
            mXCoordinates[newIndex] = x;
            mYCoordinates[newIndex] = y;
        }
        ++mTypedLength;
        if (Character.isUpperCase((char) primaryCode)) mCapsCount++;
        mIsFirstCharCapitalized = isFirstCharCapitalized(
                newIndex, primaryCode, mIsFirstCharCapitalized);
        if (Character.isUpperCase(primaryCode)) mCapsCount++;
    }

    /**
@@ -151,16 +147,16 @@ public class WordComposer {
     * Delete the last keystroke as a result of hitting backspace.
     */
    public void deleteLast() {
        final int codesSize = mCodes.size();
        if (codesSize > 0) {
            mCodes.remove(codesSize - 1);
            final int lastPos = mTypedWord.length() - 1;
            char last = mTypedWord.charAt(lastPos);
        final int size = size();
        if (size > 0) {
            final int lastPos = size - 1;
            char lastChar = mTypedWord.charAt(lastPos);
            mCodes.remove(lastPos);
            mTypedWord.deleteCharAt(lastPos);
            if (Character.isUpperCase(last)) mCapsCount--;
            if (Character.isUpperCase(lastChar)) mCapsCount--;
        }
        if (mTypedLength > 0) {
            --mTypedLength;
        if (size() == 0) {
            mIsFirstCharCapitalized = false;
        }
    }

@@ -169,17 +165,12 @@ public class WordComposer {
     * @return the word that was typed so far
     */
    public CharSequence getTypedWord() {
        int wordSize = mCodes.size();
        if (wordSize == 0) {
        if (size() == 0) {
            return null;
        }
        return mTypedWord;
    }

    public void setFirstCharCapitalized(boolean capitalized) {
        mIsFirstCharCapitalized = capitalized;
    }
    
    /**
     * Whether or not the user typed a capital letter as the first letter in the word
     * @return capitalization preference
@@ -196,22 +187,6 @@ public class WordComposer {
        return (mCapsCount > 0) && (mCapsCount == size());
    }

    /**
     * Stores the user's selected word, before it is actually committed to the text field.
     * @param preferred
     */
    public void setPreferredWord(String preferred) {
        mPreferredWord = preferred;
    }
    
    /**
     * Return the word chosen by the user, or the typed word if no other word was chosen.
     * @return the preferred word
     */
    public CharSequence getPreferredWord() {
        return mPreferredWord != null ? mPreferredWord : getTypedWord();
    }

    /**
     * Returns true if more than one character is upper case, otherwise returns false.
     */