From 3b776b78924610da2874f3ac555ed5d91a550843 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 18 Nov 2010 07:58:14 +0900 Subject: [PATCH] Move functions in LatinKeyboard related to LanguageSwitcher to SubtypeSwitcher Change-Id: I777db896bd0287931ce7c810b080ccee1121d34e --- .../inputmethod/latin/BaseKeyboardView.java | 2 +- .../latin/InputLanguageSelection.java | 12 ++-- .../inputmethod/latin/KeyboardSwitcher.java | 1 - .../inputmethod/latin/LanguageSwitcher.java | 8 --- .../inputmethod/latin/LatinKeyboard.java | 49 +++++---------- .../inputmethod/latin/SubtypeSwitcher.java | 63 ++++++++++++++----- 6 files changed, 70 insertions(+), 65 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboardView.java b/java/src/com/android/inputmethod/latin/BaseKeyboardView.java index 61978e4f0..519244165 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboardView.java @@ -932,7 +932,7 @@ public class BaseKeyboardView extends View implements PointerTracker.UIProxy { || tracker.isSpaceKey(keyIndex) || tracker.isSpaceKey(oldKeyIndex); // If key changed and preview is on or the key is space (language switch is enabled) if (oldKeyIndex != keyIndex && (mShowPreview || (hidePreviewOrShowSpaceKeyPreview - && SubtypeSwitcher.getInstance().isLanguageSwitchEnabled()))) { + && SubtypeSwitcher.getInstance().needsToDisplayLanguage()))) { if (keyIndex == NOT_A_KEY) { mHandler.cancelPopupPreview(); mHandler.dismissPreview(mDelayAfterPreview); diff --git a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java index e811a2cdd..4f4f7e3a7 100644 --- a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java +++ b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java @@ -74,7 +74,7 @@ public class InputLanguageSelection extends PreferenceActivity { for (int i = 0; i < mAvailableLanguages.size(); i++) { CheckBoxPreference pref = new CheckBoxPreference(this); Locale locale = mAvailableLanguages.get(i).locale; - pref.setTitle(LanguageSwitcher.toTitleCase(locale.getDisplayName(locale))); + pref.setTitle(SubtypeSwitcher.getLanguageName(locale)); boolean checked = isLocaleIn(locale, languageList); pref.setChecked(checked); if (hasDictionary(locale)) { @@ -167,7 +167,7 @@ public class InputLanguageSelection extends PreferenceActivity { if (finalSize == 0) { preprocess[finalSize++] = - new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(l)), l); + new Loc(SubtypeSwitcher.getLanguageName(l), l); } else { // check previous entry: // same lang and a country -> upgrade to full name and @@ -175,15 +175,15 @@ public class InputLanguageSelection extends PreferenceActivity { // diff lang -> insert ours with lang-only name if (preprocess[finalSize-1].locale.getLanguage().equals( language)) { - preprocess[finalSize-1].label = LanguageSwitcher.toTitleCase( - preprocess[finalSize-1].locale.getDisplayName()); + preprocess[finalSize-1].label = SubtypeSwitcher.getLanguageName( + preprocess[finalSize-1].locale); preprocess[finalSize++] = - new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName()), l); + new Loc(SubtypeSwitcher.getLanguageName(l), l); } else { String displayName; if (s.equals("zz_ZZ")) { } else { - displayName = LanguageSwitcher.toTitleCase(l.getDisplayName(l)); + displayName = SubtypeSwitcher.getLanguageName(l); preprocess[finalSize++] = new Loc(displayName, l); } } diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index bc0a40d97..3f6b6ca33 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -297,7 +297,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha keyboard.setVoiceMode( hasVoiceKey(xml == R.xml.kbd_symbols || xml == R.xml.kbd_symbols_black), mVoiceButtonEnabled); - keyboard.setLanguageSwitcher(mSubtypeSwitcher.getLanguageSwitcher()); keyboard.setImeOptions(res, id.mMode, id.mImeOptions); keyboard.setColorOfSymbolIcons(isBlackSym(id.mColorScheme)); diff --git a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java index cc1a295a5..c2805f506 100644 --- a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java +++ b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java @@ -192,12 +192,4 @@ public class LanguageSwitcher { editor.putString(LatinIME.PREF_INPUT_LANGUAGE, getInputLanguage()); SharedPreferencesCompat.apply(editor); } - - static String toTitleCase(String s) { - if (s.length() == 0) { - return s; - } - - return Character.toUpperCase(s.charAt(0)) + s.substring(1); - } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 54d8c47f8..9473eaf84 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -66,8 +66,6 @@ public class LatinKeyboard extends BaseKeyboard { private int mSpaceKeyIndex = -1; private int mSpaceDragStartX; private int mSpaceDragLastDiff; - private Locale mLocale; - private LanguageSwitcher mLanguageSwitcher; private final Resources mRes; private final Context mContext; private int mMode; // TODO: remove this and use the corresponding mode in the parent class @@ -389,7 +387,7 @@ public class LatinKeyboard extends BaseKeyboard { private void updateSpaceBarForLocale(boolean isAutoCompletion, boolean isBlack) { final Resources res = mRes; // If application locales are explicitly selected. - if (mLocale != null) { + if (SubtypeSwitcher.getInstance().needsToDisplayLanguage()) { mSpaceKey.icon = new BitmapDrawable(res, drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack)); } else { @@ -421,7 +419,7 @@ public class LatinKeyboard extends BaseKeyboard { final Rect bounds = new Rect(); // Estimate appropriate language name text size to fit in maxTextWidth. - String language = LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale)); + String language = SubtypeSwitcher.getLanguageName(locale); int textWidth = getTextWidth(paint, language, origTextSize, bounds); // Assuming text width and text size are proportional to each other. float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); @@ -437,7 +435,7 @@ public class LatinKeyboard extends BaseKeyboard { textSize = origTextSize; } if (useShortName) { - language = LanguageSwitcher.toTitleCase(locale.getLanguage()); + language = SubtypeSwitcher.getShortLanguageName(locale); textWidth = getTextWidth(paint, language, origTextSize, bounds); textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); } @@ -462,15 +460,16 @@ public class LatinKeyboard extends BaseKeyboard { final Resources res = mRes; canvas.drawColor(res.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); + SubtypeSwitcher subtypeSwitcher = SubtypeSwitcher.getInstance(); // If application locales are explicitly selected. - if (mLocale != null) { + if (subtypeSwitcher.needsToDisplayLanguage()) { final Paint paint = new Paint(); paint.setAlpha(opacity); paint.setAntiAlias(true); paint.setTextAlign(Align.CENTER); final boolean allowVariableTextSize = true; - final String language = layoutSpaceBar(paint, mLanguageSwitcher.getInputLocale(), + final String language = layoutSpaceBar(paint, subtypeSwitcher.getInputLocale(), mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height, getTextSizeFromTheme(android.R.style.TextAppearance_Small, 14), allowVariableTextSize); @@ -487,7 +486,8 @@ public class LatinKeyboard extends BaseKeyboard { canvas.drawText(language, width / 2, baseline - descent, paint); // Put arrows that are already layed out on either side of the text - if (mLanguageSwitcher.getLocaleCount() > 1) { + if (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER + && subtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) { mButtonArrowLeftIcon.draw(canvas); mButtonArrowRightIcon.draw(canvas); } @@ -531,28 +531,13 @@ public class LatinKeyboard extends BaseKeyboard { } public int getLanguageChangeDirection() { - if (mSpaceKey == null || mLanguageSwitcher.getLocaleCount() < 2 - || Math.abs(mSpaceDragLastDiff) < mSpaceKey.width * SPACEBAR_DRAG_THRESHOLD ) { + if (mSpaceKey == null || SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() <= 1 + || Math.abs(mSpaceDragLastDiff) < mSpaceKey.width * SPACEBAR_DRAG_THRESHOLD) { return 0; // No change } return mSpaceDragLastDiff > 0 ? 1 : -1; } - public void setLanguageSwitcher(LanguageSwitcher switcher) { - mLanguageSwitcher = switcher; - Locale locale = mLanguageSwitcher.getLocaleCount() > 0 - ? mLanguageSwitcher.getInputLocale() - : null; - // If the language count is 1 and is the same as the system language, don't show it. - if (locale != null - && mLanguageSwitcher.getLocaleCount() == 1 - && mLanguageSwitcher.getSystemLocale().getLanguage() - .equalsIgnoreCase(locale.getLanguage())) { - locale = null; - } - mLocale = locale; - } - boolean isCurrentlyInSpace() { return mCurrentlyInSpace; } @@ -586,7 +571,8 @@ public class LatinKeyboard extends BaseKeyboard { if (code == KEYCODE_DELETE) x -= key.width / 6; } else if (code == LatinIME.KEYCODE_SPACE) { y += LatinKeyboard.sSpacebarVerticalCorrection; - if (mLanguageSwitcher.getLocaleCount() > 1) { + if (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER + && SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() > 1) { if (mCurrentlyInSpace) { int diff = x - mSpaceDragStartX; if (Math.abs(diff - mSpaceDragLastDiff) > 0) { @@ -851,9 +837,6 @@ public class LatinKeyboard extends BaseKeyboard { invalidateSelf(); } - private String getLanguageName(Locale locale) { - return LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale)); - } @Override public void draw(Canvas canvas) { @@ -867,10 +850,10 @@ public class LatinKeyboard extends BaseKeyboard { final Drawable rArrow = mRightDrawable; canvas.clipRect(0, 0, width, height); if (mCurrentLanguage == null) { - final LanguageSwitcher languageSwitcher = mLanguageSwitcher; - mCurrentLanguage = getLanguageName(languageSwitcher.getInputLocale()); - mNextLanguage = getLanguageName(languageSwitcher.getNextInputLocale()); - mPrevLanguage = getLanguageName(languageSwitcher.getPrevInputLocale()); + SubtypeSwitcher subtypeSwitcher = SubtypeSwitcher.getInstance(); + mCurrentLanguage = subtypeSwitcher.getInputLanguageName(); + mNextLanguage = subtypeSwitcher.getNextInputLanguageName(); + mPrevLanguage = subtypeSwitcher.getPreviousInputLanguageName(); } // Draw language text with shadow final float baseline = mHeight * SPACEBAR_LANGUAGE_BASELINE - paint.descent(); diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java index a295957a1..11b4dc7f4 100644 --- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java +++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java @@ -31,7 +31,9 @@ import java.util.List; import java.util.Locale; public class SubtypeSwitcher { - private static final boolean USE_LEGACY_LANGUAGE_SWITCHER = true; + // This flag indicates if we support language switching by swipe on space bar. + // We may or may not draw the current language on space bar regardless of this flag. + public static final boolean USE_SPACEBAR_LANGUAGE_SWITCHER = true; private static final String TAG = "SubtypeSwitcher"; private static final SubtypeSwitcher sInstance = new SubtypeSwitcher(); private InputMethodService mService; @@ -46,7 +48,7 @@ public class SubtypeSwitcher { sInstance.mService = service; sInstance.mResources = service.getResources(); sInstance.mSystemLocale = sInstance.mResources.getConfiguration().locale; - if (USE_LEGACY_LANGUAGE_SWITCHER) { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { sInstance.initLanguageSwitcher(service); } } @@ -61,22 +63,23 @@ public class SubtypeSwitcher { // Language Switching functions // ////////////////////////////////// - private int getEnabledKeyboardLocaleCount() { - if (USE_LEGACY_LANGUAGE_SWITCHER) { + public int getEnabledKeyboardLocaleCount() { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { return mLanguageSwitcher.getLocaleCount(); } // TODO: Implement for no legacy mode return 0; } - public boolean isLanguageSwitchEnabled() { + // TODO: Cache the value + public boolean needsToDisplayLanguage() { // TODO: Takes care of two-char locale such as "en" in addition to "en_US" return !(getEnabledKeyboardLocaleCount() == 1 && getSystemLocale().getLanguage( ).equalsIgnoreCase(getInputLocale().getLanguage())); } public Locale getInputLocale() { - if (USE_LEGACY_LANGUAGE_SWITCHER) { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { return mLanguageSwitcher.getInputLocale(); } // TODO: Implement for no legacy mode @@ -85,7 +88,7 @@ public class SubtypeSwitcher { public String getInputLanguage() { String inputLanguage = null; - if (USE_LEGACY_LANGUAGE_SWITCHER) { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { inputLanguage = mLanguageSwitcher.getInputLanguage(); } // Should return system locale if there is no Language available. @@ -96,7 +99,7 @@ public class SubtypeSwitcher { } public String[] getEnabledLanguages() { - if (USE_LEGACY_LANGUAGE_SWITCHER) { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { return mLanguageSwitcher.getEnabledLanguages(); } // TODO: Implement for no legacy mode @@ -107,6 +110,7 @@ public class SubtypeSwitcher { return mSystemLocale; } + // TODO: Cache the value for faster processing. public boolean isSystemLocaleSameAsInputLocale() { // TODO: Takes care of two-char locale such as "en" in addition to "en_US" return getSystemLocale().getLanguage().equalsIgnoreCase( @@ -114,7 +118,7 @@ public class SubtypeSwitcher { } public void onConfigurationChanged(Configuration conf) { - if (USE_LEGACY_LANGUAGE_SWITCHER) { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { // If the system locale changes and is different from the saved // locale (mSystemLocale), then reload the input locale list from the // latin ime settings (shared prefs) and reset the input locale @@ -132,7 +136,7 @@ public class SubtypeSwitcher { } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (USE_LEGACY_LANGUAGE_SWITCHER) { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { mLanguageSwitcher.loadLocales(sharedPreferences); return; } @@ -151,6 +155,38 @@ public class SubtypeSwitcher { //////////////////////////////////////////// private LanguageSwitcher mLanguageSwitcher; + public static String getLanguageName(Locale locale) { + return toTitleCase(locale.getDisplayLanguage(locale)); + } + + public static String getShortLanguageName(Locale locale) { + return toTitleCase(locale.getLanguage()); + } + + private static String toTitleCase(String s) { + if (s.length() == 0) { + return s; + } + return Character.toUpperCase(s.charAt(0)) + s.substring(1); + } + + public String getInputLanguageName() { + return getLanguageName(getInputLocale()); + } + + public String getNextInputLanguageName() { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { + return getLanguageName(mLanguageSwitcher.getNextInputLocale()); + } + return ""; + } + + public String getPreviousInputLanguageName() { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { + return getLanguageName(mLanguageSwitcher.getPrevInputLocale()); + } + return ""; + } // TODO: This can be an array of String // A list of locales which are supported by default for voice input, unless we get a @@ -183,7 +219,7 @@ public class SubtypeSwitcher { } public void loadSettings(SharedPreferences prefs) { - if (USE_LEGACY_LANGUAGE_SWITCHER) { + if (USE_SPACEBAR_LANGUAGE_SWITCHER) { mLanguageSwitcher.loadLocales(prefs); } } @@ -208,9 +244,4 @@ public class SubtypeSwitcher { mLanguageSwitcher.loadLocales(prefs); mLanguageSwitcher.setSystemLocale(conf.locale); } - - // TODO: remove this function when the refactor for LanguageSwitcher will be finished - public LanguageSwitcher getLanguageSwitcher() { - return mLanguageSwitcher; - } } \ No newline at end of file