InputMethodUtilsTest.java revision 443c2bafd824779a75cd4b922b6839a8df9795e9
1f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka/*
2f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * Copyright (C) 2013 The Android Open Source Project
3f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka *
4f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License");
5f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * you may not use this file except in compliance with the License.
6f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * You may obtain a copy of the License at
7f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka *
8f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka *      http://www.apache.org/licenses/LICENSE-2.0
9f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka *
10f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * Unless required by applicable law or agreed to in writing, software
11f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS,
12f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * See the License for the specific language governing permissions and
14f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka * limitations under the License.
15f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka */
16f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
17f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokapackage android.os;
18f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
19f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport com.android.internal.inputmethod.InputMethodUtils;
20f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
21f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport android.content.Context;
22f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport android.content.pm.ApplicationInfo;
23f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport android.content.pm.ResolveInfo;
24f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport android.content.pm.ServiceInfo;
25f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport android.test.InstrumentationTestCase;
26f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport android.test.suitebuilder.annotation.SmallTest;
27f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport android.view.inputmethod.InputMethodInfo;
28f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport android.view.inputmethod.InputMethodSubtype;
29443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawaimport android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
30f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
31f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport java.util.ArrayList;
32f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokaimport java.util.List;
33f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
34f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataokapublic class InputMethodTest extends InstrumentationTestCase {
35f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static final boolean IS_AUX = true;
36f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static final boolean IS_DEFAULT = true;
37f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static final boolean IS_AUTO = true;
38589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    private static final ArrayList<InputMethodSubtype> NO_SUBTYPE = null;
39f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
40f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    @SmallTest
41f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    public void testDefaultEnabledImesWithDefaultVoiceIme() throws Exception {
42f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final Context context = getInstrumentation().getTargetContext();
43f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodInfo> imis = new ArrayList<InputMethodInfo>();
44f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createDefaultAutoDummyVoiceIme());
45f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createNonDefaultAutoDummyVoiceIme0());
46f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createNonDefaultAutoDummyVoiceIme1());
47f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createNonDefaultDummyVoiceIme2());
48f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createDefaultDummyEnUSKeyboardIme());
49f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createNonDefaultDummyJaJPKeyboardIme());
50589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        imis.add(createNonDefaultDummyJaJPKeyboardImeWithoutSubtypes());
51f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodInfo> enabledImis = InputMethodUtils.getDefaultEnabledImes(
52f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                context, true, imis);
53f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        assertEquals(2, enabledImis.size());
54f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        for (int i = 0; i < enabledImis.size(); ++i) {
55f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            final InputMethodInfo imi = enabledImis.get(0);
56f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            // "DummyDefaultAutoVoiceIme" and "DummyDefaultEnKeyboardIme"
57f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            if (imi.getPackageName().equals("DummyDefaultAutoVoiceIme")
58f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                    || imi.getPackageName().equals("DummyDefaultEnKeyboardIme")) {
59f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                continue;
60f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            } else {
61f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                fail("Invalid enabled subtype.");
62f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            }
63f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        }
64f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
65f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
66f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    @SmallTest
67f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    public void testDefaultEnabledImesWithOutDefaultVoiceIme() throws Exception {
68f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final Context context = getInstrumentation().getTargetContext();
69f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodInfo> imis = new ArrayList<InputMethodInfo>();
70f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createNonDefaultAutoDummyVoiceIme0());
71f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createNonDefaultAutoDummyVoiceIme1());
72f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createNonDefaultDummyVoiceIme2());
73f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createDefaultDummyEnUSKeyboardIme());
74f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        imis.add(createNonDefaultDummyJaJPKeyboardIme());
75589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        imis.add(createNonDefaultDummyJaJPKeyboardImeWithoutSubtypes());
76f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodInfo> enabledImis = InputMethodUtils.getDefaultEnabledImes(
77f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                context, true, imis);
78f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        assertEquals(3, enabledImis.size());
79f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        for (int i = 0; i < enabledImis.size(); ++i) {
80f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            final InputMethodInfo imi = enabledImis.get(0);
81f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            // "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1" and
82f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            // "DummyDefaultEnKeyboardIme"
83f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            if (imi.getPackageName().equals("DummyNonDefaultAutoVoiceIme0")
84f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                    || imi.getPackageName().equals("DummyNonDefaultAutoVoiceIme1")
85f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                    || imi.getPackageName().equals("DummyDefaultEnKeyboardIme")) {
86f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                continue;
87f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            } else {
88f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                fail("Invalid enabled subtype.");
89f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            }
90f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        }
91f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
92f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
93589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    @SmallTest
94589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    public void testParcelable() throws Exception {
95589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        final ArrayList<InputMethodInfo> originalList = new ArrayList<InputMethodInfo>();
96589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        originalList.add(createNonDefaultAutoDummyVoiceIme0());
97589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        originalList.add(createNonDefaultAutoDummyVoiceIme1());
98589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        originalList.add(createNonDefaultDummyVoiceIme2());
99589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        originalList.add(createDefaultDummyEnUSKeyboardIme());
100589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        originalList.add(createNonDefaultDummyJaJPKeyboardIme());
101589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        originalList.add(createNonDefaultDummyJaJPKeyboardImeWithoutSubtypes());
102589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa
103589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        final List<InputMethodInfo> clonedList = cloneViaParcel(originalList);
104589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        assertNotNull(clonedList);
105c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa        final List<InputMethodInfo> clonedClonedList = cloneViaParcel(clonedList);
106c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa        assertNotNull(clonedClonedList);
107589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        assertEquals(originalList, clonedList);
108c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa        assertEquals(clonedList, clonedClonedList);
109c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa        assertEquals(originalList.size(), clonedList.size());
110c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa        assertEquals(clonedList.size(), clonedClonedList.size());
111589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        for (int imeIndex = 0; imeIndex < originalList.size(); ++imeIndex) {
112c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa            verifyEquality(originalList.get(imeIndex), clonedList.get(imeIndex));
113c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa            verifyEquality(clonedList.get(imeIndex), clonedClonedList.get(imeIndex));
114589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        }
115589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    }
116589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa
117589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    private static List<InputMethodInfo> cloneViaParcel(final List<InputMethodInfo> list) {
118589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        Parcel p = null;
119589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        try {
120589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa            p = Parcel.obtain();
121589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa            p.writeTypedList(list);
122589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa            p.setDataPosition(0);
123589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa            return p.createTypedArrayList(InputMethodInfo.CREATOR);
124589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        } finally {
125589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa            if (p != null) {
126589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa                p.recycle();
127589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa            }
128589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        }
129589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    }
130589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa
131c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa    private static void verifyEquality(InputMethodInfo expected, InputMethodInfo actual) {
132c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa        assertEquals(expected, actual);
133c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa        assertEquals(expected.getSubtypeCount(), actual.getSubtypeCount());
134c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa        for (int subtypeIndex = 0; subtypeIndex < expected.getSubtypeCount(); ++subtypeIndex) {
135c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa            final InputMethodSubtype expectedSubtype = expected.getSubtypeAt(subtypeIndex);
136c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa            final InputMethodSubtype actualSubtype = actual.getSubtypeAt(subtypeIndex);
137c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa            assertEquals(expectedSubtype, actualSubtype);
138c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa            assertEquals(expectedSubtype.hashCode(), actualSubtype.hashCode());
139c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa        }
140c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa    }
141c18cd393f65146fac03a9bdfa45380a69460ee98Yohei Yukawa
142f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static InputMethodInfo createDummyInputMethodInfo(String packageName, String name,
143f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            CharSequence label, boolean isAuxIme, boolean isDefault,
144f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            List<InputMethodSubtype> subtypes) {
145f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ResolveInfo ri = new ResolveInfo();
146f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ServiceInfo si = new ServiceInfo();
147f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ApplicationInfo ai = new ApplicationInfo();
148f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        ai.packageName = packageName;
149f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        ai.enabled = true;
150f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        ai.flags |= ApplicationInfo.FLAG_SYSTEM;
151f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        si.applicationInfo = ai;
152f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        si.enabled = true;
153f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        si.packageName = packageName;
154f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        si.name = name;
155f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        si.exported = true;
156f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        si.nonLocalizedLabel = label;
157f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        ri.serviceInfo = si;
158f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        return new InputMethodInfo(ri, isAuxIme, "", subtypes, 1, isDefault);
159f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
160f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
161f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static InputMethodSubtype createDummyInputMethodSubtype(String locale, String mode,
162f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka            boolean isAuxiliary, boolean overridesImplicitlyEnabledSubtype) {
163443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawa        return new InputMethodSubtypeBuilder()
164443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawa                .setSubtypeNameResId(0)
165443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawa                .setSubtypeIconResId(0)
166443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawa                .setSubtypeLocale(locale)
167443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawa                .setSubtypeMode(mode)
168443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawa                .setSubtypeExtraValue("")
169443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawa                .setIsAuxiliary(isAuxiliary)
170443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawa                .setOverridesImplicitlyEnabledSubtype(overridesImplicitlyEnabledSubtype)
171443c2bafd824779a75cd4b922b6839a8df9795e9Yohei Yukawa                .build();
172f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
173f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
174f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static InputMethodInfo createDefaultAutoDummyVoiceIme() {
175f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
176f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        subtypes.add(createDummyInputMethodSubtype("auto", "voice", IS_AUX, IS_AUTO));
177f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
178f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        return createDummyInputMethodInfo("DummyDefaultAutoVoiceIme", "dummy.voice0",
179f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                "DummyVoice0", IS_AUX, IS_DEFAULT, subtypes);
180f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
181f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
182f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static InputMethodInfo createNonDefaultAutoDummyVoiceIme0() {
183f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
184f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        subtypes.add(createDummyInputMethodSubtype("auto", "voice", IS_AUX, IS_AUTO));
185f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
186f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        return createDummyInputMethodInfo("DummyNonDefaultAutoVoiceIme0", "dummy.voice1",
187f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                "DummyVoice1", IS_AUX, !IS_DEFAULT, subtypes);
188f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
189f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
190f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static InputMethodInfo createNonDefaultAutoDummyVoiceIme1() {
191f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
192f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        subtypes.add(createDummyInputMethodSubtype("auto", "voice", IS_AUX, IS_AUTO));
193f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
194f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        return createDummyInputMethodInfo("DummyNonDefaultAutoVoiceIme1", "dummy.voice2",
195f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                "DummyVoice2", IS_AUX, !IS_DEFAULT, subtypes);
196f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
197f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
198f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static InputMethodInfo createNonDefaultDummyVoiceIme2() {
199f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
200f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
201f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        return createDummyInputMethodInfo("DummyNonDefaultVoiceIme2", "dummy.voice3",
202f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                "DummyVoice3", IS_AUX, !IS_DEFAULT, subtypes);
203f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
204f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
205f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static InputMethodInfo createDefaultDummyEnUSKeyboardIme() {
206f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
207f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        subtypes.add(createDummyInputMethodSubtype("en_US", "keyboard", !IS_AUX, !IS_AUTO));
208f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        return createDummyInputMethodInfo("DummyDefaultEnKeyboardIme", "dummy.keyboard0",
209f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                "DummyKeyboard0", !IS_AUX, IS_DEFAULT, subtypes);
210f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
211f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka
212f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    private static InputMethodInfo createNonDefaultDummyJaJPKeyboardIme() {
213f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
214f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        subtypes.add(createDummyInputMethodSubtype("ja_JP", "keyboard", !IS_AUX, !IS_AUTO));
215f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka        return createDummyInputMethodInfo("DummyNonDefaultJaJPKeyboardIme", "dummy.keyboard1",
216f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka                "DummyKeyboard1", !IS_AUX, !IS_DEFAULT, subtypes);
217f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka    }
218589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa
219589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    // Although IMEs that have no subtype are considered to be deprecated, the Android framework
220589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    // must still be able to handle such IMEs as well as IMEs that have at least one subtype.
221589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    private static InputMethodInfo createNonDefaultDummyJaJPKeyboardImeWithoutSubtypes() {
222589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
223589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa        return createDummyInputMethodInfo("DummyNonDefaultJaJPKeyboardImeWithoutSubtypes",
224589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa                "dummy.keyboard2", "DummyKeyboard2", !IS_AUX, !IS_DEFAULT, NO_SUBTYPE);
225589800485d770cab7b159ffcf4b18c10ae2aee6dYohei Yukawa    }
226f1367b7e903a2a69a8f833bb272e91d77abd57c6Satoshi Kataoka}
227