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