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