From 68c860bb29861e54fd9b868bd5af701b054a1dc0 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Sat, 13 Sep 2014 22:03:37 +0900 Subject: Minimize the number of default enabled IMEs part 2 Previously the system tried to enable at least one auxiliary IME even when the system is not ready. However, this doesn't make much sense because the user should be able to set up their phone without auxiliary IMEs. Also, IMEs enabled before the system becomes ready are kept to be enabled after the system becomes ready. Thus, we should minimize the number of enabled IMEs until the system becomes ready. BUG: 17347871 Change-Id: Ife93d909fb8a24471c425c903e2b7048826e17a3 --- .../internal/inputmethod/InputMethodUtils.java | 31 ++++++++++++++++------ .../src/android/os/InputMethodTest.java | 27 ++++++------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java index d47d031..2d067d5 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java +++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java @@ -44,6 +44,7 @@ import java.util.Locale; public class InputMethodUtils { public static final boolean DEBUG = false; public static final int NOT_A_SUBTYPE_ID = -1; + public static final String SUBTYPE_MODE_ANY = null; public static final String SUBTYPE_MODE_KEYBOARD = "keyboard"; public static final String SUBTYPE_MODE_VOICE = "voice"; private static final String TAG = "InputMethodUtils"; @@ -127,10 +128,23 @@ public class InputMethodUtils { public static ArrayList getDefaultEnabledImes( Context context, boolean isSystemReady, ArrayList imis) { - final ArrayList retval = new ArrayList(); + if (!isSystemReady) { + final ArrayList retval = new ArrayList<>(); + for (int i = 0; i < imis.size(); ++i) { + final InputMethodInfo imi = imis.get(i); + if (isSystemImeThatHasEnglishKeyboardSubtype(imi)) { + retval.add(imi); + } + } + return retval; + } + + final ArrayList retval = new ArrayList<>(); boolean auxilialyImeAdded = false; for (int i = 0; i < imis.size(); ++i) { final InputMethodInfo imi = imis.get(i); + // TODO: We should check isAsciiCapable instead of relying on + // isSystemImeThatHasEnglishKeyboardSubtype(). if (isValidSystemDefaultIme(isSystemReady, imi, context) || isSystemImeThatHasEnglishKeyboardSubtype(imi)) { retval.add(imi); @@ -139,6 +153,7 @@ public class InputMethodUtils { } } } + // If one or more auxiliary input methods are available, OK to stop populating the list. if (auxilialyImeAdded) { return retval; } @@ -164,7 +179,7 @@ public class InputMethodUtils { try { if (imi.isDefault(context) && containsSubtypeOf( imi, context.getResources().getConfiguration().locale.getLanguage(), - null /* mode */)) { + SUBTYPE_MODE_ANY)) { return true; } } catch (Resources.NotFoundException ex) { @@ -179,13 +194,14 @@ public class InputMethodUtils { public static boolean containsSubtypeOf(InputMethodInfo imi, String language, String mode) { final int N = imi.getSubtypeCount(); for (int i = 0; i < N; ++i) { - if (!imi.getSubtypeAt(i).getLocale().startsWith(language)) { + final InputMethodSubtype subtype = imi.getSubtypeAt(i); + if (!subtype.getLocale().startsWith(language)) { continue; } - if(!TextUtils.isEmpty(mode) && !imi.getSubtypeAt(i).getMode().equalsIgnoreCase(mode)) { - continue; + if (mode == SUBTYPE_MODE_ANY || TextUtils.isEmpty(mode) || + mode.equalsIgnoreCase(subtype.getMode())) { + return true; } - return true; } return false; } @@ -212,8 +228,7 @@ public class InputMethodUtils { return subtypes; } - public static InputMethodInfo getMostApplicableDefaultIME( - List enabledImes) { + public static InputMethodInfo getMostApplicableDefaultIME(List enabledImes) { if (enabledImes == null || enabledImes.isEmpty()) { return null; } diff --git a/core/tests/inputmethodtests/src/android/os/InputMethodTest.java b/core/tests/inputmethodtests/src/android/os/InputMethodTest.java index cb85fc5..d56c5a9 100644 --- a/core/tests/inputmethodtests/src/android/os/InputMethodTest.java +++ b/core/tests/inputmethodtests/src/android/os/InputMethodTest.java @@ -53,10 +53,8 @@ public class InputMethodTest extends InstrumentationTestCase { public void testVoiceImes() throws Exception { // locale: en_US assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_US, !IS_SYSTEM_READY, - "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1", - "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme"); + "DummyDefaultEnKeyboardIme"); assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_US, !IS_SYSTEM_READY, - "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1", "DummyDefaultEnKeyboardIme"); assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_US, IS_SYSTEM_READY, "DummyDefaultAutoVoiceIme", "DummyDefaultEnKeyboardIme"); @@ -66,10 +64,8 @@ public class InputMethodTest extends InstrumentationTestCase { // locale: en_GB assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB, !IS_SYSTEM_READY, - "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1", - "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme"); + "DummyDefaultEnKeyboardIme"); assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_GB, !IS_SYSTEM_READY, - "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1", "DummyDefaultEnKeyboardIme"); assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB, IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme"); @@ -79,10 +75,8 @@ public class InputMethodTest extends InstrumentationTestCase { // locale: ja_JP assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP, !IS_SYSTEM_READY, - "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1", - "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme"); + "DummyDefaultEnKeyboardIme"); assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_JA_JP, !IS_SYSTEM_READY, - "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1", "DummyDefaultEnKeyboardIme"); assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP, IS_SYSTEM_READY, "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1", @@ -96,40 +90,35 @@ public class InputMethodTest extends InstrumentationTestCase { public void testKeyboardImes() throws Exception { // locale: en_US assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_US, !IS_SYSTEM_READY, - "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", - "com.android.apps.inputmethod.hindi"); + "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi"); assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_US, IS_SYSTEM_READY, "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi"); // locale: en_GB assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_GB, !IS_SYSTEM_READY, - "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", - "com.android.apps.inputmethod.hindi"); + "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi"); assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_GB, IS_SYSTEM_READY, "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi"); // locale: en_IN assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_IN, !IS_SYSTEM_READY, - "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", - "com.android.apps.inputmethod.hindi"); + "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi"); assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_IN, IS_SYSTEM_READY, "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi"); // locale: hi assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_HI, !IS_SYSTEM_READY, - "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", - "com.android.apps.inputmethod.hindi"); + "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi"); assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_HI, IS_SYSTEM_READY, "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi"); // locale: ja_JP assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_JA_JP, !IS_SYSTEM_READY, - "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", - "com.android.apps.inputmethod.hindi"); + "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi"); assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_JA_JP, IS_SYSTEM_READY, "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.hindi", "com.android.apps.inputmethod.japanese"); -- cgit v1.1