android.view.inputmethod.InputMethodInfo#getSubtypeAt ( )源码实例Demo

下面列出了android.view.inputmethod.InputMethodInfo#getSubtypeAt ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: openboard   文件: CustomInputStylePreference.java
public SubtypeLocaleAdapter(final Context context) {
    super(context, android.R.layout.simple_spinner_item);
    setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    final TreeSet<SubtypeLocaleItem> items = new TreeSet<>();
    final InputMethodInfo imi = RichInputMethodManager.getInstance()
            .getInputMethodInfoOfThisIme();
    final int count = imi.getSubtypeCount();
    for (int i = 0; i < count; i++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(i);
        if (DEBUG_SUBTYPE_ID) {
            Log.d(TAG_SUBTYPE, String.format("%-6s 0x%08x %11d %s",
                    subtype.getLocale(), subtype.hashCode(), subtype.hashCode(),
                    SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype)));
        }
        if (subtype.isAsciiCapable()) {
            items.add(new SubtypeLocaleItem(subtype));
        }
    }
    // TODO: Should filter out already existing combinations of locale and layout.
    addAll(items);
}
 
public SubtypeLocaleAdapter(final Context context) {
    super(context, android.R.layout.simple_spinner_item);
    setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    final TreeSet<SubtypeLocaleItem> items = new TreeSet<>();
    final InputMethodInfo imi = RichInputMethodManager.getInstance()
            .getInputMethodInfoOfThisIme();
    final int count = imi.getSubtypeCount();
    for (int i = 0; i < count; i++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(i);
        if (DEBUG_SUBTYPE_ID) {
            Log.d(TAG_SUBTYPE, String.format("%-6s 0x%08x %11d %s",
                    subtype.getLocale(), subtype.hashCode(), subtype.hashCode(),
                    SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype)));
        }
        if (InputMethodSubtypeCompatUtils.isAsciiCapable(subtype)) {
            items.add(new SubtypeLocaleItem(subtype));
        }
    }
    // TODO: Should filter out already existing combinations of locale and layout.
    addAll(items);
}
 
public SubtypeLocaleAdapter(final Context context) {
    super(context, android.R.layout.simple_spinner_item);
    setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    final TreeSet<SubtypeLocaleItem> items = new TreeSet<>();
    final InputMethodInfo imi = RichInputMethodManager.getInstance()
            .getInputMethodInfoOfThisIme();
    final int count = imi.getSubtypeCount();
    for (int i = 0; i < count; i++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(i);
        if (DEBUG_SUBTYPE_ID) {
            Log.d(TAG_SUBTYPE, String.format("%-6s 0x%08x %11d %s",
                    subtype.getLocale(), subtype.hashCode(), subtype.hashCode(),
                    SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype)));
        }
        if (subtype.isAsciiCapable()) {
            items.add(new SubtypeLocaleItem(subtype));
        }
    }
    // TODO: Should filter out already existing combinations of locale and layout.
    addAll(items);
}
 
public SubtypeLocaleAdapter(final Context context) {
    super(context, android.R.layout.simple_spinner_item);
    setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    final TreeSet<SubtypeLocaleItem> items = new TreeSet<>();
    final InputMethodInfo imi = RichInputMethodManager.getInstance()
            .getInputMethodInfoOfThisIme();
    final int count = imi.getSubtypeCount();
    for (int i = 0; i < count; i++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(i);
        if (DEBUG_SUBTYPE_ID) {
            Log.d(TAG_SUBTYPE, String.format("%-6s 0x%08x %11d %s",
                    subtype.getLocale(), subtype.hashCode(), subtype.hashCode(),
                    SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype)));
        }
        if (subtype.isAsciiCapable()) {
            items.add(new SubtypeLocaleItem(subtype));
        }
    }
    // TODO: Should filter out already existing combinations of locale and layout.
    addAll(items);
}
 
