From af52c0ea04c6563feaa6ea7dbac5dd87c2a48cc6 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 23 Aug 2011 17:27:48 +0900 Subject: [PATCH] Implement "forceAscii" private IME option This change also introduces "AsciiCapable" extra value for subtype that indicates the subtype can input any ASCII code point from its keyboard layout. Only if the input field has "forceAscii" private IME option and the current subtype doesn't have "AsciiCapable" extra value, the en_US keyboard layout will be used for the input field. Bug: 3384942 Change-Id: I25e2553e37ecb5002df1164e45f6273845fe463b --- java/res/xml/method.xml | 22 +++++++++++++++++-- .../keyboard/KeyboardSwitcher.java | 15 ++++++++----- .../inputmethod/keyboard/LatinKeyboard.java | 9 ++++---- .../android/inputmethod/latin/LatinIME.java | 12 ++++++++++ .../inputmethod/latin/SubtypeSwitcher.java | 5 ++++- 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index 0bf560d5a..452294e04 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -31,13 +31,13 @@ android:label="@string/subtype_en_US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" - android:imeSubtypeExtraValue="TrySuppressingImeSwitcher" + android:imeSubtypeExtraValue="TrySuppressingImeSwitcher,AsciiCapable" /> diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java index 8bf82807a..b1212f424 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -258,8 +258,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha final SoftReference ref = mKeyboardCache.get(id); LatinKeyboard keyboard = (ref == null) ? null : ref.get(); if (keyboard == null) { - final Locale savedLocale = Utils.setSystemLocale( - mResources, mSubtypeSwitcher.getInputLocale()); + final Locale savedLocale = Utils.setSystemLocale(mResources, id.mLocale); try { keyboard = new LatinKeyboard.Builder(mThemeContext).load(id).build(); } finally { @@ -319,13 +318,19 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha final boolean hasSettingsKey = settingsKeyEnabled && !noSettingsKey; final int f2KeyMode = getF2KeyMode(settingsKeyEnabled, noSettingsKey); final boolean hasShortcutKey = voiceKeyEnabled && (isSymbols != voiceKeyOnMain); + final boolean forceAscii = Utils.inPrivateImeOptions( + mPackageName, LatinIME.IME_OPTION_FORCE_ASCII, editorInfo); + final boolean asciiCapable = mSubtypeSwitcher.currentSubtypeContainsExtraValueKey( + LatinIME.SUBTYPE_EXTRA_VALUE_ASCII_CAPABLE); + final Locale locale = (forceAscii && !asciiCapable) + ? Locale.US : mSubtypeSwitcher.getInputLocale(); final Configuration conf = mResources.getConfiguration(); final DisplayMetrics dm = mResources.getDisplayMetrics(); return new KeyboardId( - mResources.getResourceEntryName(xmlId), xmlId, mSubtypeSwitcher.getInputLocale(), - conf.orientation, dm.widthPixels, mode, editorInfo, - hasSettingsKey, f2KeyMode, noSettingsKey, voiceKeyEnabled, hasShortcutKey); + mResources.getResourceEntryName(xmlId), xmlId, locale, conf.orientation, + dm.widthPixels, mode, editorInfo, hasSettingsKey, f2KeyMode, noSettingsKey, + voiceKeyEnabled, hasShortcutKey); } public int getKeyboardMode() { diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java index 1b6f57b92..133a9bad2 100644 --- a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java @@ -141,7 +141,7 @@ public class LatinKeyboard extends Keyboard { } } - public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboardView view) { + public void setSpacebarTextFadeFactor(float fadeFactor, KeyboardView view) { mSpacebarTextFadeFactor = fadeFactor; updateSpacebarForLocale(false); if (view != null) @@ -154,7 +154,7 @@ public class LatinKeyboard extends Keyboard { return newColor; } - public void updateShortcutKey(boolean available, LatinKeyboardView view) { + public void updateShortcutKey(boolean available, KeyboardView view) { if (mShortcutKey == null) return; mShortcutKey.setEnabled(available); @@ -193,9 +193,8 @@ public class LatinKeyboard extends Keyboard { && Utils.hasMultipleEnabledIMEsOrSubtypes(imm, true /* include aux subtypes */); mSpaceKey.setNeedsSpecialPopupHint(shouldShowInputMethodPicker); // If application locales are explicitly selected. - if (mSubtypeSwitcher.needsToDisplayLanguage()) { - mSpaceKey.setIcon(getSpaceDrawable( - mSubtypeSwitcher.getInputLocale(), isAutoCorrection)); + if (mSubtypeSwitcher.needsToDisplayLanguage(mId.mLocale)) { + mSpaceKey.setIcon(getSpaceDrawable(mId.mLocale, isAutoCorrection)); } else if (isAutoCorrection) { mSpaceKey.setIcon(getSpaceDrawable(null, true)); } else { diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 394414d03..552517bc8 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -106,6 +106,18 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar */ public static final String IME_OPTION_NO_SETTINGS_KEY = "noSettingsKey"; + /** + * The private IME option used to indicate that the given text field needs + * ASCII code points input. + */ + public static final String IME_OPTION_FORCE_ASCII = "forceAscii"; + + /** + * The subtype extra value used to indicate that the subtype keyboard layout is capable for + * typing ASCII characters. + */ + public static final String SUBTYPE_EXTRA_VALUE_ASCII_CAPABLE = "AsciiCapable"; + private static final int EXTENDED_TOUCHABLE_REGION_HEIGHT = 100; // How many continuous deletes at which to start deleting at a higher speed. diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java index 0a391a77e..4e6268c1c 100644 --- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java +++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java @@ -415,7 +415,10 @@ public class SubtypeSwitcher { return mEnabledKeyboardSubtypesOfCurrentInputMethod.size(); } - public boolean needsToDisplayLanguage() { + public boolean needsToDisplayLanguage(Locale keyboardLocale) { + if (!keyboardLocale.equals(mInputLocale)) { + return false; + } return mNeedsToDisplayLanguage; }