2 * Copyright (C) 2008,2009 OMRON SOFTWARE Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 package com.hiroshica.android.input.nicownn2.JAJP;
21 import android.view.KeyEvent;
22 import android.view.inputmethod.EditorInfo;
23 import android.view.inputmethod.InputConnection;
24 import android.inputmethodservice.Keyboard;
25 import android.util.Log;
26 import android.view.View;
27 import android.content.SharedPreferences;
29 import android.preference.PreferenceManager;
32 import java.util.HashMap;
33 import java.util.Locale;
34 import java.util.List;
36 import com.hiroshica.android.input.nicownn2.*;
39 * The default Software Keyboard class for Japanese IME.
41 * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD. All Rights Reserved.
43 public class DefaultSoftKeyboardTest extends DefaultSoftKeyboard {
45 /** Enable English word prediction on half-width alphabet mode */
46 private static final boolean USE_ENGLISH_PREDICT = true;
48 /** Key code for switching to full-width alphabet mode */
49 private static final int KEYCODE_SWITCH_FULL_ALPHABET = -303;
51 /** Key code for switching to full-width number mode */
52 private static final int KEYCODE_SWITCH_FULL_NUMBER = -304;
54 /** Key code for switching to half-width alphabet mode */
55 private static final int KEYCODE_SWITCH_HALF_ALPHABET = -307;
57 /** Key code for switching to half-width number mode */
58 private static final int KEYCODE_SWITCH_HALF_NUMBER = -308;
60 /** Key code for case toggle key */
61 private static final int KEYCODE_SELECT_CASE = -309;
63 /** Key code for EISU-KANA conversion */
64 private static final int KEYCODE_EISU_KANA = -305;
66 /** Key code for switching to full-width Nicotouch mode */
67 private static final int KEYCODE_SWITCH_FULL_NICO = -400;
69 /** Key code for NOP (no-operation) */
70 private static final int KEYCODE_NOP = -310;
73 /** Input mode toggle cycle table */
74 private static final int[] JP_MODE_CYCLE_TABLE = {
75 KEYMODE_JA_FULL_NICO, KEYMODE_JA_HALF_ALPHABET, KEYMODE_JA_HALF_NUMBER,
78 /** Definition for {@code mInputType} (toggle) */
79 private static final int INPUT_TYPE_TOGGLE = 1;
81 /** Definition for {@code mInputType} (commit instantly) */
82 private static final int INPUT_TYPE_INSTANT = 2;
84 /** Max key number of the 12 key keyboard (depends on the definition of keyboards) */
85 private static final int KEY_NUMBER_12KEY = 20;
87 /** Toggle cycle table for full-width alphabet */
88 private static final String[][] JP_FULL_ALPHABET_CYCLE_TABLE = {
89 {"\uff0e", "\uff20", "\uff0d", "\uff3f", "\uff0f", "\uff1a", "\uff5e", "\uff11"},
90 {"\uff41", "\uff42", "\uff43", "\uff21", "\uff22", "\uff23", "\uff12"},
91 {"\uff44", "\uff45", "\uff46", "\uff24", "\uff25", "\uff26", "\uff13"},
92 {"\uff47", "\uff48", "\uff49", "\uff27", "\uff28", "\uff29", "\uff14"},
93 {"\uff4a", "\uff4b", "\uff4c", "\uff2a", "\uff2b", "\uff2c", "\uff15"},
94 {"\uff4d", "\uff4e", "\uff4f", "\uff2d", "\uff2e", "\uff2f", "\uff16"},
95 {"\uff50", "\uff51", "\uff52", "\uff53", "\uff30", "\uff31", "\uff32", "\uff33", "\uff17"},
96 {"\uff54", "\uff55", "\uff56", "\uff34", "\uff35", "\uff36", "\uff18"},
97 {"\uff57", "\uff58", "\uff59", "\uff5a", "\uff37", "\uff38", "\uff39", "\uff3a", "\uff19"},
99 {"\uff0c", "\uff0e", "\uff1f", "\uff01", "\u30fb", "\u3000"}
102 /** Replace table for full-width alphabet */
103 private static final HashMap<String,String> JP_FULL_ALPHABET_REPLACE_TABLE = new HashMap<String,String>() {
107 private static final long serialVersionUID = 1L;
109 put("\uff21", "\uff41"); put("\uff22", "\uff42"); put("\uff23", "\uff43"); put("\uff24", "\uff44"); put("\uff25", "\uff45");
110 put("\uff41", "\uff21"); put("\uff42", "\uff22"); put("\uff43", "\uff23"); put("\uff44", "\uff24"); put("\uff45", "\uff25");
111 put("\uff26", "\uff46"); put("\uff27", "\uff47"); put("\uff28", "\uff48"); put("\uff29", "\uff49"); put("\uff2a", "\uff4a");
112 put("\uff46", "\uff26"); put("\uff47", "\uff27"); put("\uff48", "\uff28"); put("\uff49", "\uff29"); put("\uff4a", "\uff2a");
113 put("\uff2b", "\uff4b"); put("\uff2c", "\uff4c"); put("\uff2d", "\uff4d"); put("\uff2e", "\uff4e"); put("\uff2f", "\uff4f");
114 put("\uff4b", "\uff2b"); put("\uff4c", "\uff2c"); put("\uff4d", "\uff2d"); put("\uff4e", "\uff2e"); put("\uff4f", "\uff2f");
115 put("\uff30", "\uff50"); put("\uff31", "\uff51"); put("\uff32", "\uff52"); put("\uff33", "\uff53"); put("\uff34", "\uff54");
116 put("\uff50", "\uff30"); put("\uff51", "\uff31"); put("\uff52", "\uff32"); put("\uff53", "\uff33"); put("\uff54", "\uff34");
117 put("\uff35", "\uff55"); put("\uff36", "\uff56"); put("\uff37", "\uff57"); put("\uff38", "\uff58"); put("\uff39", "\uff59");
118 put("\uff55", "\uff35"); put("\uff56", "\uff36"); put("\uff57", "\uff37"); put("\uff58", "\uff38"); put("\uff59", "\uff39");
119 put("\uff3a", "\uff5a");
120 put("\uff5a", "\uff3a");
123 /** Toggle cycle table for half-width alphabet */
124 private static final String[][] JP_HALF_ALPHABET_CYCLE_TABLE = {
125 {".", "@", "-", "_", "/", ":", "~", "1"},
126 {"a", "b", "c", "A", "B", "C", "2"},
127 {"d", "e", "f", "D", "E", "F", "3"},
128 {"g", "h", "i", "G", "H", "I", "4"},
129 {"j", "k", "l", "J", "K", "L", "5"},
130 {"m", "n", "o", "M", "N", "O", "6"},
131 {"p", "q", "r", "s", "P", "Q", "R", "S", "7"},
132 {"t", "u", "v", "T", "U", "V", "8"},
133 {"w", "x", "y", "z", "W", "X", "Y", "Z", "9"},
135 {",", ".", "?", "!", ";", " "}
138 /** Replace table for half-width alphabet */
139 private static final HashMap<String,String> JP_HALF_ALPHABET_REPLACE_TABLE = new HashMap<String,String>() {
143 private static final long serialVersionUID = 1L;
145 put("A", "a"); put("B", "b"); put("C", "c"); put("D", "d"); put("E", "e");
146 put("a", "A"); put("b", "B"); put("c", "C"); put("d", "D"); put("e", "E");
147 put("F", "f"); put("G", "g"); put("H", "h"); put("I", "i"); put("J", "j");
148 put("f", "F"); put("g", "G"); put("h", "H"); put("i", "I"); put("j", "J");
149 put("K", "k"); put("L", "l"); put("M", "m"); put("N", "n"); put("O", "o");
150 put("k", "K"); put("l", "L"); put("m", "M"); put("n", "N"); put("o", "O");
151 put("P", "p"); put("Q", "q"); put("R", "r"); put("S", "s"); put("T", "t");
152 put("p", "P"); put("q", "Q"); put("r", "R"); put("s", "S"); put("t", "T");
153 put("U", "u"); put("V", "v"); put("W", "w"); put("X", "x"); put("Y", "y");
154 put("u", "U"); put("v", "V"); put("w", "W"); put("x", "X"); put("y", "Y");
161 SetupKeyboard mSetupKeyboard;
162 String[][][] mCycleTable;
163 HashMap<String, String> mReplaceTable;
165 /** Character table for full-width number */
166 private static final char[] INSTANT_CHAR_CODE_FULL_NUMBER =
167 "\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19\uff10\uff03\uff0a".toCharArray();
169 /** Character table for half-width number */
170 private static final char[] INSTANT_CHAR_CODE_HALF_NUMBER =
171 "1234567890#*".toCharArray();
173 /** The constant for mFixedKeyMode. It means that input mode is not fixed. */
174 private static final int INVALID_KEYMODE = -1;
176 /** KeyIndex of "Moji" key on 12 keyboard (depends on the definition of keyboards) */
177 private static final int KEY_INDEX_CHANGE_MODE_12KEY = 15;
179 /** KeyIndex of "Moji" key on QWERTY keyboard (depends on the definition of keyboards) */
180 private static final int KEY_INDEX_CHANGE_MODE_QWERTY = 29;
182 /** Type of input mode */
183 private int mInputType = INPUT_TYPE_TOGGLE;
185 /** Previous input character code */
186 private int mPrevInputKeyCode = 0;
188 /** flick nicoinput **/
189 private static final int NICOFLICK_NONE = 0;
190 private static final int NICOFLICK_1STROKE = 1;
191 private static final int NICOFLICK_NICOSTROKE = 2;
193 private int mFlickNicoInput = 0;
194 private boolean mNicoFlick = false;
195 private static final HashMap<String, Integer> flickModeTable = new HashMap<String, Integer>() {
199 private static final long serialVersionUID = 1L;
202 put("none_flick", 0);
203 put("normal_stroke", 1);
204 put("nico_stroke", 2);
207 private static final NicoWnnEvent mEventTouchOtherKey = new NicoWnnEvent(NicoWnnEvent.TOUCH_OTHER_KEY);
208 private static final NicoWnnEvent mEventCommitText = new NicoWnnEvent(NicoWnnEvent.COMMIT_COMPOSING_TEXT);
209 private static final NicoWnnEvent mEventConvert = new NicoWnnEvent(NicoWnnEvent.CONVERT);
211 private static final NicoWnnEvent mEventChangeMode12Key = new NicoWnnEvent(NicoWnnEvent.CHANGE_MODE, NicoWnnJAJP.ENGINE_MODE_OPT_TYPE_12KEY);
212 private static final NicoWnnEvent mEventChangeModeQwerty = new NicoWnnEvent(NicoWnnEvent.CHANGE_MODE, NicoWnnJAJP.ENGINE_MODE_OPT_TYPE_QWERTY);
213 private static final NicoWnnEvent mEventChangeModeSymbol = new NicoWnnEvent(NicoWnnEvent.CHANGE_MODE, NicoWnnJAJP.ENGINE_MODE_SYMBOL);
214 private static final NicoWnnEvent mEventChangeModeDocomo = new NicoWnnEvent(NicoWnnEvent.CHANGE_MODE, NicoWnnJAJP.ENGINE_MODE_DOCOMOSYMBOL);
215 private static final NicoWnnEvent mEventChangeModeEisuKana = new NicoWnnEvent(NicoWnnEvent.CHANGE_MODE, NicoWnnJAJP.ENGINE_MODE_EISU_KANA);
217 private static final NicoWnnEvent mEventInputShiftLeft = new NicoWnnEvent(NicoWnnEvent.INPUT_SOFT_KEY, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SHIFT_LEFT));
219 private static final NicoWnnEvent mEventInputKeyDel = new NicoWnnEvent(NicoWnnEvent.INPUT_SOFT_KEY, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));
220 private static final NicoWnnEvent mEventInputEnter = new NicoWnnEvent(NicoWnnEvent.INPUT_SOFT_KEY, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
221 private static final NicoWnnEvent mEventInputBack = new NicoWnnEvent(NicoWnnEvent.INPUT_KEY, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
222 private static final NicoWnnEvent mEventInputDpadLeft = new NicoWnnEvent(NicoWnnEvent.INPUT_SOFT_KEY, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT));
223 private static final NicoWnnEvent mEventInputDpadRight = new NicoWnnEvent(NicoWnnEvent.INPUT_SOFT_KEY, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT));
227 * Character table to input when mInputType becomes INPUT_TYPE_INSTANT.
228 * (Either INSTANT_CHAR_CODE_FULL_NUMBER or INSTANT_CHAR_CODE_HALF_NUMBER)
230 private char[] mCurrentInstantTable = null;
232 /** Input mode that is not able to be changed. If ENABLE_CHANGE_KEYMODE is set, input mode can change. */
233 private int[] mLimitedKeyMode = null;
235 /** Input mode that is given the first priority. If ENABLE_CHANGE_KEYMODE is set, input mode can change. */
236 private int mPreferenceKeyMode = INVALID_KEYMODE;
238 /** The last input type */
239 private int mLastInputType = 0;
241 /** Auto caps mode */
242 private boolean mEnableAutoCaps = true;
244 /** PopupResId of "Moji" key (this is used for canceling long-press) */
245 private int mPopupResId = 0;
247 /** Whether the InputType is null */
248 private boolean mIsInputTypeNull = false;
250 /** {@code SharedPreferences} for save the keyboard type */
251 private SharedPreferences.Editor mPrefEditor = null;
253 /** "Moji" key (this is used for canceling long-press) */
254 private Keyboard.Key mChangeModeKey = null;
256 private boolean mNicoFirst = false;
258 private Keyboard[][] mNicoKeyboard;
260 private boolean mGetNoFlipScreen = false;
261 private boolean mNoFlipScreen = false;
263 /** option keyboard type */
264 private int mHookStockKeyType;
266 /** change eisu change mode **/
267 private boolean mChange12keyQwertyMode = false;
268 private final int[] m12keyTable = {
269 KEYBOARD_12KEY, KEYBOARD_12KEY, KEYBOARD_QWERTY, KEYBOARD_QWERTY, KEYBOARD_12KEY, KEYBOARD_QWERTY, KEYBOARD_QWERTY, KEYBOARD_12KEY, KEYBOARD_12KEY
271 /** option bell type **/
272 private final int ALPHAMODE_SMALL = 0;
273 private final int ALPHAMODE_BIG = 1;
274 private int mChangeAlphaBigMode = ALPHAMODE_SMALL;
276 /** Default constructor */
277 public DefaultSoftKeyboardTest(SetupKeyboard keyboard) {
278 mSetupKeyboard = keyboard;
279 mCycleTable = keyboard.SetupCycleTable();
280 mReplaceTable = keyboard.SetupReplaceTable();
282 mCurrentLanguage = LANG_JA;
283 mCurrentKeyboardType = KEYBOARD_12KEY;
284 mHookStockKeyType = KEYBOARD_12KEY;
285 mShiftOn = KEYBOARD_SHIFT_OFF;
286 mCurrentKeyMode = KEYMODE_JA_FULL_NICO;
287 mCurrentSlide = NICO_SLIDE_MODE_TOP;
290 /** @see com.hiroshica.android.input.nicownn2.DefaultSoftKeyboard#createKeyboards */
291 @Override protected void createKeyboards(NicoWnn parent) {
293 /* Keyboard[# of Languages][portrait/landscape][# of keyboard type][shift off/on][max # of key-modes][noinput/input] */
294 mKeyboard = new Keyboard[3][2][4][2][9][2];
296 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(parent);
297 mChange12keyQwertyMode = pref.getBoolean("change_12key_qwerty", false);
298 boolean getalphamode = pref.getBoolean("change_alphamode", false);
299 mGetNoFlipScreen = pref.getBoolean("no_flip_screen", false);
300 mFlickNicoInput = flickModeTable.get(pref.getString("nicoflick_mode", "none_flick"));
302 if (false == getalphamode) {
303 mChangeAlphaBigMode = ALPHAMODE_SMALL;
306 mChangeAlphaBigMode = ALPHAMODE_BIG;
309 if (true == mGetNoFlipScreen) {
310 mNoFlipScreen = true;
313 mNoFlipScreen = false;
316 /* Create the suitable keyboard object */
317 if (mDisplayMode == DefaultSoftKeyboard.PORTRAIT) {
318 //mCurrentKeyboardType = KEYBOARD_12KEY;
319 createKeyboardsPortrait(parent);
321 //mCurrentKeyboardType = KEYBOARD_QWERTY;
322 createKeyboardsLandscape(parent);
325 if (mCurrentKeyboardType == KEYBOARD_12KEY) {
326 mWnn.onEvent(mEventChangeMode12Key);
328 mWnn.onEvent(mEventChangeModeQwerty);
333 * Commit the pre-edit string for committing operation that is not explicit
334 * (ex. when a candidate is selected)
336 private void commitText() {
338 mWnn.onEvent(mEventCommitText);
345 * @param keyMode The type of input mode
347 public void changeKeyMode(int keyMode) {
348 int targetMode = filterKeyMode(keyMode);
349 if (targetMode == INVALID_KEYMODE) {
356 mWnn.onEvent(mEventInputShiftLeft);
359 mShiftOn = KEYBOARD_SHIFT_OFF;
360 Keyboard kbd = getModeChangeKeyboard(targetMode);
361 mCurrentKeyMode = targetMode;
362 mPrevInputKeyCode = 0;
365 int mode = NicoWnnEvent.Mode.DIRECT;
367 switch (targetMode) {
368 case KEYMODE_JA_HALF_ALPHABET:
369 if (USE_ENGLISH_PREDICT) {
370 mInputType = INPUT_TYPE_TOGGLE;
371 mode = NicoWnnEvent.Mode.NO_LV1_CONV;
373 mInputType = INPUT_TYPE_TOGGLE;
374 mode = NicoWnnEvent.Mode.DIRECT;
378 case KEYMODE_JA_FULL_NUMBER:
379 mInputType = INPUT_TYPE_INSTANT;
380 mode = NicoWnnEvent.Mode.DIRECT;
381 mCurrentInstantTable = INSTANT_CHAR_CODE_FULL_NUMBER;
384 case KEYMODE_JA_HALF_NUMBER:
385 mInputType = INPUT_TYPE_INSTANT;
386 mode = NicoWnnEvent.Mode.DIRECT;
387 mCurrentInstantTable = INSTANT_CHAR_CODE_HALF_NUMBER;
390 case KEYMODE_JA_FULL_ALPHABET:
391 mInputType = INPUT_TYPE_TOGGLE;
392 mode = NicoWnnEvent.Mode.DIRECT;
395 case KEYMODE_JA_FULL_NICO:
396 mInputType = INPUT_TYPE_TOGGLE;
397 mode = NicoWnnEvent.Mode.DEFAULT;
408 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.CHANGE_MODE, mode));
409 if (mChange12keyQwertyMode == true) {
410 changeKeyboardType(m12keyTable[targetMode]);
414 /** @see com.hiroshica.android.input.nicownn2.DefaultSoftKeyboard#initView */
415 @Override public View initView(NicoWnn parent, int width, int height) {
416 View view = super.initView(parent, width, height);
417 changeKeyboard(mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0]);
421 /** @see com.hiroshica.android.input.nicownn2.DefaultSoftKeyboard#changeKeyboard */
422 @Override protected boolean changeKeyboard(Keyboard keyboard) {
424 if (keyboard != null) {
425 if (mIsInputTypeNull) {
426 mChangeModeKey.popupResId = mPopupResId;
429 List<Keyboard.Key> keys = keyboard.getKeys();
430 int keyIndex = (KEY_NUMBER_12KEY < keys.size())
431 ? KEY_INDEX_CHANGE_MODE_QWERTY : KEY_INDEX_CHANGE_MODE_12KEY;
432 mChangeModeKey = keys.get(keyIndex);
434 if (mIsInputTypeNull) {
435 mPopupResId = mChangeModeKey.popupResId;
436 mChangeModeKey.popupResId = 0;
439 return super.changeKeyboard(keyboard);
442 /** @see com.hiroshica.android.input.nicownn2.DefaultSoftKeyboard#changeKeyboardType */
443 @Override public void changeKeyboardType(int type) {
445 Keyboard kbd = getTypeChangeKeyboard(type);
447 mCurrentKeyboardType = type;
448 mPrefEditor.putBoolean("opt_enable_qwerty", type == KEYBOARD_QWERTY);
449 mPrefEditor.commit();
452 if (type == KEYBOARD_12KEY) {
453 mWnn.onEvent(mEventChangeMode12Key);
455 mWnn.onEvent(mEventChangeModeQwerty);
458 /** @see com.hiroshica.android.input.nicownn2.DefaultSoftKeyboard#setPreferences */
459 @Override public void setPreferences(SharedPreferences pref, EditorInfo editor) {
460 mPrefEditor = pref.edit();
461 boolean isQwerty = pref.getBoolean("opt_enable_qwerty", false);
462 if (isQwerty && (mCurrentKeyboardType != KEYBOARD_QWERTY)) {
463 changeKeyboardType(KEYBOARD_QWERTY);
466 super.setPreferences(pref, editor);
468 int inputType = editor.inputType;
469 if (mHardKeyboardHidden) {
470 if (inputType == EditorInfo.TYPE_NULL) {
471 if (!mIsInputTypeNull) {
472 mIsInputTypeNull = true;
473 mPopupResId = mChangeModeKey.popupResId;
474 mChangeModeKey.popupResId = 0;
479 if (mIsInputTypeNull) {
480 mIsInputTypeNull = false;
481 mChangeModeKey.popupResId = mPopupResId;
485 mEnableAutoCaps = pref.getBoolean("auto_caps", true);
486 mLimitedKeyMode = null;
487 mPreferenceKeyMode = INVALID_KEYMODE;
489 mDisableKeyInput = false;
492 switch (inputType & EditorInfo.TYPE_MASK_CLASS) {
494 case EditorInfo.TYPE_CLASS_NUMBER:
495 case EditorInfo.TYPE_CLASS_DATETIME:
496 mPreferenceKeyMode = KEYMODE_JA_HALF_NUMBER;
499 case EditorInfo.TYPE_CLASS_PHONE:
500 if (mHardKeyboardHidden) {
501 //mLimitedKeyMode = new int[] {KEYMODE_JA_FULL_NICO};
502 mPreferenceKeyMode = KEYMODE_JA_FULL_NICO;
504 //mLimitedKeyMode = new int[] {KEYMODE_JA_HALF_ALPHABET};
505 mPreferenceKeyMode = KEYMODE_JA_FULL_NICO;
509 case EditorInfo.TYPE_CLASS_TEXT:
510 switch (inputType & EditorInfo.TYPE_MASK_VARIATION) {
512 case EditorInfo.TYPE_TEXT_VARIATION_PASSWORD:
513 //mLimitedKeyMode = new int[] {KEYMODE_JA_HALF_ALPHABET, KEYMODE_JA_HALF_NUMBER};
516 case EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
517 //mLimitedKeyMode = new int[] {KEYMODE_JA_HALF_ALPHABET, KEYMODE_JA_HALF_NUMBER};
519 case EditorInfo.TYPE_TEXT_VARIATION_URI:
520 //mPreferenceKeyMode = KEYMODE_JA_HALF_ALPHABET;
521 mPreferenceKeyMode = KEYMODE_JA_FULL_NICO;
533 boolean restartkey = false;
534 boolean old12keyqwerty = mChange12keyQwertyMode;
536 mChange12keyQwertyMode = pref.getBoolean("change_12key_qwerty", false);
537 boolean getalphamode = pref.getBoolean("change_alphamode", false);
538 mGetNoFlipScreen = pref.getBoolean("no_flip_screen", false);
539 mFlickNicoInput = flickModeTable.get(pref.getString("nicoflick_mode", "none_flick"));
541 if (false == getalphamode) {
542 mChangeAlphaBigMode = ALPHAMODE_SMALL;
545 mChangeAlphaBigMode = ALPHAMODE_BIG;
548 if (true == mGetNoFlipScreen) {
549 mNoFlipScreen = true;
552 mNoFlipScreen = false;
555 if (old12keyqwerty != mChange12keyQwertyMode) {
557 if (false == mChange12keyQwertyMode) {
558 mCurrentKeyboardType = mHookStockKeyType; // change last keyboard type.
562 if (inputType != mLastInputType) {
563 setDefaultKeyboard();
564 mLastInputType = inputType;
566 else if (true == restartkey) {
567 setDefaultKeyboard();
571 setShiftByEditorInfo();
574 /** @see com.hiroshica.android.input.nicownn2.DefaultSoftKeyboard#onUpdateState */
575 @Override public void onUpdateState(NicoWnn parent) {
576 super.onUpdateState(parent);
578 setShiftByEditorInfo();
579 if (true == mNoInput && true == mNicoFirst) {
585 * Change the keyboard to default
587 public void setDefaultKeyboard() {
588 Locale locale = Locale.getDefault();
589 int keymode = KEYMODE_JA_FULL_NICO;
592 if (mPreferenceKeyMode != INVALID_KEYMODE) {
593 keymode = mPreferenceKeyMode;
594 } else if (mLimitedKeyMode != null) {
595 keymode = mLimitedKeyMode[0];
597 if (!locale.getLanguage().equals(Locale.JAPANESE.getLanguage())) {
598 keymode = KEYMODE_JA_HALF_ALPHABET;
602 changeKeyMode(keymode);
607 * Change to the next input mode
609 public void nextKeyMode() {
610 /* Search the current mode in the toggle table */
611 boolean found = false;
613 for (index = 0; index < JP_MODE_CYCLE_TABLE.length; index++) {
614 if (JP_MODE_CYCLE_TABLE[index] == mCurrentKeyMode) {
621 /* If the current mode not exists, set the default mode */
622 setDefaultKeyboard();
624 /* If the current mode exists, set the next input mode */
625 int size = JP_MODE_CYCLE_TABLE.length;
626 int keyMode = INVALID_KEYMODE;
627 for (int i = 0; i < size; i++) {
628 index = (++index) % size;
630 keyMode = filterKeyMode(JP_MODE_CYCLE_TABLE[index]);
631 if (keyMode != INVALID_KEYMODE) {
636 if (keyMode != INVALID_KEYMODE) {
637 changeKeyMode(keyMode);
643 * Create the keyboard for portrait mode
645 * @param parent The context
647 private void createKeyboardsPortrait(NicoWnn parent) {
648 Keyboard[][] keyList;
649 /* qwerty shift_off (portrait) */
650 keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
651 keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet);
652 keyList[KEYMODE_JA_FULL_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols);
653 keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet);
654 keyList[KEYMODE_JA_HALF_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols);
655 keyList[KEYMODE_JA_HALF_PHONE][0] = new Keyboard(parent, R.xml.keyboard_12key_phone);
656 keyList[KEYMODE_JA_FULL_NICO][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp);
658 /* qwerty shift_on (portrait) */
659 keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
660 keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet_shift);
661 keyList[KEYMODE_JA_FULL_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_shift);
662 keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_shift);
663 keyList[KEYMODE_JA_HALF_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_shift);
664 keyList[KEYMODE_JA_HALF_PHONE][0] = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE][0];
665 keyList[KEYMODE_JA_FULL_NICO][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_shift);
667 /* 12-keys shift_off (portrait) */
668 keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
669 keyList[KEYMODE_JA_HALF_PHONE][0] = new Keyboard(parent, R.xml.keyboard_12key_phone);
671 keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet);
672 keyList[KEYMODE_JA_FULL_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet_input);
673 keyList[KEYMODE_JA_FULL_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_12key_full_num);
674 keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet);
675 keyList[KEYMODE_JA_HALF_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet_input);
676 keyList[KEYMODE_JA_HALF_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_12key_half_num);
678 /* 12-keys shift_on (portrait) */
679 keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
680 keyList[KEYMODE_JA_HALF_PHONE] = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE];
682 keyList[KEYMODE_JA_FULL_ALPHABET] = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_ALPHABET];
683 keyList[KEYMODE_JA_FULL_NUMBER] = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_NUMBER];
684 keyList[KEYMODE_JA_HALF_ALPHABET] = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_ALPHABET];;
685 keyList[KEYMODE_JA_HALF_NUMBER] = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_NUMBER];
687 mNicoKeyboard = mSetupKeyboard.SetupSoftKeyboard(parent, PORTRAIT);
689 Keyboard[][] keyListOn;
690 keyList = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
691 keyListOn = mKeyboard[LANG_JA][PORTRAIT][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
692 keyList[KEYMODE_JA_FULL_NICO] = mNicoKeyboard[NICO_SLIDE_MODE_TOP];
693 keyListOn[KEYMODE_JA_FULL_NICO] = mNicoKeyboard[NICO_SLIDE_MODE_A];
697 * Create the keyboard for landscape mode
699 * @param parent The context
701 private void createKeyboardsLandscape(NicoWnn parent) {
702 Keyboard[][] keyList;
703 /* qwerty shift_off (landscape) */
704 keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
705 keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet_land);
706 keyList[KEYMODE_JA_FULL_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_land);
707 keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_land);
708 keyList[KEYMODE_JA_HALF_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_land);
709 keyList[KEYMODE_JA_HALF_PHONE][0] = new Keyboard(parent, R.xml.keyboard_12key_phone_land);
710 keyList[KEYMODE_JA_FULL_NICO][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_land);
712 /* qwerty shift_on (landscape) */
713 keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
714 keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_alphabet_shift_land);
715 keyList[KEYMODE_JA_FULL_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_full_symbols_shift_land);
716 keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_alphabet_shift_land);
717 keyList[KEYMODE_JA_HALF_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_half_symbols_shift_land);
718 keyList[KEYMODE_JA_HALF_PHONE][0] = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE][0];
719 keyList[KEYMODE_JA_FULL_NICO][0] = new Keyboard(parent, R.xml.keyboard_qwerty_jp_shift_land);
721 /* 12-keys shift_off (landscape) */
722 keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
723 keyList[KEYMODE_JA_FULL_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet_land);
724 keyList[KEYMODE_JA_FULL_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_full_alphabet_input_land);
725 keyList[KEYMODE_JA_FULL_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_12key_full_num_land);
726 keyList[KEYMODE_JA_HALF_ALPHABET][0] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet_land);
727 keyList[KEYMODE_JA_HALF_ALPHABET][1] = new Keyboard(parent, R.xml.keyboard_12key_half_alphabet_input_land);
728 keyList[KEYMODE_JA_HALF_NUMBER][0] = new Keyboard(parent, R.xml.keyboard_12key_half_num_land);
729 keyList[KEYMODE_JA_HALF_PHONE][0] = new Keyboard(parent, R.xml.keyboard_12key_phone_land);
731 /* 12-keys shift_on (landscape) */
732 keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
733 keyList[KEYMODE_JA_FULL_ALPHABET] = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_ALPHABET];
734 keyList[KEYMODE_JA_FULL_NUMBER] = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_FULL_NUMBER];
735 keyList[KEYMODE_JA_HALF_ALPHABET] = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_ALPHABET];;
736 keyList[KEYMODE_JA_HALF_NUMBER] = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_NUMBER];
737 keyList[KEYMODE_JA_HALF_PHONE] = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF][KEYMODE_JA_HALF_PHONE];
739 mNicoKeyboard = mSetupKeyboard.SetupSoftKeyboard(parent, LANDSCAPE);
741 Keyboard[][] keyListOn;
742 keyList = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_OFF];
743 keyListOn = mKeyboard[LANG_JA][LANDSCAPE][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
744 keyList[KEYMODE_JA_FULL_NICO] = mNicoKeyboard[NICO_SLIDE_MODE_TOP];
745 keyListOn[KEYMODE_JA_FULL_NICO] = mNicoKeyboard[NICO_SLIDE_MODE_A];
749 * Convert the key code to the index of table
751 * @param index The key code
752 * @return The index of the toggle table for input
754 private int getTableIndex(int keyCode) {
756 (keyCode == KEYCODE_JP12_1) ? 0 :
757 (keyCode == KEYCODE_JP12_2) ? 1 :
758 (keyCode == KEYCODE_JP12_3) ? 2 :
759 (keyCode == KEYCODE_JP12_4) ? 3 :
760 (keyCode == KEYCODE_JP12_5) ? 4 :
761 (keyCode == KEYCODE_JP12_6) ? 5 :
762 (keyCode == KEYCODE_JP12_7) ? 6 :
763 (keyCode == KEYCODE_JP12_8) ? 7 :
764 (keyCode == KEYCODE_JP12_9) ? 8 :
765 (keyCode == KEYCODE_JP12_0) ? 9 :
766 (keyCode == KEYCODE_JP12_SHARP) ? 10 :
767 (keyCode == KEYCODE_JP12_ASTER) ? 11 :
774 * Get the toggle table for input that is appropriate in current mode.
776 * @return The toggle table for input
778 private String[][] getCycleTable() {
779 String[][] cycleTable = null;
780 switch (mCurrentKeyMode) {
781 case KEYMODE_JA_FULL_ALPHABET:
782 cycleTable = JP_FULL_ALPHABET_CYCLE_TABLE;
785 case KEYMODE_JA_FULL_NUMBER:
786 case KEYMODE_JA_HALF_NUMBER:
787 /* Because these modes belong to direct input group, No toggle table exists */
790 case KEYMODE_JA_HALF_ALPHABET:
791 cycleTable = JP_HALF_ALPHABET_CYCLE_TABLE;
794 case KEYMODE_JA_FULL_NICO:
795 cycleTable = mCycleTable[mChangeAlphaBigMode];
805 * Get the replace table that is appropriate in current mode.
807 * @return The replace table
809 private HashMap<String,String> getReplaceTable() {
810 HashMap<String,String> hashTable = null;
811 switch (mCurrentKeyMode) {
812 case KEYMODE_JA_FULL_ALPHABET:
813 hashTable = JP_FULL_ALPHABET_REPLACE_TABLE;
816 case KEYMODE_JA_FULL_NUMBER:
817 case KEYMODE_JA_HALF_NUMBER:
818 /* Because these modes belong to direct input group, No replacing table exists */
821 case KEYMODE_JA_HALF_ALPHABET:
822 hashTable = JP_HALF_ALPHABET_REPLACE_TABLE;
825 case KEYMODE_JA_FULL_NICO:
826 hashTable = mReplaceTable;
836 * Set the status icon that is appropriate in current mode
838 private void setStatusIcon() {
841 switch (mCurrentKeyMode) {
842 case KEYMODE_JA_FULL_ALPHABET:
843 icon = R.drawable.immodeic_full_alphabet;
845 case KEYMODE_JA_FULL_NUMBER:
846 icon = R.drawable.immodeic_full_number;
848 case KEYMODE_JA_HALF_ALPHABET:
849 icon = R.drawable.immodeic_half_alphabet;
851 case KEYMODE_JA_HALF_NUMBER:
852 case KEYMODE_JA_HALF_PHONE:
853 icon = R.drawable.immodeic_half_number;
855 case KEYMODE_JA_FULL_NICO:
856 icon = mSetupKeyboard.SetupIcon();
863 mWnn.showStatusIcon(icon);
867 * Get the shift key state from the editor.
869 * @param editor The editor information
870 * @return The state id of the shift key (0:off, 1:on)
872 protected int getShiftKeyState(EditorInfo editor) {
873 InputConnection connection = mWnn.getCurrentInputConnection();
874 if (connection != null) {
875 int caps = connection.getCursorCapsMode(editor.inputType);
876 return (caps == 0) ? 0 : 1;
883 * Set the shift key state from {@link EditorInfo}.
885 private void setShiftByEditorInfo() {
886 if (mEnableAutoCaps && (mCurrentKeyMode == KEYMODE_JA_HALF_ALPHABET)) {
887 int shift = getShiftKeyState(mWnn.getCurrentInputEditorInfo());
890 changeKeyboard(getShiftChangeKeyboard(shift));
894 /** @see com.hiroshica.android.input.nicownn2.DefaultSoftKeyboard#setHardKeyboardHidden */
895 @Override public void setHardKeyboardHidden(boolean hidden) {
898 mWnn.onEvent(mEventChangeModeQwerty);
901 if (mHardKeyboardHidden != hidden) {
902 if ((mLimitedKeyMode != null)
903 || ((mCurrentKeyMode != KEYMODE_JA_FULL_NICO) && (mCurrentKeyMode != KEYMODE_JA_HALF_ALPHABET))) {
905 mLastInputType = EditorInfo.TYPE_NULL;
906 if (mWnn.isInputViewShown()) {
907 setDefaultKeyboard();
912 super.setHardKeyboardHidden(hidden);
916 * Change the key-mode to the allowed one which is restricted
917 * by the text input field or the type of the keyboard.
918 * @param keyMode The key-mode
919 * @return the key-mode allowed
921 private int filterKeyMode(int keyMode) {
922 int targetMode = keyMode;
923 int[] limits = mLimitedKeyMode;
925 if (!mHardKeyboardHidden) { /* for hardware keyboard */
926 if ((targetMode != KEYMODE_JA_FULL_NICO) && (targetMode != KEYMODE_JA_HALF_ALPHABET)) {
927 Locale locale = Locale.getDefault();
928 int keymode = KEYMODE_JA_HALF_ALPHABET;
929 if (locale.getLanguage().equals(Locale.JAPANESE.getLanguage())) {
930 switch (targetMode) {
931 case KEYMODE_JA_FULL_NICO:
932 // hiromitsu-s!!! 2009-09-23 12:47:08
933 //keymode = KEYMODE_JA_FULL_NICO;
940 targetMode = keymode;
944 /* restrict by the type of the text field */
945 if (limits != null) {
946 boolean hasAccepted = false;
947 boolean hasRequiredChange = true;
948 int size = limits.length;
949 int nowMode = mCurrentKeyMode;
951 for (int i = 0; i < size; i++) {
952 if (targetMode == limits[i]) {
956 if (nowMode == limits[i]) {
957 hasRequiredChange = false;
962 if (hasRequiredChange) {
963 targetMode = mLimitedKeyMode[0];
965 targetMode = INVALID_KEYMODE;
975 /*****************************************
978 /** @see com.hiroshica.android.input.nicownn2.DefaultSoftKeyboard#onKey */
979 @Override public void onKey(int primaryCode, int[] keyCodes) {
981 if (mDisableKeyInput) {
985 if (mCurrentKeyMode == KEYMODE_JA_FULL_NICO) {
986 if (true == onKeyNico(primaryCode, keyCodes)) {
987 /* update shift key's state */
988 if (!mCapsLock && (primaryCode != DefaultSoftKeyboard.KEYCODE_QWERTY_SHIFT)) {
989 setShiftByEditorInfo();
994 switch (primaryCode) {
995 case KEYCODE_JP12_TOGGLE_MODE:
996 case KEYCODE_QWERTY_TOGGLE_MODE:
997 if (!mIsInputTypeNull) {
1002 case DefaultSoftKeyboard.KEYCODE_QWERTY_BACKSPACE:
1003 case KEYCODE_JP12_BACKSPACE:
1004 mWnn.onEvent(mEventInputKeyDel);
1007 case DefaultSoftKeyboard.KEYCODE_QWERTY_SHIFT:
1011 case DefaultSoftKeyboard.KEYCODE_QWERTY_ALT:
1015 case KEYCODE_QWERTY_ENTER:
1016 case KEYCODE_JP12_ENTER:
1017 mWnn.onEvent(mEventInputEnter);
1020 case KEYCODE_JP12_REVERSE:
1022 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.TOGGLE_REVERSE_CHAR, mCurrentCycleTable));
1026 case KEYCODE_QWERTY_KBD:
1027 changeKeyboardType(KEYBOARD_12KEY);
1028 mHookStockKeyType = KEYBOARD_12KEY;
1031 case KEYCODE_JP12_KBD:
1032 changeKeyboardType(KEYBOARD_QWERTY);
1033 mHookStockKeyType = KEYBOARD_QWERTY;
1036 case KEYCODE_JP12_EMOJI:
1037 case KEYCODE_QWERTY_EMOJI:
1039 mWnn.onEvent(mEventChangeModeSymbol);
1042 case KEYCODE_JP12_1:
1043 case KEYCODE_JP12_2:
1044 case KEYCODE_JP12_3:
1045 case KEYCODE_JP12_4:
1046 case KEYCODE_JP12_5:
1047 case KEYCODE_JP12_6:
1048 case KEYCODE_JP12_7:
1049 case KEYCODE_JP12_8:
1050 case KEYCODE_JP12_9:
1051 case KEYCODE_JP12_0:
1052 case KEYCODE_JP12_SHARP:
1053 /* Processing to input by ten key */
1054 if (mInputType == INPUT_TYPE_INSTANT) {
1055 /* Send a input character directly if instant input type is selected */
1057 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.INPUT_CHAR, mCurrentInstantTable[getTableIndex(primaryCode)]));
1059 if ((mPrevInputKeyCode != primaryCode)) {
1060 mWnn.onEvent(mEventTouchOtherKey);
1061 if ((mCurrentKeyMode == KEYMODE_JA_HALF_ALPHABET)
1062 && (primaryCode == KEYCODE_JP12_SHARP)) {
1063 /* Commit text by symbol character (',' '.') when alphabet input mode is selected */
1068 /* Convert the key code to the table index and send the toggle event with the table index */
1069 String[][] cycleTable = getCycleTable();
1070 if (cycleTable == null) {
1071 Log.e("NicoWnn", "not founds cycle table");
1073 int index = getTableIndex(primaryCode);
1074 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.TOGGLE_CHAR, cycleTable[index]));
1075 mCurrentCycleTable = cycleTable[index];
1077 mPrevInputKeyCode = primaryCode;
1081 case KEYCODE_JP12_ASTER:
1082 if (mInputType == INPUT_TYPE_INSTANT) {
1084 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.INPUT_CHAR, mCurrentInstantTable[getTableIndex(primaryCode)]));
1087 /* Processing to toggle Dakuten, Handakuten, and capital */
1088 HashMap<String,String> replaceTable = getReplaceTable();
1089 if (replaceTable == null) {
1090 Log.e("NicoWnn", "not founds replace table");
1092 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.REPLACE_CHAR, replaceTable));
1093 mPrevInputKeyCode = primaryCode;
1099 case KEYCODE_SWITCH_FULL_ALPHABET:
1100 /* Change mode to Full width alphabet */
1101 changeKeyMode(KEYMODE_JA_FULL_ALPHABET);
1104 case KEYCODE_SWITCH_FULL_NUMBER:
1105 /* Change mode to Full width numeric */
1106 changeKeyMode(KEYMODE_JA_FULL_NUMBER);
1109 case KEYCODE_SWITCH_HALF_ALPHABET:
1110 /* Change mode to Half width alphabet */
1111 changeKeyMode(KEYMODE_JA_HALF_ALPHABET);
1114 case KEYCODE_SWITCH_HALF_NUMBER:
1115 /* Change mode to Half width numeric */
1116 changeKeyMode(KEYMODE_JA_HALF_NUMBER);
1119 case KEYCODE_SWITCH_FULL_NICO:
1120 /* Change mode to Full width nicotouch */
1121 changeKeyMode(KEYMODE_JA_FULL_NICO);
1124 case KEYCODE_SELECT_CASE:
1125 int shifted = (mShiftOn == 0) ? 1 : 0;
1126 Keyboard newKeyboard = getShiftChangeKeyboard(shifted);
1127 if (newKeyboard != null) {
1129 changeKeyboard(newKeyboard);
1133 case KEYCODE_JP12_SPACE:
1134 if ((mCurrentKeyMode == KEYMODE_JA_FULL_HIRAGANA) && !mNoInput) {
1135 mWnn.onEvent(mEventConvert);
1137 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.INPUT_CHAR, ' '));
1141 case KEYCODE_EISU_KANA:
1142 mWnn.onEvent(mEventChangeModeEisuKana);
1145 case KEYCODE_JP12_CLOSE:
1146 mWnn.onEvent(mEventInputBack);
1149 case KEYCODE_JP12_LEFT:
1150 mWnn.onEvent(mEventInputDpadLeft);
1153 case KEYCODE_JP12_RIGHT:
1154 mWnn.onEvent(mEventInputDpadRight);
1160 if (primaryCode >= 0) {
1161 if (mKeyboardView.isShifted()) {
1162 primaryCode = Character.toUpperCase(primaryCode);
1164 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.INPUT_CHAR, (char)primaryCode));
1169 /* update shift key's state */
1170 if (!mCapsLock && (primaryCode != DefaultSoftKeyboard.KEYCODE_QWERTY_SHIFT)) {
1171 setShiftByEditorInfo();
1176 /*****************************************
1179 private boolean onKeyNico(int primaryCode, int[] keyCodes) {
1180 Keyboard newKeyboard = null;
1181 boolean retcode = false;
1183 //Log.v("key", "onkey event!!\n");
1185 switch (primaryCode) {
1186 case DefaultSoftKeyboard.KEYCODE_QWERTY_BACKSPACE:
1187 case KEYCODE_JP12_BACKSPACE:
1188 if (mNicoFirst == true) {
1189 resetNicoKeyboard();
1192 mWnn.onEvent(mEventInputKeyDel);
1196 case KEYCODE_QWERTY_ENTER:
1197 case KEYCODE_JP12_ENTER:
1198 if (mNicoFirst == false) {
1199 mWnn.onEvent(mEventInputEnter);
1204 case KEYCODE_JP12_REVERSE:
1205 if (mNicoFirst == true) {
1206 resetNicoKeyboard();
1212 case KEYCODE_QWERTY_KBD:
1213 case KEYCODE_JP12_KBD:
1214 resetNicoKeyboard();
1217 case KEYCODE_JP12_EMOJI:
1218 case KEYCODE_QWERTY_EMOJI:
1219 if (mNicoFirst == false) {
1221 mWnn.onEvent(mEventChangeModeSymbol);
1226 case KEYCODE_JP12_SHARP:
1227 if (mNicoFirst == false && mNoInput) {
1229 mWnn.onEvent(mEventChangeModeDocomo);
1234 case KEYCODE_JP12_1:
1235 case KEYCODE_JP12_2:
1236 case KEYCODE_JP12_3:
1237 case KEYCODE_JP12_4:
1238 case KEYCODE_JP12_5:
1239 case KEYCODE_JP12_6:
1240 case KEYCODE_JP12_7:
1241 case KEYCODE_JP12_8:
1242 case KEYCODE_JP12_9:
1243 case KEYCODE_JP12_0:
1244 if ((NICOFLICK_1STROKE == mFlickNicoInput) && (false == mNicoFirst)) {
1248 if ((NICOFLICK_NICOSTROKE == mFlickNicoInput) && (true == mNicoFlick) && (mPrevInputKeyCode == primaryCode)) {
1253 if (mNicoFirst == false) {
1254 mWnn.onEvent(mEventTouchOtherKey);
1255 mPrevInputKeyCode = primaryCode;
1259 int index = getTableIndex(primaryCode);
1260 Keyboard[][] keyList = mKeyboard[LANG_JA][mDisplayMode][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
1262 keyList[KEYMODE_JA_FULL_NICO] = mNicoKeyboard[index+1];
1263 if (false == mNoFlipScreen) {
1264 newKeyboard = getShiftChangeKeyboard(KEYBOARD_SHIFT_ON);
1265 mShiftOn = KEYBOARD_SHIFT_ON;
1266 changeKeyboard(newKeyboard);
1270 int col = getTableIndex(mPrevInputKeyCode);
1271 int row = getTableIndex(primaryCode);
1272 String[][] cycleTable = getCycleTable();
1273 if (cycleTable == null) {
1274 Log.e("NicoWnn", "not founds cycle table");
1277 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.TOGGLE_CHAR, cycleTable[col * 10 + row]));
1281 if (false == mNoFlipScreen) {
1282 newKeyboard = getShiftChangeKeyboard(KEYBOARD_SHIFT_OFF);
1283 mShiftOn = KEYBOARD_SHIFT_OFF;
1284 changeKeyboard(newKeyboard);
1290 case KEYCODE_JP12_ASTER:
1291 if (mNicoFirst == true) {
1292 resetNicoKeyboard();
1294 if (mNicoFirst == false && !mNoInput) {
1295 /* Processing to toggle Dakuten, Handakuten, and capital */
1296 HashMap<String,String> replaceTable = getReplaceTable();
1297 if (replaceTable == null) {
1298 Log.e("NicoWnn", "not founds replace table");
1300 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.REPLACE_CHAR, replaceTable));
1301 mPrevInputKeyCode = primaryCode;
1307 case KEYCODE_JP12_SPACE:
1308 if (mNicoFirst == false) {
1309 if ((mCurrentKeyMode == KEYMODE_JA_FULL_HIRAGANA) && !mNoInput) {
1310 mWnn.onEvent(mEventConvert);
1312 mWnn.onEvent(new NicoWnnEvent(NicoWnnEvent.INPUT_CHAR, ' '));
1318 case KEYCODE_EISU_KANA:
1319 if (mNicoFirst == false) {
1320 mWnn.onEvent(mEventChangeModeEisuKana);
1325 case KEYCODE_JP12_CLOSE:
1326 mWnn.onEvent(mEventInputBack);
1330 case KEYCODE_JP12_LEFT:
1331 if (mNicoFirst == false) {
1332 mWnn.onEvent(mEventInputDpadLeft);
1336 case KEYCODE_JP12_RIGHT:
1337 if (mNicoFirst == false) {
1338 mWnn.onEvent(mEventInputDpadRight);
1346 * reset nicotouch keyboard
1348 @Override public void resetNicoKeyboard() {
1349 Keyboard newKeyboard = getShiftChangeKeyboard(KEYBOARD_SHIFT_OFF);
1350 if (newKeyboard != null) {
1351 mShiftOn = KEYBOARD_SHIFT_OFF;
1352 changeKeyboard(newKeyboard);
1356 } // resetNicoKeyboard
1360 @Override public void onPress(int primaryCode) {
1361 super.onPress(primaryCode);
1362 Keyboard newKeyboard = null;
1364 mStockFlickCode = primaryCode;
1365 if (mCurrentKeyMode == KEYMODE_JA_FULL_NICO) {
1366 if (NICOFLICK_NONE == mFlickNicoInput) {
1369 switch (primaryCode) {
1370 case KEYCODE_JP12_1:
1371 case KEYCODE_JP12_2:
1372 case KEYCODE_JP12_3:
1373 case KEYCODE_JP12_4:
1374 case KEYCODE_JP12_5:
1375 case KEYCODE_JP12_6:
1376 case KEYCODE_JP12_7:
1377 case KEYCODE_JP12_8:
1378 case KEYCODE_JP12_9:
1379 case KEYCODE_JP12_0:
1380 if ((false == mNicoFirst) && (false == mNicoFlick)) {
1381 mWnn.onEvent(mEventTouchOtherKey);
1382 if (false == mNoFlipScreen) {
1384 int index = getTableIndex(primaryCode);
1385 Keyboard[][] keyList = mKeyboard[LANG_JA][mDisplayMode][KEYBOARD_12KEY][KEYBOARD_SHIFT_ON];
1386 keyList[KEYMODE_JA_FULL_NICO] = mNicoKeyboard[index+1];
1387 newKeyboard = getShiftChangeKeyboard(KEYBOARD_SHIFT_ON);
1388 if (newKeyboard != null) {
1389 mShiftOn = KEYBOARD_SHIFT_ON;
1390 changeKeyboard(newKeyboard);
1393 mPrevInputKeyCode = primaryCode;
1403 @Override public void onRelease(int primaryCode) {
1404 super.onRelease(primaryCode);