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 17 package android.os; 18 19 import com.android.internal.inputmethod.InputMethodUtils; 20 21 import android.content.Context; 22 import android.content.pm.ApplicationInfo; 23 import android.content.pm.ResolveInfo; 24 import android.content.pm.ServiceInfo; 25 import android.test.InstrumentationTestCase; 26 import android.test.suitebuilder.annotation.SmallTest; 27 import android.view.inputmethod.InputMethodInfo; 28 import android.view.inputmethod.InputMethodSubtype; 29 30 import java.util.ArrayList; 31 import java.util.List; 32 33 public 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