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