1 /* 2 * Copyright (C) 2011 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.latin.utils; 18 19 import android.content.Context; 20 import android.content.res.Resources; 21 import android.test.AndroidTestCase; 22 import android.test.suitebuilder.annotation.SmallTest; 23 import android.view.inputmethod.InputMethodInfo; 24 import android.view.inputmethod.InputMethodSubtype; 25 26 import com.android.inputmethod.latin.R; 27 import com.android.inputmethod.latin.RichInputMethodManager; 28 import com.android.inputmethod.latin.RichInputMethodSubtype; 29 30 import java.util.ArrayList; 31 import java.util.Locale; 32 33 @SmallTest 34 public class SubtypeLocaleUtilsTests extends AndroidTestCase { 35 // All input method subtypes of LatinIME. 36 private final ArrayList<RichInputMethodSubtype> mSubtypesList = new ArrayList<>(); 37 38 private RichInputMethodManager mRichImm; 39 private Resources mRes; 40 private InputMethodSubtype mSavedAddtionalSubtypes[]; 41 42 InputMethodSubtype EN_US; 43 InputMethodSubtype EN_GB; 44 InputMethodSubtype ES_US; 45 InputMethodSubtype FR; 46 InputMethodSubtype FR_CA; 47 InputMethodSubtype FR_CH; 48 InputMethodSubtype DE; 49 InputMethodSubtype DE_CH; 50 InputMethodSubtype HI; 51 InputMethodSubtype SR; 52 InputMethodSubtype ZZ; 53 InputMethodSubtype DE_QWERTY; 54 InputMethodSubtype FR_QWERTZ; 55 InputMethodSubtype EN_US_AZERTY; 56 InputMethodSubtype EN_UK_DVORAK; 57 InputMethodSubtype ES_US_COLEMAK; 58 InputMethodSubtype ZZ_AZERTY; 59 InputMethodSubtype ZZ_PC; 60 61 // These are preliminary subtypes and may not exist. 62 InputMethodSubtype HI_LATN; // Hinglish 63 InputMethodSubtype SR_LATN; // Serbian Latin 64 InputMethodSubtype HI_LATN_DVORAK; // Hinglis Dvorak 65 InputMethodSubtype SR_LATN_QWERTY; // Serbian Latin Qwerty 66 67 @Override 68 protected void setUp() throws Exception { 69 super.setUp(); 70 final Context context = getContext(); 71 mRes = context.getResources(); 72 RichInputMethodManager.init(context); 73 mRichImm = RichInputMethodManager.getInstance(); 74 75 // Save and reset additional subtypes 76 mSavedAddtionalSubtypes = mRichImm.getAdditionalSubtypes(); 77 final InputMethodSubtype[] predefinedAddtionalSubtypes = 78 AdditionalSubtypeUtils.createAdditionalSubtypesArray( 79 AdditionalSubtypeUtils.createPrefSubtypes( 80 mRes.getStringArray(R.array.predefined_subtypes))); 81 mRichImm.setAdditionalInputMethodSubtypes(predefinedAddtionalSubtypes); 82 83 final InputMethodInfo imi = mRichImm.getInputMethodInfoOfThisIme(); 84 final int subtypeCount = imi.getSubtypeCount(); 85 for (int index = 0; index < subtypeCount; index++) { 86 final InputMethodSubtype subtype = imi.getSubtypeAt(index); 87 mSubtypesList.add(new RichInputMethodSubtype(subtype)); 88 } 89 90 EN_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 91 Locale.US.toString(), "qwerty"); 92 EN_GB = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 93 Locale.UK.toString(), "qwerty"); 94 ES_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 95 "es_US", "spanish"); 96 FR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 97 Locale.FRENCH.toString(), "azerty"); 98 FR_CA = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 99 Locale.CANADA_FRENCH.toString(), "qwerty"); 100 FR_CH = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 101 "fr_CH", "swiss"); 102 DE = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 103 Locale.GERMAN.toString(), "qwertz"); 104 DE_CH = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 105 "de_CH", "swiss"); 106 HI = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 107 "hi", "hindi"); 108 SR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 109 "sr", "south_slavic"); 110 ZZ = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet( 111 SubtypeLocaleUtils.NO_LANGUAGE, "qwerty"); 112 DE_QWERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( 113 Locale.GERMAN.toString(), "qwerty"); 114 FR_QWERTZ = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( 115 Locale.FRENCH.toString(), "qwertz"); 116 EN_US_AZERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( 117 Locale.US.toString(), "azerty"); 118 EN_UK_DVORAK = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( 119 Locale.UK.toString(), "dvorak"); 120 ES_US_COLEMAK = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( 121 "es_US", "colemak"); 122 ZZ_AZERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( 123 SubtypeLocaleUtils.NO_LANGUAGE, "azerty"); 124 ZZ_PC = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( 125 SubtypeLocaleUtils.NO_LANGUAGE, "pcqwerty"); 126 127 HI_LATN = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet("hi_ZZ", "qwerty"); 128 if (HI_LATN != null) { 129 HI_LATN_DVORAK = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( 130 "hi_ZZ", "dvorak"); 131 } 132 SR_LATN = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet("sr_ZZ", "serbian_qwertz"); 133 if (SR_LATN != null) { 134 SR_LATN_QWERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( 135 "sr_ZZ", "qwerty"); 136 } 137 } 138 139 @Override 140 protected void tearDown() throws Exception { 141 // Restore additional subtypes. 142 mRichImm.setAdditionalInputMethodSubtypes(mSavedAddtionalSubtypes); 143 super.tearDown(); 144 } 145 146 public void testAllFullDisplayName() { 147 for (final RichInputMethodSubtype subtype : mSubtypesList) { 148 final String subtypeName = SubtypeLocaleUtils 149 .getSubtypeDisplayNameInSystemLocale(subtype.getRawSubtype()); 150 if (subtype.isNoLanguage()) { 151 final String layoutName = SubtypeLocaleUtils 152 .getKeyboardLayoutSetDisplayName(subtype.getRawSubtype()); 153 assertTrue(subtypeName, subtypeName.contains(layoutName)); 154 } else { 155 final String languageName = SubtypeLocaleUtils 156 .getSubtypeLocaleDisplayNameInSystemLocale(subtype.getLocale().toString()); 157 assertTrue(subtypeName, subtypeName.contains(languageName)); 158 } 159 } 160 } 161 162 public void testKeyboardLayoutSetName() { 163 assertEquals("en_US", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_US)); 164 assertEquals("en_GB", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_GB)); 165 assertEquals("es_US", "spanish", SubtypeLocaleUtils.getKeyboardLayoutSetName(ES_US)); 166 assertEquals("fr", "azerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR)); 167 assertEquals("fr_CA", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR_CA)); 168 assertEquals("fr_CH", "swiss", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR_CH)); 169 assertEquals("de", "qwertz", SubtypeLocaleUtils.getKeyboardLayoutSetName(DE)); 170 assertEquals("de_CH", "swiss", SubtypeLocaleUtils.getKeyboardLayoutSetName(DE_CH)); 171 assertEquals("hi", "hindi", SubtypeLocaleUtils.getKeyboardLayoutSetName(HI)); 172 assertEquals("sr", "south_slavic", SubtypeLocaleUtils.getKeyboardLayoutSetName(SR)); 173 assertEquals("zz", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(ZZ)); 174 175 assertEquals("de qwerty", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(DE_QWERTY)); 176 assertEquals("fr qwertz", "qwertz", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR_QWERTZ)); 177 assertEquals("en_US azerty", "azerty", 178 SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_US_AZERTY)); 179 assertEquals("en_UK dvorak", "dvorak", 180 SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_UK_DVORAK)); 181 assertEquals("es_US colemak", "colemak", 182 SubtypeLocaleUtils.getKeyboardLayoutSetName(ES_US_COLEMAK)); 183 assertEquals("zz azerty", "azerty", 184 SubtypeLocaleUtils.getKeyboardLayoutSetName(ZZ_AZERTY)); 185 186 // These are preliminary subtypes and may not exist. 187 if (HI_LATN != null) { 188 assertEquals("hi_ZZ", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(HI_LATN)); 189 assertEquals("hi_ZZ dvorak", "dvorak", 190 SubtypeLocaleUtils.getKeyboardLayoutSetName(HI_LATN_DVORAK)); 191 } 192 if (SR_LATN != null) { 193 assertEquals("sr_ZZ", "serbian_qwertz", 194 SubtypeLocaleUtils.getKeyboardLayoutSetName(SR_LATN)); 195 assertEquals("sr_ZZ qwerty", "qwerty", 196 SubtypeLocaleUtils.getKeyboardLayoutSetName(SR_LATN_QWERTY)); 197 } 198 } 199 200 // InputMethodSubtype's display name in system locale (en_US). 201 // isAdditionalSubtype (T=true, F=false) 202 // locale layout | display name 203 // ------ -------------- - ---------------------- 204 // en_US qwerty F English (US) exception 205 // en_GB qwerty F English (UK) exception 206 // es_US spanish F Spanish (US) exception 207 // fr azerty F French 208 // fr_CA qwerty F French (Canada) 209 // fr_CH swiss F French (Switzerland) 210 // de qwertz F German 211 // de_CH swiss F German (Switzerland) 212 // hi hindi F Hindi 213 // hi_ZZ qwerty F Hinglish exception 214 // sr south_slavic F Serbian 215 // sr_ZZ serbian_qwertz F Serbian (Latin) exception 216 // zz qwerty F Alphabet (QWERTY) 217 // fr qwertz T French (QWERTZ) 218 // de qwerty T German (QWERTY) 219 // en_US azerty T English (US) (AZERTY) exception 220 // en_UK dvorak T English (UK) (Dvorak) exception 221 // es_US colemak T Spanish (US) (Colemak) exception 222 // hi_ZZ dvorak T Hinglish (Dvorka) exception 223 // sr_ZZ qwerty T Serbian (QWERTY) exception 224 // zz pc T Alphabet (PC) 225 226 public void testPredefinedSubtypesInEnglishSystemLocale() { 227 final RunInLocale<Void> tests = new RunInLocale<Void>() { 228 @Override 229 protected Void job(final Resources res) { 230 assertEquals("en_US", "English (US)", 231 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US)); 232 assertEquals("en_GB", "English (UK)", 233 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_GB)); 234 assertEquals("es_US", "Spanish (US)", 235 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US)); 236 assertEquals("fr", "French", 237 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR)); 238 assertEquals("fr_CA", "French (Canada)", 239 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CA)); 240 assertEquals("fr_CH", "French (Switzerland)", 241 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CH)); 242 assertEquals("de", "German", 243 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE)); 244 assertEquals("de_CH", "German (Switzerland)", 245 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_CH)); 246 assertEquals("hi", "Hindi", 247 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI)); 248 assertEquals("sr", "Serbian", 249 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR)); 250 assertEquals("zz", "Alphabet (QWERTY)", 251 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ)); 252 // These are preliminary subtypes and may not exist. 253 if (HI_LATN != null) { 254 assertEquals("hi_ZZ", "Hinglish", 255 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN)); 256 } 257 if (SR_LATN != null) { 258 assertEquals("sr_ZZ", "Serbian (Latin)", 259 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN)); 260 } 261 return null; 262 } 263 }; 264 tests.runInLocale(mRes, Locale.ENGLISH); 265 } 266 267 public void testAdditionalSubtypesInEnglishSystemLocale() { 268 final RunInLocale<Void> tests = new RunInLocale<Void>() { 269 @Override 270 protected Void job(final Resources res) { 271 assertEquals("fr qwertz", "French (QWERTZ)", 272 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_QWERTZ)); 273 assertEquals("de qwerty", "German (QWERTY)", 274 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_QWERTY)); 275 assertEquals("en_US azerty", "English (US) (AZERTY)", 276 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US_AZERTY)); 277 assertEquals("en_UK dvorak","English (UK) (Dvorak)", 278 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_UK_DVORAK)); 279 assertEquals("es_US colemak", "Spanish (US) (Colemak)", 280 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US_COLEMAK)); 281 assertEquals("zz azerty", "Alphabet (AZERTY)", 282 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_AZERTY)); 283 assertEquals("zz pc", "Alphabet (PC)", 284 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_PC)); 285 // These are preliminary subtypes and may not exist. 286 if (HI_LATN_DVORAK != null) { 287 assertEquals("hi_ZZ", "Hinglish (Dvorak)", 288 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN_DVORAK)); 289 } 290 if (SR_LATN_QWERTY != null) { 291 assertEquals("sr_ZZ", "Serbian (QWERTY)", 292 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN_QWERTY)); 293 } 294 return null; 295 } 296 }; 297 tests.runInLocale(mRes, Locale.ENGLISH); 298 } 299 300 // InputMethodSubtype's display name in system locale (fr). 301 // isAdditionalSubtype (T=true, F=false) 302 // locale layout | display name 303 // ------ ------- - ---------------------- 304 // en_US qwerty F Anglais (tats-Unis) exception 305 // en_GB qwerty F Anglais (Royaume-Uni) exception 306 // es_US spanish F Espagnol (tats-Unis) exception 307 // fr azerty F Franais 308 // fr_CA qwerty F Franais (Canada) 309 // fr_CH swiss F Franais (Suisse) 310 // de qwertz F Allemand 311 // de_CH swiss F Allemand (Suisse) 312 // hi hindi F Hindi exception 313 // hi_ZZ qwerty F Hindi/Anglais exception 314 // sr south_slavic F Serbe exception 315 // sr_ZZ serbian_qwertz F Serbe (latin) exception 316 // zz qwerty F Alphabet latin (QWERTY) 317 // fr qwertz T Franais (QWERTZ) 318 // de qwerty T Allemand (QWERTY) 319 // en_US azerty T Anglais (tats-Unis) (AZERTY) exception 320 // en_UK dvorak T Anglais (Royaume-Uni) (Dvorak) exception 321 // es_US colemak T Espagnol (tats-Unis) (Colemak) exception 322 // hi_ZZ dvorak T Hindi/Anglais (Dvorka) exception 323 // sr_ZZ qwerty T Serbe (QWERTY) exception 324 // zz pc T Alphabet latin (PC) 325 326 public void testPredefinedSubtypesInFrenchSystemLocale() { 327 final RunInLocale<Void> tests = new RunInLocale<Void>() { 328 @Override 329 protected Void job(final Resources res) { 330 assertEquals("en_US", "Anglais (tats-Unis)", 331 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US)); 332 assertEquals("en_GB", "Anglais (Royaume-Uni)", 333 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_GB)); 334 assertEquals("es_US", "Espagnol (tats-Unis)", 335 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US)); 336 assertEquals("fr", "Franais", 337 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR)); 338 assertEquals("fr_CA", "Franais (Canada)", 339 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CA)); 340 assertEquals("fr_CH", "Franais (Suisse)", 341 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CH)); 342 assertEquals("de", "Allemand", 343 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE)); 344 assertEquals("de_CH", "Allemand (Suisse)", 345 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_CH)); 346 assertEquals("hi", "Hindi", 347 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI)); 348 assertEquals("sr", "Serbe", 349 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR)); 350 assertEquals("zz", "Alphabet latin (QWERTY)", 351 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ)); 352 // These are preliminary subtypes and may not exist. 353 if (HI_LATN != null) { 354 assertEquals("hi_ZZ", "Hindi/Anglais", 355 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN)); 356 } 357 if (SR_LATN != null) { 358 assertEquals("sr_ZZ", "Serbe (latin)", 359 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN)); 360 } 361 return null; 362 } 363 }; 364 tests.runInLocale(mRes, Locale.FRENCH); 365 } 366 367 public void testAdditionalSubtypesInFrenchSystemLocale() { 368 final RunInLocale<Void> tests = new RunInLocale<Void>() { 369 @Override 370 protected Void job(final Resources res) { 371 assertEquals("fr qwertz", "Franais (QWERTZ)", 372 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_QWERTZ)); 373 assertEquals("de qwerty", "Allemand (QWERTY)", 374 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_QWERTY)); 375 assertEquals("en_US azerty", "Anglais (tats-Unis) (AZERTY)", 376 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US_AZERTY)); 377 assertEquals("en_UK dvorak", "Anglais (Royaume-Uni) (Dvorak)", 378 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_UK_DVORAK)); 379 assertEquals("es_US colemak", "Espagnol (tats-Unis) (Colemak)", 380 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US_COLEMAK)); 381 assertEquals("zz azerty", "Alphabet latin (AZERTY)", 382 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_AZERTY)); 383 assertEquals("zz pc", "Alphabet latin (PC)", 384 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_PC)); 385 // These are preliminary subtypes and may not exist. 386 if (HI_LATN_DVORAK != null) { 387 assertEquals("hi_ZZ", "Hindi/Anglais (Dvorak)", 388 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN_DVORAK)); 389 } 390 if (SR_LATN_QWERTY != null) { 391 assertEquals("sr_ZZ", "Serbe (QWERTY)", 392 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN_QWERTY)); 393 } 394 return null; 395 } 396 }; 397 tests.runInLocale(mRes, Locale.FRENCH); 398 } 399 400 // InputMethodSubtype's display name in system locale (hi). 401 // isAdditionalSubtype (T=true, F=false) 402 // locale layout | display name 403 // ------ ------- - ---------------------- 404 // hi hindi F 405 // hi_ZZ qwerty F 406 // hi_ZZ dvorak T (Dvorak) 407 408 public void testHinglishSubtypesInHindiSystemLocale() { 409 final RunInLocale<Void> tests = new RunInLocale<Void>() { 410 @Override 411 protected Void job (final Resources res) { 412 assertEquals("hi", "", 413 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI)); 414 // These are preliminary subtypes and may not exist. 415 if (HI_LATN != null) { 416 assertEquals("hi_ZZ", "", 417 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN)); 418 assertEquals("hi_ZZ", " (Dvorak)", 419 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN_DVORAK)); 420 } 421 return null; 422 } 423 }; 424 tests.runInLocale(mRes, new Locale("hi")); 425 } 426 427 // InputMethodSubtype's display name in system locale (sr). 428 // isAdditionalSubtype (T=true, F=false) 429 // locale layout | display name 430 // ------ -------------- - ---------------------- 431 // sr south_slavic F 432 // sr_ZZ serbian_qwertz F () 433 // sr_ZZ qwerty T (QWERTY) 434 435 public void testSerbianLatinSubtypesInSerbianSystemLocale() { 436 final RunInLocale<Void> tests = new RunInLocale<Void>() { 437 @Override 438 protected Void job (final Resources res) { 439 assertEquals("sr", "", 440 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR)); 441 // These are preliminary subtypes and may not exist. 442 if (SR_LATN != null) { 443 assertEquals("sr_ZZ", " ()", 444 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN)); 445 assertEquals("sr_ZZ", " (QWERTY)", 446 SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN_QWERTY)); 447 } 448 return null; 449 } 450 }; 451 tests.runInLocale(mRes, new Locale("sr")); 452 } 453 454 public void testIsRtlLanguage() { 455 // Known Right-to-Left language subtypes. 456 final InputMethodSubtype ARABIC = mRichImm 457 .findSubtypeByLocaleAndKeyboardLayoutSet("ar", "arabic"); 458 assertNotNull("Arabic", ARABIC); 459 final InputMethodSubtype FARSI = mRichImm 460 .findSubtypeByLocaleAndKeyboardLayoutSet("fa", "farsi"); 461 assertNotNull("Farsi", FARSI); 462 final InputMethodSubtype HEBREW = mRichImm 463 .findSubtypeByLocaleAndKeyboardLayoutSet("iw", "hebrew"); 464 assertNotNull("Hebrew", HEBREW); 465 466 for (final RichInputMethodSubtype subtype : mSubtypesList) { 467 final InputMethodSubtype rawSubtype = subtype.getRawSubtype(); 468 final String subtypeName = SubtypeLocaleUtils 469 .getSubtypeDisplayNameInSystemLocale(rawSubtype); 470 if (rawSubtype.equals(ARABIC) || rawSubtype.equals(FARSI) 471 || rawSubtype.equals(HEBREW)) { 472 assertTrue(subtypeName, subtype.isRtlSubtype()); 473 } else { 474 assertFalse(subtypeName, subtype.isRtlSubtype()); 475 } 476 } 477 } 478 } 479