• 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;
18 
19 import android.view.View;
20 import android.view.ViewGroup;
21 import android.view.inputmethod.EditorInfo;
22 import android.widget.TextView;
23 import android.inputmethodservice.Keyboard;
24 import android.inputmethodservice.KeyboardView;
25 import android.content.SharedPreferences;
26 import android.preference.PreferenceManager;
27 import android.content.res.*;
28 import android.os.Vibrator;
29 import android.media.MediaPlayer;
30 import android.content.Context;
31 
32 import android.util.Log;
33 
34 /**
35  * The default software keyboard class.
36  *
37  * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
38  */
39 public class DefaultSoftKeyboard implements InputViewManager, KeyboardView.OnKeyboardActionListener {
40     /*
41      *----------------------------------------------------------------------
42      * key codes for a software keyboard
43      *----------------------------------------------------------------------
44      */
45     /** Change the keyboard language */
46     public static final int KEYCODE_CHANGE_LANG = -500;
47 
48     /* for Japanese 12-key keyboard */
49     /** Japanese 12-key keyboard [1] */
50     public static final int KEYCODE_JP12_1 = -201;
51     /** Japanese 12-key keyboard [2] */
52     public static final int KEYCODE_JP12_2 = -202;
53     /** Japanese 12-key keyboard [3] */
54     public static final int KEYCODE_JP12_3 = -203;
55     /** Japanese 12-key keyboard [4] */
56     public static final int KEYCODE_JP12_4 = -204;
57     /** Japanese 12-key keyboard [5] */
58     public static final int KEYCODE_JP12_5 = -205;
59     /** Japanese 12-key keyboard [6] */
60     public static final int KEYCODE_JP12_6 = -206;
61     /** Japanese 12-key keyboard [7] */
62     public static final int KEYCODE_JP12_7 = -207;
63     /** Japanese 12-key keyboard [8] */
64     public static final int KEYCODE_JP12_8 = -208;
65     /** Japanese 12-key keyboard [9] */
66     public static final int KEYCODE_JP12_9 = -209;
67     /** Japanese 12-key keyboard [0] */
68     public static final int KEYCODE_JP12_0 = -210;
69     /** Japanese 12-key keyboard [#] */
70     public static final int KEYCODE_JP12_SHARP = -211;
71     /** Japanese 12-key keyboard [*] */
72     public static final int KEYCODE_JP12_ASTER = -213;
73     /** Japanese 12-key keyboard [DEL] */
74     public static final int KEYCODE_JP12_BACKSPACE = -214;
75     /** Japanese 12-key keyboard [SPACE] */
76     public static final int KEYCODE_JP12_SPACE = -215;
77     /** Japanese 12-key keyboard [ENTER] */
78     public static final int KEYCODE_JP12_ENTER = -216;
79     /** Japanese 12-key keyboard [RIGHT ARROW] */
80     public static final int KEYCODE_JP12_RIGHT = -217;
81     /** Japanese 12-key keyboard [LEFT ARROW] */
82     public static final int KEYCODE_JP12_LEFT = -218;
83     /** Japanese 12-key keyboard [REVERSE TOGGLE] */
84     public static final int KEYCODE_JP12_REVERSE = -219;
85     /** Japanese 12-key keyboard [CLOSE] */
86     public static final int KEYCODE_JP12_CLOSE   = -220;
87     /** Japanese 12-key keyboard [KEYBOARD TYPE CHANGE] */
88     public static final int KEYCODE_JP12_KBD   = -221;
89     /** Japanese 12-key keyboard [EMOJI] */
90     public static final int KEYCODE_JP12_EMOJI      = -222;
91     /** Japanese 12-key keyboard [FULL-WIDTH HIRAGANA MODE] */
92     public static final int KEYCODE_JP12_ZEN_HIRA   = -223;
93     /** Japanese 12-key keyboard [FULL-WIDTH NUMBER MODE] */
94     public static final int KEYCODE_JP12_ZEN_NUM    = -224;
95     /** Japanese 12-key keyboard [FULL-WIDTH ALPHABET MODE] */
96     public static final int KEYCODE_JP12_ZEN_ALPHA  = -225;
97     /** Japanese 12-key keyboard [FULL-WIDTH KATAKANA MODE] */
98     public static final int KEYCODE_JP12_ZEN_KATA   = -226;
99     /** Japanese 12-key keyboard [HALF-WIDTH KATAKANA MODE] */
100     public static final int KEYCODE_JP12_HAN_KATA   = -227;
101     /** Japanese 12-key keyboard [HALF-WIDTH NUMBER MODE] */
102     public static final int KEYCODE_JP12_HAN_NUM    = -228;
103     /** Japanese 12-key keyboard [HALF-WIDTH ALPHABET MODE] */
104     public static final int KEYCODE_JP12_HAN_ALPHA  = -229;
105     /** Japanese 12-key keyboard [MODE TOOGLE CHANGE] */
106     public static final int KEYCODE_JP12_TOGGLE_MODE = -230;
107 
108     /* for Qwerty keyboard */
109     /** Qwerty keyboard [DEL] */
110     public static final int KEYCODE_QWERTY_BACKSPACE = -100;
111     /** Qwerty keyboard [ENTER] */
112     public static final int KEYCODE_QWERTY_ENTER = -101;
113     /** Qwerty keyboard [SHIFT] */
114     public static final int KEYCODE_QWERTY_SHIFT = Keyboard.KEYCODE_SHIFT;
115     /** Qwerty keyboard [ALT] */
116     public static final int KEYCODE_QWERTY_ALT   = -103;
117     /** Qwerty keyboard [KEYBOARD TYPE CHANGE] */
118     public static final int KEYCODE_QWERTY_KBD   = -104;
119     /** Qwerty keyboard [CLOSE] */
120     public static final int KEYCODE_QWERTY_CLOSE = -105;
121     /** Japanese Qwerty keyboard [EMOJI] */
122     public static final int KEYCODE_QWERTY_EMOJI = -106;
123     /** Japanese Qwerty keyboard [FULL-WIDTH HIRAGANA MODE] */
124     public static final int KEYCODE_QWERTY_ZEN_HIRA   = -107;
125     /** Japanese Qwerty keyboard [FULL-WIDTH NUMBER MODE] */
126     public static final int KEYCODE_QWERTY_ZEN_NUM    = -108;
127     /** Japanese Qwerty keyboard [FULL-WIDTH ALPHABET MODE] */
128     public static final int KEYCODE_QWERTY_ZEN_ALPHA  = -109;
129     /** Japanese Qwerty keyboard [FULL-WIDTH KATAKANA MODE] */
130     public static final int KEYCODE_QWERTY_ZEN_KATA   = -110;
131     /** Japanese Qwerty keyboard [HALF-WIDTH KATAKANA MODE] */
132     public static final int KEYCODE_QWERTY_HAN_KATA   = -111;
133     /** Qwerty keyboard [NUMBER MODE] */
134     public static final int KEYCODE_QWERTY_HAN_NUM    = -112;
135     /** Qwerty keyboard [ALPHABET MODE] */
136     public static final int KEYCODE_QWERTY_HAN_ALPHA  = -113;
137     /** Qwerty keyboard [MODE TOOGLE CHANGE] */
138     public static final int KEYCODE_QWERTY_TOGGLE_MODE = -114;
139     /** Qwerty keyboard [PINYIN MODE] */
140     public static final int KEYCODE_QWERTY_PINYIN  = -115;
141 
142     /** OpenWnn instance which hold this software keyboard*/
143     protected OpenWnn      mWnn;
144 
145     /** Current keyboard view */
146     protected KeyboardView mKeyboardView;
147 
148     /** View objects (main side) */
149     protected ViewGroup mMainView;
150     /** View objects (sub side) */
151     protected ViewGroup mSubView;
152 
153     /** Current keyboard definition */
154     protected Keyboard mCurrentKeyboard;
155 
156     /** Caps lock state */
157     protected boolean mCapsLock;
158 
159     /** Input restraint */
160     protected boolean mDisableKeyInput = true;
161     /**
162      * Keyboard surfaces
163      * <br>
164      * Keyboard[language][portrait/landscape][keyboard type][shift off/on][key-mode]
165      */
166     protected Keyboard[][][][][][] mKeyboard;
167 
168     /* languages */
169     /** Current language */
170     protected int mCurrentLanguage;
171     /** Language (English) */
172     public static final int LANG_EN  = 0;
173     /** Language (Japanese) */
174     public static final int LANG_JA  = 1;
175     /** Language (Chinese) */
176     public static final int LANG_CN  = 2;
177 
178     /* portrait/landscape */
179     /** State of the display */
180     protected int mDisplayMode = 0;
181     /** Display mode (Portrait) */
182     public static final int PORTRAIT  = 0;
183     /** Display mode (Landscape) */
184     public static final int LANDSCAPE = 1;
185 
186     /* keyboard type */
187     /** Current keyboard type */
188     protected int mCurrentKeyboardType;
189     /** Keyboard (QWERTY keyboard) */
190     public static final int KEYBOARD_QWERTY  = 0;
191     /** Keyboard (12-keys keyboard) */
192     public static final int KEYBOARD_12KEY   = 1;
193     /** State of the shift key */
194     protected int mShiftOn = 0;
195     /** Shift key off */
196     public static final int KEYBOARD_SHIFT_OFF = 0;
197     /** Shift key on */
198     public static final int KEYBOARD_SHIFT_ON  = 1;
199 
200     /* key-modes */
201     /** Current key-mode */
202     protected int mCurrentKeyMode;
203 
204     /* key-modes for English */
205     /** English key-mode (alphabet) */
206     public static final int KEYMODE_EN_ALPHABET = 0;
207     /** English key-mode (number) */
208     public static final int KEYMODE_EN_NUMBER   = 1;
209     /** English key-mode (phone number) */
210     public static final int KEYMODE_EN_PHONE    = 2;
211 
212     /* key-modes for Japanese */
213     /** Japanese key-mode (Full-width Hiragana) */
214     public static final int KEYMODE_JA_FULL_HIRAGANA = 0;
215     /** Japanese key-mode (Full-width alphabet) */
216     public static final int KEYMODE_JA_FULL_ALPHABET = 1;
217     /** Japanese key-mode (Full-width number) */
218     public static final int KEYMODE_JA_FULL_NUMBER   = 2;
219     /** Japanese key-mode (Full-width Katakana) */
220     public static final int KEYMODE_JA_FULL_KATAKANA = 3;
221     /** Japanese key-mode (Half-width alphabet) */
222     public static final int KEYMODE_JA_HALF_ALPHABET = 4;
223     /** Japanese key-mode (Half-width number) */
224     public static final int KEYMODE_JA_HALF_NUMBER   = 5;
225     /** Japanese key-mode (Half-width Katakana) */
226     public static final int KEYMODE_JA_HALF_KATAKANA = 6;
227     /** Japanese key-mode (Half-width phone number) */
228     public static final int KEYMODE_JA_HALF_PHONE    = 7;
229 
230     /* key-modes for Chinese */
231     /** Chinese key-mode (pinyin) */
232     public static final int KEYMODE_CN_PINYIN   = 0;
233     /** Chinese key-mode (Full-width number) */
234     public static final int KEYMODE_CN_FULL_NUMBER   = 1;
235     /** Chinese key-mode (alphabet) */
236     public static final int KEYMODE_CN_ALPHABET = 2;
237     /** Chinese key-mode (phone) */
238     public static final int KEYMODE_CN_PHONE    = 3;
239     /** Chinese key-mode (Half-width number) */
240     public static final int KEYMODE_CN_HALF_NUMBER   = 4;
241 
242     /* key-modes for HARD */
243     /** HARD key-mode (SHIFT_OFF_ALT_OFF) */
244     public static final int HARD_KEYMODE_SHIFT_OFF_ALT_OFF     = 2;
245     /** HARD key-mode (SHIFT_ON_ALT_OFF) */
246     public static final int HARD_KEYMODE_SHIFT_ON_ALT_OFF      = 3;
247     /** HARD key-mode (SHIFT_OFF_ALT_ON) */
248     public static final int HARD_KEYMODE_SHIFT_OFF_ALT_ON      = 4;
249     /** HARD key-mode (SHIFT_ON_ALT_ON) */
250     public static final int HARD_KEYMODE_SHIFT_ON_ALT_ON       = 5;
251     /** HARD key-mode (SHIFT_LOCK_ALT_OFF) */
252     public static final int HARD_KEYMODE_SHIFT_LOCK_ALT_OFF    = 6;
253     /** HARD key-mode (SHIFT_LOCK_ALT_ON) */
254     public static final int HARD_KEYMODE_SHIFT_LOCK_ALT_ON     = 7;
255     /** HARD key-mode (SHIFT_LOCK_ALT_LOCK) */
256     public static final int HARD_KEYMODE_SHIFT_LOCK_ALT_LOCK   = 8;
257     /** HARD key-mode (SHIFT_OFF_ALT_LOCK) */
258     public static final int HARD_KEYMODE_SHIFT_OFF_ALT_LOCK    = 9;
259     /** HARD key-mode (SHIFT_ON_ALT_LOCK) */
260     public static final int HARD_KEYMODE_SHIFT_ON_ALT_LOCK     = 10;
261 
262     /** Whether the H/W keyboard is hidden. */
263     protected boolean mHardKeyboardHidden = true;
264 
265     /**
266      * Status of the composing text
267      * <br>
268      * {@code true} if there is no composing text.
269      */
270     protected boolean mNoInput = true;
271 
272     /** Vibratior for key click vibration */
273     protected Vibrator mVibrator = null;
274 
275     /** MediaPlayer for key click sound */
276     protected MediaPlayer mSound = null;
277 
278     /** Key toggle cycle table currently using */
279     protected String[] mCurrentCycleTable;
280 
281     /**
282      * Constructor
283      */
DefaultSoftKeyboard()284     public DefaultSoftKeyboard() { }
285 
286     /**
287      * Create keyboard views
288      *
289      * @param parent   OpenWnn using the keyboards.
290      */
createKeyboards(OpenWnn parent)291     protected void createKeyboards(OpenWnn parent) {
292         /*
293          *  Keyboard[# of Languages][portrait/landscape][# of keyboard type]
294          *          [shift off/on][max # of key-modes][non-input/input]
295          */
296         mKeyboard = new Keyboard[3][2][4][2][7][2];
297     }
298 
299     /**
300      * Get the keyboard changed the specified shift state.
301      *
302      * @param shift     Shift state
303      * @return          Keyboard view
304      */
getShiftChangeKeyboard(int shift)305     protected Keyboard getShiftChangeKeyboard(int shift) {
306         try {
307             Keyboard[] kbd = mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][shift][mCurrentKeyMode];
308 
309             if (!mNoInput && kbd[1] != null) {
310                 return kbd[1];
311             }
312             return kbd[0];
313         } catch (Exception ex) {
314             return null;
315         }
316     }
317 
318     /**
319      * Get the keyboard changed the specified input mode.
320      *
321      * @param mode      Input mode
322      * @return          Keyboard view
323      */
getModeChangeKeyboard(int mode)324     protected Keyboard getModeChangeKeyboard(int mode) {
325         try {
326             Keyboard[] kbd = mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mode];
327 
328             if (!mNoInput && kbd[1] != null) {
329                 return kbd[1];
330             }
331             return kbd[0];
332         } catch (Exception ex) {
333             return null;
334         }
335     }
336 
337     /**
338      * Get the keyboard changed the specified keyboard type
339      *
340      * @param type      Keyboard type
341      * @return          Keyboard view
342      */
getTypeChangeKeyboard(int type)343     protected Keyboard getTypeChangeKeyboard(int type) {
344         try {
345             Keyboard[] kbd = mKeyboard[mCurrentLanguage][mDisplayMode][type][mShiftOn][mCurrentKeyMode];
346 
347             if (!mNoInput && kbd[1] != null) {
348                 return kbd[1];
349             }
350             return kbd[0];
351         } catch (Exception ex) {
352             return null;
353         }
354     }
355 
356     /**
357      * Get the keyboard when some characters are input or no character is input.
358      *
359      * @param inputed   {@code true} if some characters are inputed; {@code false} if no character is inputed.
360      * @return          Keyboard view
361      */
getKeyboardInputed(boolean inputed)362     protected Keyboard getKeyboardInputed(boolean inputed) {
363         try {
364             Keyboard[] kbd = mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn][mCurrentKeyMode];
365 
366             if (inputed && kbd[1] != null) {
367                 return kbd[1];
368             }
369             return kbd[0];
370         } catch (Exception ex) {
371             return null;
372         }
373     }
374 
375     /**
376      * Change the circulative key-mode.
377      */
toggleKeyMode()378     protected void toggleKeyMode() {
379         /* unlock shift */
380         mShiftOn = KEYBOARD_SHIFT_OFF;
381 
382         /* search next defined key-mode */
383         Keyboard[][] keyboardList = mKeyboard[mCurrentLanguage][mDisplayMode][mCurrentKeyboardType][mShiftOn];
384         do {
385             if (++mCurrentKeyMode >= keyboardList.length) {
386                 mCurrentKeyMode = 0;
387             }
388         } while (keyboardList[mCurrentKeyMode][0] == null);
389 
390         Keyboard kbd;
391         if (!mNoInput && keyboardList[mCurrentKeyMode][1] != null) {
392             kbd = keyboardList[mCurrentKeyMode][1];
393         } else {
394             kbd = keyboardList[mCurrentKeyMode][0];
395         }
396         changeKeyboard(kbd);
397 
398         mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
399                                       OpenWnnEvent.Mode.DEFAULT));
400     }
401 
402     /**
403      * Toggle change the shift lock state.
404      */
toggleShiftLock()405     protected void toggleShiftLock() {
406         if (mShiftOn == 0) {
407             /* turn shift on */
408             Keyboard newKeyboard = getShiftChangeKeyboard(KEYBOARD_SHIFT_ON);
409             if (newKeyboard != null) {
410                 mShiftOn = 1;
411                 changeKeyboard(newKeyboard);
412             }
413             mCapsLock = true;
414         } else {
415             /* turn shift off */
416             Keyboard newKeyboard = getShiftChangeKeyboard(KEYBOARD_SHIFT_OFF);
417             if (newKeyboard != null) {
418                 mShiftOn = 0;
419                 changeKeyboard(newKeyboard);
420             }
421             mCapsLock = false;
422         }
423     }
424 
425     /**
426      * Handling Alt key event.
427      */
processAltKey()428     protected void processAltKey() {
429         /* invalid if it is not qwerty mode */
430         if (mCurrentKeyboardType != KEYBOARD_QWERTY) {
431             return;
432         }
433 
434         int mode = -1;
435         int keymode = mCurrentKeyMode;
436         switch (mCurrentLanguage) {
437         case LANG_EN:
438             if (keymode == KEYMODE_EN_ALPHABET) {
439                 mode = KEYMODE_EN_NUMBER;
440             } else if (keymode == KEYMODE_EN_NUMBER) {
441                 mode = KEYMODE_EN_ALPHABET;
442             }
443             break;
444 
445         case LANG_JA:
446             if (keymode == KEYMODE_JA_HALF_ALPHABET) {
447                 mode = KEYMODE_JA_HALF_NUMBER;
448             } else if (keymode == KEYMODE_JA_HALF_NUMBER) {
449                 mode = KEYMODE_JA_HALF_ALPHABET;
450             } else if (keymode == KEYMODE_JA_FULL_ALPHABET) {
451                 mode = KEYMODE_JA_FULL_NUMBER;
452             } else if (keymode == KEYMODE_JA_FULL_NUMBER) {
453                 mode = KEYMODE_JA_FULL_ALPHABET;
454             }
455             break;
456 
457         default:
458             /* invalid */
459         }
460 
461         if (mode >= 0) {
462             Keyboard kbd = getModeChangeKeyboard(mode);
463             if (kbd != null) {
464                 mCurrentKeyMode = mode;
465                 changeKeyboard(kbd);
466             }
467         }
468     }
469 
470     /**
471      * Change the keyboard type.
472      *
473      * @param type  Type of the keyboard
474      * @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#KEYBOARD_QWERTY
475      * @see jp.co.omronsoft.openwnn.DefaultSoftKeyboard#KEYBOARD_12KEY
476      */
changeKeyboardType(int type)477     public void changeKeyboardType(int type) {
478         /* ignore invalid parameter */
479         if (type != KEYBOARD_QWERTY && type != KEYBOARD_12KEY) {
480             return;
481         }
482 
483         /* change keyboard view */
484         Keyboard kbd = getTypeChangeKeyboard(type);
485         if (kbd != null) {
486             mCurrentKeyboardType = type;
487             changeKeyboard(kbd);
488         }
489 
490         /* notice that the keyboard is changed */
491         mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
492                                       OpenWnnEvent.Mode.DEFAULT));
493     }
494 
495     /**
496      * Change the keyboard.
497      *
498      * @param keyboard  The new keyboard
499      * @return          {@code true} if the keyboard is changed; {@code false} if not changed.
500      */
changeKeyboard(Keyboard keyboard)501     protected boolean changeKeyboard(Keyboard keyboard) {
502 
503         if (keyboard == null) {
504             return false;
505         }
506         if (mCurrentKeyboard != keyboard) {
507             mKeyboardView.setKeyboard(keyboard);
508             mKeyboardView.setShifted((mShiftOn == 0) ? false : true);
509             mCurrentKeyboard = keyboard;
510             return true;
511         } else {
512             mKeyboardView.setShifted((mShiftOn == 0) ? false : true);
513             return false;
514         }
515     }
516     /** @see jp.co.omronsoft.openwnn.InputViewManager#initView */
initView(OpenWnn parent, int width, int height)517     public View initView(OpenWnn parent, int width, int height) {
518         mWnn = parent;
519         mDisplayMode =
520             (parent.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
521             ? LANDSCAPE : PORTRAIT;
522 
523         /*
524          * create keyboards & the view.
525          * To re-display the input view when the display mode is changed portrait <-> landscape,
526          * create keyboards every time.
527          */
528         createKeyboards(parent);
529 
530         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(parent);
531         String skin = pref.getString("keyboard_skin",
532                                      mWnn.getResources().getString(R.string.keyboard_skin_id_default));
533         int id = parent.getResources().getIdentifier(skin, "layout", "jp.co.omronsoft.openwnn");
534 
535         mKeyboardView = (KeyboardView) mWnn.getLayoutInflater().inflate(id, null);
536         mKeyboardView.setOnKeyboardActionListener(this);
537         mCurrentKeyboard = null;
538 
539         mMainView = (ViewGroup) parent.getLayoutInflater().inflate(R.layout.keyboard_default_main, null);
540         mSubView = (ViewGroup) parent.getLayoutInflater().inflate(R.layout.keyboard_default_sub, null);
541         if (mDisplayMode == LANDSCAPE || !mHardKeyboardHidden) {
542             mMainView.addView(mSubView);
543         } else if (mKeyboardView != null) {
544             mMainView.addView(mKeyboardView);
545         }
546 
547         return mMainView;
548     }
549 
550     /**
551      * Update the SHFIT/ALT keys indicator.
552      *
553      * @param mode  The state of SHIFT/ALT keys.
554      */
updateIndicator(int mode)555     public void updateIndicator(int mode) {
556         Resources res = mWnn.getResources();
557         TextView text1 = (TextView)mSubView.findViewById(R.id.shift);
558         TextView text2 = (TextView)mSubView.findViewById(R.id.alt);
559 
560         switch (mode) {
561         case HARD_KEYMODE_SHIFT_OFF_ALT_OFF:
562             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_off));
563             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_off));
564             text1.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
565             text2.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
566             break;
567         case HARD_KEYMODE_SHIFT_ON_ALT_OFF:
568             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_on));
569             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_off));
570             text1.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
571             text2.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
572             break;
573         case HARD_KEYMODE_SHIFT_LOCK_ALT_OFF:
574             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_lock));
575             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_off));
576             text1.setBackgroundColor(res.getColor(R.color.indicator_background_lock_caps));
577             text2.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
578             break;
579         case HARD_KEYMODE_SHIFT_OFF_ALT_ON:
580             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_off));
581             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_on));
582             text1.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
583             text2.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
584             break;
585         case HARD_KEYMODE_SHIFT_OFF_ALT_LOCK:
586             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_off));
587             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_lock));
588             text1.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
589             text2.setBackgroundColor(res.getColor(R.color.indicator_background_lock_alt));
590             break;
591         case HARD_KEYMODE_SHIFT_ON_ALT_ON:
592             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_on));
593             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_on));
594             text1.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
595             text2.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
596             break;
597         case HARD_KEYMODE_SHIFT_ON_ALT_LOCK:
598             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_on));
599             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_lock));
600             text1.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
601             text2.setBackgroundColor(res.getColor(R.color.indicator_background_lock_alt));
602             break;
603         case HARD_KEYMODE_SHIFT_LOCK_ALT_ON:
604             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_lock));
605             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_on));
606             text1.setBackgroundColor(res.getColor(R.color.indicator_background_lock_caps));
607             text2.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
608             break;
609         case HARD_KEYMODE_SHIFT_LOCK_ALT_LOCK:
610             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_lock));
611             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_lock));
612             text1.setBackgroundColor(res.getColor(R.color.indicator_background_lock_caps));
613             text2.setBackgroundColor(res.getColor(R.color.indicator_background_lock_alt));
614             break;
615         default:
616             text1.setTextColor(res.getColor(R.color.indicator_textcolor_caps_off));
617             text2.setTextColor(res.getColor(R.color.indicator_textcolor_alt_off));
618             text1.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
619             text2.setBackgroundColor(res.getColor(R.color.indicator_textbackground_default));
620             break;
621         }
622         return;
623     }
624 
625     /** @see jp.co.omronsoft.openwnn.InputViewManager#getCurrentView */
getCurrentView()626     public View getCurrentView() {
627         if (mCurrentKeyboard == null) {
628             return null;
629         }
630         return mMainView;
631     }
632 
633     /** @see jp.co.omronsoft.openwnn.InputViewManager#onUpdateState */
onUpdateState(OpenWnn parent)634     public void onUpdateState(OpenWnn parent) {
635         try {
636             if (parent.mComposingText.size(1) == 0) {
637                 if (!mNoInput) {
638                     /* when the mode changed to "no input" */
639                     mNoInput = true;
640                     Keyboard newKeyboard = getKeyboardInputed(false);
641                     if (mCurrentKeyboard != newKeyboard) {
642                         changeKeyboard(newKeyboard);
643                     }
644                 }
645             } else {
646                 if (mNoInput) {
647                     /* when the mode changed to "input some characters" */
648                     mNoInput = false;
649                     Keyboard newKeyboard = getKeyboardInputed(true);
650                     if (mCurrentKeyboard != newKeyboard) {
651                         changeKeyboard(newKeyboard);
652                     }
653                 }
654             }
655         } catch (Exception ex) {
656         }
657     }
658 
659     /** @see jp.co.omronsoft.openwnn.InputViewManager#setPreferences */
setPreferences(SharedPreferences pref, EditorInfo editor)660     public void setPreferences(SharedPreferences pref, EditorInfo editor) {
661 
662         /* vibrator */
663         try {
664             if (pref.getBoolean("key_vibration", false)) {
665                 mVibrator = (Vibrator)mWnn.getSystemService(Context.VIBRATOR_SERVICE);
666             } else {
667                 mVibrator = null;
668             }
669         } catch (Exception ex) {
670             Log.d("OpenWnn", "NO VIBRATOR");
671         }
672 
673         /* sound */
674         try {
675             if (pref.getBoolean("key_sound", false)) {
676                 mSound = MediaPlayer.create(mWnn, R.raw.type);
677             } else {
678                 mSound = null;
679             }
680         } catch (Exception ex) {
681             Log.d("OpenWnn", "NO SOUND");
682         }
683 
684         /* pop-up preview */
685         mKeyboardView.setPreviewEnabled(pref.getBoolean("popup_preview", true));
686 
687     }
688 
689     /** @see jp.co.omronsoft.openwnn.InputViewManager#closing */
closing()690     public void closing() {
691         if (mKeyboardView != null) {
692             mKeyboardView.closing();
693         }
694         mDisableKeyInput = true;
695     }
696 
697     /***********************************************************************
698      * onKeyboardActionListener
699      ***********************************************************************/
700     /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#onKey */
onKey(int primaryCode, int[] keyCodes)701     public void onKey(int primaryCode, int[] keyCodes) { }
702 
703     /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#swipeRight */
swipeRight()704     public void swipeRight() { }
705 
706     /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#swipeLeft */
swipeLeft()707     public void swipeLeft() { }
708 
709     /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#swipeDown */
swipeDown()710     public void swipeDown() { }
711 
712     /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#swipeUp */
swipeUp()713     public void swipeUp() { }
714 
715     /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#onRelease */
onRelease(int x)716     public void onRelease(int x) { }
717 
718     /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#onPress */
onPress(int x)719     public void onPress(int x) {
720         /* key click sound & vibration */
721         if (mVibrator != null) {
722             try { mVibrator.vibrate(30); } catch (Exception ex) { }
723         }
724         if (mSound != null) {
725             try { mSound.seekTo(0); mSound.start(); } catch (Exception ex) { }
726         }
727     }
728 
729     /** @see android.inputmethodservice.KeyboardView.OnKeyboardActionListener#onText */
onText(CharSequence text)730     public void onText(CharSequence text) {}
731 
732     /**
733      * Get current key mode.
734      *
735      * @return Current key mode
736      */
getKeyMode()737     public int getKeyMode() {
738         return mCurrentKeyMode;
739     }
740 
741     /**
742      * Get current keyboard type.
743      *
744      * @return Current keyboard type
745      */
getKeyboardType()746     public int getKeyboardType() {
747         return mCurrentKeyboardType;
748     }
749 
750     /**
751      * Set the H/W keyboard's state.
752      *
753      * @param hidden {@code true} if hidden.
754      */
setHardKeyboardHidden(boolean hidden)755     public void setHardKeyboardHidden(boolean hidden) {
756         mHardKeyboardHidden = hidden;
757     }
758 
759     /**
760      * Get current keyboard view.
761      */
getKeyboardView()762     public View getKeyboardView() {
763         return mKeyboardView;
764     }
765 
766     /**
767      * Reset the current keyboard
768      */
resetCurrentKeyboard()769     public void resetCurrentKeyboard() {
770         closing();
771         Keyboard keyboard = mCurrentKeyboard;
772         mCurrentKeyboard = null;
773         changeKeyboard(keyboard);
774     }
775 }
776