17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/*
27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License.
67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at
77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and
147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License.
157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpackage com.android.inputmethod.pinyin;
187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.KeyEvent;
207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.inputmethod.InputConnection;
217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/**
237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Class to handle English input.
247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpublic class EnglishInputProcessor {
267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private int mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN;
287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean processKey(InputConnection inputContext, KeyEvent event,
307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            boolean upperCase, boolean realAction) {
317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == inputContext || null == event) return false;
327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int keyCode = event.getKeyCode();
347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        CharSequence prefix = null;
367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        prefix = inputContext.getTextBeforeCursor(2, 0);
377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int keyChar;
397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        keyChar = 0;
407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {
417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyChar = keyCode - KeyEvent.KEYCODE_A + 'a';
427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (upperCase) {
437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                keyChar = keyChar + 'A' - 'a';
447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else if (keyCode >= KeyEvent.KEYCODE_0
467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                && keyCode <= KeyEvent.KEYCODE_9)
477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyChar = keyCode - KeyEvent.KEYCODE_0 + '0';
487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        else if (keyCode == KeyEvent.KEYCODE_COMMA)
497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyChar = ',';
507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        else if (keyCode == KeyEvent.KEYCODE_PERIOD)
517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyChar = '.';
527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        else if (keyCode == KeyEvent.KEYCODE_APOSTROPHE)
537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyChar = '\'';
547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        else if (keyCode == KeyEvent.KEYCODE_AT)
557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyChar = '@';
567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        else if (keyCode == KeyEvent.KEYCODE_SLASH) keyChar = '/';
577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (0 == keyChar) {
597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            mLastKeyCode = keyCode;
607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            String insert = null;
627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (KeyEvent.KEYCODE_DEL == keyCode) {
637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (realAction)  {
647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    inputContext.deleteSurroundingText(1, 0);
657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else if (KeyEvent.KEYCODE_ENTER == keyCode) {
677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                insert = "\n";
687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else if (KeyEvent.KEYCODE_SPACE == keyCode) {
697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                insert = " ";
707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else {
717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return false;
727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (null != insert && realAction)
757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                inputContext.commitText(insert, insert.length());
767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return true;
787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (!realAction)
817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return true;
827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (KeyEvent.KEYCODE_SHIFT_LEFT == mLastKeyCode
847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                || KeyEvent.KEYCODE_SHIFT_LEFT == mLastKeyCode) {
857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (keyChar >= 'a' && keyChar <= 'z')
867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                keyChar = keyChar - 'a' + 'A';
877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else if (KeyEvent.KEYCODE_ALT_LEFT == mLastKeyCode) {
887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        String result = String.valueOf((char) keyChar);
917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        inputContext.commitText(result, result.length());
927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mLastKeyCode = keyCode;
937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return true;
947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}
96