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