Home | History | Annotate | Download | only in openwnn
      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.inputmethodservice.InputMethodService;
     20 import android.view.WindowManager;
     21 import android.content.Context;
     22 import android.view.View;
     23 import android.view.KeyEvent;
     24 import android.view.MotionEvent;
     25 import android.content.SharedPreferences;
     26 import android.preference.PreferenceManager;
     27 
     28 import android.util.Log;
     29 import android.os.*;
     30 import android.view.inputmethod.*;
     31 import android.content.res.Configuration;
     32 import android.graphics.*;
     33 import android.graphics.drawable.*;
     34 
     35 /**
     36  * The OpenWnn IME's base class.
     37  *
     38  * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
     39  */
     40 public class OpenWnn extends InputMethodService {
     41 
     42     /** Candidate view */
     43     protected CandidatesViewManager  mCandidatesViewManager = null;
     44     /** Input view (software keyboard) */
     45     protected InputViewManager  mInputViewManager = null;
     46     /** Conversion engine */
     47     protected WnnEngine  mConverter = null;
     48     /** Pre-converter (for Romaji-to-Kana input, Hangul input, etc.) */
     49     protected LetterConverter  mPreConverter = null;
     50     /** The inputing/editing string */
     51     protected ComposingText  mComposingText = null;
     52     /** The input connection */
     53     protected InputConnection mInputConnection = null;
     54     /** Auto hide candidate view */
     55     protected boolean mAutoHideMode = true;
     56     /** Direct input mode */
     57     protected boolean mDirectInputMode = true;
     58 
     59     /** Flag for checking if the previous down key event is consumed by OpenWnn  */
     60     private boolean mConsumeDownEvent;
     61 
     62     /**
     63      * Constructor
     64      */
     65     public OpenWnn() {
     66         super();
     67     }
     68 
     69     /***********************************************************************
     70      * InputMethodService
     71      **********************************************************************/
     72     /** @see android.inputmethodservice.InputMethodService#onCreate */
     73     @Override public void onCreate() {
     74         super.onCreate();
     75 
     76         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
     77 
     78 
     79         if (mConverter != null) { mConverter.init(); }
     80         if (mComposingText != null) { mComposingText.clear(); }
     81     }
     82 
     83     /** @see android.inputmethodservice.InputMethodService#onCreateCandidatesView */
     84     @Override public View onCreateCandidatesView() {
     85         if (mCandidatesViewManager != null) {
     86             WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
     87             View view = mCandidatesViewManager.initView(this,
     88                                                         wm.getDefaultDisplay().getWidth(),
     89                                                         wm.getDefaultDisplay().getHeight());
     90             mCandidatesViewManager.setViewType(CandidatesViewManager.VIEW_TYPE_NORMAL);
     91             return view;
     92         } else {
     93             return super.onCreateCandidatesView();
     94         }
     95     }
     96 
     97     /** @see android.inputmethodservice.InputMethodService#onCreateInputView */
     98     @Override public View onCreateInputView() {
     99         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
    100 
    101 
    102         if (mInputViewManager != null) {
    103             WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
    104             return mInputViewManager.initView(this,
    105                                               wm.getDefaultDisplay().getWidth(),
    106                                               wm.getDefaultDisplay().getHeight());
    107         } else {
    108             return super.onCreateInputView();
    109         }
    110     }
    111 
    112     /** @see android.inputmethodservice.InputMethodService#onDestroy */
    113     @Override public void onDestroy() {
    114         super.onDestroy();
    115 
    116         close();
    117     }
    118 
    119     /** @see android.inputmethodservice.InputMethodService#onKeyDown */
    120     @Override public boolean onKeyDown(int keyCode, KeyEvent event) {
    121         mConsumeDownEvent = onEvent(new OpenWnnEvent(event));
    122         if (!mConsumeDownEvent) {
    123             return super.onKeyDown(keyCode, event);
    124         }
    125         return mConsumeDownEvent;
    126     }
    127 
    128     /** @see android.inputmethodservice.InputMethodService#onKeyUp */
    129     @Override public boolean onKeyUp(int keyCode, KeyEvent event) {
    130         boolean ret = mConsumeDownEvent;
    131         if (!ret) {
    132             ret = super.onKeyUp(keyCode, event);
    133         }else{
    134             onEvent(new OpenWnnEvent(event));
    135         }
    136         return ret;
    137     }
    138 
    139     /** @see android.inputmethodservice.InputMethodService#onStartInput */
    140     @Override public void onStartInput(EditorInfo attribute, boolean restarting) {
    141         super.onStartInput(attribute, restarting);
    142         mInputConnection = getCurrentInputConnection();
    143         if (!restarting && mComposingText != null) {
    144             mComposingText.clear();
    145         }
    146     }
    147 
    148     /** @see android.inputmethodservice.InputMethodService#onStartInputView */
    149     @Override public void onStartInputView(EditorInfo attribute, boolean restarting) {
    150         super.onStartInputView(attribute, restarting);
    151         mInputConnection = getCurrentInputConnection();
    152 
    153         setCandidatesViewShown(false);
    154         if (mInputConnection != null) {
    155             mDirectInputMode = false;
    156             if (mConverter != null) { mConverter.init(); }
    157         } else {
    158             mDirectInputMode = true;
    159         }
    160         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
    161         if (mCandidatesViewManager != null) { mCandidatesViewManager.setPreferences(pref);  }
    162         if (mInputViewManager != null) { mInputViewManager.setPreferences(pref, attribute);  }
    163         if (mPreConverter != null) { mPreConverter.setPreferences(pref);  }
    164         if (mConverter != null) { mConverter.setPreferences(pref);  }
    165     }
    166 
    167     /** @see android.inputmethodservice.InputMethodService#requestHideSelf */
    168     @Override public void requestHideSelf(int flag) {
    169         super.requestHideSelf(flag);
    170         if (mInputViewManager == null) {
    171             hideWindow();
    172         }
    173     }
    174 
    175     /** @see android.inputmethodservice.InputMethodService#setCandidatesViewShown */
    176     @Override public void setCandidatesViewShown(boolean shown) {
    177         super.setCandidatesViewShown(shown);
    178         if (shown) {
    179             showWindow(true);
    180         } else {
    181             if (mAutoHideMode && mInputViewManager == null) {
    182                 hideWindow();
    183             }
    184         }
    185     }
    186 
    187     /** @see android.inputmethodservice.InputMethodService#hideWindow */
    188     @Override public void hideWindow() {
    189         super.hideWindow();
    190         mDirectInputMode = true;
    191         hideStatusIcon();
    192     }
    193     /** @see android.inputmethodservice.InputMethodService#onComputeInsets */
    194     @Override public void onComputeInsets(InputMethodService.Insets outInsets) {
    195         super.onComputeInsets(outInsets);
    196         outInsets.contentTopInsets = outInsets.visibleTopInsets;
    197     }
    198 
    199 
    200     /**********************************************************************
    201      * OpenWnn
    202      **********************************************************************/
    203     /**
    204      * Process an event.
    205      *
    206      * @param  ev  An event
    207      * @return  {@code true} if the event is processed in this method; {@code false} if not.
    208      */
    209     public boolean onEvent(OpenWnnEvent ev) {
    210         return false;
    211     }
    212 
    213     /**
    214      * Search a character for toggle input.
    215      *
    216      * @param prevChar     The character input previous
    217      * @param toggleTable  Toggle table
    218      * @param reverse      {@code false} if toggle direction is forward, {@code true} if toggle direction is backward
    219      * @return          A character ({@code null} if no character is found)
    220      */
    221     protected String searchToggleCharacter(String prevChar, String[] toggleTable, boolean reverse) {
    222         for (int i = 0; i < toggleTable.length; i++) {
    223             if (prevChar.equals(toggleTable[i])) {
    224                 if (reverse) {
    225                     i--;
    226                     if (i < 0) {
    227                         return toggleTable[toggleTable.length - 1];
    228                     } else {
    229                         return toggleTable[i];
    230                     }
    231                 } else {
    232                     i++;
    233                     if (i == toggleTable.length) {
    234                         return toggleTable[0];
    235                     } else {
    236                         return toggleTable[i];
    237                     }
    238                 }
    239             }
    240         }
    241         return null;
    242     }
    243 
    244     /**
    245      * Processing of resource open when IME ends.
    246      */
    247     protected void close() {
    248         if (mConverter != null) { mConverter.close(); }
    249     }
    250 }
    251