aboutsummaryrefslogtreecommitdiffstats
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/inputmethod/latin/KeyboardSwitcher.java277
-rw-r--r--java/src/com/android/inputmethod/latin/LanguageSwitcher.java54
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java42
-rw-r--r--java/src/com/android/inputmethod/latin/LatinKeyboard.java17
4 files changed, 195 insertions, 195 deletions
diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index 50ae1e342..05bda6591 100644
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -16,10 +16,12 @@
package com.android.inputmethod.latin;
+import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.preference.PreferenceManager;
+import android.util.Log;
import android.view.InflateException;
import java.lang.ref.SoftReference;
@@ -28,6 +30,8 @@ import java.util.HashMap;
import java.util.Locale;
public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener {
+ private static final String TAG = "KeyboardSwitcher";
+ private static final boolean DEBUG = false;
public static final int MODE_TEXT = 0;
public static final int MODE_URL = 1;
@@ -36,8 +40,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
public static final int MODE_WEB = 4;
public static final int MODE_PHONE = 5;
- public static final int MODE_NONE = -1;
-
// Main keyboard layouts without the settings key
private static final int KEYBOARDMODE_NORMAL = R.id.mode_normal;
private static final int KEYBOARDMODE_URL = R.id.mode_url;
@@ -134,14 +136,16 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
private LatinKeyboardView mInputView;
private final LatinIME mInputMethodService;
+ private final LanguageSwitcher mLanguageSwitcher;
private KeyboardId mSymbolsId;
private KeyboardId mSymbolsShiftedId;
private KeyboardId mCurrentId;
- private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboards;
+ private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboardCache =
+ new HashMap<KeyboardId, SoftReference<LatinKeyboard>>();
- private int mMode = MODE_NONE; /** One of the MODE_XXX values */
+ private int mMode = MODE_TEXT; /* default value */
private int mImeOptions;
private boolean mIsSymbols;
/** mIsAutoCompletionActive indicates that auto completed word will be input instead of
@@ -161,65 +165,29 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
// Default is SETTINGS_KEY_MODE_AUTO.
private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO;
- private int mLastDisplayWidth;
- private LanguageSwitcher mLanguageSwitcher;
- private Locale mInputLocale;
-
private int mLayoutId;
- public KeyboardSwitcher(LatinIME ims) {
+ public KeyboardSwitcher(LatinIME ims, LanguageSwitcher languageSwitcher) {
mInputMethodService = ims;
+ mLanguageSwitcher = languageSwitcher;
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ims);
mLayoutId = Integer.valueOf(prefs.getString(PREF_KEYBOARD_LAYOUT, DEFAULT_LAYOUT_ID));
- updateSettingsKeyState(prefs);
prefs.registerOnSharedPreferenceChangeListener(this);
-
- mKeyboards = new HashMap<KeyboardId, SoftReference<LatinKeyboard>>();
- mSymbolsId = makeSymbolsId(false);
- mSymbolsShiftedId = makeSymbolsShiftedId(false);
- }
-
- /**
- * Sets the input locale, when there are multiple locales for input.
- * If no locale switching is required, then the locale should be set to null.
- * @param locale the current input locale, or null for default locale with no locale
- * button.
- */
- public void setLanguageSwitcher(LanguageSwitcher languageSwitcher) {
- mLanguageSwitcher = languageSwitcher;
- mInputLocale = mLanguageSwitcher.getInputLocale();
- }
-
- private KeyboardId makeSymbolsId(boolean voiceButtonEnabled) {
- final Configuration conf = mInputMethodService.getResources().getConfiguration();
- final int mode = mMode == MODE_NONE ? MODE_TEXT : mMode;
- 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(mInputLocale, conf.orientation, SYMBOLS_KEYBOARD_MODES, mode,
- KBD_SYMBOLS_SHIFT, getCharColorId(), mHasSettingsKey, voiceButtonEnabled, false);
}
private void makeSymbolsKeyboardIds() {
- mSymbolsId = makeSymbolsId(mVoiceButtonEnabled && !mVoiceButtonOnPrimary);
- mSymbolsShiftedId = makeSymbolsShiftedId(mVoiceButtonEnabled && !mVoiceButtonOnPrimary);
- }
-
- public void refreshKeyboardCache(boolean forceCreate) {
- makeSymbolsKeyboardIds();
- if (forceCreate) mKeyboards.clear();
- // Configuration change is coming after the keyboard gets recreated. So don't rely on that.
- // If keyboards have already been made, check if we have a screen width change and
- // create the keyboard layouts again at the correct orientation
- int displayWidth = mInputMethodService.getMaxWidth();
- if (displayWidth == mLastDisplayWidth) return;
- mLastDisplayWidth = displayWidth;
- if (!forceCreate) mKeyboards.clear();
+ final Locale locale = mLanguageSwitcher.getInputLocale();
+ final int orientation = mInputMethodService.getResources().getConfiguration().orientation;
+ final int mode = mMode;
+ final int colorScheme = getCharColorId();
+ final boolean hasSettingsKey = mHasSettingsKey;
+ final boolean hasVoiceKey = mVoiceButtonEnabled && !mVoiceButtonOnPrimary;
+ final int imeOptions = mImeOptions;
+ mSymbolsId = new KeyboardId(locale, orientation, SYMBOLS_KEYBOARD_MODES, mode,
+ KBD_SYMBOLS, colorScheme, hasSettingsKey, hasVoiceKey, imeOptions, true);
+ mSymbolsShiftedId = new KeyboardId(locale, orientation, SYMBOLS_KEYBOARD_MODES, mode,
+ KBD_SYMBOLS_SHIFT, colorScheme, hasSettingsKey, hasVoiceKey, imeOptions, true);
}
/**
@@ -233,28 +201,38 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
public final int mMode;
public final int[] mXmlArray;
public final int mColorScheme;
- public final boolean mHasSettings;
- public final boolean mVoiceButtonEnabled;
+ public final boolean mHasSettingsKey;
+ public final boolean mHasVoiceKey;
+ public final int mImeOptions;
public final boolean mEnableShiftLock;
private final int mHashCode;
public KeyboardId(Locale locale, int orientation, int[][] keyboardModes, int mode,
- int[] xmlArray, int colorScheme, boolean hasSettings, boolean voiceButtonEnabled,
- boolean enableShiftLock) {
+ int[] xmlArray, int colorScheme, boolean hasSettingsKey, boolean hasVoiceKey,
+ int imeOptions, 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.mHasSettingsKey = hasSettingsKey;
+ this.mHasVoiceKey = hasVoiceKey;
+ this.mImeOptions = imeOptions;
this.mEnableShiftLock = enableShiftLock;
this.mHashCode = Arrays.hashCode(new Object[] {
- locale, orientation, keyboardModes, mode, xmlArray, colorScheme, hasSettings,
- voiceButtonEnabled, enableShiftLock,
+ locale,
+ orientation,
+ keyboardModes,
+ mode,
+ xmlArray,
+ colorScheme,
+ hasSettingsKey,
+ hasVoiceKey,
+ imeOptions,
+ enableShiftLock,
});
}
@@ -270,8 +248,9 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
&& other.mMode == this.mMode
&& other.mXmlArray == this.mXmlArray
&& other.mColorScheme == this.mColorScheme
- && other.mHasSettings == this.mHasSettings
- && other.mVoiceButtonEnabled == this.mVoiceButtonEnabled
+ && other.mHasSettingsKey == this.mHasSettingsKey
+ && other.mHasVoiceKey == this.mHasVoiceKey
+ && other.mImeOptions == this.mImeOptions
&& other.mEnableShiftLock == this.mEnableShiftLock;
}
@@ -279,41 +258,74 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
public int hashCode() {
return mHashCode;
}
+
+ @Override
+ public String toString() {
+ if (DEBUG) {
+ return String.format("[%s %s %6s %5s imeOptions=0x%08x xml=0x%08x %s%s%s%s]",
+ mLocale,
+ (mOrientation == 1 ? "port" : "land"),
+ (mKeyboardModes == QWERTY_KEYBOARD_MODES ? "alpha" : "symbol"),
+ modeName(mMode),
+ mImeOptions,
+ mXmlArray[0],
+ (mColorScheme == CHAR_THEME_COLOR_WHITE ? "white" : "black"),
+ (mHasSettingsKey ? " hasSettingsKey" : ""),
+ (mHasVoiceKey ? " hasVoiceKey" : ""),
+ (mEnableShiftLock ? " enableShiftLock" : ""));
+ } else {
+ return super.toString();
+ }
+ }
+
+ private static String modeName(int mode) {
+ if (DEBUG) {
+ switch (mode) {
+ case MODE_TEXT: return "text";
+ case MODE_URL: return "url";
+ case MODE_EMAIL: return "email";
+ case MODE_IM: return "im";
+ case MODE_WEB: return "web";
+ case MODE_PHONE: return "phone";
+ }
+ }
+ return null;
+ }
}
- private boolean isVoiceButtonEnabled(boolean isSymbols) {
+ private boolean hasVoiceKey(boolean isSymbols) {
return mVoiceButtonEnabled && (isSymbols != mVoiceButtonOnPrimary);
}
- public void setKeyboardMode(int mode, int imeOptions, boolean voiceButtonEnabled,
+ public void loadKeyboard(int mode, int imeOptions, boolean voiceButtonEnabled,
boolean voiceButtonOnPrimary) {
mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
try {
- setKeyboardModeInternal(mode, imeOptions, voiceButtonEnabled, voiceButtonOnPrimary,
+ loadKeyboardInternal(mode, imeOptions, voiceButtonEnabled, voiceButtonOnPrimary,
false);
} catch (RuntimeException e) {
LatinImeLogger.logOnException(mode + "," + imeOptions, e);
}
}
- private void setKeyboardModeInternal(int mode, int imeOptions, boolean voiceButtonEnabled,
+ private void loadKeyboardInternal(int mode, int imeOptions, boolean voiceButtonEnabled,
boolean voiceButtonOnPrimary, boolean isSymbols) {
if (mInputView == null) return;
+ mInputView.setPreviewEnabled(mInputMethodService.getPopupOn());
+
mMode = mode;
mImeOptions = imeOptions;
- makeSymbolsKeyboardIds();
- if (voiceButtonEnabled != mVoiceButtonEnabled
- || voiceButtonOnPrimary != mVoiceButtonOnPrimary) {
- mKeyboards.clear();
- mVoiceButtonEnabled = voiceButtonEnabled;
- mVoiceButtonOnPrimary = voiceButtonOnPrimary;
- }
+ mVoiceButtonEnabled = voiceButtonEnabled;
+ mVoiceButtonOnPrimary = voiceButtonOnPrimary;
mIsSymbols = isSymbols;
+ // Update the settings key state because number of enabled IMEs could have been changed
+ mHasSettingsKey = getSettingsKeyMode(
+ PreferenceManager.getDefaultSharedPreferences(mInputMethodService),
+ mInputMethodService);
+ makeSymbolsKeyboardIds();
- mInputView.setPreviewEnabled(mInputMethodService.getPopupOn());
KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
- LatinKeyboard keyboard = null;
- keyboard = getKeyboard(id);
+ LatinKeyboard keyboard = getKeyboard(id);
if (mode == MODE_PHONE) {
mInputView.setPhoneKeyboard(keyboard);
@@ -321,53 +333,58 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
mCurrentId = id;
mInputView.setKeyboard(keyboard);
- keyboard.setShifted(false);
- keyboard.setShiftLocked(keyboard.isShiftLocked());
- keyboard.setImeOptions(mInputMethodService.getResources(), mode, imeOptions);
- keyboard.setColorOfSymbolIcons(mIsAutoCompletionActive, isBlackSym());
- // Update the settings key state because number of enabled IMEs could have been changed
- updateSettingsKeyState(PreferenceManager.getDefaultSharedPreferences(mInputMethodService));
}
private LatinKeyboard getKeyboard(KeyboardId id) {
- SoftReference<LatinKeyboard> ref = mKeyboards.get(id);
+ final SoftReference<LatinKeyboard> ref = mKeyboardCache.get(id);
LatinKeyboard keyboard = (ref == null) ? null : ref.get();
if (keyboard == null) {
- Resources res = mInputMethodService.getResources();
- Configuration conf = res.getConfiguration();
- Locale saveLocale = conf.locale;
- conf.locale = mInputLocale;
+ final Resources res = mInputMethodService.getResources();
+ final Configuration conf = res.getConfiguration();
+ final Locale saveLocale = conf.locale;
+ conf.locale = mLanguageSwitcher.getInputLocale();
res.updateConfiguration(conf, null);
- final int keyboardMode = id.mKeyboardModes[id.mHasSettings ? 1 : 0][id.mMode];
+
+ final int keyboardMode = id.mKeyboardModes[id.mHasSettingsKey ? 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());
+ keyboard = new LatinKeyboard(mInputMethodService, xml, keyboardMode, id.mColorScheme,
+ id.mHasSettingsKey, id.mHasVoiceKey, id.mImeOptions);
+ keyboard.setVoiceMode(
+ hasVoiceKey(xml == R.xml.kbd_symbols || xml == R.xml.kbd_symbols_black),
+ mVoiceButtonEnabled);
+ keyboard.setLanguageSwitcher(mLanguageSwitcher);
+ keyboard.setImeOptions(res, id.mMode, id.mImeOptions);
+ keyboard.setColorOfSymbolIcons(isBlackSym(id.mColorScheme));
if (id.mEnableShiftLock) {
keyboard.enableShiftLock();
}
- mKeyboards.put(id, new SoftReference<LatinKeyboard>(keyboard));
+
+ mKeyboardCache.put(id, new SoftReference<LatinKeyboard>(keyboard));
+ if (DEBUG)
+ Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": "
+ + ((ref == null) ? "LOAD" : "GCed") + " id=" + id);
conf.locale = saveLocale;
res.updateConfiguration(conf, null);
+ } else if (DEBUG) {
+ Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": HIT id=" + id);
}
+
+ keyboard.onAutoCompletionStateChanged(mIsAutoCompletionActive);
+ keyboard.setShifted(false);
+ // TODO: delete this?
+ keyboard.setShiftLocked(keyboard.isShiftLocked());
return keyboard;
}
private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) {
- final boolean voiceButtonEnabled = isVoiceButtonEnabled(isSymbols);
+ final boolean hasVoiceKey = hasVoiceKey(isSymbols);
final int charColorId = getCharColorId();
final int[] xmlArray;
final boolean enableShiftLock;
final int[][] keyboardModes;
- if (mode == MODE_NONE) {
- LatinImeLogger.logOnWarning(
- "getKeyboardId:" + mode + "," + imeOptions + "," + isSymbols);
- mode = MODE_TEXT;
- }
if (isSymbols) {
keyboardModes = SYMBOLS_KEYBOARD_MODES;
xmlArray = mode == MODE_PHONE ? KBD_PHONE_SYMBOLS : KBD_SYMBOLS;
@@ -377,9 +394,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
xmlArray = mode == MODE_PHONE ? KBD_PHONE : KBD_QWERTY;
enableShiftLock = mode == MODE_PHONE ? false : true;
}
- final Configuration conf = mInputMethodService.getResources().getConfiguration();
- return new KeyboardId(mInputLocale, conf.orientation, keyboardModes, mode, xmlArray,
- charColorId, mHasSettingsKey, voiceButtonEnabled, enableShiftLock);
+ final int orientation = mInputMethodService.getResources().getConfiguration().orientation;
+ final Locale locale = mLanguageSwitcher.getInputLocale();
+ return new KeyboardId(locale, orientation, keyboardModes, mode, xmlArray,
+ charColorId, mHasSettingsKey, hasVoiceKey, imeOptions, enableShiftLock);
}
public int getKeyboardMode() {
@@ -407,32 +425,27 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
public void toggleShift() {
if (isAlphabetMode())
return;
+ final LatinKeyboard keyboard;
if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) {
- LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId);
mCurrentId = mSymbolsShiftedId;
- mInputView.setKeyboard(symbolsShiftedKeyboard);
+ keyboard = getKeyboard(mCurrentId);
// Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To
// enable the indicator, we need to call enableShiftLock() and setShiftLocked(true).
// Thus we can keep the ALT key's Key.on value true while LatinKey.onRelease() is
// called.
- symbolsShiftedKeyboard.enableShiftLock();
- symbolsShiftedKeyboard.setShiftLocked(true);
- symbolsShiftedKeyboard.setImeOptions(mInputMethodService.getResources(),
- mMode, mImeOptions);
+ keyboard.setShiftLocked(true);
} else {
- LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId);
mCurrentId = mSymbolsId;
- mInputView.setKeyboard(symbolsKeyboard);
+ keyboard = getKeyboard(mCurrentId);
// Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the
// indicator, we need to call enableShiftLock() and setShiftLocked(false).
- symbolsKeyboard.enableShiftLock();
- symbolsKeyboard.setShifted(false);
- symbolsKeyboard.setImeOptions(mInputMethodService.getResources(), mMode, mImeOptions);
+ keyboard.setShifted(false);
}
+ mInputView.setKeyboard(keyboard);
}
public void toggleSymbols() {
- setKeyboardModeInternal(mMode, mImeOptions, mVoiceButtonEnabled, mVoiceButtonOnPrimary,
+ loadKeyboardInternal(mMode, mImeOptions, mVoiceButtonEnabled, mVoiceButtonOnPrimary,
!mIsSymbols);
if (mIsSymbols) {
mSymbolsModeState = SYMBOLS_MODE_STATE_BEGIN;
@@ -469,11 +482,11 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
return mInputView;
}
- public void recreateInputView() {
- changeLatinKeyboardView(mLayoutId, true);
+ public void loadKeyboardView() {
+ loadKeyboardViewInternal(mLayoutId, true);
}
- private void changeLatinKeyboardView(int newLayout, boolean forceReset) {
+ private void loadKeyboardViewInternal(int newLayout, boolean forceReset) {
if (mLayoutId != newLayout || mInputView == null || forceReset) {
if (mInputView != null) {
mInputView.closing();
@@ -511,22 +524,27 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PREF_KEYBOARD_LAYOUT.equals(key)) {
- changeLatinKeyboardView(
- Integer.valueOf(sharedPreferences.getString(key, DEFAULT_LAYOUT_ID)), false);
+ final int layoutId = Integer.valueOf(
+ sharedPreferences.getString(key, DEFAULT_LAYOUT_ID));
+ loadKeyboardViewInternal(layoutId, false);
} else if (LatinIMESettings.PREF_SETTINGS_KEY.equals(key)) {
- updateSettingsKeyState(sharedPreferences);
- recreateInputView();
+ mHasSettingsKey = getSettingsKeyMode(sharedPreferences, mInputMethodService);
+ loadKeyboardViewInternal(mLayoutId, true);
}
}
- public boolean isBlackSym () {
+ public boolean isBlackSym() {
if (mInputView != null && mInputView.getSymbolColorScheme() == 1) {
return true;
}
return false;
}
- private int getCharColorId () {
+ private boolean isBlackSym(int colorScheme) {
+ return colorScheme == CHAR_THEME_COLOR_BLACK;
+ }
+
+ private int getCharColorId() {
if (isBlackSym()) {
return CHAR_THEME_COLOR_BLACK;
} else {
@@ -543,8 +561,8 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
}
}
- private void updateSettingsKeyState(SharedPreferences prefs) {
- Resources resources = mInputMethodService.getResources();
+ private static boolean getSettingsKeyMode(SharedPreferences prefs, Context context) {
+ Resources resources = context.getResources();
final boolean showSettingsKeyOption = resources.getBoolean(
R.bool.config_enable_show_settings_key_option);
if (showSettingsKeyOption) {
@@ -554,11 +572,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
// 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system
if (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))
|| (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO))
- && LatinIMEUtil.hasMultipleEnabledIMEs(mInputMethodService))) {
- mHasSettingsKey = true;
- return;
+ && LatinIMEUtil.hasMultipleEnabledIMEs(context))) {
+ return true;
}
}
- mHasSettingsKey = false;
+ return false;
}
}
diff --git a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
index 7b5c30491..cc1a295a5 100644
--- a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
@@ -16,21 +16,22 @@
package com.android.inputmethod.latin;
-import java.util.Locale;
-
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.PreferenceManager;
import android.text.TextUtils;
+import java.util.ArrayList;
+import java.util.Locale;
+
/**
* Keeps track of list of selected input languages and the current
* input language that the user has selected.
*/
public class LanguageSwitcher {
- private Locale[] mLocales;
- private LatinIME mIme;
+ private final ArrayList<Locale> mLocales = new ArrayList<Locale>();
+ private final LatinIME mIme;
private String[] mSelectedLanguageArray;
private String mSelectedLanguages;
private int mCurrentIndex = 0;
@@ -40,15 +41,10 @@ public class LanguageSwitcher {
public LanguageSwitcher(LatinIME ime) {
mIme = ime;
- mLocales = new Locale[0];
- }
-
- public Locale[] getLocales() {
- return mLocales;
}
public int getLocaleCount() {
- return mLocales.length;
+ return mLocales.size();
}
/**
@@ -61,10 +57,10 @@ public class LanguageSwitcher {
String currentLanguage = sp.getString(LatinIME.PREF_INPUT_LANGUAGE, null);
if (selectedLanguages == null || selectedLanguages.length() < 1) {
loadDefaults();
- if (mLocales.length == 0) {
+ if (mLocales.size() == 0) {
return false;
}
- mLocales = new Locale[0];
+ mLocales.clear();
return true;
}
if (selectedLanguages.equals(mSelectedLanguages)) {
@@ -77,7 +73,7 @@ public class LanguageSwitcher {
if (currentLanguage != null) {
// Find the index
mCurrentIndex = 0;
- for (int i = 0; i < mLocales.length; i++) {
+ for (int i = 0; i < mLocales.size(); i++) {
if (mSelectedLanguageArray[i].equals(currentLanguage)) {
mCurrentIndex = i;
break;
@@ -96,11 +92,11 @@ public class LanguageSwitcher {
}
private void constructLocales() {
- mLocales = new Locale[mSelectedLanguageArray.length];
- for (int i = 0; i < mLocales.length; i++) {
- final String lang = mSelectedLanguageArray[i];
- mLocales[i] = new Locale(lang.substring(0, 2),
+ mLocales.clear();
+ for (final String lang : mSelectedLanguageArray) {
+ final Locale locale = new Locale(lang.substring(0, 2),
lang.length() > 4 ? lang.substring(3, 5) : "");
+ mLocales.add(locale);
}
}
@@ -129,7 +125,17 @@ public class LanguageSwitcher {
public Locale getInputLocale() {
if (getLocaleCount() == 0) return mDefaultInputLocale;
- return mLocales[mCurrentIndex];
+ return mLocales.get(mCurrentIndex);
+ }
+
+ private int nextLocaleIndex() {
+ final int size = mLocales.size();
+ return (mCurrentIndex + 1) % size;
+ }
+
+ private int prevLocaleIndex() {
+ final int size = mLocales.size();
+ return (mCurrentIndex - 1 + size) % size;
}
/**
@@ -139,8 +145,7 @@ public class LanguageSwitcher {
*/
public Locale getNextInputLocale() {
if (getLocaleCount() == 0) return mDefaultInputLocale;
-
- return mLocales[(mCurrentIndex + 1) % mLocales.length];
+ return mLocales.get(nextLocaleIndex());
}
/**
@@ -166,8 +171,7 @@ public class LanguageSwitcher {
*/
public Locale getPrevInputLocale() {
if (getLocaleCount() == 0) return mDefaultInputLocale;
-
- return mLocales[(mCurrentIndex - 1 + mLocales.length) % mLocales.length];
+ return mLocales.get(prevLocaleIndex());
}
public void reset() {
@@ -175,13 +179,11 @@ public class LanguageSwitcher {
}
public void next() {
- mCurrentIndex++;
- if (mCurrentIndex >= mLocales.length) mCurrentIndex = 0; // Wrap around
+ mCurrentIndex = nextLocaleIndex();
}
public void prev() {
- mCurrentIndex--;
- if (mCurrentIndex < 0) mCurrentIndex = mLocales.length - 1; // Wrap around
+ mCurrentIndex = prevLocaleIndex();
}
public void persist() {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index e2b85c525..707821125 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -348,8 +348,7 @@ public class LatinIME extends InputMethodService
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
mLanguageSwitcher = new LanguageSwitcher(this);
mLanguageSwitcher.loadLocales(prefs);
- mKeyboardSwitcher = new KeyboardSwitcher(this);
- mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher);
+ mKeyboardSwitcher = new KeyboardSwitcher(this, mLanguageSwitcher);
mSystemLocale = conf.locale.toString();
mLanguageSwitcher.setSystemLocale(conf.locale);
String inputLanguage = mLanguageSwitcher.getInputLanguage();
@@ -501,14 +500,10 @@ public class LatinIME extends InputMethodService
final String systemLocale = conf.locale.toString();
if (!TextUtils.equals(systemLocale, mSystemLocale)) {
mSystemLocale = systemLocale;
- if (mLanguageSwitcher != null) {
- mLanguageSwitcher.loadLocales(
- PreferenceManager.getDefaultSharedPreferences(this));
- mLanguageSwitcher.setSystemLocale(conf.locale);
- toggleLanguage(true, true);
- } else {
- reloadKeyboards();
- }
+ mLanguageSwitcher.loadLocales(
+ PreferenceManager.getDefaultSharedPreferences(this));
+ mLanguageSwitcher.setSystemLocale(conf.locale);
+ toggleLanguage(true, true);
}
// If orientation changed while predicting, commit the change
if (conf.orientation != mOrientation) {
@@ -516,8 +511,12 @@ public class LatinIME extends InputMethodService
commitTyped(ic);
if (ic != null) ic.finishComposingText(); // For voice input
mOrientation = conf.orientation;
- reloadKeyboards();
+ final int mode = mKeyboardSwitcher.getKeyboardMode();
+ final EditorInfo attribute = getCurrentInputEditorInfo();
+ mKeyboardSwitcher.loadKeyboard(mode, attribute.imeOptions, mVoiceButtonEnabled,
+ mVoiceButtonOnPrimary);
}
+
mConfigurationChanging = true;
super.onConfigurationChanged(conf);
if (mRecognizing) {
@@ -528,14 +527,12 @@ public class LatinIME extends InputMethodService
@Override
public View onCreateInputView() {
- mKeyboardSwitcher.recreateInputView();
- mKeyboardSwitcher.refreshKeyboardCache(true);
+ mKeyboardSwitcher.loadKeyboardView();
return mKeyboardSwitcher.getInputView();
}
@Override
public View onCreateCandidatesView() {
- mKeyboardSwitcher.refreshKeyboardCache(true);
mCandidateViewContainer = (LinearLayout) getLayoutInflater().inflate(
R.layout.candidates, null);
mCandidateView = (CandidateView) mCandidateViewContainer.findViewById(R.id.candidates);
@@ -568,8 +565,6 @@ public class LatinIME extends InputMethodService
toggleLanguage(true, true);
}
- mKeyboardSwitcher.refreshKeyboardCache(false);
-
TextEntryState.newSession(this);
// Most such things we decide below in the switch statement, but we need to know
@@ -663,7 +658,7 @@ public class LatinIME extends InputMethodService
mJustAddedAutoSpace = false;
loadSettings(attribute);
- mKeyboardSwitcher.setKeyboardMode(mode, attribute.imeOptions, mVoiceButtonEnabled,
+ mKeyboardSwitcher.loadKeyboard(mode, attribute.imeOptions, mVoiceButtonEnabled,
mVoiceButtonOnPrimary);
updateShiftKeyState(attribute);
@@ -1024,12 +1019,6 @@ public class LatinIME extends InputMethodService
mVoiceInputHighlighted = false;
}
- private void reloadKeyboards() {
- mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher);
- int mode = mKeyboardSwitcher.getKeyboardMode();
- mKeyboardSwitcher.setKeyboardMode(mode, 0, mVoiceButtonEnabled, mVoiceButtonOnPrimary);
- }
-
private void commitTyped(InputConnection inputConnection) {
if (mPredicting) {
mPredicting = false;
@@ -2282,10 +2271,9 @@ public class LatinIME extends InputMethodService
mLanguageSwitcher.prev();
}
}
- int currentKeyboardMode = mKeyboardSwitcher.getKeyboardMode();
- reloadKeyboards();
- mKeyboardSwitcher.refreshKeyboardCache(true);
- mKeyboardSwitcher.setKeyboardMode(currentKeyboardMode, 0, mVoiceButtonEnabled,
+ final int mode = mKeyboardSwitcher.getKeyboardMode();
+ final EditorInfo attribute = getCurrentInputEditorInfo();
+ mKeyboardSwitcher.loadKeyboard(mode, attribute.imeOptions, mVoiceButtonEnabled,
mVoiceButtonOnPrimary);
initSuggest(mLanguageSwitcher.getInputLanguage());
mLanguageSwitcher.persist();
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
index 15a8cf768..883069ae6 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
@@ -113,11 +113,9 @@ public class LatinKeyboard extends BaseKeyboard {
private static int sSpacebarVerticalCorrection;
- public LatinKeyboard(Context context, int xmlLayoutResId) {
- this(context, xmlLayoutResId, 0);
- }
-
- public LatinKeyboard(Context context, int xmlLayoutResId, int mode) {
+ public LatinKeyboard(Context context, int xmlLayoutResId, int mode, int colorScheme,
+ boolean hasSettingsKey, boolean hasVoiceKey, int imeOptions) {
+ // TODO: to be used: colorScheme, hasSettingsKey, hasVoiceKey, imeOptions.
super(context, xmlLayoutResId, mode);
final Resources res = context.getResources();
mContext = context;
@@ -291,7 +289,7 @@ public class LatinKeyboard extends BaseKeyboard {
return mIsAlphaKeyboard;
}
- public void setColorOfSymbolIcons(boolean isAutoCompletion, boolean isBlack) {
+ public void setColorOfSymbolIcons(boolean isBlack) {
mIsBlackSym = isBlack;
final Resources res = mRes;
if (isBlack) {
@@ -306,9 +304,6 @@ public class LatinKeyboard extends BaseKeyboard {
m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic);
}
updateDynamicKeys();
- if (mSpaceKey != null) {
- updateSpaceBarForLocale(isAutoCompletion, isBlack);
- }
}
public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) {
@@ -547,8 +542,7 @@ public class LatinKeyboard extends BaseKeyboard {
return mSpaceDragLastDiff > 0 ? 1 : -1;
}
- public void setLanguageSwitcher(LanguageSwitcher switcher, boolean isAutoCompletion,
- boolean isBlackSym) {
+ public void setLanguageSwitcher(LanguageSwitcher switcher) {
mLanguageSwitcher = switcher;
Locale locale = mLanguageSwitcher.getLocaleCount() > 0
? mLanguageSwitcher.getInputLocale()
@@ -561,7 +555,6 @@ public class LatinKeyboard extends BaseKeyboard {
locale = null;
}
mLocale = locale;
- setColorOfSymbolIcons(isAutoCompletion, isBlackSym);
}
boolean isCurrentlyInSpace() {