rename some keyboard layouts, simplify layout names, enable "hidden" layouts

This commit is contained in:
Helium314 2023-12-21 18:27:49 +01:00
parent c943082f98
commit 461eb2a551
8 changed files with 142 additions and 232 deletions

View file

@ -35,7 +35,7 @@ import java.util.Locale
* Functional keys are pre-defined and can't be changed, with exception of comma, period and similar
* keys in symbol layouts.
* By default, all normal keys have the same width and flags, which may cause issues with the
* requirements of certain non-latin languages. todo: add labelFlags to Json parser, or determine automatically?
* requirements of certain non-latin languages.
*/
abstract class KeyboardParser(private val params: KeyboardParams, private val context: Context) {
private val infos = layoutInfos(params)
@ -754,7 +754,7 @@ abstract class KeyboardParser(private val params: KeyboardParams, private val co
fun parseFromAssets(params: KeyboardParams, context: Context): ArrayList<ArrayList<KeyParams>> {
val id = params.mId
val layoutName = params.mId.mSubtype.keyboardLayoutSetName
val layoutName = params.mId.mSubtype.keyboardLayoutSetName.substringBefore("+")
val layoutFileNames = context.assets.list("layouts")!!
return when {
id.mElementId == KeyboardId.ELEMENT_SYMBOLS && ScriptUtils.getScriptFromSpellCheckerLocale(params.mId.locale) == ScriptUtils.SCRIPT_ARABIC
@ -769,22 +769,12 @@ abstract class KeyboardParser(private val params: KeyboardParams, private val co
id.mElementId == KeyboardId.ELEMENT_PHONE -> JsonKeyboardParser(params, context).parseLayoutFromAssets("phone")
id.mElementId == KeyboardId.ELEMENT_PHONE_SYMBOLS -> JsonKeyboardParser(params, context).parseLayoutFromAssets("phone_symbols")
layoutFileNames.contains("$layoutName.json") -> JsonKeyboardParser(params, context).parseLayoutFromAssets(layoutName)
layoutFileNames.contains("${getSimpleLayoutName(layoutName, params)}.txt")
layoutFileNames.contains("$layoutName.txt")
-> SimpleKeyboardParser(params, context).parseLayoutFromAssets(layoutName)
else -> throw IllegalStateException("can't parse layout $layoutName with id $id and elementId ${id.mElementId}")
}
}
@JvmStatic // unsupported without JvmStatic
// todo: should be removed in the end (after removing old parser), and the internal layout names changed for easier finding
// currently it's spread out everywhere... method.xml, locale_and_extra_value_to_keyboard_layout_set_map, getKeyboardLayoutNameForLocale, ...
protected fun getSimpleLayoutName(layoutName: String, params: KeyboardParams): String = when (layoutName) {
"swiss", "german", "serbian_qwertz" -> "qwertz"
"nordic", "spanish" -> if (params.mId.locale.language == "eo") "eo" else "qwerty"
"south_slavic", "east_slavic" -> params.mId.locale.language // layouts are split per language now, much less convoluted
else -> layoutName
}
// todo: layoutInfos should be stored in method.xml (imeSubtypeExtraValue)
// or somewhere else... some replacement for keyboard_layout_set xml maybe
// move it after old parser is removed

View file

@ -6,6 +6,7 @@ import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardParams
import org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.floris.KeyData
import org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.floris.toTextKey
import org.dslul.openboard.inputmethod.latin.common.splitOnWhitespace
import org.dslul.openboard.inputmethod.latin.utils.SubtypeLocaleUtils
/**
* Parser for simple layouts, defined only as rows of (normal) keys with moreKeys.
@ -14,12 +15,10 @@ import org.dslul.openboard.inputmethod.latin.common.splitOnWhitespace
* merged with defaults.
*/
class SimpleKeyboardParser(private val params: KeyboardParams, private val context: Context) : KeyboardParser(params, context) {
private val addExtraKeys = // todo (after removing old parser): add turkish layout that maps to qwerty, but enables extra keys
params.mId.isAlphabetKeyboard && params.mId.locale.language != "eo"
&& params.mId.mSubtype.keyboardLayoutSetName in listOf("nordic", "spanish", "german", "swiss", "serbian_qwertz")
private val addExtraKeys = params.mId.mSubtype.keyboardLayoutSetName.endsWith("+")
override fun getLayoutFromAssets(layoutName: String) =
context.assets.open("layouts/${getSimpleLayoutName(layoutName, params)}.txt").reader().readText()
context.assets.open("layouts/$layoutName.txt").reader().readText()
override fun parseCoreLayout(layoutContent: String): MutableList<List<KeyData>> {
val rowStrings = layoutContent.replace("\r\n", "\n").split("\n\n")

View file

@ -65,6 +65,12 @@ public final class Constants {
*/
public static final String KEYBOARD_MODE = "keyboard";
// some extra values:
// TrySuppressingImeSwitcher: not documented, but used in Android source
// AsciiCapable: not used, but recommended for Android 9- because of known issues
// SupportTouchPositionCorrection: never read, never used outside AOSP keyboard -> can be removed?
// EmojiCapable: there is some description in Constants, but actually it's never read
// KeyboardLayoutSet: obvious
public static final class ExtraValue {
/**
* The subtype extra value used to indicate that this subtype is capable of

View file

@ -56,20 +56,7 @@ fun addEnabledSubtype(prefs: SharedPreferences, subtype: InputMethodSubtype) {
/** returns whether subtype was actually removed, does not remove last subtype */
fun removeEnabledSubtype(prefs: SharedPreferences, subtype: InputMethodSubtype) {
require(initialized)
val subtypeString = subtype.prefString()
val oldSubtypeString = prefs.getString(Settings.PREF_ENABLED_INPUT_STYLES, "")!!
val newString = (oldSubtypeString.split(SUBTYPE_SEPARATOR) - subtypeString).joinToString(SUBTYPE_SEPARATOR)
if (newString == oldSubtypeString)
return // already removed
prefs.edit { putString(Settings.PREF_ENABLED_INPUT_STYLES, newString) }
if (subtypeString == prefs.getString(Settings.PREF_SELECTED_INPUT_STYLE, "")) {
// switch subtype if the currently used one has been disabled
val nextSubtype = RichInputMethodManager.getInstance().getNextSubtypeInThisIme(true)
if (subtypeString == nextSubtype?.prefString())
KeyboardSwitcher.getInstance().switchToSubtype(getDefaultEnabledSubtypes().first())
else
KeyboardSwitcher.getInstance().switchToSubtype(nextSubtype)
}
removeEnabledSubtype(prefs, subtype.prefString())
enabledSubtypes.remove(subtype)
RichInputMethodManager.getInstance().refreshSubtypeCaches()
}
@ -246,6 +233,8 @@ private fun loadEnabledSubtypes(context: Context) {
if (subtype == null) {
if (DebugFlags.DEBUG_ENABLED)
Toast.makeText(context, "subtype $localeAndLayout could not be loaded", Toast.LENGTH_LONG).show()
else // don't remove in debug mode
removeEnabledSubtype(prefs, localeAndLayout.joinToString(LOCALE_LAYOUT_SEPARATOR))
continue
}
@ -253,6 +242,22 @@ private fun loadEnabledSubtypes(context: Context) {
}
}
private fun removeEnabledSubtype(prefs: SharedPreferences, subtypeString: String) {
val oldSubtypeString = prefs.getString(Settings.PREF_ENABLED_INPUT_STYLES, "")!!
val newString = (oldSubtypeString.split(SUBTYPE_SEPARATOR) - subtypeString).joinToString(SUBTYPE_SEPARATOR)
if (newString == oldSubtypeString)
return // already removed
prefs.edit { putString(Settings.PREF_ENABLED_INPUT_STYLES, newString) }
if (subtypeString == prefs.getString(Settings.PREF_SELECTED_INPUT_STYLE, "")) {
// switch subtype if the currently used one has been disabled
val nextSubtype = RichInputMethodManager.getInstance().getNextSubtypeInThisIme(true)
if (subtypeString == nextSubtype?.prefString())
KeyboardSwitcher.getInstance().switchToSubtype(getDefaultEnabledSubtypes().first())
else
KeyboardSwitcher.getInstance().switchToSubtype(nextSubtype)
}
}
var initialized = false
private set
private val enabledSubtypes = mutableListOf<InputMethodSubtype>()

View file

@ -92,33 +92,23 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
return mRecommendedThreshold;
}
// todo: this needs to be adjusted!
private static String getKeyboardLayoutNameForLocale(final Locale locale) {
// See b/19963288.
if (locale.getLanguage().equals("sr") || locale.getLanguage().equals("mk")) {
return "south_slavic";
return locale.getLanguage();
}
final int script = ScriptUtils.getScriptFromSpellCheckerLocale(locale);
switch (script) {
case ScriptUtils.SCRIPT_LATIN:
return "qwerty";
case ScriptUtils.SCRIPT_ARMENIAN:
return "armenian_phonetic";
case ScriptUtils.SCRIPT_CYRILLIC:
return "east_slavic";
case ScriptUtils.SCRIPT_GREEK:
return "greek";
case ScriptUtils.SCRIPT_HEBREW:
return "hebrew";
case ScriptUtils.SCRIPT_BULGARIAN:
return "bulgarian";
case ScriptUtils.SCRIPT_GEORGIAN:
return "georgian";
case ScriptUtils.SCRIPT_BENGALI:
return "bengali_unijoy";
default:
throw new RuntimeException("Wrong script supplied: " + script);
}
return switch (script) {
case ScriptUtils.SCRIPT_LATIN -> "qwerty";
case ScriptUtils.SCRIPT_ARMENIAN -> "armenian_phonetic";
case ScriptUtils.SCRIPT_CYRILLIC -> "ru";
case ScriptUtils.SCRIPT_GREEK -> "greek";
case ScriptUtils.SCRIPT_HEBREW -> "hebrew";
case ScriptUtils.SCRIPT_BULGARIAN -> "bulgarian";
case ScriptUtils.SCRIPT_GEORGIAN -> "georgian";
case ScriptUtils.SCRIPT_BENGALI -> "bengali_unijoy";
default -> throw new RuntimeException("Wrong script supplied: " + script);
};
}
@Override

View file

@ -8,7 +8,6 @@ package org.dslul.openboard.inputmethod.latin.utils;
import android.content.Context;
import android.content.res.Resources;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import android.view.inputmethod.InputMethodSubtype;
import org.dslul.openboard.inputmethod.latin.R;
@ -51,27 +50,16 @@ public final class SubtypeLocaleUtils {
// Keyboard layout to subtype name resource id map.
private static final HashMap<String, Integer> sKeyboardLayoutToNameIdsMap = new HashMap<>();
// Exceptional locale whose name should be displayed in Locale.ROOT.
private static final HashMap<String, Integer> sExceptionalLocaleDisplayedInRootLocale =
new HashMap<>();
private static final HashMap<String, Integer> sExceptionalLocaleDisplayedInRootLocale = new HashMap<>();
// Exceptional locale to subtype name resource id map.
private static final HashMap<String, Integer> sExceptionalLocaleToNameIdsMap = new HashMap<>();
// Exceptional locale to subtype name with layout resource id map.
private static final HashMap<String, Integer> sExceptionalLocaleToWithLayoutNameIdsMap =
new HashMap<>();
private static final String SUBTYPE_NAME_RESOURCE_PREFIX =
"string/subtype_";
private static final String SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX =
"string/subtype_generic_";
private static final String SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX =
"string/subtype_with_layout_";
private static final String SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX =
"string/subtype_no_language_";
private static final String SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX =
"string/subtype_in_root_locale_";
// Keyboard layout set name for the subtypes that don't have a keyboardLayoutSet extra value.
// This is for compatibility to keep the same subtype ids as pre-JellyBean.
private static final HashMap<String, String> sLocaleAndExtraValueToKeyboardLayoutSetMap =
new HashMap<>();
private static final HashMap<String, Integer> sExceptionalLocaleToWithLayoutNameIdsMap = new HashMap<>();
private static final String SUBTYPE_NAME_RESOURCE_PREFIX = "string/subtype_";
private static final String SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX = "string/subtype_generic_";
private static final String SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX = "string/subtype_with_layout_";
private static final String SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX = "string/subtype_no_language_";
private static final String SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX = "string/subtype_in_root_locale_";
private SubtypeLocaleUtils() {
// Intentional empty constructor for utility class.
@ -80,7 +68,7 @@ public final class SubtypeLocaleUtils {
// Note that this initialization method can be called multiple times.
public static void init(final Context context) {
synchronized (sInitializeLock) {
if (sInitialized == false) {
if (!sInitialized) {
initLocked(context);
sInitialized = true;
}
@ -93,8 +81,7 @@ public final class SubtypeLocaleUtils {
sResources = res;
final String[] predefinedLayoutSet = res.getStringArray(R.array.predefined_layouts);
final String[] layoutDisplayNames = res.getStringArray(
R.array.predefined_layout_display_names);
final String[] layoutDisplayNames = res.getStringArray(R.array.predefined_layout_display_names);
for (int i = 0; i < predefinedLayoutSet.length; i++) {
final String layoutName = predefinedLayoutSet[i];
sKeyboardLayoutToDisplayNameMap.put(layoutName, layoutDisplayNames[i]);
@ -103,42 +90,27 @@ public final class SubtypeLocaleUtils {
sKeyboardLayoutToNameIdsMap.put(layoutName, resId);
// Register subtype name resource id of "No language" with key "zz_<layout>"
final String noLanguageResName = SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX + layoutName;
final int noLanguageResId = res.getIdentifier(
noLanguageResName, null, RESOURCE_PACKAGE_NAME);
final int noLanguageResId = res.getIdentifier(noLanguageResName, null, RESOURCE_PACKAGE_NAME);
final String key = getNoLanguageLayoutKey(layoutName);
sKeyboardLayoutToNameIdsMap.put(key, noLanguageResId);
}
final String[] exceptionalLocaleInRootLocale = res.getStringArray(
R.array.subtype_locale_displayed_in_root_locale);
for (int i = 0; i < exceptionalLocaleInRootLocale.length; i++) {
final String localeString = exceptionalLocaleInRootLocale[i];
final String[] exceptionalLocaleInRootLocale = res.getStringArray(R.array.subtype_locale_displayed_in_root_locale);
for (final String localeString : exceptionalLocaleInRootLocale) {
final String resourceName = SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX + localeString;
final int resId = res.getIdentifier(resourceName, null, RESOURCE_PACKAGE_NAME);
sExceptionalLocaleDisplayedInRootLocale.put(localeString, resId);
}
final String[] exceptionalLocales = res.getStringArray(
R.array.subtype_locale_exception_keys);
for (int i = 0; i < exceptionalLocales.length; i++) {
final String localeString = exceptionalLocales[i];
final String[] exceptionalLocales = res.getStringArray(R.array.subtype_locale_exception_keys);
for (final String localeString : exceptionalLocales) {
final String resourceName = SUBTYPE_NAME_RESOURCE_PREFIX + localeString;
final int resId = res.getIdentifier(resourceName, null, RESOURCE_PACKAGE_NAME);
sExceptionalLocaleToNameIdsMap.put(localeString, resId);
final String resourceNameWithLayout =
SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX + localeString;
final int resIdWithLayout = res.getIdentifier(
resourceNameWithLayout, null, RESOURCE_PACKAGE_NAME);
final String resourceNameWithLayout = SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX + localeString;
final int resIdWithLayout = res.getIdentifier(resourceNameWithLayout, null, RESOURCE_PACKAGE_NAME);
sExceptionalLocaleToWithLayoutNameIdsMap.put(localeString, resIdWithLayout);
}
final String[] keyboardLayoutSetMap = res.getStringArray(
R.array.locale_and_extra_value_to_keyboard_layout_set_map);
for (int i = 0; i + 1 < keyboardLayoutSetMap.length; i += 2) {
final String key = keyboardLayoutSetMap[i];
final String keyboardLayoutSet = keyboardLayoutSetMap[i + 1];
sLocaleAndExtraValueToKeyboardLayoutSetMap.put(key, keyboardLayoutSet);
}
}
public static boolean isExceptionalLocale(final String localeString) {
@ -304,8 +276,7 @@ public final class SubtypeLocaleUtils {
}
@Nullable
public static String getKeyboardLayoutSetDisplayName(
@NonNull final InputMethodSubtype subtype) {
public static String getKeyboardLayoutSetDisplayName(@NonNull final InputMethodSubtype subtype) {
final String layoutName = getKeyboardLayoutSetName(subtype);
return getKeyboardLayoutSetDisplayName(layoutName);
}
@ -318,17 +289,12 @@ public final class SubtypeLocaleUtils {
@NonNull
public static String getKeyboardLayoutSetName(final InputMethodSubtype subtype) {
String keyboardLayoutSet = subtype.getExtraValueOf(KEYBOARD_LAYOUT_SET);
if (keyboardLayoutSet == null) {
// This subtype doesn't have a keyboardLayoutSet extra value, so lookup its keyboard
// layout set in sLocaleAndExtraValueToKeyboardLayoutSetMap to keep it compatible with
// pre-JellyBean.
final String key = subtype.getLocale() + ":" + subtype.getExtraValue();
keyboardLayoutSet = sLocaleAndExtraValueToKeyboardLayoutSetMap.get(key);
if (keyboardLayoutSet == null && subtype.isAsciiCapable()) {
keyboardLayoutSet = QWERTY;
}
// TODO: Remove this null check when InputMethodManager.getCurrentInputMethodSubtype is
// fixed.
// TODO: Remove this null check when InputMethodManager.getCurrentInputMethodSubtype is fixed.
if (keyboardLayoutSet == null) {
android.util.Log.w(TAG, "KeyboardLayoutSet not found, use QWERTY: " +
Log.w(TAG, "KeyboardLayoutSet not found, use QWERTY: " +
"locale=" + subtype.getLocale() + " extraValue=" + subtype.getExtraValue());
return QWERTY;
}

View file

@ -82,51 +82,6 @@
<!-- Description for Arabic (PC) subtype. -->
<string name="subtype_arabic_pc" translatable="false">%s (PC)</string>
<!-- Compatibility map from subtypeLocale:subtypeExtraValue to keyboardLayoutSet -->
<string-array name="locale_and_extra_value_to_keyboard_layout_set_map">
<item>en_US:TrySuppressingImeSwitcher,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwerty</item>
<item>en_GB:TrySuppressingImeSwitcher,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwerty</item>
<item>ar:SupportTouchPositionCorrection,EmojiCapable</item>
<item>arabic</item>
<item>cs:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwertz</item>
<item>da:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>nordic</item>
<item>de:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwertz</item>
<item>es:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>spanish</item>
<item>fi:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>nordic</item>
<item>fr:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>azerty</item>
<item>fr_CA:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwerty</item>
<item>hr:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwertz</item>
<item>hu:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwertz</item>
<item>it:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwerty</item>
<item>iw:SupportTouchPositionCorrection,EmojiCapable</item>
<item>hebrew</item>
<item>nb:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>nordic</item>
<item>nl:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwerty</item>
<item>pl:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwerty</item>
<item>ru:SupportTouchPositionCorrection,EmojiCapable</item>
<item>east_slavic</item>
<item>sr:SupportTouchPositionCorrection,EmojiCapable</item>
<item>south_slavic</item>
<item>sv:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>nordic</item>
<item>tr:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item>
<item>qwerty</item>
</string-array>
<!-- permission name as string to avoid issues with debug build -->
<string name="hide_soft_input_permission">org.dslul.openboard.inputmethod.latin.HIDE_SOFT_INPUT</string>
<!-- App slogan-->

View file

@ -14,36 +14,36 @@
ar: Arabic/arabic
ar: Arabic/arabic_pc
az_AZ: Azerbaijani (Azerbaijan)/qwerty
be_BY: Belarusian (Belarus)/east_slavic
be_BY: Belarusian (Belarus)/be
bg: Bulgarian/bulgarian
bg: Bulgarian/bulgarian_bds
bg: Bulgarian/bulgarian_bekl
bn_BD: Bengali (Bangladesh)/bengali_unijoy
bn_BD: Bengali (Bangladesh) (Akkhor)/bengali_akkhor
bn_IN: Bengali (India)/bengali
ca: Catalan/spanish
ca: Catalan/qwerty+
cs: Czech/qwertz
da: Danish/nordic
da: Danish/qwerty+
de: German/qwertz
de_DE: German (Germany)/german
de_CH: German (Switzerland)/swiss
de_DE: German (Germany)/qwertz+
de_CH: German (Switzerland)/qwertz+
el: Greek/greek
en_AU: English (Australia)/qwerty
en_IN: English (India)/qwerty
en_US: English (United States)/qwerty
en_GB: English (Great Britain)/qwerty
eo: Esperanto/spanish
es: Spanish/spanish
es_US: Spanish (United States)/spanish
es_419: Spanish (Latin America)/spanish
et_EE: Estonian (Estonia)/nordic
eu_ES: Basque (Spain)/spanish
eo: Esperanto/qwerty+
es: Spanish/qwerty+
es_US: Spanish (United States)/qwerty+
es_419: Spanish (Latin America)/qwerty+
et_EE: Estonian (Estonia)/qwerty+
eu_ES: Basque (Spain)/qwerty+
fa: Persian/farsi
fi: Finnish/nordic
fi: Finnish/qwerty+
fr: French/azerty
fr_CA: French (Canada)/qwerty
fr_CH: French (Switzerland)/swiss
gl_ES: Galician (Spain)/spanish
fr_CH: French (Switzerland)/qwertz+
gl_ES: Galician (Spain)/qwerty+
hi: Hindi/hindi
hi: Hindi/hindi_compact
hi_ZZ: Hinglish/qwerty # This is a preliminary keyboard layout.
@ -54,22 +54,22 @@
in: Indonesian/qwerty # "id" is the official language code of Indonesian.
is: Icelandic/qwerty
it: Italian/qwerty
it_CH: Italian (Switzerland)/swiss
it_CH: Italian (Switzerland)/qwertz+
iw: Hebrew/hebrew # "he" is the official language code of Hebrew.
ka_GE: Georgian (Georgia)/georgian
kk: Kazakh/east_slavic
kk: Kazakh/kk
km_KH: Khmer (Cambodia)/khmer
kn_IN: Kannada (India)/kannada
ky: Kyrgyz/east_slavic
ky: Kyrgyz/ky
lo_LA: Lao (Laos)/lao
lt: Lithuanian/qwerty
lv: Latvian/qwerty
mk: Macedonian/south_slavic
mk: Macedonian/mk
ml_IN: Malayalam (India)/malayalam
mn_MN: Mongolian (Mongolia)/mongolian
mr_IN: Marathi (India)/marathi
ms_MY: Malay (Malaysia)/qwerty
nb: Norwegian Bokmål/nordic
nb: Norwegian Bokmål/qwerty+
ne_NP: Nepali (Nepal) Romanized/nepali_romanized
ne_NP: Nepali (Nepal) Traditional/nepali_traditional
nl: Dutch/qwerty
@ -78,23 +78,23 @@
pt_BR: Portuguese (Brazil)/qwerty
pt_PT: Portuguese (Portugal)/qwerty
ro: Romanian/qwerty
ru: Russian/east_slavic
ru: Russian/ru
si_LK: Sinhala (Sri Lanka)/sinhala # This is a preliminary keyboard layout.
sk: Slovak/qwerty
sl: Slovenian/qwerty
sr: Serbian/south_slavic
sr: Serbian/sr
sr_ZZ: Serbian (Latin)/serbian_qwertz # This is a preliminary keyboard layout.
sv: Swedish/nordic
sv: Swedish/qwerty+
sw: Swahili/qwerty
ta_IN: Tamil (India)/tamil
ta_LK: Tamil (Sri Lanka)/tamil # Disabled in conjunction with si_LK.
ta_SG: Tamil (Singapore)/tamil
te_IN: Telugu (India)/telugu
th: Thai/thai
tl: Tagalog/spanish
tl: Tagalog/qwerty+
tr: Turkish/qwerty
ur_PK: Urdu Pakistan
uk: Ukrainian/east_slavic
uk: Ukrainian/uk
uz_UZ: Uzbek (Uzbekistan)/uzbek # This is a preliminary keyboard layout.
vi: Vietnamese/qwerty
zu: Zulu/qwerty
@ -144,7 +144,7 @@
android:imeSubtypeLocale="af"
android:languageTag="af"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -153,7 +153,7 @@
android:imeSubtypeLocale="ar"
android:languageTag="ar"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=arabic,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -171,7 +171,7 @@
android:imeSubtypeLocale="az_AZ"
android:languageTag="az-AZ"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -180,7 +180,7 @@
android:imeSubtypeLocale="be_BY"
android:languageTag="be-BY"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=east_slavic,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=be,EmojiCapable"
android:isAsciiCapable="false"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -243,7 +243,7 @@
android:imeSubtypeLocale="ca"
android:languageTag="ca"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -252,7 +252,7 @@
android:imeSubtypeLocale="cs"
android:languageTag="cs"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -261,7 +261,7 @@
android:imeSubtypeLocale="da"
android:languageTag="da"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -270,7 +270,7 @@
android:imeSubtypeLocale="de"
android:languageTag="de"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -279,7 +279,7 @@
android:imeSubtypeLocale="de_CH"
android:languageTag="de-CH"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=swiss,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -288,7 +288,7 @@
android:imeSubtypeLocale="de_DE"
android:languageTag="de-DE"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=german,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -306,7 +306,7 @@
android:imeSubtypeLocale="en_IN"
android:languageTag="en-IN"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -315,8 +315,8 @@
android:imeSubtypeLocale="eo"
android:languageTag="eo"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,EmojiCapable"
android:isAsciiCapable="false"
android:imeSubtypeExtraValue="KeyboardLayoutSet=eo,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
android:label="@string/subtype_generic"
@ -324,7 +324,7 @@
android:imeSubtypeLocale="es"
android:languageTag="es"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -333,7 +333,7 @@
android:imeSubtypeLocale="es_US"
android:languageTag="es-US"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -342,7 +342,7 @@
android:imeSubtypeLocale="es_419"
android:languageTag="es-419"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -351,7 +351,7 @@
android:imeSubtypeLocale="et_EE"
android:languageTag="et-EE"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=nordic,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -360,7 +360,7 @@
android:imeSubtypeLocale="eu_ES"
android:languageTag="eu-ES"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -378,7 +378,7 @@
android:imeSubtypeLocale="fi"
android:languageTag="fi"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -387,7 +387,7 @@
android:imeSubtypeLocale="fr"
android:languageTag="fr"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=azerty,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -405,7 +405,7 @@
android:imeSubtypeLocale="fr_CH"
android:languageTag="fr-CH"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=swiss,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -414,7 +414,7 @@
android:imeSubtypeLocale="gl_ES"
android:languageTag="gl-ES"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -444,7 +444,7 @@
android:imeSubtypeLocale="hi_ZZ"
android:languageTag="hi-ZZ"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,KeyboardLayoutSet=qwerty,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -453,7 +453,7 @@
android:imeSubtypeLocale="hr"
android:languageTag="hr"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -462,7 +462,7 @@
android:imeSubtypeLocale="hu"
android:languageTag="hu"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -481,7 +481,7 @@
android:imeSubtypeLocale="in"
android:languageTag="id"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -490,7 +490,7 @@
android:imeSubtypeLocale="is"
android:languageTag="is"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -508,7 +508,7 @@
android:imeSubtypeLocale="it_CH"
android:languageTag="it-CH"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=swiss,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<!-- Java uses the deprecated "iw" code instead of the standard "he" code for Hebrew. -->
@ -518,7 +518,7 @@
android:imeSubtypeLocale="iw"
android:languageTag="he"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=hebrew,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -536,7 +536,7 @@
android:imeSubtypeLocale="kk"
android:languageTag="kk"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=east_slavic,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=kk,EmojiCapable"
android:isAsciiCapable="false"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -590,7 +590,7 @@
android:imeSubtypeLocale="ky"
android:languageTag="ky"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=east_slavic,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=ky,EmojiCapable"
android:isAsciiCapable="false"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -616,7 +616,7 @@
android:imeSubtypeLocale="lt"
android:languageTag="lt"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -625,7 +625,7 @@
android:imeSubtypeLocale="lv"
android:languageTag="lv"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -634,7 +634,7 @@
android:imeSubtypeLocale="mk"
android:languageTag="mk"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=south_slavic,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=mk,EmojiCapable"
android:isAsciiCapable="false"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -670,7 +670,7 @@
android:imeSubtypeLocale="ms_MY"
android:languageTag="ms-MY"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -679,7 +679,7 @@
android:imeSubtypeLocale="nb"
android:languageTag="nb"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -733,7 +733,7 @@
android:imeSubtypeLocale="pt_BR"
android:languageTag="pt-BR"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -742,7 +742,7 @@
android:imeSubtypeLocale="pt_PT"
android:languageTag="pt-PT"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -751,7 +751,7 @@
android:imeSubtypeLocale="ro"
android:languageTag="ro"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -760,13 +760,13 @@
android:imeSubtypeLocale="ru"
android:languageTag="ru"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="SKeyboardLayoutSet=ru,upportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false"
/>
<!-- TODO: This Sinhala keyboard is a preliminary layout.
This isn't based on the final specification. -->
<!-- si_LK is currently disabled due to lack of combination rules.
<subtype android:icon="@drawable/ic_ime_switcher_dark"
<!-- si_LK is currently disabled due to lack of combination rules. -->
<subtype android:icon="@drawable/ic_ime_switcher"
android:label="@string/subtype_generic"
android:subtypeId="0x5c6b3bde"
android:imeSubtypeLocale="si_LK"
@ -775,14 +775,13 @@
android:imeSubtypeExtraValue="KeyboardLayoutSet=sinhala,EmojiCapable"
android:isAsciiCapable="false"
/>
-->
<subtype android:icon="@drawable/ic_ime_switcher"
android:label="@string/subtype_generic"
android:subtypeId="0x8e94d413"
android:imeSubtypeLocale="sk"
android:languageTag="sk"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -791,7 +790,7 @@
android:imeSubtypeLocale="sl"
android:languageTag="sl"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -800,7 +799,7 @@
android:imeSubtypeLocale="sr"
android:languageTag="sr"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=sr,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false"
/>
<!-- TODO: This Serbian Latin keyboard is a preliminary layout.
@ -811,7 +810,7 @@
android:imeSubtypeLocale="sr_ZZ"
android:languageTag="sr-Latn"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=serbian_qwertz,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -820,7 +819,7 @@
android:imeSubtypeLocale="sv"
android:languageTag="sv"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -829,7 +828,7 @@
android:imeSubtypeLocale="sw"
android:languageTag="sw"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -886,7 +885,7 @@
android:imeSubtypeLocale="tl"
android:languageTag="fil"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -895,7 +894,7 @@
android:imeSubtypeLocale="tr"
android:languageTag="tr"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -904,7 +903,7 @@
android:imeSubtypeLocale="uk"
android:languageTag="uk"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=east_slavic,EmojiCapable"
android:imeSubtypeExtraValue="KeyboardLayoutSet=uk,EmojiCapable"
android:isAsciiCapable="false"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -933,7 +932,7 @@
android:imeSubtypeLocale="vi"
android:languageTag="vi"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -942,7 +941,7 @@
android:imeSubtypeLocale="zu"
android:languageTag="zu"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<subtype android:icon="@drawable/ic_ime_switcher"
@ -951,7 +950,7 @@
android:imeSubtypeLocale="zz"
android:languageTag="zz"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EnabledWhenDefaultIsNotAsciiCapable,EmojiCapable"
android:imeSubtypeExtraValue="AsciiCapable,EnabledWhenDefaultIsNotAsciiCapable,EmojiCapable"
android:isAsciiCapable="true"
/>
<!-- Emoji subtype has to be an addtional subtype added at boot time because ICS doesn't