11ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka/* 21ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * Copyright (C) 2013 The Android Open Source Project 31ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * 41ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License"); 51ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * you may not use this file except in compliance with the License. 61ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * You may obtain a copy of the License at 71ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * 81ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * http://www.apache.org/licenses/LICENSE-2.0 91ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * 101ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * Unless required by applicable law or agreed to in writing, software 111ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS, 121ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * See the License for the specific language governing permissions and 141ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * limitations under the License. 151ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka */ 161ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 171ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokapackage com.android.settings.inputmethod; 181ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 191ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport com.android.internal.inputmethod.InputMethodUtils; 201ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport com.android.internal.inputmethod.InputMethodUtils.InputMethodSettings; 211ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 221ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport android.app.ActivityManagerNative; 231ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport android.content.Context; 241ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport android.os.RemoteException; 251ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport android.util.Log; 261ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport android.util.Slog; 271ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport android.view.inputmethod.InputMethodInfo; 281ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport android.view.inputmethod.InputMethodManager; 291ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport android.view.inputmethod.InputMethodSubtype; 301ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 311ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport java.util.ArrayList; 321ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport java.util.HashMap; 335aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataokaimport java.util.HashSet; 341ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokaimport java.util.List; 35993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataokaimport java.util.Locale; 361ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 371ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka/** 381ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * This class is a wrapper for InputMethodSettings. You need to refresh internal states 391ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * manually on some events when "InputMethodInfo"s and "InputMethodSubtype"s can be 401ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka * changed. 411ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka */ 421ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataokapublic class InputMethodSettingValuesWrapper { 431ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka private static final String TAG = InputMethodSettingValuesWrapper.class.getSimpleName(); 44993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka private static final Locale ENGLISH_LOCALE = new Locale("en"); 45993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka 461ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka private static volatile InputMethodSettingValuesWrapper sInstance; 471ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka private final ArrayList<InputMethodInfo> mMethodList = new ArrayList<InputMethodInfo>(); 481ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka private final HashMap<String, InputMethodInfo> mMethodMap = 491ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka new HashMap<String, InputMethodInfo>(); 501ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka private final InputMethodSettings mSettings; 511ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka private final InputMethodManager mImm; 525aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka private final HashSet<InputMethodInfo> mAsciiCapableEnabledImis = 535aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka new HashSet<InputMethodInfo>(); 541ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 551ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka public static InputMethodSettingValuesWrapper getInstance(Context context) { 561ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka if (sInstance == null) { 571ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka synchronized(TAG) { 581ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka if (sInstance == null) { 591ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka sInstance = new InputMethodSettingValuesWrapper(context); 601ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 611ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 621ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 631ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka return sInstance; 641ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 651ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 661ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka private static int getDefaultCurrentUserId() { 671ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka try { 681ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka return ActivityManagerNative.getDefault().getCurrentUser().id; 691ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } catch (RemoteException e) { 701ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka Slog.w(TAG, "Couldn't get current user ID; guessing it's 0", e); 711ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 721ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka return 0; 731ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 741ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 751ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka // Ensure singleton 761ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka private InputMethodSettingValuesWrapper(Context context) { 771ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mSettings = 781ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka new InputMethodSettings(context.getResources(), context.getContentResolver(), 791ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mMethodMap, mMethodList, getDefaultCurrentUserId()); 801ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 811ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka refreshAllInputMethodAndSubtypes(); 821ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 831ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 841ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka public void refreshAllInputMethodAndSubtypes() { 851ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka synchronized (mMethodMap) { 861ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mMethodList.clear(); 871ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mMethodMap.clear(); 881ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka final List<InputMethodInfo> imms = mImm.getInputMethodList(); 891ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mMethodList.addAll(imms); 901ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka for (InputMethodInfo imi : imms) { 911ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mMethodMap.put(imi.getId(), imi); 921ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 935aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka updateAsciiCapableEnabledImis(); 945aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka } 955aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka } 965aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka 975aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka // TODO: Add a cts to ensure at least one AsciiCapableSubtypeEnabledImis exist 985aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka private void updateAsciiCapableEnabledImis() { 995aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka synchronized (mMethodMap) { 1005aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka mAsciiCapableEnabledImis.clear(); 1015aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka final List<InputMethodInfo> enabledImis = mSettings.getEnabledInputMethodListLocked(); 1025aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka for (final InputMethodInfo imi : enabledImis) { 1035aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka final int subtypeCount = imi.getSubtypeCount(); 1045aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka for (int i = 0; i < subtypeCount; ++i) { 1055aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka final InputMethodSubtype subtype = imi.getSubtypeAt(i); 1065aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka if (InputMethodUtils.SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode()) 1075aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka && subtype.isAsciiCapable()) { 1085aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka mAsciiCapableEnabledImis.add(imi); 1095aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka break; 1105aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka } 1115aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka } 1125aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka } 1131ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 1141ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 1151ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 1161ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka public List<InputMethodInfo> getInputMethodList() { 1171ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka synchronized (mMethodMap) { 1181ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka return mMethodList; 1191ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 1201ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 1211ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka 1221ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka public CharSequence getCurrentInputMethodName(Context context) { 1231ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka synchronized (mMethodMap) { 1241ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka final InputMethodInfo imi = mMethodMap.get(mSettings.getSelectedInputMethod()); 1251ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka if (imi == null) { 1261ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka Log.w(TAG, "Invalid selected imi: " + mSettings.getSelectedInputMethod()); 1271ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka return ""; 1281ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 1291ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka final InputMethodSubtype subtype = mImm.getCurrentInputMethodSubtype(); 1301ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka return InputMethodUtils.getImeAndSubtypeDisplayName(context, imi, subtype); 1311ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 1321ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka } 133993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka 134993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka public boolean isAlwaysCheckedIme(InputMethodInfo imi, Context context) { 135d3e8bed913693183435875d5506f51da243ba31aSatoshi Kataoka final boolean isEnabled = isEnabledImi(imi); 136c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka synchronized (mMethodMap) { 137d3e8bed913693183435875d5506f51da243ba31aSatoshi Kataoka if (mSettings.getEnabledInputMethodListLocked().size() <= 1 && isEnabled) { 138c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka return true; 139c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 140c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 141c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka 142c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka final int enabledValidSystemNonAuxAsciiCapableImeCount = 143c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka getEnabledValidSystemNonAuxAsciiCapableImeCount(context); 144c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka if (enabledValidSystemNonAuxAsciiCapableImeCount > 1) { 145c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka return false; 146993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka } 147c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka 148d3e8bed913693183435875d5506f51da243ba31aSatoshi Kataoka if (enabledValidSystemNonAuxAsciiCapableImeCount == 1 && !isEnabled) { 149c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka return false; 150c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 151c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka 152993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka if (!InputMethodUtils.isSystemIme(imi)) { 153993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka return false; 154993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka } 155993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka return isValidSystemNonAuxAsciiCapableIme(imi, context); 156993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka } 157993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka 158c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka private int getEnabledValidSystemNonAuxAsciiCapableImeCount(Context context) { 159c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka int count = 0; 160c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka final List<InputMethodInfo> enabledImis; 161c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka synchronized(mMethodMap) { 162c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka enabledImis = mSettings.getEnabledInputMethodListLocked(); 163c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 164c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka for (final InputMethodInfo imi : enabledImis) { 165c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka if (isValidSystemNonAuxAsciiCapableIme(imi, context)) { 166c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka ++count; 167c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 168c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 169c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka if (count == 0) { 170c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka Log.w(TAG, "No \"enabledValidSystemNonAuxAsciiCapableIme\"s found."); 171c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 172c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka return count; 173c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 174c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka 175c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka private boolean isEnabledImi(InputMethodInfo imi) { 176c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka final List<InputMethodInfo> enabledImis; 177c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka synchronized(mMethodMap) { 178c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka enabledImis = mSettings.getEnabledInputMethodListLocked(); 179c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 180c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka for (final InputMethodInfo tempImi : enabledImis) { 181c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka if (tempImi.getId().equals(imi.getId())) { 182c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka return true; 183c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 184c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 185c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka return false; 186c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 187c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka 1885aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka public boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi, 189c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka Context context) { 190993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka if (imi.isAuxiliaryIme()) { 191993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka return false; 192993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka } 193993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka if (InputMethodUtils.isValidSystemDefaultIme(true /* isSystemReady */, imi, context)) { 194993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka return true; 195993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka } 1965aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka if (mAsciiCapableEnabledImis.isEmpty()) { 1975aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka Log.w(TAG, "ascii capable subtype enabled imi not found. Fall back to English" 1985aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka + " Keyboard subtype."); 1995aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka return InputMethodUtils.containsSubtypeOf(imi, ENGLISH_LOCALE.getLanguage(), 2005aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka InputMethodUtils.SUBTYPE_MODE_KEYBOARD); 2015aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka } 2025aef342aadfdb612e8cbed698576b70c61eb444aSatoshi Kataoka return mAsciiCapableEnabledImis.contains(imi); 203993f6ecf4065501433271b5fd5daf21a6f3ae586Satoshi Kataoka } 2041ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka} 205