blob: 33df09fc059e79e2e8084c3b72e735be9e81d365 [file] [log] [blame]
The Android Open Source Project053d5092009-03-15 21:40:26 -07001/*
Junichi Monma59aefa22012-04-24 16:13:54 +09002 * Copyright (C) 2008-2012 OMRON SOFTWARE Co., Ltd.
The Android Open Source Project053d5092009-03-15 21:40:26 -07003 *
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
Daisuke Miyakawa3feb3d22009-03-27 19:24:41 -070019import jp.co.omronsoft.openwnn.*;
The Android Open Source Project053d5092009-03-15 21:40:26 -070020import android.content.SharedPreferences;
The Android Open Source Project053d5092009-03-15 21:40:26 -070021import android.view.KeyEvent;
22import android.view.View;
23import android.view.inputmethod.EditorInfo;
Daisuke Miyakawae83971e2009-06-16 16:31:48 +090024import android.view.inputmethod.InputConnection;
The Android Open Source Project053d5092009-03-15 21:40:26 -070025
Junichi Monma59aefa22012-04-24 16:13:54 +090026import jp.co.omronsoft.openwnn.Keyboard;
27
The Android Open Source Project053d5092009-03-15 21:40:26 -070028import android.util.Log;
29
30/**
Daisuke Miyakawa3feb3d22009-03-27 19:24:41 -070031 * The default Software Keyboard class for English IME.
The Android Open Source Project053d5092009-03-15 21:40:26 -070032 *
Daisuke Miyakawa3feb3d22009-03-27 19:24:41 -070033 * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD. All Rights Reserved.
The Android Open Source Project053d5092009-03-15 21:40:26 -070034 */
35public class DefaultSoftKeyboardEN extends DefaultSoftKeyboard {
36 /** 12-key keyboard [PHONE MODE] */
37 public static final int KEYCODE_PHONE = -116;
38
39 /**
40 * Keyboards toggled by ALT key.
41 * <br>
42 * The normal keyboard(KEYMODE_EN_ALPHABET) and the number/symbol
43 * keyboard(KEYMODE_EN_NUMBER) is active. The phone number
44 * keyboard(KEYMODE_EN_PHONE) is disabled.
45 */
46 private static final boolean[] TOGGLE_KEYBOARD = {true, true, false};
47
48 /** Auto caps mode */
49 private boolean mAutoCaps = false;
50
51 /**
52 * Default constructor
53 */
54 public DefaultSoftKeyboardEN() { }
55
56 /**
57 * Dismiss the pop-up keyboard.
58 * <br>
59 * Nothing will be done if no pop-up keyboard is displaying.
60 */
61 public void dismissPopupKeyboard() {
Daisuke Miyakawa7b3b4142009-03-24 19:47:47 -070062 try {
63 if (mKeyboardView != null) {
64 mKeyboardView.handleBack();
65 }
66 } catch (Exception ex) {
67 /* ignore */
68 }
The Android Open Source Project053d5092009-03-15 21:40:26 -070069 }
70
71 /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#createKeyboards */
72 @Override protected void createKeyboards(OpenWnn parent) {
73 mKeyboard = new Keyboard[3][2][4][2][7][2];
74
75 Keyboard[][] keyList;
76 /***********************************************************************
77 * English
78 ***********************************************************************/
79 /* qwerty shift_off */
80 keyList = mKeyboard[LANG_EN][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF];
81 keyList[KEYMODE_EN_ALPHABET][0] = new Keyboard(parent, R.xml.default_en_qwerty);
82 keyList[KEYMODE_EN_NUMBER][0] = new Keyboard(parent, R.xml.default_en_symbols);
83 keyList[KEYMODE_EN_PHONE][0] = new Keyboard(parent, R.xml.keyboard_12key_phone);
84
85 /* qwerty shift_on */
86 keyList = mKeyboard[LANG_EN][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_ON];
87 keyList[KEYMODE_EN_ALPHABET][0] =
88 mKeyboard[LANG_EN][PORTRAIT][KEYBOARD_QWERTY][KEYBOARD_SHIFT_OFF][KEYMODE_EN_ALPHABET][0];
89 keyList[KEYMODE_EN_NUMBER][0] = new Keyboard(parent, R.xml.default_en_symbols_shift);
90 keyList[KEYMODE_EN_PHONE][0] = new Keyboard(parent, R.xml.keyboard_12key_phone);
91 }
92
93 /**
94 * Get the shift key state from the editor.
95 *
Daisuke Miyakawa3feb3d22009-03-27 19:24:41 -070096 * @param editor The information of editor
97 * @return state ID of the shift key (0:off, 1:on)
The Android Open Source Project053d5092009-03-15 21:40:26 -070098 */
99 private int getShiftKeyState(EditorInfo editor) {
Daisuke Miyakawae83971e2009-06-16 16:31:48 +0900100 InputConnection connection = mWnn.getCurrentInputConnection();
101 if (connection != null) {
102 int caps = connection.getCursorCapsMode(editor.inputType);
103 return (caps == 0) ? 0 : 1;
104 } else {
105 return 0;
106 }
The Android Open Source Project053d5092009-03-15 21:40:26 -0700107 }
108
109 /**
110 * Switch the keymode
111 *
Daisuke Miyakawa3feb3d22009-03-27 19:24:41 -0700112 * @param keyMode Keymode
The Android Open Source Project053d5092009-03-15 21:40:26 -0700113 */
114 private void changeKeyMode(int keyMode) {
115 Keyboard keyboard = super.getModeChangeKeyboard(keyMode);
116 if (keyboard != null) {
117 mCurrentKeyMode = keyMode;
118 super.changeKeyboard(keyboard);
119 }
120 }
121
122 /***********************************************************************
123 * from DefaultSoftKeyboard
124 ***********************************************************************/
125 /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#initView */
126 @Override public View initView(OpenWnn parent, int width, int height) {
Daisuke Miyakawa7b3b4142009-03-24 19:47:47 -0700127 View view = super.initView(parent, width, height);
128
129 /* default setting */
130 mCurrentLanguage = LANG_EN;
131 mCurrentKeyboardType = KEYBOARD_QWERTY;
132 mShiftOn = KEYBOARD_SHIFT_OFF;
133 mCurrentKeyMode = KEYMODE_EN_ALPHABET;
Daisuke Miyakawa7b3b4142009-03-24 19:47:47 -0700134
135 Keyboard kbd = mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
136 if (kbd == null) {
137 if(mDisplayMode == LANDSCAPE){
138 return view;
139 }
140 return null;
141 }
142 mCurrentKeyboard = null;
143 changeKeyboard(kbd);
144 return view;
The Android Open Source Project053d5092009-03-15 21:40:26 -0700145 }
146
147 /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#setPreferences */
148 @Override public void setPreferences(SharedPreferences pref, EditorInfo editor) {
149 super.setPreferences(pref, editor);
150
151 /* auto caps mode */
Daisuke Miyakawa7b3b4142009-03-24 19:47:47 -0700152 mAutoCaps = pref.getBoolean("auto_caps", true);
The Android Open Source Project053d5092009-03-15 21:40:26 -0700153
154 switch (editor.inputType & EditorInfo.TYPE_MASK_CLASS) {
155 case EditorInfo.TYPE_CLASS_NUMBER:
156 case EditorInfo.TYPE_CLASS_DATETIME:
157 mCurrentLanguage = LANG_EN;
158 mCurrentKeyboardType = KEYBOARD_QWERTY;
159 mShiftOn = KEYBOARD_SHIFT_OFF;
160 mCurrentKeyMode = KEYMODE_EN_NUMBER;
161
162 Keyboard kbdn =
163 mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
164
165 changeKeyboard(kbdn);
166 break;
167
168 case EditorInfo.TYPE_CLASS_PHONE:
169 mCurrentLanguage = LANG_EN;
170 mCurrentKeyboardType = KEYBOARD_QWERTY;
171 mShiftOn = KEYBOARD_SHIFT_OFF;
172 mCurrentKeyMode = KEYMODE_EN_PHONE;
173
174 Keyboard kbdp =
175 mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
176
177 changeKeyboard(kbdp);
178
179 break;
180
181 default:
182 mCurrentLanguage = LANG_EN;
183 mCurrentKeyboardType = KEYBOARD_QWERTY;
184 mShiftOn = KEYBOARD_SHIFT_OFF;
185 mCurrentKeyMode = KEYMODE_EN_ALPHABET;
186
187 Keyboard kbdq =
188 mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
189
190 changeKeyboard(kbdq);
191 break;
192 }
193
194 int shift = (mAutoCaps)? getShiftKeyState(mWnn.getCurrentInputEditorInfo()) : 0;
195 if (shift != mShiftOn) {
196 Keyboard kbd = getShiftChangeKeyboard(shift);
197 mShiftOn = shift;
198 changeKeyboard(kbd);
199 }
200 }
201
202 /** @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#onKey */
203 @Override public void onKey(int primaryCode, int[] keyCodes) {
204 switch (primaryCode) {
205 case KEYCODE_QWERTY_HAN_ALPHA:
206 this.changeKeyMode(KEYMODE_EN_ALPHABET);
207 break;
208
209 case KEYCODE_QWERTY_HAN_NUM:
210 this.changeKeyMode(KEYMODE_EN_NUMBER);
211 break;
212
213 case KEYCODE_PHONE:
214 this.changeKeyMode(KEYMODE_EN_PHONE);
215 break;
216
217 case KEYCODE_QWERTY_EMOJI:
218 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_SYMBOLS));
219 break;
220
221 case KEYCODE_QWERTY_TOGGLE_MODE:
222 switch(mCurrentKeyMode){
223 case KEYMODE_EN_ALPHABET:
224 if (TOGGLE_KEYBOARD[KEYMODE_EN_NUMBER]){
225 mCurrentKeyMode = KEYMODE_EN_NUMBER;
226 } else if (TOGGLE_KEYBOARD[KEYMODE_EN_PHONE]) {
227 mCurrentKeyMode = KEYMODE_EN_PHONE;
228 }
229 break;
230 case KEYMODE_EN_NUMBER:
231 if (TOGGLE_KEYBOARD[KEYMODE_EN_PHONE]) {
232 mCurrentKeyMode = KEYMODE_EN_PHONE;
233 } else if(TOGGLE_KEYBOARD[KEYMODE_EN_ALPHABET]) {
234 mCurrentKeyMode = KEYMODE_EN_ALPHABET;
235 }
236 break;
237 case KEYMODE_EN_PHONE:
238 if (TOGGLE_KEYBOARD[KEYMODE_EN_ALPHABET]) {
239 mCurrentKeyMode = KEYMODE_EN_ALPHABET;
240 } else if (TOGGLE_KEYBOARD[KEYMODE_EN_NUMBER]) {
241 mCurrentKeyMode = KEYMODE_EN_NUMBER;
242 }
243 break;
244 }
245 Keyboard kbdp =
246 mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode][0];
247 super.changeKeyboard(kbdp);
248 break;
249
250 case DefaultSoftKeyboard.KEYCODE_QWERTY_BACKSPACE:
251 case DefaultSoftKeyboard.KEYCODE_JP12_BACKSPACE:
252 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_SOFT_KEY,
253 new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)));
254 break;
255
256 case DefaultSoftKeyboard.KEYCODE_QWERTY_SHIFT:
257 toggleShiftLock();
258 break;
259
260 case DefaultSoftKeyboard.KEYCODE_QWERTY_ALT:
261 processAltKey();
262 break;
263
264 case KEYCODE_QWERTY_ENTER:
265 case KEYCODE_JP12_ENTER:
266 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_SOFT_KEY,
267 new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)));
268 break;
269
270 case KEYCODE_JP12_LEFT:
271 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_SOFT_KEY,
272 new KeyEvent(KeyEvent.ACTION_DOWN,
273 KeyEvent.KEYCODE_DPAD_LEFT)));
274 break;
275
276 case KEYCODE_JP12_RIGHT:
277 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_SOFT_KEY,
278 new KeyEvent(KeyEvent.ACTION_DOWN,
279 KeyEvent.KEYCODE_DPAD_RIGHT)));
280 default:
281 if (primaryCode >= 0) {
282 if (mKeyboardView.isShifted()) {
283 primaryCode = Character.toUpperCase(primaryCode);
284 }
285 mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.INPUT_CHAR, (char)primaryCode));
286 }
287 }
288
289 /* update shift key's state */
290 if (!mCapsLock && primaryCode != KEYCODE_QWERTY_SHIFT) {
Daisuke Miyakawa3feb3d22009-03-27 19:24:41 -0700291 if(mCurrentKeyMode != KEYMODE_EN_NUMBER){
292 int shift = (mAutoCaps)? getShiftKeyState(mWnn.getCurrentInputEditorInfo()) : 0;
293 if (shift != mShiftOn) {
294 Keyboard kbd = getShiftChangeKeyboard(shift);
295 mShiftOn = shift;
296 changeKeyboard(kbd);
297 }
298 }else{
299 mShiftOn = KEYBOARD_SHIFT_OFF;
300 Keyboard kbd = getShiftChangeKeyboard(mShiftOn);
The Android Open Source Project053d5092009-03-15 21:40:26 -0700301 changeKeyboard(kbd);
302 }
303 }
304 }
305}
306
Daisuke Miyakawa7b3b4142009-03-24 19:47:47 -0700307
Daisuke Miyakawa3feb3d22009-03-27 19:24:41 -0700308