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 199318d33b6e501d4dd9ea860de04160ccb23a7501Ken Wakasaimport com.android.inputmethod.keyboard.Keyboard; 20b5d17e52fcda39d540822e615bfb7ed5074e0034satokimport com.android.inputmethod.latin.Utils.RingCharBuffer; 21b5d17e52fcda39d540822e615bfb7ed5074e0034satok 22923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectimport android.util.Log; 23923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 24923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectpublic class TextEntryState { 25662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final String TAG = TextEntryState.class.getSimpleName(); 26ab0ee37f52b87756c6d91aecd508fda821aeb4b6Tadashi G. Takaoka private static final boolean DEBUG = false; 27662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka 28662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int UNKNOWN = 0; 29662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int START = 1; 30662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int IN_WORD = 2; 31662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int ACCEPTED_DEFAULT = 3; 32662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int PICKED_SUGGESTION = 4; 33662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int PUNCTUATION_AFTER_WORD = 5; 34662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int PUNCTUATION_AFTER_ACCEPTED = 6; 35662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int SPACE_AFTER_ACCEPTED = 7; 36662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int SPACE_AFTER_PICKED = 8; 37662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int UNDO_COMMIT = 9; 38662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int RECORRECTING = 10; 39662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static final int PICKED_RECORRECTION = 11; 40662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka 41662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static int sState = UNKNOWN; 42662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static int sPreviousState = UNKNOWN; 43662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka 44662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static void setState(final int newState) { 45662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sPreviousState = sState; 46662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sState = newState; 47c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani } 48c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani 49b5d17e52fcda39d540822e615bfb7ed5074e0034satok public static void acceptedDefault(CharSequence typedWord, CharSequence actualWord, 50b5d17e52fcda39d540822e615bfb7ed5074e0034satok int separatorCode) { 513f7d75060afb2bb7e74879bcbbdcb9700ec5c2d6Amith Yamasani if (typedWord == null) return; 52662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(ACCEPTED_DEFAULT); 53b5d17e52fcda39d540822e615bfb7ed5074e0034satok LatinImeLogger.logOnAutoCorrection( 54b5d17e52fcda39d540822e615bfb7ed5074e0034satok typedWord.toString(), actualWord.toString(), separatorCode); 55662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (DEBUG) 56662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka displayState("acceptedDefault", "typedWord", typedWord, "actualWord", actualWord); 57923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 58352f8bc9a3b4348fa1dc8e7abb1407cc34a298c5satok 59c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani // State.ACCEPTED_DEFAULT will be changed to other sub-states 60c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani // (see "case ACCEPTED_DEFAULT" in typedCharacter() below), 61c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani // and should be restored back to State.ACCEPTED_DEFAULT after processing for each sub-state. 62ac108d5b341f484d48009ba0e90524569bab84f2satok public static void backToAcceptedDefault(CharSequence typedWord) { 63ac108d5b341f484d48009ba0e90524569bab84f2satok if (typedWord == null) return; 64352f8bc9a3b4348fa1dc8e7abb1407cc34a298c5satok switch (sState) { 65e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka case SPACE_AFTER_ACCEPTED: 66e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka case PUNCTUATION_AFTER_ACCEPTED: 67e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka case IN_WORD: 68662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(ACCEPTED_DEFAULT); 69e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka break; 70e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka default: 71e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka break; 72352f8bc9a3b4348fa1dc8e7abb1407cc34a298c5satok } 73662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (DEBUG) displayState("backToAcceptedDefault", "typedWord", typedWord); 74352f8bc9a3b4348fa1dc8e7abb1407cc34a298c5satok } 75352f8bc9a3b4348fa1dc8e7abb1407cc34a298c5satok 76662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka public static void acceptedTyped(CharSequence typedWord) { 77662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(PICKED_SUGGESTION); 78662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (DEBUG) displayState("acceptedTyped", "typedWord", typedWord); 79923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 80923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 81923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public static void acceptedSuggestion(CharSequence typedWord, CharSequence actualWord) { 82662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (sState == RECORRECTING || sState == PICKED_RECORRECTION) { 83662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(PICKED_RECORRECTION); 84c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani } else { 85662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(PICKED_SUGGESTION); 86c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani } 87662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (DEBUG) 88662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka displayState("acceptedSuggestion", "typedWord", typedWord, "actualWord", actualWord); 89923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 90a62f7c18f9cb8feb179bd865fc9caa65cfc80b4aAmith Yamasani 91952cb7e973bbc4c09728cb5967505f84c80c8bd6Ken Wakasa public static void selectedForRecorrection() { 92662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(RECORRECTING); 93662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (DEBUG) displayState("selectedForRecorrection"); 94a62f7c18f9cb8feb179bd865fc9caa65cfc80b4aAmith Yamasani } 95a62f7c18f9cb8feb179bd865fc9caa65cfc80b4aAmith Yamasani 96952cb7e973bbc4c09728cb5967505f84c80c8bd6Ken Wakasa public static void onAbortRecorrection() { 97662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (sState == RECORRECTING || sState == PICKED_RECORRECTION) { 98662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(START); 99ca26f20fa4903de46e374babbfba8c8a1a5cac93satok } 100662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (DEBUG) displayState("onAbortRecorrection"); 101ca26f20fa4903de46e374babbfba8c8a1a5cac93satok } 102ca26f20fa4903de46e374babbfba8c8a1a5cac93satok 103b5d17e52fcda39d540822e615bfb7ed5074e0034satok public static void typedCharacter(char c, boolean isSeparator, int x, int y) { 1049318d33b6e501d4dd9ea860de04160ccb23a7501Ken Wakasa final boolean isSpace = (c == Keyboard.CODE_SPACE); 105923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project switch (sState) { 106662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case IN_WORD: 107662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (isSpace || isSeparator) { 108662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(START); 109662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } else { 110662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka // State hasn't changed. 111662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } 112662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka break; 113662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case ACCEPTED_DEFAULT: 114662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case SPACE_AFTER_PICKED: 115424f6ec2bcdfad53f571aa72f2979a0ba30d3ca2Tadashi G. Takaoka case PUNCTUATION_AFTER_ACCEPTED: 116662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (isSpace) { 117662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(SPACE_AFTER_ACCEPTED); 118662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } else if (isSeparator) { 119662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka // Swap 120662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(PUNCTUATION_AFTER_ACCEPTED); 121662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } else { 122662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(IN_WORD); 123662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } 124662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka break; 125662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case PICKED_SUGGESTION: 126662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case PICKED_RECORRECTION: 127662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (isSpace) { 128662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(SPACE_AFTER_PICKED); 129662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } else if (isSeparator) { 130662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka // Swap 131662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(PUNCTUATION_AFTER_ACCEPTED); 132662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } else { 133662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(IN_WORD); 134662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } 135662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka break; 136662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case START: 137662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case UNKNOWN: 138662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case SPACE_AFTER_ACCEPTED: 139662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case PUNCTUATION_AFTER_WORD: 140662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (!isSpace && !isSeparator) { 141662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(IN_WORD); 142662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } else { 143662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(START); 144662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } 145662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka break; 146662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case UNDO_COMMIT: 147662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (isSpace || isSeparator) { 1489ae24750f462cbd94b362fe54a952c86cfb05e5fKen Wakasa setState(START); 149662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } else { 150662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(IN_WORD); 151662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } 152662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka break; 153662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case RECORRECTING: 154662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(START); 155662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka break; 156923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 157b5d17e52fcda39d540822e615bfb7ed5074e0034satok RingCharBuffer.getInstance().push(c, x, y); 158b5d17e52fcda39d540822e615bfb7ed5074e0034satok if (isSeparator) { 159b5d17e52fcda39d540822e615bfb7ed5074e0034satok LatinImeLogger.logOnInputSeparator(); 160b5d17e52fcda39d540822e615bfb7ed5074e0034satok } else { 161b5d17e52fcda39d540822e615bfb7ed5074e0034satok LatinImeLogger.logOnInputChar(); 162b5d17e52fcda39d540822e615bfb7ed5074e0034satok } 163662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (DEBUG) displayState("typedCharacter", "char", c, "isSeparator", isSeparator); 164923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 165923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project 166923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public static void backspace() { 167662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (sState == ACCEPTED_DEFAULT) { 168662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(UNDO_COMMIT); 169b5d17e52fcda39d540822e615bfb7ed5074e0034satok LatinImeLogger.logOnAutoCorrectionCancelled(); 170662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } else if (sState == UNDO_COMMIT) { 171662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(IN_WORD); 172923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 173662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (DEBUG) displayState("backspace"); 174923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 175c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani 176923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project public static void reset() { 177662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka setState(START); 178662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka if (DEBUG) displayState("reset"); 179923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 180c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani 181662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka public static boolean isAcceptedDefault() { 182662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka return sState == ACCEPTED_DEFAULT; 183923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 184a62f7c18f9cb8feb179bd865fc9caa65cfc80b4aAmith Yamasani 185662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka public static boolean isSpaceAfterPicked() { 186662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka return sState == SPACE_AFTER_PICKED; 187a62f7c18f9cb8feb179bd865fc9caa65cfc80b4aAmith Yamasani } 188a62f7c18f9cb8feb179bd865fc9caa65cfc80b4aAmith Yamasani 189662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka public static boolean isUndoCommit() { 190662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka return sState == UNDO_COMMIT; 191662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } 192662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka 193662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka public static boolean isPunctuationAfterAccepted() { 194662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka return sState == PUNCTUATION_AFTER_ACCEPTED; 195662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } 196662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka 197662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka public static boolean isRecorrecting() { 198662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka return sState == RECORRECTING || sState == PICKED_RECORRECTION; 199662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } 200662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka 201662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka public static String getState() { 202662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka return stateName(sState); 203662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka } 204662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka 205662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static String stateName(int state) { 206662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka switch (state) { 207662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case START: return "START"; 208662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case IN_WORD: return "IN_WORD"; 209662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case ACCEPTED_DEFAULT: return "ACCEPTED_DEFAULT"; 210662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case PICKED_SUGGESTION: return "PICKED_SUGGESTION"; 211662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case PUNCTUATION_AFTER_WORD: return "PUNCTUATION_AFTER_WORD"; 212662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case PUNCTUATION_AFTER_ACCEPTED: return "PUNCTUATION_AFTER_ACCEPTED"; 213662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case SPACE_AFTER_ACCEPTED: return "SPACE_AFTER_ACCEPTED"; 214662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case SPACE_AFTER_PICKED: return "SPACE_AFTER_PICKED"; 215662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case UNDO_COMMIT: return "UNDO_COMMIT"; 216662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case RECORRECTING: return "RECORRECTING"; 217662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka case PICKED_RECORRECTION: return "PICKED_RECORRECTION"; 218662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka default: return "UNKNOWN"; 219923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 220923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project } 221c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani 222662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka private static void displayState(String title, Object ... args) { 223662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka final StringBuilder sb = new StringBuilder(title); 224662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sb.append(':'); 225662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka for (int i = 0; i < args.length; i += 2) { 226662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sb.append(' '); 227662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sb.append(args[i]); 228662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sb.append('='); 229662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sb.append(args[i+1].toString()); 230c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani } 231662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sb.append(" state="); 232662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sb.append(stateName(sState)); 233662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sb.append(" previous="); 234662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka sb.append(stateName(sPreviousState)); 235662bb7c26cadd5026cb3d4e5d081aae163bd5a3aTadashi G. Takaoka Log.d(TAG, sb.toString()); 236c20c5a8d4c29f52075a157098cf8d7192a45ac36Amith Yamasani } 237923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project} 238