OpenWnnEN.java revision 7b3b414976b6b3d6d85459de79e843d5ab35ed06
1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/* 2053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Copyright (C) 2008,2009 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 Projectimport jp.co.omronsoft.openwnn.EN.*; 20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.SharedPreferences; 21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.Context; 22053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.res.Configuration; 23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.inputmethodservice.InputMethodService; 247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.os.Bundle; 25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.os.Handler; 26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.preference.PreferenceManager; 27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.SpannableStringBuilder; 28053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.Spanned; 29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.method.MetaKeyKeyListener; 30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.style.BackgroundColorSpan; 31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.style.CharacterStyle; 32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.style.UnderlineSpan; 33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.util.Log; 34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.KeyCharacterMap; 35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.KeyEvent; 367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.view.View; 37053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.inputmethod.EditorInfo; 38053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 39053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/** 40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * OpenWnn English IME 41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * @author Copyright (C) 2009, OMRON SOFTWARE CO., LTD. All Rights Reserved. 43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpublic class OpenWnnEN extends OpenWnn { 457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** A space character */ 46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private static final char[] SPACE = {' '}; 477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Character style of underline */ 49053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private static final CharacterStyle SPAN_UNDERLINE = new UnderlineSpan(); 507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Highlight color style for the selected string */ 517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa private static final CharacterStyle SPAN_EXACT_BGCOLOR_HL = new BackgroundColorSpan(0xFF66CDAA); 527b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Highlight color style for the composing text */ 537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa private static final CharacterStyle SPAN_REMAIN_BGCOLOR_HL = new BackgroundColorSpan(0xFFF0FFFF); 547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** A private area code(ALT+SHIFT+X) to be ignore (G1 specific). */ 56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private static final int PRIVATE_AREA_CODE = 61184; 577b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Never move cursor in to the composing text (adapting to IMF's specification change) */ 587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa private static final boolean FIX_CURSOR_TEXT_END = true; 59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Whether using Emoji or not */ 617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa private static final boolean ENABLE_EMOJI_LIMITATION = true; 627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Spannable string for the composing text */ 64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected SpannableStringBuilder mDisplayText; 65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Handler for drawing the candidates view */ 67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private Handler mDelayUpdateHandler; 68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Characters treated as a separator */ 69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private String mWordSeparators; 70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Previous event's code */ 71053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private int mPreviousEventCode; 72053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Array of words from the user dictionary */ 74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private WnnWord[] mUserDictionaryWords = null; 75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** The converter for English prediction/spell correction */ 77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private OpenWnnEngineEN mConverterEN; 787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** The symbol list generator */ 79053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private SymbolList mSymbolList; 807b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Whether it is displaying symbol list */ 81053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean mSymbolMode; 827b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Whether prediction is enabled */ 83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean mOptPrediction; 847b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Whether spell correction is enabled */ 85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean mOptSpellCorrection; 867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** Whether learning is enabled */ 87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean mOptLearning; 887b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 897b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** SHIFT key state */ 90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private int mHardShift; 917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** ALT key state */ 92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private int mHardAlt; 93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Instance of this service */ 95053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private static OpenWnnEN mSelf = null; 96053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Shift lock toggle definition */ 98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private static final int[] mShiftKeyToggle = {0, MetaKeyKeyListener.META_SHIFT_ON, MetaKeyKeyListener.META_CAP_LOCKED}; 99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Alt lock toggle definition */ 100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private static final int[] mAltKeyToggle = {0, MetaKeyKeyListener.META_ALT_ON, MetaKeyKeyListener.META_ALT_LOCKED}; 101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Auto caps mode */ 102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean mAutoCaps = false; 1037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 1047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa private CandidateFilter mFilter; 105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Constructor 108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public OpenWnnEN() { 110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super(); 111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSelf = this; 112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* used by OpenWnn */ 114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText = new ComposingText(); 1157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mCandidatesViewManager = new TextCandidatesViewManager(300); 116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputViewManager = new DefaultSoftKeyboardEN(); 117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic"); 118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter = mConverterEN; 1197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mFilter = new CandidateFilter(); 120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolList = null; 121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* etc */ 123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDisplayText = new SpannableStringBuilder(); 124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mAutoHideMode = false; 125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler = new Handler(); 126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolMode = false; 127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptPrediction = true; 128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptSpellCorrection = true; 129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptLearning = true; 130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Constructor 134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * @param context The context 136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public OpenWnnEN(Context context) { 138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project this(); 139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project attachBaseContext(context); 140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Get the instance of this service. 143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * <br> 144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Before using this method, the constructor of this service must be invoked. 145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public static OpenWnnEN getInstance() { 147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return mSelf; 148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Insert a character into the composing text. 152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * @param chars a character 154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void insertCharToComposingText(char[] chars) { 156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StrSegment seg = new StrSegment(chars); 157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (chars[0] == SPACE[0] || chars[0] == '\u0009') { 159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* if the character is a space, commit the composing text */ 160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(seg.string); 162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else if (mWordSeparators.contains(seg.string)) { 164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* if the character is a separator, remove an auto-inserted space and commit the composing text. */ 165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mPreviousEventCode == OpenWnnEvent.SELECT_CANDIDATE) { 166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputConnection.deleteSurroundingText(1, 0); 167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(seg.string); 170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.insertStrSegment(0, 1, seg); 173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Insert a character into the composing text. 179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * @param charCode a character code 181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * @return true if success; false if an error occurs. 182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean insertCharToComposingText(int charCode) { 184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (charCode == 0) { 185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(Character.toChars(charCode)); 188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Get the shift key state from the editor. 193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * @param editor editor 195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * @return state id of the shift key (0:off, 1:on) 197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected int getShiftKeyState(EditorInfo editor) { 199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return (getCurrentInputConnection().getCursorCapsMode(editor.inputType) == 0) ? 0 : 1; 200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Set the mode of the symbol list. 2047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param mode {@code SymbolList.SYMBOL_ENGLISH} or {@code null}. 205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void setSymbolMode(String mode) { 207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mode != null) { 208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolMode = true; 210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolList.setDictionary(mode); 211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter = mSymbolList; 212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (!mSymbolMode) { 214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return; 215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolMode = false; 218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter = mConverterEN; 219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /*********************************************************************** 223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * InputMethodServer 224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ***********************************************************************/ 225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onCreate */ 226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onCreate() { 227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super.onCreate(); 228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mWordSeparators = getResources().getString(R.string.en_word_separators); 229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mSymbolList == null) { 231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolList = new SymbolList(this, SymbolList.LANG_EN); 232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 2347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 2357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** @see jp.co.omronsoft.openwnn.OpenWnn#onCreateInputView */ 2367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa @Override public View onCreateInputView() { 2377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa int hiddenState = getResources().getConfiguration().hardKeyboardHidden; 2387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa boolean hidden = (hiddenState == Configuration.HARDKEYBOARDHIDDEN_YES); 2397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ((TextCandidatesViewManager) 2407b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mCandidatesViewManager).setHardKeyboardHidden(hidden); 2417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 2427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa return super.onCreateInputView(); 2437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onStartInputView */ 246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { 247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super.onStartInputView(attribute, restarting); 248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 249053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* initialize views */ 250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.clearCandidates(); 251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardShift = 0; 253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardAlt = 0; 2547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa updateMetaKeyStateDisplay(); 255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2567b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* load preferences */ 257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* auto caps mode */ 2607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mAutoCaps = pref.getBoolean("auto_caps", true); 2617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* set TextCandidatesViewManager's option */ 2637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ((TextCandidatesViewManager)mCandidatesViewManager).setAutoHide(false); 264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* display status icon */ 267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project showStatusIcon(R.drawable.immodeic_half_alphabet); 268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* set prediction & spell correction mode */ 270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptPrediction = pref.getBoolean("opt_en_prediction", true); 271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptSpellCorrection = pref.getBoolean("opt_en_spell_correction", true); 272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptLearning = pref.getBoolean("opt_en_enable_learning", true); 273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* prediction on/off */ 2757b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa switch (attribute.inputType & EditorInfo.TYPE_MASK_CLASS) { 2767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_CLASS_NUMBER: 2777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_CLASS_DATETIME: 2787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_CLASS_PHONE: 2797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptPrediction = false; 2807b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptLearning = false; 2817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa break; 282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2837b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_CLASS_TEXT: 2847b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa switch (attribute.inputType & EditorInfo.TYPE_MASK_VARIATION) { 2857b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_TEXT_VARIATION_PASSWORD: 2867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_TEXT_VARIATION_PHONETIC: 2877b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptLearning = false; 2887b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptPrediction = false; 2897b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa break; 2907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa default: 2917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa break; 2927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 2937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2957b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* set engine's mode */ 2967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (mOptSpellCorrection) { 2977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setDictionary(OpenWnnEngineEN.DICT_FOR_CORRECT_MISTYPE); 2987b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } else { 2997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setDictionary(OpenWnnEngineEN.DICT_DEFAULT); 3007b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* emoji */ 3027b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (ENABLE_EMOJI_LIMITATION) { 3037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa Bundle bundle = attribute.extras; 3047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (bundle != null && bundle.getBoolean("allowEmoji")) { 3057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setFilter(null); 3067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } else { 3077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mFilter.setFilter(CandidateFilter.FILTER_EMOJI); 3087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setFilter(mFilter); 3097b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } else { 3117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setFilter(null); 3127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 3147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* doesn't learn any word if it is not prediction mode */ 3157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (!mOptPrediction) { 3167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptLearning = false; 3177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 3197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (mComposingText != null) { 3207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mComposingText.clear(); 3217b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onComputeInsets */ 326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onComputeInsets(InputMethodService.Insets outInsets) { 327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) { 328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project outInsets.touchableInsets = InputMethodService.Insets.TOUCHABLE_INSETS_FRAME; 329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super.onComputeInsets(outInsets); 331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#isFullscreenMode */ 335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public boolean isFullscreenMode() { 336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project boolean ret; 337053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mInputViewManager == null) { 338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL); 339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = false; 341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onUpdateSelection */ 346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onUpdateSelection(int oldSelStart, int oldSelEnd, 347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int newSelStart, int newSelEnd, int candidatesStart, 348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int candidatesEnd) { 349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mComposingText.size(1) != 0) { 350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onConfigurationChanged */ 355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onConfigurationChanged(Configuration newConfig) { 356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super.onConfigurationChanged(newConfig); 358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mInputConnection != null) { 359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } catch (Exception ex) { 362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvaluateFullscreenMode */ 366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public boolean onEvaluateFullscreenMode() { 367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvaluateInputViewShown */ 371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public boolean onEvaluateInputViewShown() { 372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /*********************************************************************** 376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * OpenWnn 377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ***********************************************************************/ 378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvent */ 379053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override synchronized public boolean onEvent(OpenWnnEvent ev) { 380053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* handling events which are valid when InputConnection is not active. */ 381053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (ev.code) { 382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INITIALIZE_LEARNING_DICTIONARY: 384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return mConverterEN.initializeDictionary( WnnEngine.DICTIONARY_TYPE_LEARN ); 385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INITIALIZE_USER_DICTIONARY: 387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return mConverterEN.initializeDictionary( WnnEngine.DICTIONARY_TYPE_USER ); 388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.LIST_WORDS_IN_USER_DICTIONARY: 390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mUserDictionaryWords = mConverterEN.getUserDictionaryWords( ); 391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 392053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 393053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.GET_WORD: 394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mUserDictionaryWords != null ) { 395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ev.word = mUserDictionaryWords[ 0 ]; 396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project for( int i = 0 ; i < mUserDictionaryWords.length-1 ; i++ ) { 397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mUserDictionaryWords[ i ] = mUserDictionaryWords[ i + 1 ]; 398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mUserDictionaryWords[ mUserDictionaryWords.length-1 ] = null; 400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mUserDictionaryWords[ 0 ] == null ) { 401053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mUserDictionaryWords = null; 402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 403053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.ADD_WORD: 408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverterEN.addWord(ev.word); 409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.DELETE_WORD: 412053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverterEN.deleteWord(ev.word); 413053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 414053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 415053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.CHANGE_MODE: 416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 4177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 4187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case OpenWnnEvent.CHANGE_INPUT_VIEW: 4197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa setInputView(onCreateInputView()); 4207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa return true; 4217b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 4227b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case OpenWnnEvent.CANDIDATE_VIEW_TOUCH: 4237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa boolean ret; 4247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ret = ((TextCandidatesViewManager)mCandidatesViewManager).onTouchSync(); 4257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa return ret; 426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 427053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project default: 428053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 429053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 430053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 431053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project dismissPopupKeyboard(); 432053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 433053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mDirectInputMode) { 434053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 435053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 436053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 437053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.code == OpenWnnEvent.LIST_CANDIDATES_FULL) { 438053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_FULL); 439053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 440053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 441053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 442053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project boolean ret = false; 443053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (ev.code) { 444053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INPUT_CHAR: 445053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project EditorInfo edit = getCurrentInputEditorInfo(); 446053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( edit.inputType == EditorInfo.TYPE_CLASS_PHONE){ 447053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(new String(ev.chars)); 448053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project }else{ 449053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(null); 450053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.chars); 451053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = true; 452053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode = ev.code; 453053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 454053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 455053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 456053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INPUT_KEY: 457053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int keyCode = ev.keyEvent.getKeyCode(); 458053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* update shift/alt state */ 459053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (keyCode) { 460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_ALT_LEFT: 461053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_ALT_RIGHT: 462053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.keyEvent.getRepeatCount() == 0) { 463053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (++mHardAlt > 2) { mHardAlt = 0; } 464053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 465053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 466053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 467053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 468053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_SHIFT_LEFT: 469053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_SHIFT_RIGHT: 470053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.keyEvent.getRepeatCount() == 0) { 471053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (++mHardShift > 2) { mHardShift = 0; } 472053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 473053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 474053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 475053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 476053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(null); 477053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 478053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* handle other key event */ 479053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = processKeyEvent(ev.keyEvent); 480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode = ev.code; 481053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 482053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 483053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INPUT_SOFT_KEY: 484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(null); 485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = processKeyEvent(ev.keyEvent); 487053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (!ret) { 488053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputConnection.sendKeyEvent(ev.keyEvent); 489053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, ev.keyEvent.getKeyCode())); 490053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = true; 491053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode = ev.code; 493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 494053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 495053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.SELECT_CANDIDATE: 496053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mSymbolMode) { 497053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(ev.word, false); 498053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 499053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mWordSeparators.contains(ev.word.candidate) && 500053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode == OpenWnnEvent.SELECT_CANDIDATE) { 501053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputConnection.deleteSurroundingText(1, 0); 502053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 503053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(ev.word, true); 504053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 505053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 506053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode = ev.code; 507053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 508053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 509053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 510053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.LIST_SYMBOLS: 511053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 512053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 513053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(SymbolList.SYMBOL_ENGLISH); 514053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 515053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 516053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project default: 518053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 519053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 520053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) { 522053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL); 523053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 524053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 525053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 526053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 527053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 528053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /*********************************************************************** 529053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * OpenWnnEN 530053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ***********************************************************************/ 531053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 532053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Handling KeyEvent 533053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * <br> 5347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * This method is called from {@link #onEvent()}. 535053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 5367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param ev A key event 537053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 538053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean processKeyEvent(KeyEvent ev) { 539053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 540053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int key = ev.getKeyCode(); 541053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project EditorInfo edit = getCurrentInputEditorInfo(); 542053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* keys which produce a glyph */ 543053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.isPrintingKey()) { 544053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* do nothing if the character is not able to display or the character is dead key */ 5457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if ((mHardShift > 0 && mHardAlt > 0) || (ev.isAltPressed() && ev.isShiftPressed())) { 546053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int charCode = ev.getUnicodeChar(MetaKeyKeyListener.META_SHIFT_ON | MetaKeyKeyListener.META_ALT_ON); 547053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (charCode == 0 || (charCode & KeyCharacterMap.COMBINING_ACCENT) != 0 || charCode == PRIVATE_AREA_CODE) { 548053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mHardAlt == 1) { 549053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardAlt = 0; 550053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 551053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mHardShift == 1) { 552053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardShift = 0; 553053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 554053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 555053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 556053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 557053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 558053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 559053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* get the key character */ 560053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mHardShift== 0 && mHardAlt == 0) { 561053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* no meta key is locked */ 562053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int shift = (mAutoCaps) ? getShiftKeyState(edit) : 0; 563053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (shift != mHardShift && (key >= KeyEvent.KEYCODE_A && key <= KeyEvent.KEYCODE_Z)) { 564053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* handling auto caps for a alphabet character */ 565053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.getUnicodeChar(MetaKeyKeyListener.META_SHIFT_ON)); 566053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 567053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.getUnicodeChar()); 568053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 569053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 570053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.getUnicodeChar(mShiftKeyToggle[mHardShift] 571053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project | mAltKeyToggle[mHardAlt])); 572053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* back to 0 (off) if 1 (on/not locked) */ 573053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mHardAlt == 1) { 574053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardAlt = 0; 575053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 576053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mHardShift == 1) { 577053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardShift = 0; 578053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 579053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 580053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 581053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 582053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (edit.inputType == EditorInfo.TYPE_CLASS_PHONE) { 583053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 584053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 585053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 586053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 587053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 588053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 589053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else if (key == KeyEvent.KEYCODE_SPACE) { 590053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.isAltPressed()) { 591053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* display the symbol list (G1 specific. same as KEYCODE_SYM) */ 592053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 593053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 594053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(SymbolList.SYMBOL_ENGLISH); 595053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 596053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardAlt = 0; 597053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 598053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 599053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(SPACE); 600053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 601053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 602053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else if (key == KeyEvent.KEYCODE_SYM) { 603053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* display the symbol list */ 604053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 605053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 606053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(SymbolList.SYMBOL_ENGLISH); 607053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 608053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardAlt = 0; 609053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 610053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 611053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 612053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 613053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Functional key */ 614053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mComposingText.size(1) > 0) { 615053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (key) { 616053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_DEL: 617053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.delete(1, false); 618053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 619053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 620053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 621053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_BACK: 622053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) { 623053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL); 624053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 625053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 626053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 627053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 628053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 629053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 630053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_LEFT: 631053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.moveCursor(1, -1); 632053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 633053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 634053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 635053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_RIGHT: 636053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.moveCursor(1, 1); 637053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 638053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 639053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 640053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_ENTER: 641053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_CENTER: 642053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 643053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 644053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 646053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project default: 647053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 648053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 649053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 650053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 651053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 652053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 653053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 654053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 655053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Runnable for a thread getting and displaying candidates. 656053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 657053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private final Runnable updatePredictionRunnable = new Runnable() { 658053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public void run() { 659053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int candidates = 0; 660053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mConverter != null) { 6617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* normal prediction */ 662053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project candidates = mConverter.predict(mComposingText, 0, -1); 663053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 6647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* update the candidates view */ 665053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (candidates > 0) { 666053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.displayCandidates(mConverter); 667053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 668053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.clearCandidates(); 669053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 670053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 671053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project }; 672053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 673053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 674053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Update the composing text. 675053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 6767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param layer {@link mComposingText}'s layer to display 677053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 678053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void updateComposingText(int layer) { 679053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* update the candidates view */ 680053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (!mOptPrediction) { 681053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 682053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 683053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mSymbolMode) { 684053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 685053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.postDelayed(updatePredictionRunnable, 0); 686053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 687053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 688053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mComposingText.size(1) != 0) { 689053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 690053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.postDelayed(updatePredictionRunnable, 250); 691053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 692053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 693053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.postDelayed(updatePredictionRunnable, 0); 694053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 695053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 696053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* notice to the input view */ 697053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project this.mInputViewManager.onUpdateState(this); 698053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 699053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* set the candidates view to the normal size */ 700053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mCandidatesViewManager.getViewType() != CandidatesViewManager.VIEW_TYPE_NORMAL) { 701053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL); 702053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 703053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* set the text for displaying as the composing text */ 704053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project SpannableStringBuilder disp = mDisplayText; 705053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project disp.clear(); 706053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project disp.insert(0, mComposingText.toString(layer)); 707053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 708053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* add decoration to the text */ 709053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int cursor = mComposingText.getCursor(layer); 710053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (disp.length() != 0) { 7117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (cursor > 0 && cursor < disp.length()) { 7127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa disp.setSpan(SPAN_EXACT_BGCOLOR_HL, 0, cursor, 7137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 7147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 7157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (cursor < disp.length()) { 7167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mDisplayText.setSpan(SPAN_REMAIN_BGCOLOR_HL, cursor, disp.length(), 7177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 7187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 7197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 7207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa disp.setSpan(SPAN_UNDERLINE, 0, disp.length(), 721053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 722053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 7237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 7247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa int displayCursor = cursor; 7257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (FIX_CURSOR_TEXT_END) { 7267b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa displayCursor = (cursor == 0) ? 0 : 1; 7277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 728053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* update the composing text on the EditView */ 7297b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.setComposingText(disp, displayCursor); 730053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 731053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 732053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 733053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 734053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Commit the composing text. 735053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 7367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param layer {@link mComposingText}'s layer to commit. 737053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 738053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void commitText(int layer) { 739053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String tmp = mComposingText.toString(layer); 740053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 741053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mOptLearning && mConverter != null && tmp.length() > 0) { 742053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project WnnWord word = new WnnWord(tmp, tmp); 743053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter.learn(word); 744053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 745053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 7467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.commitText(tmp, (FIX_CURSOR_TEXT_END ? 1 : tmp.length())); 747053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.clearCandidates(); 748053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 749053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 750053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 751053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Commit a word 752053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 7537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param word A word to commit 7547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param withSpace Append a space after the word if {@code true}. 755053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 756053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void commitText(WnnWord word, boolean withSpace) { 757053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 758053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mOptLearning && mConverter != null) { 759053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter.learn(word); 760053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 761053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 7627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.commitText(word.candidate, (FIX_CURSOR_TEXT_END ? 1 : word.candidate.length())); 763053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 764053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (withSpace) { 765053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(" "); 766053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 767053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 768053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 769053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 770053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Commit a string 771053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * <br> 772053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * The string is not registered into the learning dictionary. 773053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 7747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param str A string to commit 775053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 776053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void commitText(String str) { 7777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.commitText(str, (FIX_CURSOR_TEXT_END ? 1 : str.length())); 778053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.clearCandidates(); 779053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 780053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 781053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 782053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Dismiss the pop-up keyboard 783053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 784053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected void dismissPopupKeyboard() { 785053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DefaultSoftKeyboardEN kbd = (DefaultSoftKeyboardEN)mInputViewManager; 786053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (kbd != null) { 787053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project kbd.dismissPopupKeyboard(); 788053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 789053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 790053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 791053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 792053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Display current meta-key state. 793053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 794053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void updateMetaKeyStateDisplay() { 7957b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa int mode = 0; 7967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if(mHardShift == 0 && mHardAlt == 0){ 7977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_OFF; 7987b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 1 && mHardAlt == 0){ 7997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_OFF; 8007b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 2 && mHardAlt == 0){ 8017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_OFF; 8027b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 0 && mHardAlt == 1){ 8037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_ON; 8047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 0 && mHardAlt == 2){ 8057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_LOCK; 8067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 1 && mHardAlt == 1){ 8077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_ON; 8087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 1 && mHardAlt == 2){ 8097b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_LOCK; 8107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 2 && mHardAlt == 1){ 8117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_ON; 8127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 2 && mHardAlt == 2){ 8137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_LOCK; 8147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else{ 8157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_OFF; 8167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 8177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ((DefaultSoftKeyboard) mInputViewManager).updateIndicator(mode); 818053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 819053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 820053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 821053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 822053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 823053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 824053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 8257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 826