1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.os;
18
19import com.android.internal.inputmethod.InputMethodUtils;
20
21import android.content.Context;
22import android.content.pm.ApplicationInfo;
23import android.content.pm.ResolveInfo;
24import android.content.pm.ServiceInfo;
25import android.test.InstrumentationTestCase;
26import android.test.suitebuilder.annotation.SmallTest;
27import android.view.inputmethod.InputMethodInfo;
28import android.view.inputmethod.InputMethodSubtype;
29
30import java.util.ArrayList;
31import java.util.List;
32
33public class InputMethodTest extends InstrumentationTestCase {
34    private static final boolean IS_AUX = true;
35    private static final boolean IS_DEFAULT = true;
36    private static final boolean IS_AUTO = true;
37
38    @SmallTest
39    public void testDefaultEnabledImesWithDefaultVoiceIme() throws Exception {
40        final Context context = getInstrumentation().getTargetContext();
41        final ArrayList<InputMethodInfo> imis = new ArrayList<InputMethodInfo>();
42        imis.add(createDefaultAutoDummyVoiceIme());
43        imis.add(createNonDefaultAutoDummyVoiceIme0());
44        imis.add(createNonDefaultAutoDummyVoiceIme1());
45        imis.add(createNonDefaultDummyVoiceIme2());
46        imis.add(createDefaultDummyEnUSKeyboardIme());
47        imis.add(createNonDefaultDummyJaJPKeyboardIme());
48        final ArrayList<InputMethodInfo> enabledImis = InputMethodUtils.getDefaultEnabledImes(
49                context, true, imis);
50        assertEquals(2, enabledImis.size());
51        for (int i = 0; i < enabledImis.size(); ++i) {
52            final InputMethodInfo imi = enabledImis.get(0);
53            // "DummyDefaultAutoVoiceIme" and "DummyDefaultEnKeyboardIme"
54            if (imi.getPackageName().equals("DummyDefaultAutoVoiceIme")
55                    || imi.getPackageName().equals("DummyDefaultEnKeyboardIme")) {
56                continue;
57            } else {
58                fail("Invalid enabled subtype.");
59            }
60        }
61    }
62
63    @SmallTest
64    public void testDefaultEnabledImesWithOutDefaultVoiceIme() throws Exception {
65        final Context context = getInstrumentation().getTargetContext();
66        final ArrayList<InputMethodInfo> imis = new ArrayList<InputMethodInfo>();
67        imis.add(createNonDefaultAutoDummyVoiceIme0());
68        imis.add(createNonDefaultAutoDummyVoiceIme1());
69        imis.add(createNonDefaultDummyVoiceIme2());
70        imis.add(createDefaultDummyEnUSKeyboardIme());
71        imis.add(createNonDefaultDummyJaJPKeyboardIme());
72        final ArrayList<InputMethodInfo> enabledImis = InputMethodUtils.getDefaultEnabledImes(
73                context, true, imis);
74        assertEquals(3, enabledImis.size());
75        for (int i = 0; i < enabledImis.size(); ++i) {
76            final InputMethodInfo imi = enabledImis.get(0);
77            // "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1" and
78            // "DummyDefaultEnKeyboardIme"
79            if (imi.getPackageName().equals("DummyNonDefaultAutoVoiceIme0")
80                    || imi.getPackageName().equals("DummyNonDefaultAutoVoiceIme1")
81                    || imi.getPackageName().equals("DummyDefaultEnKeyboardIme")) {
82                continue;
83            } else {
84                fail("Invalid enabled subtype.");
85            }
86        }
87    }
88
89    private static InputMethodInfo createDummyInputMethodInfo(String packageName, String name,
90            CharSequence label, boolean isAuxIme, boolean isDefault,
91            List<InputMethodSubtype> subtypes) {
92        final ResolveInfo ri = new ResolveInfo();
93        final ServiceInfo si = new ServiceInfo();
94        final ApplicationInfo ai = new ApplicationInfo();
95        ai.packageName = packageName;
96        ai.enabled = true;
97        ai.flags |= ApplicationInfo.FLAG_SYSTEM;
98        si.applicationInfo = ai;
99        si.enabled = true;
100        si.packageName = packageName;
101        si.name = name;
102        si.exported = true;
103        si.nonLocalizedLabel = label;
104        ri.serviceInfo = si;
105        return new InputMethodInfo(ri, isAuxIme, "", subtypes, 1, isDefault);
106    }
107
108    private static InputMethodSubtype createDummyInputMethodSubtype(String locale, String mode,
109            boolean isAuxiliary, boolean overridesImplicitlyEnabledSubtype) {
110        return new InputMethodSubtype(0, 0, locale, mode, "", isAuxiliary,
111                overridesImplicitlyEnabledSubtype);
112    }
113
114    private static InputMethodInfo createDefaultAutoDummyVoiceIme() {
115        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
116        subtypes.add(createDummyInputMethodSubtype("auto", "voice", IS_AUX, IS_AUTO));
117        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
118        return createDummyInputMethodInfo("DummyDefaultAutoVoiceIme", "dummy.voice0",
119                "DummyVoice0", IS_AUX, IS_DEFAULT, subtypes);
120    }
121
122    private static InputMethodInfo createNonDefaultAutoDummyVoiceIme0() {
123        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
124        subtypes.add(createDummyInputMethodSubtype("auto", "voice", IS_AUX, IS_AUTO));
125        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
126        return createDummyInputMethodInfo("DummyNonDefaultAutoVoiceIme0", "dummy.voice1",
127                "DummyVoice1", IS_AUX, !IS_DEFAULT, subtypes);
128    }
129
130    private static InputMethodInfo createNonDefaultAutoDummyVoiceIme1() {
131        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
132        subtypes.add(createDummyInputMethodSubtype("auto", "voice", IS_AUX, IS_AUTO));
133        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
134        return createDummyInputMethodInfo("DummyNonDefaultAutoVoiceIme1", "dummy.voice2",
135                "DummyVoice2", IS_AUX, !IS_DEFAULT, subtypes);
136    }
137
138    private static InputMethodInfo createNonDefaultDummyVoiceIme2() {
139        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
140        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
141        return createDummyInputMethodInfo("DummyNonDefaultVoiceIme2", "dummy.voice3",
142                "DummyVoice3", IS_AUX, !IS_DEFAULT, subtypes);
143    }
144
145    private static InputMethodInfo createDefaultDummyEnUSKeyboardIme() {
146        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
147        subtypes.add(createDummyInputMethodSubtype("en_US", "keyboard", !IS_AUX, !IS_AUTO));
148        return createDummyInputMethodInfo("DummyDefaultEnKeyboardIme", "dummy.keyboard0",
149                "DummyKeyboard0", !IS_AUX, IS_DEFAULT, subtypes);
150    }
151
152    private static InputMethodInfo createNonDefaultDummyJaJPKeyboardIme() {
153        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
154        subtypes.add(createDummyInputMethodSubtype("ja_JP", "keyboard", !IS_AUX, !IS_AUTO));
155        return createDummyInputMethodInfo("DummyNonDefaultJaJPKeyboardIme", "dummy.keyboard1",
156                "DummyKeyboard1", !IS_AUX, !IS_DEFAULT, subtypes);
157    }
158}
159