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