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