@Override
public InputMethodSubtype getLastInputMethodSubtype() {
    if (!calledFromValidUser()) {
        return null;
    }
    synchronized (mMethodMap) {
        final Pair<String, String> lastIme = mSettings.getLastInputMethodAndSubtypeLocked();
        // TODO: Handle the case of the last IME with no subtypes
        if (lastIme == null || TextUtils.isEmpty(lastIme.first)
                || TextUtils.isEmpty(lastIme.second)) return null;
        final InputMethodInfo lastImi = mMethodMap.get(lastIme.first);
        if (lastImi == null) return null;
        try {
            final int lastSubtypeHash = Integer.valueOf(lastIme.second);
            final int lastSubtypeId =
                    InputMethodUtils.getSubtypeIdFromHashCode(lastImi, lastSubtypeHash);
            if (lastSubtypeId < 0 || lastSubtypeId >= lastImi.getSubtypeCount()) {
                return null;
            }
            return lastImi.getSubtypeAt(lastSubtypeId);
        } catch (NumberFormatException e) {
            return null;
        }
    }
}
 
public SubtypeLocaleAdapter(final Context context) {
    super(context, android.R.layout.simple_spinner_item);
    setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    final TreeSet<SubtypeLocaleItem> items = new TreeSet<>();
    final InputMethodInfo imi = RichInputMethodManager.getInstance()
            .getInputMethodInfoOfThisIme();
    final int count = imi.getSubtypeCount();
    for (int i = 0; i < count; i++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(i);
        if (DEBUG_SUBTYPE_ID) {
            Log.d(TAG_SUBTYPE, String.format("%-6s 0x%08x %11d %s",
                    subtype.getLocale(), subtype.hashCode(), subtype.hashCode(),
                    SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype)));
        }
        if (InputMethodSubtypeCompatUtils.isAsciiCapable(subtype)) {
            items.add(new SubtypeLocaleItem(subtype));
        }
    }
    // TODO: Should filter out already existing combinations of locale and layout.
    addAll(items);
}
 
源代码7 项目: openboard   文件: RichInputMethodManager.java
private static boolean isAuxiliaryIme(final InputMethodInfo imi) {
    final int count = imi.getSubtypeCount();
    if (count == 0) {
        return false;
    }
    for (int index = 0; index < count; index++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(index);
        if (!subtype.isAuxiliary()) {
            return false;
        }
    }
    return true;
}
 
源代码8 项目: openboard   文件: RichInputMethodManager.java
public InputMethodSubtype findSubtypeByLocaleAndKeyboardLayoutSet(final String localeString,
        final String keyboardLayoutSetName) {
    final InputMethodInfo myImi = getInputMethodInfoOfThisIme();
    final int count = myImi.getSubtypeCount();
    for (int i = 0; i < count; i++) {
        final InputMethodSubtype subtype = myImi.getSubtypeAt(i);
        final String layoutName = SubtypeLocaleUtils.getKeyboardLayoutSetName(subtype);
        if (localeString.equals(subtype.getLocale())
                && keyboardLayoutSetName.equals(layoutName)) {
            return subtype;
        }
    }
    return null;
}
 
private static boolean isAuxiliaryIme(final InputMethodInfo imi) {
    final int count = imi.getSubtypeCount();
    if (count == 0) {
        return false;
    }
    for (int index = 0; index < count; index++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(index);
        if (!subtype.isAuxiliary()) {
            return false;
        }
    }
    return true;
}
 
public InputMethodSubtype findSubtypeByLocaleAndKeyboardLayoutSet(final String localeString,
        final String keyboardLayoutSetName) {
    final InputMethodInfo myImi = getInputMethodInfoOfThisIme();
    final int count = myImi.getSubtypeCount();
    for (int i = 0; i < count; i++) {
        final InputMethodSubtype subtype = myImi.getSubtypeAt(i);
        final String layoutName = SubtypeLocaleUtils.getKeyboardLayoutSetName(subtype);
        if (localeString.equals(subtype.getLocale())
                && keyboardLayoutSetName.equals(layoutName)) {
            return subtype;
        }
    }
    return null;
}
 
源代码11 项目: simple-keyboard   文件: RichInputMethodManager.java
private static boolean isAuxiliaryIme(final InputMethodInfo imi) {
    final int count = imi.getSubtypeCount();
    if (count == 0) {
        return false;
    }
    for (int index = 0; index < count; index++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(index);
        if (!subtype.isAuxiliary()) {
            return false;
        }
    }
    return true;
}
 
private static boolean isAuxiliaryIme(final InputMethodInfo imi) {
    final int count = imi.getSubtypeCount();
    if (count == 0) {
        return false;
    }
    for (int index = 0; index < count; index++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(index);
        if (!subtype.isAuxiliary()) {
            return false;
        }
    }
    return true;
}
 
