diff options
| -rw-r--r-- | core/java/com/android/internal/inputmethod/InputMethodUtils.java | 36 | ||||
| -rw-r--r-- | core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java | 58 |
2 files changed, 77 insertions, 17 deletions
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java index 4e48e45d018e..f04bcf2d0264 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java +++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java @@ -547,23 +547,25 @@ public class InputMethodUtils { LocaleUtils.filterByLanguage(keyboardSubtypes, sSubtypeToLocale, systemLocales, applicableSubtypes); - boolean hasAsciiCapableKeyboard = false; - final int numApplicationSubtypes = applicableSubtypes.size(); - for (int i = 0; i < numApplicationSubtypes; ++i) { - final InputMethodSubtype subtype = applicableSubtypes.get(i); - if (subtype.containsExtraValueKey(TAG_ASCII_CAPABLE)) { - hasAsciiCapableKeyboard = true; - break; - } - } - if (!hasAsciiCapableKeyboard) { - final int numKeyboardSubtypes = keyboardSubtypes.size(); - for (int i = 0; i < numKeyboardSubtypes; ++i) { - final InputMethodSubtype subtype = keyboardSubtypes.get(i); - final String mode = subtype.getMode(); - if (SUBTYPE_MODE_KEYBOARD.equals(mode) && subtype.containsExtraValueKey( - TAG_ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE)) { - applicableSubtypes.add(subtype); + if (!applicableSubtypes.isEmpty()) { + boolean hasAsciiCapableKeyboard = false; + final int numApplicationSubtypes = applicableSubtypes.size(); + for (int i = 0; i < numApplicationSubtypes; ++i) { + final InputMethodSubtype subtype = applicableSubtypes.get(i); + if (subtype.containsExtraValueKey(TAG_ASCII_CAPABLE)) { + hasAsciiCapableKeyboard = true; + break; + } + } + if (!hasAsciiCapableKeyboard) { + final int numKeyboardSubtypes = keyboardSubtypes.size(); + for (int i = 0; i < numKeyboardSubtypes; ++i) { + final InputMethodSubtype subtype = keyboardSubtypes.get(i); + final String mode = subtype.getMode(); + if (SUBTYPE_MODE_KEYBOARD.equals(mode) && subtype.containsExtraValueKey( + TAG_ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE)) { + applicableSubtypes.add(subtype); + } } } } diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java index ac020e48355a..719b274f80f9 100644 --- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java @@ -70,6 +70,7 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { private static final Locale LOCALE_TH_TH_TH = new Locale("ht", "TH", "TH"); private static final String SUBTYPE_MODE_KEYBOARD = "keyboard"; private static final String SUBTYPE_MODE_VOICE = "voice"; + private static final String SUBTYPE_MODE_HANDWRITING = "handwriting"; private static final String SUBTYPE_MODE_ANY = null; private static final String EXTRA_VALUE_PAIR_SEPARATOR = ","; private static final String EXTRA_VALUE_ASCII_CAPABLE = "AsciiCapable"; @@ -215,6 +216,12 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { final InputMethodSubtype nonAutoJa = createDummyInputMethodSubtype("ja", SUBTYPE_MODE_KEYBOARD, !IS_AUX, !IS_OVERRIDES_IMPLICITLY_ENABLED_SUBTYPE, !IS_ASCII_CAPABLE, !IS_ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE); + final InputMethodSubtype nonAutoHi = createDummyInputMethodSubtype("hi", + SUBTYPE_MODE_KEYBOARD, !IS_AUX, !IS_OVERRIDES_IMPLICITLY_ENABLED_SUBTYPE, + !IS_ASCII_CAPABLE, !IS_ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE); + final InputMethodSubtype nonAutoHandwritingEn = createDummyInputMethodSubtype("en", + SUBTYPE_MODE_HANDWRITING, !IS_AUX, !IS_OVERRIDES_IMPLICITLY_ENABLED_SUBTYPE, + !IS_ASCII_CAPABLE, !IS_ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE); final InputMethodSubtype nonAutoEnabledWhenDefaultIsNotAsciiCalableSubtype = createDummyInputMethodSubtype("zz", SUBTYPE_MODE_KEYBOARD, !IS_AUX, !IS_OVERRIDES_IMPLICITLY_ENABLED_SUBTYPE, !IS_ASCII_CAPABLE, @@ -349,6 +356,57 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { verifyEquality(nonAutoEnabledWhenDefaultIsNotAsciiCalableSubtype2, result.get(2)); } + // Make sure that if there is no subtype that matches the language requested, then we just + // use the first keyboard subtype. + { + final ArrayList<InputMethodSubtype> subtypes = new ArrayList<>(); + subtypes.add(nonAutoHi); + subtypes.add(nonAutoEnUS); + subtypes.add(nonAutoHandwritingEn); + subtypes.add(nonAutoEnabledWhenDefaultIsNotAsciiCalableSubtype); + final InputMethodInfo imi = createDummyInputMethodInfo( + "com.android.apps.inputmethod.latin", + "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, + subtypes); + final ArrayList<InputMethodSubtype> result = + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + getResourcesForLocales(LOCALE_JA_JP), imi); + assertEquals(1, result.size()); + verifyEquality(nonAutoHi, result.get(0)); + } + { + final ArrayList<InputMethodSubtype> subtypes = new ArrayList<>(); + subtypes.add(nonAutoEnUS); + subtypes.add(nonAutoHi); + subtypes.add(nonAutoHandwritingEn); + subtypes.add(nonAutoEnabledWhenDefaultIsNotAsciiCalableSubtype); + final InputMethodInfo imi = createDummyInputMethodInfo( + "com.android.apps.inputmethod.latin", + "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, + subtypes); + final ArrayList<InputMethodSubtype> result = + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + getResourcesForLocales(LOCALE_JA_JP), imi); + assertEquals(1, result.size()); + verifyEquality(nonAutoEnUS, result.get(0)); + } + { + final ArrayList<InputMethodSubtype> subtypes = new ArrayList<>(); + subtypes.add(nonAutoHandwritingEn); + subtypes.add(nonAutoEnUS); + subtypes.add(nonAutoHi); + subtypes.add(nonAutoEnabledWhenDefaultIsNotAsciiCalableSubtype); + final InputMethodInfo imi = createDummyInputMethodInfo( + "com.android.apps.inputmethod.latin", + "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, + subtypes); + final ArrayList<InputMethodSubtype> result = + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + getResourcesForLocales(LOCALE_JA_JP), imi); + assertEquals(1, result.size()); + verifyEquality(nonAutoEnUS, result.get(0)); + } + // Make sure that 3-letter language code can be handled. { final ArrayList<InputMethodSubtype> subtypes = new ArrayList<>(); |