1cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka/* 2cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * Copyright (C) 2014 The Android Open Source Project 3cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * 4cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 5cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * you may not use this file except in compliance with the License. 6cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * You may obtain a copy of the License at 7cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * 8cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 9cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * 10cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 11cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 12cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * See the License for the specific language governing permissions and 14cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka * limitations under the License. 15cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka */ 16cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka 1788984aedae83d15b47a22f2716c8d01b1fa7f4d8Tadashi G. Takaokapackage com.android.inputmethod.keyboard.action; 18cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka 1951333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaokaimport android.content.Context; 20cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaokaimport android.content.res.Resources; 21cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaokaimport android.text.InputType; 22cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaokaimport android.view.inputmethod.EditorInfo; 23cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaokaimport android.view.inputmethod.InputMethodSubtype; 24cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka 2588984aedae83d15b47a22f2716c8d01b1fa7f4d8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.Key; 2688984aedae83d15b47a22f2716c8d01b1fa7f4d8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.Keyboard; 2788984aedae83d15b47a22f2716c8d01b1fa7f4d8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.KeyboardId; 2888984aedae83d15b47a22f2716c8d01b1fa7f4d8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.KeyboardLayoutSet; 2988984aedae83d15b47a22f2716c8d01b1fa7f4d8Tadashi G. Takaokaimport com.android.inputmethod.keyboard.KeyboardLayoutSetTestsBase; 30cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaokaimport com.android.inputmethod.keyboard.internal.KeyboardIconsSet; 3151333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaokaimport com.android.inputmethod.keyboard.layout.expected.ExpectedKeyVisual; 329342484e8d573a40f470b6a593df31c602fa4076Ken Wakasaimport com.android.inputmethod.latin.common.Constants; 335b91b551e5ffaf2c2e691dfbd434f21c82293986Jean Chalardimport com.android.inputmethod.latin.common.LocaleUtils; 34cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaokaimport com.android.inputmethod.latin.utils.RunInLocale; 35cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaokaimport com.android.inputmethod.latin.utils.SubtypeLocaleUtils; 36cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka 37cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaokaimport java.util.Locale; 38cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka 3988984aedae83d15b47a22f2716c8d01b1fa7f4d8Tadashi G. Takaokaabstract class ActionTestsBase extends KeyboardLayoutSetTestsBase { 4051333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka static class ExpectedActionKey { 4151333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka static ExpectedActionKey newIconKey(final String iconName) { 4251333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka final int iconId = KeyboardIconsSet.getIconId(iconName); 4351333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka return new ExpectedActionKey(ExpectedKeyVisual.newInstance(iconId)); 4451333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka } 4551333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka 4651333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka static ExpectedActionKey newLabelKey(final String label) { 4751333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka return new ExpectedActionKey(ExpectedKeyVisual.newInstance(label)); 4851333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka } 4951333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka 5051333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka static ExpectedActionKey newLabelKey(final int labelResId, 5151333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka final Locale labelLocale, final Context context) { 5251333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka final RunInLocale<String> getString = new RunInLocale<String>() { 5351333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka @Override 5451333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka protected String job(final Resources res) { 5551333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka return res.getString(labelResId); 5651333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka } 5751333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka }; 5851333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka return newLabelKey(getString.runInLocale(context.getResources(), labelLocale)); 5951333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka } 6051333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka 6151333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka private final ExpectedKeyVisual mVisual; 6251333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka 6351333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka private ExpectedActionKey(final ExpectedKeyVisual visual) { 6451333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka mVisual = visual; 6551333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka } 6651333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka 6751333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka public int getIconId() { return mVisual.getIconId(); } 6851333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka 6951333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka public String getLabel() { return mVisual.getLabel(); } 7051333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka } 7151333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka 7251333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka protected static Locale getLabelLocale(final InputMethodSubtype subtype) { 73aaefd5666112c4a6fff58783c25cf9a75b468eddTadashi G. Takaoka final String localeString = subtype.getLocale(); 74aaefd5666112c4a6fff58783c25cf9a75b468eddTadashi G. Takaoka if (localeString.equals(SubtypeLocaleUtils.NO_LANGUAGE)) { 7551333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka return null; 7651333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka } 77aaefd5666112c4a6fff58783c25cf9a75b468eddTadashi G. Takaoka return LocaleUtils.constructLocaleFromString(localeString); 7851333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka } 7951333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka 8051333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka private static void assertActionKey(final String tag, final KeyboardLayoutSet layoutSet, 8151333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka final int elementId, final ExpectedActionKey expectedKey) { 82cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka final Keyboard keyboard = layoutSet.getKeyboard(elementId); 8351333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka final Key actualKey = keyboard.getKey(Constants.CODE_ENTER); 8451333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertNotNull(tag + " enter key on " + keyboard.mId, actualKey); 8551333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertEquals(tag + " label " + expectedKey, expectedKey.getLabel(), actualKey.getLabel()); 8651333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertEquals(tag + " icon " + expectedKey, expectedKey.getIconId(), actualKey.getIconId()); 87cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka } 88cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka 8951333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka protected void doTestActionKey(final String tag, final InputMethodSubtype subtype, 9051333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka final int actionId, final ExpectedActionKey expectedKey) { 91cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka final EditorInfo editorInfo = new EditorInfo(); 92cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka editorInfo.imeOptions = actionId; 9351333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka doTestActionKey(tag, subtype, editorInfo, expectedKey); 94cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka } 95cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka 9651333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka protected void doTestActionKey(final String tag, final InputMethodSubtype subtype, 9751333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka final EditorInfo editorInfo, final ExpectedActionKey expectedKey) { 98cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka // Test text layouts. 99cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka editorInfo.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL; 100cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka final KeyboardLayoutSet layoutSet = createKeyboardLayoutSet(subtype, editorInfo); 10151333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertActionKey(tag, layoutSet, KeyboardId.ELEMENT_ALPHABET, expectedKey); 10251333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertActionKey(tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS, expectedKey); 10351333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertActionKey(tag, layoutSet, KeyboardId.ELEMENT_SYMBOLS_SHIFTED, expectedKey); 104cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka // Test phone number layouts. 10551333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertActionKey(tag, layoutSet, KeyboardId.ELEMENT_PHONE, expectedKey); 10651333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertActionKey(tag, layoutSet, KeyboardId.ELEMENT_PHONE_SYMBOLS, expectedKey); 107cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka // Test normal number layout. 10851333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertActionKey(tag, layoutSet, KeyboardId.ELEMENT_NUMBER, expectedKey); 109cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka // Test number password layout. 110cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka editorInfo.inputType = 111cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD; 112cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka final KeyboardLayoutSet passwordSet = createKeyboardLayoutSet(subtype, editorInfo); 11351333ba4c36726a2f7acff859cd8ffb782e8f2b3Tadashi G. Takaoka assertActionKey(tag, passwordSet, KeyboardId.ELEMENT_NUMBER, expectedKey); 114cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka } 115cd6f5ae5661f67c8598df41a8f2ce6cb46a8ee62Tadashi G. Takaoka} 116