public InputMethodSubtype findSubtypeByLocaleAndKeyboardLayoutSet(final String localeString,
        final String keyboardLayoutSetName) {
    final InputMethodInfo myImi = getInputMethodInfoOfThisIme();
    final int count = myImi.getSubtypeCount();
    for (int i = 0; i < count; i++) {
        final InputMethodSubtype subtype = myImi.getSubtypeAt(i);
        final String layoutName = SubtypeLocaleUtils.getKeyboardLayoutSetName(subtype);
        if (localeString.equals(subtype.getLocale())
                && keyboardLayoutSetName.equals(layoutName)) {
            return subtype;
        }
    }
    return null;
}
 
源代码14 项目: Indic-Keyboard   文件: KeyboardTextsSetTests.java
@Override
protected void setUp() throws Exception {
    super.setUp();
    RichInputMethodManager.init(getContext());
    final RichInputMethodManager richImm = RichInputMethodManager.getInstance();

    final ArrayList<InputMethodSubtype> allSubtypesList = new ArrayList<>();
    final InputMethodInfo imi = richImm.getInputMethodInfoOfThisIme();
    final int subtypeCount = imi.getSubtypeCount();
    for (int index = 0; index < subtypeCount; index++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(index);
        allSubtypesList.add(subtype);
    }
    mAllSubtypesList = Collections.unmodifiableList(allSubtypesList);
}
 
private void setSelectedInputMethodAndSubtypeLocked(InputMethodInfo imi, int subtypeId,
        boolean setSubtypeOnly) {
    // Update the history of InputMethod and Subtype
    mSettings.saveCurrentInputMethodAndSubtypeToHistory(mCurMethodId, mCurrentSubtype);

    // Set Subtype here
    if (imi == null || subtypeId < 0) {
        mSettings.putSelectedSubtype(NOT_A_SUBTYPE_ID);
        mCurrentSubtype = null;
    } else {
        if (subtypeId < imi.getSubtypeCount()) {
            InputMethodSubtype subtype = imi.getSubtypeAt(subtypeId);
            mSettings.putSelectedSubtype(subtype.hashCode());
            mCurrentSubtype = subtype;
        } else {
            mSettings.putSelectedSubtype(NOT_A_SUBTYPE_ID);
            // If the subtype is not specified, choose the most applicable one
            mCurrentSubtype = getCurrentInputMethodSubtypeLocked();
        }
    }

    // Workaround.
    // ASEC is not ready in the IMMS constructor. Accordingly, forward-locked
    // IMEs are not recognized and considered uninstalled.
    // Actually, we can't move everything after SystemReady because
    // IMMS needs to run in the encryption lock screen. So, we just skip changing
    // the default IME here and try cheking the default IME again in systemReady().
    // TODO: Do nothing before system ready and implement a separated logic for
    // the encryption lock screen.
    // TODO: ASEC should be ready before IMMS is instantiated.
    if (mSystemReady && !setSubtypeOnly) {
        // Set InputMethod here
        mSettings.putSelectedInputMethod(imi != null ? imi.getId() : "");
    }
}
 
源代码16 项目: Indic-Keyboard   文件: RichInputMethodManager.java
private static boolean isAuxiliaryIme(final InputMethodInfo imi) {
    final int count = imi.getSubtypeCount();
    if (count == 0) {
        return false;
    }
    for (int index = 0; index < count; index++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(index);
        if (!subtype.isAuxiliary()) {
            return false;
        }
    }
    return true;
}
 
源代码17 项目: Indic-Keyboard   文件: RichInputMethodManager.java
public InputMethodSubtype findSubtypeByLocaleAndKeyboardLayoutSet(final String localeString,
        final String keyboardLayoutSetName) {
    final InputMethodInfo myImi = getInputMethodInfoOfThisIme();
    final int count = myImi.getSubtypeCount();
    for (int i = 0; i < count; i++) {
        final InputMethodSubtype subtype = myImi.getSubtypeAt(i);
        final String layoutName = SubtypeLocaleUtils.getKeyboardLayoutSetName(subtype);
        if (localeString.equals(subtype.getLocale())
                && keyboardLayoutSetName.equals(layoutName)) {
            return subtype;
        }
    }
    return null;
}
 
