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