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