@Override
protected void setUp() throws Exception {
    super.setUp();
    final Context context = getContext();
    mRes = context.getResources();
    RichInputMethodManager.init(context);
    mRichImm = RichInputMethodManager.getInstance();

    // Save and reset additional subtypes
    mSavedAddtionalSubtypes = mRichImm.getAdditionalSubtypes();
    final InputMethodSubtype[] predefinedAddtionalSubtypes =
            AdditionalSubtypeUtils.createAdditionalSubtypesArray(
                    AdditionalSubtypeUtils.createPrefSubtypes(
                            mRes.getStringArray(R.array.predefined_subtypes)));
    mRichImm.setAdditionalInputMethodSubtypes(predefinedAddtionalSubtypes);

    final InputMethodInfo imi = mRichImm.getInputMethodInfoOfThisIme();
    final int subtypeCount = imi.getSubtypeCount();
    for (int index = 0; index < subtypeCount; index++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(index);
        mSubtypesList.add(new RichInputMethodSubtype(subtype));
    }

    EN_US = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.US.toString(), "qwerty"));
    EN_GB = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.UK.toString(), "qwerty"));
    ES_US = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "es_US", "spanish"));
    FR = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.FRENCH.toString(), "azerty"));
    FR_CA = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.CANADA_FRENCH.toString(), "qwerty"));
    FR_CH = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "fr_CH", "swiss"));
    DE = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.GERMAN.toString(), "qwertz"));
    DE_CH = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "de_CH", "swiss"));
    HI = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "hi", "hindi"));
    SR = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "sr", "south_slavic"));
    ZZ = new RichInputMethodSubtype(mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            SubtypeLocaleUtils.NO_LANGUAGE, "qwerty"));
    DE_QWERTY = new RichInputMethodSubtype(
            AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                Locale.GERMAN.toString(), "qwerty"));
    FR_QWERTZ = new RichInputMethodSubtype(
            AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                Locale.FRENCH.toString(), "qwertz"));
    EN_US_AZERTY = new RichInputMethodSubtype(
            AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                Locale.US.toString(), "azerty"));
    EN_UK_DVORAK = new RichInputMethodSubtype(
            AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                Locale.UK.toString(), "dvorak"));
    ES_US_COLEMAK = new RichInputMethodSubtype(
            AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                "es_US", "colemak"));
    ZZ_AZERTY = new RichInputMethodSubtype(
            AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                SubtypeLocaleUtils.NO_LANGUAGE, "azerty"));
    ZZ_PC = new RichInputMethodSubtype(
            AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                SubtypeLocaleUtils.NO_LANGUAGE, "pcqwerty"));

    final InputMethodSubtype hiLatn = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "hi_ZZ", "qwerty");
    if (hiLatn != null) {
        HI_LATN = new RichInputMethodSubtype(hiLatn);
        HI_LATN_DVORAK = new RichInputMethodSubtype(
                AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                        "hi_ZZ", "dvorak"));
    }
    final InputMethodSubtype srLatn = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "sr_ZZ", "serbian_qwertz");
    if (srLatn != null) {
        SR_LATN = new RichInputMethodSubtype(srLatn);
        SR_LATN_QWERTY = new RichInputMethodSubtype(
                AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                        "sr_ZZ", "qwerty"));
    }
}
 
