diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index dae596231..50ae1e342 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -39,12 +39,12 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public static final int MODE_NONE = -1; // Main keyboard layouts without the settings key - public static final int KEYBOARDMODE_NORMAL = R.id.mode_normal; - public static final int KEYBOARDMODE_URL = R.id.mode_url; - public static final int KEYBOARDMODE_EMAIL = R.id.mode_email; - public static final int KEYBOARDMODE_IM = R.id.mode_im; - public static final int KEYBOARDMODE_WEB = R.id.mode_webentry; - public static final int[] QWERTY_MODES = { + private static final int KEYBOARDMODE_NORMAL = R.id.mode_normal; + private static final int KEYBOARDMODE_URL = R.id.mode_url; + private static final int KEYBOARDMODE_EMAIL = R.id.mode_email; + private static final int KEYBOARDMODE_IM = R.id.mode_im; + private static final int KEYBOARDMODE_WEB = R.id.mode_webentry; + private static final int[] QWERTY_MODES = { KEYBOARDMODE_NORMAL, KEYBOARDMODE_URL, KEYBOARDMODE_EMAIL, @@ -52,31 +52,34 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha KEYBOARDMODE_WEB, 0 /* for MODE_PHONE */ }; // Main keyboard layouts with the settings key - public static final int KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY = R.id.mode_normal_with_settings_key; - public static final int KEYBOARDMODE_URL_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_URL_WITH_SETTINGS_KEY = R.id.mode_url_with_settings_key; - public static final int KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY = R.id.mode_email_with_settings_key; - public static final int KEYBOARDMODE_IM_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_IM_WITH_SETTINGS_KEY = R.id.mode_im_with_settings_key; - public static final int KEYBOARDMODE_WEB_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_WEB_WITH_SETTINGS_KEY = R.id.mode_webentry_with_settings_key; - public static final int[] QWERTY_WITH_SETTINGS_KEY_MODES = { + private static final int[] QWERTY_WITH_SETTINGS_KEY_MODES = { KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY, KEYBOARDMODE_URL_WITH_SETTINGS_KEY, KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY, KEYBOARDMODE_IM_WITH_SETTINGS_KEY, KEYBOARDMODE_WEB_WITH_SETTINGS_KEY, 0 /* for MODE_PHONE */ }; + private static final int[][] QWERTY_KEYBOARD_MODES = { + QWERTY_MODES, QWERTY_WITH_SETTINGS_KEY_MODES + }; // Symbols keyboard layouts without the settings key - public static final int KEYBOARDMODE_SYMBOLS_NORMAL = R.id.mode_symbols_normal; - public static final int KEYBOARDMODE_SYMBOLS_URL = R.id.mode_symbols_url; - public static final int KEYBOARDMODE_SYMBOLS_EMAIL = R.id.mode_symbols_email; - public static final int KEYBOARDMODE_SYMBOLS_IM = R.id.mode_symbols_im; - public static final int KEYBOARDMODE_SYMBOLS_WEB = R.id.mode_symbols_webentry; - public static final int[] SYMBOLS_MODES = { + private static final int KEYBOARDMODE_SYMBOLS_NORMAL = R.id.mode_symbols_normal; + private static final int KEYBOARDMODE_SYMBOLS_URL = R.id.mode_symbols_url; + private static final int KEYBOARDMODE_SYMBOLS_EMAIL = R.id.mode_symbols_email; + private static final int KEYBOARDMODE_SYMBOLS_IM = R.id.mode_symbols_im; + private static final int KEYBOARDMODE_SYMBOLS_WEB = R.id.mode_symbols_webentry; + private static final int[] SYMBOLS_MODES = { KEYBOARDMODE_SYMBOLS_NORMAL, KEYBOARDMODE_SYMBOLS_URL, KEYBOARDMODE_SYMBOLS_EMAIL, @@ -84,23 +87,26 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha KEYBOARDMODE_SYMBOLS_WEB, 0 /* for MODE_PHONE */ }; // Symbols keyboard layouts with the settings key - public static final int KEYBOARDMODE_SYMBOLS_NORMAL_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_SYMBOLS_NORMAL_WITH_SETTINGS_KEY = R.id.mode_symbols_normal_with_settings_key; - public static final int KEYBOARDMODE_SYMBOLS_URL_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_SYMBOLS_URL_WITH_SETTINGS_KEY = R.id.mode_symbols_url_with_settings_key; - public static final int KEYBOARDMODE_SYMBOLS_EMAIL_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_SYMBOLS_EMAIL_WITH_SETTINGS_KEY = R.id.mode_symbols_email_with_settings_key; - public static final int KEYBOARDMODE_SYMBOLS_IM_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_SYMBOLS_IM_WITH_SETTINGS_KEY = R.id.mode_symbols_im_with_settings_key; - public static final int KEYBOARDMODE_SYMBOLS_WEB_WITH_SETTINGS_KEY = + private static final int KEYBOARDMODE_SYMBOLS_WEB_WITH_SETTINGS_KEY = R.id.mode_symbols_webentry_with_settings_key; - public static final int[] SYMBOLS_WITH_SETTINGS_KEY_MODES = { + private static final int[] SYMBOLS_WITH_SETTINGS_KEY_MODES = { KEYBOARDMODE_SYMBOLS_NORMAL_WITH_SETTINGS_KEY, KEYBOARDMODE_SYMBOLS_URL_WITH_SETTINGS_KEY, KEYBOARDMODE_SYMBOLS_EMAIL_WITH_SETTINGS_KEY, KEYBOARDMODE_SYMBOLS_IM_WITH_SETTINGS_KEY, KEYBOARDMODE_SYMBOLS_WEB_WITH_SETTINGS_KEY, 0 /* for MODE_PHONE */ }; + private static final int[][] SYMBOLS_KEYBOARD_MODES = { + SYMBOLS_MODES, SYMBOLS_WITH_SETTINGS_KEY_MODES + }; public static final String DEFAULT_LAYOUT_ID = "4"; public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902"; @@ -127,18 +133,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private static final int SYMBOLS_MODE_STATE_SYMBOL = 2; private LatinKeyboardView mInputView; - private static final int[] ALPHABET_MODES = { - KEYBOARDMODE_NORMAL, - KEYBOARDMODE_URL, - KEYBOARDMODE_EMAIL, - KEYBOARDMODE_IM, - KEYBOARDMODE_WEB, - KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY, - KEYBOARDMODE_URL_WITH_SETTINGS_KEY, - KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY, - KEYBOARDMODE_IM_WITH_SETTINGS_KEY, - KEYBOARDMODE_WEB_WITH_SETTINGS_KEY }; - private final LatinIME mInputMethodService; private KeyboardId mSymbolsId; @@ -198,17 +192,17 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } private KeyboardId makeSymbolsId(boolean voiceButtonEnabled) { + final Configuration conf = mInputMethodService.getResources().getConfiguration(); final int mode = mMode == MODE_NONE ? MODE_TEXT : mMode; - return new KeyboardId(KBD_SYMBOLS[getCharColorId()], mHasSettingsKey ? - SYMBOLS_WITH_SETTINGS_KEY_MODES[mode] : SYMBOLS_MODES[mode], - false, voiceButtonEnabled); + return new KeyboardId(mInputLocale, conf.orientation, SYMBOLS_KEYBOARD_MODES, mode, + KBD_SYMBOLS, getCharColorId(), mHasSettingsKey, voiceButtonEnabled, false); } private KeyboardId makeSymbolsShiftedId(boolean voiceButtonEnabled) { + final Configuration conf = mInputMethodService.getResources().getConfiguration(); final int mode = mMode == MODE_NONE ? MODE_TEXT : mMode; - return new KeyboardId(KBD_SYMBOLS_SHIFT[getCharColorId()], mHasSettingsKey ? - SYMBOLS_WITH_SETTINGS_KEY_MODES[mode] : SYMBOLS_MODES[mode], - false, voiceButtonEnabled); + return new KeyboardId(mInputLocale, conf.orientation, SYMBOLS_KEYBOARD_MODES, mode, + KBD_SYMBOLS_SHIFT, getCharColorId(), mHasSettingsKey, voiceButtonEnabled, false); } private void makeSymbolsKeyboardIds() { @@ -233,22 +227,34 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha * which also serve as a unique identifier for each keyboard type. */ private static class KeyboardId { - // TODO: should have locale and portrait/landscape orientation? - public final int mXml; - public final int mKeyboardMode; /** A KEYBOARDMODE_XXX value */ - public final boolean mEnableShiftLock; + public final Locale mLocale; + public final int mOrientation; + public final int[][] mKeyboardModes; + public final int mMode; + public final int[] mXmlArray; + public final int mColorScheme; + public final boolean mHasSettings; public final boolean mVoiceButtonEnabled; + public final boolean mEnableShiftLock; private final int mHashCode; - public KeyboardId(int xml, int mode, boolean enableShiftLock, boolean voiceButtonEnabled) { - this.mXml = xml; - this.mKeyboardMode = mode; - this.mEnableShiftLock = enableShiftLock; + public KeyboardId(Locale locale, int orientation, int[][] keyboardModes, int mode, + int[] xmlArray, int colorScheme, boolean hasSettings, boolean voiceButtonEnabled, + boolean enableShiftLock) { + this.mLocale = locale; + this.mOrientation = orientation; + this.mKeyboardModes = keyboardModes; + this.mMode = mode; + this.mXmlArray = xmlArray; + this.mColorScheme = colorScheme; + this.mHasSettings = hasSettings; this.mVoiceButtonEnabled = voiceButtonEnabled; + this.mEnableShiftLock = enableShiftLock; this.mHashCode = Arrays.hashCode(new Object[] { - xml, mode, enableShiftLock, voiceButtonEnabled + locale, orientation, keyboardModes, mode, xmlArray, colorScheme, hasSettings, + voiceButtonEnabled, enableShiftLock, }); } @@ -258,10 +264,15 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } private boolean equals(KeyboardId other) { - return other.mXml == this.mXml - && other.mKeyboardMode == this.mKeyboardMode - && other.mEnableShiftLock == this.mEnableShiftLock - && other.mVoiceButtonEnabled == this.mVoiceButtonEnabled; + return other.mLocale.equals(this.mLocale) + && other.mOrientation == this.mOrientation + && other.mKeyboardModes == this.mKeyboardModes + && other.mMode == this.mMode + && other.mXmlArray == this.mXmlArray + && other.mColorScheme == this.mColorScheme + && other.mHasSettings == this.mHasSettings + && other.mVoiceButtonEnabled == this.mVoiceButtonEnabled + && other.mEnableShiftLock == this.mEnableShiftLock; } @Override @@ -270,7 +281,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } } - private boolean hasVoiceButton(boolean isSymbols) { + private boolean isVoiceButtonEnabled(boolean isSymbols) { return mVoiceButtonEnabled && (isSymbols != mVoiceButtonOnPrimary); } @@ -291,7 +302,8 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mMode = mode; mImeOptions = imeOptions; makeSymbolsKeyboardIds(); - if (voiceButtonEnabled != mVoiceButtonEnabled || voiceButtonOnPrimary != mVoiceButtonOnPrimary) { + if (voiceButtonEnabled != mVoiceButtonEnabled + || voiceButtonOnPrimary != mVoiceButtonOnPrimary) { mKeyboards.clear(); mVoiceButtonEnabled = voiceButtonEnabled; mVoiceButtonOnPrimary = voiceButtonOnPrimary; @@ -321,14 +333,16 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha SoftReference ref = mKeyboards.get(id); LatinKeyboard keyboard = (ref == null) ? null : ref.get(); if (keyboard == null) { - Resources orig = mInputMethodService.getResources(); - Configuration conf = orig.getConfiguration(); + Resources res = mInputMethodService.getResources(); + Configuration conf = res.getConfiguration(); Locale saveLocale = conf.locale; conf.locale = mInputLocale; - orig.updateConfiguration(conf, null); - keyboard = new LatinKeyboard(mInputMethodService, id.mXml, id.mKeyboardMode); - keyboard.setVoiceMode(hasVoiceButton(id.mXml == R.xml.kbd_symbols - || id.mXml == R.xml.kbd_symbols_black), mVoiceButtonEnabled); + res.updateConfiguration(conf, null); + final int keyboardMode = id.mKeyboardModes[id.mHasSettings ? 1 : 0][id.mMode]; + final int xml = id.mXmlArray[id.mColorScheme]; + keyboard = new LatinKeyboard(mInputMethodService, xml, keyboardMode); + keyboard.setVoiceMode(isVoiceButtonEnabled(xml == R.xml.kbd_symbols + || xml == R.xml.kbd_symbols_black), mVoiceButtonEnabled); keyboard.setLanguageSwitcher(mLanguageSwitcher, mIsAutoCompletionActive, isBlackSym()); if (id.mEnableShiftLock) { @@ -337,17 +351,17 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mKeyboards.put(id, new SoftReference(keyboard)); conf.locale = saveLocale; - orig.updateConfiguration(conf, null); + res.updateConfiguration(conf, null); } return keyboard; } private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) { - final boolean hasVoice = hasVoiceButton(isSymbols); + final boolean voiceButtonEnabled = isVoiceButtonEnabled(isSymbols); final int charColorId = getCharColorId(); - final int keyboardRowsResId; + final int[] xmlArray; final boolean enableShiftLock; - final int keyboardMode; + final int[][] keyboardModes; if (mode == MODE_NONE) { LatinImeLogger.logOnWarning( @@ -355,19 +369,17 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mode = MODE_TEXT; } if (isSymbols) { - keyboardRowsResId = mode == MODE_PHONE - ? KBD_PHONE_SYMBOLS[charColorId] : KBD_SYMBOLS[charColorId]; + keyboardModes = SYMBOLS_KEYBOARD_MODES; + xmlArray = mode == MODE_PHONE ? KBD_PHONE_SYMBOLS : KBD_SYMBOLS; enableShiftLock = false; - keyboardMode = mHasSettingsKey - ? SYMBOLS_WITH_SETTINGS_KEY_MODES[mode] : SYMBOLS_MODES[mode]; } else { // QWERTY - keyboardRowsResId = mode == MODE_PHONE - ? KBD_PHONE[charColorId] : KBD_QWERTY[charColorId]; + keyboardModes = QWERTY_KEYBOARD_MODES; + xmlArray = mode == MODE_PHONE ? KBD_PHONE : KBD_QWERTY; enableShiftLock = mode == MODE_PHONE ? false : true; - keyboardMode = mHasSettingsKey - ? QWERTY_WITH_SETTINGS_KEY_MODES[mode] : QWERTY_MODES[mode]; } - return new KeyboardId(keyboardRowsResId, keyboardMode, enableShiftLock, hasVoice); + final Configuration conf = mInputMethodService.getResources().getConfiguration(); + return new KeyboardId(mInputLocale, conf.orientation, keyboardModes, mode, xmlArray, + charColorId, mHasSettingsKey, voiceButtonEnabled, enableShiftLock); } public int getKeyboardMode() { @@ -375,16 +387,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } public boolean isAlphabetMode() { - if (mCurrentId == null) { - return false; - } - int currentMode = mCurrentId.mKeyboardMode; - for (Integer mode : ALPHABET_MODES) { - if (currentMode == mode) { - return true; - } - } - return false; + return mCurrentId != null && mCurrentId.mKeyboardModes == QWERTY_KEYBOARD_MODES; } public void setShifted(boolean shifted) {