WordComposer.java revision 117fc18ed46496c81596f8207bba30a09c7317d1
1923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project/*
2443c360d0afdbab091994244f045f4756feaf2b4Jean-Baptiste Queru * Copyright (C) 2008 The Android Open Source Project
3923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project *
4923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of
6923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * the License at
7923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project *
8923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
9923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project *
10923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * License for the specific language governing permissions and limitations under
14923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * the License.
15923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project */
16923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
17923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectpackage com.android.inputmethod.latin;
18923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
19c83359f9746ca6f0269a1a7017b585c1a5cab9b8Jean Chalardimport com.android.inputmethod.keyboard.Keyboard;
20887f11ee43ad621aa6ad93d535ab7f48dec73fc7Tadashi G. Takaokaimport com.android.inputmethod.keyboard.KeyDetector;
21887f11ee43ad621aa6ad93d535ab7f48dec73fc7Tadashi G. Takaoka
22923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport java.util.ArrayList;
23c83359f9746ca6f0269a1a7017b585c1a5cab9b8Jean Chalardimport java.util.Arrays;
24923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
25923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project/**
26923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * A place to store the currently composing word with information such as adjacent key codes as well
27923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project */
28923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectpublic class WordComposer {
298fbd55229243cb66c03d5ea1f79dfb39f596590dsatok
30887f11ee43ad621aa6ad93d535ab7f48dec73fc7Tadashi G. Takaoka    public static final int NOT_A_CODE = KeyDetector.NOT_A_CODE;
318fbd55229243cb66c03d5ea1f79dfb39f596590dsatok    public static final int NOT_A_COORDINATE = -1;
32887f11ee43ad621aa6ad93d535ab7f48dec73fc7Tadashi G. Takaoka
33923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
34923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * The list of unicode values for each keystroke (including surrounding keys)
35923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     */
369fbfd5877305ed19a20663630b498b6b3fdae942satok    private ArrayList<int[]> mCodes;
378fbd55229243cb66c03d5ea1f79dfb39f596590dsatok
389fbfd5877305ed19a20663630b498b6b3fdae942satok    private int[] mXCoordinates;
399fbfd5877305ed19a20663630b498b6b3fdae942satok    private int[] mYCoordinates;
408fbd55229243cb66c03d5ea1f79dfb39f596590dsatok
419fbfd5877305ed19a20663630b498b6b3fdae942satok    private StringBuilder mTypedWord;
424a7ff90d513f8b6cbf39688c08be0828a57e311bAmith Yamasani
434a7ff90d513f8b6cbf39688c08be0828a57e311bAmith Yamasani    private int mCapsCount;
441c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani
451c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani    private boolean mAutoCapitalized;
46c83359f9746ca6f0269a1a7017b585c1a5cab9b8Jean Chalard    // Cache this value for performance
47117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard    private int mTrailingSingleQuotesCount;
48c83359f9746ca6f0269a1a7017b585c1a5cab9b8Jean Chalard
49923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
500b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa     * Whether the user chose to capitalize the first char of the word.
51923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     */
520b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa    private boolean mIsFirstCharCapitalized;
53923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
54979f8690967ff5409fe18f5085858ccdb8e0ccf1satok    public WordComposer() {
558fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        final int N = BinaryDictionary.MAX_WORD_LENGTH;
568fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        mCodes = new ArrayList<int[]>(N);
578fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        mTypedWord = new StringBuilder(N);
588fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        mXCoordinates = new int[N];
598fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        mYCoordinates = new int[N];
60117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard        mTrailingSingleQuotesCount = 0;
61923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
62923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
63f733074aaecdfd6e89cfee2daff8a9c1233b60f1satok    public WordComposer(WordComposer source) {
649fbfd5877305ed19a20663630b498b6b3fdae942satok        init(source);
659fbfd5877305ed19a20663630b498b6b3fdae942satok    }
669fbfd5877305ed19a20663630b498b6b3fdae942satok
679fbfd5877305ed19a20663630b498b6b3fdae942satok    public void init(WordComposer source) {
688fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        mCodes = new ArrayList<int[]>(source.mCodes);
698fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        mTypedWord = new StringBuilder(source.mTypedWord);
70c83359f9746ca6f0269a1a7017b585c1a5cab9b8Jean Chalard        mXCoordinates = Arrays.copyOf(source.mXCoordinates, source.mXCoordinates.length);
71c83359f9746ca6f0269a1a7017b585c1a5cab9b8Jean Chalard        mYCoordinates = Arrays.copyOf(source.mYCoordinates, source.mYCoordinates.length);
72ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        mCapsCount = source.mCapsCount;
73ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        mIsFirstCharCapitalized = source.mIsFirstCharCapitalized;
74ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        mAutoCapitalized = source.mAutoCapitalized;
75117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard        mTrailingSingleQuotesCount = source.mTrailingSingleQuotesCount;
76979f8690967ff5409fe18f5085858ccdb8e0ccf1satok    }
77979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
78923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
79923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * Clear out the keys registered so far.
80923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     */
81923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public void reset() {
82923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        mCodes.clear();
83923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        mTypedWord.setLength(0);
844a7ff90d513f8b6cbf39688c08be0828a57e311bAmith Yamasani        mCapsCount = 0;
85ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        mIsFirstCharCapitalized = false;
86117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard        mTrailingSingleQuotesCount = 0;
87923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
88923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
89923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
90923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * Number of keystrokes in the composing word.
91923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * @return the number of keystrokes
92923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     */
93ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka    public final int size() {
94ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        return mTypedWord.length();
95923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
96923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
97923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
98923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * Returns the codes at a particular position in the word.
99923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * @param index the position in the word
100923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * @return the unicode for the pressed and surrounding keys
101923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     */
102923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public int[] getCodesAt(int index) {
103923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        return mCodes.get(index);
104923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
105923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
1068fbd55229243cb66c03d5ea1f79dfb39f596590dsatok    public int[] getXCoordinates() {
1078fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        return mXCoordinates;
1088fbd55229243cb66c03d5ea1f79dfb39f596590dsatok    }
1098fbd55229243cb66c03d5ea1f79dfb39f596590dsatok
1108fbd55229243cb66c03d5ea1f79dfb39f596590dsatok    public int[] getYCoordinates() {
1118fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        return mYCoordinates;
1128fbd55229243cb66c03d5ea1f79dfb39f596590dsatok    }
1138fbd55229243cb66c03d5ea1f79dfb39f596590dsatok
114ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka    private static boolean isFirstCharCapitalized(int index, int codePoint, boolean previous) {
115ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        if (index == 0) return Character.isUpperCase(codePoint);
116436a645ea837d36f7e0f81948d343fa6e166f33aTadashi G. Takaoka        return previous && !Character.isUpperCase(codePoint);
117ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka    }
118ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka
119923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
120923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * Add a new keystroke, with codes[0] containing the pressed key's unicode and the rest of
121923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * the array containing unicode for adjacent keys, sorted by reducing probability/proximity.
122923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * @param codes the array of unicode values
123923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     */
1248fbd55229243cb66c03d5ea1f79dfb39f596590dsatok    public void add(int primaryCode, int[] codes, int x, int y) {
125ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        final int newIndex = size();
126923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        mTypedWord.append((char) primaryCode);
127231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani        correctPrimaryJuxtapos(primaryCode, codes);
128923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        mCodes.add(codes);
129ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        if (newIndex < BinaryDictionary.MAX_WORD_LENGTH) {
130ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka            mXCoordinates[newIndex] = x;
131ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka            mYCoordinates[newIndex] = y;
1328fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        }
133ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        mIsFirstCharCapitalized = isFirstCharCapitalized(
134ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka                newIndex, primaryCode, mIsFirstCharCapitalized);
135ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        if (Character.isUpperCase(primaryCode)) mCapsCount++;
136117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard        if (Keyboard.CODE_SINGLE_QUOTE == primaryCode) {
137117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard            ++mTrailingSingleQuotesCount;
138117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard        } else {
139117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard            mTrailingSingleQuotesCount = 0;
140117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard        }
141923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
142923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
143923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
144231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani     * Swaps the first and second values in the codes array if the primary code is not the first
145231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani     * value in the array but the second. This happens when the preferred key is not the key that
146231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani     * the user released the finger on.
147231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani     * @param primaryCode the preferred character
148231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani     * @param codes array of codes based on distance from touch point
149231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani     */
1508fbf29e2d54027a17993cd0d4ad486e3454b56f6Tadashi G. Takaoka    private static void correctPrimaryJuxtapos(int primaryCode, int[] codes) {
151231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani        if (codes.length < 2) return;
152231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani        if (codes[0] > 0 && codes[1] > 0 && codes[0] != primaryCode && codes[1] == primaryCode) {
153231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani            codes[1] = codes[0];
154231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani            codes[0] = primaryCode;
155231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani        }
156231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani    }
157231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani
158231cacd08075e88a2bcdf25f025206de524e880bAmith Yamasani    /**
159923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * Delete the last keystroke as a result of hitting backspace.
160923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     */
161923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public void deleteLast() {
162ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        final int size = size();
163ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        if (size > 0) {
164ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka            final int lastPos = size - 1;
165ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka            char lastChar = mTypedWord.charAt(lastPos);
166ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka            mCodes.remove(lastPos);
167d1a8e3088bb6267a31e3351d304796d1507e3af6Tadashi G. Takaoka            mTypedWord.deleteCharAt(lastPos);
168ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka            if (Character.isUpperCase(lastChar)) mCapsCount--;
169d1a8e3088bb6267a31e3351d304796d1507e3af6Tadashi G. Takaoka        }
170ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        if (size() == 0) {
171ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka            mIsFirstCharCapitalized = false;
172117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard        }
173117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard        if (mTrailingSingleQuotesCount > 0) {
174117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard            --mTrailingSingleQuotesCount;
175c83359f9746ca6f0269a1a7017b585c1a5cab9b8Jean Chalard        } else {
176117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard            for (int i = mTypedWord.length() - 1; i >= 0; --i) {
177117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard                if (Keyboard.CODE_SINGLE_QUOTE != mTypedWord.codePointAt(i)) break;
178117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard                ++mTrailingSingleQuotesCount;
179117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard            }
1808fbd55229243cb66c03d5ea1f79dfb39f596590dsatok        }
181923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
182923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
183923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
184923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * Returns the word as it was typed, without any correction applied.
185923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * @return the word that was typed so far
186923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     */
1875c08151c227d98031abe27c3f0a8f43a7126ae9dJean Chalard    public String getTypedWord() {
188ea843f2a2404f4bc04fda494e475520162cfca27Tadashi G. Takaoka        if (size() == 0) {
189923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project            return null;
190923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        }
1915c08151c227d98031abe27c3f0a8f43a7126ae9dJean Chalard        return mTypedWord.toString();
192923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
193923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
194923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
195923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * Whether or not the user typed a capital letter as the first letter in the word
196923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     * @return capitalization preference
197923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project     */
1980b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa    public boolean isFirstCharCapitalized() {
1990b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa        return mIsFirstCharCapitalized;
200923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
2010b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa
202117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard    public int trailingSingleQuotesCount() {
203117fc18ed46496c81596f8207bba30a09c7317d1Jean Chalard        return mTrailingSingleQuotesCount;
204c83359f9746ca6f0269a1a7017b585c1a5cab9b8Jean Chalard    }
205c83359f9746ca6f0269a1a7017b585c1a5cab9b8Jean Chalard
2060b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa    /**
2070b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa     * Whether or not all of the user typed chars are upper case
2080b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa     * @return true if all user typed chars are upper case, false otherwise
2090b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa     */
2100b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa    public boolean isAllUpperCase() {
2110b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa        return (mCapsCount > 0) && (mCapsCount == size());
2120b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa    }
2130b4ae1f578e768eec4ada90aeb81d11acb10eb2eKen Wakasa
214923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    /**
2154a7ff90d513f8b6cbf39688c08be0828a57e311bAmith Yamasani     * Returns true if more than one character is upper case, otherwise returns false.
2164a7ff90d513f8b6cbf39688c08be0828a57e311bAmith Yamasani     */
2174a7ff90d513f8b6cbf39688c08be0828a57e311bAmith Yamasani    public boolean isMostlyCaps() {
2184a7ff90d513f8b6cbf39688c08be0828a57e311bAmith Yamasani        return mCapsCount > 1;
2194a7ff90d513f8b6cbf39688c08be0828a57e311bAmith Yamasani    }
2201c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani
2211c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani    /**
2221c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani     * Saves the reason why the word is capitalized - whether it was automatic or
2231c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani     * due to the user hitting shift in the middle of a sentence.
2241c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani     * @param auto whether it was an automatic capitalization due to start of sentence
2251c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani     */
2261c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani    public void setAutoCapitalized(boolean auto) {
2271c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani        mAutoCapitalized = auto;
2281c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani    }
2291c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani
2301c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani    /**
2311c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani     * Returns whether the word was automatically capitalized.
2321c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani     * @return whether the word was automatically capitalized
2331c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani     */
2341c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani    public boolean isAutoCapitalized() {
2351c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani        return mAutoCapitalized;
2361c551251106e506c70fad7ba0cb8b1e2a7dff3a9Amith Yamasani    }
237923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project}
238