Fix a flaky test.

Corrections depend on the proximity info, which depends
on the layout, which in turn depends on the subtype and
not only the language. Thus, we need to force the whole
subtype for meaningful tests.

Bug: 11142685
Change-Id: I9cf3d948259e0236061454a93ffc2e28c7e0768f
This commit is contained in:
Jean Chalard 2013-11-25 17:06:01 +09:00
parent a78b0f6b9e
commit e629f860d1
3 changed files with 49 additions and 20 deletions

View file

@ -70,38 +70,47 @@ public final class Constants {
public static final class ExtraValue {
/**
* The subtype extra value used to indicate that the subtype keyboard layout is capable
* for typing ASCII characters.
* The subtype extra value used to indicate that this subtype is capable of
* entering ASCII characters.
*/
public static final String ASCII_CAPABLE = "AsciiCapable";
/**
* The subtype extra value used to indicate that the subtype keyboard layout is capable
* for typing EMOJI characters.
* The subtype extra value used to indicate that this subtype is enabled
* when the default subtype is not marked as ascii capable.
*/
public static final String ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE =
"EnabledWhenDefaultIsNotAsciiCapable";
/**
* The subtype extra value used to indicate that this subtype is capable of
* entering emoji characters.
*/
public static final String EMOJI_CAPABLE = "EmojiCapable";
/**
* The subtype extra value used to indicate that the subtype require network connection
* to work.
* The subtype extra value used to indicate that this subtype requires a network
* connection to work.
*/
public static final String REQ_NETWORK_CONNECTIVITY = "requireNetworkConnectivity";
/**
* The subtype extra value used to indicate that the subtype display name contains "%s"
* for replacement mark and it should be replaced by this extra value.
* The subtype extra value used to indicate that the display name of this subtype
* contains a "%s" for printf-like replacement and it should be replaced by
* this extra value.
* This extra value is supported on JellyBean and later.
*/
public static final String UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME =
"UntranslatableReplacementStringInSubtypeName";
/**
* The subtype extra value used to indicate that the subtype keyboard layout set name.
* The subtype extra value used to indicate this subtype keyboard layout set name.
* This extra value is private to LatinIME.
*/
public static final String KEYBOARD_LAYOUT_SET = "KeyboardLayoutSet";
/**
* The subtype extra value used to indicate that the subtype is additional subtype
* The subtype extra value used to indicate that this subtype is an additional subtype
* that the user defined. This extra value is private to LatinIME.
*/
public static final String IS_ADDITIONAL_SUBTYPE = "isAdditionalSubtype";

View file

@ -33,6 +33,7 @@ import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.latin.utils.LocaleUtils;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import java.util.List;
@ -62,7 +63,7 @@ public final class SubtypeSwitcher {
SubtypeLocaleUtils.NO_LANGUAGE, "keyboard", "KeyboardLayoutSet="
+ SubtypeLocaleUtils.QWERTY
+ "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE
+ ",EnabledWhenDefaultIsNotAsciiCapable,"
+ "," + Constants.Subtype.ExtraValue.ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE
+ Constants.Subtype.ExtraValue.EMOJI_CAPABLE,
false /* isAuxiliary */, false /* overridesImplicitlyEnabledSubtype */);
// Caveat: We probably should remove this when we add an Emoji subtype in {@link R.xml.method}.
@ -256,18 +257,23 @@ public final class SubtypeSwitcher {
return mNeedsToDisplayLanguage.getValue();
}
private static Locale sForcedLocaleForTesting = null;
private static InputMethodSubtype sForcedSubtypeForTesting = null;
@UsedForTesting
void forceLocale(final Locale locale) {
sForcedLocaleForTesting = locale;
void forceSubtype(final InputMethodSubtype subtype) {
sForcedSubtypeForTesting = subtype;
}
public Locale getCurrentSubtypeLocale() {
if (null != sForcedLocaleForTesting) return sForcedLocaleForTesting;
if (null != sForcedSubtypeForTesting) {
return LocaleUtils.constructLocaleFromString(sForcedSubtypeForTesting.getLocale());
}
return SubtypeLocaleUtils.getSubtypeLocale(getCurrentSubtype());
}
public InputMethodSubtype getCurrentSubtype() {
if (null != sForcedSubtypeForTesting) {
return sForcedSubtypeForTesting;
}
return mRichImm.getCurrentInputMethodSubtype(getNoLanguageSubtype());
}
@ -279,8 +285,8 @@ public final class SubtypeSwitcher {
if (mNoLanguageSubtype != null) {
return mNoLanguageSubtype;
}
Log.w(TAG, "Can't find no lanugage with QWERTY subtype");
Log.w(TAG, "No input method subtype found; return dummy subtype: "
Log.w(TAG, "Can't find any language with QWERTY subtype");
Log.w(TAG, "No input method subtype found; returning dummy subtype: "
+ DUMMY_NO_LANGUAGE_SUBTYPE);
return DUMMY_NO_LANGUAGE_SUBTYPE;
}
@ -293,8 +299,9 @@ public final class SubtypeSwitcher {
if (mEmojiSubtype != null) {
return mEmojiSubtype;
}
Log.w(TAG, "Can't find Emoji subtype");
Log.w(TAG, "No input method subtype found; return dummy subtype: " + DUMMY_EMOJI_SUBTYPE);
Log.w(TAG, "Can't find emoji subtype");
Log.w(TAG, "No input method subtype found; returning dummy subtype: "
+ DUMMY_EMOJI_SUBTYPE);
return DUMMY_EMOJI_SUBTYPE;
}
}

View file

@ -30,6 +30,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodSubtype;
import android.widget.EditText;
import android.widget.FrameLayout;
@ -37,6 +38,7 @@ import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.utils.LocaleUtils;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import java.util.Locale;
@ -244,7 +246,18 @@ public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> {
protected void changeLanguageWithoutWait(final String locale) {
mEditText.mCurrentLocale = LocaleUtils.constructLocaleFromString(locale);
SubtypeSwitcher.getInstance().forceLocale(mEditText.mCurrentLocale);
final InputMethodSubtype subtype = new InputMethodSubtype(
R.string.subtype_no_language_qwerty, R.drawable.ic_ime_switcher_dark,
locale, "keyboard", "KeyboardLayoutSet="
// TODO: this is forcing a QWERTY keyboard for all locales, which is wrong.
// It's still better than using whatever keyboard is the current one, but we
// should actually use the default keyboard for this locale.
+ SubtypeLocaleUtils.QWERTY
+ "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE
+ "," + Constants.Subtype.ExtraValue.ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE
+ Constants.Subtype.ExtraValue.EMOJI_CAPABLE,
false /* isAuxiliary */, false /* overridesImplicitlyEnabledSubtype */);
SubtypeSwitcher.getInstance().forceSubtype(subtype);
mLatinIME.loadKeyboard();
runMessages();
mKeyboard = mLatinIME.mKeyboardSwitcher.getKeyboard();