package idv.Zero.KerKerInput;
import idv.Zero.KerKerInput.KerKerInputCore.InputMode;
import android.util.Log;
import android.view.inputmethod.EditorInfo;
/**
* This Class provided some defined KeyCodes to clarify.
* And some methods to manage KeyBoard.
*
*/
public class KBManager {
public static final int KEYCODE_SYM = -100;
public static final int KEYCODE_SYM_ALT = -101;
public static final int KEYCODE_ABC = -102;
public static final int KEYCODE_IME = -103;
public static final int KEYCODE_NEXT_IME = -104;
public static final int KEYCODE_DO_OUTPUT_CHARS = -105;
public static final int KEYCODE_DPAD_UP = -106;
public static final int KEYCODE_DPAD_DOWN = -107;
public static final int KEYCODE_DPAD_LEFT = -108;
public static final int KEYCODE_DPAD_RIGHT = -109;
public static final int KEYCODE_IME_MENU = -110;
private KerKerInputCore _core = null;
private KeyboardView _currentKBView = null;
private Keyboard _currentKB = null;
private int _kbMode = R.id.mode_normal;
private int imeOptions = 0;
private NativeKeyboardTypes _currentKBType = NativeKeyboardTypes.MODE_ABC;
public KBManager(KerKerInputCore core)
{
_core = core;
}
/**
* current KeyboardView and reset a new one.
*/
public void resetKeyboard()
{
_currentKB = null;
getCurrentKeyboard();
}
/**
* set current KeyboardView to a new one
*
* @param kv the KeyboardView to set
*/
public void setKeyboardView(KeyboardView kv)
{
Log.i("KBManager", "setKeyboardView = " + kv);
_currentKBView = kv;
return;
}
public KeyboardView getCurrentKeyboardView()
{
return _currentKBView;
}
public Keyboard getCurrentKeyboard()
{
if (_currentKB == null)
setNativeKeyboard(NativeKeyboardTypes.MODE_ABC);
return _currentKB;
}
public enum NativeKeyboardTypes {MODE_ABC, MODE_SYM, MODE_SYM_ALT, MODE_IME};
/**
* Load given type of KeyboardView from resources.
*
* @param type the type of Keyboard
*/
public void setNativeKeyboard(NativeKeyboardTypes type)
{
_currentKBType = type;
switch(type)
{
case MODE_ABC:
setCurrentKeyboardFromResource(R.xml.kbd_qwerty, getKeyboardMode());
break;
case MODE_SYM:
setCurrentKeyboardFromResource(R.xml.kbd_sym, getKeyboardMode());
break;
case MODE_SYM_ALT:
setCurrentKeyboardFromResource(R.xml.kbd_sym_alt, getKeyboardMode());
break;
case MODE_IME:
setCurrentKeyboard(_core.getCurrentInputMethod().getDesiredKeyboard());
break;
}
}
private void setCurrentKeyboardFromResource(int kbResource, int mode)
{
setCurrentKeyboard(new Keyboard(_core.getFrontend(), kbResource, mode));
}
public void setCurrentKeyboard(Keyboard kb)
{
if (kb == null)
return;
_currentKB = kb;
Log.i("KBManager", "currentKBView = " + _currentKBView);
if (_currentKBView != null) // It will be null if it's first run.
{
Log.i("KBManager", "Update KeyboardView for new Keyboard");
_currentKBView.setKeyboard(_currentKB);
applyIMEOptions();
}
}
/**
* Change Keyboard Mode and update Keyboard
* @param kbmode
*/
public void setKeyboardMode(int kbmode)
{
_kbMode = kbmode;
setNativeKeyboard(_currentKBType);
}
public int getKeyboardMode()
{
return _kbMode;
}
/**
*
* @see EditorInfo#imeOptions
* @param inputType
*/
public void setImeOptions(int inputType)
{
imeOptions = inputType;
applyIMEOptions();
}
public void applyIMEOptions()
{
if (_currentKB == null)
return;
_currentKB.setImeOptions(_core.getFrontend().getResources(), imeOptions);
int variation = imeOptions & EditorInfo.TYPE_MASK_VARIATION;
switch (variation)
{
case EditorInfo.TYPE_TEXT_VARIATION_URI:
_core.setCurrentMode(InputMode.MODE_ABC);
_kbMode = R.id.mode_url;
break;
case EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
_core.setCurrentMode(InputMode.MODE_ABC);
_kbMode = R.id.mode_email;
break;
default:
_kbMode = R.id.mode_normal;
}
if (_currentKBView != null)
_currentKBView.setKeyboard(getCurrentKeyboard());
}
}