OpenWnnEN.java revision 3feb3d26d59be1626c59b72654020179e2b2ebe0
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/** 403feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * The OpenWnn English IME class. 41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 423feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @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; 913feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** SHIFT key state (pressing) */ 923feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa private boolean mShiftPressing; 937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** ALT key state */ 94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private int mHardAlt; 953feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** ALT key state (pressing) */ 963feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa private boolean mAltPressing; 97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Instance of this service */ 99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private static OpenWnnEN mSelf = null; 100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Shift lock toggle definition */ 102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private static final int[] mShiftKeyToggle = {0, MetaKeyKeyListener.META_SHIFT_ON, MetaKeyKeyListener.META_CAP_LOCKED}; 103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Alt lock toggle definition */ 104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private static final int[] mAltKeyToggle = {0, MetaKeyKeyListener.META_ALT_ON, MetaKeyKeyListener.META_ALT_LOCKED}; 105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Auto caps mode */ 106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean mAutoCaps = false; 1077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 1087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa private CandidateFilter mFilter; 109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Constructor 112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public OpenWnnEN() { 114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super(); 115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSelf = this; 116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* used by OpenWnn */ 118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText = new ComposingText(); 1193feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mCandidatesViewManager = new TextCandidatesViewManager(-1); 120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputViewManager = new DefaultSoftKeyboardEN(); 121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic"); 122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter = mConverterEN; 1237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mFilter = new CandidateFilter(); 124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolList = null; 125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* etc */ 127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDisplayText = new SpannableStringBuilder(); 128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mAutoHideMode = false; 129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler = new Handler(); 130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolMode = false; 131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptPrediction = true; 132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptSpellCorrection = true; 133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptLearning = true; 134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Constructor 138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * @param context The context 140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public OpenWnnEN(Context context) { 142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project this(); 143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project attachBaseContext(context); 144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Get the instance of this service. 147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * <br> 148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Before using this method, the constructor of this service must be invoked. 1493feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * 1503feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @return The instance of this object 151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public static OpenWnnEN getInstance() { 153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return mSelf; 154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Insert a character into the composing text. 158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 1593feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param chars A array of character 160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void insertCharToComposingText(char[] chars) { 162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StrSegment seg = new StrSegment(chars); 163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (chars[0] == SPACE[0] || chars[0] == '\u0009') { 165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* if the character is a space, commit the composing text */ 166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(seg.string); 168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else if (mWordSeparators.contains(seg.string)) { 170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* if the character is a separator, remove an auto-inserted space and commit the composing text. */ 171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mPreviousEventCode == OpenWnnEvent.SELECT_CANDIDATE) { 172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputConnection.deleteSurroundingText(1, 0); 173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(seg.string); 176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.insertStrSegment(0, 1, seg); 179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Insert a character into the composing text. 185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 1863feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param charCode A character code 1873feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @return {@code true} if success; {@code false} if an error occurs. 188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean insertCharToComposingText(int charCode) { 190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (charCode == 0) { 191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(Character.toChars(charCode)); 194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Get the shift key state from the editor. 199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 2003feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param editor Editor 201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 2023feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @return State ID of the shift key (0:off, 1:on) 203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected int getShiftKeyState(EditorInfo editor) { 205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return (getCurrentInputConnection().getCursorCapsMode(editor.inputType) == 0) ? 0 : 1; 206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Set the mode of the symbol list. 2103feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * 2113feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param mode {@code SymbolList.SYMBOL_ENGLISH} or {@code null}. 212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void setSymbolMode(String mode) { 214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mode != null) { 215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolMode = true; 217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolList.setDictionary(mode); 218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter = mSymbolList; 219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (!mSymbolMode) { 221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return; 222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolMode = false; 225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter = mConverterEN; 226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /*********************************************************************** 230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * InputMethodServer 231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ***********************************************************************/ 232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onCreate */ 233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onCreate() { 234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super.onCreate(); 235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mWordSeparators = getResources().getString(R.string.en_word_separators); 236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mSymbolList == null) { 238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSymbolList = new SymbolList(this, SymbolList.LANG_EN); 239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 2417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 2427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** @see jp.co.omronsoft.openwnn.OpenWnn#onCreateInputView */ 2437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa @Override public View onCreateInputView() { 2447b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa int hiddenState = getResources().getConfiguration().hardKeyboardHidden; 2457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa boolean hidden = (hiddenState == Configuration.HARDKEYBOARDHIDDEN_YES); 2463feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa ((DefaultSoftKeyboardEN) mInputViewManager).setHardKeyboardHidden(hidden); 2477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ((TextCandidatesViewManager) 2487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mCandidatesViewManager).setHardKeyboardHidden(hidden); 2497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 2507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa return super.onCreateInputView(); 2517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onStartInputView */ 254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { 255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super.onStartInputView(attribute, restarting); 256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* initialize views */ 258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.clearCandidates(); 259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardShift = 0; 261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardAlt = 0; 2627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa updateMetaKeyStateDisplay(); 263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* load preferences */ 265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* auto caps mode */ 2687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mAutoCaps = pref.getBoolean("auto_caps", true); 2697b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* set TextCandidatesViewManager's option */ 2717b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ((TextCandidatesViewManager)mCandidatesViewManager).setAutoHide(false); 272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* display status icon */ 275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project showStatusIcon(R.drawable.immodeic_half_alphabet); 276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* set prediction & spell correction mode */ 278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptPrediction = pref.getBoolean("opt_en_prediction", true); 279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptSpellCorrection = pref.getBoolean("opt_en_spell_correction", true); 280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mOptLearning = pref.getBoolean("opt_en_enable_learning", true); 281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* prediction on/off */ 2837b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa switch (attribute.inputType & EditorInfo.TYPE_MASK_CLASS) { 2847b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_CLASS_NUMBER: 2857b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_CLASS_DATETIME: 2867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_CLASS_PHONE: 2877b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptPrediction = false; 2887b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptLearning = false; 2897b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa break; 290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_CLASS_TEXT: 2927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa switch (attribute.inputType & EditorInfo.TYPE_MASK_VARIATION) { 2937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_TEXT_VARIATION_PASSWORD: 2947b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_TEXT_VARIATION_PHONETIC: 2957b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptLearning = false; 2967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptPrediction = false; 2977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa break; 2987b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa default: 2997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa break; 3007b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 3037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* set engine's mode */ 3047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (mOptSpellCorrection) { 3057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setDictionary(OpenWnnEngineEN.DICT_FOR_CORRECT_MISTYPE); 3067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } else { 3077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setDictionary(OpenWnnEngineEN.DICT_DEFAULT); 3087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3097b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* emoji */ 3107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (ENABLE_EMOJI_LIMITATION) { 3117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa Bundle bundle = attribute.extras; 3127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (bundle != null && bundle.getBoolean("allowEmoji")) { 3137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setFilter(null); 3147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } else { 3157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mFilter.setFilter(CandidateFilter.FILTER_EMOJI); 3167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setFilter(mFilter); 3177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } else { 3197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mConverterEN.setFilter(null); 3207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 3227b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* doesn't learn any word if it is not prediction mode */ 3237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (!mOptPrediction) { 3247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mOptLearning = false; 3257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3267b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 3277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (mComposingText != null) { 3287b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mComposingText.clear(); 3297b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3303feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /* initialize the engine's state */ 3313feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa fitInputType(pref, attribute); 332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onComputeInsets */ 335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onComputeInsets(InputMethodService.Insets outInsets) { 336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) { 337053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project outInsets.touchableInsets = InputMethodService.Insets.TOUCHABLE_INSETS_FRAME; 338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super.onComputeInsets(outInsets); 340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#isFullscreenMode */ 344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public boolean isFullscreenMode() { 345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project boolean ret; 346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mInputViewManager == null) { 347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL); 348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = false; 350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onUpdateSelection */ 355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onUpdateSelection(int oldSelStart, int oldSelEnd, 356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int newSelStart, int newSelEnd, int candidatesStart, 357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int candidatesEnd) { 358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mComposingText.size(1) != 0) { 359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onConfigurationChanged */ 364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public void onConfigurationChanged(Configuration newConfig) { 365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project super.onConfigurationChanged(newConfig); 367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mInputConnection != null) { 368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } catch (Exception ex) { 371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvaluateFullscreenMode */ 375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public boolean onEvaluateFullscreenMode() { 376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 379053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvaluateInputViewShown */ 380053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override public boolean onEvaluateInputViewShown() { 381053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /*********************************************************************** 385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * OpenWnn 386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ***********************************************************************/ 387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvent */ 388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project @Override synchronized public boolean onEvent(OpenWnnEvent ev) { 389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* handling events which are valid when InputConnection is not active. */ 390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (ev.code) { 3913feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa 3923feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa case OpenWnnEvent.KEYUP: 3933feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa onKeyUpEvent(ev.keyEvent); 3943feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa return true; 3953feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa 396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INITIALIZE_LEARNING_DICTIONARY: 397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return mConverterEN.initializeDictionary( WnnEngine.DICTIONARY_TYPE_LEARN ); 398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INITIALIZE_USER_DICTIONARY: 400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return mConverterEN.initializeDictionary( WnnEngine.DICTIONARY_TYPE_USER ); 401053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.LIST_WORDS_IN_USER_DICTIONARY: 403053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mUserDictionaryWords = mConverterEN.getUserDictionaryWords( ); 404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.GET_WORD: 407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mUserDictionaryWords != null ) { 408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ev.word = mUserDictionaryWords[ 0 ]; 409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project for( int i = 0 ; i < mUserDictionaryWords.length-1 ; i++ ) { 410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mUserDictionaryWords[ i ] = mUserDictionaryWords[ i + 1 ]; 411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 412053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mUserDictionaryWords[ mUserDictionaryWords.length-1 ] = null; 413053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mUserDictionaryWords[ 0 ] == null ) { 414053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mUserDictionaryWords = null; 415053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 417053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 419053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 420053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.ADD_WORD: 421053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverterEN.addWord(ev.word); 422053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 423053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.DELETE_WORD: 425053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverterEN.deleteWord(ev.word); 426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 427053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 428053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.CHANGE_MODE: 429053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 4307b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 4317b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case OpenWnnEvent.CHANGE_INPUT_VIEW: 4327b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa setInputView(onCreateInputView()); 4337b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa return true; 4347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 4357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case OpenWnnEvent.CANDIDATE_VIEW_TOUCH: 4367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa boolean ret; 4377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ret = ((TextCandidatesViewManager)mCandidatesViewManager).onTouchSync(); 4387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa return ret; 439053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 440053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project default: 441053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 442053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 443053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 444053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project dismissPopupKeyboard(); 4453feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa KeyEvent keyEvent = ev.keyEvent; 4463feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa int keyCode = 0; 4473feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (keyEvent != null) { 4483feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa keyCode = keyEvent.getKeyCode(); 4493feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 450053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mDirectInputMode) { 4513feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (ev.code == OpenWnnEvent.INPUT_SOFT_KEY && mInputConnection != null) { 4523feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mInputConnection.sendKeyEvent(keyEvent); 4533feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mInputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, 4543feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa keyEvent.getKeyCode())); 4553feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 456053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 457053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 458053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 459053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.code == OpenWnnEvent.LIST_CANDIDATES_FULL) { 460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_FULL); 461053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 462053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 463053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 464053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project boolean ret = false; 465053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (ev.code) { 466053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INPUT_CHAR: 467053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project EditorInfo edit = getCurrentInputEditorInfo(); 468053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( edit.inputType == EditorInfo.TYPE_CLASS_PHONE){ 469053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(new String(ev.chars)); 470053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project }else{ 471053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(null); 472053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.chars); 473053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = true; 474053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode = ev.code; 475053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 476053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 477053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 478053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INPUT_KEY: 4793feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa keyCode = ev.keyEvent.getKeyCode(); 480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* update shift/alt state */ 481053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (keyCode) { 482053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_ALT_LEFT: 483053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_ALT_RIGHT: 484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.keyEvent.getRepeatCount() == 0) { 485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (++mHardAlt > 2) { mHardAlt = 0; } 486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 4873feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mAltPressing = true; 488053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 489053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 490053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 491053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_SHIFT_LEFT: 492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_SHIFT_RIGHT: 493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.keyEvent.getRepeatCount() == 0) { 494053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (++mHardShift > 2) { mHardShift = 0; } 495053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 4963feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mShiftPressing = true; 497053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 498053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 499053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 500053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(null); 501053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 502053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* handle other key event */ 503053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = processKeyEvent(ev.keyEvent); 504053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode = ev.code; 505053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 506053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 507053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.INPUT_SOFT_KEY: 508053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(null); 509053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 510053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = processKeyEvent(ev.keyEvent); 511053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (!ret) { 512053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputConnection.sendKeyEvent(ev.keyEvent); 513053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, ev.keyEvent.getKeyCode())); 514053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = true; 515053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 516053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode = ev.code; 517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 518053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 519053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.SELECT_CANDIDATE: 520053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mSymbolMode) { 521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(ev.word, false); 522053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 523053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mWordSeparators.contains(ev.word.candidate) && 524053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode == OpenWnnEvent.SELECT_CANDIDATE) { 525053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputConnection.deleteSurroundingText(1, 0); 526053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 527053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(ev.word, true); 528053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 529053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 530053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode = ev.code; 531053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 532053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 533053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 534053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case OpenWnnEvent.LIST_SYMBOLS: 535053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 536053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 537053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(SymbolList.SYMBOL_ENGLISH); 538053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 539053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 540053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 541053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project default: 542053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 543053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 544053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 545053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) { 546053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL); 547053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 548053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 549053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return ret; 550053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 551053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 552053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /*********************************************************************** 553053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * OpenWnnEN 554053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ***********************************************************************/ 555053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 556053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Handling KeyEvent 557053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * <br> 5587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * This method is called from {@link #onEvent()}. 559053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 5607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param ev A key event 5613feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @return {@code true} if the event is processed in this method; {@code false} if the event is not processed in this method 562053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 563053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private boolean processKeyEvent(KeyEvent ev) { 564053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 565053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int key = ev.getKeyCode(); 566053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project EditorInfo edit = getCurrentInputEditorInfo(); 567053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* keys which produce a glyph */ 568053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.isPrintingKey()) { 569053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* do nothing if the character is not able to display or the character is dead key */ 5707b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if ((mHardShift > 0 && mHardAlt > 0) || (ev.isAltPressed() && ev.isShiftPressed())) { 571053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int charCode = ev.getUnicodeChar(MetaKeyKeyListener.META_SHIFT_ON | MetaKeyKeyListener.META_ALT_ON); 572053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (charCode == 0 || (charCode & KeyCharacterMap.COMBINING_ACCENT) != 0 || charCode == PRIVATE_AREA_CODE) { 5733feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(mHardShift == 1){ 5743feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mShiftPressing = false; 5753feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 5763feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(mHardAlt == 1){ 5773feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mAltPressing = false; 5783feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 5793feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!ev.isAltPressed()){ 5803feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (mHardAlt == 1) { 5813feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mHardAlt = 0; 5823feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 5833feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 5843feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!ev.isShiftPressed()){ 5853feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (mHardShift == 1) { 5863feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mHardShift = 0; 5873feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 5883feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 5893feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!ev.isShiftPressed() && !ev.isAltPressed()){ 5903feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa updateMetaKeyStateDisplay(); 5913feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 592053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 593053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 594053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 595053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 596053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* get the key character */ 597053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mHardShift== 0 && mHardAlt == 0) { 598053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* no meta key is locked */ 599053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int shift = (mAutoCaps) ? getShiftKeyState(edit) : 0; 600053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (shift != mHardShift && (key >= KeyEvent.KEYCODE_A && key <= KeyEvent.KEYCODE_Z)) { 601053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* handling auto caps for a alphabet character */ 602053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.getUnicodeChar(MetaKeyKeyListener.META_SHIFT_ON)); 603053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 604053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.getUnicodeChar()); 605053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 606053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 607053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.getUnicodeChar(mShiftKeyToggle[mHardShift] 608053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project | mAltKeyToggle[mHardAlt])); 6093feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(mHardShift == 1){ 6103feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mShiftPressing = false; 6113feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 6123feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(mHardAlt == 1){ 6133feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mAltPressing = false; 6143feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 615053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* back to 0 (off) if 1 (on/not locked) */ 6163feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!ev.isAltPressed()){ 6173feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (mHardAlt == 1) { 6183feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mHardAlt = 0; 6193feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 6203feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 6213feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!ev.isShiftPressed()){ 6223feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (mHardShift == 1) { 6233feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mHardShift = 0; 6243feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 6253feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 6263feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!ev.isShiftPressed() && !ev.isAltPressed()){ 6273feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa updateMetaKeyStateDisplay(); 6283feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 629053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 630053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 631053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (edit.inputType == EditorInfo.TYPE_CLASS_PHONE) { 632053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 633053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 634053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 635053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 636053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 637053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 638053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else if (key == KeyEvent.KEYCODE_SPACE) { 639053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (ev.isAltPressed()) { 640053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* display the symbol list (G1 specific. same as KEYCODE_SYM) */ 641053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 642053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 643053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(SymbolList.SYMBOL_ENGLISH); 644053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardAlt = 0; 646053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 647053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 648053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(SPACE); 649053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 650053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 651053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else if (key == KeyEvent.KEYCODE_SYM) { 652053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* display the symbol list */ 653053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 654053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 655053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(SymbolList.SYMBOL_ENGLISH); 656053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 657053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardAlt = 0; 658053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 659053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 660053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 661053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 662053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Functional key */ 663053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mComposingText.size(1) > 0) { 664053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (key) { 665053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_DEL: 666053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.delete(1, false); 667053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 668053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 669053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 670053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_BACK: 671053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) { 672053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL); 673053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 674053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 675053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 676053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 677053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 678053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 679053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_LEFT: 680053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.moveCursor(1, -1); 681053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 682053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 683053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 684053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_RIGHT: 685053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.moveCursor(1, 1); 686053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 687053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 688053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 689053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_ENTER: 690053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_CENTER: 691053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 692053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 693053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return true; 694053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 695053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project default: 696053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 697053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 698053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 699053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 700053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 701053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 702053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 703053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 704053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Runnable for a thread getting and displaying candidates. 705053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 706053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private final Runnable updatePredictionRunnable = new Runnable() { 707053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public void run() { 708053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int candidates = 0; 709053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mConverter != null) { 7107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* normal prediction */ 711053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project candidates = mConverter.predict(mComposingText, 0, -1); 712053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 7137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* update the candidates view */ 714053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (candidates > 0) { 715053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.displayCandidates(mConverter); 716053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 717053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.clearCandidates(); 718053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 719053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 720053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project }; 721053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 722053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 723053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Update the composing text. 724053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 7257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param layer {@link mComposingText}'s layer to display 726053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 727053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void updateComposingText(int layer) { 728053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* update the candidates view */ 729053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (!mOptPrediction) { 730053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 731053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 732053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mSymbolMode) { 733053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 734053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.postDelayed(updatePredictionRunnable, 0); 735053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 736053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 737053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mComposingText.size(1) != 0) { 738053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 739053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.postDelayed(updatePredictionRunnable, 250); 740053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 741053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 742053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDelayUpdateHandler.postDelayed(updatePredictionRunnable, 0); 743053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 744053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 745053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* notice to the input view */ 746053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project this.mInputViewManager.onUpdateState(this); 747053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 748053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* set the candidates view to the normal size */ 749053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mCandidatesViewManager.getViewType() != CandidatesViewManager.VIEW_TYPE_NORMAL) { 750053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL); 751053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 752053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* set the text for displaying as the composing text */ 753053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project SpannableStringBuilder disp = mDisplayText; 754053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project disp.clear(); 755053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project disp.insert(0, mComposingText.toString(layer)); 756053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 757053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* add decoration to the text */ 758053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int cursor = mComposingText.getCursor(layer); 759053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (disp.length() != 0) { 7607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (cursor > 0 && cursor < disp.length()) { 7617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa disp.setSpan(SPAN_EXACT_BGCOLOR_HL, 0, cursor, 7627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 7637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 7647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (cursor < disp.length()) { 7657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mDisplayText.setSpan(SPAN_REMAIN_BGCOLOR_HL, cursor, disp.length(), 7667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 7677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 7687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 7697b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa disp.setSpan(SPAN_UNDERLINE, 0, disp.length(), 770053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 771053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 7727b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 7737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa int displayCursor = cursor; 7747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (FIX_CURSOR_TEXT_END) { 7757b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa displayCursor = (cursor == 0) ? 0 : 1; 7767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 777053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* update the composing text on the EditView */ 7787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.setComposingText(disp, displayCursor); 779053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 780053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 781053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 782053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 783053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Commit the composing text. 784053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 7857b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param layer {@link mComposingText}'s layer to commit. 786053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 787053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void commitText(int layer) { 788053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String tmp = mComposingText.toString(layer); 789053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 790053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mOptLearning && mConverter != null && tmp.length() > 0) { 791053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project WnnWord word = new WnnWord(tmp, tmp); 792053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter.learn(word); 793053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 794053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 7957b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.commitText(tmp, (FIX_CURSOR_TEXT_END ? 1 : tmp.length())); 796053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.clearCandidates(); 797053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 798053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 799053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 800053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Commit a word 801053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 8023feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param word A word to commit 8033feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param withSpace Append a space after the word if {@code true}. 804053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 805053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void commitText(WnnWord word, boolean withSpace) { 806053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 807053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mOptLearning && mConverter != null) { 808053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mConverter.learn(word); 809053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 810053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 8117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.commitText(word.candidate, (FIX_CURSOR_TEXT_END ? 1 : word.candidate.length())); 812053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 813053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (withSpace) { 814053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(" "); 815053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 816053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 817053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 818053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 819053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Commit a string 820053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * <br> 821053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * The string is not registered into the learning dictionary. 822053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 8237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param str A string to commit 824053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 825053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void commitText(String str) { 8267b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.commitText(str, (FIX_CURSOR_TEXT_END ? 1 : str.length())); 827053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCandidatesViewManager.clearCandidates(); 828053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 829053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 830053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 831053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Dismiss the pop-up keyboard 832053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 833053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected void dismissPopupKeyboard() { 834053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DefaultSoftKeyboardEN kbd = (DefaultSoftKeyboardEN)mInputViewManager; 835053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (kbd != null) { 836053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project kbd.dismissPopupKeyboard(); 837053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 838053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 839053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 840053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 841053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Display current meta-key state. 842053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 843053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project private void updateMetaKeyStateDisplay() { 8447b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa int mode = 0; 8457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if(mHardShift == 0 && mHardAlt == 0){ 8467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_OFF; 8477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 1 && mHardAlt == 0){ 8487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_OFF; 8497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 2 && mHardAlt == 0){ 8507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_OFF; 8517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 0 && mHardAlt == 1){ 8527b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_ON; 8537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 0 && mHardAlt == 2){ 8547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_LOCK; 8557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 1 && mHardAlt == 1){ 8567b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_ON; 8577b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 1 && mHardAlt == 2){ 8587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_LOCK; 8597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 2 && mHardAlt == 1){ 8607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_ON; 8617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 2 && mHardAlt == 2){ 8627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_LOCK; 8637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else{ 8647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_OFF; 8657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 8663feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa 8677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ((DefaultSoftKeyboard) mInputViewManager).updateIndicator(mode); 868053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 8693feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa 8703feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** 8713feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * Handling KeyEvent(KEYUP) 8723feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * <br> 8733feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * This method is called from {@link #onEvent()}. 8743feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * 8753feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param ev An up key event 8763feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa */ 8773feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa private void onKeyUpEvent(KeyEvent ev) { 8783feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa int key = ev.getKeyCode(); 8793feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!mShiftPressing){ 8803feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(key == KeyEvent.KEYCODE_SHIFT_LEFT || key == KeyEvent.KEYCODE_SHIFT_RIGHT){ 8813feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mHardShift = 0; 8823feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mShiftPressing = true; 8833feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa updateMetaKeyStateDisplay(); 8843feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8853feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8863feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!mAltPressing ){ 8873feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(key == KeyEvent.KEYCODE_ALT_LEFT || key == KeyEvent.KEYCODE_ALT_RIGHT){ 8883feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mHardAlt = 0; 8893feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mAltPressing = true; 8903feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa updateMetaKeyStateDisplay(); 8913feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8923feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8933feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8943feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** 8953feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * Fits an editor info. 8963feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * 8973feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param preferences The preference data. 8983feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param info The editor info. 8993feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa */ 9003feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa private void fitInputType(SharedPreferences preference, EditorInfo info) { 9013feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (info.inputType == EditorInfo.TYPE_NULL) { 9023feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mDirectInputMode = true; 9033feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa return; 9043feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 9053feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 906053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 907053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 908053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 909053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 910053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 911053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 9127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 9133feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa 9143feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa 915