OpenWnnEN.java revision 77ffa9b0b986a2d70143f63cdaa8451bf1674f84
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 { 4577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** A space character */ 4677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private static final char[] SPACE = {' '}; 4777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 4877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Character style of underline */ 4977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 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 5577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** A private area code(ALT+SHIFT+X) to be ignore (G1 specific). */ 5677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private static final int PRIVATE_AREA_CODE = 61184; 5777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke 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 6077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Whether using Emoji or not */ 617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa private static final boolean ENABLE_EMOJI_LIMITATION = true; 6277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 6377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Spannable string for the composing text */ 6477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa protected SpannableStringBuilder mDisplayText; 6577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 6677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Handler for drawing the candidates view */ 6777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private Handler mDelayUpdateHandler; 6877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Characters treated as a separator */ 6977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private String mWordSeparators; 7077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Previous event's code */ 7177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private int mPreviousEventCode; 7277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 7377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Array of words from the user dictionary */ 7477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private WnnWord[] mUserDictionaryWords = null; 7577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 7677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** The converter for English prediction/spell correction */ 7777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private OpenWnnEngineEN mConverterEN; 7877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** The symbol list generator */ 7977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private SymbolList mSymbolList; 8077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Whether it is displaying symbol list */ 8177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private boolean mSymbolMode; 8277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Whether prediction is enabled */ 8377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private boolean mOptPrediction; 8477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Whether spell correction is enabled */ 8577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private boolean mOptSpellCorrection; 8677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Whether learning is enabled */ 8777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private boolean mOptLearning; 8877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 8977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** SHIFT key state */ 9077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private int mHardShift; 913feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** SHIFT key state (pressing) */ 9277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private boolean mShiftPressing; 9377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** ALT key state */ 9477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private int mHardAlt; 953feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** ALT key state (pressing) */ 9677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private boolean mAltPressing; 97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 9877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Instance of this service */ 9977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private static OpenWnnEN mSelf = null; 100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 10177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Shift lock toggle definition */ 10277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private static final int[] mShiftKeyToggle = {0, MetaKeyKeyListener.META_SHIFT_ON, MetaKeyKeyListener.META_CAP_LOCKED}; 10377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Alt lock toggle definition */ 10477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private static final int[] mAltKeyToggle = {0, MetaKeyKeyListener.META_ALT_ON, MetaKeyKeyListener.META_ALT_LOCKED}; 10577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Auto caps mode */ 10677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private boolean mAutoCaps = false; 10777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 10877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke 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 */ 11377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public OpenWnnEN() { 11477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa super(); 115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mSelf = this; 116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 11777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* used by OpenWnn */ 11877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText = new ComposingText(); 11977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager = new TextCandidatesViewManager(-1); 12077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mInputViewManager = new DefaultSoftKeyboardEN(); 12177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverterEN = new OpenWnnEngineEN("/data/data/jp.co.omronsoft.openwnn/writableEN.dic"); 12277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverter = mConverterEN; 12377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mFilter = new CandidateFilter(); 12477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mSymbolList = null; 12577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 12677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* etc */ 12777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDisplayText = new SpannableStringBuilder(); 12877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mAutoHideMode = false; 12977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDelayUpdateHandler = new Handler(); 13077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mSymbolMode = false; 13177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptPrediction = true; 13277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptSpellCorrection = true; 13377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptLearning = true; 13477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 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 } 14577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 14677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Get the instance of this service. 14777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * <br> 14877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Before using this method, the constructor of this service must be invoked. 14977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 15077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @return The instance of this object 15177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 15277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public static OpenWnnEN getInstance() { 15377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return mSelf; 15477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 15577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 15677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 15777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Insert a character into the composing text. 15877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 15977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param chars A array of character 16077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 16177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private void insertCharToComposingText(char[] chars) { 16277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa StrSegment seg = new StrSegment(chars); 16377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 16477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (chars[0] == SPACE[0] || chars[0] == '\u0009') { 16577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* if the character is a space, commit the composing text */ 16677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(1); 16777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(seg.string); 16877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.clear(); 16977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else if (mWordSeparators.contains(seg.string)) { 17077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* if the character is a separator, remove an auto-inserted space and commit the composing text. */ 17177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mPreviousEventCode == OpenWnnEvent.SELECT_CANDIDATE) { 17277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mInputConnection.deleteSurroundingText(1, 0); 17377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 17477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(1); 17577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(seg.string); 17677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.clear(); 17777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 17877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.insertStrSegment(0, 1, seg); 17977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 18077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 18177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 18277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 18377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 18477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Insert a character into the composing text. 18577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 18677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param charCode A character code 18777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @return {@code true} if success; {@code false} if an error occurs. 18877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 18977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 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 19777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 19877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Get the shift key state from the editor. 19977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 20077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param editor Editor 20177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 20277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @return State ID of the shift key (0:off, 1:on) 20377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 20477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa protected int getShiftKeyState(EditorInfo editor) { 20577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return (getCurrentInputConnection().getCursorCapsMode(editor.inputType) == 0) ? 0 : 1; 20677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Set the mode of the symbol list. 2103feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * 21177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param mode {@code SymbolList.SYMBOL_ENGLISH} or {@code null}. 212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 21377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private void setSymbolMode(String mode) { 21477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mode != null) { 21577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 21677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mSymbolMode = true; 21777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mSymbolList.setDictionary(mode); 21877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverter = mSymbolList; 21977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 22077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (!mSymbolMode) { 22177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return; 22277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 22377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 22477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mSymbolMode = false; 22577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverter = mConverterEN; 22677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 22777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 22877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 22977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /*********************************************************************** 23077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * InputMethodServer 23177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ***********************************************************************/ 232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onCreate */ 23377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa @Override public void onCreate() { 23477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa super.onCreate(); 23577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mWordSeparators = getResources().getString(R.string.en_word_separators); 23677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 23777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mSymbolList == null) { 23877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mSymbolList = new SymbolList(this, SymbolList.LANG_EN); 23977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 24077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 24177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 2427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /** @see jp.co.omronsoft.openwnn.OpenWnn#onCreateInputView */ 2437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa @Override public View onCreateInputView() { 24477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int hiddenState = getResources().getConfiguration().hardKeyboardHidden; 24577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa boolean hidden = (hiddenState == Configuration.HARDKEYBOARDHIDDEN_YES); 24677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ((DefaultSoftKeyboardEN) mInputViewManager).setHardKeyboardHidden(hidden); 24777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ((TextCandidatesViewManager) 24877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke 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 */ 25477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { 25577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa super.onStartInputView(attribute, restarting); 256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 25777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* initialize views */ 25877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.clearCandidates(); 25977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_CLOSE); 260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 26177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mHardShift = 0; 26277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mHardAlt = 0; 2637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa updateMetaKeyStateDisplay(); 264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* load preferences */ 26677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 26877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* auto caps mode */ 26977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mAutoCaps = pref.getBoolean("auto_caps", true); 270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 27177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* set TextCandidatesViewManager's option */ 27277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ((TextCandidatesViewManager)mCandidatesViewManager).setAutoHide(true); 2737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 27477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* display status icon */ 27577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa showStatusIcon(R.drawable.immodeic_half_alphabet); 276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 27777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* set prediction & spell correction mode */ 27877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptPrediction = pref.getBoolean("opt_en_prediction", true); 27977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptSpellCorrection = pref.getBoolean("opt_en_spell_correction", true); 28077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptLearning = pref.getBoolean("opt_en_enable_learning", true); 281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 28277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* 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; 28877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptLearning = false; 2897b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa break; 290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 2917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_CLASS_TEXT: 29277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa switch (attribute.inputType & EditorInfo.TYPE_MASK_VARIATION) { 29377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case EditorInfo.TYPE_TEXT_VARIATION_PASSWORD: 2947b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case EditorInfo.TYPE_TEXT_VARIATION_PHONETIC: 29577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptLearning = false; 29677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptPrediction = false; 29777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 29877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa default: 29977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 30077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 3017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 3037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* set engine's mode */ 3047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (mOptSpellCorrection) { 30577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverterEN.setDictionary(OpenWnnEngineEN.DICT_FOR_CORRECT_MISTYPE); 3067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } else { 30777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke 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")) { 31377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverterEN.setFilter(null); 3147b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } else { 31577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mFilter.setFilter(CandidateFilter.FILTER_EMOJI); 31677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverterEN.setFilter(mFilter); 3177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } else { 31977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke 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) { 32477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mOptLearning = false; 3257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3267b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 3277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (mComposingText != null) { 32877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.clear(); 3297b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 3303feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /* initialize the engine's state */ 3313feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa fitInputType(pref, attribute); 33277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onComputeInsets */ 33577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa @Override public void onComputeInsets(InputMethodService.Insets outInsets) { 33677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* use default value. means; 33777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * outInsets.touchableInsets = InputMethodService.Insets.TOUCHABLE_INSETS_VISIBLE; 33877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 33977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onUpdateSelection */ 34277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa @Override public void onUpdateSelection(int oldSelStart, int oldSelEnd, 34377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int newSelStart, int newSelEnd, int candidatesStart, 34477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int candidatesEnd) { 34577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mComposingText.size(1) != 0) { 34677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 34777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 34877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onConfigurationChanged */ 35177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa @Override public void onConfigurationChanged(Configuration newConfig) { 35277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa try { 35377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa super.onConfigurationChanged(newConfig); 35477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mInputConnection != null) { 35577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 35677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 35777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } catch (Exception ex) { 35877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 35977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvaluateFullscreenMode */ 36277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa @Override public boolean onEvaluateFullscreenMode() { 36377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return false; 36477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvaluateInputViewShown */ 36777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa @Override public boolean onEvaluateInputViewShown() { 36877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 36977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 37177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /*********************************************************************** 37277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * OpenWnn 37377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ***********************************************************************/ 374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** @see jp.co.omronsoft.openwnn.OpenWnn#onEvent */ 37577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa @Override synchronized public boolean onEvent(OpenWnnEvent ev) { 376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* handling events which are valid when InputConnection is not active. */ 377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch (ev.code) { 3783feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa 3793feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa case OpenWnnEvent.KEYUP: 3803feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa onKeyUpEvent(ev.keyEvent); 3813feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa return true; 3823feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa 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 39377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case OpenWnnEvent.GET_WORD: 39477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mUserDictionaryWords != null ) { 39577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ev.word = mUserDictionaryWords[ 0 ]; 39677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa for( int i = 0 ; i < mUserDictionaryWords.length-1 ; i++ ) { 39777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mUserDictionaryWords[ i ] = mUserDictionaryWords[ i + 1 ]; 39877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 39977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mUserDictionaryWords[ mUserDictionaryWords.length-1 ] = null; 40077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mUserDictionaryWords[ 0 ] == null ) { 40177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mUserDictionaryWords = null; 40277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 40377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 40477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 40777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case OpenWnnEvent.ADD_WORD: 40877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverterEN.addWord(ev.word); 40977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 41177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case OpenWnnEvent.DELETE_WORD: 41277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverterEN.deleteWord(ev.word); 41377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 414053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 41577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case OpenWnnEvent.CHANGE_MODE: 416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return false; 4177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 4187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa case OpenWnnEvent.CHANGE_INPUT_VIEW: 41977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke 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; 42977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 430053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 43177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa dismissPopupKeyboard(); 4323feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa KeyEvent keyEvent = ev.keyEvent; 4333feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa int keyCode = 0; 4343feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (keyEvent != null) { 4353feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa keyCode = keyEvent.getKeyCode(); 4363feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 43777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mDirectInputMode) { 4383feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (ev.code == OpenWnnEvent.INPUT_SOFT_KEY && mInputConnection != null) { 4393feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mInputConnection.sendKeyEvent(keyEvent); 44077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mInputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, 4413feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa keyEvent.getKeyCode())); 4423feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 44377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return false; 44477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 44577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 44677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (ev.code == OpenWnnEvent.LIST_CANDIDATES_FULL) { 44777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_FULL); 44877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 44977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 45077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 45177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa boolean ret = false; 45277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa switch (ev.code) { 45377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case OpenWnnEvent.INPUT_CHAR: 45477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ((TextCandidatesViewManager)mCandidatesViewManager).setAutoHide(false); 45577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa EditorInfo edit = getCurrentInputEditorInfo(); 45677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( edit.inputType == EditorInfo.TYPE_CLASS_PHONE){ 45777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(new String(ev.chars)); 45877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa }else{ 45977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa setSymbolMode(null); 46077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa insertCharToComposingText(ev.chars); 46177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ret = true; 46277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mPreviousEventCode = ev.code; 46377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 46477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 46577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 46677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case OpenWnnEvent.INPUT_KEY: 46777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa keyCode = ev.keyEvent.getKeyCode(); 46877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* update shift/alt state */ 46977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa switch (keyCode) { 47077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_ALT_LEFT: 47177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_ALT_RIGHT: 47277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (ev.keyEvent.getRepeatCount() == 0) { 47377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (++mHardAlt > 2) { mHardAlt = 0; } 47477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 4753feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mAltPressing = true; 47677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateMetaKeyStateDisplay(); 47777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 47877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 47977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_SHIFT_LEFT: 48077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_SHIFT_RIGHT: 48177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (ev.keyEvent.getRepeatCount() == 0) { 48277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (++mHardShift > 2) { mHardShift = 0; } 48377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 4843feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mShiftPressing = true; 48577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateMetaKeyStateDisplay(); 48677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 48777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 48877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa setSymbolMode(null); 48977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 49077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* handle other key event */ 49177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ret = processKeyEvent(ev.keyEvent); 49277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mPreviousEventCode = ev.code; 49377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 49477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 49577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case OpenWnnEvent.INPUT_SOFT_KEY: 49677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa setSymbolMode(null); 49777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 49877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ret = processKeyEvent(ev.keyEvent); 49977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (!ret) { 50077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mInputConnection.sendKeyEvent(ev.keyEvent); 50177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mInputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, ev.keyEvent.getKeyCode())); 502053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ret = true; 50377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 50477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mPreviousEventCode = ev.code; 50577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 506053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 50777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case OpenWnnEvent.SELECT_CANDIDATE: 508053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mSymbolMode) { 509053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(ev.word, false); 510053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 511053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mWordSeparators.contains(ev.word.candidate) && 512053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode == OpenWnnEvent.SELECT_CANDIDATE) { 513053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mInputConnection.deleteSurroundingText(1, 0); 514053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 515053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(ev.word, true); 516053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 518053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mPreviousEventCode = ev.code; 519053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateComposingText(1); 520053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 52277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case OpenWnnEvent.LIST_SYMBOLS: 52377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(1); 52477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.clear(); 52577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa setSymbolMode(SymbolList.SYMBOL_ENGLISH); 52677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 52777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 52877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 52977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa default: 53077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 53177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 53277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 53377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) { 53477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL); 53577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 53677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 53777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return ret; 53877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 53977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 54077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /*********************************************************************** 54177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * OpenWnnEN 54277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ***********************************************************************/ 54377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 54477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Handling KeyEvent 54577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * <br> 54677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * This method is called from {@link #onEvent()}. 54777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 54877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param ev A key event 54977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @return {@code true} if the event is processed in this method; {@code false} if the event is not processed in this method 55077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 55177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private boolean processKeyEvent(KeyEvent ev) { 55277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 55377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int key = ev.getKeyCode(); 55477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa EditorInfo edit = getCurrentInputEditorInfo(); 55577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* keys which produce a glyph */ 55677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (ev.isPrintingKey()) { 55777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* do nothing if the character is not able to display or the character is dead key */ 55877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if ((mHardShift > 0 && mHardAlt > 0) || (ev.isAltPressed() && ev.isShiftPressed())) { 55977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int charCode = ev.getUnicodeChar(MetaKeyKeyListener.META_SHIFT_ON | MetaKeyKeyListener.META_ALT_ON); 56077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (charCode == 0 || (charCode & KeyCharacterMap.COMBINING_ACCENT) != 0 || charCode == PRIVATE_AREA_CODE) { 5613feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(mHardShift == 1){ 5623feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mShiftPressing = false; 5633feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 5643feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(mHardAlt == 1){ 5653feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mAltPressing = false; 5663feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 56777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if(!ev.isAltPressed()){ 56877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mHardAlt == 1) { 56977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mHardAlt = 0; 57077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 57177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 57277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if(!ev.isShiftPressed()){ 57377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mHardShift == 1) { 57477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mHardShift = 0; 57577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 57677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 57777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if(!ev.isShiftPressed() && !ev.isAltPressed()){ 57877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateMetaKeyStateDisplay(); 57977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 58077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 58177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 58277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 58377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 58477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ((TextCandidatesViewManager)mCandidatesViewManager).setAutoHide(false); 585053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 586053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* get the key character */ 58777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mHardShift== 0 && mHardAlt == 0) { 588053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* no meta key is locked */ 58977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int shift = (mAutoCaps) ? getShiftKeyState(edit) : 0; 59077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (shift != mHardShift && (key >= KeyEvent.KEYCODE_A && key <= KeyEvent.KEYCODE_Z)) { 591053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* handling auto caps for a alphabet character */ 592053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.getUnicodeChar(MetaKeyKeyListener.META_SHIFT_ON)); 593053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 594053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.getUnicodeChar()); 595053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 59677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 597053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project insertCharToComposingText(ev.getUnicodeChar(mShiftKeyToggle[mHardShift] 598053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project | mAltKeyToggle[mHardAlt])); 5993feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(mHardShift == 1){ 6003feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mShiftPressing = false; 6013feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 6023feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(mHardAlt == 1){ 6033feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mAltPressing = false; 6043feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 605053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* back to 0 (off) if 1 (on/not locked) */ 60677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if(!ev.isAltPressed()){ 60777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mHardAlt == 1) { 60877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mHardAlt = 0; 60977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 61077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 61177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if(!ev.isShiftPressed()){ 61277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mHardShift == 1) { 61377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mHardShift = 0; 61477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 61577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 61677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if(!ev.isShiftPressed() && !ev.isAltPressed()){ 6173feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa updateMetaKeyStateDisplay(); 61877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 61977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 620053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 621053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (edit.inputType == EditorInfo.TYPE_CLASS_PHONE) { 62277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(1); 62377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.clear(); 62477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 62577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 62677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 62777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 62877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else if (key == KeyEvent.KEYCODE_SPACE) { 62977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (ev.isAltPressed()) { 630053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* display the symbol list (G1 specific. same as KEYCODE_SYM) */ 63177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(1); 63277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.clear(); 63377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa setSymbolMode(SymbolList.SYMBOL_ENGLISH); 63477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 63577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mHardAlt = 0; 636053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 63777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 63877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa insertCharToComposingText(SPACE); 63977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 64077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 641053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else if (key == KeyEvent.KEYCODE_SYM) { 642053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* display the symbol list */ 643053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project commitText(1); 644053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mComposingText.clear(); 645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setSymbolMode(SymbolList.SYMBOL_ENGLISH); 64677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 647053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mHardAlt = 0; 648053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project updateMetaKeyStateDisplay(); 64977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 65077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 65177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 65277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* Functional key */ 65377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mComposingText.size(1) > 0) { 65477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa switch (key) { 65577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_DEL: 65677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.delete(1, false); 65777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 65877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 65977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 66077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_BACK: 66177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mCandidatesViewManager.getViewType() == CandidatesViewManager.VIEW_TYPE_FULL) { 66277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL); 66377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 66477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.clear(); 66577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 66677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 66777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 66877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 66977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_DPAD_LEFT: 67077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.moveCursor(1, -1); 67177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 67277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 67377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 67477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_DPAD_RIGHT: 67577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.moveCursor(1, 1); 67677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa updateComposingText(1); 67777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 67877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 67977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_ENTER: 68077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case KeyEvent.KEYCODE_DPAD_CENTER: 68177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(1); 68277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.clear(); 68377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return true; 68477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 68577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa default: 68677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 68777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 68877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 68977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 69077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return false; 69177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 69277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 69377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 69477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Runnable for a thread getting and displaying candidates. 69577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 69677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private final Runnable updatePredictionRunnable = new Runnable() { 69777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public void run() { 69877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int candidates = 0; 69977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mConverter != null) { 70077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* normal prediction */ 70177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa candidates = mConverter.predict(mComposingText, 0, -1); 70277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 70377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* update the candidates view */ 70477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (candidates > 0) { 70577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.displayCandidates(mConverter); 70677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 70777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.clearCandidates(); 70877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 70977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 71077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa }; 71177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 71277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 71377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Update the composing text. 71477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 71577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param layer {@link mComposingText}'s layer to display 71677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 71777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private void updateComposingText(int layer) { 71877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* update the candidates view */ 71977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (!mOptPrediction) { 72077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(1); 72177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mComposingText.clear(); 722053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if (mSymbolMode) { 72377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 72477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDelayUpdateHandler.postDelayed(updatePredictionRunnable, 0); 72577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 72677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 72777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mComposingText.size(1) != 0) { 72877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 72977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDelayUpdateHandler.postDelayed(updatePredictionRunnable, 250); 73077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 73177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDelayUpdateHandler.removeCallbacks(updatePredictionRunnable); 73277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDelayUpdateHandler.postDelayed(updatePredictionRunnable, 0); 73377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 73477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 73577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* notice to the input view */ 73677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa this.mInputViewManager.onUpdateState(this); 73777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 73877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* set the candidates view to the normal size */ 73977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mCandidatesViewManager.getViewType() != CandidatesViewManager.VIEW_TYPE_NORMAL) { 74077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL); 741053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 74277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* set the text for displaying as the composing text */ 74377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa SpannableStringBuilder disp = mDisplayText; 74477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa disp.clear(); 74577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa disp.insert(0, mComposingText.toString(layer)); 74677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 74777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* add decoration to the text */ 74877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int cursor = mComposingText.getCursor(layer); 74977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (disp.length() != 0) { 75077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (cursor > 0 && cursor < disp.length()) { 75177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa disp.setSpan(SPAN_EXACT_BGCOLOR_HL, 0, cursor, 75277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 75377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 75477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (cursor < disp.length()) { 7557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mDisplayText.setSpan(SPAN_REMAIN_BGCOLOR_HL, cursor, disp.length(), 7567b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 75777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 75877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 75977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa disp.setSpan(SPAN_UNDERLINE, 0, disp.length(), 76077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 76177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 76277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 7637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa int displayCursor = cursor; 7647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if (FIX_CURSOR_TEXT_END) { 7657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa displayCursor = (cursor == 0) ? 0 : 1; 7667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 76777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* update the composing text on the EditView */ 76877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mInputConnection.setComposingText(disp, displayCursor); 76977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 77077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 77177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 77277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 77377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Commit the composing text. 77477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 77577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param layer {@link mComposingText}'s layer to commit. 77677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 77777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private void commitText(int layer) { 77877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa String tmp = mComposingText.toString(layer); 77977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 78077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mOptLearning && mConverter != null && tmp.length() > 0) { 78177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa WnnWord word = new WnnWord(tmp, tmp); 78277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverter.learn(word); 78377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 784053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 7857b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.commitText(tmp, (FIX_CURSOR_TEXT_END ? 1 : tmp.length())); 78677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.clearCandidates(); 78777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 788053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 78977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 79077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Commit a word 79177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 79277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param word A word to commit 79377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param withSpace Append a space after the word if {@code true}. 79477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 79577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private void commitText(WnnWord word, boolean withSpace) { 796053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 79777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mOptLearning && mConverter != null) { 79877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mConverter.learn(word); 79977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 800053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 8017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.commitText(word.candidate, (FIX_CURSOR_TEXT_END ? 1 : word.candidate.length())); 802053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 80377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (withSpace) { 80477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa commitText(" "); 80577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 80677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 807053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 80877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 80977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Commit a string 810053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * <br> 811053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * The string is not registered into the learning dictionary. 81277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 81377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param str A string to commit 81477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 81577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private void commitText(String str) { 8167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mInputConnection.commitText(str, (FIX_CURSOR_TEXT_END ? 1 : str.length())); 81777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCandidatesViewManager.clearCandidates(); 81877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 81977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 82077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 82177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Dismiss the pop-up keyboard 82277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 82377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa protected void dismissPopupKeyboard() { 82477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa DefaultSoftKeyboardEN kbd = (DefaultSoftKeyboardEN)mInputViewManager; 82577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (kbd != null) { 82677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa kbd.dismissPopupKeyboard(); 82777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 82877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 82977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 83077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 83177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Display current meta-key state. 83277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 83377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa private void updateMetaKeyStateDisplay() { 8347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa int mode = 0; 8357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa if(mHardShift == 0 && mHardAlt == 0){ 8367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_OFF; 8377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 1 && mHardAlt == 0){ 8387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_OFF; 8397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 2 && mHardAlt == 0){ 8407b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_OFF; 8417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 0 && mHardAlt == 1){ 8427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_ON; 8437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 0 && mHardAlt == 2){ 8447b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_LOCK; 8457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 1 && mHardAlt == 1){ 8467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_ON; 8477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 1 && mHardAlt == 2){ 8487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_ON_ALT_LOCK; 8497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 2 && mHardAlt == 1){ 8507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_ON; 8517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else if(mHardShift == 2 && mHardAlt == 2){ 8527b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_LOCK_ALT_LOCK; 8537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa }else{ 8547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa mode = DefaultSoftKeyboard.HARD_KEYMODE_SHIFT_OFF_ALT_OFF; 8557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 8563feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa 8577b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ((DefaultSoftKeyboard) mInputViewManager).updateIndicator(mode); 85877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 85977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 86077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 86177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Handling KeyEvent(KEYUP) 86277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * <br> 86377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * This method is called from {@link #onEvent()}. 86477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 86577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param ev An up key event 86677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 8673feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa private void onKeyUpEvent(KeyEvent ev) { 8683feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa int key = ev.getKeyCode(); 8693feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!mShiftPressing){ 8703feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(key == KeyEvent.KEYCODE_SHIFT_LEFT || key == KeyEvent.KEYCODE_SHIFT_RIGHT){ 8713feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mHardShift = 0; 8723feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mShiftPressing = true; 8733feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa updateMetaKeyStateDisplay(); 8743feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8753feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8763feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(!mAltPressing ){ 8773feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if(key == KeyEvent.KEYCODE_ALT_LEFT || key == KeyEvent.KEYCODE_ALT_RIGHT){ 8783feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mHardAlt = 0; 8793feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mAltPressing = true; 8803feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa updateMetaKeyStateDisplay(); 8813feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8823feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8833feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8843feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** 8853feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * Fits an editor info. 8863feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * 8873feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param preferences The preference data. 88877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param info The editor info. 8893feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa */ 8903feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa private void fitInputType(SharedPreferences preference, EditorInfo info) { 8913feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (info.inputType == EditorInfo.TYPE_NULL) { 8923feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa mDirectInputMode = true; 8933feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa return; 8943feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 8953feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } 896053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 897