1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012  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
1959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport jp.co.omronsoft.openwnn.JAJP.*;
20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.inputmethodservice.InputMethodService;
21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.WindowManager;
22053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.Context;
23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.View;
24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.KeyEvent;
252d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawaimport android.view.MotionEvent;
26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.SharedPreferences;
27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.preference.PreferenceManager;
28053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.util.Log;
30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.os.*;
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.inputmethod.*;
32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.res.Configuration;
33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.graphics.*;
34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.graphics.drawable.*;
35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
3659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport java.util.ArrayList;
3759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport java.util.List;
3859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
3959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport jp.co.omronsoft.openwnn.KeyAction;
4059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/**
423feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * The OpenWnn IME's base class.
43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
4459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpublic class OpenWnn extends InputMethodService {
47053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
48053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Candidate view */
49053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected CandidatesViewManager  mCandidatesViewManager = null;
50053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Input view (software keyboard) */
51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected InputViewManager  mInputViewManager = null;
52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Conversion engine */
53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected WnnEngine  mConverter = null;
54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Pre-converter (for Romaji-to-Kana input, Hangul input, etc.) */
55053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected LetterConverter  mPreConverter = null;
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The inputing/editing string */
57053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected ComposingText  mComposingText = null;
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The input connection */
59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected InputConnection mInputConnection = null;
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Auto hide candidate view */
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected boolean mAutoHideMode = true;
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Direct input mode */
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected boolean mDirectInputMode = true;
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Flag for checking if the previous down key event is consumed by OpenWnn  */
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mConsumeDownEvent;
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
6859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** for isXLarge */
6959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static boolean mIsXLarge = false;
7059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
7159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** TextCandidatesViewManager */
7259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    protected TextCandidatesViewManager mTextCandidatesViewManager = null;
7359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
7459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** TextCandidates1LineViewManager */
7559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    protected TextCandidates1LineViewManager mTextCandidates1LineViewManager = null;
7659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
7759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** The instance of current IME */
7859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static OpenWnn mCurrentIme;
7959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
8059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** KeyAction list */
8159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private List<KeyAction> KeyActionList = new ArrayList<KeyAction>();
8259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
84053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
86053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public OpenWnn() {
87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super();
88053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /***********************************************************************
91053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * InputMethodService
92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     **********************************************************************/
93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#onCreate */
94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void onCreate() {
9559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        updateXLargeMode();
96053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.onCreate();
977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
10059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCurrentIme = this;
10159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
10259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
10359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mTextCandidatesViewManager = new TextCandidatesViewManager(-1);
10459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (isXLarge()) {
10559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mTextCandidates1LineViewManager =
10659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                new TextCandidates1LineViewManager(OpenWnnEngineJAJP.LIMIT_OF_CANDIDATES_1LINE);
10759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mCandidatesViewManager = mTextCandidates1LineViewManager;
10859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
10959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mCandidatesViewManager = mTextCandidatesViewManager;
11059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
1117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mConverter != null) { mConverter.init(); }
113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mComposingText != null) { mComposingText.clear(); }
114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#onCreateCandidatesView */
117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public View onCreateCandidatesView() {
118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mCandidatesViewManager != null) {
119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
12059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (isXLarge()) {
12159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mCandidatesViewManager = mTextCandidates1LineViewManager;
12259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mTextCandidatesViewManager.initView(this,
12359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                                        wm.getDefaultDisplay().getWidth(),
12459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                                        wm.getDefaultDisplay().getHeight());
12559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
12659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mCandidatesViewManager = mTextCandidatesViewManager;
12759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            View view = mCandidatesViewManager.initView(this,
129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                        wm.getDefaultDisplay().getWidth(),
130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                        wm.getDefaultDisplay().getHeight());
131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL);
132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return view;
133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return super.onCreateCandidatesView();
135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#onCreateInputView */
139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public View onCreateInputView() {
140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mInputViewManager != null) {
144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return mInputViewManager.initView(this,
146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                              wm.getDefaultDisplay().getWidth(),
147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                              wm.getDefaultDisplay().getHeight());
148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return super.onCreateInputView();
150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#onDestroy */
154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void onDestroy() {
155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.onDestroy();
15659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCurrentIme = null;
157e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        close();
158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#onKeyDown */
161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public boolean onKeyDown(int keyCode, KeyEvent event) {
162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mConsumeDownEvent = onEvent(new OpenWnnEvent(event));
16359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
16459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        KeyAction Keycodeinfo = new KeyAction();
16559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        Keycodeinfo.mConsumeDownEvent = mConsumeDownEvent;
16659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        Keycodeinfo.mKeyCode = keyCode;
16759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
16859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int cnt = KeyActionList.size();
16959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (cnt != 0) {
17059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            for (int i = 0; i < cnt; i++) {
17159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (KeyActionList.get(i).mKeyCode == keyCode) {
17259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    KeyActionList.remove(i);
17359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
17459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
17559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
17659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
17759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        KeyActionList.add(Keycodeinfo);
178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (!mConsumeDownEvent) {
179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return super.onKeyDown(keyCode, event);
180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return mConsumeDownEvent;
182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#onKeyUp */
185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public boolean onKeyUp(int keyCode, KeyEvent event) {
186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        boolean ret = mConsumeDownEvent;
18759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int cnt = KeyActionList.size();
18859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        for (int i = 0; i < cnt; i++) {
18959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            KeyAction Keycodeinfo = KeyActionList.get(i);
19059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (Keycodeinfo.mKeyCode == keyCode) {
19159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                ret = Keycodeinfo.mConsumeDownEvent;
19259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                KeyActionList.remove(i);
19359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                break;
19459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
19559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (!ret) {
197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = super.onKeyUp(keyCode, event);
1983feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        }else{
19959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            ret = onEvent(new OpenWnnEvent(event));
200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ret;
202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
20359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
20459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
20559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Called when the key long press event occurred.
20659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
20759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @see android.inputmethodservice.InputMethodService#onKeyLongPress
20859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
20959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) {
21059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mCurrentIme == null) {
21159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            Log.e("iWnn", "OpenWnn::onKeyLongPress()  Unprocessing onCreate() ");
21259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return super.onKeyLongPress(keyCode, event);
21359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
21459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
21559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        OpenWnnEvent wnnEvent = new OpenWnnEvent(event);
21659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        wnnEvent.code = OpenWnnEvent.KEYLONGPRESS;
21759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return onEvent(wnnEvent);
21859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#onStartInput */
221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void onStartInput(EditorInfo attribute, boolean restarting) {
222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.onStartInput(attribute, restarting);
223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputConnection = getCurrentInputConnection();
2242d6595cdc6058d8712a90fc499b7c8b539f81247Daisuke Miyakawa        if (!restarting && mComposingText != null) {
225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mComposingText.clear();
226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#onStartInputView */
230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void onStartInputView(EditorInfo attribute, boolean restarting) {
231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.onStartInputView(attribute, restarting);
232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInputConnection = getCurrentInputConnection();
233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        setCandidatesViewShown(false);
235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mInputConnection != null) {
236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDirectInputMode = false;
237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mConverter != null) { mConverter.init(); }
238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDirectInputMode = true;
240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mCandidatesViewManager != null) { mCandidatesViewManager.setPreferences(pref);  }
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mInputViewManager != null) { mInputViewManager.setPreferences(pref, attribute);  }
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mPreConverter != null) { mPreConverter.setPreferences(pref);  }
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mConverter != null) { mConverter.setPreferences(pref);  }
246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see android.inputmethodservice.InputMethodService#requestHideSelf */
249053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void requestHideSelf(int flag) {
250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.requestHideSelf(flag);
251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mInputViewManager == null) {
252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            hideWindow();
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#setCandidatesViewShown */
257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void setCandidatesViewShown(boolean shown) {
258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.setCandidatesViewShown(shown);
259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (shown) {
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            showWindow(true);
261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (mAutoHideMode && mInputViewManager == null) {
263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                hideWindow();
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.inputmethodservice.InputMethodService#hideWindow */
269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public void hideWindow() {
270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.hideWindow();
271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mDirectInputMode = true;
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        hideStatusIcon();
273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
274e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.inputmethodservice.InputMethodService#onComputeInsets */
275e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    @Override public void onComputeInsets(InputMethodService.Insets outInsets) {
276e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        super.onComputeInsets(outInsets);
277e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        outInsets.contentTopInsets = outInsets.visibleTopInsets;
278e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**********************************************************************
282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * OpenWnn
283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     **********************************************************************/
284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Process an event.
286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  ev  An event
28877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return  {@code true} if the event is processed in this method; {@code false} if not.
289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean onEvent(OpenWnnEvent ev) {
291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return false;
292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Search a character for toggle input.
296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param prevChar     The character input previous
298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param toggleTable  Toggle table
2993feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     * @param reverse      {@code false} if toggle direction is forward, {@code true} if toggle direction is backward
30077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return          A character ({@code null} if no character is found)
301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected String searchToggleCharacter(String prevChar, String[] toggleTable, boolean reverse) {
303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        for (int i = 0; i < toggleTable.length; i++) {
304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (prevChar.equals(toggleTable[i])) {
305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (reverse) {
306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    i--;
307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (i < 0) {
308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        return toggleTable[toggleTable.length - 1];
309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    } else {
310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        return toggleTable[i];
311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    i++;
314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (i == toggleTable.length) {
315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        return toggleTable[0];
316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    } else {
317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        return toggleTable[i];
318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return null;
323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
324e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
325e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
326e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Processing of resource open when IME ends.
327e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
328e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    protected void close() {
329e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mConverter != null) { mConverter.close(); }
330e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
33159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
33259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
33359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Whether the x large mode.
33459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
33559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return      {@code true} if x large; {@code false} if not x large.
33659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
33759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public static boolean isXLarge() {
33859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return mIsXLarge;
33959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
34059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
34159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
34259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Update the x large mode.
34359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
34459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void updateXLargeMode() {
34559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mIsXLarge = ((getResources().getConfiguration().screenLayout &
34659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                      Configuration.SCREENLAYOUT_SIZE_MASK)
34759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                      == Configuration.SCREENLAYOUT_SIZE_XLARGE);
34859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
34959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
35059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
35159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Get the instance of current IME.
35259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
35359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return the instance of current IME, See {@link jp.co.omronsoft.openwnn.OpenWnn}
35459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
35559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public static OpenWnn getCurrentIme() {
35659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return mCurrentIme;
35759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
35859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
35959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
36059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Check through key code in IME.
36159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
36259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param keyCode  check key code.
36359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return {@code true} if through key code; {@code false} otherwise.
36459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
36559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    protected boolean isThroughKeyCode(int keyCode) {
36659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean result;
36759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        switch (keyCode) {
36859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_CALL:
36959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_VOLUME_DOWN:
37059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_VOLUME_UP:
37159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
37259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_NEXT:
37359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
37459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
37559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_REWIND:
37659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_STOP:
37759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MUTE:
37859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_HEADSETHOOK:
37959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_VOLUME_MUTE:
38059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_CLOSE:
38159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_EJECT:
38259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_PAUSE:
38359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_PLAY:
38459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MEDIA_RECORD:
38559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_MANNER_MODE:
38659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            result = true;
38759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
38859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
38959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        default:
39059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            result = false;
39159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
39259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
39359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
39459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return result;
39559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
39659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
39759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
39859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Check ten-key code.
39959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
40059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param keyCode  check key code.
40159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return {@code true} if ten-key code; {@code false} not ten-key code.
40259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
40359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    protected boolean isTenKeyCode(int keyCode) {
40459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean result = false;
40559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        switch (keyCode) {
40659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_0:
40759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_1:
40859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_2:
40959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_3:
41059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_4:
41159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_5:
41259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_6:
41359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_7:
41459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_8:
41559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_9:
41659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_NUMPAD_DOT:
41759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            result = true;
41859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
41959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
42059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        default:
42159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
42259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
42359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
42459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return result;
42559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
427