change what can be stored in KeyboardLayoutSet subtype extra value

and some more preparations for adjustments related to language/layout settings upgrade
This commit is contained in:
Helium314 2025-02-13 17:29:51 +01:00
parent f2f7426ee5
commit 201b430362
25 changed files with 313 additions and 371 deletions

View file

@ -11,7 +11,7 @@ object HangulEventDecoder {
@JvmStatic @JvmStatic
fun decodeHardwareKeyEvent(subtype: RichInputMethodSubtype, event: KeyEvent, defaultEvent: () -> Event): Event { fun decodeHardwareKeyEvent(subtype: RichInputMethodSubtype, event: KeyEvent, defaultEvent: () -> Event): Event {
val layout = LAYOUTS[subtype.keyboardLayoutSetName] ?: return defaultEvent() val layout = LAYOUTS[subtype.mainLayoutName] ?: return defaultEvent()
val codePoint = layout[event.keyCode]?.let { if (event.isShiftPressed) it.second else it.first } ?: return defaultEvent() val codePoint = layout[event.keyCode]?.let { if (event.isShiftPressed) it.second else it.first } ?: return defaultEvent()
val hardwareEvent = Event.createHardwareKeypressEvent(codePoint, event.keyCode, event.metaState, null, event.repeatCount != 0) val hardwareEvent = Event.createHardwareKeypressEvent(codePoint, event.keyCode, event.metaState, null, event.repeatCount != 0)
return decodeSoftwareKeyEvent(hardwareEvent) return decodeSoftwareKeyEvent(hardwareEvent)

View file

@ -236,7 +236,7 @@ public final class KeyboardLayoutSet {
final boolean asciiCapable = subtype.getRawSubtype().isAsciiCapable(); final boolean asciiCapable = subtype.getRawSubtype().isAsciiCapable();
final boolean forceAscii = (mParams.mEditorInfo.imeOptions & EditorInfo.IME_FLAG_FORCE_ASCII) != 0; final boolean forceAscii = (mParams.mEditorInfo.imeOptions & EditorInfo.IME_FLAG_FORCE_ASCII) != 0;
mParams.mSubtype = (forceAscii && !asciiCapable) mParams.mSubtype = (forceAscii && !asciiCapable)
? RichInputMethodSubtype.getNoLanguageSubtype() ? RichInputMethodSubtype.Companion.getNoLanguageSubtype()
: subtype; : subtype;
return this; return this;
} }
@ -326,8 +326,8 @@ public final class KeyboardLayoutSet {
public static KeyboardId getFakeKeyboardId(final int elementId) { public static KeyboardId getFakeKeyboardId(final int elementId) {
final Params params = new Params(); final Params params = new Params();
params.mEditorInfo = new EditorInfo(); params.mEditorInfo = new EditorInfo();
params.mSubtype = RichInputMethodSubtype.getEmojiSubtype(); params.mSubtype = RichInputMethodSubtype.Companion.getEmojiSubtype();
params.mSubtype.getKeyboardLayoutSetName(); params.mSubtype.getMainLayoutName();
return new KeyboardId(elementId, params); return new KeyboardId(elementId, params);
} }
} }

View file

@ -161,7 +161,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
try { try {
final InputMethodSubtype qwerty = AdditionalSubtypeUtils.createEmojiCapableAdditionalSubtype(mRichImm.getCurrentSubtypeLocale(), "qwerty", true); final InputMethodSubtype qwerty = AdditionalSubtypeUtils.createEmojiCapableAdditionalSubtype(mRichImm.getCurrentSubtypeLocale(), "qwerty", true);
mKeyboardLayoutSet = builder.setKeyboardGeometry(keyboardWidth, keyboardHeight) mKeyboardLayoutSet = builder.setKeyboardGeometry(keyboardWidth, keyboardHeight)
.setSubtype(new RichInputMethodSubtype(qwerty)) .setSubtype(RichInputMethodSubtype.Companion.get(qwerty))
.setVoiceInputKeyEnabled(settingsValues.mShowsVoiceInputKey) .setVoiceInputKeyEnabled(settingsValues.mShowsVoiceInputKey)
.setNumberRowEnabled(settingsValues.mShowsNumberRow) .setNumberRowEnabled(settingsValues.mShowsNumberRow)
.setLanguageSwitchKeyEnabled(settingsValues.isLanguageSwitchKeyEnabled()) .setLanguageSwitchKeyEnabled(settingsValues.isLanguageSwitchKeyEnabled())

View file

@ -89,7 +89,7 @@ public final class EmojiPalettesView extends LinearLayout
final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(context, null); final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(context, null);
final Resources res = context.getResources(); final Resources res = context.getResources();
mEmojiLayoutParams = new EmojiLayoutParams(res); mEmojiLayoutParams = new EmojiLayoutParams(res);
builder.setSubtype(RichInputMethodSubtype.getEmojiSubtype()); builder.setSubtype(RichInputMethodSubtype.Companion.getEmojiSubtype());
builder.setKeyboardGeometry(ResourceUtils.getKeyboardWidth(context, Settings.getInstance().getCurrent()), builder.setKeyboardGeometry(ResourceUtils.getKeyboardWidth(context, Settings.getInstance().getCurrent()),
mEmojiLayoutParams.getEmojiKeyboardHeight()); mEmojiLayoutParams.getEmojiKeyboardHeight());
final KeyboardLayoutSet layoutSet = builder.build(); final KeyboardLayoutSet layoutSet = builder.build();

View file

@ -311,8 +311,8 @@ class KeyboardParser(private val params: KeyboardParams, private val context: Co
} }
// some layouts have different number layout, and there we don't want the numbers on the top row // some layouts have different number layout, and there we don't want the numbers on the top row
// todo: actually should not be in here, but in subtype extra values // todo: this should be derived from main layout and popup / hint order settings
private fun hasNumbersOnTopRow() = params.mId.mSubtype.keyboardLayoutSetName !in listOf("pcqwerty", "lao", "thai", "korean_sebeolsik_390", "korean_sebeolsik_final") private fun hasNumbersOnTopRow() = params.mId.mSubtype.mainLayoutName !in listOf("pcqwerty", "lao", "thai", "korean_sebeolsik_390", "korean_sebeolsik_final")
companion object { companion object {
private const val TAG = "KeyboardParser" private const val TAG = "KeyboardParser"

View file

@ -123,8 +123,8 @@ object RawKeyboardParser {
simpleKeyData.mapIndexedTo(mutableListOf()) { i, row -> simpleKeyData.mapIndexedTo(mutableListOf()) { i, row ->
val newRow = row.toMutableList() val newRow = row.toMutableList()
if (params.mId.isAlphabetKeyboard if (params.mId.isAlphabetKeyboard
&& params.mId.mSubtype.keyboardLayoutSetName.endsWith("+") && params.mId.mSubtype.mainLayoutName.endsWith("+")
&& "$layoutName+" == params.mId.mSubtype.keyboardLayoutSetName && "$layoutName+" == params.mId.mSubtype.mainLayoutName
) { ) {
params.mLocaleKeyboardInfos.getExtraKeys(i+1)?.let { newRow.addAll(it) } params.mLocaleKeyboardInfos.getExtraKeys(i+1)?.let { newRow.addAll(it) }
} }
@ -145,7 +145,7 @@ object RawKeyboardParser {
KeyboardId.ELEMENT_PHONE_SYMBOLS -> LAYOUT_PHONE_SYMBOLS KeyboardId.ELEMENT_PHONE_SYMBOLS -> LAYOUT_PHONE_SYMBOLS
KeyboardId.ELEMENT_EMOJI_BOTTOM_ROW -> LAYOUT_EMOJI_BOTTOM_ROW KeyboardId.ELEMENT_EMOJI_BOTTOM_ROW -> LAYOUT_EMOJI_BOTTOM_ROW
KeyboardId.ELEMENT_CLIPBOARD_BOTTOM_ROW -> LAYOUT_CLIPBOARD_BOTTOM_ROW KeyboardId.ELEMENT_CLIPBOARD_BOTTOM_ROW -> LAYOUT_CLIPBOARD_BOTTOM_ROW
else -> params.mId.mSubtype.keyboardLayoutSetName.substringBeforeLast("+") else -> params.mId.mSubtype.mainLayoutName.substringBeforeLast("+")
} }
private fun getFunctionalLayoutName(params: KeyboardParams, context: Context): String { private fun getFunctionalLayoutName(params: KeyboardParams, context: Context): String {

View file

@ -857,7 +857,7 @@ public class LatinIME extends InputMethodService implements
public void onCurrentInputMethodSubtypeChanged(final InputMethodSubtype subtype) { public void onCurrentInputMethodSubtypeChanged(final InputMethodSubtype subtype) {
// Note that the calling sequence of onCreate() and onCurrentInputMethodSubtypeChanged() // Note that the calling sequence of onCreate() and onCurrentInputMethodSubtypeChanged()
// is not guaranteed. It may even be called at the same time on a different thread. // is not guaranteed. It may even be called at the same time on a different thread.
if (subtype.hashCode() == 0xf000000f) { if (subtype.hashCode() == 0x7000000f) {
// For some reason sometimes the system wants to set the dummy subtype, which messes with the currently enabled subtype. // For some reason sometimes the system wants to set the dummy subtype, which messes with the currently enabled subtype.
// Now that the dummy subtype has a fixed id, we can easily avoid enabling it. // Now that the dummy subtype has a fixed id, we can easily avoid enabling it.
return; return;

View file

@ -206,14 +206,14 @@ public class RichInputMethodManager {
updateCurrentSubtype(newSubtype); updateCurrentSubtype(newSubtype);
updateShortcutIme(); updateShortcutIme();
if (DEBUG) { if (DEBUG) {
Log.w(TAG, "onSubtypeChanged: " + mCurrentRichInputMethodSubtype.getNameForLogging()); Log.w(TAG, "onSubtypeChanged: " + mCurrentRichInputMethodSubtype);
} }
} }
private static RichInputMethodSubtype sForcedSubtypeForTesting = null; private static RichInputMethodSubtype sForcedSubtypeForTesting = null;
static void forceSubtype(@NonNull final InputMethodSubtype subtype) { static void forceSubtype(@NonNull final InputMethodSubtype subtype) {
sForcedSubtypeForTesting = RichInputMethodSubtype.getRichInputMethodSubtype(subtype); sForcedSubtypeForTesting = RichInputMethodSubtype.Companion.get(subtype);
} }
@NonNull @NonNull
@ -357,7 +357,7 @@ public class RichInputMethodManager {
private void updateCurrentSubtype(final InputMethodSubtype subtype) { private void updateCurrentSubtype(final InputMethodSubtype subtype) {
SubtypeSettingsKt.setSelectedSubtype(KtxKt.prefs(mContext), subtype); SubtypeSettingsKt.setSelectedSubtype(KtxKt.prefs(mContext), subtype);
mCurrentRichInputMethodSubtype = RichInputMethodSubtype.getRichInputMethodSubtype(subtype); mCurrentRichInputMethodSubtype = RichInputMethodSubtype.Companion.get(subtype);
} }
public static boolean canSwitchLanguage() { public static boolean canSwitchLanguage() {

View file

@ -1,220 +0,0 @@
/*
* Copyright (C) 2014 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package helium314.keyboard.latin;
import android.view.inputmethod.InputMethodSubtype;
import helium314.keyboard.latin.common.Constants;
import helium314.keyboard.latin.common.LocaleUtils;
import helium314.keyboard.latin.utils.CustomLayoutUtilsKt;
import helium314.keyboard.latin.utils.Log;
import helium314.keyboard.latin.utils.SubtypeLocaleUtils;
import helium314.keyboard.latin.utils.SubtypeUtilsKt;
import java.util.Locale;
import static helium314.keyboard.latin.common.Constants.Subtype.KEYBOARD_MODE;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* Enrichment class for InputMethodSubtype to enable concurrent multi-lingual input.
* <p>
* Right now, this returns the extra value of its primary subtype.
*/
// non final for easy mocking.
public class RichInputMethodSubtype {
private static final String TAG = RichInputMethodSubtype.class.getSimpleName();
@NonNull
private final InputMethodSubtype mSubtype;
@NonNull
private final Locale mLocale;
// The subtype is considered RTL if the language of the main subtype is RTL.
// Cached because it might get read frequently, e.g. when moving pointer with space bar
private final boolean mIsRtl;
public RichInputMethodSubtype(@NonNull final InputMethodSubtype subtype) {
mSubtype = subtype;
mLocale = SubtypeUtilsKt.locale(mSubtype);
mIsRtl = LocaleUtils.isRtlLanguage(mLocale);
}
// Extra values are determined by the primary subtype. This is probably right, but
// we may have to revisit this later.
public String getExtraValueOf(@NonNull final String key) {
return mSubtype.getExtraValueOf(key);
}
public boolean hasExtraValue(@NonNull final String key) {
return mSubtype.containsExtraValueKey(key);
}
// The mode is also determined by the primary subtype.
public String getMode() {
return mSubtype.getMode();
}
public boolean isNoLanguage() {
return SubtypeLocaleUtils.NO_LANGUAGE.equals(mLocale.getLanguage());
}
public boolean isCustom() {
return getKeyboardLayoutSetName().startsWith(CustomLayoutUtilsKt.CUSTOM_LAYOUT_PREFIX);
}
public String getNameForLogging() {
return toString();
}
// InputMethodSubtype's display name for spacebar text in its locale.
// isAdditionalSubtype (T=true, F=false)
// locale layout | Middle Full
// ------ ------- - --------- ----------------------
// en_US qwerty F English English (US) exception
// en_GB qwerty F English English (UK) exception
// es_US spanish F Español Español (EE.UU.) exception
// fr azerty F Français Français
// fr_CA qwerty F Français Français (Canada)
// fr_CH swiss F Français Français (Suisse)
// de qwertz F Deutsch Deutsch
// de_CH swiss T Deutsch Deutsch (Schweiz)
// zz qwerty F QWERTY QWERTY
// fr qwertz T Français Français
// de qwerty T Deutsch Deutsch
// en_US azerty T English English (US)
// zz azerty T AZERTY AZERTY
// Get the RichInputMethodSubtype's full display name in its locale.
@NonNull
public String getFullDisplayName() {
if (isNoLanguage()) {
return SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(mSubtype);
}
return SubtypeLocaleUtils.getSubtypeLocaleDisplayName(mLocale);
}
// Get the RichInputMethodSubtype's middle display name in its locale.
@NonNull
public String getMiddleDisplayName() {
if (isNoLanguage()) {
return SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(mSubtype);
}
return SubtypeLocaleUtils.getSubtypeLanguageDisplayName(mLocale);
}
@Override
public boolean equals(final Object o) {
if (!(o instanceof RichInputMethodSubtype)) {
return false;
}
final RichInputMethodSubtype other = (RichInputMethodSubtype)o;
return mSubtype.equals(other.mSubtype) && mLocale.equals(other.mLocale);
}
@Override
public int hashCode() {
return mSubtype.hashCode() + mLocale.hashCode();
}
@Override
public String toString() {
return "Multi-lingual subtype: " + mSubtype + ", " + mLocale;
}
@NonNull
public Locale getLocale() {
return mLocale;
}
public boolean isRtlSubtype() {
return mIsRtl;
}
// TODO: remove this method
@NonNull
public InputMethodSubtype getRawSubtype() { return mSubtype; }
@NonNull
public String getKeyboardLayoutSetName() {
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 =
"KeyboardLayoutSet=" + SubtypeLocaleUtils.QWERTY
+ "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE
+ "," + Constants.Subtype.ExtraValue.ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE
+ "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE;
@NonNull
private static final RichInputMethodSubtype DUMMY_NO_LANGUAGE_SUBTYPE =
new RichInputMethodSubtype(new InputMethodSubtype.InputMethodSubtypeBuilder()
.setSubtypeNameResId(R.string.subtype_no_language_qwerty)
.setSubtypeIconResId(R.drawable.ic_ime_switcher)
.setSubtypeLocale(SubtypeLocaleUtils.NO_LANGUAGE)
.setSubtypeMode(KEYBOARD_MODE)
.setSubtypeExtraValue(EXTRA_VALUE_OF_DUMMY_NO_LANGUAGE_SUBTYPE)
.setIsAuxiliary(false)
.setOverridesImplicitlyEnabledSubtype(false)
.setSubtypeId(SUBTYPE_ID_OF_DUMMY_NO_LANGUAGE_SUBTYPE)
.setIsAsciiCapable(true)
.build());
// Caveat: We probably should remove this when we add an Emoji subtype in {@link R.xml.method}.
// Dummy Emoji subtype. See {@link R.xml.method}.
private static final int SUBTYPE_ID_OF_DUMMY_EMOJI_SUBTYPE = 0xd78b2ed0;
private static final String EXTRA_VALUE_OF_DUMMY_EMOJI_SUBTYPE =
"KeyboardLayoutSet=" + SubtypeLocaleUtils.EMOJI
+ "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE;
@NonNull
private static final RichInputMethodSubtype DUMMY_EMOJI_SUBTYPE =
new RichInputMethodSubtype(new InputMethodSubtype.InputMethodSubtypeBuilder()
.setSubtypeNameResId(R.string.subtype_emoji)
.setSubtypeIconResId(R.drawable.ic_ime_switcher)
.setSubtypeLocale(SubtypeLocaleUtils.NO_LANGUAGE)
.setSubtypeMode(KEYBOARD_MODE)
.setSubtypeExtraValue(EXTRA_VALUE_OF_DUMMY_EMOJI_SUBTYPE)
.setIsAuxiliary(false)
.setOverridesImplicitlyEnabledSubtype(false)
.setSubtypeId(SUBTYPE_ID_OF_DUMMY_EMOJI_SUBTYPE)
.build());
private static RichInputMethodSubtype sNoLanguageSubtype;
@NonNull
public static RichInputMethodSubtype getNoLanguageSubtype() {
RichInputMethodSubtype noLanguageSubtype = sNoLanguageSubtype;
if (noLanguageSubtype == null) {
final InputMethodSubtype rawNoLanguageSubtype = RichInputMethodManager.getInstance()
.findSubtypeByLocaleAndKeyboardLayoutSet(LocaleUtils.constructLocale(SubtypeLocaleUtils.NO_LANGUAGE), SubtypeLocaleUtils.QWERTY);
if (rawNoLanguageSubtype != null) {
noLanguageSubtype = new RichInputMethodSubtype(rawNoLanguageSubtype);
}
}
if (noLanguageSubtype != null) {
sNoLanguageSubtype = noLanguageSubtype;
return noLanguageSubtype;
}
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;
}
@NonNull
public static RichInputMethodSubtype getEmojiSubtype() {
return DUMMY_EMOJI_SUBTYPE;
}
}

View file

@ -0,0 +1,134 @@
/*
* Copyright (C) 2014 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package helium314.keyboard.latin
import android.view.inputmethod.InputMethodSubtype
import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder
import helium314.keyboard.latin.common.Constants
import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET
import helium314.keyboard.latin.common.LocaleUtils.constructLocale
import helium314.keyboard.latin.common.LocaleUtils.isRtlLanguage
import helium314.keyboard.latin.utils.CUSTOM_LAYOUT_PREFIX
import helium314.keyboard.latin.utils.LayoutType
import helium314.keyboard.latin.utils.Log
import helium314.keyboard.latin.utils.SubtypeLocaleUtils
import helium314.keyboard.latin.utils.locale
import java.util.Locale
/**
* Enrichment class for InputMethodSubtype that extracts settings from extra values
*/
class RichInputMethodSubtype private constructor(val rawSubtype: InputMethodSubtype) {
val locale: Locale = rawSubtype.locale()
// The subtype is considered RTL if the language of the main subtype is RTL.
val isRtlSubtype: Boolean = isRtlLanguage(locale)
fun getExtraValueOf(key: String): String? = rawSubtype.getExtraValueOf(key)
fun hasExtraValue(key: String): Boolean = rawSubtype.containsExtraValueKey(key)
val isNoLanguage: Boolean get() = SubtypeLocaleUtils.NO_LANGUAGE == locale.language
val mainLayoutName: String get() = layouts[LayoutType.MAIN] ?: "qwerty"
val layouts = LayoutType.getLayoutMap(getExtraValueOf(KEYBOARD_LAYOUT_SET) ?: "")
val isCustom: Boolean get() = mainLayoutName.startsWith(CUSTOM_LAYOUT_PREFIX)
val fullDisplayName: String get() {
if (isNoLanguage) {
return SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(rawSubtype)!!
}
return SubtypeLocaleUtils.getSubtypeLocaleDisplayName(locale)
}
val middleDisplayName: String
// Get the RichInputMethodSubtype's middle display name in its locale.
get() {
if (isNoLanguage) {
return SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(rawSubtype)!!
}
return SubtypeLocaleUtils.getSubtypeLanguageDisplayName(locale)
}
override fun equals(other: Any?): Boolean {
if (other !is RichInputMethodSubtype) return false
return rawSubtype == other.rawSubtype && locale == other.locale
}
override fun hashCode(): Int {
return rawSubtype.hashCode() + locale.hashCode()
}
override fun toString(): String = rawSubtype.extraValue
companion object {
private val TAG: String = RichInputMethodSubtype::class.java.simpleName
fun get(subtype: InputMethodSubtype?): RichInputMethodSubtype =
if (subtype == null) noLanguageSubtype
else RichInputMethodSubtype(subtype)
// Dummy no language QWERTY subtype. See method_dummy.xml}.
private const val EXTRA_VALUE_OF_DUMMY_NO_LANGUAGE_SUBTYPE = ("KeyboardLayoutSet=" + SubtypeLocaleUtils.QWERTY
+ "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE
+ "," + Constants.Subtype.ExtraValue.ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE
+ "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE)
private val DUMMY_NO_LANGUAGE_SUBTYPE = RichInputMethodSubtype(
InputMethodSubtypeBuilder()
.setSubtypeNameResId(R.string.subtype_no_language_qwerty)
.setSubtypeIconResId(R.drawable.ic_ime_switcher)
.setSubtypeLocale(SubtypeLocaleUtils.NO_LANGUAGE)
.setSubtypeMode(Constants.Subtype.KEYBOARD_MODE)
.setSubtypeExtraValue(EXTRA_VALUE_OF_DUMMY_NO_LANGUAGE_SUBTYPE)
.setIsAuxiliary(false)
.setOverridesImplicitlyEnabledSubtype(false)
.setSubtypeId(0x7000000f)
.setIsAsciiCapable(true)
.build()
)
// Caveat: We probably should remove this when we add an Emoji subtype in {@link R.xml.method}.
// Dummy Emoji subtype. See {@link R.xml.method}.
private const val SUBTYPE_ID_OF_DUMMY_EMOJI_SUBTYPE = -0x2874d130
private const val EXTRA_VALUE_OF_DUMMY_EMOJI_SUBTYPE = ("KeyboardLayoutSet=" + SubtypeLocaleUtils.EMOJI
+ "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE)
val emojiSubtype: RichInputMethodSubtype = RichInputMethodSubtype(
InputMethodSubtypeBuilder()
.setSubtypeNameResId(R.string.subtype_emoji)
.setSubtypeIconResId(R.drawable.ic_ime_switcher)
.setSubtypeLocale(SubtypeLocaleUtils.NO_LANGUAGE)
.setSubtypeMode(Constants.Subtype.KEYBOARD_MODE)
.setSubtypeExtraValue(EXTRA_VALUE_OF_DUMMY_EMOJI_SUBTYPE)
.setIsAuxiliary(false)
.setOverridesImplicitlyEnabledSubtype(false)
.setSubtypeId(SUBTYPE_ID_OF_DUMMY_EMOJI_SUBTYPE)
.build()
)
private var sNoLanguageSubtype: RichInputMethodSubtype? = null
val noLanguageSubtype: RichInputMethodSubtype get() {
sNoLanguageSubtype?.let { return it }
var noLanguageSubtype = sNoLanguageSubtype
val rawNoLanguageSubtype = RichInputMethodManager.getInstance()
.findSubtypeByLocaleAndKeyboardLayoutSet(
SubtypeLocaleUtils.NO_LANGUAGE.constructLocale(),
SubtypeLocaleUtils.QWERTY
)
if (rawNoLanguageSubtype != null) {
noLanguageSubtype = RichInputMethodSubtype(rawNoLanguageSubtype)
}
if (noLanguageSubtype != null) {
sNoLanguageSubtype = noLanguageSubtype
return noLanguageSubtype
}
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
}
}
}

View file

@ -41,35 +41,20 @@ public final class Constants {
} }
public static final class Subtype { public static final class Subtype {
/** /** The subtype mode used to indicate that the subtype is a keyboard. */
* The subtype mode used to indicate that the subtype is a keyboard.
*/
public static final String KEYBOARD_MODE = "keyboard"; public static final String KEYBOARD_MODE = "keyboard";
// some extra values: // some extra values:
// TrySuppressingImeSwitcher: not documented, but used in Android source // 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? // 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 { public static final class ExtraValue {
/** /** Indicates that this subtype is capable of entering ASCII characters (not used, but recommended for Android 9 and older). */
* The subtype extra value used to indicate that this subtype is capable of
* entering ASCII characters.
*/
public static final String ASCII_CAPABLE = "AsciiCapable"; public static final String ASCII_CAPABLE = "AsciiCapable";
/** /** Indicates that this subtype is enabled when the default subtype is not marked as ascii capable (used where?). */
* The subtype extra value used to indicate that this subtype is enabled public static final String ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE = "EnabledWhenDefaultIsNotAsciiCapable";
* when the default subtype is not marked as ascii capable.
*/
public static final String ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE =
"EnabledWhenDefaultIsNotAsciiCapable";
/** /** Indicates that this subtype is capable of entering emoji characters (always set?). */
* The subtype extra value used to indicate that this subtype is capable of
* entering emoji characters.
*/
public static final String EMOJI_CAPABLE = "EmojiCapable"; public static final String EMOJI_CAPABLE = "EmojiCapable";
/** Indicates that the subtype does not have a shift key */ /** Indicates that the subtype does not have a shift key */
@ -84,26 +69,29 @@ public final class Constants {
* this extra value. * this extra value.
* This extra value is supported on JellyBean and later. * This extra value is supported on JellyBean and later.
*/ */
public static final String UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME = public static final String UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME = "UntranslatableReplacementStringInSubtypeName";
"UntranslatableReplacementStringInSubtypeName";
/** /** Contains the layouts used by this subtype. This extra value is private to LatinIME.*/
* 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"; public static final String KEYBOARD_LAYOUT_SET = "KeyboardLayoutSet";
/** /** Indicates that this subtype is an additional subtype that the user defined. This extra value is private to LatinIME. */
* 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"; public static final String IS_ADDITIONAL_SUBTYPE = "isAdditionalSubtype";
/** /** The subtype extra value used to specify the combining rules (currently not used). */
* The subtype extra value used to specify the combining rules.
*/
public static final String COMBINING_RULES = "CombiningRules"; public static final String COMBINING_RULES = "CombiningRules";
/** Overrides the general popup order setting */
public static final String POPUP_ORDER = "PopupOrder";
/** Overrides the general hint order / priority setting */
public static final String HINT_ORDER = "HintOrder";
/** Language tags indicating enabled secondary locales */
public static final String SECONDARY_LOCALES = "SecondaryLocales";
/** Overrides the general "more popups" setting */
public static final String MORE_POPUPS = "MorePopups";
private ExtraValue() { private ExtraValue() {
// This utility class is not publicly instantiable. // This utility class is not publicly instantiable.
} }

View file

@ -22,7 +22,6 @@ import helium314.keyboard.dictionarypack.DictionaryPackConstants
import helium314.keyboard.keyboard.KeyboardLayoutSet import helium314.keyboard.keyboard.KeyboardLayoutSet
import helium314.keyboard.keyboard.KeyboardSwitcher import helium314.keyboard.keyboard.KeyboardSwitcher
import helium314.keyboard.latin.R import helium314.keyboard.latin.R
import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET
import helium314.keyboard.latin.common.LocaleUtils import helium314.keyboard.latin.common.LocaleUtils
import helium314.keyboard.latin.common.LocaleUtils.constructLocale import helium314.keyboard.latin.common.LocaleUtils.constructLocale
import helium314.keyboard.latin.databinding.LanguageListItemBinding import helium314.keyboard.latin.databinding.LanguageListItemBinding
@ -138,10 +137,10 @@ class LanguageSettingsDialog(
val layouts = mutableListOf<String>() val layouts = mutableListOf<String>()
val displayNames = mutableListOf<String>() val displayNames = mutableListOf<String>()
infos.forEach { infos.forEach {
val layoutSetName = it.subtype.getExtraValueOf(KEYBOARD_LAYOUT_SET) val mainLayoutName = it.subtype.mainLayoutName()
if (layoutSetName?.startsWith(CUSTOM_LAYOUT_PREFIX) == false // don't allow copying custom layout (at least for now) if (!mainLayoutName.startsWith(CUSTOM_LAYOUT_PREFIX) // don't allow copying custom layout (at least for now)
&& !layoutSetName.endsWith("+")) { // don't allow copying layouts only defined via extra keys && !mainLayoutName.endsWith("+")) { // don't allow copying layouts only defined via extra keys
layouts.add(layoutSetName) layouts.add(mainLayoutName)
displayNames.add(it.subtype.displayName(context).toString()) displayNames.add(it.subtype.displayName(context).toString())
} }
} }
@ -169,7 +168,7 @@ class LanguageSettingsDialog(
private fun addSubtypeToView(subtype: SubtypeInfo) { private fun addSubtypeToView(subtype: SubtypeInfo) {
val row = LayoutInflater.from(context).inflate(R.layout.language_list_item, listView) val row = LayoutInflater.from(context).inflate(R.layout.language_list_item, listView)
val layoutSetName = subtype.subtype.getExtraValueOf(KEYBOARD_LAYOUT_SET) ?: "qwerty" val layoutSetName = subtype.subtype.mainLayoutName()
row.findViewById<TextView>(R.id.language_name).text = row.findViewById<TextView>(R.id.language_name).text =
SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(subtype.subtype) SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(subtype.subtype)
?: subtype.subtype.displayName(context) ?: subtype.subtype.displayName(context)

View file

@ -211,7 +211,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(this, editorInfo); final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(this, editorInfo);
return builder return builder
.setKeyboardGeometry(SPELLCHECKER_DUMMY_KEYBOARD_WIDTH, SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT) .setKeyboardGeometry(SPELLCHECKER_DUMMY_KEYBOARD_WIDTH, SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT)
.setSubtype(RichInputMethodSubtype.getRichInputMethodSubtype(subtype)) .setSubtype(RichInputMethodSubtype.Companion.get(subtype))
.setIsSpellChecker(true) .setIsSpellChecker(true)
.disableTouchPositionCorrectionData() .disableTouchPositionCorrectionData()
.build(); .build();

View file

@ -81,7 +81,7 @@ public final class AdditionalSubtypeUtils {
private static String getPrefSubtype(final InputMethodSubtype subtype) { private static String getPrefSubtype(final InputMethodSubtype subtype) {
final String keyboardLayoutSetName = SubtypeLocaleUtils.getKeyboardLayoutSetName(subtype); final String keyboardLayoutSetName = SubtypeLocaleUtils.getKeyboardLayoutSetName(subtype);
final String layoutExtraValue = KEYBOARD_LAYOUT_SET + "=" + keyboardLayoutSetName; final String layoutExtraValue = KEYBOARD_LAYOUT_SET + "=MAIN:" + keyboardLayoutSetName;
final String extraValue = StringUtils.removeFromCommaSplittableTextIfExists( final String extraValue = StringUtils.removeFromCommaSplittableTextIfExists(
layoutExtraValue, StringUtils.removeFromCommaSplittableTextIfExists( layoutExtraValue, StringUtils.removeFromCommaSplittableTextIfExists(
IS_ADDITIONAL_SUBTYPE, subtype.getExtraValue())); IS_ADDITIONAL_SUBTYPE, subtype.getExtraValue()));
@ -173,7 +173,7 @@ public final class AdditionalSubtypeUtils {
final String keyboardLayoutSetName, final boolean isAsciiCapable, final String keyboardLayoutSetName, final boolean isAsciiCapable,
final boolean isEmojiCapable) { final boolean isEmojiCapable) {
final ArrayList<String> extraValueItems = new ArrayList<>(); final ArrayList<String> extraValueItems = new ArrayList<>();
extraValueItems.add(KEYBOARD_LAYOUT_SET + "=" + keyboardLayoutSetName); extraValueItems.add(KEYBOARD_LAYOUT_SET + "=MAIN:" + keyboardLayoutSetName);
if (isAsciiCapable) { if (isAsciiCapable) {
extraValueItems.add(ASCII_CAPABLE); extraValueItems.add(ASCII_CAPABLE);
} }
@ -213,7 +213,7 @@ public final class AdditionalSubtypeUtils {
// - EmojiCapable // - EmojiCapable
// - isAdditionalSubtype // - isAdditionalSubtype
final ArrayList<String> compatibilityExtraValueItems = new ArrayList<>(); final ArrayList<String> compatibilityExtraValueItems = new ArrayList<>();
compatibilityExtraValueItems.add(KEYBOARD_LAYOUT_SET + "=" + keyboardLayoutSetName); compatibilityExtraValueItems.add(KEYBOARD_LAYOUT_SET + "=MAIN:" + keyboardLayoutSetName);
compatibilityExtraValueItems.add(ASCII_CAPABLE); compatibilityExtraValueItems.add(ASCII_CAPABLE);
if (SubtypeLocaleUtils.isExceptionalLocale(locale)) { if (SubtypeLocaleUtils.isExceptionalLocale(locale)) {
compatibilityExtraValueItems.add(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME + "=" + compatibilityExtraValueItems.add(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME + "=" +

View file

@ -224,7 +224,7 @@ fun getCustomFunctionalLayoutName(elementId: Int, subtype: InputMethodSubtype, c
val customFunctionalLayoutNames = getCustomLayoutFiles(context).filter { it.name.contains("functional") }.map { it.name.substringBeforeLast(".") + "." } val customFunctionalLayoutNames = getCustomLayoutFiles(context).filter { it.name.contains("functional") }.map { it.name.substringBeforeLast(".") + "." }
if (customFunctionalLayoutNames.isEmpty()) return null if (customFunctionalLayoutNames.isEmpty()) return null
val languageTag = subtype.locale().toLanguageTag() val languageTag = subtype.locale().toLanguageTag()
val mainLayoutName = subtype.getExtraValueOf(Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET) ?: "qwerty" val mainLayoutName = subtype.mainLayoutName()
if (elementId == KeyboardId.ELEMENT_SYMBOLS_SHIFTED) { if (elementId == KeyboardId.ELEMENT_SYMBOLS_SHIFTED) {
findMatchingLayout(customFunctionalLayoutNames.filter { it.startsWith(CUSTOM_FUNCTIONAL_LAYOUT_SYMBOLS_SHIFTED) }, mainLayoutName, languageTag) findMatchingLayout(customFunctionalLayoutNames.filter { it.startsWith(CUSTOM_FUNCTIONAL_LAYOUT_SYMBOLS_SHIFTED) }, mainLayoutName, languageTag)

View file

@ -47,7 +47,7 @@ public final class LanguageOnSpacebarUtils {
return FORMAT_TYPE_NONE; return FORMAT_TYPE_NONE;
} }
final String keyboardLanguage = locale.getLanguage(); final String keyboardLanguage = locale.getLanguage();
final String keyboardLayout = subtype.getKeyboardLayoutSetName(); final String keyboardLayout = subtype.getMainLayoutName();
int sameLanguageAndLayoutCount = 0; int sameLanguageAndLayoutCount = 0;
for (final InputMethodSubtype ims : sEnabledSubtypes) { for (final InputMethodSubtype ims : sEnabledSubtypes) {
final String language = SubtypeUtilsKt.locale(ims).getLanguage(); final String language = SubtypeUtilsKt.locale(ims).getLanguage();

View file

@ -0,0 +1,21 @@
package helium314.keyboard.latin.utils
import java.util.EnumMap
enum class LayoutType {
MAIN, SYMBOLS, MORE_SYMBOLS, FUNCTIONAL, NUMBER, NUMBER_ROW, NUMPAD,
NUMPAD_LANDSCAPE, PHONE, PHONE_SYMBOLS, EMOJI_BOTTOM, CLIPBOARD_BOTTOM;
companion object {
fun EnumMap<LayoutType, String>.toExtraValue() = map { "${it.key.name}:${it.value}" }.joinToString("|")
fun getLayoutMap(extraValue: String): EnumMap<LayoutType, String> {
val map = EnumMap<LayoutType, String>(LayoutType::class.java)
extraValue.split("|").forEach {
val s = it.split(":")
runCatching { map[LayoutType.valueOf(s[0])] = s[1] }
}
return map
}
}
}

View file

@ -19,7 +19,6 @@ import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import static helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.COMBINING_RULES; import static helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.COMBINING_RULES;
import static helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET;
import static helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME; import static helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -274,7 +273,7 @@ public final class SubtypeLocaleUtils {
@NonNull @NonNull
public static String getKeyboardLayoutSetName(final InputMethodSubtype subtype) { public static String getKeyboardLayoutSetName(final InputMethodSubtype subtype) {
String keyboardLayoutSet = subtype.getExtraValueOf(KEYBOARD_LAYOUT_SET); String keyboardLayoutSet = SubtypeUtilsKt.explicitMainLayoutName(subtype);
if (keyboardLayoutSet == null && subtype.isAsciiCapable()) { if (keyboardLayoutSet == null && subtype.isAsciiCapable()) {
keyboardLayoutSet = QWERTY; keyboardLayoutSet = QWERTY;
} }

View file

@ -41,7 +41,7 @@ fun getAllAvailableSubtypes(): List<InputMethodSubtype> {
fun getMatchingLayoutSetNameForLocale(locale: Locale): String { fun getMatchingLayoutSetNameForLocale(locale: Locale): String {
val subtypes = resourceSubtypesByLocale.values.flatten() val subtypes = resourceSubtypesByLocale.values.flatten()
val name = LocaleUtils.getBestMatch(locale, subtypes) { it.locale() }?.getExtraValueOf(Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET) val name = LocaleUtils.getBestMatch(locale, subtypes) { it.locale() }?.explicitMainLayoutName()
if (name != null) return name if (name != null) return name
return when (locale.script()) { return when (locale.script()) {
ScriptUtils.SCRIPT_LATIN -> "qwerty" ScriptUtils.SCRIPT_LATIN -> "qwerty"

View file

@ -3,6 +3,7 @@ package helium314.keyboard.latin.utils
import android.content.Context import android.content.Context
import android.os.Build import android.os.Build
import android.view.inputmethod.InputMethodSubtype import android.view.inputmethod.InputMethodSubtype
import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET
import helium314.keyboard.latin.common.LocaleUtils import helium314.keyboard.latin.common.LocaleUtils
import helium314.keyboard.latin.common.LocaleUtils.constructLocale import helium314.keyboard.latin.common.LocaleUtils.constructLocale
import java.util.Locale import java.util.Locale
@ -15,6 +16,16 @@ fun InputMethodSubtype.locale(): Locale {
@Suppress("deprecation") return locale.constructLocale() @Suppress("deprecation") return locale.constructLocale()
} }
fun InputMethodSubtype.mainLayoutName(): String {
val map = LayoutType.getLayoutMap(getExtraValueOf(KEYBOARD_LAYOUT_SET) ?: "")
return map[LayoutType.MAIN] ?: "qwerty"
}
fun InputMethodSubtype.explicitMainLayoutName(): String? {
val map = LayoutType.getLayoutMap(getExtraValueOf(KEYBOARD_LAYOUT_SET) ?: "")
return map[LayoutType.MAIN]
}
/** Workaround for SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale ignoring custom layout names */ /** Workaround for SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale ignoring custom layout names */
// todo (later): this should be done properly and in SubtypeLocaleUtils // todo (later): this should be done properly and in SubtypeLocaleUtils
fun InputMethodSubtype.displayName(context: Context): CharSequence { fun InputMethodSubtype.displayName(context: Context): CharSequence {

View file

@ -7,7 +7,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.LayoutDirection
import androidx.navigation.NavOptions
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
@ -57,6 +56,7 @@ fun SettingsNavHost(
onClickGestureTyping = { navController.navigate(SettingsDestination.GestureTyping) }, onClickGestureTyping = { navController.navigate(SettingsDestination.GestureTyping) },
onClickAdvanced = { navController.navigate(SettingsDestination.Advanced) }, onClickAdvanced = { navController.navigate(SettingsDestination.Advanced) },
onClickAppearance = { navController.navigate(SettingsDestination.Appearance) }, onClickAppearance = { navController.navigate(SettingsDestination.Appearance) },
onClickLanguage = { navController.navigate(SettingsDestination.Languages) },
onClickBack = ::goBack, onClickBack = ::goBack,
) )
} }
@ -90,9 +90,7 @@ fun SettingsNavHost(
// ) // )
} }
composable(SettingsDestination.Languages) { composable(SettingsDestination.Languages) {
// LanguagesSettingsScreen( // LanguageScreen(onClickBack = ::goBack)
// onClickBack = ::goBack
// )
} }
composable(SettingsDestination.Colors) { composable(SettingsDestination.Colors) {
ColorsScreen(isNight = false, onClickBack = ::goBack) ColorsScreen(isNight = false, onClickBack = ::goBack)

View file

@ -39,6 +39,7 @@ fun MainSettingsScreen(
onClickGestureTyping: () -> Unit, onClickGestureTyping: () -> Unit,
onClickAdvanced: () -> Unit, onClickAdvanced: () -> Unit,
onClickAppearance: () -> Unit, onClickAppearance: () -> Unit,
onClickLanguage: () -> Unit,
onClickBack: () -> Unit, onClickBack: () -> Unit,
) { ) {
val ctx = LocalContext.current val ctx = LocalContext.current
@ -48,6 +49,17 @@ fun MainSettingsScreen(
settings = emptyList(), settings = emptyList(),
) { ) {
Column(Modifier.verticalScroll(rememberScrollState())) { Column(Modifier.verticalScroll(rememberScrollState())) {
Preference(
name = stringResource(R.string.language_and_layouts_title),
onClick = onClickLanguage,
icon = R.drawable.ic_settings_languages_foreground
) {
Icon(
painter = painterResource(R.drawable.ic_arrow_left),
modifier = Modifier.scale(-1f, 1f),
contentDescription = null
)
}
Preference( Preference(
name = stringResource(R.string.settings_screen_preferences), name = stringResource(R.string.settings_screen_preferences),
onClick = onClickPreferences, onClick = onClickPreferences,
@ -169,7 +181,7 @@ fun MainSettingsScreen(
private fun PreviewScreen() { private fun PreviewScreen() {
Theme(true) { Theme(true) {
Surface { Surface {
MainSettingsScreen({}, {}, {}, {}, {}, {}, {}, {}) MainSettingsScreen({}, {}, {}, {}, {}, {}, {}, {}, {})
} }
} }
} }

View file

@ -166,7 +166,7 @@
android:imeSubtypeLocale="ar" android:imeSubtypeLocale="ar"
android:languageTag="ar" android:languageTag="ar"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=arabic,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:arabic,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -175,7 +175,7 @@
android:imeSubtypeLocale="ar" android:imeSubtypeLocale="ar"
android:languageTag="ar" android:languageTag="ar"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=arabic_pc,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:arabic_pc,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -184,7 +184,7 @@
android:imeSubtypeLocale="ar" android:imeSubtypeLocale="ar"
android:languageTag="ar" android:languageTag="ar"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=arabic_hijai,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:arabic_hijai,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -202,7 +202,7 @@
android:imeSubtypeLocale="be_BY" android:imeSubtypeLocale="be_BY"
android:languageTag="be-BY" android:languageTag="be-BY"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=belarusian,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:belarusian,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -211,7 +211,7 @@
android:imeSubtypeLocale="bg" android:imeSubtypeLocale="bg"
android:languageTag="bg" android:languageTag="bg"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=bulgarian,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:bulgarian,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -220,7 +220,7 @@
android:imeSubtypeLocale="bg" android:imeSubtypeLocale="bg"
android:languageTag="bg" android:languageTag="bg"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=bulgarian_bds,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:bulgarian_bds,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -229,7 +229,7 @@
android:imeSubtypeLocale="bg" android:imeSubtypeLocale="bg"
android:languageTag="bg" android:languageTag="bg"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=bulgarian_bekl,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:bulgarian_bekl,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -238,7 +238,7 @@
android:imeSubtypeLocale="bn_BD" android:imeSubtypeLocale="bn_BD"
android:languageTag="bn-BD" android:languageTag="bn-BD"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=bengali_unijoy,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:bengali_unijoy,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -247,7 +247,7 @@
android:imeSubtypeLocale="bn_BD" android:imeSubtypeLocale="bn_BD"
android:languageTag="bn-BD" android:languageTag="bn-BD"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=bengali_akkhor,NoShiftProximityCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:bengali_akkhor,NoShiftProximityCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -256,7 +256,7 @@
android:imeSubtypeLocale="bn_BD" android:imeSubtypeLocale="bn_BD"
android:languageTag="bn-BD" android:languageTag="bn-BD"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=bengali_probhat,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:bengali_probhat,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -265,7 +265,7 @@
android:imeSubtypeLocale="bn_IN" android:imeSubtypeLocale="bn_IN"
android:languageTag="bn-IN" android:languageTag="bn-IN"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=bengali,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:bengali,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -274,7 +274,7 @@
android:imeSubtypeLocale="ca" android:imeSubtypeLocale="ca"
android:languageTag="ca" android:languageTag="ca"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -283,7 +283,7 @@
android:imeSubtypeLocale="cs" android:imeSubtypeLocale="cs"
android:languageTag="cs" android:languageTag="cs"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -292,7 +292,7 @@
android:imeSubtypeLocale="cv" android:imeSubtypeLocale="cv"
android:languageTag="cv" android:languageTag="cv"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=chuvash,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:chuvash,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -301,7 +301,7 @@
android:imeSubtypeLocale="da" android:imeSubtypeLocale="da"
android:languageTag="da" android:languageTag="da"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -310,7 +310,7 @@
android:imeSubtypeLocale="de" android:imeSubtypeLocale="de"
android:languageTag="de" android:languageTag="de"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -319,7 +319,7 @@
android:imeSubtypeLocale="de_CH" android:imeSubtypeLocale="de_CH"
android:languageTag="de-CH" android:languageTag="de-CH"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -328,7 +328,7 @@
android:imeSubtypeLocale="de_DE" android:imeSubtypeLocale="de_DE"
android:languageTag="de-DE" android:languageTag="de-DE"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -337,7 +337,7 @@
android:imeSubtypeLocale="el" android:imeSubtypeLocale="el"
android:languageTag="el" android:languageTag="el"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=greek,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:greek,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -355,7 +355,7 @@
android:imeSubtypeLocale="eo" android:imeSubtypeLocale="eo"
android:languageTag="eo" android:languageTag="eo"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=esperanto,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:esperanto,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -364,7 +364,7 @@
android:imeSubtypeLocale="es" android:imeSubtypeLocale="es"
android:languageTag="es" android:languageTag="es"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -373,7 +373,7 @@
android:imeSubtypeLocale="es_US" android:imeSubtypeLocale="es_US"
android:languageTag="es-US" android:languageTag="es-US"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -382,7 +382,7 @@
android:imeSubtypeLocale="es_419" android:imeSubtypeLocale="es_419"
android:languageTag="es-419" android:languageTag="es-419"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -391,7 +391,7 @@
android:imeSubtypeLocale="et_EE" android:imeSubtypeLocale="et_EE"
android:languageTag="et-EE" android:languageTag="et-EE"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -400,7 +400,7 @@
android:imeSubtypeLocale="eu_ES" android:imeSubtypeLocale="eu_ES"
android:languageTag="eu-ES" android:languageTag="eu-ES"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -409,7 +409,7 @@
android:imeSubtypeLocale="fa" android:imeSubtypeLocale="fa"
android:languageTag="fa" android:languageTag="fa"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=farsi,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:farsi,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -418,7 +418,7 @@
android:imeSubtypeLocale="fi" android:imeSubtypeLocale="fi"
android:languageTag="fi" android:languageTag="fi"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -427,7 +427,7 @@
android:imeSubtypeLocale="fr" android:imeSubtypeLocale="fr"
android:languageTag="fr" android:languageTag="fr"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=azerty,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:azerty,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -445,7 +445,7 @@
android:imeSubtypeLocale="fr_CH" android:imeSubtypeLocale="fr_CH"
android:languageTag="fr-CH" android:languageTag="fr-CH"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -454,7 +454,7 @@
android:imeSubtypeLocale="gl_ES" android:imeSubtypeLocale="gl_ES"
android:languageTag="gl-ES" android:languageTag="gl-ES"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -463,7 +463,7 @@
android:imeSubtypeLocale="gu" android:imeSubtypeLocale="gu"
android:languageTag="gu" android:languageTag="gu"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=gujarati,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:gujarati,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -472,7 +472,7 @@
android:imeSubtypeLocale="hi" android:imeSubtypeLocale="hi"
android:languageTag="hi" android:languageTag="hi"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=hindi,NoShiftProximityCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:hindi,NoShiftProximityCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -481,7 +481,7 @@
android:imeSubtypeLocale="hi" android:imeSubtypeLocale="hi"
android:languageTag="hi" android:languageTag="hi"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=hindi_compact,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:hindi_compact,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -490,7 +490,7 @@
android:imeSubtypeLocale="hi" android:imeSubtypeLocale="hi"
android:languageTag="hi" android:languageTag="hi"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=hindi_phonetic,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:hindi_phonetic,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<!-- This Hinglish keyboard is a preliminary layout. <!-- This Hinglish keyboard is a preliminary layout.
@ -511,7 +511,7 @@
android:imeSubtypeLocale="hr" android:imeSubtypeLocale="hr"
android:languageTag="hr" android:languageTag="hr"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -520,7 +520,7 @@
android:imeSubtypeLocale="hu" android:imeSubtypeLocale="hu"
android:languageTag="hu" android:languageTag="hu"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -529,7 +529,7 @@
android:imeSubtypeLocale="hu" android:imeSubtypeLocale="hu"
android:languageTag="hu" android:languageTag="hu"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=hungarian_extended_qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:hungarian_extended_qwertz,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -538,7 +538,7 @@
android:imeSubtypeLocale="hy_AM" android:imeSubtypeLocale="hy_AM"
android:languageTag="hy-AM" android:languageTag="hy-AM"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=armenian_phonetic,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:armenian_phonetic,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<!-- Java uses the deprecated "in" code instead of the standard "id" code for Indonesian. --> <!-- Java uses the deprecated "in" code instead of the standard "id" code for Indonesian. -->
@ -575,7 +575,7 @@
android:imeSubtypeLocale="it_CH" android:imeSubtypeLocale="it_CH"
android:languageTag="it-CH" android:languageTag="it-CH"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<!-- Java uses the deprecated "iw" code instead of the standard "he" code for Hebrew. --> <!-- Java uses the deprecated "iw" code instead of the standard "he" code for Hebrew. -->
@ -585,7 +585,7 @@
android:imeSubtypeLocale="iw" android:imeSubtypeLocale="iw"
android:languageTag="he" android:languageTag="he"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=hebrew,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:hebrew,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -594,7 +594,7 @@
android:imeSubtypeLocale="iw" android:imeSubtypeLocale="iw"
android:languageTag="he" android:languageTag="he"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=hebrew_1452_2,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:hebrew_1452_2,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -603,7 +603,7 @@
android:imeSubtypeLocale="kab" android:imeSubtypeLocale="kab"
android:languageTag="kab" android:languageTag="kab"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=kabyle,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:kabyle,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -612,7 +612,7 @@
android:imeSubtypeLocale="ka_GE" android:imeSubtypeLocale="ka_GE"
android:languageTag="ka-GE" android:languageTag="ka-GE"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=georgian,NoShiftProximityCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:georgian,NoShiftProximityCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -621,7 +621,7 @@
android:imeSubtypeLocale="kk" android:imeSubtypeLocale="kk"
android:languageTag="kk" android:languageTag="kk"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=russian,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:russian,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -630,7 +630,7 @@
android:imeSubtypeLocale="km_KH" android:imeSubtypeLocale="km_KH"
android:languageTag="km-KH" android:languageTag="km-KH"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=khmer,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:khmer,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -639,7 +639,7 @@
android:imeSubtypeLocale="kn_IN" android:imeSubtypeLocale="kn_IN"
android:languageTag="kn-IN" android:languageTag="kn-IN"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=kannada,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:kannada,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -648,7 +648,7 @@
android:imeSubtypeLocale="kn_IN" android:imeSubtypeLocale="kn_IN"
android:languageTag="kn-IN" android:languageTag="kn-IN"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=kannada_extended,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:kannada_extended,NoShiftKey,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -657,7 +657,7 @@
android:imeSubtypeLocale="ko" android:imeSubtypeLocale="ko"
android:languageTag="ko" android:languageTag="ko"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=korean,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:korean,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -666,7 +666,7 @@
android:imeSubtypeLocale="ko" android:imeSubtypeLocale="ko"
android:languageTag="ko" android:languageTag="ko"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=korean_sebeolsik_390,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:korean_sebeolsik_390,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -675,7 +675,7 @@
android:imeSubtypeLocale="ko" android:imeSubtypeLocale="ko"
android:languageTag="ko" android:languageTag="ko"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=korean_sebeolsik_final,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:korean_sebeolsik_final,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -684,7 +684,7 @@
android:imeSubtypeLocale="ky" android:imeSubtypeLocale="ky"
android:languageTag="ky" android:languageTag="ky"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=russian,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:russian,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -693,7 +693,7 @@
android:imeSubtypeLocale="dru" android:imeSubtypeLocale="dru"
android:languageTag="dru" android:languageTag="dru"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=dargwa_urakhi,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:dargwa_urakhi,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -702,7 +702,7 @@
android:imeSubtypeLocale="xdq" android:imeSubtypeLocale="xdq"
android:languageTag="xdq" android:languageTag="xdq"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=kaitag,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:kaitag,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -711,7 +711,7 @@
android:imeSubtypeLocale="lb" android:imeSubtypeLocale="lb"
android:languageTag="lb" android:languageTag="lb"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz,AsciiCapable,EmojiCapable"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
android:label="@string/subtype_generic" android:label="@string/subtype_generic"
@ -719,7 +719,7 @@
android:imeSubtypeLocale="lo_LA" android:imeSubtypeLocale="lo_LA"
android:languageTag="lo-LA" android:languageTag="lo-LA"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=lao,NoShiftProximityCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:lao,NoShiftProximityCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -746,7 +746,7 @@
android:imeSubtypeLocale="mhr" android:imeSubtypeLocale="mhr"
android:languageTag="mhr" android:languageTag="mhr"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=mari,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:mari,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -755,7 +755,7 @@
android:imeSubtypeLocale="mk" android:imeSubtypeLocale="mk"
android:languageTag="mk" android:languageTag="mk"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=macedonian,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:macedonian,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -764,7 +764,7 @@
android:imeSubtypeLocale="ml_IN" android:imeSubtypeLocale="ml_IN"
android:languageTag="ml-IN" android:languageTag="ml-IN"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=malayalam,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:malayalam,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -773,7 +773,7 @@
android:imeSubtypeLocale="mn_MN" android:imeSubtypeLocale="mn_MN"
android:languageTag="mn-MN" android:languageTag="mn-MN"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=mongolian,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:mongolian,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -782,7 +782,7 @@
android:imeSubtypeLocale="mns" android:imeSubtypeLocale="mns"
android:languageTag="mns" android:languageTag="mns"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=mansi_north,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:mansi_north,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -791,7 +791,7 @@
android:imeSubtypeLocale="mr_IN" android:imeSubtypeLocale="mr_IN"
android:languageTag="mr-IN" android:languageTag="mr-IN"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=marathi,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:marathi,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -809,7 +809,7 @@
android:imeSubtypeLocale="nb" android:imeSubtypeLocale="nb"
android:languageTag="nb" android:languageTag="nb"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -818,7 +818,7 @@
android:imeSubtypeLocale="ne_NP" android:imeSubtypeLocale="ne_NP"
android:languageTag="ne-NP" android:languageTag="ne-NP"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=nepali_romanized,NoShiftProximityCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:nepali_romanized,NoShiftProximityCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -827,7 +827,7 @@
android:imeSubtypeLocale="ne_NP" android:imeSubtypeLocale="ne_NP"
android:languageTag="ne-NP" android:languageTag="ne-NP"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=nepali_traditional,NoShiftProximityCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:nepali_traditional,NoShiftProximityCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -845,7 +845,7 @@
android:imeSubtypeLocale="nl_BE" android:imeSubtypeLocale="nl_BE"
android:languageTag="nl-BE" android:languageTag="nl-BE"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=azerty,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:azerty,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -899,7 +899,7 @@
android:imeSubtypeLocale="ru" android:imeSubtypeLocale="ru"
android:languageTag="ru" android:languageTag="ru"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=russian,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:russian,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -908,7 +908,7 @@
android:imeSubtypeLocale="ru" android:imeSubtypeLocale="ru"
android:languageTag="ru" android:languageTag="ru"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=russian_student,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:russian_student,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<!-- TODO: This Sinhala keyboard is a preliminary layout. <!-- TODO: This Sinhala keyboard is a preliminary layout.
@ -920,7 +920,7 @@
android:imeSubtypeLocale="si_LK" android:imeSubtypeLocale="si_LK"
android:languageTag="si-LK" android:languageTag="si-LK"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=sinhala,NoShiftProximityCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:sinhala,NoShiftProximityCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -947,7 +947,7 @@
android:imeSubtypeLocale="sr" android:imeSubtypeLocale="sr"
android:languageTag="sr" android:languageTag="sr"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=serbian,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:serbian,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<!-- This Serbian Latin keyboard is a preliminary layout. <!-- This Serbian Latin keyboard is a preliminary layout.
@ -958,7 +958,7 @@
android:imeSubtypeLocale="sr_ZZ" android:imeSubtypeLocale="sr_ZZ"
android:languageTag="sr-Latn" android:languageTag="sr-Latn"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwertz+,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwertz+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -967,7 +967,7 @@
android:imeSubtypeLocale="sv" android:imeSubtypeLocale="sv"
android:languageTag="sv" android:languageTag="sv"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -985,7 +985,7 @@
android:imeSubtypeLocale="ta_IN" android:imeSubtypeLocale="ta_IN"
android:languageTag="ta-IN" android:languageTag="ta-IN"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=tamil,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:tamil,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<!-- TODO: Enabling/Disabling ta_LK subtype must be aligned with si_LK subtype. --> <!-- TODO: Enabling/Disabling ta_LK subtype must be aligned with si_LK subtype. -->
@ -996,7 +996,7 @@
android:imeSubtypeLocale="ta_LK" android:imeSubtypeLocale="ta_LK"
android:languageTag="ta-LK" android:languageTag="ta-LK"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=tamil,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:tamil,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
!--> !-->
@ -1006,7 +1006,7 @@
android:imeSubtypeLocale="ta_SG" android:imeSubtypeLocale="ta_SG"
android:languageTag="ta-SG" android:languageTag="ta-SG"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=tamil,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:tamil,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -1015,7 +1015,7 @@
android:imeSubtypeLocale="te_IN" android:imeSubtypeLocale="te_IN"
android:languageTag="te-IN" android:languageTag="te-IN"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=telugu,NoShiftKey,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:telugu,NoShiftKey,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -1024,7 +1024,7 @@
android:imeSubtypeLocale="th" android:imeSubtypeLocale="th"
android:languageTag="th" android:languageTag="th"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=thai,NoShiftProximityCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:thai,NoShiftProximityCorrection,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -1033,7 +1033,7 @@
android:imeSubtypeLocale="tl" android:imeSubtypeLocale="tl"
android:languageTag="tl" android:languageTag="tl"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty+,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -1042,7 +1042,7 @@
android:imeSubtypeLocale="tr" android:imeSubtypeLocale="tr"
android:languageTag="tr" android:languageTag="tr"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=turkish,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:turkish,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -1051,7 +1051,7 @@
android:imeSubtypeLocale="uk" android:imeSubtypeLocale="uk"
android:languageTag="uk" android:languageTag="uk"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=ukrainian,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:ukrainian,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
@ -1060,7 +1060,7 @@
android:imeSubtypeLocale="ur_PK" android:imeSubtypeLocale="ur_PK"
android:languageTag="ur-PK" android:languageTag="ur-PK"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=urdu,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:urdu,EmojiCapable"
android:isAsciiCapable="false" android:isAsciiCapable="false"
/> />
<!-- This Uzbek keyboard is a preliminary layout. <!-- This Uzbek keyboard is a preliminary layout.
@ -1071,7 +1071,7 @@
android:imeSubtypeLocale="uz_UZ" android:imeSubtypeLocale="uz_UZ"
android:languageTag="uz-UZ" android:languageTag="uz-UZ"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="KeyboardLayoutSet=uzbek,AsciiCapable,EmojiCapable" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:uzbek,AsciiCapable,EmojiCapable"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"

View file

@ -24,7 +24,7 @@ the system picker crashes on some devices for unknown reasons.
<subtype android:icon="@drawable/ic_ime_switcher" <subtype android:icon="@drawable/ic_ime_switcher"
android:imeSubtypeExtraValue="dummy" android:imeSubtypeExtraValue="dummy"
android:imeSubtypeMode="keyboard" android:imeSubtypeMode="keyboard"
android:subtypeId="0xf000000f" android:subtypeId="0x7000000f"
android:isAsciiCapable="true" android:isAsciiCapable="true"
/> />
</input-method> </input-method>

View file

@ -494,7 +494,7 @@ f""", // no newline at the end
val editorInfoField = KeyboardLayoutSet.Params::class.java.getDeclaredField("mEditorInfo").apply { isAccessible = true } val editorInfoField = KeyboardLayoutSet.Params::class.java.getDeclaredField("mEditorInfo").apply { isAccessible = true }
editorInfoField.set(layoutParams, editorInfo) editorInfoField.set(layoutParams, editorInfo)
val subtypeField = KeyboardLayoutSet.Params::class.java.getDeclaredField("mSubtype").apply { isAccessible = true } val subtypeField = KeyboardLayoutSet.Params::class.java.getDeclaredField("mSubtype").apply { isAccessible = true }
subtypeField.set(layoutParams, RichInputMethodSubtype(subtype)) subtypeField.set(layoutParams, RichInputMethodSubtype.get(subtype))
val widthField = KeyboardLayoutSet.Params::class.java.getDeclaredField("mKeyboardWidth").apply { isAccessible = true } val widthField = KeyboardLayoutSet.Params::class.java.getDeclaredField("mKeyboardWidth").apply { isAccessible = true }
widthField.setInt(layoutParams, 500) widthField.setInt(layoutParams, 500)
val heightField = KeyboardLayoutSet.Params::class.java.getDeclaredField("mKeyboardHeight").apply { isAccessible = true } val heightField = KeyboardLayoutSet.Params::class.java.getDeclaredField("mKeyboardHeight").apply { isAccessible = true }