void setInputMethodLocked(String id, int subtypeId) {
    InputMethodInfo info = mMethodMap.get(id);
    if (info == null) {
        throw new IllegalArgumentException("Unknown id: " + id);
    }

    // See if we need to notify a subtype change within the same IME.
    if (id.equals(mCurMethodId)) {
        final int subtypeCount = info.getSubtypeCount();
        if (subtypeCount <= 0) {
            return;
        }
        final InputMethodSubtype oldSubtype = mCurrentSubtype;
        final InputMethodSubtype newSubtype;
        if (subtypeId >= 0 && subtypeId < subtypeCount) {
            newSubtype = info.getSubtypeAt(subtypeId);
        } else {
            // If subtype is null, try to find the most applicable one from
            // getCurrentInputMethodSubtype.
            newSubtype = getCurrentInputMethodSubtypeLocked();
        }
        if (newSubtype == null || oldSubtype == null) {
            Slog.w(TAG, "Illegal subtype state: old subtype = " + oldSubtype
                    + ", new subtype = " + newSubtype);
            return;
        }
        if (newSubtype != oldSubtype) {
            setSelectedInputMethodAndSubtypeLocked(info, subtypeId, true);
            if (mCurMethod != null) {
                try {
                    refreshImeWindowVisibilityLocked();
                    mCurMethod.changeInputMethodSubtype(newSubtype);
                } catch (RemoteException e) {
                    Slog.w(TAG, "Failed to call changeInputMethodSubtype");
                }
            }
        }
        return;
    }

    // Changing to a different IME.
    final long ident = Binder.clearCallingIdentity();
    try {
        // Set a subtype to this input method.
        // subtypeId the name of a subtype which will be set.
        setSelectedInputMethodAndSubtypeLocked(info, subtypeId, false);
        // mCurMethodId should be updated after setSelectedInputMethodAndSubtypeLocked()
        // because mCurMethodId is stored as a history in
        // setSelectedInputMethodAndSubtypeLocked().
        mCurMethodId = id;

        if (ActivityManagerNative.isSystemReady()) {
            Intent intent = new Intent(Intent.ACTION_INPUT_METHOD_CHANGED);
            intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
            intent.putExtra("input_method_id", id);
            mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
        }
        unbindCurrentClientLocked();
    } finally {
        Binder.restoreCallingIdentity(ident);
    }
}
 
源代码20 项目: Indic-Keyboard   文件: SubtypeLocaleUtilsTests.java
@Override
protected void setUp() throws Exception {
    super.setUp();
    final Context context = getContext();
    mRes = context.getResources();
    RichInputMethodManager.init(context);
    mRichImm = RichInputMethodManager.getInstance();

    // Save and reset additional subtypes
    mSavedAddtionalSubtypes = mRichImm.getAdditionalSubtypes();
    final InputMethodSubtype[] predefinedAddtionalSubtypes =
            AdditionalSubtypeUtils.createAdditionalSubtypesArray(
                    AdditionalSubtypeUtils.createPrefSubtypes(
                            mRes.getStringArray(R.array.predefined_subtypes)));
    mRichImm.setAdditionalInputMethodSubtypes(predefinedAddtionalSubtypes);

    final InputMethodInfo imi = mRichImm.getInputMethodInfoOfThisIme();
    final int subtypeCount = imi.getSubtypeCount();
    for (int index = 0; index < subtypeCount; index++) {
        final InputMethodSubtype subtype = imi.getSubtypeAt(index);
        mSubtypesList.add(new RichInputMethodSubtype(subtype));
    }

    EN_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.US.toString(), "qwerty");
    EN_GB = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.UK.toString(), "qwerty");
    ES_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "es_US", "spanish");
    FR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.FRENCH.toString(), "azerty");
    FR_CA = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.CANADA_FRENCH.toString(), "qwerty");
    FR_CH = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "fr_CH", "swiss");
    DE = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            Locale.GERMAN.toString(), "qwertz");
    DE_CH = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "de_CH", "swiss");
    HI = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "hi", "hindi");
    SR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            "sr", "south_slavic");
    ZZ = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
            SubtypeLocaleUtils.NO_LANGUAGE, "qwerty");
    DE_QWERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
            Locale.GERMAN.toString(), "qwerty");
    FR_QWERTZ = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
            Locale.FRENCH.toString(), "qwertz");
    EN_US_AZERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
            Locale.US.toString(), "azerty");
    EN_UK_DVORAK = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
            Locale.UK.toString(), "dvorak");
    ES_US_COLEMAK = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
            "es_US", "colemak");
    ZZ_AZERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
            SubtypeLocaleUtils.NO_LANGUAGE, "azerty");
    ZZ_PC = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
            SubtypeLocaleUtils.NO_LANGUAGE, "pcqwerty");

    HI_LATN = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet("hi_ZZ", "qwerty");
    if (HI_LATN != null) {
        HI_LATN_DVORAK = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                "hi_ZZ", "dvorak");
    }
    SR_LATN = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet("sr_ZZ", "serbian_qwertz");
    if (SR_LATN != null) {
        SR_LATN_QWERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
                "sr_ZZ", "qwerty");
    }
}