DefaultSoftKeyboardEN.java revision 3feb3d26d59be1626c59b72654020179e2b2ebe0
1/*
2 * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package jp.co.omronsoft.openwnn.EN;
18
19import jp.co.omronsoft.openwnn.*;
20import android.content.SharedPreferences;
21import android.inputmethodservice.Keyboard;
22import android.view.KeyEvent;
23import android.view.View;
24import android.view.inputmethod.EditorInfo;
25
26import android.util.Log;
27
28/**
29 * The default Software Keyboard class for English IME.
30 *
31 * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
32 */
33public class DefaultSoftKeyboardEN extends DefaultSoftKeyboard {
34    /** 12-key keyboard [PHONE MODE] */
35    public static final int KEYCODE_PHONE  = -116;
36
37	/**
38     * Keyboards toggled by ALT key.
39     * <br>
40     * The normal keyboard(KEYMODE_EN_ALPHABET) and the number/symbol
41     * keyboard(KEYMODE_EN_NUMBER) is active.  The phone number
42     * keyboard(KEYMODE_EN_PHONE) is disabled.
43     */
44    private static final boolean[] TOGGLE_KEYBOARD = {true, true, false};
45
46    /** Auto caps mode */
47    private boolean mAutoCaps = false;
48
49	/**
50     * Default constructor
51     */
52    public DefaultSoftKeyboardEN() { }
53
54    /**
55     * Dismiss the pop-up keyboard.
56     * <br>
57     * Nothing will be done if no pop-up keyboard is displaying.
58     */
59    public void dismissPopupKeyboard() {
60    	try {
61    		if (mKeyboardView != null) {
62    			mKeyboardView.handleBack();
63    		}
64    	} catch (Exception ex) {
65    		/* ignore */
66    	}
67    }
68
69    /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#createKeyboards */
70    @Override protected void createKeyboards(OpenWnn parent) {
71        mKeyboard = new Keyboard[3][2][4][2][7][2];
72
73        Keyboard[][] keyList;
74        /***********************************************************************
75         * English
76         ***********************************************************************/
77        /* qwerty shift_off */
78        keyList = mKeyboard[LANG_EN][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
79        keyList[KEYMODE_EN_ALPHABET][0] = new Keyboard(parent, R.xml.default_en_qwerty);
80        keyList[KEYMODE_EN_NUMBER][0]   = new Keyboard(parent, R.xml.default_en_symbols);
81        keyList[KEYMODE_EN_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
82
83        /* qwerty shift_on */
84        keyList = mKeyboard[LANG_EN][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
85        keyList[KEYMODE_EN_ALPHABET][0] =
86            mKeyboard[LANG_EN][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_EN_ALPHABET][0];
87        keyList[KEYMODE_EN_NUMBER][0]   = new Keyboard(parent, R.xml.default_en_symbols_shift);
88        keyList[KEYMODE_EN_PHONE][0]    = new Keyboard(parent, R.xml.keyboard_12key_phone);
89    }
90
91    /**
92     * Get the shift key state from the editor.
93     *
94     * @param editor	The information of editor
95     * @return 		state ID of the shift key (0:off, 1:on)
96     */
97    private int getShiftKeyState(EditorInfo editor) {
98        int caps = mWnn.getCurrentInputConnection().getCursorCapsMode(editor.inputType);
99        return (caps == 0) ? 0 : 1;
100    }
101
102    /**
103     * Switch the keymode
104     *
105     * @param keyMode		Keymode
106     */
107	private void changeKeyMode(int keyMode) {
108		Keyboard keyboard = super.getModeChangeKeyboard(keyMode);
109    	if (keyboard != null) {
110    		mCurrentKeyMode = keyMode;
111    		super.changeKeyboard(keyboard);
112		}
113	}
114
115    /***********************************************************************
116     * from DefaultSoftKeyboard
117     ***********************************************************************/
118    /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#initView */
119    @Override public View initView(OpenWnn parent, int width, int height) {
120        View view = super.initView(parent, width, height);
121
122    	/* default setting */
123    	mCurrentLanguage     = LANG_EN;
124    	mCurrentKeyboardType = KEYBOARD_QWERTY;
125    	mShiftOn             = KEYBOARD_SHIFT_OFF;
126    	mCurrentKeyMode      = KEYMODE_EN_ALPHABET;
127    	mDisplayMode         = (width == 320)? PORTRAIT : LANDSCAPE;
128
129    	Keyboard kbd = mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
130    	if (kbd == null) {
131    		if(mDisplayMode == LANDSCAPE){
132    			return view;
133    		}
134    		return null;
135    	}
136    	mCurrentKeyboard = null;
137    	changeKeyboard(kbd);
138    	return view;
139    }
140
141    /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#setPreferences */
142    @Override public void setPreferences(SharedPreferences pref, EditorInfo editor) {
143        super.setPreferences(pref, editor);
144
145        /* auto caps mode */
146        mAutoCaps = pref.getBoolean("auto_caps", true);
147
148        switch (editor.inputType & EditorInfo.TYPE_MASK_CLASS) {
149        case EditorInfo.TYPE_CLASS_NUMBER:
150        case EditorInfo.TYPE_CLASS_DATETIME:
151            mCurrentLanguage     = LANG_EN;
152            mCurrentKeyboardType = KEYBOARD_QWERTY;
153            mShiftOn             = KEYBOARD_SHIFT_OFF;
154            mCurrentKeyMode      = KEYMODE_EN_NUMBER;
155
156            Keyboard kbdn =
157                mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
158
159            changeKeyboard(kbdn);
160            break;
161
162        case EditorInfo.TYPE_CLASS_PHONE:
163            mCurrentLanguage     = LANG_EN;
164            mCurrentKeyboardType = KEYBOARD_QWERTY;
165            mShiftOn             = KEYBOARD_SHIFT_OFF;
166            mCurrentKeyMode      = KEYMODE_EN_PHONE;
167
168            Keyboard kbdp =
169                mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
170
171            changeKeyboard(kbdp);
172
173            break;
174
175        default:
176            mCurrentLanguage     = LANG_EN;
177            mCurrentKeyboardType = KEYBOARD_QWERTY;
178            mShiftOn             = KEYBOARD_SHIFT_OFF;
179            mCurrentKeyMode      = KEYMODE_EN_ALPHABET;
180
181            Keyboard kbdq =
182                mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
183
184            changeKeyboard(kbdq);
185             break;
186        }
187
188        int shift = (mAutoCaps)? getShiftKeyState(mWnn.getCurrentInputEditorInfo()) : 0;
189        if (shift != mShiftOn) {
190            Keyboard kbd = getShiftChangeKeyboard(shift);
191            mShiftOn = shift;
192            changeKeyboard(kbd);
193        }
194    }
195
196    /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#onKey */
197    @Override public void onKey(int primaryCode, int[] keyCodes) {
198        switch (primaryCode) {
199        case KEYCODE_QWERTY_HAN_ALPHA:
200            this.changeKeyMode(KEYMODE_EN_ALPHABET);
201            break;
202
203        case KEYCODE_QWERTY_HAN_NUM:
204            this.changeKeyMode(KEYMODE_EN_NUMBER);
205            break;
206
207        case KEYCODE_PHONE:
208            this.changeKeyMode(KEYMODE_EN_PHONE);
209            break;
210
211        case KEYCODE_QWERTY_EMOJI:
212            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_SYMBOLS));
213            break;
214
215        case KEYCODE_QWERTY_TOGGLE_MODE:
216            switch(mCurrentKeyMode){
217            case KEYMODE_EN_ALPHABET:
218                if (TOGGLE_KEYBOARD[KEYMODE_EN_NUMBER]){
219                    mCurrentKeyMode = KEYMODE_EN_NUMBER;
220                } else if (TOGGLE_KEYBOARD[KEYMODE_EN_PHONE]) {
221                    mCurrentKeyMode = KEYMODE_EN_PHONE;
222                }
223                break;
224            case KEYMODE_EN_NUMBER:
225                if (TOGGLE_KEYBOARD[KEYMODE_EN_PHONE]) {
226                    mCurrentKeyMode = KEYMODE_EN_PHONE;
227                } else if(TOGGLE_KEYBOARD[KEYMODE_EN_ALPHABET]) {
228                    mCurrentKeyMode = KEYMODE_EN_ALPHABET;
229                }
230                break;
231            case KEYMODE_EN_PHONE:
232                if (TOGGLE_KEYBOARD[KEYMODE_EN_ALPHABET]) {
233                    mCurrentKeyMode = KEYMODE_EN_ALPHABET;
234                } else if (TOGGLE_KEYBOARD[KEYMODE_EN_NUMBER]) {
235                    mCurrentKeyMode = KEYMODE_EN_NUMBER;
236                }
237                break;
238            }
239            Keyboard kbdp =
240                mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
241            super.changeKeyboard(kbdp);
242            break;
243
244        case DefaultSoftKeyboard.KEYCODE_QWERTY_BACKSPACE:
245        case DefaultSoftKeyboard.KEYCODE_JP12_BACKSPACE:
246            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_SOFT_KEY,
247                                          new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)));
248            break;
249
250        case DefaultSoftKeyboard.KEYCODE_QWERTY_SHIFT:
251            toggleShiftLock();
252            break;
253
254        case DefaultSoftKeyboard.KEYCODE_QWERTY_ALT:
255            processAltKey();
256            break;
257
258        case KEYCODE_QWERTY_ENTER:
259        case KEYCODE_JP12_ENTER:
260            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_SOFT_KEY,
261                                          new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)));
262            break;
263
264        case KEYCODE_JP12_LEFT:
265            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_SOFT_KEY,
266                                          new KeyEvent(KeyEvent.ACTION_DOWN,
267                                                       KeyEvent.KEYCODE_DPAD_LEFT)));
268            break;
269
270        case KEYCODE_JP12_RIGHT:
271            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_SOFT_KEY,
272                                          new KeyEvent(KeyEvent.ACTION_DOWN,
273                                                       KeyEvent.KEYCODE_DPAD_RIGHT)));
274        default:
275            if (primaryCode >= 0) {
276                if (mKeyboardView.isShifted()) {
277                    primaryCode = Character.toUpperCase(primaryCode);
278                }
279                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_CHAR, (char)primaryCode));
280            }
281        }
282
283        /* update shift key's state */
284        if (!mCapsLock && primaryCode != KEYCODE_QWERTY_SHIFT) {
285            if(mCurrentKeyMode != KEYMODE_EN_NUMBER){
286                int shift = (mAutoCaps)? getShiftKeyState(mWnn.getCurrentInputEditorInfo()) : 0;
287                if (shift != mShiftOn) {
288                    Keyboard kbd = getShiftChangeKeyboard(shift);
289                    mShiftOn = shift;
290                    changeKeyboard(kbd);
291                }
292            }else{
293                mShiftOn = KEYBOARD_SHIFT_OFF;
294                Keyboard kbd = getShiftChangeKeyboard(mShiftOn);
295                changeKeyboard(kbd);
296            }
297        }
298    }
299}
300
301
302
303