From b86ca76cea9aedf47a81f9272fb59897de3bbbe7 Mon Sep 17 00:00:00 2001 From: Dan Zivkovic Date: Fri, 6 Mar 2015 14:34:57 -0800 Subject: [PATCH] Handle null InputMethodSubtype. Bug 19627494. Change-Id: I50dc77c59ced0f2e7c07a49ae0cb040197c2ab35 --- .../inputmethod/latin/RichInputMethodManager.java | 7 ++++--- .../inputmethod/latin/RichInputMethodSubtype.java | 10 ++++++++++ .../latin/spellcheck/AndroidSpellCheckerService.java | 2 +- .../keyboard/KeyboardLayoutSetTestsBase.java | 2 +- .../inputmethod/latin/RichInputMethodSubtypeTests.java | 7 +++++++ 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java index c8e0b93bf..602205b59 100644 --- a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java +++ b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java @@ -46,6 +46,7 @@ import java.util.Map; import java.util.Set; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * Enrichment class for InputMethodManager to simplify interaction and add functionality. @@ -329,7 +330,7 @@ public class RichInputMethodManager { @UsedForTesting static void forceSubtype(@Nonnull final InputMethodSubtype subtype) { - sForcedSubtypeForTesting = new RichInputMethodSubtype(subtype); + sForcedSubtypeForTesting = RichInputMethodSubtype.getRichInputMethodSubtype(subtype); } @Nonnull @@ -488,8 +489,8 @@ public class RichInputMethodManager { return true; } - private void updateCurrentSubtype(@Nonnull final InputMethodSubtype subtype) { - mCurrentRichInputMethodSubtype = new RichInputMethodSubtype(subtype); + private void updateCurrentSubtype(@Nullable final InputMethodSubtype subtype) { + mCurrentRichInputMethodSubtype = RichInputMethodSubtype.getRichInputMethodSubtype(subtype); } private void updateShortcutIme() { diff --git a/java/src/com/android/inputmethod/latin/RichInputMethodSubtype.java b/java/src/com/android/inputmethod/latin/RichInputMethodSubtype.java index ea8d4a210..8734e5925 100644 --- a/java/src/com/android/inputmethod/latin/RichInputMethodSubtype.java +++ b/java/src/com/android/inputmethod/latin/RichInputMethodSubtype.java @@ -30,6 +30,7 @@ import java.util.Arrays; import java.util.Locale; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * Enrichment class for InputMethodSubtype to enable concurrent multi-lingual input. @@ -147,6 +148,15 @@ public final class RichInputMethodSubtype { return SubtypeLocaleUtils.getKeyboardLayoutSetName(mSubtype); } + public static RichInputMethodSubtype getRichInputMethodSubtype( + @Nullable final InputMethodSubtype subtype) { + if (subtype == null) { + return getNoLanguageSubtype(); + } else { + return new RichInputMethodSubtype(subtype); + } + } + // Dummy no language QWERTY subtype. See {@link R.xml.method}. private static final int SUBTYPE_ID_OF_DUMMY_NO_LANGUAGE_SUBTYPE = 0xdde0bfd3; private static final String EXTRA_VALUE_OF_DUMMY_NO_LANGUAGE_SUBTYPE = diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java index f04f093f0..ff0578d13 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java @@ -260,7 +260,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(this, editorInfo); builder.setKeyboardGeometry( SPELLCHECKER_DUMMY_KEYBOARD_WIDTH, SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT); - builder.setSubtype(new RichInputMethodSubtype(subtype)); + builder.setSubtype(RichInputMethodSubtype.getRichInputMethodSubtype(subtype)); builder.setIsSpellChecker(true /* isSpellChecker */); builder.disableTouchPositionCorrectionData(); return builder.build(); diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java index 7f828111d..29787acc9 100644 --- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java +++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetTestsBase.java @@ -159,7 +159,7 @@ public abstract class KeyboardLayoutSetTestsBase extends AndroidTestCase { final int keyboardHeight = ResourceUtils.getDefaultKeyboardHeight(res); final Builder builder = new Builder(context, editorInfo); builder.setKeyboardGeometry(keyboardWidth, keyboardHeight) - .setSubtype(new RichInputMethodSubtype(subtype)) + .setSubtype(RichInputMethodSubtype.getRichInputMethodSubtype(subtype)) .setVoiceInputKeyEnabled(voiceInputKeyEnabled) .setLanguageSwitchKeyEnabled(languageSwitchKeyEnabled) .setSplitLayoutEnabledByUser(splitLayoutEnabled); diff --git a/tests/src/com/android/inputmethod/latin/RichInputMethodSubtypeTests.java b/tests/src/com/android/inputmethod/latin/RichInputMethodSubtypeTests.java index 9c8e16511..d59890a96 100644 --- a/tests/src/com/android/inputmethod/latin/RichInputMethodSubtypeTests.java +++ b/tests/src/com/android/inputmethod/latin/RichInputMethodSubtypeTests.java @@ -318,4 +318,11 @@ public class RichInputMethodSubtypeTests extends AndroidTestCase { public void testAdditionalSubtypeForSpacebarInFrench() { testsAdditionalSubtypesForSpacebar.runInLocale(mRes, Locale.FRENCH); } + + public void testRichInputMethodSubtypeForNullInputMethodSubtype() { + RichInputMethodSubtype subtype = RichInputMethodSubtype.getRichInputMethodSubtype(null); + assertNotNull(subtype); + assertEquals("zz", subtype.getRawSubtype().getLocale()); + assertEquals("keyboard", subtype.getRawSubtype().getMode()); + } }