Home | History | Annotate | Download | only in action
      1 /*
      2  * Copyright (C) 2014 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 com.android.inputmethod.keyboard.action;
     18 
     19 import android.content.res.Resources;
     20 import android.test.suitebuilder.annotation.MediumTest;
     21 import android.view.inputmethod.EditorInfo;
     22 import android.view.inputmethod.InputMethodSubtype;
     23 
     24 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
     25 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
     26 import com.android.inputmethod.keyboard.internal.KeyboardTextsSet;
     27 import com.android.inputmethod.latin.R;
     28 import com.android.inputmethod.latin.RichInputMethodManager;
     29 import com.android.inputmethod.latin.utils.RunInLocale;
     30 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
     31 
     32 import java.util.Locale;
     33 
     34 @MediumTest
     35 public class KlpActionLabelTests extends KlpActionTestsBase {
     36     void doTestActionKeys(final InputMethodSubtype subtype, final String tag,
     37             final ExpectedActionKey unspecifiedKey, final ExpectedActionKey noneKey,
     38             final ExpectedActionKey goKey, final ExpectedActionKey searchKey,
     39             final ExpectedActionKey sendKey, final ExpectedActionKey nextKey,
     40             final ExpectedActionKey doneKey, final ExpectedActionKey previousKey) {
     41         doTestActionKey(
     42                 tag + " unspecified", subtype, EditorInfo.IME_ACTION_UNSPECIFIED, unspecifiedKey);
     43         doTestActionKey(tag + " none", subtype, EditorInfo.IME_ACTION_NONE, noneKey);
     44         doTestActionKey(tag + " go", subtype, EditorInfo.IME_ACTION_GO, goKey);
     45         doTestActionKey(tag + " search", subtype, EditorInfo.IME_ACTION_SEARCH, searchKey);
     46         doTestActionKey(tag + " send", subtype, EditorInfo.IME_ACTION_SEND, sendKey);
     47         doTestActionKey(tag + " next", subtype, EditorInfo.IME_ACTION_NEXT, nextKey);
     48         doTestActionKey(tag + " done", subtype, EditorInfo.IME_ACTION_DONE, doneKey);
     49         doTestActionKey(tag + " previous", subtype, EditorInfo.IME_ACTION_PREVIOUS, previousKey);
     50     }
     51 
     52     // Working variable to simulate system locale changing.
     53     private Locale mSystemLocale = Locale.getDefault();
     54 
     55     private void doTestActionKeysInLocaleWithStringResources(final InputMethodSubtype subtype,
     56             final Locale labelLocale, final Locale systemLocale) {
     57         // Simulate system locale changing, see {@link SystemBroadcastReceiver}.
     58         if (!systemLocale.equals(mSystemLocale)) {
     59             KeyboardLayoutSet.onSystemLocaleChanged();
     60             mSystemLocale = systemLocale;
     61         }
     62         final ExpectedActionKey enterKey = ExpectedActionKey.newIconKey(
     63                 KeyboardIconsSet.NAME_ENTER_KEY);
     64         final ExpectedActionKey goKey = ExpectedActionKey.newLabelKey(
     65                 R.string.label_go_key, labelLocale, getContext());
     66         final ExpectedActionKey searchKey = ExpectedActionKey.newIconKey(
     67                 KeyboardIconsSet.NAME_SEARCH_KEY);
     68         final ExpectedActionKey sendKey = ExpectedActionKey.newLabelKey(
     69                 R.string.label_send_key, labelLocale, getContext());
     70         final ExpectedActionKey nextKey = ExpectedActionKey.newLabelKey(
     71                 R.string.label_next_key, labelLocale, getContext());
     72         final ExpectedActionKey doneKey = ExpectedActionKey.newLabelKey(
     73                 R.string.label_done_key, labelLocale, getContext());
     74         final ExpectedActionKey previousKey = ExpectedActionKey.newLabelKey(
     75                 R.string.label_previous_key, labelLocale, getContext());
     76         final String tag = "label=" + labelLocale + " system=" + systemLocale
     77                 + " " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
     78         final RunInLocale<Void> job = new RunInLocale<Void>() {
     79             @Override
     80             public Void job(final Resources res) {
     81                 doTestActionKeys(subtype, tag, enterKey, enterKey, goKey, searchKey, sendKey,
     82                         nextKey, doneKey, previousKey);
     83                 return null;
     84             }
     85         };
     86         job.runInLocale(getContext().getResources(), systemLocale);
     87     }
     88 
     89     public void testActionLabelInOtherLocale() {
     90         final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
     91         final InputMethodSubtype italian = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     92                 Locale.ITALIAN.toString(), SubtypeLocaleUtils.QWERTY);
     93         // An action label should be displayed in subtype's locale regardless of the system locale.
     94         doTestActionKeysInLocaleWithStringResources(italian, Locale.ITALIAN, Locale.US);
     95         doTestActionKeysInLocaleWithStringResources(italian, Locale.ITALIAN, Locale.FRENCH);
     96         doTestActionKeysInLocaleWithStringResources(italian, Locale.ITALIAN, Locale.ITALIAN);
     97         doTestActionKeysInLocaleWithStringResources(italian, Locale.ITALIAN, Locale.JAPANESE);
     98     }
     99 
    100     public void testNoLanguageSubtypeActionLabel() {
    101         final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
    102         final InputMethodSubtype noLanguage = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
    103                 SubtypeLocaleUtils.NO_LANGUAGE, SubtypeLocaleUtils.QWERTY);
    104         // An action label of no language keyboard should be displayed in the system locale.
    105         doTestActionKeysInLocaleWithStringResources(noLanguage, Locale.US, Locale.US);
    106         doTestActionKeysInLocaleWithStringResources(noLanguage, Locale.FRENCH, Locale.FRENCH);
    107         doTestActionKeysInLocaleWithStringResources(noLanguage, Locale.ITALIAN, Locale.ITALIAN);
    108         doTestActionKeysInLocaleWithStringResources(noLanguage, Locale.JAPANESE, Locale.JAPANESE);
    109     }
    110 
    111     private void doTestActionKeysInLocaleWithKeyboardTextsSet(final InputMethodSubtype subtype,
    112             final Locale labelLocale, final Locale systemLocale) {
    113         // Simulate system locale changing, see {@link SystemBroadcastReceiver}.
    114         if (!systemLocale.equals(mSystemLocale)) {
    115             KeyboardLayoutSet.onSystemLocaleChanged();
    116             mSystemLocale = systemLocale;
    117         }
    118         final KeyboardTextsSet textsSet = new KeyboardTextsSet();
    119         textsSet.setLocale(labelLocale, getContext());
    120         final ExpectedActionKey enterKey = ExpectedActionKey.newIconKey(
    121                 KeyboardIconsSet.NAME_ENTER_KEY);
    122         final ExpectedActionKey goKey = ExpectedActionKey.newLabelKey(
    123                 textsSet.getText("label_go_key"));
    124         final ExpectedActionKey searchKey = ExpectedActionKey.newIconKey(
    125                 KeyboardIconsSet.NAME_SEARCH_KEY);
    126         final ExpectedActionKey sendKey = ExpectedActionKey.newLabelKey(
    127                 textsSet.getText("label_send_key"));
    128         final ExpectedActionKey nextKey = ExpectedActionKey.newLabelKey(
    129                 textsSet.getText("label_next_key"));
    130         final ExpectedActionKey doneKey = ExpectedActionKey.newLabelKey(
    131                 textsSet.getText("label_done_key"));
    132         final ExpectedActionKey previousKey = ExpectedActionKey.newLabelKey(
    133                 textsSet.getText("label_previous_key"));
    134         final String tag = "label=" + subtype.getLocale() + " system=" + systemLocale
    135                 + " " + SubtypeLocaleUtils.getSubtypeNameForLogging(subtype);
    136         final RunInLocale<Void> job = new RunInLocale<Void>() {
    137             @Override
    138             public Void job(final Resources res) {
    139                 doTestActionKeys(subtype, tag, enterKey, enterKey, goKey, searchKey, sendKey,
    140                         nextKey, doneKey, previousKey);
    141                 return null;
    142             }
    143         };
    144         job.runInLocale(getContext().getResources(), systemLocale);
    145     }
    146 
    147     public void testHinglishActionLabel() {
    148         final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
    149         final Locale hi_ZZ = new Locale("hi", "ZZ");
    150         final InputMethodSubtype hiLatn = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
    151                 hi_ZZ.toString(), SubtypeLocaleUtils.QWERTY);
    152         // This is a preliminary subtype and may not exist.
    153         if (hiLatn == null) {
    154             return;
    155         }
    156         // An action label should be displayed in subtype's locale regardless of the system locale.
    157         doTestActionKeysInLocaleWithKeyboardTextsSet(hiLatn, hi_ZZ, new Locale("hi"));
    158         doTestActionKeysInLocaleWithKeyboardTextsSet(hiLatn, hi_ZZ, Locale.US);
    159         doTestActionKeysInLocaleWithKeyboardTextsSet(hiLatn, hi_ZZ, Locale.FRENCH);
    160         doTestActionKeysInLocaleWithKeyboardTextsSet(hiLatn, hi_ZZ, Locale.ITALIAN);
    161         doTestActionKeysInLocaleWithKeyboardTextsSet(hiLatn, hi_ZZ, Locale.JAPANESE);
    162     }
    163 
    164     public void testSerbianLatinActionLabel() {
    165         final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
    166         final Locale sr_ZZ = new Locale("sr", "ZZ");
    167         final InputMethodSubtype srLatn = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
    168                 sr_ZZ.toString(), "serbian_qwertz");
    169         // This is a preliminary subtype and may not exist.
    170         if (srLatn == null) {
    171             return;
    172         }
    173         // An action label should be displayed in subtype's locale regardless of the system locale.
    174         doTestActionKeysInLocaleWithKeyboardTextsSet(srLatn, sr_ZZ, new Locale("sr"));
    175         doTestActionKeysInLocaleWithKeyboardTextsSet(srLatn, sr_ZZ, Locale.US);
    176         doTestActionKeysInLocaleWithKeyboardTextsSet(srLatn, sr_ZZ, Locale.FRENCH);
    177         doTestActionKeysInLocaleWithKeyboardTextsSet(srLatn, sr_ZZ, Locale.ITALIAN);
    178         doTestActionKeysInLocaleWithKeyboardTextsSet(srLatn, sr_ZZ, Locale.JAPANESE);
    179     }
    180 }
    181