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