1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
3053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
4053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * you may not use this file except in compliance with the License.
6053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * You may obtain a copy of the License at
7053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
8053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
10053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * See the License for the specific language governing permissions and
14053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * limitations under the License.
15053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
16053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
17053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpackage jp.co.omronsoft.openwnn;
18053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
19053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport jp.co.omronsoft.openwnn.EN.OpenWnnEngineEN;
21e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport jp.co.omronsoft.openwnn.JAJP.*;
22053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.SharedPreferences;
23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.Context;
2459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.content.Intent;
25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.res.Configuration;
26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.os.Handler;
27e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.os.Message;
28053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.preference.PreferenceManager;
29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.SpannableStringBuilder;
30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.Spanned;
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.style.BackgroundColorSpan;
32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.style.CharacterStyle;
33e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.style.ForegroundColorSpan;
34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.style.UnderlineSpan;
35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.util.Log;
36053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.KeyEvent;
37053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.inputmethod.EditorInfo;
3859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.view.inputmethod.InputConnection;
39e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.view.MotionEvent;
40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.View;
41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.KeyCharacterMap;
42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.method.MetaKeyKeyListener;
43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
4459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport jp.co.omronsoft.openwnn.BaseInputView;
4559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport jp.co.omronsoft.openwnn.OpenWnnControlPanelJAJP;
4659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
4759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport java.util.HashMap;
48053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport java.util.regex.Pattern;
49053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport java.util.regex.Matcher;
50053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/**
523feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * The OpenWnn Japanese IME class
53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
5459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
55053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpublic class OpenWnnJAJP extends OpenWnn {
57053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
583feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * Mode of the convert engine (Full-width KATAKANA).
597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Use with {@code OpenWnn.CHANGE_MODE} event.
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int ENGINE_MODE_FULL_KATAKANA = 101;
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Mode of the convert engine (Half-width KATAKANA).
657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Use with {@code OpenWnn.CHANGE_MODE} event.
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int ENGINE_MODE_HALF_KATAKANA = 102;
68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Mode of the convert engine (EISU-KANA conversion).
717b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Use with {@code OpenWnn.CHANGE_MODE} event.
72053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
73053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int ENGINE_MODE_EISU_KANA = 103;
74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
76053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Mode of the convert engine (Symbol list).
777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Use with {@code OpenWnn.CHANGE_MODE} event.
78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
7959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public static final int ENGINE_MODE_SYMBOL_NONE     = 1040;
8059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public static final int ENGINE_MODE_SYMBOL          = 1041;
8159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public static final int ENGINE_MODE_SYMBOL_KAO_MOJI = 1042;
82053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
84053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Mode of the convert engine (Keyboard type is QWERTY).
857b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Use with {@code OpenWnn.CHANGE_MODE} event to change ambiguous searching pattern.
86053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int ENGINE_MODE_OPT_TYPE_QWERTY = 105;
88053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Mode of the convert engine (Keyboard type is 12-keys).
917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Use with {@code OpenWnn.CHANGE_MODE} event to change ambiguous searching pattern.
92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int ENGINE_MODE_OPT_TYPE_12KEY = 106;
94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
957b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Never move cursor in to the composing text (adapting to IMF's specification change) */
967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final boolean FIX_CURSOR_TEXT_END = true;
977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
987b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Highlight color style for the converted clause */
997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final CharacterStyle SPAN_CONVERT_BGCOLOR_HL   = new BackgroundColorSpan(0xFF8888FF);
1007b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Highlight color style for the selected string  */
1017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final CharacterStyle SPAN_EXACT_BGCOLOR_HL     = new BackgroundColorSpan(0xFF66CDAA);
1027b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Highlight color style for EISU-KANA conversion */
1037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final CharacterStyle SPAN_EISUKANA_BGCOLOR_HL  = new BackgroundColorSpan(0xFF9FB6CD);
1047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Highlight color style for the composing text */
1057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final CharacterStyle SPAN_REMAIN_BGCOLOR_HL    = new BackgroundColorSpan(0xFFF0FFFF);
106e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Highlight text color */
107e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final CharacterStyle SPAN_TEXTCOLOR  = new ForegroundColorSpan(0xFF000000);
1087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Underline style for the composing text */
1097b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final CharacterStyle SPAN_UNDERLINE            = new UnderlineSpan();
1107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** IME's status for {@code mStatus} input/no candidates). */
1127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final int STATUS_INIT            = 0x0000;
1137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** IME's status for {@code mStatus}(input characters). */
1147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final int STATUS_INPUT           = 0x0001;
1157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** IME's status for {@code mStatus}(input functional keys). */
116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int STATUS_INPUT_EDIT      = 0x0003;
1177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** IME's status for {@code mStatus}(all candidates are displayed). */
118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int STATUS_CANDIDATE_FULL  = 0x0010;
119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
120e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Alphabet-last pattern */
121e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final Pattern ENGLISH_CHARACTER_LAST = Pattern.compile(".*[a-zA-Z]$");
122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     *  Private area character code got by {@link KeyEvent#getUnicodeChar()}.
1257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     *   (SHIFT+ALT+X G1 specific)
126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int PRIVATE_AREA_CODE = 61184;
128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Maximum length of input string */
130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int LIMIT_INPUT_NUMBER = 30;
131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Bit flag for English auto commit mode (ON) */
1337b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final int AUTO_COMMIT_ENGLISH_ON      = 0x0000;
134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Bit flag for English auto commit mode (OFF) */
1357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private static final int AUTO_COMMIT_ENGLISH_OFF     = 0x0001;
136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Bit flag for English auto commit mode (symbol list) */
137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int AUTO_COMMIT_ENGLISH_SYMBOL  = 0x0010;
138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
139e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Message for {@code mHandler} (execute prediction) */
140e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int MSG_PREDICTION = 0;
141e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
142e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Message for {@code mHandler} (execute tutorial) */
143e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int MSG_START_TUTORIAL = 1;
144e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
145e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Message for {@code mHandler} (close) */
146e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int MSG_CLOSE = 2;
147e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
148e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Delay time(msec.) to start prediction after key input when the candidates view is not shown. */
149e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int PREDICTION_DELAY_MS_1ST = 200;
150e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
151e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Delay time(msec.) to start prediction after key input when the candidates view is shown. */
152e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int PREDICTION_DELAY_MS_SHOWING_CANDIDATE = 200;
1533fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
15459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** H/W 12Keyboard keycode replace table */
15559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final HashMap<Integer, Integer> HW12KEYBOARD_KEYCODE_REPLACE_TABLE
15659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            = new HashMap<Integer, Integer>() {{
15759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_0, DefaultSoftKeyboard.KEYCODE_JP12_0);
15859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_1, DefaultSoftKeyboard.KEYCODE_JP12_1);
15959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_2, DefaultSoftKeyboard.KEYCODE_JP12_2);
16059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_3, DefaultSoftKeyboard.KEYCODE_JP12_3);
16159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_4, DefaultSoftKeyboard.KEYCODE_JP12_4);
16259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_5, DefaultSoftKeyboard.KEYCODE_JP12_5);
16359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_6, DefaultSoftKeyboard.KEYCODE_JP12_6);
16459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_7, DefaultSoftKeyboard.KEYCODE_JP12_7);
16559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_8, DefaultSoftKeyboard.KEYCODE_JP12_8);
16659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_9, DefaultSoftKeyboard.KEYCODE_JP12_9);
16759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_POUND, DefaultSoftKeyboard.KEYCODE_JP12_SHARP);
16859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_STAR, DefaultSoftKeyboard.KEYCODE_JP12_ASTER);
16959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma          put(KeyEvent.KEYCODE_CALL, DefaultSoftKeyboard.KEYCODE_JP12_REVERSE);
17059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }};
17159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Convert engine's state */
174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private class EngineState {
1757b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.*} (invalid) */
176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int INVALID = -1;
177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.dictionarySet} (Japanese) */
179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int DICTIONARYSET_JP = 0;
180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.dictionarySet} (English) */
182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int DICTIONARYSET_EN = 1;
183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1847b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.convertType} (prediction/no conversion) */
185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int CONVERT_TYPE_NONE = 0;
186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1877b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.convertType} (consecutive clause conversion) */
188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int CONVERT_TYPE_RENBUN = 1;
189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.convertType} (EISU-KANA conversion) */
191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int CONVERT_TYPE_EISU_KANA = 2;
192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.temporaryMode} (change back to the normal dictionary) */
194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int TEMPORARY_DICTIONARY_MODE_NONE = 0;
195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.temporaryMode} (change to the symbol dictionary) */
197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int TEMPORARY_DICTIONARY_MODE_SYMBOL = 1;
198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.temporaryMode} (change to the user dictionary) */
200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int TEMPORARY_DICTIONARY_MODE_USER = 2;
201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2027b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.preferenceDictionary} (no preference dictionary) */
203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int PREFERENCE_DICTIONARY_NONE = 0;
204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.preferenceDictionary} (person's name) */
206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int PREFERENCE_DICTIONARY_PERSON_NAME = 1;
207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.preferenceDictionary} (place name) */
209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int PREFERENCE_DICTIONARY_POSTAL_ADDRESS = 2;
210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.preferenceDictionary} (email/URI) */
212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int PREFERENCE_DICTIONARY_EMAIL_ADDRESS_URI = 3;
213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.keyboard} (undefined) */
215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int KEYBOARD_UNDEF = 0;
216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.keyboard} (QWERTY) */
218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int KEYBOARD_QWERTY = 1;
219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /** Definition for {@code EngineState.keyboard} (12-keys) */
221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public static final int KEYBOARD_12KEY  = 2;
222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /** Set of dictionaries */
224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public int dictionarySet = INVALID;
225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /** Type of conversion */
227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public int convertType = INVALID;
228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /** Temporary mode */
230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public int temporaryMode = INVALID;
231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /** Preference dictionary setting */
233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public int preferenceDictionary = INVALID;
234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /** keyboard */
236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public int keyboard = INVALID;
237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /**
239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project         * Returns whether current type of conversion is consecutive clause(RENBUNSETSU) conversion.
2403fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng         *
2417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa         * @return {@code true} if current type of conversion is consecutive clause conversion.
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project         */
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public boolean isRenbun() {
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return convertType == CONVERT_TYPE_RENBUN;
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /**
248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project         * Returns whether current type of conversion is EISU-KANA conversion.
2493fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng         *
2507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa         * @return {@code true} if current type of conversion is EISU-KANA conversion.
251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project         */
252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public boolean isEisuKana() {
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return convertType == CONVERT_TYPE_EISU_KANA;
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /**
257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project         * Returns whether current type of conversion is no conversion.
2583fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng         *
2597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa         * @return {@code true} if no conversion is executed currently.
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project         */
261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public boolean isConvertState() {
262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return convertType != CONVERT_TYPE_NONE;
263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /**
266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project         * Check whether or not the mode is "symbol list".
2673fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng         *
2687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa         * @return {@code true} if the mode is "symbol list".
269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project         */
270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        public boolean isSymbolList() {
271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return temporaryMode == TEMPORARY_DICTIONARY_MODE_SYMBOL;
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
2747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /**
2757b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa         * Check whether or not the current language is English.
2763fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng         *
2777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa         * @return {@code true} if the current language is English.
2787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa         */
2797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        public boolean isEnglish() {
2807b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            return dictionarySet == DICTIONARYSET_EN;
2817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** IME's status */
285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected int mStatus = STATUS_INIT;
286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Whether exact match searching or not */
288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected boolean mExactMatchMode = false;
289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2903feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** Spannable string builder for displaying the composing text */
291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected SpannableStringBuilder mDisplayText;
292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Instance of this service */
294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static OpenWnnJAJP mSelf = null;
295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Backup for switching the converter */
297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private WnnEngine mConverterBack;
298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Backup for switching the pre-converter */
300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private LetterConverter mPreConverterBack;
301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** OpenWnn conversion engine for Japanese */
303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private OpenWnnEngineJAJP mConverterJAJP;
304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** OpenWnn conversion engine for English */
306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private OpenWnnEngineEN mConverterEN;
307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Conversion engine for listing symbols */
309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private SymbolList mConverterSymbolEngineBack;
310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Symbol lists to display when the symbol key is pressed */
312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final String[] SYMBOL_LISTS = {
31359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        SymbolList.SYMBOL_JAPANESE, SymbolList.SYMBOL_JAPANESE_FACE
314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    };
315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Current symbol list */
31759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mCurrentSymbol = -1;
318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Romaji-to-Kana converter (HIRAGANA) */
320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private Romkan mPreConverterHiragana;
321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Romaji-to-Kana converter (full-width KATAKANA) */
323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private RomkanFullKatakana mPreConverterFullKatakana;
324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Romaji-to-Kana converter (half-width KATAKANA) */
326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private RomkanHalfKatakana mPreConverterHalfKatakana;
327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Conversion Engine's state */
329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private EngineState mEngineState = new EngineState();
330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Whether learning function is active of not. */
332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mEnableLearning = true;
333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Whether prediction is active or not. */
335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mEnablePrediction = true;
336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
3377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Whether using the converter */
3387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean mEnableConverter = true;
3397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
3407b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Whether displaying the symbol list */
3417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean mEnableSymbolList = true;
3427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
343e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Whether non ASCII code is enabled */
344e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private boolean mEnableSymbolListNonHalf = true;
345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
3467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Enable mistyping spell correction or not */
3477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean mEnableSpellCorrection = true;
3487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
3497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Auto commit state (in English mode) */
350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mDisableAutoCommitEnglishMask = AUTO_COMMIT_ENGLISH_ON;
351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Whether removing a space before a separator or not. (in English mode) */
353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mEnableAutoDeleteSpace = false;
354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
355e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Whether auto-spacing is enabled or not. */
356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mEnableAutoInsertSpace = true;
357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
358e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Whether dismissing the keyboard when the enter key is pressed */
359e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private boolean mEnableAutoHideKeyboard = true;
360e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Number of committed clauses on consecutive clause conversion */
362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mCommitCount = 0;
363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
3647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Target layer of the {@link ComposingText} */
365e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mTargetLayer = 1;
366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Current orientation of the display */
368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mOrientation = Configuration.ORIENTATION_UNDEFINED;
369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Current normal dictionary set */
371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mPrevDictionarySet = OpenWnnEngineJAJP.DIC_LANG_INIT;
372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Regular expression pattern for English separators */
374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private  Pattern mEnglishAutoCommitDelimiter = null;
375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
376e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Cursor position in the composing text */
377e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mComposingStartCursor = 0;
37877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
37977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    /** Cursor position before committing text */
38077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    private int mCommitStartCursor = 0;
38177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
38277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    /** Previous committed text */
38377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    private StringBuffer mPrevCommitText = null;
38477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
385e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Call count of {@code commitText} */
386e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mPrevCommitCount = 0;
387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Shift lock status of the Hardware keyboard */
389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mHardShift;
390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
3913feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** SHIFT key state (pressing) */
39277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    private boolean mShiftPressing;
3933feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
394e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** ALT lock status of the Hardware keyboard */
395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mHardAlt;
396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
3973feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** ALT key state (pressing) */
39877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    private boolean mAltPressing;
3993feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Shift lock toggle definition */
401053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int[] mShiftKeyToggle = {0, MetaKeyKeyListener.META_SHIFT_ON, MetaKeyKeyListener.META_CAP_LOCKED};
402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
403e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** ALT lock toggle definition */
404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int[] mAltKeyToggle = {0, MetaKeyKeyListener.META_ALT_ON, MetaKeyKeyListener.META_ALT_LOCKED};
405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Auto caps mode */
407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mAutoCaps = false;
408e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
409e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** List of words in the user dictionary */
410e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private WnnWord[] mUserDictionaryWords = null;
4113fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
412e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Tutorial */
413e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private TutorialJAJP mTutorial;
414e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
415e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Whether tutorial mode or not */
416e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private boolean mEnableTutorial;
417e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
418e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Whether there is a continued predicted candidate */
419e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private boolean mHasContinuedPrediction = false;
420e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
4212d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    /** Whether text selection has started */
4222d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    private boolean mHasStartedTextSelection = true;
4232d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa
42459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Whether the H/W 12keyboard is active or not. */
42559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean mEnableHardware12Keyboard = false;
42659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
427e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** {@code Handler} for drawing candidates/displaying tutorial */
428e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    Handler mHandler = new Handler() {
429e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            @Override
430e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public void handleMessage(Message msg) {
431e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                switch (msg.what) {
432e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                case MSG_PREDICTION:
433e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    updatePrediction();
434e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    break;
435e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                case MSG_START_TUTORIAL:
436e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (mTutorial == null) {
437e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        if (isInputViewShown()) {
438e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            DefaultSoftKeyboardJAJP inputManager = ((DefaultSoftKeyboardJAJP) mInputViewManager);
439e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            View v = inputManager.getKeyboardView();
440e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            mTutorial = new TutorialJAJP(OpenWnnJAJP.this, v, inputManager);
4413fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
442e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            mTutorial.start();
443e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        } else {
444e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            /* Try again soon if the view is not yet showing */
445e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            sendMessageDelayed(obtainMessage(MSG_START_TUTORIAL), 100);
446e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        }
447e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
448e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    break;
449e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                case MSG_CLOSE:
450e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (mConverterJAJP != null) mConverterJAJP.close();
451e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (mConverterEN != null) mConverterEN.close();
452e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (mConverterSymbolEngineBack != null) mConverterSymbolEngineBack.close();
453e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    break;
454e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
455e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
456e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        };
457e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
4587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** The candidate filter */
4597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private CandidateFilter mFilter;
460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
461053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
462053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
463053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
464053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public OpenWnnJAJP() {
465053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super();
466053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mSelf = this;
467053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mComposingText = new ComposingText();
4683feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        mCandidatesViewManager = new TextCandidatesViewManager(-1);
469053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputViewManager  = new DefaultSoftKeyboardJAJP();
47059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
47159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (OpenWnn.getCurrentIme() != null) {
47259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mConverter == null || mConverterJAJP == null) {
47359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mConverter = mConverterJAJP = new OpenWnnEngineJAJP("/data/data/jp.co.omronsoft.openwnn/writableJAJP.dic");
47459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
47559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mConverterEN == null) {
47659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic");
47759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
47859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
47959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mPreConverter = mPreConverterHiragana = new Romkan();
481053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mPreConverterFullKatakana = new RomkanFullKatakana();
482053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mPreConverterHalfKatakana = new RomkanHalfKatakana();
4837b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mFilter = new CandidateFilter();
484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDisplayText = new SpannableStringBuilder();
486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mAutoHideMode = false;
487053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
48877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        mPrevCommitText = new StringBuffer();
489053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
490053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
491053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
494053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param context       The context
495053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
496053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public OpenWnnJAJP(Context context) {
497053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        this();
498053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        attachBaseContext(context);
499053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
500053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
501053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.OpenWnn#onCreate */
502053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void onCreate() {
50359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        updateXLargeMode();
504053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.onCreate();
505053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
50659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mConverter == null || mConverterJAJP == null) {
50759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mConverter = mConverterJAJP = new OpenWnnEngineJAJP("/data/data/jp.co.omronsoft.openwnn/writableJAJP.dic");
50859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
50959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mConverterEN == null) {
51059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic");
51159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
51259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
513053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        String delimiter = Pattern.quote(getResources().getString(R.string.en_word_separators));
514053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mEnglishAutoCommitDelimiter = Pattern.compile(".*[" + delimiter + "]$");
515053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mConverterSymbolEngineBack == null) {
516053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverterSymbolEngineBack = new SymbolList(this, SymbolList.LANG_JA);
517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
518053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
519053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
520053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.OpenWnn#onCreateInputView */
521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public View onCreateInputView() {
52277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        int hiddenState = getResources().getConfiguration().hardKeyboardHidden;
52377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        boolean hidden = (hiddenState == Configuration.HARDKEYBOARDHIDDEN_YES);
52459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean type12Key
52559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                = (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_12KEY);
52677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        ((DefaultSoftKeyboardJAJP) mInputViewManager).setHardKeyboardHidden(hidden);
52759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        ((DefaultSoftKeyboard) mInputViewManager).setHardware12Keyboard(type12Key);
52859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mTextCandidatesViewManager.setHardKeyboardHidden(hidden);
529e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mEnableTutorial = hidden;
53059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mEnableHardware12Keyboard = type12Key;
531053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return super.onCreateInputView();
532053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
533053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
534053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.OpenWnn#onStartInputView */
535053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void onStartInputView(EditorInfo attribute, boolean restarting) {
536053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
53759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
5382d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        if (restarting) {
5392d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            super.onStartInputView(attribute, restarting);
5402d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        } else {
5412d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            EngineState state = new EngineState();
5422d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_NONE;
5432d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            updateEngineState(state);
544053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
5452d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mPrevCommitCount = 0;
5462d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            clearCommitInfo();
5473fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
5482d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            ((DefaultSoftKeyboard) mInputViewManager).resetCurrentKeyboard();
5493fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
5502d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            super.onStartInputView(attribute, restarting);
5513fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
55259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (OpenWnn.isXLarge()) {
55359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mTextCandidatesViewManager.setPreferences(pref);
55459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
55559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
5562d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mCandidatesViewManager.clearCandidates();
5572d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mStatus = STATUS_INIT;
5583fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng            mExactMatchMode = false;
559053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
5602d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            /* hardware keyboard support */
5612d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mHardShift = 0;
5622d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mHardAlt   = 0;
5632d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            updateMetaKeyStateDisplay();
5642d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        }
565053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
566053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* initialize the engine's state */
567053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        fitInputType(pref, attribute);
568053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
56959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (OpenWnn.isXLarge()) {
57059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mTextCandidates1LineViewManager.setAutoHide(true);
57159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
57259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            ((TextCandidatesViewManager)mCandidatesViewManager).setAutoHide(true);
57359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
57477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
57577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        if (isEnableL2Converter()) {
576e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            breakSequence();
57777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        }
578053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
579053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
5807b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see jp.co.omronsoft.openwnn.OpenWnn#hideWindow */
5817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    @Override public void hideWindow() {
58259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCandidatesViewManager.setCandidateMsgRemove();
58359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
58459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        BaseInputView baseInputView = ((BaseInputView)((DefaultSoftKeyboard) mInputViewManager).getCurrentView());
58559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (baseInputView != null) {
58659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            baseInputView.closeDialog();
58759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
5887b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mComposingText.clear();
5897b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mInputViewManager.onUpdateState(this);
59077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        clearCommitInfo();
591e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mHandler.removeMessages(MSG_START_TUTORIAL);
5927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mInputViewManager.closing();
593e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mTutorial != null) {
594e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mTutorial.close();
595e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mTutorial = null;
596e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
5977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
59859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (OpenWnn.isXLarge()) {
59959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mTextCandidates1LineViewManager.closeDialog();
60059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
60159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mTextCandidatesViewManager.closeDialog();
60259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
60359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
604e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        super.hideWindow();
605053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
606053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
607053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.OpenWnn#onUpdateSelection */
608053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void onUpdateSelection(int oldSelStart, int oldSelEnd, int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd) {
60977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
610e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mComposingStartCursor = (candidatesStart < 0) ? newSelEnd : candidatesStart;
611e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
6122d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        boolean prevSelection = mHasStartedTextSelection;
613e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (newSelStart != newSelEnd) {
614e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            clearCommitInfo();
6152d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mHasStartedTextSelection = true;
6162d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        } else {
6172d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mHasStartedTextSelection = false;
618e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
619e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
620e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mHasContinuedPrediction) {
621e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mHasContinuedPrediction = false;
622e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (0 < mPrevCommitCount) {
623e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mPrevCommitCount--;
624e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
625e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return;
626e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
62777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
62859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mEngineState.isSymbolList()) {
62959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return;
63059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
63159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
632e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        boolean isNotComposing = ((candidatesStart < 0) && (candidatesEnd < 0));
633e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if ((mComposingText.size(ComposingText.LAYER1) != 0)
634e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            && !isNotComposing) {
635053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateViewStatus(mTargetLayer, false, true);
63677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        } else {
637e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (0 < mPrevCommitCount) {
638e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mPrevCommitCount--;
639e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
640e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                int commitEnd = mCommitStartCursor + mPrevCommitText.length();
641e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if ((((newSelEnd < oldSelEnd) || (commitEnd < newSelEnd)) && clearCommitInfo())
642e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    || isNotComposing) {
643e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (isEnableL2Converter()) {
644e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        breakSequence();
645e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
64677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
647e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (mInputConnection != null) {
648e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        if (isNotComposing && (mComposingText.size(ComposingText.LAYER1) != 0)) {
649e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            mInputConnection.finishComposingText();
650e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        }
651e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
6522d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    if ((prevSelection != mHasStartedTextSelection) || !mHasStartedTextSelection) {
6532d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                        initializeScreen();
6542d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    }
655e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
65677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            }
657053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
658053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
659053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
660053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.OpenWnn#onConfigurationChanged */
661053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void onConfigurationChanged(Configuration newConfig) {
662053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        try {
663053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            super.onConfigurationChanged(newConfig);
6643fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
665053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mInputConnection != null) {
666053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (super.isInputViewShown()) {
667053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    updateViewStatus(mTargetLayer, true, true);
668053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
669053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
670053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* display orientation */
671053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mOrientation != newConfig.orientation) {
672053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mOrientation = newConfig.orientation;
673053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    commitConvertingText();
674053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    initializeScreen();
675053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
676053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
677053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* Hardware keyboard */
6787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                int hiddenState = newConfig.hardKeyboardHidden;
6797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                boolean hidden = (hiddenState == Configuration.HARDKEYBOARDHIDDEN_YES);
68059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                boolean type12Key = (newConfig.keyboard == Configuration.KEYBOARD_12KEY);
6817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                ((DefaultSoftKeyboardJAJP) mInputViewManager).setHardKeyboardHidden(hidden);
68259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                ((DefaultSoftKeyboard) mInputViewManager).setHardware12Keyboard(type12Key);
68359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mTextCandidatesViewManager.setHardKeyboardHidden(hidden);
684e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mEnableTutorial = hidden;
68559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mEnableHardware12Keyboard = type12Key;
686053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
687053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } catch (Exception ex) {
688053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* do nothing if an error occurs. */
689053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
690053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
691053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
692053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvent */
693053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override synchronized public boolean onEvent(OpenWnnEvent ev) {
694053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
695053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        EngineState state;
696053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
697053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* handling events which are valid when InputConnection is not active. */
698053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (ev.code) {
6993fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
7003feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        case OpenWnnEvent.KEYUP:
7013feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            onKeyUpEvent(ev.keyEvent);
7023feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            return true;
7033fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
70459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case OpenWnnEvent.KEYLONGPRESS:
70559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return onKeyLongPressEvent(ev.keyEvent);
70659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
707053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.INITIALIZE_LEARNING_DICTIONARY:
708053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverterEN.initializeDictionary(WnnEngine.DICTIONARY_TYPE_LEARN);
709053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverterJAJP.initializeDictionary(WnnEngine.DICTIONARY_TYPE_LEARN);
710053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
711053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
712053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.INITIALIZE_USER_DICTIONARY:
713053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return mConverterJAJP.initializeDictionary( WnnEngine.DICTIONARY_TYPE_USER );
714053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
715053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.LIST_WORDS_IN_USER_DICTIONARY:
716053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mUserDictionaryWords = mConverterJAJP.getUserDictionaryWords( );
717053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
718053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
719053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.GET_WORD:
720053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mUserDictionaryWords != null) {
721053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ev.word = mUserDictionaryWords[0];
722053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                for (int i = 0 ; i < mUserDictionaryWords.length - 1 ; i++) {
723053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mUserDictionaryWords[i] = mUserDictionaryWords[i + 1];
724053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
725053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mUserDictionaryWords[mUserDictionaryWords.length - 1] = null;
726053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mUserDictionaryWords[0] == null) {
727053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mUserDictionaryWords = null;
728053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
729053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return true;
730053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
731053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
732053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
733053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.ADD_WORD:
734053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverterJAJP.addWord(ev.word);
735053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
736053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
737053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.DELETE_WORD:
738053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverterJAJP.deleteWord(ev.word);
739053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
740053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
741053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.CHANGE_MODE:
742053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            changeEngineMode(ev.mode);
7433feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            if (!(ev.mode == ENGINE_MODE_SYMBOL || ev.mode == ENGINE_MODE_EISU_KANA)) {
74477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                initializeScreen();
7453feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            }
7463feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            return true;
7473feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
748053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.UPDATE_CANDIDATE:
7497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (mEngineState.isRenbun()) {
7507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mComposingText.setCursor(ComposingText.LAYER1,
7517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                                         mComposingText.toString(ComposingText.LAYER1).length());
7527b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mExactMatchMode = false;
7537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                updateViewStatusForPrediction(true, true);
7547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
7553feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                updateViewStatus(mTargetLayer, true, true);
7567b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
757053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
7587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
7597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        case OpenWnnEvent.CHANGE_INPUT_VIEW:
76077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            setInputView(onCreateInputView());
7617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            return true;
7627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
7637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        case OpenWnnEvent.CANDIDATE_VIEW_TOUCH:
7647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            boolean ret;
76577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            ret = ((TextCandidatesViewManager)mCandidatesViewManager).onTouchSync();
7667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            return ret;
7677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
768e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case OpenWnnEvent.TOUCH_OTHER_KEY:
769e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mStatus |= STATUS_INPUT_EDIT;
770e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return true;
771e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
77259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case OpenWnnEvent.CANDIDATE_VIEW_SCROLL_UP:
77359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
77459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                ((TextCandidatesViewManager) mCandidatesViewManager).setScrollUp();
77559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
77659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return true;
77759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
77859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case OpenWnnEvent.CANDIDATE_VIEW_SCROLL_DOWN:
77959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
78059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                ((TextCandidatesViewManager) mCandidatesViewManager).setScrollDown();
78159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
78259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return true;
78359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
78459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case OpenWnnEvent.CANDIDATE_VIEW_SCROLL_FULL_UP:
78559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
78659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                ((TextCandidatesViewManager) mCandidatesViewManager).setScrollFullUp();
78759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
78859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return true;
78959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
79059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case OpenWnnEvent.CANDIDATE_VIEW_SCROLL_FULL_DOWN:
79159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
79259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                ((TextCandidatesViewManager) mCandidatesViewManager).setScrollFullDown();
79359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
79459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return true;
79559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
79659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case OpenWnnEvent.FOCUS_CANDIDATE_START:
79759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return true;
79859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
79959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case OpenWnnEvent.FOCUS_CANDIDATE_END:
80059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mInputViewManager.onUpdateState(this);
80159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return true;
80259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
803053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
804053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
805053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
806053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
8077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        KeyEvent keyEvent = ev.keyEvent;
8087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        int keyCode = 0;
8097b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (keyEvent != null) {
8107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            keyCode = keyEvent.getKeyCode();
8117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
8123feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
8133feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        if (mDirectInputMode) {
8142d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            if (mInputConnection != null) {
8152d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                switch (ev.code) {
8162d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                case OpenWnnEvent.INPUT_SOFT_KEY:
8172d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    if (keyCode == KeyEvent.KEYCODE_ENTER) {
8182d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                        sendKeyChar('\n');
8192d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    } else {
8202d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                        mInputConnection.sendKeyEvent(keyEvent);
8212d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                        mInputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,
8222d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                                                                   keyEvent.getKeyCode()));
8232d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    }
8242d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    break;
8252d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                case OpenWnnEvent.INPUT_CHAR:
8262d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    sendKeyChar(ev.chars[0]);
8272d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    break;
8282d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                default:
8292d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    break;
8302d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                }
8313feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            }
8323feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
8333feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            /* return if InputConnection is not active */
8343feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            return false;
8353feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        }
8363fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
83759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mEngineState.isSymbolList()) {
83859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (keyEvent != null && keyEvent.isPrintingKey() && isTenKeyCode(keyCode) && !keyEvent.isNumLockOn()) {
83959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return false;
84059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
84159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            switch (keyCode) {
84259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_DEL:
84359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return false;
84459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
84559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_BACK:
84659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                initializeScreen();
84759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
84859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
84959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_DPAD_CENTER:
85059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_ENTER:
85159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_NUMPAD_ENTER:
85259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (mCandidatesViewManager.isFocusCandidate()) {
85359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mCandidatesViewManager.selectFocusCandidate();
85459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    return true;
85559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
85659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return false;
85759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
85859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_DPAD_LEFT:
85959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (mCandidatesViewManager.isFocusCandidate()) {
86059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    processLeftKeyEvent();
86159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    return true;
86259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
86359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return false;
86459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
86559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_DPAD_RIGHT:
86659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (mCandidatesViewManager.isFocusCandidate()) {
86759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    processRightKeyEvent();
86859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    return true;
86959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
87059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return false;
87159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
87259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_DPAD_DOWN:
87359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                processDownKeyEvent();
87459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
87559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
87659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_DPAD_UP:
87759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (mCandidatesViewManager.isFocusCandidate()) {
87859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    processUpKeyEvent();
87959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    return true;
88059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
88159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return false;
88259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
88359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_SPACE:
88459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (keyEvent != null) {
88559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (keyEvent.isShiftPressed()) {
88659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_UP));
88759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    } else if (keyEvent.isAltPressed()) {
88859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        if (keyEvent.getRepeatCount() == 0) {
88959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            switchSymbolList();
89059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        }
89159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    } else {
89259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_DOWN));
89359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
89459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
89559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
89659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
89759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_SYM:
89859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                switchSymbolList();
89959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
90059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
90159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_PAGE_UP:
90259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_UP));
90359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
90459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
90559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_PAGE_DOWN:
90659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_SCROLL_DOWN));
90759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
90859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
90959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_PICTSYMBOLS:
91059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (keyEvent != null) {
91159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (keyEvent.getRepeatCount() == 0) {
91259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        switchSymbolList();
91359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
91459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
91559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
91659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
91759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            default:
91859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
91959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
92059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if ((ev.code == OpenWnnEvent.INPUT_KEY) &&
92159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                (keyCode != KeyEvent.KEYCODE_SEARCH) &&
92259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                (keyCode != KeyEvent.KEYCODE_ALT_LEFT) &&
92359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                (keyCode != KeyEvent.KEYCODE_ALT_RIGHT) &&
92459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                (keyCode != KeyEvent.KEYCODE_SHIFT_LEFT) &&
92559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                (keyCode != KeyEvent.KEYCODE_SHIFT_RIGHT)) {
92659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                state = new EngineState();
92759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_NONE;
92859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                updateEngineState(state);
92959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
93059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
93159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
93277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        if (!((ev.code == OpenWnnEvent.COMMIT_COMPOSING_TEXT)
93377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa              || ((keyEvent != null)
93477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                  && ((keyCode == KeyEvent.KEYCODE_SHIFT_LEFT)
93577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                      || (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT)
93677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                      || (keyCode == KeyEvent.KEYCODE_ALT_LEFT)
93777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                      || (keyCode == KeyEvent.KEYCODE_ALT_RIGHT)
93877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                      || (keyEvent.isAltPressed() && (keyCode == KeyEvent.KEYCODE_SPACE)))))) {
93977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
94077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            clearCommitInfo();
9413fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng        }
9423fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
943053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* change back the dictionary if necessary */
944053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (!((ev.code == OpenWnnEvent.SELECT_CANDIDATE)
94577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa              || (ev.code == OpenWnnEvent.LIST_CANDIDATES_NORMAL)
94677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa              || (ev.code == OpenWnnEvent.LIST_CANDIDATES_FULL)
94777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa              || ((keyEvent != null)
94877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                  && ((keyCode == KeyEvent.KEYCODE_SHIFT_LEFT)
94977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                      ||(keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT)
95077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                      ||(keyCode == KeyEvent.KEYCODE_ALT_LEFT)
95177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                      ||(keyCode == KeyEvent.KEYCODE_ALT_RIGHT)
952e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                      ||(keyCode == KeyEvent.KEYCODE_BACK && mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL)
95377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                      ||(keyEvent.isAltPressed() && (keyCode == KeyEvent.KEYCODE_SPACE)))))) {
95477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
95577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            state = new EngineState();
95677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_NONE;
95777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            updateEngineState(state);
958053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
959053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
96059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if ((ev.code == OpenWnnEvent.INPUT_KEY) && processHardware12Keyboard(keyEvent)) {
96159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return true;
96259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
96359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
964053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (ev.code == OpenWnnEvent.LIST_CANDIDATES_FULL) {
965053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mStatus |= STATUS_CANDIDATE_FULL;
9667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_FULL);
96759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (!mEngineState.isSymbolList()) {
96859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mInputViewManager.hideInputView();
96959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
9707b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            return true;
9717b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else if (ev.code == OpenWnnEvent.LIST_CANDIDATES_NORMAL) {
9727b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mStatus &= ~STATUS_CANDIDATE_FULL;
9737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL);
97459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mInputViewManager.showInputView();
975053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
976053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
977053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
978053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        boolean ret = false;
979053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (ev.code) {
980053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.INPUT_CHAR:
9817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if ((mPreConverter == null) && !isEnableL2Converter()) {
982053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* direct input (= full-width alphabet/number input) */
983053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                commitText(false);
984053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                commitText(new String(ev.chars));
985053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mCandidatesViewManager.clearCandidates();
9867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else if (!isEnableL2Converter()) {
987053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                processSoftKeyboardCodeWithoutConversion(ev.chars);
988053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
989053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                processSoftKeyboardCode(ev.chars);
990053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
991053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = true;
992053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
993053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
994053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.TOGGLE_CHAR:
995053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            processSoftKeyboardToggleChar(ev.toggleTable);
996053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = true;
997053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
998053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
999053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.TOGGLE_REVERSE_CHAR:
10003feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            if (((mStatus & ~STATUS_CANDIDATE_FULL) == STATUS_INPUT)
10012d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                && !(mEngineState.isConvertState()) && (ev.toggleTable != null)) {
1002053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1003053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                int cursor = mComposingText.getCursor(ComposingText.LAYER1);
1004053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (cursor > 0) {
1005053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    String prevChar = mComposingText.getStrSegment(ComposingText.LAYER1, cursor - 1).string;
1006053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    String c = searchToggleCharacter(prevChar, ev.toggleTable, true);
1007053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (c != null) {
1008053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        mComposingText.delete(ComposingText.LAYER1, false);
1009053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        appendStrSegment(new StrSegment(c));
1010053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        updateViewStatusForPrediction(true, true);
1011053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        ret = true;
1012053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        break;
1013053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1014053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1015053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1016053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1017053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1018053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.REPLACE_CHAR:
1019053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int cursor = mComposingText.getCursor(ComposingText.LAYER1);
1020053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if ((cursor > 0)
1021053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                && !(mEngineState.isConvertState())) {
1022053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1023053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                String search = mComposingText.getStrSegment(ComposingText.LAYER1, cursor - 1).string;
1024053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                String c = (String)ev.replaceTable.get(search);
1025053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (c != null) {
1026053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mComposingText.delete(1, false);
1027053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    appendStrSegment(new StrSegment(c));
1028053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    updateViewStatusForPrediction(true, true);
1029053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    ret = true;
1030053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mStatus = STATUS_INPUT_EDIT;
1031053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
1032053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1033053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1034053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1035053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1036053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.INPUT_KEY:
1037053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* update shift/alt state */
1038053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            switch (keyCode) {
1039e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            case KeyEvent.KEYCODE_DPAD_DOWN:
1040e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            case KeyEvent.KEYCODE_DPAD_LEFT:
1041e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            case KeyEvent.KEYCODE_DPAD_RIGHT:
1042e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            case KeyEvent.KEYCODE_DPAD_UP:
1043e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mTutorial != null) {
1044e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    return true;
1045e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
1046e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                break;
10473fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
1048053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_ALT_LEFT:
1049053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_ALT_RIGHT:
10507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                if (keyEvent.getRepeatCount() == 0) {
1051053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (++mHardAlt > 2) { mHardAlt = 0; }
1052053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
10533feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                mAltPressing   = true;
1054053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                updateMetaKeyStateDisplay();
105559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return false;
1056053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1057053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_SHIFT_LEFT:
1058053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_SHIFT_RIGHT:
10597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                if (keyEvent.getRepeatCount() == 0) {
1060053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (++mHardShift > 2) { mHardShift = 0; }
1061053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
10623feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                mShiftPressing = true;
1063053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                updateMetaKeyStateDisplay();
106459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return false;
1065053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1066053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1067053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* handle other key event */
10687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            ret = processKeyEvent(keyEvent);
1069053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1070053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1071053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.INPUT_SOFT_KEY:
10727b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            ret = processKeyEvent(keyEvent);
1073053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (!ret) {
10742d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                int code = keyEvent.getKeyCode();
10752d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                if (code == KeyEvent.KEYCODE_ENTER) {
10760470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa                    sendKeyChar('\n');
10772d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                } else {
10780470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa                    mInputConnection.sendKeyEvent(keyEvent);
10790470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa                    mInputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, code));
10802d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                }
1081053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ret = true;
1082053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1083053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1084053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1085053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.SELECT_CANDIDATE:
1086e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            initCommitInfoForWatchCursor();
1087053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (isEnglishPrediction()) {
1088053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mComposingText.clear();
1089053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1090053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mStatus = commitText(ev.word);
1091e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (isEnglishPrediction() && !mEngineState.isSymbolList() && mEnableAutoInsertSpace) {
1092e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                commitSpaceJustOne();
109377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            }
1094e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            checkCommitInfo();
109577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
109677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            if (mEngineState.isSymbolList()) {
109777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                mEnableAutoDeleteSpace = false;
109877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            }
1099053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
11013fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng        case OpenWnnEvent.CONVERT:
110259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mEngineState.isRenbun()) {
110359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
110459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (!mCandidatesViewManager.isFocusCandidate()) {
110559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        processDownKeyEvent();
110659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
110759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    processRightKeyEvent();
110859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                } else {
110959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
111059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
111159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                break;
111259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
1113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            startConvert(EngineState.CONVERT_TYPE_RENBUN);
1114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.COMMIT_COMPOSING_TEXT:
11177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            commitAllText();
1118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ret;
1122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvaluateFullscreenMode */
1125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public boolean onEvaluateFullscreenMode() {
1126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* never use full-screen mode */
1127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return false;
1128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvaluateInputViewShown */
1131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public boolean onEvaluateInputViewShown() {
1132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return true;
1133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Get the instance of this service.
1137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * <br>
1138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Before using this method, the constructor of this service must be invoked.
1139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
1140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @return      The instance of this service
1141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static OpenWnnJAJP getInstance() {
1143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return mSelf;
1144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
11477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Create a {@link StrSegment} from a character code.
1148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * <br>
114977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param charCode           A character code
115077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return                  {@link StrSegment} created; {@code null} if an error occurs.
1151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private StrSegment createStrSegment(int charCode) {
1153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (charCode == 0) {
1154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return null;
1155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return new StrSegment(Character.toChars(charCode));
1157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Key event handler.
1161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
116277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param ev        A key event
116377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return  {@code true} if the event is handled in this method.
1164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean processKeyEvent(KeyEvent ev) {
1166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int key = ev.getKeyCode();
1167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* keys which produce a glyph */
1169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (ev.isPrintingKey()) {
117059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (isTenKeyCode(key) && !ev.isNumLockOn()) {
117159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return false;
117259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
117359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (ev.isCtrlPressed()){
117459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (key == KeyEvent.KEYCODE_A || key == KeyEvent.KEYCODE_F || key == KeyEvent.KEYCODE_C ||
117559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    key == KeyEvent.KEYCODE_V || key == KeyEvent.KEYCODE_X || key == KeyEvent.KEYCODE_Z) {
117659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mComposingText.size(ComposingText.LAYER1) < 1) {
117759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        return false;
117859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    } else {
117959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        return true;
118059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
118159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
118259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
118359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* do nothing if the character is not able to display or the character is dead key */
1185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if ((mHardShift > 0 && mHardAlt > 0) ||
11862d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                (ev.isAltPressed() && ev.isShiftPressed())) {
1187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                int charCode = ev.getUnicodeChar(MetaKeyKeyListener.META_SHIFT_ON | MetaKeyKeyListener.META_ALT_ON);
1188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (charCode == 0 || (charCode & KeyCharacterMap.COMBINING_ACCENT) != 0 || charCode == PRIVATE_AREA_CODE) {
11893feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    if(mHardShift == 1){
11903feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        mShiftPressing = false;
1191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
11923feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    if(mHardAlt == 1){
11933feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        mAltPressing   = false;
11943feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    }
11953feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    if(!ev.isAltPressed()){
11963feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        if (mHardAlt == 1) {
11973feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                            mHardAlt = 0;
11983feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        }
11993feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    }
12003feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    if(!ev.isShiftPressed()){
12013feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        if (mHardShift == 1) {
12023feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                            mHardShift = 0;
12033feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        }
12043feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    }
12053feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    if(!ev.isShiftPressed() && !ev.isAltPressed()){
12063feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        updateMetaKeyStateDisplay();
1207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return true;
1209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            commitConvertingText();
1213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            EditorInfo edit = getCurrentInputEditorInfo();
1215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            StrSegment str;
1216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* get the key character */
1218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mHardShift== 0 && mHardAlt == 0) {
1219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* no meta key is locked */
1220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                int shift = (mAutoCaps)? getShiftKeyState(edit) : 0;
1221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (shift != mHardShift && (key >= KeyEvent.KEYCODE_A && key <= KeyEvent.KEYCODE_Z)) {
1222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    /* handling auto caps for a alphabet character */
1223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    str = createStrSegment(ev.getUnicodeChar(MetaKeyKeyListener.META_SHIFT_ON));
1224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
1225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    str = createStrSegment(ev.getUnicodeChar());
1226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
1228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                str = createStrSegment(ev.getUnicodeChar(mShiftKeyToggle[mHardShift]
1229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                         | mAltKeyToggle[mHardAlt]));
12303feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                if(mHardShift == 1){
12313feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    mShiftPressing = false;
12323feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                }
12333feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                if(mHardAlt == 1){
12343feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    mAltPressing   = false;
12353feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                }
1236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* back to 0 (off) if 1 (on/not locked) */
12373feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                if (!ev.isAltPressed()) {
12383feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    if (mHardAlt == 1) {
12393feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        mHardAlt = 0;
12403feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    }
1241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
12423feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                if (!ev.isShiftPressed()) {
12433feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    if (mHardShift == 1) {
12443feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        mHardShift = 0;
12453feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    }
1246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
12473feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                if (!ev.isShiftPressed() && !ev.isShiftPressed()) {
12483feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    updateMetaKeyStateDisplay();
124977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
1250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
125159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (str == null) {
1253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return true;
1254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* append the character to the composing text if the character is not TAB */
1257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (str.string.charAt(0) != '\u0009') {
12587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                processHardwareKeyboardInputChar(str);
1259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return true;
12607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
126177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                commitText(true);
126277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                commitText(str.string);
12633feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                initializeScreen();
126477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                return true;
1265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else if (key == KeyEvent.KEYCODE_SPACE) {
1268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* H/W space key */
12697b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            processHardwareKeyboardSpaceKey(ev);
12707b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            return true;
1271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else if (key == KeyEvent.KEYCODE_SYM) {
1273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* display the symbol list */
1274e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            initCommitInfoForWatchCursor();
1275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mStatus = commitText(true);
1276e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            checkCommitInfo();
1277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            changeEngineMode(ENGINE_MODE_SYMBOL);
1278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mHardAlt = 0;
1279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateMetaKeyStateDisplay();
1280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
1281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* Functional key */
1284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mComposingText.size(ComposingText.LAYER1) > 0) {
1285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            switch (key) {
1286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_DEL:
1287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mStatus = STATUS_INPUT_EDIT;
1288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mEngineState.isConvertState()) {
1289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mComposingText.setCursor(ComposingText.LAYER1,
1290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                             mComposingText.toString(ComposingText.LAYER1).length());
1291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mExactMatchMode = false;
1292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
12932d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    if ((mComposingText.size(ComposingText.LAYER1) == 1)
12942d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                        && mComposingText.getCursor(ComposingText.LAYER1) != 0) {
1295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        initializeScreen();
1296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        return true;
1297e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    } else {
1298e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mComposingText.delete(ComposingText.LAYER1, false);
1299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                updateViewStatusForPrediction(true, true);
1302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return true;
1303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_BACK:
1305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) {
1306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mStatus &= ~STATUS_CANDIDATE_FULL;
13077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL);
130859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mInputViewManager.showInputView();
1309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
1310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (!mEngineState.isConvertState()) {
13117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        initializeScreen();
13127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        if (mConverter != null) {
13137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                            mConverter.init();
13147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        }
13157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    } else {
13167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        mCandidatesViewManager.clearCandidates();
13177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        mStatus = STATUS_INPUT_EDIT;
13187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        mExactMatchMode = false;
13197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        mComposingText.setCursor(ComposingText.LAYER1,
13207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                                                 mComposingText.toString(ComposingText.LAYER1).length());
13217b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        updateViewStatusForPrediction(true, true);
1322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return true;
1325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_DPAD_LEFT:
132777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                if (!isEnableL2Converter()) {
1328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    commitText(false);
1329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return false;
1330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
1331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    processLeftKeyEvent();
1332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return true;
1333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_DPAD_RIGHT:
133677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                if (!isEnableL2Converter()) {
1337e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (mEngineState.keyboard == EngineState.KEYBOARD_12KEY) {
1338e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        commitText(false);
1339e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
1340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
1341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    processRightKeyEvent();
1342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1343e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                return true;
1344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
134559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_DPAD_DOWN:
134659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                processDownKeyEvent();
134759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
134859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
134959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_DPAD_UP:
135059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (OpenWnn.isXLarge()) {
135159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    updateViewStatusForPrediction(true, true);
135259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                } else {
135359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mCandidatesViewManager.isFocusCandidate()) {
135459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        processUpKeyEvent();
135559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
135659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
135759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
135859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_DPAD_CENTER:
1360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_ENTER:
136159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_NUMPAD_ENTER:
136259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (mCandidatesViewManager.isFocusCandidate()) {
136359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mCandidatesViewManager.selectFocusCandidate();
136459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    return true;
136559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
1366e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (!isEnglishPrediction()) {
1367e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    int cursor = mComposingText.getCursor(ComposingText.LAYER1);
1368e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (cursor < 1) {
1369e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        return true;
137077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                    }
137177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
1372e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                initCommitInfoForWatchCursor();
1373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mStatus = commitText(true);
1374e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                checkCommitInfo();
1375e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
1376e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (isEnglishPrediction()) {
1377e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    initializeScreen();
1378e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
1379e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
1380e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mEnableAutoHideKeyboard) {
1381e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mInputViewManager.closing();
1382e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    requestHideSelf(0);
138377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
1384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return true;
1385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case KeyEvent.KEYCODE_CALL:
13872d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            case KeyEvent.KEYCODE_VOLUME_DOWN:
13882d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            case KeyEvent.KEYCODE_VOLUME_UP:
1389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return false;
1390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            default:
139259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return !isThroughKeyCode(key);
1393053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
1395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* if there is no composing string. */
1396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mCandidatesViewManager.getCurrentView().isShown()) {
1397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* displaying relational prediction candidates */
1398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                switch (key) {
1399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case KeyEvent.KEYCODE_DPAD_LEFT:
140059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mCandidatesViewManager.isFocusCandidate()) {
140159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT);
140259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        return true;
140359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
14047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    if (isEnableL2Converter()) {
1405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        /* initialize the converter */
1406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        mConverter.init();
1407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mStatus = STATUS_INPUT_EDIT;
1409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    updateViewStatusForPrediction(true, true);
1410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return false;
1411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1412053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case KeyEvent.KEYCODE_DPAD_RIGHT:
141359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mCandidatesViewManager.isFocusCandidate()) {
141459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
141559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        return true;
141659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
14177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    if (isEnableL2Converter()) {
1418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        /* initialize the converter */
1419053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        mConverter.init();
1420053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1421053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mStatus = STATUS_INPUT_EDIT;
1422053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    updateViewStatusForPrediction(true, true);
1423053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return false;
1424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
142559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case KeyEvent.KEYCODE_DPAD_DOWN:
142659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    processDownKeyEvent();
142759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    return true;
142859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
142959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case KeyEvent.KEYCODE_DPAD_UP:
143059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mCandidatesViewManager.isFocusCandidate()) {
143159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        processUpKeyEvent();
143259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        return true;
143359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
143459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
143559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
143659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case KeyEvent.KEYCODE_DPAD_CENTER:
143759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case KeyEvent.KEYCODE_ENTER:
143859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case KeyEvent.KEYCODE_NUMPAD_ENTER:
143959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mCandidatesViewManager.isFocusCandidate()) {
144059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mCandidatesViewManager.selectFocusCandidate();
144159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        return true;
144259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
144359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
144459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1445053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                default:
1446053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return processKeyEventNoInputCandidateShown(ev);
1447053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1448e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
1449e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                switch (key) {
1450e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                case KeyEvent.KEYCODE_BACK:
1451e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    /*
1452e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                     * If 'BACK' key is pressed when the SW-keyboard is shown
1453e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                     * and the candidates view is not shown, dismiss the SW-keyboard.
1454e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                     */
1455e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (isInputViewShown()) {
1456e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mInputViewManager.closing();
1457e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        requestHideSelf(0);
1458e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        return true;
1459e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
1460e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    break;
1461e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                default:
1462e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    break;
1463e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
1464053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1465053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1466053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1467053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return false;
1468053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1469053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
14707b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /**
14717b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Handle the space key event from the Hardware keyboard.
14723fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng     *
14737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param ev  The space key event
14747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     */
14757b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private void processHardwareKeyboardSpaceKey(KeyEvent ev) {
14767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /* H/W space key */
14777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (ev.isShiftPressed()) {
14787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            /* change Japanese <-> English mode */
14797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mHardAlt = 0;
14807b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mHardShift = 0;
14817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            updateMetaKeyStateDisplay();
148259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
148359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
14847b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (mEngineState.isEnglish()) {
1485e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                /* English mode to Japanese mode */
14867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                ((DefaultSoftKeyboardJAJP) mInputViewManager).changeKeyMode(DefaultSoftKeyboard.KEYMODE_JA_FULL_HIRAGANA);
148777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                mConverter = mConverterJAJP;
148859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
148959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mEnableLearning   = pref.getBoolean("opt_enable_learning_ja", true);
149059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mEnablePrediction = pref.getBoolean("opt_prediction_ja", true);
14917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
1492e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                /* Japanese mode to English mode */
14937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                ((DefaultSoftKeyboardJAJP) mInputViewManager).changeKeyMode(DefaultSoftKeyboard.KEYMODE_JA_HALF_ALPHABET);
149477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                mConverter = mConverterEN;
149559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
149659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mEnableLearning   = pref.getBoolean("opt_enable_learning_en", true);
149759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mEnablePrediction = pref.getBoolean("opt_prediction_en", false);
149859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (OpenWnn.isXLarge()) {
149959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mEnableSpellCorrection = pref.getBoolean("opt_spell_correction_en", false);
150059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                } else {
150159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mEnableSpellCorrection = pref.getBoolean("opt_spell_correction_en", true);
150259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
15037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
15047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mCandidatesViewManager.clearCandidates();
15057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
15067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else if(ev.isAltPressed()){
15077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            /* display the symbol list (G1 specific. same as KEYCODE_SYM) */
1508e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (!mEngineState.isSymbolList()) {
1509e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                commitAllText();
1510e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
15117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            changeEngineMode(ENGINE_MODE_SYMBOL);
15127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mHardAlt = 0;
15137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            updateMetaKeyStateDisplay();
15147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
15157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else if (isEnglishPrediction()) {
15167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            /* Auto commit if English mode */
15177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (mComposingText.size(0) == 0) {
15187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                commitText(" ");
15197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mCandidatesViewManager.clearCandidates();
1520e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                breakSequence();
15217b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
1522e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                initCommitInfoForWatchCursor();
15237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                commitText(true);
15247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                commitSpaceJustOne();
152577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                checkCommitInfo();
15267b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
152777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            mEnableAutoDeleteSpace = false;
152859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else if (mEngineState.isRenbun()) {
152959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
153059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (!mCandidatesViewManager.isFocusCandidate()) {
153159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    processDownKeyEvent();
153259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
153359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                processRightKeyEvent();
153459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
153559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
153659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
15377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else {
15387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            /* start consecutive clause conversion if Japanese mode */
15397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (mComposingText.size(0) == 0) {
15407b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                commitText(" ");
15417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mCandidatesViewManager.clearCandidates();
1542e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                breakSequence();
15437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
15447b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                startConvert(EngineState.CONVERT_TYPE_RENBUN);
15457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
15467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
15477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
15487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
15497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /**
15507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Handle the character code from the hardware keyboard except the space key.
15517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     *
15527b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param str  The input character
15537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     */
15547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private void processHardwareKeyboardInputChar(StrSegment str) {
15557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (isEnableL2Converter()) {
15567b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            boolean commit = false;
15577b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (mPreConverter == null) {
15587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                Matcher m = mEnglishAutoCommitDelimiter.matcher(str.string);
15597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                if (m.matches()) {
15607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    commitText(true);
15613fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
15627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    commit = true;
15637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                }
15647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                appendStrSegment(str);
15657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
15667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                appendStrSegment(str);
15677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mPreConverter.convert(mComposingText);
15687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
15693fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
15707b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (commit) {
15717b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                commitText(true);
15727b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
15737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mStatus = STATUS_INPUT;
15747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                updateViewStatusForPrediction(true, true);
15757b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
15767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else {
15777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            appendStrSegment(str);
15787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            boolean completed = true;
15797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (mPreConverter != null) {
15807b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                completed = mPreConverter.convert(mComposingText);
15817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
15827b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
15837b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (completed) {
15842d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                if (!mEngineState.isEnglish()) {
15852d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    commitTextWithoutLastAlphabet();
15862d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                } else {
15872d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    commitText(false);
15882d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                }
15897b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
15907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                updateViewStatus(ComposingText.LAYER1, false, true);
15917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
15927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
15937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
15947b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1595053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Thread for updating the candidates view */
1596e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void updatePrediction() {
1597e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int candidates = 0;
1598e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int cursor = mComposingText.getCursor(ComposingText.LAYER1);
1599e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (isEnableL2Converter() || mEngineState.isSymbolList()) {
1600e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mExactMatchMode) {
1601e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                /* exact matching */
1602e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidates = mConverter.predict(mComposingText, 0, cursor);
1603e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
1604e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                /* normal prediction */
1605e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidates = mConverter.predict(mComposingText, 0, -1);
1606053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1607e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
1608e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
1609e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* update the candidates view */
1610e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (candidates > 0) {
1611e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mHasContinuedPrediction = ((mComposingText.size(ComposingText.LAYER1) == 0)
1612e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                       && !mEngineState.isSymbolList());
1613e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mCandidatesViewManager.displayCandidates(mConverter);
1614e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
1615e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mCandidatesViewManager.clearCandidates();
1616e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
1617e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
1618053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1619053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1620053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Handle a left key event.
1621053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1622053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void processLeftKeyEvent() {
162359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mCandidatesViewManager.isFocusCandidate()) {
162459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT);
162559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return;
162659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
162759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1628053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mEngineState.isConvertState()) {
1629053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mEngineState.isEisuKana()) {
1630053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mExactMatchMode = true;
1631053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1632053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1633053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (1 < mComposingText.getCursor(ComposingText.LAYER1)) {
1634053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mComposingText.moveCursor(ComposingText.LAYER1, -1);
1635053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1636053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else if (mExactMatchMode) {
1637053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mComposingText.moveCursor(ComposingText.LAYER1, -1);
1638053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
1639053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (isEnglishPrediction()) {
1640053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mComposingText.moveCursor(ComposingText.LAYER1, -1);
1641053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
1642053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mExactMatchMode = true;
1643053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1644053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1646e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mCommitCount = 0; /* retry consecutive clause conversion if necessary. */
1647053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mStatus = STATUS_INPUT_EDIT;
1648053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        updateViewStatus(mTargetLayer, true, true);
1649053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1650053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1651053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1652053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Handle a right key event.
1653053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1654053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void processRightKeyEvent() {
165559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mCandidatesViewManager.isFocusCandidate()) {
165659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
165759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return;
165859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
165959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1660053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int layer = mTargetLayer;
1661e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        ComposingText composingText = mComposingText;
1662053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mExactMatchMode || (mEngineState.isConvertState())) {
1663e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int textSize = composingText.size(ComposingText.LAYER1);
1664e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (composingText.getCursor(ComposingText.LAYER1) == textSize) {
1665053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mExactMatchMode = false;
1666e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                layer = ComposingText.LAYER1; /* convert -> prediction */
1667053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                EngineState state = new EngineState();
1668053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                state.convertType = EngineState.CONVERT_TYPE_NONE;
1669053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                updateEngineState(state);
1670053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
1671053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mEngineState.isEisuKana()) {
1672053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mExactMatchMode = true;
1673053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1674e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                composingText.moveCursor(ComposingText.LAYER1, 1);
1675053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1676053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
1677e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (composingText.getCursor(ComposingText.LAYER1)
1678e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    < composingText.size(ComposingText.LAYER1)) {
1679e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                composingText.moveCursor(ComposingText.LAYER1, 1);
1680053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1681053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1682053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1683e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mCommitCount = 0; /* retry consecutive clause conversion if necessary. */
1684053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mStatus = STATUS_INPUT_EDIT;
1685053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1686053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        updateViewStatus(layer, true, true);
1687053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1688053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1689053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
169059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Handle a down key event.
169159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
169259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void processDownKeyEvent() {
169359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN);
169459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
169559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
169659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
169759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Handle a up key event.
169859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
169959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void processUpKeyEvent() {
170059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_UP);
170159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
170259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
170359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
1704053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Handle a key event which is not right or left key when the
1705053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * composing text is empty and some candidates are shown.
1706053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
170777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param ev        A key event
170877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return          {@code true} if this consumes the event; {@code false} if not.
1709053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1710053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    boolean processKeyEventNoInputCandidateShown(KeyEvent ev) {
1711053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        boolean ret = true;
171259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int key = ev.getKeyCode();
1713053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
171459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        switch (key) {
1715053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case KeyEvent.KEYCODE_DEL:
1716053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = true;
1717053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1718053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case KeyEvent.KEYCODE_ENTER:
171959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_ENTER:
1720053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case KeyEvent.KEYCODE_DPAD_UP:
1721053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case KeyEvent.KEYCODE_DPAD_DOWN:
17223feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        case KeyEvent.KEYCODE_MENU:
1723053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = false;
1724053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
17253fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
1726053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case KeyEvent.KEYCODE_CALL:
17272d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        case KeyEvent.KEYCODE_VOLUME_DOWN:
17282d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        case KeyEvent.KEYCODE_VOLUME_UP:
1729053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return false;
17303fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
17317b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        case KeyEvent.KEYCODE_DPAD_CENTER:
173277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            ret = true;
1733053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1734e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
1735e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case KeyEvent.KEYCODE_BACK:
1736e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) {
1737e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mStatus &= ~STATUS_CANDIDATE_FULL;
1738e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL);
173959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mInputViewManager.showInputView();
1740e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                return true;
1741e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
1742e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                ret = true;
1743e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
1744e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            break;
17453fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
17467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        default:
174759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return !isThroughKeyCode(key);
1748053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1749053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1750053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mConverter != null) {
1751e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* initialize the converter */
1752053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverter.init();
1753053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1754053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        updateViewStatusForPrediction(true, true);
1755053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ret;
1756053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1757053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1758053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1759053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Update views and the display of the composing text for predict mode.
1760053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
17617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param updateCandidates  {@code true} to update the candidates view
17623feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @param updateEmptyText   {@code false} to update the composing text if it is not empty; {@code true} to update always.
1763053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1764053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void updateViewStatusForPrediction(boolean updateCandidates, boolean updateEmptyText) {
1765053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        EngineState state = new EngineState();
1766053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        state.convertType = EngineState.CONVERT_TYPE_NONE;
1767053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        updateEngineState(state);
1768053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1769053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        updateViewStatus(ComposingText.LAYER1, updateCandidates, updateEmptyText);
1770053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1771053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1772053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1773053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Update views and the display of the composing text.
1774053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
177577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param layer                      Display layer of the composing text
17767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param updateCandidates  {@code true} to update the candidates view
17773feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @param updateEmptyText   {@code false} to update the composing text if it is not empty; {@code true} to update always.
1778053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1779053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void updateViewStatus(int layer, boolean updateCandidates, boolean updateEmptyText) {
1780053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mTargetLayer = layer;
1781053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1782053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (updateCandidates) {
1783053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateCandidateView();
1784053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1785053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* notice to the input view */
1786053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputViewManager.onUpdateState(this);
1787053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1788053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* set the text for displaying as the composing text */
1789053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDisplayText.clear();
1790053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDisplayText.insert(0, mComposingText.toString(layer));
1791053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1792053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* add decoration to the text */
1793053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int cursor = mComposingText.getCursor(layer);
1794053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if ((mInputConnection != null) && (mDisplayText.length() != 0 || updateEmptyText)) {
1795053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (cursor != 0) {
17967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                int highlightEnd = 0;
17977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
17987b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                if ((mExactMatchMode && (!mEngineState.isEisuKana()))
17997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    || (FIX_CURSOR_TEXT_END && isEnglishPrediction()
18007b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        && (cursor < mComposingText.size(ComposingText.LAYER1)))){
18017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1802053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mDisplayText.setSpan(SPAN_EXACT_BGCOLOR_HL, 0, cursor,
1803053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                         Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
18047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    highlightEnd = cursor;
18057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
18067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                } else if (FIX_CURSOR_TEXT_END && mEngineState.isEisuKana()) {
18077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    mDisplayText.setSpan(SPAN_EISUKANA_BGCOLOR_HL, 0, cursor,
18087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                                         Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
18097b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    highlightEnd = cursor;
18107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
18117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                } else if (layer == ComposingText.LAYER2) {
18127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    highlightEnd = mComposingText.toString(layer, 0, 0).length();
1813053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1814e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    /* highlights the first segment */
1815053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mDisplayText.setSpan(SPAN_CONVERT_BGCOLOR_HL, 0,
18167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                                         highlightEnd,
18177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                                         Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
18187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                }
18197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
18207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                if (FIX_CURSOR_TEXT_END && (highlightEnd != 0)) {
1821e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    /* highlights remaining text */
18227b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    mDisplayText.setSpan(SPAN_REMAIN_BGCOLOR_HL, highlightEnd,
18237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                                         mComposingText.toString(layer).length(),
1824053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                         Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
1825e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
1826e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    /* text color in the highlight */
1827e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mDisplayText.setSpan(SPAN_TEXTCOLOR, 0,
1828e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                         mComposingText.toString(layer).length(),
18293fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng                                         Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
1830053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1831053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1832053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1833053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDisplayText.setSpan(SPAN_UNDERLINE, 0, mDisplayText.length(),
1834053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
1835053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1836053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int displayCursor = mComposingText.toString(layer, 0, cursor - 1).length();
18377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (FIX_CURSOR_TEXT_END) {
18387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                displayCursor = (cursor == 0) ?  0 : 1;
18393fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng            }
1840053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* update the composing text on the EditView */
18412d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            if ((mDisplayText.length() != 0) || !mHasStartedTextSelection) {
18422d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                mInputConnection.setComposingText(mDisplayText, displayCursor);
18432d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            }
1844053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1845053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1846053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1847053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1848053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Update the candidates view.
1849053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1850053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void updateCandidateView() {
1851053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (mTargetLayer) {
1852053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case ComposingText.LAYER0:
1853e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case ComposingText.LAYER1: /* prediction */
18547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (mEnablePrediction || mEngineState.isSymbolList() || mEngineState.isEisuKana()) {
1855053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* update the candidates view */
1856053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if ((mComposingText.size(ComposingText.LAYER1) != 0)
1857053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    && !mEngineState.isConvertState()) {
18583fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
1859e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mHandler.removeMessages(MSG_PREDICTION);
1860e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (mCandidatesViewManager.getCurrentView().isShown()) {
1861e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PREDICTION),
1862e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                    PREDICTION_DELAY_MS_SHOWING_CANDIDATE);
1863e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    } else {
1864e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PREDICTION),
1865e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                    PREDICTION_DELAY_MS_1ST);
1866e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
1867053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
1868e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mHandler.removeMessages(MSG_PREDICTION);
1869e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    updatePrediction();
1870053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1871053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
1872e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mHandler.removeMessages(MSG_PREDICTION);
1873053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mCandidatesViewManager.clearCandidates();
1874053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1875053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1876e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case ComposingText.LAYER2: /* convert */
1877053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mCommitCount == 0) {
1878e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mHandler.removeMessages(MSG_PREDICTION);
1879053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mConverter.convert(mComposingText);
1880053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1881053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1882053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int candidates = mConverter.makeCandidateListOf(mCommitCount);
1883053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1884053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (candidates != 0) {
1885053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mComposingText.setCursor(ComposingText.LAYER2, 1);
1886053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mCandidatesViewManager.displayCandidates(mConverter);
1887053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
1888053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mComposingText.setCursor(ComposingText.LAYER1,
1889053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                         mComposingText.toString(ComposingText.LAYER1).length());
1890053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mCandidatesViewManager.clearCandidates();
1891053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1892053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1893053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
1894053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
1895053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1896053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1897053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1898053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1899053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Commit the displaying composing text.
1900053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
19017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param learn  {@code true} to register the committed string to the learning dictionary.
190277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return          IME's status after commit
1903053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1904053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int commitText(boolean learn) {
1905053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (isEnglishPrediction()) {
1906053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mComposingText.setCursor(ComposingText.LAYER1,
1907053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                     mComposingText.size(ComposingText.LAYER1));
1908053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1909053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1910053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int layer = mTargetLayer;
1911053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int cursor = mComposingText.getCursor(layer);
1912053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (cursor == 0) {
1913053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return mStatus;
1914053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1915053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        String tmp = mComposingText.toString(layer, 0, cursor - 1);
1916053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1917053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mConverter != null) {
1918053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (learn) {
1919053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mEngineState.isRenbun()) {
1920e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    learnWord(0); /* select the top of the clauses */
1921053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
1922053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (mComposingText.size(ComposingText.LAYER1) != 0) {
1923053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        String stroke = mComposingText.toString(ComposingText.LAYER1, 0, mComposingText.getCursor(layer) - 1);
1924053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        WnnWord word = new WnnWord(tmp, stroke);
19253fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
1926053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        learnWord(word);
1927053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
1928053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
1929053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
1930e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                breakSequence();
1931053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1932053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1933053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return commitTextThroughInputConnection(tmp);
1934053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1935053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1936053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
19372d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     * Commit the composing text except the alphabet character at the tail.
19382d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa     */
19392d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    private void commitTextWithoutLastAlphabet() {
19402d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        int layer = mTargetLayer;
19412d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        String tmp = mComposingText.getStrSegment(layer, -1).string;
19422d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa
19432d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        if (isAlphabetLast(tmp)) {
19442d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mComposingText.moveCursor(ComposingText.LAYER1, -1);
19452d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            commitText(false);
19462d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            mComposingText.moveCursor(ComposingText.LAYER1, 1);
19472d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        } else {
19482d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            commitText(false);
19492d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        }
19502d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    }
19513fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
19522d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa    /**
19533feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * Commit all uncommitted words.
19547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     */
19557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private void commitAllText() {
1956e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        initCommitInfoForWatchCursor();
19577b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (mEngineState.isConvertState()) {
19587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            commitConvertingText();
19597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else {
19607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mComposingText.setCursor(ComposingText.LAYER1,
19617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                                     mComposingText.size(ComposingText.LAYER1));
19627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mStatus = commitText(true);
19637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
1964e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        checkCommitInfo();
19657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
19667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
19677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /**
1968053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Commit a word.
1969053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
197077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param word              A word to commit
197177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return                  IME's status after commit
1972053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1973053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int commitText(WnnWord word) {
1974053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mConverter != null) {
1975053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            learnWord(word);
1976053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1977053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return commitTextThroughInputConnection(word.candidate);
1978053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1979053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1980053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1981053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Commit a string.
1982053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
19837b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param str  A string to commit
1984053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1985053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void commitText(String str) {
19867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mInputConnection.commitText(str, (FIX_CURSOR_TEXT_END ? 1 : str.length()));
198777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        mPrevCommitText.append(str);
1988e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mPrevCommitCount++;
1989053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mEnableAutoDeleteSpace = true;
1990053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        updateViewStatusForPrediction(false, false);
1991053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1992053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1993053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
19947b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Commit a string through {@link InputConnection}.
1995053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
19967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param string  A string to commit
199777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return                  IME's status after commit
1998053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
1999053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int commitTextThroughInputConnection(String string) {
2000053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int layer = mTargetLayer;
20017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
20027b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mInputConnection.commitText(string, (FIX_CURSOR_TEXT_END ? 1 : string.length()));
200377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        mPrevCommitText.append(string);
2004e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mPrevCommitCount++;
20053fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
2006053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int cursor = mComposingText.getCursor(layer);
2007053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (cursor > 0) {
2008053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mComposingText.deleteStrSegment(layer, 0, mComposingText.getCursor(layer) - 1);
2009053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mComposingText.setCursor(layer, mComposingText.size(layer));
2010053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2011053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mExactMatchMode = false;
2012053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mCommitCount++;
2013053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2014053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if ((layer == ComposingText.LAYER2) && (mComposingText.size(layer) == 0)) {
2015e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            layer = 1; /* for connected prediction */
2016053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2017053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
20182d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        boolean committed = autoCommitEnglish();
2019053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mEnableAutoDeleteSpace = true;
2020053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2021053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (layer == ComposingText.LAYER2) {
2022053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            EngineState state = new EngineState();
2023053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            state.convertType = EngineState.CONVERT_TYPE_RENBUN;
2024053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateEngineState(state);
20252d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            updateViewStatus(layer, !committed, false);
2026053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
20272d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            updateViewStatusForPrediction(!committed, false);
2028053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2029053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2030053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mComposingText.size(ComposingText.LAYER0) == 0) {
2031053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return STATUS_INIT;
2032053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
2033053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return STATUS_INPUT_EDIT;
2034053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2035053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2036053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2037053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2038053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Returns whether it is English prediction mode or not.
2039053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
204077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return  {@code true} if it is English prediction mode; otherwise, {@code false}.
2041053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2042053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean isEnglishPrediction() {
20437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        return (mEngineState.isEnglish() && isEnableL2Converter());
2044053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2045053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2046053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2047053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Change the conversion engine and the letter converter(Romaji-to-Kana converter).
2048053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
20497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param mode  Engine's mode to be changed
2050053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @see jp.co.omronsoft.openwnn.OpenWnnEvent.Mode
2051053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @see jp.co.omronsoft.openwnn.JAJP.DefaultSoftKeyboardJAJP
2052053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2053053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void changeEngineMode(int mode) {
2054053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        EngineState state = new EngineState();
2055053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2056053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (mode) {
2057053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case ENGINE_MODE_OPT_TYPE_QWERTY:
2058053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            state.keyboard = EngineState.KEYBOARD_QWERTY;
2059053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateEngineState(state);
206077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            clearCommitInfo();
2061053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
2062053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2063053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case ENGINE_MODE_OPT_TYPE_12KEY:
2064053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            state.keyboard = EngineState.KEYBOARD_12KEY;
2065053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateEngineState(state);
206677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            clearCommitInfo();
2067053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
2068053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2069053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case ENGINE_MODE_EISU_KANA:
2070053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mEngineState.isEisuKana()) {
2071053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_NONE;
2072053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                updateEngineState(state);
2073e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                updateViewStatusForPrediction(true, true); /* prediction only */
2074053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
2075053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                startConvert(EngineState.CONVERT_TYPE_EISU_KANA);
2076053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2077053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
2078053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2079053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case ENGINE_MODE_SYMBOL:
20803feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            if (mEnableSymbolList && !mDirectInputMode) {
20817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_SYMBOL;
20827b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                updateEngineState(state);
20837b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                updateViewStatusForPrediction(true, true);
20847b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
2085053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
2086053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
208759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case ENGINE_MODE_SYMBOL_KAO_MOJI:
208859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            changeSymbolEngineState(state, ENGINE_MODE_SYMBOL_KAO_MOJI);
208959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return;
209059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
2091053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
2092053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2093053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2094053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2095053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        state = new EngineState();
2096053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_NONE;
2097053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        updateEngineState(state);
2098053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
209959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
2100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        state = new EngineState();
2101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (mode) {
2102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.Mode.DIRECT:
2103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* Full/Half-width number or Full-width alphabet */
2104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverter = null;
2105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mPreConverter = null;
2106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.Mode.NO_LV1_CONV:
2109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* no Romaji-to-Kana conversion (=English prediction mode) */
2110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            state.dictionarySet = EngineState.DICTIONARYSET_EN;
2111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateEngineState(state);
2112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverter = mConverterEN;
2113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mPreConverter = null;
211459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
211559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mEnableLearning   = pref.getBoolean("opt_enable_learning_en", true);
211659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mEnablePrediction = pref.getBoolean("opt_prediction_en", false);
211759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (OpenWnn.isXLarge()) {
211859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mEnableSpellCorrection = pref.getBoolean("opt_spell_correction_en", false);
211959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
212059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mEnableSpellCorrection = pref.getBoolean("opt_spell_correction_en", true);
212159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
2122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEvent.Mode.NO_LV2_CONV:
2125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverter = null;
2126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mPreConverter = mPreConverterHiragana;
2127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case ENGINE_MODE_FULL_KATAKANA:
2130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverter = null;
2131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mPreConverter = mPreConverterFullKatakana;
2132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case ENGINE_MODE_HALF_KATAKANA:
2135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverter = null;
2136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mPreConverter = mPreConverterHalfKatakana;
2137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
2140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* HIRAGANA input mode */
2141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            state.dictionarySet = EngineState.DICTIONARYSET_JP;
2142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateEngineState(state);
2143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverter = mConverterJAJP;
2144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mPreConverter = mPreConverterHiragana;
214559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
214659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mEnableLearning   = pref.getBoolean("opt_enable_learning_ja", true);
214759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mEnablePrediction = pref.getBoolean("opt_prediction_ja", true);
2148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mPreConverterBack = mPreConverter;
2152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mConverterBack = mConverter;
2153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Update the conversion engine's state.
2157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
21587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param state  Engine's state to be updated
2159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void updateEngineState(EngineState state) {
2161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        EngineState myState = mEngineState;
2162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* language */
21643fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng        if ((state.dictionarySet != EngineState.INVALID)
2165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            && (myState.dictionarySet != state.dictionarySet)) {
2166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            switch (state.dictionarySet) {
2168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.DICTIONARYSET_EN:
2169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                setDictionary(OpenWnnEngineJAJP.DIC_LANG_EN);
2170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.DICTIONARYSET_JP:
2173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            default:
2174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                setDictionary(OpenWnnEngineJAJP.DIC_LANG_JP);
2175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            myState.dictionarySet = state.dictionarySet;
2178e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            breakSequence();
2179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* update keyboard setting */
2181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (state.keyboard == EngineState.INVALID) {
2182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                state.keyboard = myState.keyboard;
2183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* type of conversion */
2187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if ((state.convertType != EngineState.INVALID)
2188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            && (myState.convertType != state.convertType)) {
2189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            switch (state.convertType) {
2191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.CONVERT_TYPE_NONE:
2192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                setDictionary(mPrevDictionarySet);
2193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.CONVERT_TYPE_EISU_KANA:
2196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                setDictionary(OpenWnnEngineJAJP.DIC_LANG_JP_EISUKANA);
2197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.CONVERT_TYPE_RENBUN:
2200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            default:
2201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                setDictionary(OpenWnnEngineJAJP.DIC_LANG_JP);
2202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            myState.convertType = state.convertType;
2205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* temporary dictionary */
2208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (state.temporaryMode != EngineState.INVALID) {
2209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            switch (state.temporaryMode) {
2211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.TEMPORARY_DICTIONARY_MODE_NONE:
2212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (myState.temporaryMode != EngineState.TEMPORARY_DICTIONARY_MODE_NONE) {
2213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    setDictionary(mPrevDictionarySet);
221459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mCurrentSymbol = -1;
2215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mPreConverter = mPreConverterBack;
2216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mConverter = mConverterBack;
2217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mDisableAutoCommitEnglishMask &= ~AUTO_COMMIT_ENGLISH_SYMBOL;
221859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    ((DefaultSoftKeyboard)mInputViewManager).setNormalKeyboard();
221959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mTextCandidatesViewManager.setSymbolMode(false, ENGINE_MODE_SYMBOL_NONE);
222059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (OpenWnn.isXLarge()) {
222159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mCandidatesViewManager = mTextCandidates1LineViewManager;
222259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        View view = mTextCandidates1LineViewManager.getCurrentView();
222359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        if (view != null) {
222459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            setCandidatesView(view);
222559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        }
222659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
2227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
2228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.TEMPORARY_DICTIONARY_MODE_SYMBOL:
2231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (++mCurrentSymbol >= SYMBOL_LISTS.length) {
2232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mCurrentSymbol = 0;
2233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
2234e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mEnableSymbolListNonHalf) {
2235e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mConverterSymbolEngineBack.setDictionary(SYMBOL_LISTS[mCurrentSymbol]);
2236e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                } else {
2237e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mConverterSymbolEngineBack.setDictionary(SymbolList.SYMBOL_ENGLISH);
22387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                }
2239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mConverter = mConverterSymbolEngineBack;
2240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mDisableAutoCommitEnglishMask |= AUTO_COMMIT_ENGLISH_SYMBOL;
224159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                int engineModeSymbol = 0;
224259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
224359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (SYMBOL_LISTS[mCurrentSymbol] == SymbolList.SYMBOL_JAPANESE) {
224459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    engineModeSymbol = ENGINE_MODE_SYMBOL;
224559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                } else if (SYMBOL_LISTS[mCurrentSymbol] == SymbolList.SYMBOL_JAPANESE_FACE) {
224659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    engineModeSymbol = ENGINE_MODE_SYMBOL_KAO_MOJI;
224759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                } else {
224859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
224959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
225059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mTextCandidatesViewManager.setSymbolMode(true, engineModeSymbol);
225159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (OpenWnn.isXLarge()) {
225259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mCandidatesViewManager = mTextCandidatesViewManager;
225359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    View view = mTextCandidatesViewManager.getCurrentView();
225459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (view != null) {
225559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        setCandidatesView(view);
225659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
225759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
2258e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                breakSequence();
225959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                ((DefaultSoftKeyboard)mInputViewManager).setSymbolKeyboard();
2260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            default:
2263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            myState.temporaryMode = state.temporaryMode;
2266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* preference dictionary */
22693fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng        if ((state.preferenceDictionary != EngineState.INVALID)
2270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            && (myState.preferenceDictionary != state.preferenceDictionary)) {
2271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            myState.preferenceDictionary = state.preferenceDictionary;
2273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            setDictionary(mPrevDictionarySet);
2274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* keyboard type */
2277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (state.keyboard != EngineState.INVALID) {
2278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            switch (state.keyboard) {
2279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.KEYBOARD_12KEY:
2280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mConverterJAJP.setKeyboardType(OpenWnnEngineJAJP.KEYBOARD_KEYPAD12);
2281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mConverterEN.setDictionary(OpenWnnEngineEN.DICT_DEFAULT);
2282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
22833fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
2284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.KEYBOARD_QWERTY:
2285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            default:
2286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mConverterJAJP.setKeyboardType(OpenWnnEngineJAJP.KEYBOARD_QWERTY);
2287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mEnableSpellCorrection) {
2288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mConverterEN.setDictionary(OpenWnnEngineEN.DICT_FOR_CORRECT_MISTYPE);
2289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
2290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mConverterEN.setDictionary(OpenWnnEngineEN.DICT_DEFAULT);
2291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
2292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            myState.keyboard = state.keyboard;
2295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Set dictionaries to be used.
23003fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng     *
23017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param mode  Definition of dictionaries
2302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void setDictionary(int mode) {
2304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int target = mode;
2305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (target) {
2306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEngineJAJP.DIC_LANG_JP:
2308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            switch (mEngineState.preferenceDictionary) {
2310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.PREFERENCE_DICTIONARY_PERSON_NAME:
2311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                target = OpenWnnEngineJAJP.DIC_LANG_JP_PERSON_NAME;
2312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.PREFERENCE_DICTIONARY_POSTAL_ADDRESS:
2314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                target = OpenWnnEngineJAJP.DIC_LANG_JP_POSTAL_ADDRESS;
2315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            default:
2317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEngineJAJP.DIC_LANG_EN:
2323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            switch (mEngineState.preferenceDictionary) {
2325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EngineState.PREFERENCE_DICTIONARY_EMAIL_ADDRESS_URI:
2326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                target = OpenWnnEngineJAJP.DIC_LANG_EN_EMAIL_ADDRESS;
2327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            default:
2329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
2335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
23373fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
233877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        switch (mode) {
2339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEngineJAJP.DIC_LANG_JP:
2340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case OpenWnnEngineJAJP.DIC_LANG_EN:
2341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mPrevDictionarySet = mode;
2342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
2344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
2345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mConverterJAJP.setDictionary(target);
2348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Handle a toggle key input event.
2352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
23537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param table  Table of toggle characters
2354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void processSoftKeyboardToggleChar(String[] table) {
2356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (table == null) {
2357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
2358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        commitConvertingText();
2361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        boolean toggled = false;
23633feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        if ((mStatus & ~STATUS_CANDIDATE_FULL) == STATUS_INPUT) {
2364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int cursor = mComposingText.getCursor(ComposingText.LAYER1);
2365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (cursor > 0) {
2366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                String prevChar = mComposingText.getStrSegment(ComposingText.LAYER1,
2367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                               cursor - 1).string;
2368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                String c = searchToggleCharacter(prevChar, table, false);
2369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (c != null) {
2370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mComposingText.delete(ComposingText.LAYER1, false);
2371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    appendStrSegment(new StrSegment(c));
2372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    toggled = true;
2373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
2374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (!toggled) {
23787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (!isEnableL2Converter()) {
23797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                commitText(false);
23807b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
23817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
2382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            String str = table[0];
2383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* shift on */
23842d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa            if (mAutoCaps && (getShiftKeyState(getCurrentInputEditorInfo()) == 1)) {
2385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                char top = table[0].charAt(0);
2386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (Character.isLowerCase(top)) {
2387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    str = Character.toString(Character.toUpperCase(top));
2388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
23893fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng            }
2390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            appendStrSegment(new StrSegment(str));
2391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2392053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2393053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mStatus = STATUS_INPUT;
2394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        updateViewStatusForPrediction(true, true);
2396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Handle character input from the software keyboard without listing candidates.
2400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
24017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param chars  The input character(s)
2402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2403053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void processSoftKeyboardCodeWithoutConversion(char[] chars) {
2404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (chars == null) {
2405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
2406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ComposingText text = mComposingText;
2409e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        appendStrSegment(new StrSegment(chars));
2410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (!isAlphabetLast(text.toString(ComposingText.LAYER1))) {
2412053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* commit if the input character is not alphabet */
2413053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            commitText(false);
2414053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
2415053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            boolean completed = mPreConverter.convert(text);
2416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (completed) {
24172d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                commitTextWithoutLastAlphabet();
2418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
2419053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mStatus = STATUS_INPUT;
2420053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                updateViewStatusForPrediction(true, true);
2421053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2422053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2423053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2425053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Handle character input from the software keyboard.
2427053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
24287b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param chars   The input character(s)
2429053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2430053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void processSoftKeyboardCode(char[] chars) {
2431053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (chars == null) {
2432053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
2433053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2434053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2435053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if ((chars[0] == ' ') || (chars[0] == '\u3000' /* Full-width space */)) {
2436053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mComposingText.size(0) == 0) {
2437053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mCandidatesViewManager.clearCandidates();
2438053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                commitText(new String(chars));
2439e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                breakSequence();
2440053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
2441053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (isEnglishPrediction()) {
2442e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    initCommitInfoForWatchCursor();
2443053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    commitText(true);
2444053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    commitSpaceJustOne();
244577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                    checkCommitInfo();
2446053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
244759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mEngineState.isRenbun()) {
244859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        if (mCandidatesViewManager instanceof TextCandidatesViewManager) {
244959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            if (!mCandidatesViewManager.isFocusCandidate()) {
245059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                processDownKeyEvent();
245159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            }
245259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            processRightKeyEvent();
245359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        } else {
245459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            mCandidatesViewManager.processMoveKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT);
245559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        }
245659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    } else {
245759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        startConvert(EngineState.CONVERT_TYPE_RENBUN);
245859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
2459053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
2460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
246177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            mEnableAutoDeleteSpace = false;
2462053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
2463053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            commitConvertingText();
2464053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2465053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* Auto-commit a word if it is English and Qwerty mode */
2466053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            boolean commit = false;
2467053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (isEnglishPrediction()
2468053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                && (mEngineState.keyboard == EngineState.KEYBOARD_QWERTY)) {
2469053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2470053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                Matcher m = mEnglishAutoCommitDelimiter.matcher(new String(chars));
2471053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (m.matches()) {
2472053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    commit = true;
2473053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
2474053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
24753fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
2476053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (commit) {
2477053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                commitText(true);
2478053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2479053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                appendStrSegment(new StrSegment(chars));
2480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                commitText(true);
2481053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
2482053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                appendStrSegment(new StrSegment(chars));
2483053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mPreConverter != null) {
2484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mPreConverter.convert(mComposingText);
2485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mStatus = STATUS_INPUT;
2486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
2487053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                updateViewStatusForPrediction(true, true);
2488053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2489053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2490053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2491053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Start consecutive clause conversion or EISU-KANA conversion mode.
2494053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
249577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param convertType               The conversion type({@code EngineState.CONVERT_TYPE_*})
2496053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2497053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void startConvert(int convertType) {
24987b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (!isEnableL2Converter()) {
24997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            return;
25007b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
25017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
2502053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mEngineState.convertType != convertType) {
2503053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* adjust the cursor position */
2504053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (!mExactMatchMode) {
2505053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (convertType == EngineState.CONVERT_TYPE_RENBUN) {
2506053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    /* not specify */
2507053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mComposingText.setCursor(ComposingText.LAYER1, 0);
2508053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
2509053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (mEngineState.isRenbun()) {
2510053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        /* EISU-KANA conversion specifying the position of the segment if previous mode is conversion mode */
2511053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        mExactMatchMode = true;
2512053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    } else {
2513053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        /* specify all range */
2514053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        mComposingText.setCursor(ComposingText.LAYER1,
2515053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                 mComposingText.size(ComposingText.LAYER1));
2516053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
2517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
25183fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng            }
2519053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2520053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (convertType == EngineState.CONVERT_TYPE_RENBUN) {
2521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* clears variables for the prediction */
2522053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mExactMatchMode = false;
2523053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2524053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* clears variables for the convert */
2525053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mCommitCount = 0;
2526053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2527053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int layer;
2528053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (convertType == EngineState.CONVERT_TYPE_EISU_KANA) {
2529053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                layer = ComposingText.LAYER1;
2530053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
2531053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                layer = ComposingText.LAYER2;
2532053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2533053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2534053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            EngineState state = new EngineState();
2535053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            state.convertType = convertType;
2536053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateEngineState(state);
2537053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2538053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            updateViewStatus(layer, true, true);
2539053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2540053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2541053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2542053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2543053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Auto commit a word in English (on half-width alphabet mode).
2544053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
25457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @return  {@code true} if auto-committed; otherwise, {@code false}.
2546053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2547053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean autoCommitEnglish() {
2548053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (isEnglishPrediction() && (mDisableAutoCommitEnglishMask == AUTO_COMMIT_ENGLISH_ON)) {
2549053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            CharSequence seq = mInputConnection.getTextBeforeCursor(2, 0);
2550053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Matcher m = mEnglishAutoCommitDelimiter.matcher(seq);
2551053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (m.matches()) {
2552053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if ((seq.charAt(0) == ' ') && mEnableAutoDeleteSpace) {
2553053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mInputConnection.deleteSurroundingText(2, 0);
255477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                    CharSequence str = seq.subSequence(1, 2);
255577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                    mInputConnection.commitText(str, 1);
255677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                    mPrevCommitText.append(str);
2557e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mPrevCommitCount++;
2558053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
2559053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2560e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mHandler.removeMessages(MSG_PREDICTION);
2561053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mCandidatesViewManager.clearCandidates();
2562053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return true;
2563053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2564053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2565053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return false;
2566053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2567053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2568053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2569053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Insert a white space if the previous character is not a white space.
2570053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2571053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void commitSpaceJustOne() {
2572053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        CharSequence seq = mInputConnection.getTextBeforeCursor(1, 0);
2573053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (seq.charAt(0) != ' ') {
2574053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            commitText(" ");
2575053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2576053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2577053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2578053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2579053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Get the shift key state from the editor.
2580053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
258177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param editor    The editor
258277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return          State ID of the shift key (0:off, 1:on)
2583053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2584053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected int getShiftKeyState(EditorInfo editor) {
2585053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return (getCurrentInputConnection().getCursorCapsMode(editor.inputType) == 0) ? 0 : 1;
2586053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2587053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2588053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2589053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Display current meta-key state.
2590053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2591053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void updateMetaKeyStateDisplay() {
25927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        int mode = 0;
25937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if(mHardShift == 0 && mHardAlt == 0){
25947b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_OFF;
25957b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }else if(mHardShift == 1 && mHardAlt == 0){
25967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_OFF;
25977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }else if(mHardShift == 2  && mHardAlt == 0){
25987b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_OFF;
25997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }else if(mHardShift == 0 && mHardAlt == 1){
26007b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_ON;
26017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }else if(mHardShift == 0 && mHardAlt == 2){
26027b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_LOCK;
26037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }else if(mHardShift == 1 && mHardAlt == 1){
26047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_ON;
26057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }else if(mHardShift == 1 && mHardAlt == 2){
26067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_LOCK;
26077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }else if(mHardShift == 2 && mHardAlt == 1){
26087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_ON;
26097b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }else if(mHardShift == 2 && mHardAlt == 2){
26107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_LOCK;
26117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }else{
26127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_OFF;
26137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
26147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        ((DefaultSoftKeyboard) mInputViewManager).updateIndicator(mode);
2615053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2616053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2617053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
26183fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng     * Memory a selected word.
26193fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng     *
2620053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param word  A selected word
2621053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2622053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void learnWord(WnnWord word) {
2623053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mEnableLearning && word != null) {
2624053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mConverter.learn(word);
2625053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2626053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2627053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2628053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2629053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Memory a clause which is generated by consecutive clause conversion.
26303fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng     *
2631053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param index  Index of a clause
2632053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2633053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void learnWord(int index) {
2634053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ComposingText composingText = mComposingText;
2635053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2636053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mEnableLearning && composingText.size(ComposingText.LAYER2) > index) {
2637053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            StrSegment seg = composingText.getStrSegment(ComposingText.LAYER2, index);
2638053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (seg instanceof StrSegmentClause) {
2639053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mConverter.learn(((StrSegmentClause)seg).clause);
2640053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
2641053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                String stroke = composingText.toString(ComposingText.LAYER1, seg.from, seg.to);
2642053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mConverter.learn(new WnnWord(seg.string, stroke));
2643053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2644053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2646053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2647053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2648053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Fits an editor info.
26493fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng     *
2650053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param preferences  The preference data.
265177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param info              The editor info.
2652053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2653053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void fitInputType(SharedPreferences preference, EditorInfo info) {
2654053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (info.inputType == EditorInfo.TYPE_NULL) {
26553feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            mDirectInputMode = true;
2656053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
2657053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2658e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
265959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mConverter == mConverterEN) {
266059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mEnableLearning   = preference.getBoolean("opt_enable_learning_en", true);
266159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mEnablePrediction = preference.getBoolean("opt_prediction_en", false);
266259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (OpenWnn.isXLarge()) {
266359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mEnableSpellCorrection = preference.getBoolean("opt_spell_correction_en", false);
266459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
266559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mEnableSpellCorrection = preference.getBoolean("opt_spell_correction_en", true);
266659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
266759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
266859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mEnableLearning   = preference.getBoolean("opt_enable_learning_ja", true);
266959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mEnablePrediction = preference.getBoolean("opt_prediction_ja", true);
267059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
26717b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mDisableAutoCommitEnglishMask &= ~AUTO_COMMIT_ENGLISH_OFF;
2672053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int preferenceDictionary = EngineState.PREFERENCE_DICTIONARY_NONE;
26737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mEnableConverter = true;
26747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mEnableSymbolList = true;
2675e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mEnableSymbolListNonHalf = true;
267659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        setEnabledTabs(true);
26777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mAutoCaps = preference.getBoolean("auto_caps", true);
2678e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mFilter.filter = 0;
2679e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mEnableAutoInsertSpace = true;
2680e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mEnableAutoHideKeyboard = false;
26817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
26827b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        switch (info.inputType & EditorInfo.TYPE_MASK_CLASS) {
26837b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        case EditorInfo.TYPE_CLASS_NUMBER:
26847b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        case EditorInfo.TYPE_CLASS_DATETIME:
2685e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mEnableConverter = false;
2686e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            break;
2687e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
26887b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        case EditorInfo.TYPE_CLASS_PHONE:
2689e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mEnableSymbolList = false;
26907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mEnableConverter = false;
26917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            break;
26927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
26937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        case EditorInfo.TYPE_CLASS_TEXT:
2694053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2695053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            switch (info.inputType & EditorInfo.TYPE_MASK_VARIATION) {
2696053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME:
2697053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                preferenceDictionary = EngineState.PREFERENCE_DICTIONARY_PERSON_NAME;
2698053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
26993fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
2700053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EditorInfo.TYPE_TEXT_VARIATION_PASSWORD:
27010470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa            case EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
2702053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mEnableLearning = false;
27037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mEnableConverter = false;
2704e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mEnableSymbolListNonHalf = false;
27053fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng                mFilter.filter = CandidateFilter.FILTER_NON_ASCII;
2706053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mDisableAutoCommitEnglishMask |= AUTO_COMMIT_ENGLISH_OFF;
270759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mTextCandidatesViewManager.setEnableEmoticon(false);
2708053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2709053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2710053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
2711e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mEnableAutoInsertSpace = false;
2712e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mDisableAutoCommitEnglishMask |= AUTO_COMMIT_ENGLISH_OFF;
2713e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                preferenceDictionary = EngineState.PREFERENCE_DICTIONARY_EMAIL_ADDRESS_URI;
2714e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                break;
2715e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
2716053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EditorInfo.TYPE_TEXT_VARIATION_URI:
2717e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mEnableAutoInsertSpace = false;
2718053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mDisableAutoCommitEnglishMask |= AUTO_COMMIT_ENGLISH_OFF;
2719053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                preferenceDictionary = EngineState.PREFERENCE_DICTIONARY_EMAIL_ADDRESS_URI;
2720053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2721053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2722053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case EditorInfo.TYPE_TEXT_VARIATION_POSTAL_ADDRESS:
2723053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                preferenceDictionary = EngineState.PREFERENCE_DICTIONARY_POSTAL_ADDRESS;
2724053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2725053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
27267b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            case EditorInfo.TYPE_TEXT_VARIATION_PHONETIC:
27277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mEnableLearning = false;
27287b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mEnableConverter = false;
27297b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mEnableSymbolList = false;
27307b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                break;
27317b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
2732053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            default:
2733053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2734053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
27357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            break;
27367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
27377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        default:
27387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            break;
27397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
27407b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
2741e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mFilter.filter == 0) {
274277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            mConverterEN.setFilter(null);
274377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            mConverterJAJP.setFilter(null);
27447b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else {
274577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            mConverterEN.setFilter(mFilter);
274677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            mConverterJAJP.setFilter(mFilter);
2747053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
27487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
2749053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        EngineState state = new EngineState();
2750053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        state.preferenceDictionary = preferenceDictionary;
2751053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        state.convertType = EngineState.CONVERT_TYPE_NONE;
27527b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        state.keyboard = mEngineState.keyboard;
2753053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        updateEngineState(state);
27547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        updateMetaKeyStateDisplay();
2755e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
275659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!OpenWnn.isXLarge()) {
275759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            checkTutorial(info.privateImeOptions);
275859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
2759053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
27603fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
2761053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
27627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Append a {@link StrSegment} to the composing text
2763053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * <br>
2764053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * If the length of the composing text exceeds
27657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * {@code LIMIT_INPUT_NUMBER}, the appending operation is ignored.
2766053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
2767053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  str  Input segment
2768053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2769053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void appendStrSegment(StrSegment str) {
2770053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ComposingText composingText = mComposingText;
27713fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
2772053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (composingText.size(ComposingText.LAYER1) >= LIMIT_INPUT_NUMBER) {
2773e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return; /* do nothing */
2774053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2775053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        composingText.insertStrSegment(ComposingText.LAYER0, ComposingText.LAYER1, str);
2776053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return;
2777053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2778053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2779053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
27807b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Commit the consecutive clause conversion.
2781053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2782053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void commitConvertingText() {
2783053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mEngineState.isConvertState()) {
2784053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int size = mComposingText.size(ComposingText.LAYER2);
2785053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            for (int i = 0; i < size; i++) {
2786053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                learnWord(i);
2787053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
2788053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2789053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            String text = mComposingText.toString(ComposingText.LAYER2);
27907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mInputConnection.commitText(text, (FIX_CURSOR_TEXT_END ? 1 : text.length()));
2791e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mPrevCommitText.append(text);
2792e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mPrevCommitCount++;
2793053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            initializeScreen();
2794053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2795053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
27963fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
2797053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2798053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Initialize the screen displayed by IME
2799053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2800053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void initializeScreen() {
2801e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mComposingText.size(ComposingText.LAYER0) != 0) {
2802e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mInputConnection.setComposingText("", 0);
2803e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
2804053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mComposingText.clear();
28053fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng        mExactMatchMode = false;
2806053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mStatus = STATUS_INIT;
2807e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mHandler.removeMessages(MSG_PREDICTION);
2808053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        View candidateView = mCandidatesViewManager.getCurrentView();
2809053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if ((candidateView != null) && candidateView.isShown()) {
2810053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mCandidatesViewManager.clearCandidates();
2811053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2812053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputViewManager.onUpdateState(this);
2813e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
2814e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        EngineState state = new EngineState();
2815e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_NONE;
2816e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        updateEngineState(state);
2817053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
28183fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
2819053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2820053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Whether the tail of the string is alphabet or not.
2821053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
282277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param  str      The string
282377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return          {@code true} if the tail is alphabet; {@code false} if otherwise.
2824053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2825053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean isAlphabetLast(String str) {
2826e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        Matcher m = ENGLISH_CHARACTER_LAST.matcher(str);
2827053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return m.matches();
2828053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
2829053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2830053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see jp.co.omronsoft.openwnn.OpenWnn#onFinishInput */
2831053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void onFinishInput() {
2832053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mInputConnection != null) {
2833053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            initializeScreen();
2834053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
2835053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.onFinishInput();
2836053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
28377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
28387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /**
28397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Check whether or not the converter is active.
28403fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng     *
28417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @return {@code true} if the converter is active.
28427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     */
28437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean isEnableL2Converter() {
28447b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (mConverter == null || !mEnableConverter) {
28457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            return false;
28467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
28477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
28487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (mEngineState.isEnglish() && !mEnablePrediction) {
28497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            return false;
28507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
28517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
28527b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        return true;
28537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
28547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
285577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    /**
285677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * Handling KeyEvent(KEYUP)
285777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * <br>
285877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * This method is called from {@link #onEvent()}.
285977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     *
286077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param ev   An up key event
286177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     */
28623feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    private void onKeyUpEvent(KeyEvent ev) {
28633feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        int key = ev.getKeyCode();
28643feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        if(!mShiftPressing){
28653feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            if(key == KeyEvent.KEYCODE_SHIFT_LEFT || key == KeyEvent.KEYCODE_SHIFT_RIGHT){
28663feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                mHardShift = 0;
28673feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                mShiftPressing = true;
28683feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                updateMetaKeyStateDisplay();
28693feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            }
28703feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        }
28713feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        if(!mAltPressing ){
28723feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            if(key == KeyEvent.KEYCODE_ALT_LEFT || key == KeyEvent.KEYCODE_ALT_RIGHT){
28733feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                mHardAlt = 0;
28743feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                mAltPressing   = true;
28753feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                updateMetaKeyStateDisplay();
28763feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            }
28773feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        }
287859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mEnableHardware12Keyboard && !mDirectInputMode) {
287959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (isHardKeyboard12KeyLongPress(key)
288059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    && ((ev.getFlags() & KeyEvent.FLAG_CANCELED_LONG_PRESS) == 0)) {
288159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                switch (key) {
288259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case KeyEvent.KEYCODE_SOFT_LEFT:
288359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mEngineState.isSymbolList()) {
288459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        switchSymbolList();
288559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    } else if ((mComposingText.size(0) != 0) && !mEngineState.isRenbun()
288659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            && (((DefaultSoftKeyboardJAJP)mInputViewManager).getKeyMode()
288759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                     == DefaultSoftKeyboardJAJP.KEYMODE_JA_FULL_HIRAGANA)) {
288859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        startConvert(EngineState.CONVERT_TYPE_RENBUN);
288959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    } else {
289059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        ((DefaultSoftKeyboard) mInputViewManager).onKey(
289159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                DefaultSoftKeyboard.KEYCODE_JP12_EMOJI, null);
289259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
289359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
289459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
289559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case KeyEvent.KEYCODE_SOFT_RIGHT:
289659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    ((DefaultSoftKeyboardJAJP) mInputViewManager).showInputModeSwitchDialog();
289759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
289859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
289959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case KeyEvent.KEYCODE_DEL:
290059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    int newKeyCode = KeyEvent.KEYCODE_FORWARD_DEL;
290159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    int composingTextSize = mComposingText.size(ComposingText.LAYER1);
290259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (composingTextSize > 0) {
290359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        if (mComposingText.getCursor(ComposingText.LAYER1) > (composingTextSize - 1)) {
290459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            newKeyCode = KeyEvent.KEYCODE_DEL;
290559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        }
290659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        KeyEvent keyEvent = new KeyEvent(ev.getAction(), newKeyCode);
290759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        if (!processKeyEvent(keyEvent)) {
290859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            sendDownUpKeyEvents(keyEvent.getKeyCode());
290959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        }
291059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    } else {
291159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        if (mInputConnection != null) {
291259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            CharSequence text = mInputConnection.getTextAfterCursor(1, 0);
291359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            if ((text == null) || (text.length() == 0)) {
291459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                newKeyCode = KeyEvent.KEYCODE_DEL;
291559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            }
291659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        }
291759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        sendDownUpKeyEvents(newKeyCode);
291859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
291959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
292059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
292159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                default:
292259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
292359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
292459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
292559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
292659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
292759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
292859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
292959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
293059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Handling KeyEvent(KEYLONGPRESS)
293159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * <br>
293259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * This method is called from {@link #handleEvent}.
293359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
293459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param ev   An long press key event
293559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return    {@code true} if the event is processed in this method; {@code false} if not.
293659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
293759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean onKeyLongPressEvent(KeyEvent ev) {
293859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mEnableHardware12Keyboard) {
293959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int keyCode = 0;
294059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (ev != null) {
294159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                keyCode = ev.getKeyCode();
294259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
294359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            switch (keyCode) {
294459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case KeyEvent.KEYCODE_DEL:
294559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                initializeScreen();
294659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (mInputConnection != null) {
294759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mInputConnection.deleteSurroundingText(Integer.MAX_VALUE, Integer.MAX_VALUE);
294859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
294959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
295059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
295159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            default:
295259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                break;
295359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
295459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
295559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
295659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return false;
29573feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    }
29583feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
295977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    /**
2960e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Initialize the committed text's information.
296177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     */
2962e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void initCommitInfoForWatchCursor() {
2963e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (!isEnableL2Converter()) {
296477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            return;
296577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        }
2966e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
2967e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mCommitStartCursor = mComposingStartCursor;
296877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        mPrevCommitText.delete(0, mPrevCommitText.length());
296977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
29703fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng
297177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    /**
297277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * Clear the commit text's info.
2973e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @return {@code true}:cleared, {@code false}:has already cleared.
297477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     */
2975e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private boolean clearCommitInfo() {
2976e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mCommitStartCursor < 0) {
2977e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return false;
2978e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
2979e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
2980e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mCommitStartCursor = -1;
2981e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return true;
298277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
298377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
298477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    /**
298577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * Verify the commit text.
298677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     */
298777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    private void checkCommitInfo() {
2988e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mCommitStartCursor < 0) {
298977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            return;
299077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        }
299177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
299277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        int composingLength = mComposingText.toString(mTargetLayer).length();
2993e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        CharSequence seq = mInputConnection.getTextBeforeCursor(mPrevCommitText.length() + composingLength, 0);
299477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        seq = seq.subSequence(0, seq.length() - composingLength);
299577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        if (!seq.equals(mPrevCommitText.toString())) {
2996e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mPrevCommitCount = 0;
299777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            clearCommitInfo();
2998e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
2999e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
3000e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
3001e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
3002e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Check and start the tutorial if it is the tutorial mode.
30033fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng     *
3004e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param privateImeOptions IME's options
3005e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
3006e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void checkTutorial(String privateImeOptions) {
3007e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (privateImeOptions == null) return;
30083fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng        if (privateImeOptions.equals("com.google.android.setupwizard:ShowTutorial")) {
3009e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if ((mTutorial == null) && mEnableTutorial) startTutorial();
30103fbdfb6aaee678cb67c6967db4f8785f946a6ddaFreeman Ng        } else if (privateImeOptions.equals("com.google.android.setupwizard:HideTutorial")) {
3011e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mTutorial != null) {
3012e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mTutorial.close()) {
3013e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mTutorial = null;
3014e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
3015e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
3016e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
3017e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
3018e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
3019e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
3020e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Start the tutorial
3021e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
3022e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void startTutorial() {
3023e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        DefaultSoftKeyboardJAJP manager = (DefaultSoftKeyboardJAJP) mInputViewManager;
3024e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        manager.setDefaultKeyboard();
3025e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mEngineState.keyboard == EngineState.KEYBOARD_QWERTY) {
3026e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            manager.changeKeyboardType(DefaultSoftKeyboard.KEYBOARD_12KEY);
3027e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
3028e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
3029e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        DefaultSoftKeyboardJAJP inputManager = ((DefaultSoftKeyboardJAJP) mInputViewManager);
3030e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        View v = inputManager.getKeyboardView();
3031e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        v.setOnTouchListener(new View.OnTouchListener() {
30322d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                public boolean onTouch(View v, MotionEvent event) {
30332d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                    return true;
30342d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa                }});
3035e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_TUTORIAL), 500);
303677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
3037053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
3038e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
3039e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Close the tutorial
3040e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
3041e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    public void tutorialDone() {
3042e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mTutorial = null;
3043e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
30447b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
3045e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see OpenWnn#close */
3046e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    @Override protected void close() {
3047e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLOSE), 0);
3048e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
30493feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
3050e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
3051e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Break the sequence of words.
3052e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
3053e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void breakSequence() {
3054e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mEnableAutoDeleteSpace = false;
3055e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mConverterJAJP.breakSequence();
3056e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mConverterEN.breakSequence();
3057e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
305859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
305959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
306059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Switch symbol list.
306159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
306259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void switchSymbolList(){
306359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        changeSymbolEngineState(new EngineState(), ENGINE_MODE_SYMBOL);
306459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mHardAlt = 0;
306559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        updateMetaKeyStateDisplay();
306659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
306759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
306859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
306959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Change symbol engine state.
307059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
307159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param  state  Engine state
307259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param  mode   Engine mode
307359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
307459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void changeSymbolEngineState(EngineState state, int mode) {
307559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        state.temporaryMode = EngineState.TEMPORARY_DICTIONARY_MODE_SYMBOL;
307659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        updateEngineState(state);
307759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
307859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
307959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
308059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set enable tabs.
308159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
308259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param enableEmoticon {@code true}  - Emoticon is enabled.
308359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *                       {@code false} - Emoticon is disabled.
308459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
308559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void setEnabledTabs(boolean enableEmoticon) {
308659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mTextCandidatesViewManager.setEnableEmoticon(enableEmoticon);
308759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
308859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
308959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
309059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Is enable hard keyboard 12Key long press keycode.
309159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
309259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param  keyCode  keycode.
309359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return  {@code true} if enable long press keycode; {@code false} if not.
309459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
309559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean isHardKeyboard12KeyLongPress(int keyCode) {
309659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean isLongPress = false;
309759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        switch (keyCode) {
309859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_SOFT_LEFT:
309959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_SOFT_RIGHT:
310059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_DEL:
310159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            isLongPress = true;
310259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
310359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
310459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        default:
310559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
310659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
310759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return isLongPress;
310859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
310959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
311059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
311159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Key event handler for hardware 12Keyboard.
311259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
311359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param keyEvent A key event
311459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return  {@code true} if the event is handled in this method.
311559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
311659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean processHardware12Keyboard(KeyEvent keyEvent) {
311759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean ret = false;
311859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mEnableHardware12Keyboard && (keyEvent != null)) {
311959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int keyCode = keyEvent.getKeyCode();
312059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
312159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (isHardKeyboard12KeyLongPress(keyCode)) {
312259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (keyEvent.getRepeatCount() == 0) {
312359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    keyEvent.startTracking();
312459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
312559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                ret = true;
312659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
312759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                Integer code = HW12KEYBOARD_KEYCODE_REPLACE_TABLE.get(keyCode);
312859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (code != null) {
312959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (keyEvent.getRepeatCount() == 0) {
313059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        ((DefaultSoftKeyboard) mInputViewManager).onKey(code.intValue(), null);
313159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
313259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    ret = true;
313359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
313459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
313559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
313659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return ret;
313759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
3138e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa}
3139