aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/Android.mk6
-rw-r--r--[-rwxr-xr-x]java/AndroidManifest.xml7
-rw-r--r--java/proguard.flags8
-rw-r--r--java/res/drawable-hdpi/btn_candidate_normal.9.pngbin0 -> 248 bytes
-rw-r--r--java/res/drawable-hdpi/btn_candidate_pressed.9.pngbin0 -> 1234 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.pngbin511 -> 472 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.pngbin0 -> 442 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.pngbin760 -> 649 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.pngbin0 -> 817 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.pngbin1088 -> 944 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.pngbin0 -> 1027 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.pngbin730 -> 663 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.pngbin0 -> 763 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.pngbin940 -> 869 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.pngbin0 -> 1223 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.pngbin1260 -> 1119 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.pngbin0 -> 1343 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.pngbin1649 -> 1370 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.pngbin1696 -> 1315 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.pngbin461 -> 448 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.pngbin0 -> 515 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.pngbin332 -> 126 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.pngbin498 -> 453 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.pngbin811 -> 649 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.pngbin0 -> 725 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_normal.9.pngbin715 -> 904 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.pngbin1001 -> 1076 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.pngbin2389 -> 2059 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.pngbin1077 -> 1137 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.pngbin2408 -> 2029 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.pngbin2213 -> 1719 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 242 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_pressed.9.pngbin745 -> 831 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.pngbin1042 -> 1041 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.pngbin1105 -> 1086 bytes
-rw-r--r--java/res/drawable-hdpi/cancel.pngbin3992 -> 9335 bytes
-rw-r--r--java/res/drawable-hdpi/cancel_holo.9.pngbin0 -> 2110 bytes
-rw-r--r--java/res/drawable-hdpi/candidate_feedback_background.9.pngbin833 -> 1607 bytes
-rw-r--r--java/res/drawable-hdpi/caution.pngbin1641 -> 2451 bytes
-rw-r--r--java/res/drawable-hdpi/dialog_bubble_step02.9.pngbin1475 -> 1422 bytes
-rw-r--r--java/res/drawable-hdpi/dialog_bubble_step07.9.pngbin6012 -> 7031 bytes
-rw-r--r--java/res/drawable-hdpi/highlight_pressed.pngbin4110 -> 1152 bytes
-rw-r--r--java/res/drawable-hdpi/hint_popup.9.pngbin226 -> 242 bytes
-rw-r--r--java/res/drawable-hdpi/hint_popup_holo.9.pngbin0 -> 333 bytes
-rw-r--r--java/res/drawable-hdpi/ic_dialog_keyboard.pngbin807 -> 1157 bytes
-rw-r--r--java/res/drawable-hdpi/ic_mic_dialog.pngbin3634 -> 4083 bytes
-rw-r--r--java/res/drawable-hdpi/ic_subtype_keyboard.pngbin1068 -> 812 bytes
-rw-r--r--java/res/drawable-hdpi/ic_subtype_mic.pngbin681 -> 892 bytes
-rw-r--r--java/res/drawable-hdpi/ic_suggest_strip_microphone.pngbin548 -> 970 bytes
-rw-r--r--java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.pngbin438 -> 795 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_at_holo.9.pngbin0 -> 960 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_at_large_holo.9.pngbin0 -> 1013 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_colon_holo.9.pngbin0 -> 355 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_colon_large_holo.9.pngbin0 -> 568 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_comma_holo.9.pngbin0 -> 326 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_dash_holo.9.pngbin0 -> 315 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_doublecross_holo.9.pngbin0 -> 634 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_equal_holo.9.pngbin0 -> 428 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_exclamation_holo.9.pngbin0 -> 516 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 539 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_larger_holo.9.pngbin0 -> 468 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_parenclose_holo.9.pngbin0 -> 469 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_parenopen_holo.9.pngbin0 -> 526 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_period_holo.9.pngbin0 -> 283 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_plus_holo.9.pngbin0 -> 521 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_plus_large_holo.9.pngbin0 -> 544 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_question_holo.9.pngbin0 -> 686 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_question_large_holo.9.pngbin0 -> 718 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_quote_holo.9.pngbin0 -> 417 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_quote_large_holo.9.pngbin0 -> 434 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_semicolon_holo.9.pngbin0 -> 397 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_simplequote_holo.9.pngbin0 -> 339 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_slash_holo.9.pngbin0 -> 477 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_slash_large_holo.9.pngbin0 -> 930 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_smaller_holo.9.pngbin0 -> 464 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_star_holo.9.pngbin0 -> 519 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_underline_holo.9.pngbin0 -> 335 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_underline_large_holo.9.pngbin0 -> 354 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_background.9.pngbin200 -> 207 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_background_holo.9.pngbin0 -> 296 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_dark_background.9.pngbin1041 -> 210 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_0.9.pngbin379 -> 377 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_1.9.pngbin301 -> 347 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_2.9.pngbin404 -> 382 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_3.9.pngbin413 -> 401 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_4.9.pngbin341 -> 375 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_5.9.pngbin388 -> 402 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_6.9.pngbin413 -> 392 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_7.9.pngbin367 -> 379 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_8.9.pngbin417 -> 400 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_9.9.pngbin417 -> 395 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_at.9.pngbin0 -> 409 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_colon.9.pngbin0 -> 238 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_doublecross.9.pngbin0 -> 359 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_exclamation.9.pngbin0 -> 277 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_greater.9.pngbin0 -> 311 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_plus.9.pngbin0 -> 283 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_question.9.pngbin0 -> 323 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_quote.9.pngbin0 -> 267 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_smaller.9.pngbin0 -> 302 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_hint_star.9.pngbin0 -> 321 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_key_feedback_background.9.pngbin1099 -> 937 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 136 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.pngbin1310 -> 1099 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 4190 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_popup_panel_background.9.pngbin1494 -> 1204 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.pngbin0 -> 4047 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_suggest_strip.9.pngbin215 -> 248 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_suggest_strip_divider.pngbin1012 -> 2946 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.pngbin0 -> 136 bytes
-rw-r--r--java/res/drawable-hdpi/list_selector_background_pressed.9.pngbin4203 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/mic_slash.pngbin6995 -> 12569 bytes
-rw-r--r--java/res/drawable-hdpi/mic_slash_holo.pngbin0 -> 8254 bytes
-rw-r--r--java/res/drawable-hdpi/ok_cancel.pngbin774 -> 4043 bytes
-rw-r--r--java/res/drawable-hdpi/ok_cancel_holo.9.pngbin0 -> 755 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level0.pngbin6017 -> 7411 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level0_holo.pngbin0 -> 3969 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level1.pngbin6267 -> 7471 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level1_holo.pngbin0 -> 6342 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level2.pngbin6359 -> 7526 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level2_holo.pngbin0 -> 6545 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level3.pngbin6506 -> 7676 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level3_holo.pngbin0 -> 6901 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level4.pngbin6542 -> 7672 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level4_holo.pngbin0 -> 6944 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level5.pngbin6463 -> 7498 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level5_holo.pngbin0 -> 6895 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level6.pngbin6782 -> 11212 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level6_holo.pngbin0 -> 7047 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_123_mic.pngbin2576 -> 2583 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_delete.pngbin2314 -> 1856 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_done.pngbin1588 -> 1837 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_mic.pngbin1410 -> 1453 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num0.pngbin1903 -> 1928 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num1.pngbin792 -> 899 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num2.pngbin3241 -> 2805 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num3.pngbin2829 -> 2578 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num4.pngbin2638 -> 2489 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num5.pngbin2532 -> 2287 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num6.pngbin3568 -> 3017 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num7.pngbin3687 -> 3108 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num8.pngbin2952 -> 2719 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_num9.pngbin3887 -> 3330 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_numalt.pngbin2971 -> 2724 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_numpound.pngbin1577 -> 1633 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_numstar.pngbin1742 -> 1675 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_return.pngbin1111 -> 1426 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_search.pngbin1612 -> 2045 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_settings.pngbin729 -> 1710 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_shift.pngbin1474 -> 1820 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_shift_locked.pngbin1115 -> 1467 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_space.pngbin358 -> 790 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_tab.pngbin1008 -> 1123 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_123_mic.pngbin2575 -> 2510 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_delete.pngbin599 -> 4003 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_delete_holo.pngbin0 -> 1311 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_done.pngbin1593 -> 1827 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.pngbin3541 -> 6061 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_delete.pngbin681 -> 4019 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_done.pngbin1068 -> 1711 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.pngbin1275 -> 3397 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.pngbin1329 -> 3388 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_mic.pngbin2494 -> 4637 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_numalt.pngbin3797 -> 5931 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_return.pngbin2018 -> 4346 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_search.pngbin2335 -> 4658 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_settings.pngbin1558 -> 4641 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_shift.pngbin677 -> 3865 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.pngbin652 -> 3845 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_space.pngbin1336 -> 3908 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_tab.pngbin1707 -> 4111 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_language_arrows_left.pngbin1253 -> 3220 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_language_arrows_right.pngbin1372 -> 3286 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_mic.pngbin886 -> 3893 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_mic_disabled.pngbin0 -> 886 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num0.pngbin1931 -> 1872 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num0_holo.pngbin0 -> 2398 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num1.pngbin809 -> 867 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num1_holo.pngbin0 -> 1118 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num2.pngbin3214 -> 2720 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num2_holo.pngbin0 -> 4328 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num3.pngbin2805 -> 2523 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num3_holo.pngbin0 -> 3749 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num4.pngbin2647 -> 2419 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num4_holo.pngbin0 -> 3670 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num5.pngbin2536 -> 2230 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num5_holo.pngbin0 -> 3395 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num6.pngbin3573 -> 2950 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num6_holo.pngbin0 -> 4817 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num7.pngbin3684 -> 3035 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num7_holo.pngbin0 -> 4963 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num8.pngbin2904 -> 2628 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num8_holo.pngbin0 -> 4035 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num9.pngbin3860 -> 3255 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_num9_holo.pngbin0 -> 5608 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_numalt.pngbin2919 -> 2664 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_numbpound_holo.pngbin0 -> 2027 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_numbstar_holo.pngbin0 -> 1397 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_numpound.pngbin1600 -> 1583 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_numstar.pngbin1749 -> 1618 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_return.pngbin1719 -> 4024 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_return_holo.pngbin0 -> 1296 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_search.pngbin1260 -> 4248 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_settings.pngbin1094 -> 4015 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_settings_holo.pngbin0 -> 2083 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_shift.pngbin640 -> 3740 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_shift_holo.pngbin0 -> 1824 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_shift_locked.pngbin593 -> 3686 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.pngbin0 -> 1405 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_smiley_holo.pngbin0 -> 893 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_space.pngbin326 -> 3331 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_space_holo.pngbin0 -> 685 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_space_led.9.pngbin3249 -> 557 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_tab.pngbin1434 -> 3792 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_voice_holo.pngbin0 -> 1559 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_voice_off_holo.pngbin0 -> 1328 bytes
-rw-r--r--java/res/drawable-hdpi/top_suggest_line_holo.9.pngbin0 -> 138 bytes
-rw-r--r--java/res/drawable-hdpi/voice_ime_background.9.pngbin1271 -> 1348 bytes
-rw-r--r--java/res/drawable-hdpi/voice_swipe_hint.pngbin5965 -> 4028 bytes
-rw-r--r--[-rwxr-xr-x]java/res/drawable-hdpi/working.pngbin1180 -> 4179 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_normal.9.pngbin0 -> 737 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.pngbin0 -> 941 bytes
-rw-r--r--java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.pngbin0 -> 2691 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.pngbin0 -> 1076 bytes
-rw-r--r--java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.pngbin0 -> 2720 bytes
-rw-r--r--java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.pngbin0 -> 2517 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.pngbin0 -> 733 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.pngbin0 -> 964 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.pngbin0 -> 1055 bytes
-rw-r--r--java/res/drawable-land-hdpi/hint_popup_holo.9.pngbin0 -> 321 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_at_holo.9.pngbin0 -> 936 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_at_large_holo.9.pngbin0 -> 1013 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_colon_holo.9.pngbin0 -> 385 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_colon_large_holo.9.pngbin0 -> 756 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_comma_holo.9.pngbin0 -> 373 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_dash_holo.9.pngbin0 -> 305 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_doublecross_holo.9.pngbin0 -> 833 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_equal_holo.9.pngbin0 -> 424 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_exclamation_holo.9.pngbin0 -> 493 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 539 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_larger_holo.9.pngbin0 -> 595 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_parenclose_holo.9.pngbin0 -> 651 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_parenopen_holo.9.pngbin0 -> 655 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_period_holo.9.pngbin0 -> 345 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_plus_holo.9.pngbin0 -> 521 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_plus_large_holo.9.pngbin0 -> 544 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_question_holo.9.pngbin0 -> 658 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_question_large_holo.9.pngbin0 -> 718 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_quote_holo.9.pngbin0 -> 406 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_quote_large_holo.9.pngbin0 -> 434 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_semicolon_holo.9.pngbin0 -> 476 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_simplequote_holo.9.pngbin0 -> 378 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_slash_holo.9.pngbin0 -> 592 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_slash_large_holo.9.pngbin0 -> 1025 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_smaller_holo.9.pngbin0 -> 551 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_star_holo.9.pngbin0 -> 666 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_underline_holo.9.pngbin0 -> 328 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_underline_large_holo.9.pngbin0 -> 354 bytes
-rw-r--r--java/res/drawable-land-mdpi/hint_popup_holo.9.pngbin0 -> 1180 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_at_holo.9.pngbin0 -> 1592 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_at_large_holo.9.pngbin0 -> 1651 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_colon_holo.9.pngbin0 -> 1262 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.pngbin0 -> 1836 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_comma_holo.9.pngbin0 -> 1241 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_dash_holo.9.pngbin0 -> 1196 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.pngbin0 -> 1621 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_equal_holo.9.pngbin0 -> 1295 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.pngbin0 -> 1293 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 1338 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_larger_holo.9.pngbin0 -> 1453 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.pngbin0 -> 1427 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.pngbin0 -> 1461 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_period_holo.9.pngbin0 -> 1214 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_plus_holo.9.pngbin0 -> 1275 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.pngbin0 -> 1328 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_question_holo.9.pngbin0 -> 1414 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_question_large_holo.9.pngbin0 -> 1473 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_quote_holo.9.pngbin0 -> 1230 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.pngbin0 -> 1249 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.pngbin0 -> 1327 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.pngbin0 -> 1242 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_slash_holo.9.pngbin0 -> 1429 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.pngbin0 -> 770 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_smaller_holo.9.pngbin0 -> 1408 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_star_holo.9.pngbin0 -> 1480 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_underline_holo.9.pngbin0 -> 1140 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.pngbin0 -> 1154 bytes
-rw-r--r--java/res/drawable-mdpi/btn_candidate_normal.9.pngbin0 -> 205 bytes
-rw-r--r--java/res/drawable-mdpi/btn_candidate_pressed.9.png (renamed from java/res/drawable-mdpi/list_selector_background_pressed.9.png)bin11006 -> 11006 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.pngbin0 -> 1275 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.pngbin0 -> 1641 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_holo.9.pngbin0 -> 1865 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_holo.9.pngbin0 -> 1511 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.pngbin0 -> 1861 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.pngbin0 -> 1984 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_light_normal_holo.9.pngbin0 -> 1329 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.pngbin252 -> 999 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_light_pressed_holo.9.pngbin0 -> 1469 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 1101 bytes
-rw-r--r--java/res/drawable-mdpi/cancel_holo.9.pngbin0 -> 2419 bytes
-rw-r--r--java/res/drawable-mdpi/hint_popup_holo.9.pngbin0 -> 1168 bytes
-rw-r--r--java/res/drawable-mdpi/ic_subtype_keyboard.pngbin498 -> 644 bytes
-rw-r--r--java/res/drawable-mdpi/ic_subtype_mic.pngbin483 -> 648 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_at_holo.9.pngbin0 -> 1621 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_at_large_holo.9.pngbin0 -> 1651 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_colon_holo.9.pngbin0 -> 1219 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_colon_large_holo.9.pngbin0 -> 360 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_comma_holo.9.pngbin0 -> 1195 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_dash_holo.9.pngbin0 -> 1185 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_doublecross_holo.9.pngbin0 -> 1449 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_equal_holo.9.pngbin0 -> 1292 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_exclamation_holo.9.pngbin0 -> 1317 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 1338 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_larger_holo.9.pngbin0 -> 1315 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_parenclose_holo.9.pngbin0 -> 1316 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_parenopen_holo.9.pngbin0 -> 1333 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_period_holo.9.pngbin0 -> 1164 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_plus_holo.9.pngbin0 -> 1275 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_plus_large_holo.9.pngbin0 -> 1328 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_question_holo.9.pngbin0 -> 1433 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_question_large_holo.9.pngbin0 -> 1473 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_quote_holo.9.pngbin0 -> 1238 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_quote_large_holo.9.pngbin0 -> 1249 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_semicolon_holo.9.pngbin0 -> 1248 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_simplequote_holo.9.pngbin0 -> 1205 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_slash_holo.9.pngbin0 -> 1317 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_slash_large_holo.9.pngbin0 -> 1933 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_smaller_holo.9.pngbin0 -> 1326 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_star_holo.9.pngbin0 -> 1344 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_underline_holo.9.pngbin0 -> 1144 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_underline_large_holo.9.pngbin0 -> 1154 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_background_holo.9.pngbin0 -> 1108 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_at.9.pngbin0 -> 1180 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_colon.9.pngbin0 -> 1082 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_doublecross.9.pngbin0 -> 1157 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_exclamation.9.pngbin0 -> 1095 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_greater.9.pngbin0 -> 1133 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_plus.9.pngbin0 -> 1116 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_question.9.pngbin0 -> 1140 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_quote.9.pngbin0 -> 1077 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_smaller.9.pngbin0 -> 1130 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_star.9.pngbin0 -> 1136 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 1004 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 3814 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_popup_panel_background_holo.9.pngbin0 -> 3730 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.pngbin0 -> 1003 bytes
-rw-r--r--java/res/drawable-mdpi/mic_slash_holo.pngbin0 -> 4317 bytes
-rw-r--r--java/res/drawable-mdpi/ok_cancel_holo.9.pngbin0 -> 1458 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level0_holo.pngbin0 -> 3434 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level1_holo.pngbin0 -> 3678 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level2_holo.pngbin0 -> 3659 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level3_holo.pngbin0 -> 4029 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level4_holo.pngbin0 -> 4127 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level5_holo.pngbin0 -> 4139 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level6_holo.pngbin0 -> 3896 bytes
-rw-r--r--java/res/drawable-mdpi/sym_bkeyboard_voice_off.pngbin0 -> 1587 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_delete_holo.pngbin0 -> 1419 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_mic_disabled.png (renamed from java/res/drawable-mdpi/sym_keyboard_shift_lock.png)bin3188 -> 3439 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num0_holo.pngbin0 -> 1759 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num1_holo.pngbin0 -> 1324 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num2_holo.pngbin0 -> 2397 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num3_holo.pngbin0 -> 2143 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num4_holo.pngbin0 -> 2063 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num5_holo.pngbin0 -> 2021 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num6_holo.pngbin0 -> 2502 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num7_holo.pngbin0 -> 2540 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num8_holo.pngbin0 -> 2226 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num9_holo.pngbin0 -> 2699 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_numbpound_holo.pngbin0 -> 1548 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_numbstar_holo.pngbin0 -> 1414 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_return_holo.pngbin0 -> 1391 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_settings_holo.pngbin0 -> 1877 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_shift_holo.pngbin0 -> 1683 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.pngbin0 -> 1480 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_space_holo.pngbin0 -> 1195 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_voice_holo.pngbin0 -> 1678 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_voice_off_holo.pngbin0 -> 1587 bytes
-rw-r--r--java/res/drawable-mdpi/top_suggest_line_holo.9.pngbin0 -> 1012 bytes
-rwxr-xr-xjava/res/drawable-xlarge/btn_center_default.9.pngbin0 -> 182 bytes
-rwxr-xr-xjava/res/drawable-xlarge/btn_center_pressed.9.pngbin0 -> 200 bytes
-rw-r--r--java/res/drawable-xlarge/btn_center_selected.9.pngbin0 -> 200 bytes
-rwxr-xr-xjava/res/drawable-xlarge/caution.pngbin0 -> 1100 bytes
-rw-r--r--java/res/drawable-xlarge/mic_base.pngbin0 -> 2957 bytes
-rw-r--r--java/res/drawable-xlarge/mic_full.pngbin0 -> 2935 bytes
-rw-r--r--java/res/drawable-xlarge/mic_slash.pngbin0 -> 3766 bytes
-rw-r--r--java/res/drawable-xlarge/vs_dialog_blue.9.pngbin0 -> 8275 bytes
-rw-r--r--java/res/drawable-xlarge/vs_dialog_red.9.pngbin0 -> 8607 bytes
-rw-r--r--java/res/drawable-xlarge/vs_dialog_yellow.9.pngbin0 -> 8151 bytes
-rw-r--r--java/res/drawable-xlarge/vs_popup_mic_edge.pngbin0 -> 3685 bytes
-rw-r--r--java/res/drawable/background_voice.xml25
-rw-r--r--java/res/drawable/btn_candidate.xml (renamed from java/res/xml/popup_comma.xml)24
-rw-r--r--java/res/drawable/btn_candidate_holo.xml (renamed from java/res/xml/dictionary.xml)10
-rw-r--r--java/res/drawable/btn_center.xml40
-rwxr-xr-xjava/res/drawable/btn_center_default.9.pngbin0 -> 182 bytes
-rwxr-xr-xjava/res/drawable/btn_center_pressed.9.pngbin0 -> 200 bytes
-rw-r--r--java/res/drawable/btn_center_selected.9.pngbin0 -> 200 bytes
-rw-r--r--java/res/drawable/btn_keyboard_key_honeycomb.xml43
-rw-r--r--java/res/drawable/btn_keyboard_key_honeycomb_popup.xml20
-rwxr-xr-xjava/res/drawable/caution.pngbin0 -> 1100 bytes
-rw-r--r--java/res/drawable/keyboard_key_feedback_honeycomb.xml21
-rw-r--r--java/res/drawable/mic_base.pngbin0 -> 2957 bytes
-rw-r--r--java/res/drawable/mic_full.pngbin0 -> 2935 bytes
-rw-r--r--java/res/drawable/mic_slash.pngbin0 -> 3766 bytes
-rw-r--r--java/res/drawable/vs_dialog_blue.9.pngbin0 -> 8275 bytes
-rw-r--r--java/res/drawable/vs_dialog_red.9.pngbin0 -> 8607 bytes
-rw-r--r--java/res/drawable/vs_dialog_yellow.9.pngbin0 -> 8151 bytes
-rw-r--r--java/res/drawable/vs_popup_mic_edge.pngbin0 -> 3685 bytes
-rw-r--r--java/res/layout-xlarge/candidate.xml60
-rw-r--r--java/res/layout-xlarge/candidate_preview.xml (renamed from java/res/xml/popup_slash.xml)26
-rw-r--r--java/res/layout-xlarge/candidates.xml45
-rw-r--r--java/res/layout-xlarge/keyboard_popup_honeycomb.xml41
-rw-r--r--java/res/layout/candidate.xml60
-rw-r--r--java/res/layout/candidates.xml51
-rw-r--r--java/res/layout/input_basic.xml2
-rw-r--r--java/res/layout/input_basic_highcontrast.xml2
-rw-r--r--java/res/layout/input_gingerbread.xml6
-rw-r--r--java/res/layout/input_honeycomb.xml39
-rw-r--r--java/res/layout/input_stone_bold.xml8
-rw-r--r--java/res/layout/input_stone_normal.xml5
-rw-r--r--java/res/layout/input_stone_popup.xml4
-rw-r--r--java/res/layout/key_preview_honeycomb.xml29
-rw-r--r--java/res/layout/keyboard_popup.xml4
-rw-r--r--java/res/layout/keyboard_popup_honeycomb.xml41
-rw-r--r--java/res/layout/recognition_status.xml157
-rw-r--r--[-rwxr-xr-x]java/res/raw/main.dictbin34 -> 34 bytes
-rw-r--r--[-rwxr-xr-x]java/res/raw/type3.oggbin4126 -> 4126 bytes
-rw-r--r--java/res/values-ar/strings.xml138
-rw-r--r--java/res/values-bg/strings.xml138
-rw-r--r--java/res/values-ca/donottranslate-altchars.xml (renamed from java/res/values-ja/donottranslate-altchars.xml)19
-rw-r--r--java/res/values-ca/strings.xml138
-rw-r--r--java/res/values-cs/donottranslate-altchars.xml24
-rw-r--r--java/res/values-cs/strings.xml138
-rw-r--r--java/res/values-da/donottranslate-altchars.xml29
-rw-r--r--java/res/values-da/strings.xml138
-rw-r--r--java/res/values-de/donottranslate-altchars.xml16
-rw-r--r--java/res/values-de/strings.xml138
-rw-r--r--java/res/values-el/strings.xml138
-rw-r--r--java/res/values-en-rGB/strings.xml138
-rw-r--r--java/res/values-en/donottranslate-altchars.xml13
-rw-r--r--java/res/values-es-rUS/strings.xml131
-rw-r--r--java/res/values-es/donottranslate-altchars.xml16
-rw-r--r--java/res/values-es/strings.xml138
-rw-r--r--java/res/values-fa/strings.xml138
-rw-r--r--java/res/values-fi/donottranslate-altchars.xml (renamed from java/res/values-ko/donottranslate-altchars.xml)20
-rw-r--r--java/res/values-fi/strings.xml138
-rw-r--r--java/res/values-fr/donottranslate-altchars.xml16
-rw-r--r--java/res/values-fr/strings.xml138
-rw-r--r--java/res/values-hr/strings.xml138
-rw-r--r--java/res/values-hu/donottranslate-altchars.xml (renamed from java/res/values-el/donottranslate-altchars.xml)18
-rw-r--r--java/res/values-hu/strings.xml138
-rw-r--r--java/res/values-in/strings.xml138
-rw-r--r--java/res/values-it/donottranslate-altchars.xml14
-rw-r--r--java/res/values-it/strings.xml138
-rw-r--r--java/res/values-iw/strings.xml138
-rw-r--r--java/res/values-ja/strings.xml138
-rw-r--r--java/res/values-ko/strings.xml138
-rw-r--r--java/res/values-land/dimens.xml11
-rw-r--r--java/res/values-lt/donottranslate-altchars.xml (renamed from java/res/values-es-rUS/donottranslate-altchars.xml)18
-rw-r--r--java/res/values-lt/strings.xml138
-rw-r--r--java/res/values-lv/donottranslate-altchars.xml33
-rw-r--r--java/res/values-lv/strings.xml138
-rw-r--r--java/res/values-nb/donottranslate-altchars.xml24
-rw-r--r--java/res/values-nb/strings.xml138
-rw-r--r--java/res/values-nl/donottranslate-altchars.xml17
-rw-r--r--java/res/values-nl/strings.xml138
-rw-r--r--java/res/values-pl/donottranslate-altchars.xml17
-rw-r--r--java/res/values-pl/strings.xml138
-rw-r--r--java/res/values-pt-rPT/donottranslate-altchars.xml30
-rw-r--r--java/res/values-pt-rPT/strings.xml138
-rw-r--r--java/res/values-pt/donottranslate-altchars.xml17
-rw-r--r--java/res/values-pt/strings.xml138
-rw-r--r--java/res/values-rm/donottranslate-altchars.xml10
-rw-r--r--java/res/values-rm/strings.xml183
-rw-r--r--java/res/values-ro/donottranslate-altchars.xml25
-rw-r--r--java/res/values-ro/strings.xml138
-rw-r--r--java/res/values-ru/donottranslate-altchars.xml11
-rw-r--r--java/res/values-ru/strings.xml138
-rw-r--r--java/res/values-sk/donottranslate-altchars.xml35
-rw-r--r--java/res/values-sk/strings.xml138
-rw-r--r--java/res/values-sl/strings.xml138
-rw-r--r--java/res/values-sr/strings.xml138
-rw-r--r--java/res/values-sv/donottranslate-altchars.xml25
-rw-r--r--java/res/values-sv/strings.xml138
-rw-r--r--java/res/values-th/strings.xml138
-rw-r--r--java/res/values-tl/strings.xml138
-rw-r--r--java/res/values-tr/donottranslate-altchars.xml17
-rw-r--r--java/res/values-tr/strings.xml138
-rw-r--r--java/res/values-uk/strings.xml138
-rw-r--r--java/res/values-vi/strings.xml138
-rw-r--r--java/res/values-xlarge-land/dimens.xml39
-rw-r--r--java/res/values-xlarge/config.xml44
-rw-r--r--java/res/values-xlarge/dimens.xml51
-rw-r--r--java/res/values-xlarge/donottranslate.xml (renamed from java/res/values-zh-rCN/donottranslate-altchars.xml)11
-rw-r--r--java/res/values-zh-rCN/strings.xml138
-rw-r--r--java/res/values-zh-rTW/strings.xml138
-rw-r--r--java/res/values/attrs.xml137
-rw-r--r--java/res/values/bools.xml7
-rw-r--r--java/res/values/config.xml49
-rw-r--r--java/res/values/dimens.xml47
-rw-r--r--java/res/values/donottranslate-altchars.xml36
-rw-r--r--java/res/values/donottranslate.xml124
-rw-r--r--java/res/values/keycodes.xml5
-rw-r--r--java/res/values/strings.xml382
-rw-r--r--java/res/values/styles.xml8
-rw-r--r--java/res/xml-cs/kbd_qwerty.xml34
-rw-r--r--java/res/xml-da/kbd_qwerty.xml523
-rw-r--r--java/res/xml-da/kbd_qwerty_black.xml478
-rw-r--r--java/res/xml-de/kbd_qwerty.xml503
-rw-r--r--java/res/xml-de/kbd_qwerty_black.xml457
-rw-r--r--java/res/xml-fi/kbd_qwerty.xml33
-rw-r--r--java/res/xml-fr-rCA/kbd_qwerty.xml34
-rw-r--r--java/res/xml-fr-rCH/kbd_qwerty.xml34
-rw-r--r--java/res/xml-fr/kbd_qwerty.xml504
-rw-r--r--java/res/xml-fr/kbd_qwerty_black.xml458
-rw-r--r--java/res/xml-hu/kbd_qwerty.xml34
-rw-r--r--java/res/xml-iw/kbd_qwerty.xml470
-rw-r--r--java/res/xml-iw/kbd_qwerty_black.xml416
-rw-r--r--java/res/xml-nb/kbd_qwerty.xml523
-rw-r--r--java/res/xml-nb/kbd_qwerty_black.xml478
-rw-r--r--java/res/xml-ru/kbd_qwerty.xml501
-rw-r--r--java/res/xml-ru/kbd_qwerty_black.xml456
-rw-r--r--java/res/xml-sr/kbd_qwerty.xml494
-rw-r--r--java/res/xml-sr/kbd_qwerty_black.xml449
-rw-r--r--java/res/xml-sv/kbd_qwerty.xml524
-rw-r--r--java/res/xml-sv/kbd_qwerty_black.xml480
-rw-r--r--java/res/xml-xlarge-land/kbd_popup_template.xml (renamed from java/res/xml/popup_at.xml)22
-rw-r--r--java/res/xml-xlarge/kbd_azerty_rows.xml169
-rw-r--r--java/res/xml-xlarge/kbd_key_styles.xml168
-rw-r--r--java/res/xml-xlarge/kbd_number.xml150
-rw-r--r--java/res/xml-xlarge/kbd_numkey_styles.xml148
-rw-r--r--java/res/xml-xlarge/kbd_phone.xml158
-rw-r--r--java/res/xml-xlarge/kbd_phone_symbols.xml170
-rw-r--r--java/res/xml-xlarge/kbd_popup_template.xml27
-rw-r--r--java/res/xml-xlarge/kbd_qwerty.xml (renamed from java/res/values-zh-rTW/donottranslate-altchars.xml)25
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_row1.xml68
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_row2.xml61
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_row3.xml78
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_row4.xml128
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_rows.xml34
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml118
-rw-r--r--java/res/xml-xlarge/kbd_qwertz_rows.xml127
-rw-r--r--java/res/xml-xlarge/kbd_ru_rows.xml140
-rw-r--r--java/res/xml-xlarge/kbd_sr_rows.xml149
-rw-r--r--java/res/xml-xlarge/kbd_symbols.xml176
-rw-r--r--java/res/xml-xlarge/kbd_symbols_shift.xml153
-rw-r--r--java/res/xml/kbd_azerty_rows.xml138
-rw-r--r--java/res/xml/kbd_key_styles.xml290
-rw-r--r--java/res/xml/kbd_number.xml112
-rw-r--r--java/res/xml/kbd_numkey_styles.xml150
-rw-r--r--java/res/xml/kbd_phone.xml102
-rw-r--r--java/res/xml/kbd_phone_black.xml101
-rw-r--r--java/res/xml/kbd_phone_symbols.xml98
-rw-r--r--java/res/xml/kbd_phone_symbols_black.xml98
-rw-r--r--java/res/xml/kbd_popup_narrow_template.xml10
-rw-r--r--java/res/xml/kbd_popup_template.xml10
-rw-r--r--java/res/xml/kbd_qwerty.xml493
-rw-r--r--java/res/xml/kbd_qwerty_black.xml447
-rw-r--r--java/res/xml/kbd_qwerty_black_symbol.xml84
-rw-r--r--java/res/xml/kbd_qwerty_f1.xml63
-rw-r--r--java/res/xml/kbd_qwerty_row1.xml71
-rw-r--r--java/res/xml/kbd_qwerty_row2.xml56
-rw-r--r--java/res/xml/kbd_qwerty_row3.xml54
-rw-r--r--java/res/xml/kbd_qwerty_row4.xml138
-rw-r--r--java/res/xml/kbd_qwerty_rows.xml34
-rw-r--r--java/res/xml/kbd_qwerty_rows_scandinavia.xml119
-rw-r--r--java/res/xml/kbd_qwertz_rows.xml107
-rw-r--r--java/res/xml/kbd_ru_rows.xml140
-rw-r--r--java/res/xml/kbd_sr_rows.xml133
-rw-r--r--java/res/xml/kbd_symbols.xml223
-rw-r--r--java/res/xml/kbd_symbols_black.xml202
-rw-r--r--java/res/xml/kbd_symbols_f1.xml41
-rw-r--r--java/res/xml/kbd_symbols_row4.xml102
-rw-r--r--java/res/xml/kbd_symbols_shift.xml187
-rw-r--r--java/res/xml/kbd_symbols_shift_black.xml177
-rw-r--r--java/res/xml/kbd_symbols_shift_row4.xml98
-rw-r--r--java/res/xml/method.xml189
-rw-r--r--java/res/xml/popup_domains.xml46
-rw-r--r--java/res/xml/popup_mic.xml40
-rw-r--r--java/res/xml/popup_punctuation.xml68
-rw-r--r--java/res/xml/popup_smileys.xml89
-rw-r--r--java/res/xml/prefs.xml155
-rw-r--r--java/res/xml/prefs_for_debug.xml2
-rw-r--r--java/src/com/android/inputmethod/keyboard/Key.java422
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyDetector.java (renamed from java/src/com/android/inputmethod/latin/KeyDetector.java)14
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyStyles.java258
-rw-r--r--java/src/com/android/inputmethod/keyboard/Keyboard.java417
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java74
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardId.java184
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardParser.java578
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java133
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java738
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardView.java (renamed from java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java)1062
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboard.java496
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java261
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboard.java (renamed from java/src/com/android/inputmethod/latin/ModifierKeyState.java)29
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java202
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java (renamed from java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java)21
-rw-r--r--java/src/com/android/inputmethod/keyboard/ModifierKeyState.java83
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java599
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java109
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java84
-rw-r--r--java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java176
-rw-r--r--java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java67
-rw-r--r--java/src/com/android/inputmethod/keyboard/Row.java72
-rw-r--r--java/src/com/android/inputmethod/keyboard/ShiftKeyState.java69
-rw-r--r--java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java163
-rw-r--r--java/src/com/android/inputmethod/keyboard/SwipeTracker.java (renamed from java/src/com/android/inputmethod/latin/SwipeTracker.java)8
-rw-r--r--java/src/com/android/inputmethod/latin/AutoDictionary.java15
-rw-r--r--java/src/com/android/inputmethod/latin/BackupAgent.java (renamed from java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java)2
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java187
-rw-r--r--[-rwxr-xr-x]java/src/com/android/inputmethod/latin/CandidateView.java610
-rw-r--r--java/src/com/android/inputmethod/latin/ContactsDictionary.java3
-rw-r--r--java/src/com/android/inputmethod/latin/DebugSettings.java (renamed from java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java)5
-rw-r--r--java/src/com/android/inputmethod/latin/Dictionary.java8
-rw-r--r--java/src/com/android/inputmethod/latin/EditingUtils.java (renamed from java/src/com/android/inputmethod/latin/EditingUtil.java)89
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableDictionary.java184
-rw-r--r--java/src/com/android/inputmethod/latin/InputLanguageSelection.java72
-rw-r--r--java/src/com/android/inputmethod/latin/KeyboardSwitcher.java606
-rw-r--r--java/src/com/android/inputmethod/latin/LanguageSwitcher.java74
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java2430
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIMESettings.java204
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIMEUtil.java171
-rw-r--r--java/src/com/android/inputmethod/latin/LatinImeLogger.java10
-rw-r--r--java/src/com/android/inputmethod/latin/LatinKeyboard.java1023
-rw-r--r--java/src/com/android/inputmethod/latin/LatinKeyboardView.java380
-rw-r--r--java/src/com/android/inputmethod/latin/PointerTracker.java581
-rw-r--r--java/src/com/android/inputmethod/latin/ProximityKeyDetector.java86
-rw-r--r--java/src/com/android/inputmethod/latin/Settings.java338
-rw-r--r--java/src/com/android/inputmethod/latin/SubtypeLocale.java46
-rw-r--r--java/src/com/android/inputmethod/latin/SubtypeSwitcher.java635
-rw-r--r--[-rwxr-xr-x]java/src/com/android/inputmethod/latin/Suggest.java204
-rw-r--r--java/src/com/android/inputmethod/latin/SuggestedWords.java190
-rw-r--r--java/src/com/android/inputmethod/latin/TextEntryState.java42
-rw-r--r--java/src/com/android/inputmethod/latin/Tutorial.java244
-rw-r--r--java/src/com/android/inputmethod/latin/UserBigramDictionary.java26
-rw-r--r--java/src/com/android/inputmethod/latin/UserDictionary.java41
-rw-r--r--java/src/com/android/inputmethod/latin/Utils.java442
-rw-r--r--java/src/com/android/inputmethod/voice/FieldContext.java2
-rw-r--r--java/src/com/android/inputmethod/voice/Hints.java (renamed from java/src/com/android/inputmethod/latin/Hints.java)37
-rw-r--r--java/src/com/android/inputmethod/voice/RecognitionView.java252
-rw-r--r--java/src/com/android/inputmethod/voice/SettingsUtil.java3
-rw-r--r--java/src/com/android/inputmethod/voice/SoundIndicator.java155
-rw-r--r--java/src/com/android/inputmethod/voice/VoiceIMEConnector.java743
-rw-r--r--java/src/com/android/inputmethod/voice/VoiceInput.java74
-rw-r--r--java/src/com/android/inputmethod/voice/VoiceInputLogger.java7
-rw-r--r--java/src/com/android/inputmethod/voice/WaveformImage.java4
-rw-r--r--java/src/com/android/inputmethod/voice/Whitelist.java1
647 files changed, 19587 insertions, 19672 deletions
diff --git a/java/Android.mk b/java/Android.mk
index 03d48aaa7..60c321ab2 100644
--- a/java/Android.mk
+++ b/java/Android.mk
@@ -13,7 +13,11 @@ LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime
LOCAL_STATIC_JAVA_LIBRARIES := android-common
-#LOCAL_AAPT_FLAGS := -0 .dict
+# Do not compress dictionary files to mmap dict data runtime
+LOCAL_AAPT_FLAGS := -0 .dict
+
+# Include all the resources regardless of system supported locales
+LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true
LOCAL_SDK_VERSION := current
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml
index b1e5ec6f6..e0eecfc7d 100755..100644
--- a/java/AndroidManifest.xml
+++ b/java/AndroidManifest.xml
@@ -2,13 +2,14 @@
package="com.android.inputmethod.latin">
<uses-permission android:name="android.permission.VIBRATE"/>
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
<uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application android:label="@string/english_ime_name"
- android:backupAgent="LatinIMEBackupAgent"
+ android:backupAgent="BackupAgent"
android:killAfterRestore="false">
<service android:name="LatinIME"
@@ -20,13 +21,13 @@
<meta-data android:name="android.view.im" android:resource="@xml/method" />
</service>
- <activity android:name="LatinIMESettings" android:label="@string/english_ime_settings">
+ <activity android:name="Settings" android:label="@string/english_ime_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>
- <activity android:name="LatinIMEDebugSettings" android:label="@string/english_ime_debug_settings">
+ <activity android:name="DebugSettings" android:label="@string/english_ime_debug_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
diff --git a/java/proguard.flags b/java/proguard.flags
index 829a096c0..9096855e8 100644
--- a/java/proguard.flags
+++ b/java/proguard.flags
@@ -5,4 +5,12 @@
-keep class com.android.inputmethod.latin.Suggest {
<init>(...);
+ com.android.inputmethod.latin.SuggestedWords getSuggestions(...);
+}
+
+-keep class com.android.inputmethod.latin.UserBigramDictionary {
+ void setDatabaseMax(int);
+ void setDatabaseDelete(int);
+ void waitUntilUpdateDBDone();
+ void waitForDictionaryLoading();
}
diff --git a/java/res/drawable-hdpi/btn_candidate_normal.9.png b/java/res/drawable-hdpi/btn_candidate_normal.9.png
new file mode 100644
index 000000000..7cab5a899
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_candidate_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_candidate_pressed.9.png b/java/res/drawable-hdpi/btn_candidate_pressed.9.png
new file mode 100644
index 000000000..7acceaee7
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_candidate_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png
index 01fc8ca78..50cc49fdb 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 000000000..a8c1688f7
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png
index af4017e2c..dabf77ec6 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png
new file mode 100644
index 000000000..829647663
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png
index 4c35aca95..6e7d74c88 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.png
new file mode 100644
index 000000000..020a65d6e
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png
index 174f3452c..ddb77c224 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 000000000..88b27c07b
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png
index 1fcbd9a88..1e9227e1c 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
new file mode 100644
index 000000000..87497bc1f
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png
index 072753f37..7207b2ece 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
new file mode 100644
index 000000000..f0d76dfa2
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png
index b6c234c04..a524168c9 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png
index 73a8cd1c3..4395e978a 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png
index 1ad746053..9d85c7b74 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.png
new file mode 100644
index 000000000..3115fa436
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png
index e3a77d61b..2ed1b3447 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png
index 431c44967..77e17dbae 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png
index ccd59d5fa..a409639e7 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 000000000..dc08102a7
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png
index 42c7c146d..6ec7e6592 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png
index 01e2506b0..995780cbf 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png
index fad0ec458..1388b6694 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png
index 83c6eb3fc..7215782eb 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png
index 215f8157c..5a94cb6ac 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png
index 88acdd748..c6373a8af 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 000000000..5ecdaf428
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png
index e047eaff1..0bd49a0e7 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png
index 218a2d29e..634419f1b 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png
index afe49512e..8474f9f42 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/cancel.png b/java/res/drawable-hdpi/cancel.png
index 506cf99d0..fdf01dba6 100644
--- a/java/res/drawable-hdpi/cancel.png
+++ b/java/res/drawable-hdpi/cancel.png
Binary files differ
diff --git a/java/res/drawable-hdpi/cancel_holo.9.png b/java/res/drawable-hdpi/cancel_holo.9.png
new file mode 100644
index 000000000..33548d606
--- /dev/null
+++ b/java/res/drawable-hdpi/cancel_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/candidate_feedback_background.9.png b/java/res/drawable-hdpi/candidate_feedback_background.9.png
index 203c4e640..16499002e 100644
--- a/java/res/drawable-hdpi/candidate_feedback_background.9.png
+++ b/java/res/drawable-hdpi/candidate_feedback_background.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/caution.png b/java/res/drawable-hdpi/caution.png
index 5cb6c54b9..caed9419d 100644
--- a/java/res/drawable-hdpi/caution.png
+++ b/java/res/drawable-hdpi/caution.png
Binary files differ
diff --git a/java/res/drawable-hdpi/dialog_bubble_step02.9.png b/java/res/drawable-hdpi/dialog_bubble_step02.9.png
index b338364c5..2a3ac18c0 100644
--- a/java/res/drawable-hdpi/dialog_bubble_step02.9.png
+++ b/java/res/drawable-hdpi/dialog_bubble_step02.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/dialog_bubble_step07.9.png b/java/res/drawable-hdpi/dialog_bubble_step07.9.png
index 94b915432..0a5046b07 100644
--- a/java/res/drawable-hdpi/dialog_bubble_step07.9.png
+++ b/java/res/drawable-hdpi/dialog_bubble_step07.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/highlight_pressed.png b/java/res/drawable-hdpi/highlight_pressed.png
index ae04901a0..638df19bc 100644
--- a/java/res/drawable-hdpi/highlight_pressed.png
+++ b/java/res/drawable-hdpi/highlight_pressed.png
Binary files differ
diff --git a/java/res/drawable-hdpi/hint_popup.9.png b/java/res/drawable-hdpi/hint_popup.9.png
index b5ec003e6..5b2ad5388 100644
--- a/java/res/drawable-hdpi/hint_popup.9.png
+++ b/java/res/drawable-hdpi/hint_popup.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/hint_popup_holo.9.png b/java/res/drawable-hdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..2ffc6ea2b
--- /dev/null
+++ b/java/res/drawable-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_dialog_keyboard.png b/java/res/drawable-hdpi/ic_dialog_keyboard.png
index c7729566c..fb6d89879 100644
--- a/java/res/drawable-hdpi/ic_dialog_keyboard.png
+++ b/java/res/drawable-hdpi/ic_dialog_keyboard.png
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_mic_dialog.png b/java/res/drawable-hdpi/ic_mic_dialog.png
index 349dc4b37..6498cd589 100644
--- a/java/res/drawable-hdpi/ic_mic_dialog.png
+++ b/java/res/drawable-hdpi/ic_mic_dialog.png
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_subtype_keyboard.png b/java/res/drawable-hdpi/ic_subtype_keyboard.png
index 7015e266a..b5a9fa866 100644
--- a/java/res/drawable-hdpi/ic_subtype_keyboard.png
+++ b/java/res/drawable-hdpi/ic_subtype_keyboard.png
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_subtype_mic.png b/java/res/drawable-hdpi/ic_subtype_mic.png
index cb86a5598..5d68e85a6 100644
--- a/java/res/drawable-hdpi/ic_subtype_mic.png
+++ b/java/res/drawable-hdpi/ic_subtype_mic.png
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_suggest_strip_microphone.png b/java/res/drawable-hdpi/ic_suggest_strip_microphone.png
index c00b4aaa6..0462bdd16 100644
--- a/java/res/drawable-hdpi/ic_suggest_strip_microphone.png
+++ b/java/res/drawable-hdpi/ic_suggest_strip_microphone.png
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png b/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png
index 256dc3d61..80c20f691 100644
--- a/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png
+++ b/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_at_holo.9.png b/java/res/drawable-hdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..129e19853
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_at_large_holo.9.png b/java/res/drawable-hdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..d90bc31ab
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_colon_holo.9.png b/java/res/drawable-hdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..6a724af1a
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..c0c699157
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_comma_holo.9.png b/java/res/drawable-hdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..47ae5efaf
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_dash_holo.9.png b/java/res/drawable-hdpi/key_hint_dash_holo.9.png
new file mode 100644
index 000000000..a2b2fceeb
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_dash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png
new file mode 100644
index 000000000..d5af9f8c7
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_equal_holo.9.png b/java/res/drawable-hdpi/key_hint_equal_holo.9.png
new file mode 100644
index 000000000..4acc3c3be
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_equal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..8d99a27d2
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..e93e49187
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_larger_holo.9.png b/java/res/drawable-hdpi/key_hint_larger_holo.9.png
new file mode 100644
index 000000000..10614d9fe
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_larger_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png
new file mode 100644
index 000000000..9096362e0
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png
new file mode 100644
index 000000000..bb4cbd40d
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_period_holo.9.png b/java/res/drawable-hdpi/key_hint_period_holo.9.png
new file mode 100644
index 000000000..68f789b95
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_period_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_plus_holo.9.png b/java/res/drawable-hdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..3dd85065a
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 000000000..b0d75f433
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_question_holo.9.png b/java/res/drawable-hdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..4fe6a5b80
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_question_large_holo.9.png b/java/res/drawable-hdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..44dfdc4ea
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_quote_holo.9.png b/java/res/drawable-hdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..8308aa647
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..e73b9e0c6
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png
new file mode 100644
index 000000000..ac3de374c
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png
new file mode 100644
index 000000000..20d56c549
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_slash_holo.9.png b/java/res/drawable-hdpi/key_hint_slash_holo.9.png
new file mode 100644
index 000000000..3fe2c4271
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_slash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png
new file mode 100644
index 000000000..47e767557
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_smaller_holo.9.png b/java/res/drawable-hdpi/key_hint_smaller_holo.9.png
new file mode 100644
index 000000000..19a7d937e
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_smaller_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_star_holo.9.png b/java/res/drawable-hdpi/key_hint_star_holo.9.png
new file mode 100644
index 000000000..4e4340d63
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_star_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_underline_holo.9.png b/java/res/drawable-hdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..e4f271918
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-hdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 000000000..dad34fc72
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_background.9.png b/java/res/drawable-hdpi/keyboard_background.9.png
index edffac5b8..d57463fb6 100644
--- a/java/res/drawable-hdpi/keyboard_background.9.png
+++ b/java/res/drawable-hdpi/keyboard_background.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_background_holo.9.png b/java/res/drawable-hdpi/keyboard_background_holo.9.png
new file mode 100644
index 000000000..76fe2c8b8
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_dark_background.9.png b/java/res/drawable-hdpi/keyboard_dark_background.9.png
index f315cbdd4..fa3d449f7 100644
--- a/java/res/drawable-hdpi/keyboard_dark_background.9.png
+++ b/java/res/drawable-hdpi/keyboard_dark_background.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_0.9.png b/java/res/drawable-hdpi/keyboard_hint_0.9.png
index 271264e92..da52e0f5b 100644
--- a/java/res/drawable-hdpi/keyboard_hint_0.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_0.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_1.9.png b/java/res/drawable-hdpi/keyboard_hint_1.9.png
index eaf374262..7325c4cbb 100644
--- a/java/res/drawable-hdpi/keyboard_hint_1.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_1.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_2.9.png b/java/res/drawable-hdpi/keyboard_hint_2.9.png
index 8a1657117..35b7f2527 100644
--- a/java/res/drawable-hdpi/keyboard_hint_2.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_2.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_3.9.png b/java/res/drawable-hdpi/keyboard_hint_3.9.png
index 34b501109..1ae284838 100644
--- a/java/res/drawable-hdpi/keyboard_hint_3.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_3.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_4.9.png b/java/res/drawable-hdpi/keyboard_hint_4.9.png
index d4cc250dd..b67d6dd51 100644
--- a/java/res/drawable-hdpi/keyboard_hint_4.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_4.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_5.9.png b/java/res/drawable-hdpi/keyboard_hint_5.9.png
index 6a054b42f..ec52198d8 100644
--- a/java/res/drawable-hdpi/keyboard_hint_5.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_5.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_6.9.png b/java/res/drawable-hdpi/keyboard_hint_6.9.png
index 66e91400a..66dcf67e5 100644
--- a/java/res/drawable-hdpi/keyboard_hint_6.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_6.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_7.9.png b/java/res/drawable-hdpi/keyboard_hint_7.9.png
index 5eae24f4f..9d5499272 100644
--- a/java/res/drawable-hdpi/keyboard_hint_7.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_7.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_8.9.png b/java/res/drawable-hdpi/keyboard_hint_8.9.png
index ea7f512fd..beba1624c 100644
--- a/java/res/drawable-hdpi/keyboard_hint_8.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_8.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_9.9.png b/java/res/drawable-hdpi/keyboard_hint_9.9.png
index 0bf85de93..31ea54f32 100644
--- a/java/res/drawable-hdpi/keyboard_hint_9.9.png
+++ b/java/res/drawable-hdpi/keyboard_hint_9.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_at.9.png b/java/res/drawable-hdpi/keyboard_hint_at.9.png
new file mode 100644
index 000000000..4b49c0dd9
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_at.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_colon.9.png b/java/res/drawable-hdpi/keyboard_hint_colon.9.png
new file mode 100644
index 000000000..a91dc47f1
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_colon.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_doublecross.9.png b/java/res/drawable-hdpi/keyboard_hint_doublecross.9.png
new file mode 100644
index 000000000..c0917c200
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_doublecross.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_exclamation.9.png b/java/res/drawable-hdpi/keyboard_hint_exclamation.9.png
new file mode 100644
index 000000000..98c07d94a
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_exclamation.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_greater.9.png b/java/res/drawable-hdpi/keyboard_hint_greater.9.png
new file mode 100644
index 000000000..f2bf37dc2
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_greater.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_plus.9.png b/java/res/drawable-hdpi/keyboard_hint_plus.9.png
new file mode 100644
index 000000000..586e9c158
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_plus.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_question.9.png b/java/res/drawable-hdpi/keyboard_hint_question.9.png
new file mode 100644
index 000000000..6c7d4310a
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_question.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_quote.9.png b/java/res/drawable-hdpi/keyboard_hint_quote.9.png
new file mode 100644
index 000000000..57f44e4a2
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_quote.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_smaller.9.png b/java/res/drawable-hdpi/keyboard_hint_smaller.9.png
new file mode 100644
index 000000000..438b95ea8
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_smaller.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_star.9.png b/java/res/drawable-hdpi/keyboard_hint_star.9.png
new file mode 100644
index 000000000..33f8281b2
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_hint_star.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png
index 762a25704..27d992375 100644
--- a/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..943f9e4bc
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png
index 141d2d6be..33263b9d7 100644
--- a/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..c21240f17
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png
index d6b2c7936..baff80950 100644
--- a/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png
+++ b/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.png
new file mode 100644
index 000000000..4002dbe65
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip.9.png b/java/res/drawable-hdpi/keyboard_suggest_strip.9.png
index 0ccdb6ab2..7cab5a899 100644
--- a/java/res/drawable-hdpi/keyboard_suggest_strip.9.png
+++ b/java/res/drawable-hdpi/keyboard_suggest_strip.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png
index 7ca3e6131..7fca8c608 100644
--- a/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png
+++ b/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png
new file mode 100644
index 000000000..f55bcc933
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/list_selector_background_pressed.9.png b/java/res/drawable-hdpi/list_selector_background_pressed.9.png
deleted file mode 100644
index ba79cf7f8..000000000
--- a/java/res/drawable-hdpi/list_selector_background_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/mic_slash.png b/java/res/drawable-hdpi/mic_slash.png
index dc8da6252..71f4dc506 100644
--- a/java/res/drawable-hdpi/mic_slash.png
+++ b/java/res/drawable-hdpi/mic_slash.png
Binary files differ
diff --git a/java/res/drawable-hdpi/mic_slash_holo.png b/java/res/drawable-hdpi/mic_slash_holo.png
new file mode 100644
index 000000000..27a05dec3
--- /dev/null
+++ b/java/res/drawable-hdpi/mic_slash_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/ok_cancel.png b/java/res/drawable-hdpi/ok_cancel.png
index f11e57a38..48c00f094 100644
--- a/java/res/drawable-hdpi/ok_cancel.png
+++ b/java/res/drawable-hdpi/ok_cancel.png
Binary files differ
diff --git a/java/res/drawable-hdpi/ok_cancel_holo.9.png b/java/res/drawable-hdpi/ok_cancel_holo.9.png
new file mode 100644
index 000000000..5be81c35a
--- /dev/null
+++ b/java/res/drawable-hdpi/ok_cancel_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level0.png b/java/res/drawable-hdpi/speak_now_level0.png
index 342849cfe..31571f75b 100644
--- a/java/res/drawable-hdpi/speak_now_level0.png
+++ b/java/res/drawable-hdpi/speak_now_level0.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level0_holo.png b/java/res/drawable-hdpi/speak_now_level0_holo.png
new file mode 100644
index 000000000..29eef926b
--- /dev/null
+++ b/java/res/drawable-hdpi/speak_now_level0_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level1.png b/java/res/drawable-hdpi/speak_now_level1.png
index 8947a4306..c8d0aae5d 100644
--- a/java/res/drawable-hdpi/speak_now_level1.png
+++ b/java/res/drawable-hdpi/speak_now_level1.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level1_holo.png b/java/res/drawable-hdpi/speak_now_level1_holo.png
new file mode 100644
index 000000000..a76e990b7
--- /dev/null
+++ b/java/res/drawable-hdpi/speak_now_level1_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level2.png b/java/res/drawable-hdpi/speak_now_level2.png
index 44fc58c4e..123eea66e 100644
--- a/java/res/drawable-hdpi/speak_now_level2.png
+++ b/java/res/drawable-hdpi/speak_now_level2.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level2_holo.png b/java/res/drawable-hdpi/speak_now_level2_holo.png
new file mode 100644
index 000000000..8cd462d20
--- /dev/null
+++ b/java/res/drawable-hdpi/speak_now_level2_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level3.png b/java/res/drawable-hdpi/speak_now_level3.png
index cfa5c1b87..a8a2c5cff 100644
--- a/java/res/drawable-hdpi/speak_now_level3.png
+++ b/java/res/drawable-hdpi/speak_now_level3.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level3_holo.png b/java/res/drawable-hdpi/speak_now_level3_holo.png
new file mode 100644
index 000000000..b7371dc88
--- /dev/null
+++ b/java/res/drawable-hdpi/speak_now_level3_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level4.png b/java/res/drawable-hdpi/speak_now_level4.png
index a050d8836..b84d7b0e9 100644
--- a/java/res/drawable-hdpi/speak_now_level4.png
+++ b/java/res/drawable-hdpi/speak_now_level4.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level4_holo.png b/java/res/drawable-hdpi/speak_now_level4_holo.png
new file mode 100644
index 000000000..74befc8c3
--- /dev/null
+++ b/java/res/drawable-hdpi/speak_now_level4_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level5.png b/java/res/drawable-hdpi/speak_now_level5.png
index 8cd5ae7ad..8dd2b607f 100644
--- a/java/res/drawable-hdpi/speak_now_level5.png
+++ b/java/res/drawable-hdpi/speak_now_level5.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level5_holo.png b/java/res/drawable-hdpi/speak_now_level5_holo.png
new file mode 100644
index 000000000..b027e8343
--- /dev/null
+++ b/java/res/drawable-hdpi/speak_now_level5_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level6.png b/java/res/drawable-hdpi/speak_now_level6.png
index 9f4481eb4..888d0e5c7 100644
--- a/java/res/drawable-hdpi/speak_now_level6.png
+++ b/java/res/drawable-hdpi/speak_now_level6.png
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level6_holo.png b/java/res/drawable-hdpi/speak_now_level6_holo.png
new file mode 100644
index 000000000..17bb03452
--- /dev/null
+++ b/java/res/drawable-hdpi/speak_now_level6_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png
index 3e4eff698..24edfaa1c 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_delete.png b/java/res/drawable-hdpi/sym_bkeyboard_delete.png
index 1d24cc85c..4ccd218ac 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_delete.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_delete.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_done.png b/java/res/drawable-hdpi/sym_bkeyboard_done.png
index b77803d21..6959aeeef 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_done.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_done.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_mic.png
index 512f46080..6876fb64a 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_mic.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_mic.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num0.png b/java/res/drawable-hdpi/sym_bkeyboard_num0.png
index 678a790de..08df3f3dd 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num0.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num0.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num1.png b/java/res/drawable-hdpi/sym_bkeyboard_num1.png
index 4e68e35b3..36d8e5696 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num1.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num1.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num2.png b/java/res/drawable-hdpi/sym_bkeyboard_num2.png
index 546663fda..c67fe2ea4 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num2.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num2.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num3.png b/java/res/drawable-hdpi/sym_bkeyboard_num3.png
index 57f9a8d8e..cf80b2745 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num3.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num3.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num4.png b/java/res/drawable-hdpi/sym_bkeyboard_num4.png
index de504388f..bfbb55a8f 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num4.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num4.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num5.png b/java/res/drawable-hdpi/sym_bkeyboard_num5.png
index 1d2e1ef89..9f121ec12 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num5.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num5.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num6.png b/java/res/drawable-hdpi/sym_bkeyboard_num6.png
index 39788b727..256186f3a 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num6.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num6.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num7.png b/java/res/drawable-hdpi/sym_bkeyboard_num7.png
index fff6f27bf..7c8ce205e 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num7.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num7.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num8.png b/java/res/drawable-hdpi/sym_bkeyboard_num8.png
index 8cc1a955e..4cfe7b11c 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num8.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num8.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num9.png b/java/res/drawable-hdpi/sym_bkeyboard_num9.png
index 021742509..d19c15cc8 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_num9.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_num9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numalt.png b/java/res/drawable-hdpi/sym_bkeyboard_numalt.png
index 200714f66..762fd8cd7 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_numalt.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_numalt.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numpound.png b/java/res/drawable-hdpi/sym_bkeyboard_numpound.png
index 0a46122b2..2bd800d68 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_numpound.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_numpound.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numstar.png b/java/res/drawable-hdpi/sym_bkeyboard_numstar.png
index ca22bd535..b574f83f3 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_numstar.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_numstar.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_return.png b/java/res/drawable-hdpi/sym_bkeyboard_return.png
index 426e1599e..2f9631a20 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_return.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_return.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_search.png b/java/res/drawable-hdpi/sym_bkeyboard_search.png
index 1b6f884fa..7a5a0aab8 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_search.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_search.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_settings.png b/java/res/drawable-hdpi/sym_bkeyboard_settings.png
index 08ba18f28..8a8caa895 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_settings.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_settings.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_shift.png b/java/res/drawable-hdpi/sym_bkeyboard_shift.png
index 5a22dd309..1e3d5ec14 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_shift.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_shift.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png b/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png
index 566449126..e8a4d6423 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_space.png b/java/res/drawable-hdpi/sym_bkeyboard_space.png
index cd0ebe2f4..9937a6288 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_space.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_space.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_tab.png b/java/res/drawable-hdpi/sym_bkeyboard_tab.png
index 3466e1271..8dee747d2 100644
--- a/java/res/drawable-hdpi/sym_bkeyboard_tab.png
+++ b/java/res/drawable-hdpi/sym_bkeyboard_tab.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_123_mic.png b/java/res/drawable-hdpi/sym_keyboard_123_mic.png
index 62669803d..6f8292912 100644
--- a/java/res/drawable-hdpi/sym_keyboard_123_mic.png
+++ b/java/res/drawable-hdpi/sym_keyboard_123_mic.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_delete.png b/java/res/drawable-hdpi/sym_keyboard_delete.png
index 459ebcff8..8db099a7a 100644
--- a/java/res/drawable-hdpi/sym_keyboard_delete.png
+++ b/java/res/drawable-hdpi/sym_keyboard_delete.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_delete_holo.png b/java/res/drawable-hdpi/sym_keyboard_delete_holo.png
new file mode 100644
index 000000000..ff2a4acbb
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_delete_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_done.png b/java/res/drawable-hdpi/sym_keyboard_done.png
index 471c5021b..6ba51d58c 100644
--- a/java/res/drawable-hdpi/sym_keyboard_done.png
+++ b/java/res/drawable-hdpi/sym_keyboard_done.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png b/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png
index eef789680..4867298fa 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png b/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png
index 8322e8e1d..7c12f79a1 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_done.png b/java/res/drawable-hdpi/sym_keyboard_feedback_done.png
index 7015e266a..e79bbb382 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_done.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_done.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png
index 889477cfb..4f4923b85 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png
index b0f6d7feb..ed2ebe66c 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png b/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png
index f82c33ae3..f228910c3 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png b/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png
index 819236c8e..bb69300d1 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_return.png b/java/res/drawable-hdpi/sym_keyboard_feedback_return.png
index f038d3abe..99fa13cae 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_return.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_return.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_search.png b/java/res/drawable-hdpi/sym_keyboard_feedback_search.png
index 337f9e4fe..c006866d2 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_search.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_search.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png b/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png
index 8a02be07e..5c685f9c3 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png b/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png
index abf15f8f9..5b91afb82 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png b/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png
index 1fd822ea6..77e6a5fe9 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_space.png b/java/res/drawable-hdpi/sym_keyboard_feedback_space.png
index 70debca9b..2d1b4a4b4 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_space.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_space.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png b/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png
index d2efb1619..82280c608 100644
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png
+++ b/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png b/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png
index dcc4bd59b..34b8e931a 100644
--- a/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png
+++ b/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png b/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png
index ecf61a98e..b6ea3362b 100644
--- a/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png
+++ b/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_mic.png b/java/res/drawable-hdpi/sym_keyboard_mic.png
index c8dca62a0..7207f8a92 100644
--- a/java/res/drawable-hdpi/sym_keyboard_mic.png
+++ b/java/res/drawable-hdpi/sym_keyboard_mic.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_mic_disabled.png b/java/res/drawable-hdpi/sym_keyboard_mic_disabled.png
new file mode 100644
index 000000000..c8dca62a0
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_mic_disabled.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num0.png b/java/res/drawable-hdpi/sym_keyboard_num0.png
index 10ac70b9d..169efe21e 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num0.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num0.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num0_holo.png b/java/res/drawable-hdpi/sym_keyboard_num0_holo.png
new file mode 100644
index 000000000..ec8b5a8d2
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num0_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num1.png b/java/res/drawable-hdpi/sym_keyboard_num1.png
index 0fc03efa5..5b868489f 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num1.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num1.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num1_holo.png b/java/res/drawable-hdpi/sym_keyboard_num1_holo.png
new file mode 100644
index 000000000..60c8ab8a8
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num1_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num2.png b/java/res/drawable-hdpi/sym_keyboard_num2.png
index 283560b35..ddbe2199c 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num2.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num2.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num2_holo.png b/java/res/drawable-hdpi/sym_keyboard_num2_holo.png
new file mode 100644
index 000000000..578e37d6e
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num2_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num3.png b/java/res/drawable-hdpi/sym_keyboard_num3.png
index 9a3b3294b..1de90f3b1 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num3.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num3.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num3_holo.png b/java/res/drawable-hdpi/sym_keyboard_num3_holo.png
new file mode 100644
index 000000000..fb6250699
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num3_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num4.png b/java/res/drawable-hdpi/sym_keyboard_num4.png
index f13ff1ae9..c67ba5206 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num4.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num4.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num4_holo.png b/java/res/drawable-hdpi/sym_keyboard_num4_holo.png
new file mode 100644
index 000000000..c0e54a523
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num4_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num5.png b/java/res/drawable-hdpi/sym_keyboard_num5.png
index c251329fa..8410f2537 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num5.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num5.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num5_holo.png b/java/res/drawable-hdpi/sym_keyboard_num5_holo.png
new file mode 100644
index 000000000..b581a4657
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num5_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num6.png b/java/res/drawable-hdpi/sym_keyboard_num6.png
index 4acba4c91..22fa29d3f 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num6.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num6.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num6_holo.png b/java/res/drawable-hdpi/sym_keyboard_num6_holo.png
new file mode 100644
index 000000000..0791802ba
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num6_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num7.png b/java/res/drawable-hdpi/sym_keyboard_num7.png
index 14931c18c..a3798ea34 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num7.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num7.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num7_holo.png b/java/res/drawable-hdpi/sym_keyboard_num7_holo.png
new file mode 100644
index 000000000..7b3d3a825
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num7_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num8.png b/java/res/drawable-hdpi/sym_keyboard_num8.png
index d4973fdc9..7e963ad6b 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num8.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num8.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num8_holo.png b/java/res/drawable-hdpi/sym_keyboard_num8_holo.png
new file mode 100644
index 000000000..e076aedbe
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num8_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num9.png b/java/res/drawable-hdpi/sym_keyboard_num9.png
index 49cec66f4..1160d8545 100644
--- a/java/res/drawable-hdpi/sym_keyboard_num9.png
+++ b/java/res/drawable-hdpi/sym_keyboard_num9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_num9_holo.png b/java/res/drawable-hdpi/sym_keyboard_num9_holo.png
new file mode 100644
index 000000000..4189cda79
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_num9_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_numalt.png b/java/res/drawable-hdpi/sym_keyboard_numalt.png
index 3cc5311cd..f3a73deb0 100644
--- a/java/res/drawable-hdpi/sym_keyboard_numalt.png
+++ b/java/res/drawable-hdpi/sym_keyboard_numalt.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_numbpound_holo.png b/java/res/drawable-hdpi/sym_keyboard_numbpound_holo.png
new file mode 100644
index 000000000..73f8be054
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_numbpound_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_numbstar_holo.png b/java/res/drawable-hdpi/sym_keyboard_numbstar_holo.png
new file mode 100644
index 000000000..fcb891b93
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_numbstar_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_numpound.png b/java/res/drawable-hdpi/sym_keyboard_numpound.png
index d09133929..471f4fda3 100644
--- a/java/res/drawable-hdpi/sym_keyboard_numpound.png
+++ b/java/res/drawable-hdpi/sym_keyboard_numpound.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_numstar.png b/java/res/drawable-hdpi/sym_keyboard_numstar.png
index e838e169f..017c0f461 100644
--- a/java/res/drawable-hdpi/sym_keyboard_numstar.png
+++ b/java/res/drawable-hdpi/sym_keyboard_numstar.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_return.png b/java/res/drawable-hdpi/sym_keyboard_return.png
index 9d97e1efd..984db426e 100644
--- a/java/res/drawable-hdpi/sym_keyboard_return.png
+++ b/java/res/drawable-hdpi/sym_keyboard_return.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_return_holo.png b/java/res/drawable-hdpi/sym_keyboard_return_holo.png
new file mode 100644
index 000000000..ca3c02dbe
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_return_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_search.png b/java/res/drawable-hdpi/sym_keyboard_search.png
index 1aa22d7e2..179e725f6 100644
--- a/java/res/drawable-hdpi/sym_keyboard_search.png
+++ b/java/res/drawable-hdpi/sym_keyboard_search.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_settings.png b/java/res/drawable-hdpi/sym_keyboard_settings.png
index 35d1ed6e6..164117812 100644
--- a/java/res/drawable-hdpi/sym_keyboard_settings.png
+++ b/java/res/drawable-hdpi/sym_keyboard_settings.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_settings_holo.png b/java/res/drawable-hdpi/sym_keyboard_settings_holo.png
new file mode 100644
index 000000000..b3af0c638
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_settings_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_shift.png b/java/res/drawable-hdpi/sym_keyboard_shift.png
index bf217d147..2b3bd668d 100644
--- a/java/res/drawable-hdpi/sym_keyboard_shift.png
+++ b/java/res/drawable-hdpi/sym_keyboard_shift.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_holo.png b/java/res/drawable-hdpi/sym_keyboard_shift_holo.png
new file mode 100644
index 000000000..375c1b4ca
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_shift_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_locked.png b/java/res/drawable-hdpi/sym_keyboard_shift_locked.png
index d11b39712..8a34a98a3 100644
--- a/java/res/drawable-hdpi/sym_keyboard_shift_locked.png
+++ b/java/res/drawable-hdpi/sym_keyboard_shift_locked.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png
new file mode 100644
index 000000000..57362eaf4
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_smiley_holo.png b/java/res/drawable-hdpi/sym_keyboard_smiley_holo.png
new file mode 100644
index 000000000..a3f5e840d
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_smiley_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_space.png b/java/res/drawable-hdpi/sym_keyboard_space.png
index fcd20de7d..dacc97d0a 100644
--- a/java/res/drawable-hdpi/sym_keyboard_space.png
+++ b/java/res/drawable-hdpi/sym_keyboard_space.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_space_holo.png b/java/res/drawable-hdpi/sym_keyboard_space_holo.png
new file mode 100644
index 000000000..a8e5f7d5e
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_space_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_space_led.9.png b/java/res/drawable-hdpi/sym_keyboard_space_led.9.png
index 2c6f4a925..c76f64b94 100644
--- a/java/res/drawable-hdpi/sym_keyboard_space_led.9.png
+++ b/java/res/drawable-hdpi/sym_keyboard_space_led.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_tab.png b/java/res/drawable-hdpi/sym_keyboard_tab.png
index 51d17d989..efd740b5b 100644
--- a/java/res/drawable-hdpi/sym_keyboard_tab.png
+++ b/java/res/drawable-hdpi/sym_keyboard_tab.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_holo.png b/java/res/drawable-hdpi/sym_keyboard_voice_holo.png
new file mode 100644
index 000000000..5ea2edc53
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_voice_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-hdpi/sym_keyboard_voice_off_holo.png
new file mode 100644
index 000000000..8a445eb56
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_voice_off_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/top_suggest_line_holo.9.png b/java/res/drawable-hdpi/top_suggest_line_holo.9.png
new file mode 100644
index 000000000..dcce3015f
--- /dev/null
+++ b/java/res/drawable-hdpi/top_suggest_line_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/voice_ime_background.9.png b/java/res/drawable-hdpi/voice_ime_background.9.png
index 42868522f..a604f497c 100644
--- a/java/res/drawable-hdpi/voice_ime_background.9.png
+++ b/java/res/drawable-hdpi/voice_ime_background.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/voice_swipe_hint.png b/java/res/drawable-hdpi/voice_swipe_hint.png
index 130f83a9c..976fd56d6 100644
--- a/java/res/drawable-hdpi/voice_swipe_hint.png
+++ b/java/res/drawable-hdpi/voice_swipe_hint.png
Binary files differ
diff --git a/java/res/drawable-hdpi/working.png b/java/res/drawable-hdpi/working.png
index 5ea702307..c43439e93 100755..100644
--- a/java/res/drawable-hdpi/working.png
+++ b/java/res/drawable-hdpi/working.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png
new file mode 100755
index 000000000..603bf0e15
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png
new file mode 100755
index 000000000..6ddd516e7
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png
new file mode 100644
index 000000000..67a204f85
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png
new file mode 100755
index 000000000..65fdeb353
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png
new file mode 100644
index 000000000..63cbe60a3
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png
new file mode 100644
index 000000000..0dd33b429
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png
new file mode 100755
index 000000000..7ec915fe8
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png
new file mode 100755
index 000000000..439271723
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png
new file mode 100755
index 000000000..c2cc32044
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/hint_popup_holo.9.png b/java/res/drawable-land-hdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..2b93014e1
--- /dev/null
+++ b/java/res/drawable-land-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_at_holo.9.png b/java/res/drawable-land-hdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..874802fcb
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_at_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..d90bc31ab
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_colon_holo.9.png b/java/res/drawable-land-hdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..ddee76ad2
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..cb7e62ece
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_comma_holo.9.png b/java/res/drawable-land-hdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..9ab5dadac
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_dash_holo.9.png b/java/res/drawable-land-hdpi/key_hint_dash_holo.9.png
new file mode 100644
index 000000000..c045b8c54
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_dash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-land-hdpi/key_hint_doublecross_holo.9.png
new file mode 100644
index 000000000..6975ab71f
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_doublecross_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_equal_holo.9.png b/java/res/drawable-land-hdpi/key_hint_equal_holo.9.png
new file mode 100644
index 000000000..a619fb29f
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_equal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-land-hdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..570a1b87d
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..e93e49187
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_larger_holo.9.png b/java/res/drawable-land-hdpi/key_hint_larger_holo.9.png
new file mode 100644
index 000000000..f8d960f17
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_larger_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-land-hdpi/key_hint_parenclose_holo.9.png
new file mode 100644
index 000000000..9d8b05761
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_parenclose_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-land-hdpi/key_hint_parenopen_holo.9.png
new file mode 100644
index 000000000..8e2d8f2ad
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_parenopen_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_period_holo.9.png b/java/res/drawable-land-hdpi/key_hint_period_holo.9.png
new file mode 100644
index 000000000..bf8c6d722
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_period_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_plus_holo.9.png b/java/res/drawable-land-hdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..3dd85065a
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 000000000..b0d75f433
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_question_holo.9.png b/java/res/drawable-land-hdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..1a0db31ec
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_question_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..44dfdc4ea
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_quote_holo.9.png b/java/res/drawable-land-hdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..bfb612f59
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..e73b9e0c6
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-land-hdpi/key_hint_semicolon_holo.9.png
new file mode 100644
index 000000000..f35275857
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_semicolon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-land-hdpi/key_hint_simplequote_holo.9.png
new file mode 100644
index 000000000..e69a9696e
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_simplequote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_slash_holo.9.png b/java/res/drawable-land-hdpi/key_hint_slash_holo.9.png
new file mode 100644
index 000000000..592ea4434
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_slash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_slash_large_holo.9.png
new file mode 100644
index 000000000..b18be7bb5
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_slash_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_smaller_holo.9.png b/java/res/drawable-land-hdpi/key_hint_smaller_holo.9.png
new file mode 100644
index 000000000..145320dab
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_smaller_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_star_holo.9.png b/java/res/drawable-land-hdpi/key_hint_star_holo.9.png
new file mode 100644
index 000000000..9bde78a21
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_star_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_underline_holo.9.png b/java/res/drawable-land-hdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..b2ab17d41
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 000000000..dad34fc72
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-land-mdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..c409cea00
--- /dev/null
+++ b/java/res/drawable-land-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_at_holo.9.png b/java/res/drawable-land-mdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..d1ea313c0
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..786bbc5de
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..6470ed391
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..bdf4ed574
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..f9391623b
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png b/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png
new file mode 100644
index 000000000..1cb0bdfaa
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png
new file mode 100644
index 000000000..7e7ceb3fc
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png b/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png
new file mode 100644
index 000000000..8e570595c
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..a14623dc0
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..ce52d3a02
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png b/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png
new file mode 100644
index 000000000..37c05275e
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png
new file mode 100644
index 000000000..97e1f1449
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png
new file mode 100644
index 000000000..36add5d51
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_period_holo.9.png b/java/res/drawable-land-mdpi/key_hint_period_holo.9.png
new file mode 100644
index 000000000..4a70f07dc
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_period_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..a80c03169
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 000000000..e8daaf085
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_question_holo.9.png b/java/res/drawable-land-mdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..2b71d744f
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..041336832
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..486e5e19d
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..49770314f
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png
new file mode 100644
index 000000000..63a3875b5
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png
new file mode 100644
index 000000000..3c217b058
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png b/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png
new file mode 100644
index 000000000..98545f0ac
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png
new file mode 100644
index 000000000..a3a02973c
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png b/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png
new file mode 100644
index 000000000..5af183644
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_star_holo.9.png b/java/res/drawable-land-mdpi/key_hint_star_holo.9.png
new file mode 100644
index 000000000..18304d738
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_star_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..06f3efb7e
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 000000000..50f99a191
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_candidate_normal.9.png b/java/res/drawable-mdpi/btn_candidate_normal.9.png
new file mode 100644
index 000000000..fa6c0feff
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_candidate_normal.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/list_selector_background_pressed.9.png b/java/res/drawable-mdpi/btn_candidate_pressed.9.png
index 02b4e9a53..02b4e9a53 100644
--- a/java/res/drawable-mdpi/list_selector_background_pressed.9.png
+++ b/java/res/drawable-mdpi/btn_candidate_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 000000000..1534d99d1
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
new file mode 100644
index 000000000..936513a31
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
new file mode 100644
index 000000000..b071251a7
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 000000000..9fed21edf
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
new file mode 100644
index 000000000..3fce55938
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
new file mode 100644
index 000000000..3f82b67dd
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_normal_holo.9.png
new file mode 100644
index 000000000..eded1736b
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_light_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png
index 02d0fcf93..0e828a6cf 100644
--- a/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png
+++ b/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 000000000..e6a1dcecc
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 000000000..d2f5f3bf2
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/cancel_holo.9.png b/java/res/drawable-mdpi/cancel_holo.9.png
new file mode 100644
index 000000000..74f967eb9
--- /dev/null
+++ b/java/res/drawable-mdpi/cancel_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/hint_popup_holo.9.png b/java/res/drawable-mdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..01d1139d8
--- /dev/null
+++ b/java/res/drawable-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/ic_subtype_keyboard.png b/java/res/drawable-mdpi/ic_subtype_keyboard.png
index 0d7ebd4e5..d28efc106 100644
--- a/java/res/drawable-mdpi/ic_subtype_keyboard.png
+++ b/java/res/drawable-mdpi/ic_subtype_keyboard.png
Binary files differ
diff --git a/java/res/drawable-mdpi/ic_subtype_mic.png b/java/res/drawable-mdpi/ic_subtype_mic.png
index 247d5b3a9..0b6aca802 100644
--- a/java/res/drawable-mdpi/ic_subtype_mic.png
+++ b/java/res/drawable-mdpi/ic_subtype_mic.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_at_holo.9.png b/java/res/drawable-mdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..e596144f9
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-mdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..63d071405
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..14c46990d
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..91e788323
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-mdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..82e4a93b7
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_dash_holo.9.png b/java/res/drawable-mdpi/key_hint_dash_holo.9.png
new file mode 100644
index 000000000..2ee22ba79
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_dash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png
new file mode 100644
index 000000000..0da933239
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_equal_holo.9.png b/java/res/drawable-mdpi/key_hint_equal_holo.9.png
new file mode 100644
index 000000000..f5a9ba2f4
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_equal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..b57351b57
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..a8a17eb44
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_larger_holo.9.png b/java/res/drawable-mdpi/key_hint_larger_holo.9.png
new file mode 100644
index 000000000..50652bb13
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_larger_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png
new file mode 100644
index 000000000..52ee86a0f
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png
new file mode 100644
index 000000000..b0ed388ad
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_period_holo.9.png b/java/res/drawable-mdpi/key_hint_period_holo.9.png
new file mode 100644
index 000000000..8d798a57f
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_period_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..a80c03169
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 000000000..e8daaf085
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_question_holo.9.png b/java/res/drawable-mdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..9491d878f
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-mdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..c9902ffa8
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-mdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..a036421d8
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..5381b1337
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png
new file mode 100644
index 000000000..7f9e8c90e
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png
new file mode 100644
index 000000000..5e1a45c0e
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_slash_holo.9.png b/java/res/drawable-mdpi/key_hint_slash_holo.9.png
new file mode 100644
index 000000000..645586a30
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_slash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png
new file mode 100644
index 000000000..75c3bb1a6
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_smaller_holo.9.png b/java/res/drawable-mdpi/key_hint_smaller_holo.9.png
new file mode 100644
index 000000000..2a0587cbd
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_smaller_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_star_holo.9.png b/java/res/drawable-mdpi/key_hint_star_holo.9.png
new file mode 100644
index 000000000..9f33b9830
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_star_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..b137b0021
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 000000000..9845e3bd6
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_background_holo.9.png b/java/res/drawable-mdpi/keyboard_background_holo.9.png
new file mode 100644
index 000000000..a93966c92
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_at.9.png b/java/res/drawable-mdpi/keyboard_hint_at.9.png
new file mode 100644
index 000000000..69baedef4
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_at.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_colon.9.png b/java/res/drawable-mdpi/keyboard_hint_colon.9.png
new file mode 100644
index 000000000..9d0d7cbab
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_colon.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png
new file mode 100644
index 000000000..d24aa0f07
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png b/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png
new file mode 100644
index 000000000..f6cc7fe84
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_greater.9.png b/java/res/drawable-mdpi/keyboard_hint_greater.9.png
new file mode 100644
index 000000000..5210392bf
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_greater.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_plus.9.png b/java/res/drawable-mdpi/keyboard_hint_plus.9.png
new file mode 100644
index 000000000..d1d85ac87
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_plus.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_question.9.png b/java/res/drawable-mdpi/keyboard_hint_question.9.png
new file mode 100644
index 000000000..37f6e5f36
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_question.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_quote.9.png b/java/res/drawable-mdpi/keyboard_hint_quote.9.png
new file mode 100644
index 000000000..e7d2cb5e3
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_quote.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_smaller.9.png b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png
new file mode 100644
index 000000000..76553cf96
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_star.9.png b/java/res/drawable-mdpi/keyboard_hint_star.9.png
new file mode 100644
index 000000000..47978c46c
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_star.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..a7acb4a4d
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..e3f5be86d
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-mdpi/keyboard_popup_panel_background_holo.9.png
new file mode 100644
index 000000000..7be7ab7e2
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_popup_panel_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png
new file mode 100644
index 000000000..1f87a68e9
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/mic_slash_holo.png b/java/res/drawable-mdpi/mic_slash_holo.png
new file mode 100644
index 000000000..07181e6fa
--- /dev/null
+++ b/java/res/drawable-mdpi/mic_slash_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/ok_cancel_holo.9.png b/java/res/drawable-mdpi/ok_cancel_holo.9.png
new file mode 100644
index 000000000..035a4f6f0
--- /dev/null
+++ b/java/res/drawable-mdpi/ok_cancel_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level0_holo.png b/java/res/drawable-mdpi/speak_now_level0_holo.png
new file mode 100644
index 000000000..2090b95a5
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level0_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level1_holo.png b/java/res/drawable-mdpi/speak_now_level1_holo.png
new file mode 100644
index 000000000..8acf482aa
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level1_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level2_holo.png b/java/res/drawable-mdpi/speak_now_level2_holo.png
new file mode 100644
index 000000000..4b307d542
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level2_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level3_holo.png b/java/res/drawable-mdpi/speak_now_level3_holo.png
new file mode 100644
index 000000000..7c7cd666f
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level3_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level4_holo.png b/java/res/drawable-mdpi/speak_now_level4_holo.png
new file mode 100644
index 000000000..362c45337
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level4_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level5_holo.png b/java/res/drawable-mdpi/speak_now_level5_holo.png
new file mode 100644
index 000000000..1886befff
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level5_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level6_holo.png b/java/res/drawable-mdpi/speak_now_level6_holo.png
new file mode 100644
index 000000000..88e4131c8
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level6_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_bkeyboard_voice_off.png b/java/res/drawable-mdpi/sym_bkeyboard_voice_off.png
new file mode 100644
index 000000000..081a13096
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_bkeyboard_voice_off.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_delete_holo.png b/java/res/drawable-mdpi/sym_keyboard_delete_holo.png
new file mode 100644
index 000000000..155579169
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_delete_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_lock.png b/java/res/drawable-mdpi/sym_keyboard_mic_disabled.png
index 244179c2d..e926b3fa6 100644
--- a/java/res/drawable-mdpi/sym_keyboard_shift_lock.png
+++ b/java/res/drawable-mdpi/sym_keyboard_mic_disabled.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-mdpi/sym_keyboard_num0_holo.png
new file mode 100644
index 000000000..e1d395b45
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num0_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num1_holo.png b/java/res/drawable-mdpi/sym_keyboard_num1_holo.png
new file mode 100644
index 000000000..225436ac2
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num1_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num2_holo.png b/java/res/drawable-mdpi/sym_keyboard_num2_holo.png
new file mode 100644
index 000000000..e513fa4a0
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num2_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num3_holo.png b/java/res/drawable-mdpi/sym_keyboard_num3_holo.png
new file mode 100644
index 000000000..b91e005fc
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num3_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num4_holo.png b/java/res/drawable-mdpi/sym_keyboard_num4_holo.png
new file mode 100644
index 000000000..65f88245b
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num4_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num5_holo.png b/java/res/drawable-mdpi/sym_keyboard_num5_holo.png
new file mode 100644
index 000000000..b89ef07eb
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num5_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num6_holo.png b/java/res/drawable-mdpi/sym_keyboard_num6_holo.png
new file mode 100644
index 000000000..931275a9e
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num6_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num7_holo.png b/java/res/drawable-mdpi/sym_keyboard_num7_holo.png
new file mode 100644
index 000000000..9396c4c8f
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num7_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num8_holo.png b/java/res/drawable-mdpi/sym_keyboard_num8_holo.png
new file mode 100644
index 000000000..12e3eef45
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num8_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num9_holo.png b/java/res/drawable-mdpi/sym_keyboard_num9_holo.png
new file mode 100644
index 000000000..6911c2b4f
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_num9_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_numbpound_holo.png b/java/res/drawable-mdpi/sym_keyboard_numbpound_holo.png
new file mode 100644
index 000000000..e3a8b4900
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_numbpound_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_numbstar_holo.png b/java/res/drawable-mdpi/sym_keyboard_numbstar_holo.png
new file mode 100644
index 000000000..e80e9345f
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_numbstar_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_return_holo.png b/java/res/drawable-mdpi/sym_keyboard_return_holo.png
new file mode 100644
index 000000000..d519ccecf
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_return_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_settings_holo.png b/java/res/drawable-mdpi/sym_keyboard_settings_holo.png
new file mode 100644
index 000000000..8233623e3
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_settings_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_holo.png b/java/res/drawable-mdpi/sym_keyboard_shift_holo.png
new file mode 100644
index 000000000..91d6e32f9
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_shift_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.png
new file mode 100644
index 000000000..2bd053656
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_space_holo.png b/java/res/drawable-mdpi/sym_keyboard_space_holo.png
new file mode 100644
index 000000000..25e655d96
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_space_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_holo.png b/java/res/drawable-mdpi/sym_keyboard_voice_holo.png
new file mode 100644
index 000000000..c1116dc17
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_voice_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-mdpi/sym_keyboard_voice_off_holo.png
new file mode 100644
index 000000000..081a13096
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_voice_off_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/top_suggest_line_holo.9.png b/java/res/drawable-mdpi/top_suggest_line_holo.9.png
new file mode 100644
index 000000000..8fdffd317
--- /dev/null
+++ b/java/res/drawable-mdpi/top_suggest_line_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/btn_center_default.9.png b/java/res/drawable-xlarge/btn_center_default.9.png
new file mode 100755
index 000000000..d5ec36ba4
--- /dev/null
+++ b/java/res/drawable-xlarge/btn_center_default.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/btn_center_pressed.9.png b/java/res/drawable-xlarge/btn_center_pressed.9.png
new file mode 100755
index 000000000..593a679d0
--- /dev/null
+++ b/java/res/drawable-xlarge/btn_center_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/btn_center_selected.9.png b/java/res/drawable-xlarge/btn_center_selected.9.png
new file mode 100644
index 000000000..f1914a886
--- /dev/null
+++ b/java/res/drawable-xlarge/btn_center_selected.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/caution.png b/java/res/drawable-xlarge/caution.png
new file mode 100755
index 000000000..eaef53425
--- /dev/null
+++ b/java/res/drawable-xlarge/caution.png
Binary files differ
diff --git a/java/res/drawable-xlarge/mic_base.png b/java/res/drawable-xlarge/mic_base.png
new file mode 100644
index 000000000..53e29ff4b
--- /dev/null
+++ b/java/res/drawable-xlarge/mic_base.png
Binary files differ
diff --git a/java/res/drawable-xlarge/mic_full.png b/java/res/drawable-xlarge/mic_full.png
new file mode 100644
index 000000000..e3e3dfac3
--- /dev/null
+++ b/java/res/drawable-xlarge/mic_full.png
Binary files differ
diff --git a/java/res/drawable-xlarge/mic_slash.png b/java/res/drawable-xlarge/mic_slash.png
new file mode 100644
index 000000000..1dd05c5b4
--- /dev/null
+++ b/java/res/drawable-xlarge/mic_slash.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_dialog_blue.9.png b/java/res/drawable-xlarge/vs_dialog_blue.9.png
new file mode 100644
index 000000000..cf27e8f43
--- /dev/null
+++ b/java/res/drawable-xlarge/vs_dialog_blue.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_dialog_red.9.png b/java/res/drawable-xlarge/vs_dialog_red.9.png
new file mode 100644
index 000000000..6c08d5a30
--- /dev/null
+++ b/java/res/drawable-xlarge/vs_dialog_red.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_dialog_yellow.9.png b/java/res/drawable-xlarge/vs_dialog_yellow.9.png
new file mode 100644
index 000000000..2fb06c263
--- /dev/null
+++ b/java/res/drawable-xlarge/vs_dialog_yellow.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_popup_mic_edge.png b/java/res/drawable-xlarge/vs_popup_mic_edge.png
new file mode 100644
index 000000000..4ff6337a2
--- /dev/null
+++ b/java/res/drawable-xlarge/vs_popup_mic_edge.png
Binary files differ
diff --git a/java/res/drawable/background_voice.xml b/java/res/drawable/background_voice.xml
new file mode 100644
index 000000000..3b6137df3
--- /dev/null
+++ b/java/res/drawable/background_voice.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <gradient
+ android:startColor="#ff000000"
+ android:endColor="#ff000e29"
+ android:angle="90" />
+</shape> \ No newline at end of file
diff --git a/java/res/xml/popup_comma.xml b/java/res/drawable/btn_candidate.xml
index 7666f4b62..b0c1c3038 100644
--- a/java/res/xml/popup_comma.xml
+++ b/java/res/drawable/btn_candidate.xml
@@ -18,22 +18,12 @@
*/
-->
-<Keyboard
+<selector
xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
>
- <Row
- android:rowEdgeFlags="top|bottom"
- >
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel=","
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
+ <item
+ android:state_pressed="true"
+ android:drawable="@drawable/btn_candidate_pressed" />
+ <item
+ android:drawable="@drawable/btn_candidate_normal" />
+</selector>
diff --git a/java/res/xml/dictionary.xml b/java/res/drawable/btn_candidate_holo.xml
index 7b770a8b4..66cd2460b 100644
--- a/java/res/xml/dictionary.xml
+++ b/java/res/drawable/btn_candidate_holo.xml
@@ -18,6 +18,10 @@
*/
-->
-<dictionary>
- <part name = "main" />
-</dictionary> \ No newline at end of file
+<selector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+>
+ <item
+ android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_popup_selected_holo" />
+</selector>
diff --git a/java/res/drawable/btn_center.xml b/java/res/drawable/btn_center.xml
new file mode 100644
index 000000000..9998b56e2
--- /dev/null
+++ b/java/res/drawable/btn_center.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<selector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:exitFadeDuration="@android:integer/config_mediumAnimTime">
+ <item
+ android:state_window_focused="false"
+ android:state_enabled="true"
+ android:drawable="@drawable/btn_center_default" />
+ <item
+ android:state_pressed="true"
+ android:drawable="@drawable/btn_center_pressed" />
+ <item
+ android:state_focused="true"
+ android:state_enabled="true"
+ android:drawable="@drawable/btn_center_selected" />
+ <item
+ android:state_enabled="true"
+ android:drawable="@drawable/btn_center_default" />
+ <item
+ android:drawable="@drawable/btn_center_default" />
+</selector> \ No newline at end of file
diff --git a/java/res/drawable/btn_center_default.9.png b/java/res/drawable/btn_center_default.9.png
new file mode 100755
index 000000000..d5ec36ba4
--- /dev/null
+++ b/java/res/drawable/btn_center_default.9.png
Binary files differ
diff --git a/java/res/drawable/btn_center_pressed.9.png b/java/res/drawable/btn_center_pressed.9.png
new file mode 100755
index 000000000..593a679d0
--- /dev/null
+++ b/java/res/drawable/btn_center_pressed.9.png
Binary files differ
diff --git a/java/res/drawable/btn_center_selected.9.png b/java/res/drawable/btn_center_selected.9.png
new file mode 100644
index 000000000..f1914a886
--- /dev/null
+++ b/java/res/drawable/btn_center_selected.9.png
Binary files differ
diff --git a/java/res/drawable/btn_keyboard_key_honeycomb.xml b/java/res/drawable/btn_keyboard_key_honeycomb.xml
new file mode 100644
index 000000000..3dab8430f
--- /dev/null
+++ b/java/res/drawable/btn_keyboard_key_honeycomb.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- TODO: Remove "gingerbread" from file name and rename this to "btn_keyboard_key.xml". -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Functional keys. -->
+
+ <item android:state_single="true" android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_pressed_holo" />
+ <item android:state_single="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_normal_holo" />
+
+ <!-- Toggle keys. Use checkable/checked state. -->
+
+ <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_pressed_on_holo" />
+ <item android:state_checkable="true" android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_pressed_off_holo" />
+ <item android:state_checkable="true" android:state_checked="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_normal_on_holo" />
+ <item android:state_checkable="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_normal_off_holo" />
+
+ <!-- Normal keys -->
+
+ <item android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_light_pressed_holo" />
+ <item android:drawable="@drawable/btn_keyboard_key_light_normal_holo" />
+</selector>
diff --git a/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml b/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml
new file mode 100644
index 000000000..6c2713650
--- /dev/null
+++ b/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_popup_selected_holo" />
+</selector>
diff --git a/java/res/drawable/caution.png b/java/res/drawable/caution.png
new file mode 100755
index 000000000..eaef53425
--- /dev/null
+++ b/java/res/drawable/caution.png
Binary files differ
diff --git a/java/res/drawable/keyboard_key_feedback_honeycomb.xml b/java/res/drawable/keyboard_key_feedback_honeycomb.xml
new file mode 100644
index 000000000..dd9b53e46
--- /dev/null
+++ b/java/res/drawable/keyboard_key_feedback_honeycomb.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_long_pressable="true"
+ android:drawable="@drawable/keyboard_key_feedback_more_background" />
+ <item android:drawable="@drawable/keyboard_key_feedback_background_holo" />
+</selector>
diff --git a/java/res/drawable/mic_base.png b/java/res/drawable/mic_base.png
new file mode 100644
index 000000000..53e29ff4b
--- /dev/null
+++ b/java/res/drawable/mic_base.png
Binary files differ
diff --git a/java/res/drawable/mic_full.png b/java/res/drawable/mic_full.png
new file mode 100644
index 000000000..e3e3dfac3
--- /dev/null
+++ b/java/res/drawable/mic_full.png
Binary files differ
diff --git a/java/res/drawable/mic_slash.png b/java/res/drawable/mic_slash.png
new file mode 100644
index 000000000..1dd05c5b4
--- /dev/null
+++ b/java/res/drawable/mic_slash.png
Binary files differ
diff --git a/java/res/drawable/vs_dialog_blue.9.png b/java/res/drawable/vs_dialog_blue.9.png
new file mode 100644
index 000000000..cf27e8f43
--- /dev/null
+++ b/java/res/drawable/vs_dialog_blue.9.png
Binary files differ
diff --git a/java/res/drawable/vs_dialog_red.9.png b/java/res/drawable/vs_dialog_red.9.png
new file mode 100644
index 000000000..6c08d5a30
--- /dev/null
+++ b/java/res/drawable/vs_dialog_red.9.png
Binary files differ
diff --git a/java/res/drawable/vs_dialog_yellow.9.png b/java/res/drawable/vs_dialog_yellow.9.png
new file mode 100644
index 000000000..2fb06c263
--- /dev/null
+++ b/java/res/drawable/vs_dialog_yellow.9.png
Binary files differ
diff --git a/java/res/drawable/vs_popup_mic_edge.png b/java/res/drawable/vs_popup_mic_edge.png
new file mode 100644
index 000000000..4ff6337a2
--- /dev/null
+++ b/java/res/drawable/vs_popup_mic_edge.png
Binary files differ
diff --git a/java/res/layout-xlarge/candidate.xml b/java/res/layout-xlarge/candidate.xml
new file mode 100644
index 000000000..74532a1e2
--- /dev/null
+++ b/java/res/layout-xlarge/candidate.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:orientation="horizontal"
+ android:paddingRight="@dimen/candidate_padding"
+>
+ <ImageView
+ android:id="@+id/candidate_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:visibility="gone"
+ android:focusable="false"
+ android:clickable="false"
+ android:src="@drawable/keyboard_suggest_strip_divider"
+ android:gravity="center_vertical|center_horizontal" />
+ <Button
+ android:id="@+id/candidate_word"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:minWidth="@dimen/candidate_min_width"
+ android:textSize="@dimen/candidate_text_size"
+ android:textColor="@color/candidate_normal"
+ android:background="@drawable/btn_candidate_holo"
+ android:focusable="true"
+ android:clickable="true"
+ android:gravity="center_vertical|center_horizontal"
+ android:paddingLeft="@dimen/candidate_padding" />
+ <TextView
+ android:id="@+id/candidate_debug_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:textSize="10dip"
+ android:textColor="#ff808080"
+ android:focusable="false"
+ android:clickable="false"
+ android:gravity="bottom"
+ android:paddingLeft="4dip" />
+</LinearLayout>
diff --git a/java/res/xml/popup_slash.xml b/java/res/layout-xlarge/candidate_preview.xml
index a38fde0e4..61d5f8e7b 100644
--- a/java/res/xml/popup_slash.xml
+++ b/java/res/layout-xlarge/candidate_preview.xml
@@ -18,22 +18,12 @@
*/
-->
-<Keyboard
+<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top|bottom"
- >
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="/"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:textColor="?android:attr/textColorPrimaryInverse"
+ android:minWidth="32dip"
+ android:gravity="center"
+ android:background="@drawable/keyboard_popup_panel_background_holo" />
diff --git a/java/res/layout-xlarge/candidates.xml b/java/res/layout-xlarge/candidates.xml
new file mode 100644
index 000000000..e2ddb84b1
--- /dev/null
+++ b/java/res/layout-xlarge/candidates.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:background="@drawable/keyboard_suggest_strip_holo"
+ android:paddingRight="@dimen/candidate_strip_padding"
+ android:paddingLeft="@dimen/candidate_strip_padding"
+>
+ <HorizontalScrollView
+ android:id="@+id/candidates_scroll_view"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length"
+ android:scrollbars="none"
+ >
+ <com.android.inputmethod.latin.CandidateView
+ android:id="@+id/candidates"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:background="@drawable/keyboard_suggest_strip_holo" />
+ </HorizontalScrollView>
+</LinearLayout>
diff --git a/java/res/layout-xlarge/keyboard_popup_honeycomb.xml b/java/res/layout-xlarge/keyboard_popup_honeycomb.xml
new file mode 100644
index 000000000..0b8229ca5
--- /dev/null
+++ b/java/res/layout-xlarge/keyboard_popup_honeycomb.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:background="@drawable/keyboard_popup_panel_background_holo"
+ android:paddingLeft="40dip"
+ android:paddingRight="40dip"
+ >
+ <com.android.inputmethod.keyboard.KeyboardView
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ android:id="@+id/KeyboardView"
+ android:layout_alignParentBottom="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/latinkeyboard_transparent"
+
+ latin:keyBackground="@drawable/btn_keyboard_key_honeycomb_popup"
+ latin:keyHysteresisDistance="0dip"
+ latin:verticalCorrection="@dimen/mini_keyboard_vertical_correction"
+ />
+</LinearLayout>
diff --git a/java/res/layout/candidate.xml b/java/res/layout/candidate.xml
new file mode 100644
index 000000000..f2c4126b3
--- /dev/null
+++ b/java/res/layout/candidate.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:orientation="horizontal"
+ android:paddingRight="@dimen/candidate_padding"
+>
+ <ImageView
+ android:id="@+id/candidate_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:visibility="gone"
+ android:focusable="false"
+ android:clickable="false"
+ android:src="@drawable/keyboard_suggest_strip_divider"
+ android:gravity="center_vertical|center_horizontal" />
+ <Button
+ android:id="@+id/candidate_word"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:minWidth="@dimen/candidate_min_width"
+ android:textSize="@dimen/candidate_text_size"
+ android:textColor="@color/candidate_normal"
+ android:background="@drawable/btn_candidate"
+ android:focusable="true"
+ android:clickable="true"
+ android:gravity="center_vertical|center_horizontal"
+ android:paddingLeft="@dimen/candidate_padding" />
+ <TextView
+ android:id="@+id/candidate_debug_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:textSize="10dip"
+ android:textColor="#ff808080"
+ android:focusable="false"
+ android:clickable="false"
+ android:gravity="bottom"
+ android:paddingLeft="4dip" />
+</LinearLayout>
diff --git a/java/res/layout/candidates.xml b/java/res/layout/candidates.xml
index b89d44290..1b8d04183 100644
--- a/java/res/layout/candidates.xml
+++ b/java/res/layout/candidates.xml
@@ -1,38 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-/*
+/*
**
-** Copyright 2008, The Android Open Source Project
+** Copyright 2010, The Android Open Source Project
**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
**
-** http://www.apache.org/licenses/LICENSE-2.0
+** http://www.apache.org/licenses/LICENSE-2.0
**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="@dimen/candidate_strip_height"
- android:background="@drawable/keyboard_suggest_strip"
- >
-
- <com.android.inputmethod.latin.CandidateView
- android:id="@+id/candidates"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:background="@drawable/keyboard_suggest_strip"
+ android:paddingRight="@dimen/candidate_strip_padding"
+ android:paddingLeft="@dimen/candidate_strip_padding"
+>
+ <HorizontalScrollView
+ android:id="@+id/candidates_scroll_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/candidate_strip_height"
- android:layout_weight="1"
android:fadingEdge="horizontal"
android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length"
- />
-
+ android:scrollbars="none"
+ >
+ <com.android.inputmethod.latin.CandidateView
+ android:id="@+id/candidates"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:background="@drawable/keyboard_suggest_strip" />
+ </HorizontalScrollView>
</LinearLayout>
diff --git a/java/res/layout/input_basic.xml b/java/res/layout/input_basic.xml
index 168eba691..7b85bae94 100644
--- a/java/res/layout/input_basic.xml
+++ b/java/res/layout/input_basic.xml
@@ -18,7 +18,7 @@
*/
-->
-<com.android.inputmethod.latin.LatinKeyboardView
+<com.android.inputmethod.keyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
android:id="@+id/LatinkeyboardBaseView"
diff --git a/java/res/layout/input_basic_highcontrast.xml b/java/res/layout/input_basic_highcontrast.xml
index 19ff1db11..d9200fd5e 100644
--- a/java/res/layout/input_basic_highcontrast.xml
+++ b/java/res/layout/input_basic_highcontrast.xml
@@ -18,7 +18,7 @@
*/
-->
-<com.android.inputmethod.latin.LatinKeyboardView
+<com.android.inputmethod.keyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
diff --git a/java/res/layout/input_gingerbread.xml b/java/res/layout/input_gingerbread.xml
index 73cf0a3fa..6233e6dc6 100644
--- a/java/res/layout/input_gingerbread.xml
+++ b/java/res/layout/input_gingerbread.xml
@@ -18,17 +18,17 @@
*/
-->
-<com.android.inputmethod.latin.LatinKeyboardView
+<com.android.inputmethod.keyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
android:id="@+id/LatinkeyboardBaseView"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:paddingTop="@dimen/keyboard_top_padding"
android:paddingBottom="@dimen/keyboard_bottom_padding"
android:background="@drawable/keyboard_dark_background"
- android:textStyle="bold"
latin:keyBackground="@drawable/btn_keyboard_key_gingerbread"
- latin:keyTextStyle="bold"
+ latin:keyLetterStyle="bold"
/>
diff --git a/java/res/layout/input_honeycomb.xml b/java/res/layout/input_honeycomb.xml
new file mode 100644
index 000000000..6ccc63c2b
--- /dev/null
+++ b/java/res/layout/input_honeycomb.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<com.android.inputmethod.keyboard.LatinKeyboardView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ android:id="@+id/LatinkeyboardBaseView"
+ android:layout_alignParentBottom="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/keyboard_top_padding"
+ android:paddingBottom="@dimen/keyboard_bottom_padding"
+ android:background="@drawable/keyboard_background_holo"
+
+ latin:keyBackground="@drawable/btn_keyboard_key_honeycomb"
+ latin:keyPreviewLayout="@layout/key_preview_honeycomb"
+ latin:popupLayout="@layout/keyboard_popup_honeycomb"
+ latin:keyTextColorDisabled="#FF63666D"
+ latin:keyLetterStyle="bold"
+ latin:shadowColor="#00000000"
+ latin:shadowRadius="0.0"
+ />
diff --git a/java/res/layout/input_stone_bold.xml b/java/res/layout/input_stone_bold.xml
index e3588bb22..6fdc93855 100644
--- a/java/res/layout/input_stone_bold.xml
+++ b/java/res/layout/input_stone_bold.xml
@@ -18,7 +18,7 @@
*/
-->
-<com.android.inputmethod.latin.LatinKeyboardView
+<com.android.inputmethod.keyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
android:id="@+id/LatinkeyboardBaseView"
@@ -26,12 +26,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/keyboard_background"
- android:textStyle="bold"
latin:keyBackground="@drawable/btn_keyboard_key_stone"
latin:keyTextColor="@color/latinkeyboard_key_color_black"
+ latin:keyTextColorDisabled="#FF808080"
latin:shadowColor="@color/latinkeyboard_key_color_white"
- latin:keyTextStyle="bold"
- latin:symbolColorScheme="black"
+ latin:keyLetterStyle="bold"
+ latin:colorScheme="black"
latin:popupLayout="@layout/input_stone_popup"
/>
diff --git a/java/res/layout/input_stone_normal.xml b/java/res/layout/input_stone_normal.xml
index fd7bf85fc..6ae9aed55 100644
--- a/java/res/layout/input_stone_normal.xml
+++ b/java/res/layout/input_stone_normal.xml
@@ -18,7 +18,7 @@
*/
-->
-<com.android.inputmethod.latin.LatinKeyboardView
+<com.android.inputmethod.keyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
android:id="@+id/LatinkeyboardBaseView"
@@ -29,7 +29,8 @@
latin:keyBackground="@drawable/btn_keyboard_key_stone"
latin:keyTextColor="@color/latinkeyboard_key_color_black"
+ latin:keyTextColorDisabled="#FF808080"
latin:shadowColor="@color/latinkeyboard_key_color_white"
- latin:symbolColorScheme="black"
+ latin:colorScheme="black"
latin:popupLayout="@layout/input_stone_popup"
/>
diff --git a/java/res/layout/input_stone_popup.xml b/java/res/layout/input_stone_popup.xml
index f159625f7..b4da04536 100644
--- a/java/res/layout/input_stone_popup.xml
+++ b/java/res/layout/input_stone_popup.xml
@@ -25,9 +25,9 @@
android:orientation="horizontal"
android:background="@drawable/keyboard_popup_panel_background"
>
- <com.android.inputmethod.latin.LatinKeyboardBaseView
+ <com.android.inputmethod.keyboard.KeyboardView
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
- android:id="@+id/LatinKeyboardBaseView"
+ android:id="@+id/KeyboardView"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/java/res/layout/key_preview_honeycomb.xml b/java/res/layout/key_preview_honeycomb.xml
new file mode 100644
index 000000000..a90fe5588
--- /dev/null
+++ b/java/res/layout/key_preview_honeycomb.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="80sp"
+ android:textSize="40sp"
+ android:textColor="@color/latinkeyboard_key_color_white"
+ android:minWidth="24dip"
+ android:gravity="center"
+ android:background="@drawable/keyboard_key_feedback_honeycomb"
+ />
diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml
index 9ecbcd4e9..ac8134bfb 100644
--- a/java/res/layout/keyboard_popup.xml
+++ b/java/res/layout/keyboard_popup.xml
@@ -26,9 +26,9 @@
android:paddingLeft="16dip"
android:paddingRight="16dip"
>
- <com.android.inputmethod.latin.LatinKeyboardBaseView
+ <com.android.inputmethod.keyboard.KeyboardView
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
- android:id="@+id/LatinKeyboardBaseView"
+ android:id="@+id/KeyboardView"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/java/res/layout/keyboard_popup_honeycomb.xml b/java/res/layout/keyboard_popup_honeycomb.xml
new file mode 100644
index 000000000..e5fcbd44c
--- /dev/null
+++ b/java/res/layout/keyboard_popup_honeycomb.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:background="@drawable/keyboard_popup_panel_background_holo"
+ android:paddingLeft="24dip"
+ android:paddingRight="24dip"
+ >
+ <com.android.inputmethod.keyboard.KeyboardView
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ android:id="@+id/KeyboardView"
+ android:layout_alignParentBottom="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/latinkeyboard_transparent"
+
+ latin:keyBackground="@drawable/btn_keyboard_key_honeycomb_popup"
+ latin:keyHysteresisDistance="0dip"
+ latin:verticalCorrection="@dimen/mini_keyboard_vertical_correction"
+ />
+</LinearLayout>
diff --git a/java/res/layout/recognition_status.xml b/java/res/layout/recognition_status.xml
index 49af77360..9474d6f58 100644
--- a/java/res/layout/recognition_status.xml
+++ b/java/res/layout/recognition_status.xml
@@ -16,83 +16,86 @@
** See the License for the specific language governing permissions and
** limitations under the License.
*/
--->
-
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:background="@android:color/black"
- android:paddingBottom="0dip"
- android:paddingLeft="0dip"
- android:paddingRight="0dip"
->
-
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/main_image"
- android:orientation="vertical"
- android:background="@drawable/voice_ime_background"
- android:scaleType="fitXY"
- android:layout_width="match_parent"
- android:layout_height="180dip"
- android:paddingBottom="2dip"
- android:paddingTop="2dip"
- >
-
- <TextView android:id="@+id/text"
- android:text="@string/voice_initializing"
+-->
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginTop="15dip"
- android:textSize="28sp"
- android:textColor="#ffffff"
- android:layout_gravity="center_horizontal"
- />
-
- <ImageView android:id="@+id/image"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginTop="20dip"
- android:layout_gravity="center_horizontal"
- android:src="@drawable/mic_slash"
- />
-
- <ProgressBar android:id="@+id/progress"
- android:layout_height="60dip"
- android:layout_width="60dip"
- android:layout_gravity="center"
- android:visibility="gone"
- android:indeterminate="true"
- android:indeterminateOnly="false"
- />
-
-
-
- </LinearLayout>
-
- <LinearLayout android:id="@+id/button"
- android:orientation="vertical"
- android:background="@drawable/ok_cancel"
- android:scaleType="fitXY"
android:layout_width="match_parent"
- android:layout_height="42dip"
- android:paddingLeft="1dip"
- android:paddingRight="1dip"
- >
-
- <TextView android:id="@+id/button_text"
- android:text="@string/cancel"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginTop="7dip"
- android:textSize="19sp"
- android:textColor="#ffffff"
- android:layout_gravity="center_horizontal"
- />
+ android:background="@drawable/background_voice">
+ <LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/popup_layout"
+ android:orientation="vertical"
+ android:layout_height="371dip"
+ android:layout_width="500dip"
+ android:layout_centerInParent="true"
+ android:background="@drawable/vs_dialog_red">
+ <TextView
+ android:id="@+id/text"
+ android:text="@string/voice_error"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:singleLine="true"
+ android:layout_marginTop="10dip"
+ android:textSize="28sp"
+ android:textColor="#ffffff"
+ android:layout_gravity="center"
+ android:visibility="invisible"/>
+ <RelativeLayout
+ android:layout_height="0dip"
+ android:layout_width="match_parent"
+ android:layout_weight="1.0">
+ <com.android.inputmethod.voice.SoundIndicator
+ android:id="@+id/sound_indicator"
+ android:src="@drawable/mic_full"
+ android:background="@drawable/mic_base"
+ android:adjustViewBounds="true"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_centerInParent="true"
+ android:visibility="gone"/>
+ <ImageView
+ android:id="@+id/image"
+ android:src="@drawable/mic_slash"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_centerInParent="true"
+ android:visibility="visible"/>
+ <ProgressBar
+ android:id="@+id/progress"
+ android:indeterminate="true"
+ android:indeterminateOnly="false"
+ android:layout_height="60dip"
+ android:layout_width="60dip"
+ android:layout_centerInParent="true"
+ android:visibility="gone"/>
+ </RelativeLayout>
+ <!--
+ The text is set by the code. We specify a random text (voice_error), so the
+ text view does not have a zero height. This is necessary to keep the slash
+ mic and the recording mic is the same position
+ -->
+ <TextView
+ android:id="@+id/language"
+ android:text="@string/voice_error"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:singleLine="true"
+ android:textSize="14sp"
+ android:layout_marginBottom="3dip"
+ android:layout_gravity="center"
+ android:textColor="#ffffff"
+ android:visibility="invisible"/>
+ <Button
+ android:id="@+id/button"
+ android:layout_width="match_parent"
+ android:layout_height="54dip"
+ android:singleLine="true"
+ android:focusable="true"
+ android:text="@string/cancel"
+ android:layout_gravity="center_horizontal"
+ android:background="@drawable/btn_center"
+ android:textColor="#ffffff"
+ android:textSize="19sp" />
</LinearLayout>
-
-</LinearLayout>
-
+</RelativeLayout>
diff --git a/java/res/raw/main.dict b/java/res/raw/main.dict
index a456cf3d3..a456cf3d3 100755..100644
--- a/java/res/raw/main.dict
+++ b/java/res/raw/main.dict
Binary files differ
diff --git a/java/res/raw/type3.ogg b/java/res/raw/type3.ogg
index 20e670807..20e670807 100755..100644
--- a/java/res/raw/type3.ogg
+++ b/java/res/raw/type3.ogg
Binary files differ
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index 89b5ef365..9d9866809 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"اهتزاز عند الضغط على مفتاح"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"صوت عند الضغط على مفتاح"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"انبثاق عند الضغط على المفاتيح"</string>
- <string name="hit_correction" msgid="4855351009261318389">"تصحيح أخطاء الكتابة"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"تمكين تصحيح خطأ الإدخال"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"أخطاء في الإدخال الأفقي"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"تمكين تصحيح خطأ الإدخال"</string>
- <string name="auto_correction" msgid="7911639788808958255">"اقتراحات الكلمات"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"تصحيح الكلمة السابقة تلقائيًا"</string>
- <string name="prediction" msgid="466220283138359837">"اقتراحات الكلمات"</string>
- <string name="prediction_category" msgid="7027100625580696660">"إعدادات اقتراحات الكلمات"</string>
- <string name="prediction_summary" msgid="459788228830873110">"تمكين الإكمال التلقائي أثناء الكتابة"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"إكمال تلقائي"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"زيادة حجم الحقل النصي"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"إخفاء اقتراحات الكلمات في طريقة العرض الأفقية"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"إعدادات اقتراحات الكلمات"</string>
<string name="auto_cap" msgid="1719746674854628252">"استخدام الأحرف الكبيرة تلقائيًا"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"استخدام الأحرف الكبيرة في بداية الجملة"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"ترقيم تلقائي"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"إصلاحات سريعة"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"تصحيح الأخطاء المكتوبة الشائعة"</string>
- <string name="show_suggestions" msgid="507074425254289133">"عرض الاقتراحات"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"عرض الكلمات المقترحة أثناء الكتابة"</string>
- <string name="auto_complete" msgid="1103196318775486023">"إكمال تلقائي"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"مفتاح المسافة والترقيم لإدخال كلمة محددة تلقائيًا"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"عرض الاقتراحات"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"عرض الكلمات المقترحة أثناء الكتابة"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"إظهار بشكل دائم"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"عرض في وضع رأسي"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"إخفاء دومًا"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"عرض مفتاح الإعدادات"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"تلقائي"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"إظهار بشكل دائم"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"إخفاء دومًا"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"التصحيح التلقائي"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"مفتاح المسافة والترقيم لإدخال كلمة محددة تلقائيًا"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"إيقاف"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"معتدل"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"حاد"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"اقتراحات ثنائية"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"استخدام الكلمة السابقة لتحسين الاقتراح"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"لا شيء"</item>
- <item msgid="1669461741568287396">"أساسي"</item>
- <item msgid="4894328801530136615">"متقدم"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : تم الحفظ"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"اضغط باستمرار على أحد المفاتيح لأسفل لمشاهدة علامات التشكيل"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"اضغط على مفتاح الرجوع ↶ لإغلاق لوحة المفاتيح في أي نقطة"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"الدخول إلى الأرقام والرموز"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"اضغط مع الاستمرار على أقصى يمين الكلمة لإضافتها إلى القاموس"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"المس هذا التلميح للمتابعة »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"المس هنا لإغلاق هذا التلميح وبدء الكتابة!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"تفتح لوحة المفاتيح في أي وقت تلمس فيه حقلًا نصيًا"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"المس مع الاستمرار أحد المفاتيح لعرض علامات التشكيل"\n"(ø, ö, ô, ó, وهكذا)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"التبديل إلى الأرقام والرموز من خلال لمس هذا الزر"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"يمكنك الرجوع إلى الأحرف من خلال لمس هذا المفتاح مرة أخرى"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"المس هذا المفتاح مع الاستمرار لتغيير إعدادات لوحة المفاتيح، مثل الإكمال التلقائي"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"جربه!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"تنفيذ"</string>
<string name="label_next_key" msgid="362972844525672568">"التالي"</string>
<string name="label_done_key" msgid="2441578748772529288">"تم"</string>
<string name="label_send_key" msgid="2815056534433717444">"إرسال"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ب ت ث"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ب ت ة ث"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"المزيد"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"توقف مؤقت"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"انتظار"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"الإدخال الصوتي"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"الإدخال الصوتي غير معتمد حاليًا للغتك، ولكنه يعمل باللغة الإنجليزية."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"الإدخال الصوتي هو ميزة تجريبية تستخدم التعرف على الكلام المتصل في Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"لتشغيل الإدخال الصوتي، انتقل إلى إعدادات لوحة المفاتيح."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"لاستخدام الإدخال الصوتي، اضغط على زر الميكروفون أو مرر إصبعك عبر لوحة المفاتيح على الشاشة."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"يستخدم الإدخال الصوتي تقنية التعرف على الكلام من Google. تسري "<a href="http://m.google.com/privacy">"سياسة خصوصية الجوال"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"لتشغيل الإدخال الصوتي، انتقل إلى إعدادات طريقة الإدخال."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"لاستخدام الإدخال الصوتي، اضغط على زر الميكروفون."</string>
<string name="voice_listening" msgid="467518160751321844">"تحدث الآن"</string>
<string name="voice_working" msgid="6666937792815731889">"العمل"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"إلغاء"</string>
<string name="ok" msgid="7898366843681727667">"موافق"</string>
<string name="voice_input" msgid="2466640768843347841">"الإدخال الصوتي"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"في لوحة المفاتيح الرئيسية"</item>
- <item msgid="8529385602829095903">"على لوحة مفاتيح الرموز"</item>
- <item msgid="7283103513488381103">"إيقاف"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"الميكروفون في لوحة المفاتيح الرئيسية"</item>
- <item msgid="6907837061058876770">"الميكروفون على لوحة مفاتيح الرموز"</item>
- <item msgid="3664304608587798036">"تم تعطيل الإدخال الصوتي"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"إرسال تلقائي بعد الصوت"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"الضغط تلقائيًا على المفتاح enter عند البحث أو الانتقال إلى الحقل التالي."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"افتح لوحة المفاتيح"\n</b></font><font size="3">\n</font>"المس أي حقل نصي."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"إغلاق لوحة المفاتيح"\n</b></font><font size="3">\n</font>"اضغط على المفتاح \"رجوع\"."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"المس أحد مفاتيح الخيارات مع الاستمرار"\n</b></font><font size="3">\n</font>"الدخول إلى الترقيم والحركات."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"إعدادات لوحة المفاتيح"\n</b></font><font size="3">\n</font>"المس مع الاستمرار المفتاح "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">"com."</string>
- <string name="popular_domain_1" msgid="1370572248164278467">"net."</string>
- <string name="popular_domain_2" msgid="3036812463748402878">"org."</string>
- <string name="popular_domain_3" msgid="8718639560809452028">"gov."</string>
- <string name="popular_domain_4" msgid="35359437471311470">"edu."</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"لوحة مفاتيح رئيسية"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"لوحة مفاتيح الرموز"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"إيقاف"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"ميكروفون على لوحة مفاتيح رئيسية"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"ميكروفون على لوحة مفاتيح الرموز"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"الإدخال الصوتي مُعطل"</string>
<string name="selectInputMethod" msgid="315076553378705821">"تحديد طريقة الإرسال"</string>
<string name="language_selection_title" msgid="1651299598555326750">"لغات الإدخال"</string>
<string name="language_selection_summary" msgid="187110938289512256">"مرر إصبعك على مفتاح المسافة لتغيير اللغة"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"تمكين ملاحظات المستخدم"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"المساعدة في تحسين محرر طريقة الإرسال هذا من خلال إرسال إحصاءات الاستخدام وتقارير الأعطال تلقائيًا إلى Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"المس لتصحيح الكلمات"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"المس الكلمات المدخلة لتصحيحها"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"المس الكلمات المدخلة لتصحيحها، فقط عندما تكون الاقتراحات مرئية"</string>
<string name="keyboard_layout" msgid="437433231038683666">"مظهر لوحة المفاتيح"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"لوحة مفاتيح"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"صوت"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"لوحة مفاتيح تشيكية"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"لوحة مفاتيح دانماركية"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"لوحة مفاتيح ألمانية"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"لوحة مفاتيح إنجليزية (المملكة المتحدة)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"لوحة مفاتيح إنجليزية (الولايات المتحدة)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"لوحة مفاتيح إسبانية"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"لوحة مفاتيح إسبانية (الولايات المتحدة)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"لوحة مفاتيح فرنسية"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"لوحة مفاتيح فرنسية (كندا)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"لوحة مفاتيح فرنسية (سويسرا)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"لوحة مفاتيح إيطالية"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"لوحة مفاتيح نرويجية"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"لوحة مفاتيح بولندية"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"لوحة مفاتيح روسية"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"لوحة مفاتيح صربية"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"لوحة مفاتيح سويدية"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صوت تشيكي"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صوت ألماني"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"صوت إسباني"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"صوت فرنسي"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"صوت ياباني"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"صوت كوري"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"صوت بولندي"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"صوت برتغالي"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"صوت روسي"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"صوت تركي"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"وضع دراسة الجدوى"</string>
</resources>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index 83cfaac3a..17fccb467 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Да вибрира при натискане на клавиш"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натискане на клавиш"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Изскачащ прозорец при натискане на клавиш"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Коригиране на грешките при въвеждане"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Активиране на корекция на грешки при въвеждане"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Грешки при въвеждане в хоризонтален изглед"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Активиране на корекция на грешки при въвеждане"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Предложения на думи"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Автоматично коригиране на предишната дума"</string>
- <string name="prediction" msgid="466220283138359837">"Предложения на думи"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Настройки за предложения на думи"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Активиране на автодовършване, докато пишете"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Автодовършване"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Размерът на текстовото поле да се увеличи"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скриване на предложенията на думи в хоризонтален изглед"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Настройки за предложения на думи"</string>
<string name="auto_cap" msgid="1719746674854628252">"Автоматично поставяне на главни букви"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Поставя главна буква в началото на изреченията"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Автоматично поставяне на пунктуация"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Бързи корекции"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Коригира най-честите грешки при въвеждане"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Показване на предложения"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Показване на предложения, докато пишете"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Автоматично завършване"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Клавишът за интервал и пунктуация поставя автоматично откроена дума"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Показване на предложения"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Показване на предложения, докато пишете"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Да се показва винаги"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Режим за показване с вертикална ориентация"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Да се скрива винаги"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Показване на клавиша за настройки"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматично"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Да се показва винаги"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Да се скрива винаги"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Автомат. корекция"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Клавишът за интервал и пунктуация поставя автоматично откроена дума"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Изкл."</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умерено"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Агресивно"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Предложения за биграми"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Използване на предишната дума за подобряване на предложението"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Няма"</item>
- <item msgid="1669461741568287396">"Основен"</item>
- <item msgid="4894328801530136615">"Разширени"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Запазено"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Задръжте клавиша, за да видите ударенията (ø, ö и т.н.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Натиснете клавиша „Назад“ ↶, за да затворите клавиатурата във всяка една точка"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Достъп до номера и символи"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Натиснете и задръжте върху най-лявата дума, за да я добавите към речника"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Докоснете съвета, за да продължите »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Докоснете тук, за да затворите този съвет и да започнете да пишете!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавиатурата се отваря при всяко докосване на текстово поле"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Докоснете и задръжте клавиша, за да видите ударенията"\n"(ø, ö, ô, ó и т.н.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Докосването на този клавиш води до преминаване към цифри и символи"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Върнете се към използване на букви чрез повторно докосване на този клавиш"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Докоснете и задръжте клавиша за промяна на настройките на клавиатурата, напр. автодовършване"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Пробвайте!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Старт"</string>
<string name="label_next_key" msgid="362972844525672568">"Напред"</string>
<string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
<string name="label_send_key" msgid="2815056534433717444">"Изпращане"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"АБВГ"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Още"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Чака"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Гласово въвеждане"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"За вашия език понастоящем не се поддържа гласово въвеждане, но можете да го използвате на английски."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Гласовото въвеждане е експериментална функция, използваща разпознаването на реч в мрежата на Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"За да изключите гласовото въвеждане, отворете настройките на клавиатурата."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"За да използвате гласово въвеждане, натиснете бутона на микрофона или плъзнете пръст през екранната клавиатура."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовото въвеждане използва разпознаването на говор на Google. В сила е "<a href="http://m.google.com/privacy">"Декларацията за поверителност за мобилни устройства"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"За да изключите гласовото въвеждане, отворете настройките за метода на въвеждане."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"За да използвате гласово въвеждане, натиснете бутона на микрофона."</string>
<string name="voice_listening" msgid="467518160751321844">"Говорете сега"</string>
<string name="voice_working" msgid="6666937792815731889">"Обработва се"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Отказ"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Гласово въвеждане"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"На основната клавиатура"</item>
- <item msgid="8529385602829095903">"На клавиатурата на символите"</item>
- <item msgid="7283103513488381103">"Изкл."</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Микрофон на основната клавиатура"</item>
- <item msgid="6907837061058876770">"Микрофон на клавиатурата на символите"</item>
- <item msgid="3664304608587798036">"Гласовото въвеждане е деактивирано"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Автоматично изпращане след глас"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Да се натиска автоматично „Enter“ при търсене или преминаване към следващото поле."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Отворете клавиатурата"\n</b></font><font size="3">\n</font>"Докоснете текстово поле."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Затваряне на клавиатурата"\n</b></font><font size="3">\n</font>"Натиснете клавиша „Назад“."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Докоснете и задръжте клавиш за опции"\n</b></font><font size="3">\n</font>"Използвайте пунктуация и акценти."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Настройки на клавиатурата"\n</b></font><font size="3">\n</font>"Докоснете и задръжте клавиша "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На осн. клавиатура"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На клав. на симв."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Изкл."</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Микр. на осн. клав."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Микр. на клав. на симв."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Глас. въвежд. е деакт."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Избор на метод на въвеждане"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Входни езици"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Плъзнете пръст по клавиша за интервал за промяна на езика"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Активиране на отзивите от потребителите"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Помогнете за подобряването на този редактор за въвеждане чрез автоматично изпращане до Google на статистически данни за употребата и сигнали за сривове."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Докоснете, за да поправите думите"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Докоснете въведените думи, за да ги поправите"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Докоснете въведените думи, за да ги поправите – само когато предложенията си видими"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Тема на клавиатурата"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"клавиатура"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"гласово"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"чешка клавиатура"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"датска клавиатура"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"немска клавиатура"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"английска (Великобритания) клавиатура"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"английска (САЩ) клавиатура"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"испанска клавиатура"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"испанска (САЩ) клавиатура"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"френска клавиатура"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"френска (Канада) клавиатура"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"френска (Швейцария) клавиатура"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"италианска клавиатура"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"норвежка клавиатура"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"нидерландска клавиатура"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"руска клавиатура"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"сръбска клавиатура"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"шведска клавиатура"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"чешки, гласово"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"немски, гласово"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"испански, гласово"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"френски, гласово"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"японски, гласово"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"корейски, гласово"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"полски, гласово"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"португалски, гласово"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"руски, гласово"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"турски, гласово"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Режим за изследване на използваемостта"</string>
</resources>
diff --git a/java/res/values-ja/donottranslate-altchars.xml b/java/res/values-ca/donottranslate-altchars.xml
index d3beafade..336057be0 100644
--- a/java/res/values-ja/donottranslate-altchars.xml
+++ b/java/res/values-ca/donottranslate-altchars.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -18,13 +18,12 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òóôõöœø9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">à,á,ä,â,ã,å,ą,æ,ā,ª</string>
+ <string name="alternates_for_e">3,è,é,ë,ê,ę,ė,ē</string>
+ <string name="alternates_for_i">8,í,ï,ì,î,į,ī</string>
+ <string name="alternates_for_o">9,ò,ó,ö,ô,õ,ø,œ,ō,º</string>
+ <string name="alternates_for_u">7,ú,ü,ù,û,ū</string>
+ <string name="alternates_for_n">ñ,ń</string>
+ <string name="alternates_for_c">ç,ć,č</string>
+ <string name="alternates_for_l">ŀ,ł</string>
</resources>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index e143dfb4f..1fab585af 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibra en prémer tecles"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"So en prémer una tecla"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Finestra emergent en prémer un botó"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Corregeix els errors ortogràfics"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Activa la correcció d\'errors d\'entrada"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Errors d\'entrada en horitzontal"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activa la correcció d\'errors d\'entrada"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Suggeriments de paraules"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Corregeix automàticament la paraula anterior"</string>
- <string name="prediction" msgid="466220283138359837">"Suggeriments de paraules"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Configuració de suggeriment de paraules"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Activa l\'emplenament automàtic mentre s\'escriu"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Emplenament automàtic"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Augmenta la mida del camp de text"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Oculta els suggeriments de paraules en visualització horitzontal"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Configuració de suggeriment de paraules"</string>
<string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Posa l\'inici d\'una frase en majúscula"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Puntuació automàtica"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Correccions ràpides"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corregeix els errors d\'ortografia habituals"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Mostra els suggeriments"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Visualitza paraules suggerides mentre s\'escriu"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Emplenament automàtic"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"La barra espaiadora i la puntuació insereixen automàticament la paraula ressaltada"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostra els suggeriments"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Visualitza paraules suggerides mentre s\'escriu"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostra sempre"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostra en mode de retrat"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Amaga sempre"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostra la tecla de configuració"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automàtic"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostra sempre"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Amaga sempre"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Correcció automàtica"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"La barra espaiadora i la puntuació insereixen automàticament la paraula ressaltada"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactiva"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Estricta"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Suggeriments Bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilitza la paraula anterior per millorar el suggeriment"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Cap"</item>
- <item msgid="1669461741568287396">"Bàsic"</item>
- <item msgid="4894328801530136615">"Avançat"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: desada"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Manteniu una tecla premuda per veure\'n les variants (ø, ö, etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Premeu la tecla Enrere ↶ per tancar el teclat en qualsevol moment"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Accedeix a números i símbols"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Manteniu premuda la paraula de l\'extrem esquerre per afegir-la al diccionari"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Toqueu aquest suggeriment per continuar »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Toqueu aquí per tancar aquest suggeriment i començar a escriure."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"S\'obre el teclat cada vegada que toqueu un camp de text"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Manteniu premuda una tecla per veure\'n les variants"\n"(ø, ö, ô, ó, etc.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Toqueu aquesta tecla per canviar als números i als símbols"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Torneu a tocar aquesta tecla per tornar a les lletres"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Manteniu premuda aquesta tecla per canviar la configuració del teclat, com ara l\'emplenament automàtic"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Proveu-ho!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Vés"</string>
<string name="label_next_key" msgid="362972844525672568">"Següent"</string>
<string name="label_done_key" msgid="2441578748772529288">"Fet"</string>
<string name="label_send_key" msgid="2815056534433717444">"Envia"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Més"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada de veu"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualment, l\'entrada de veu no és compatible amb el vostre idioma, però funciona en anglès."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"L\'entrada de veu és una funció experimental que utilitza el reconeixement de la parla en xarxa de Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Per desactivar l\'entada de veu, aneu a la configuració del teclat."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Per utilitzar l\'entrada de veu, premeu el botó del micròfon o feu lliscar el dit pel teclat en pantalla."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'entrada de veu utilitza el reconeixement de veu de Google. S\'aplica la "<a href="http://m.google.com/privacy">"Política de privadesa de Google Mobile"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per desactivar l\'entrada de veu, vés a la configuració del mètode d\'entrada."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Per utilitzar l\'entrada de veu, prem el botó del micròfon."</string>
<string name="voice_listening" msgid="467518160751321844">"Parleu ara"</string>
<string name="voice_working" msgid="6666937792815731889">"S\'està treballant"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Cancel·la"</string>
<string name="ok" msgid="7898366843681727667">"D\'acord"</string>
<string name="voice_input" msgid="2466640768843347841">"Entrada de veu"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Al teclat principal"</item>
- <item msgid="8529385602829095903">"Al teclat de símbols"</item>
- <item msgid="7283103513488381103">"Desactivat"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Micròfon al teclat principal"</item>
- <item msgid="6907837061058876770">"Micròfon al teclat de símbols"</item>
- <item msgid="3664304608587798036">"L\'entrada de veu està desactivada"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Enviament automàtic després de la veu"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Prem automàticament Retorn en cercar o en anar al camp següent."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Obrir el teclat"\n</b></font><font size="3">\n</font>"Toqueu qualsevol camp de text."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tancar el teclat"\n</b></font><font size="3">\n</font>"Premeu la tecla Enrere."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Manteniu premuda una tecla per veure les opcions"\n</b></font><font size="3">\n</font>"Accediu a la puntuació i als accents."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configuració del teclat"\n</b></font><font size="3">\n</font>"Manteniu premuda la tecla "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Al teclat principal"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Al tecl. de símb."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivada"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micr. a tecl. princ."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micr. a tecl. símb."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. veu desactiv."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Selecciona el mètode d\'entrada"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomes d\'entrada"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Feu lliscar el dit a la barra espaiadora per canviar l\'idioma"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Activa els comentaris de l\'usuari"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Ajuda a millorar aquest editor de mètodes d\'entrada enviant automàticament estadístiques d\'ús i informes de bloqueigs a Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Toca per corregir paraules"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toca les paraules introduïdes per corregir-les"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca les paraules introduïdes per corregir-les; només quan els suggeriments siguin visibles"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema del teclat"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclat"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"veu"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclat txec"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclat danès"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclat alemany "</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclat anglès (RU)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclat Anglès (EUA)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclat espanyol"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclat espanyol (EUA)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclat francès"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclat francès (Canadà)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclat francès (Suïssa)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclat italià "</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclat noruec"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclat holandès"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclat rus"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclat serbi"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclat suec"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Veu txeca"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Veu alemanya"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Veu espanyola"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Veu francesa"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Veu japonesa"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Veu coreana"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Veu polonesa"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Veu portuguesa"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Veu russa"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Veu turca"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mode d\'estudi d\'usabilitat"</string>
</resources>
diff --git a/java/res/values-cs/donottranslate-altchars.xml b/java/res/values-cs/donottranslate-altchars.xml
index d91a0e449..541cd2154 100644
--- a/java/res/values-cs/donottranslate-altchars.xml
+++ b/java/res/values-cs/donottranslate-altchars.xml
@@ -18,17 +18,17 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">áàâãäåæ</string>
- <string name="alternates_for_e">3éěèêë</string>
- <string name="alternates_for_i">íìîï8</string>
- <string name="alternates_for_o">óòôõöœø9</string>
- <string name="alternates_for_u">ůúùûü7</string>
- <string name="alternates_for_s">š§ß</string>
- <string name="alternates_for_n">ňñ</string>
- <string name="alternates_for_c">čç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">á,à,â,ä,æ,ã,å,ā</string>
+ <string name="alternates_for_e">3,é,ě,è,ê,ë,ę,ė,ē</string>
+ <string name="alternates_for_i">8,í,î,ï,ì,į,ī</string>
+ <string name="alternates_for_o">9,ó,ö,ô,ò,õ,œ,ø,ō</string>
+ <string name="alternates_for_u">7,ú,ů,û,ü,ù,ū</string>
+ <string name="alternates_for_s">š,ß,ś</string>
+ <string name="alternates_for_n">ň,ñ,ń</string>
+ <string name="alternates_for_c">č,ç,ć</string>
+ <string name="alternates_for_y">ý,ÿ</string>
<string name="alternates_for_d">ď</string>
- <string name="alternates_for_r">ř4</string>
- <string name="alternates_for_t">ť5</string>
- <string name="alternates_for_z">ž</string>
+ <string name="alternates_for_r">4,ř</string>
+ <string name="alternates_for_t">5,ť</string>
+ <string name="alternates_for_z">6,ž,ź,ż</string>
</resources>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 4f872e6b5..10def425a 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Při stisku klávesy vibrovat"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk při stisku klávesy"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Zobrazit znaky při stisku klávesy"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Opravovat překlepy"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Povolit opravu chyb vstupu"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Chyby vstupu v zobrazení na šířku"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Povolit opravu chyb vstupu"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Návrhy slov"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Automaticky opravit předchozí slovo"</string>
- <string name="prediction" msgid="466220283138359837">"Návrhy slov"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Nastavení návrhů slov"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Povolit automatické dokončování při psaní"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatické dokončování"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Zvětšit textové pole"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skrýt návrhy slov v zobrazení na šířku"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Nastavení návrhů slov"</string>
<string name="auto_cap" msgid="1719746674854628252">"Velká písmena automaticky"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Zahájit větu velkým písmenem"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatická interpunkce"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Rychlé opravy"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje nejčastější chyby při psaní"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Zobrazit návrhy"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Zobrazovat navržená slova během psaní"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Automatické dokončování"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo."</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobrazit návrhy"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Zobrazovat navržená slova během psaní"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vždy zobrazovat"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Zobrazit v režimu na výšku"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vždy skrývat"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Zobrazit klávesu Nastavení"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automaticky"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vždy zobrazovat"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vždy skrývat"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Automatické opravy"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo."</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuto"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mírné"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivní"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Návrh Bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Použít předchozí slovo ke zlepšení návrhu"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Žádný"</item>
- <item msgid="1669461741568287396">"Základní"</item>
- <item msgid="4894328801530136615">"Pokročilé"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Uloženo"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Podržením klávesy zobrazíte diakritiku (á, ž apod.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Stisknutím klávesy Zpět ↶ můžete klávesnici kdykoli zavřít."</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Přístup k číslům a symbolům"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Stisknutím a podržením slova zcela vlevo toto slovo přidáte do slovníku."</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Chcete-li pokračovat, dotkněte se tohoto tipu »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Chcete-li tento tip zavřít a začít psát, dotkněte se zde."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klávesnice se otevře vždy, když se dotknete textového pole."</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Přidržením klávesy zobrazíte diakritiku"\n"(ó, ø, ö, ô apod.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Chcete-li přepnout na režim zadávání číslic a symbolů, dotkněte se této klávesy."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Chcete-li přejít zpět k zadávání písmen, dotkněte se této klávesy znovu."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Přidržením této klávesy změníte nastavení klávesnice (např. automatické dokončování)."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Vyzkoušejte si to."</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Přejít"</string>
<string name="label_next_key" msgid="362972844525672568">"Další"</string>
<string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string>
<string name="label_send_key" msgid="2815056534433717444">"Odeslat"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"Alt"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Další"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Čekat"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pro váš jazyk aktuálně není hlasový vstup podporován, ale funguje v angličtině."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Hlasový vstup je experimentální funkce, která využívá síťové rozpoznávání řeči společnosti Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Chcete-li vypnout hlasový vstup, přejděte do nastavení klávesnice."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Chcete-li použít hlasový vstup, stiskněte tlačítko mikrofonu nebo přejeďte prstem přes klávesnici na obrazovce."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup používá rozpoznávání hlasu Google a vztahují se na něj "<a href="http://m.google.com/privacy">"Zásady ochrany osobních údajů pro mobilní služby"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Chcete-li vypnout hlasový vstup, přejděte do nastavení metod vstupu."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Chcete-li použít hlasový vstup, stiskněte tlačítko mikrofonu"</string>
<string name="voice_listening" msgid="467518160751321844">"Mluvte"</string>
<string name="voice_working" msgid="6666937792815731889">"Probíhá zpracování"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Zrušit"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Hlasový vstup"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Na hlavní klávesnici"</item>
- <item msgid="8529385602829095903">"Na klávesnici se symboly"</item>
- <item msgid="7283103513488381103">"Vypnout"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofon na hlavní klávesnici"</item>
- <item msgid="6907837061058876770">"Mikrofon na klávesnici se symboly"</item>
- <item msgid="3664304608587798036">"Hlasový vstup je deaktivován"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Po hlasovém vstupu automaticky odeslat"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Při vyhledávání nebo přechodu na další pole automaticky stisknout Enter."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otevřete klávesnici"\n</b></font><font size="3">\n</font>"Dotkněte se libovolného textového pole."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zavřete klávesnici"\n</b></font><font size="3">\n</font>"Stiskněte tlačítko Zpět."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Přidržením klávesy zobrazte možnosti"\n</b></font><font size="3">\n</font>"Přístup k interpunkčním znaménkům a diakritice."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavení klávesnice"\n</b></font><font size="3">\n</font>"Dotkněte se klávesy "<b>"?123"</b>" a přidržte ji."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".cz"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".net"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".eu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na hlavní klávesnici"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klávesnici se symb."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Vypnuto"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr. na hlav. kláv."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. na kláv. se symb."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup vypnut"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Výběr metody zadávání dat"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Jazyk můžete změnit posunutím prstu po mezerníku."</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktivovat zasílání statistik užívání a zpráv o selhání"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Automatickým zasíláním statistik o užívání editoru zadávání dat a zpráv o jeho selhání do Googlu můžete přispět k vylepšení tohoto nástroje."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykem aktivovat opravy"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Klepnutím na zadaná slova tyto slova opravíte, musí však být viditelné návrhy."</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Klepnutím na zadaná slova tyto slova opravíte, musí však být viditelné návrhy."</string>
<string name="keyboard_layout" msgid="437433231038683666">"Motiv klávesnice"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klávesnice"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"hlas"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Klávesnice – čeština"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Klávesnice – dánština"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Klávesnice – němčina"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klávesnice – angličtina (Spojené státy)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klávesnice – angličtina (Spojené státy)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klávesnice – španělština"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Klávesnice – španělština (Spojené státy)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klávesnice – francouzština"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klávesnice – francouzština (Kanada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klávesnice – francouzština (Švýcarsko)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klávesnice – italština"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klávesnice – norština"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klávesnice – holandština"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klávesnice – ruština"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klávesnice – srbština"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klávesnice – švédština"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice – čeština"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice – němčina"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voice – španělština"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voice – francouzština"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voice – japonština"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voice – korejština"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voice – polština"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voice – portugalština"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voice – ruština"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voice – turečtina"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Režim studia použitelnosti"</string>
</resources>
diff --git a/java/res/values-da/donottranslate-altchars.xml b/java/res/values-da/donottranslate-altchars.xml
index b1cc8b627..46f1644ad 100644
--- a/java/res/values-da/donottranslate-altchars.xml
+++ b/java/res/values-da/donottranslate-altchars.xml
@@ -18,21 +18,18 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">áàâąã</string>
- <string name="alternates_for_e">3éèêëę€</string>
- <string name="alternates_for_i">íìîï8</string>
- <string name="alternates_for_o">óòôõ9</string>
- <string name="alternates_for_u">úùûū7</string>
- <string name="alternates_for_s">śšşß</string>
- <string name="alternates_for_n">ńñň</string>
- <string name="alternates_for_c">çćč</string>
- <string name="alternates_for_y">ýÿü6</string>
- <string name="alternates_for_d">ðď</string>
- <string name="alternates_for_r">ř4</string>
- <string name="alternates_for_t">ťþ5</string>
- <string name="alternates_for_z">źžż</string>
+ <string name="alternates_for_a">á,ä,à,â,ã,ā</string>
+ <string name="alternates_for_e">3,é,ë</string>
+ <string name="alternates_for_i">8,í,ï</string>
+ <string name="alternates_for_o">9,ó,ô,ò,õ,œ,ō</string>
+ <string name="alternates_for_u">7,ú,ü,û,ù,ū</string>
+ <string name="alternates_for_s">ß,ś,š</string>
+ <string name="alternates_for_n">ñ,ń</string>
+ <string name="alternates_for_y">6,ý,ÿ</string>
+ <string name="alternates_for_d">ð</string>
<string name="alternates_for_l">ł</string>
- <string name="alternates_for_v">w</string>
- <string name="alternates_for_ae">ä</string>
- <string name="alternates_for_oe">öœ</string>
+ <string name="keylabel_for_scandinavia_row2_10">æ</string>
+ <string name="keylabel_for_scandinavia_row2_11">ø</string>
+ <string name="alternates_for_scandinavia_row2_10">ä</string>
+ <string name="alternates_for_scandinavia_row2_11">ö</string>
</resources>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index 7777572b8..e18ff04ae 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibration ved tastetryk"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Lyd ved tastetryk"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup ved tastetryk"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Ret stavefejl"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Aktiver fejlretning af input"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Inputfejl i landskab"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Aktiver fejlretning af input"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Ordforslag"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Ret automatisk det forrige ord"</string>
- <string name="prediction" msgid="466220283138359837">"Ordforslag"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Indstillinger for ordforslag"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Aktiver automatisk udfyldelse, når du indtaster"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatisk udfyldelse"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Forøg tekstfeltets størrelse"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skjul ordforslag i landskabsvisning"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Indstillinger for ordforslag"</string>
<string name="auto_cap" msgid="1719746674854628252">"Skriv aut. med stort"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Første bogstav i en sætning skrives med stort"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Foretag automatisk tegnsætning"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Hurtige løsninger"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Retter almindelige stavefejl"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Vis forslag"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Vis ordforslag under indtastning"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Udfyld automatisk"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Vis forslag"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vis ordforslag under indtastning"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vis altid"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Vis i portrættilstand"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Skjul altid"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Vis indstillingsnøgle"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisk"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vis altid"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Skjul altid"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Automatisk retning"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Fra"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Beskeden"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressiv"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram-forslag"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Brug forrige ord for at forbedre forslag"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Ingen"</item>
- <item msgid="1669461741568287396">"Grundlæggende"</item>
- <item msgid="4894328801530136615">"Avanceret"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Gemt"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Hold en tast nede for at se accenter (ø, ö osv.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Tryk på knappen Tilbage ↶ for når som helst at lukke for tastaturet"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Få adgang til tal og symboler"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tryk og hold på ordet længst til venstre for at føje det til ordbogen"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Berør dette tip for at fortsætte »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Berør her for at lukke dette tip og begynde at indtaste!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastaturet åbner når som helst, du berører et tekstfelt"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tryk på en tast, og hold den nede for a vise accenter"\n"(ø, ö, ô, ó osv.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Skift til tal og symboler ved at røre denne tast"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Gå tilbage til bogstaver ved at berøre denne tast igen"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tryk på denne tast, og hold den nede for at ændre tastaturindstillingerne, som f.eks. automatisk udfyldelse"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prøv det!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Gå"</string>
<string name="label_next_key" msgid="362972844525672568">"Næste"</string>
<string name="label_done_key" msgid="2441578748772529288">"Udfør"</string>
<string name="label_send_key" msgid="2815056534433717444">"Send"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Mere"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Stemmeinput"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmeinput understøttes i øjeblikket ikke for dit sprog, men fungerer på engelsk."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Stemme-input er en funktion på forsøgsbasis, som bruger Googles netværksstemmegenkendelse."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Slå stemmeinput fra i indstillingerne for tastaturet."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"For at bruge stemme-input skal du trykke på knappen mikrofon eller lade glide fingeren hen over skærmtastaturet."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Stemmeinput anvender Googles stemmegenkendelse. "<a href="http://m.google.com/privacy">"Fortrolighedspolitik for mobil"</a>" gælder"</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Slå stemmeinput fra i indstillingerne for inputmetode."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Brug stemmeinput ved at trykke på mikrofonknappen."</string>
<string name="voice_listening" msgid="467518160751321844">"Tal nu"</string>
<string name="voice_working" msgid="6666937792815731889">"Arbejder"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Annuller"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Stemmeinput"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"På hovedtastatur"</item>
- <item msgid="8529385602829095903">"På symboltastatur"</item>
- <item msgid="7283103513488381103">"Fra"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofon på hovedtastatur"</item>
- <item msgid="6907837061058876770">"Mikrofon på symboltastatur"</item>
- <item msgid="3664304608587798036">"Stemmeinput er deaktiveret"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Send automatisk efter stemme"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Tryk automatisk på enter, når du søger eller går til det næste felt."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Åbn tastaturet"\n</b></font><font size="3">\n</font>"Tryk på et hvilket som helst tekstfelt."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Luk tastaturet"\n</b></font><font size="3">\n</font>"Tryk på knappen Tilbage."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tryk på en tast, og hold den nede for valgmuligheder"\n</b></font><font size="3">\n</font>"Få adgang til tegnsætning og accenter."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastaturindstillinger"\n</b></font><font size="3">\n</font>"Tryk på tasten "<b>"?123"</b>", og hold den nede."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På hovedtastatur"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På symboltastatur"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Fra"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik. på hovedtastatur"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. på symboltastatur"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Stemmeinput deaktiveret"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Vælg inputmetode"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Træk fingeren på mellemrumstasten for at skifte sprog"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brugerfeedback"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Vær med til at forbedre denne inputmetode ved at sende anvendelsesstatistikker og rapporter om nedbrud til Google."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryk for at rette ord"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tryk på indtastede ord for at rette dem, kun når der er synlige forslag"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tryk på indtastede ord for at rette dem, kun når der er synlige forslag"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tastaturtema"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatur"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"stemme"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tjekkisk tastatur"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dansk tastatur"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tysk tastatur"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannien)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spansk tastatur (USA)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Schweiz)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Hollandsk tastatur"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tjekkisk stemme"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Tysk stemme"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spansk stemme"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransk stemme"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japansk stemme"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreansk stemme"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polsk stemme"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugisisk stemme"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russisk stemme"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Tyrkisk stemme"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Tilstand for brugsstudie"</string>
</resources>
diff --git a/java/res/values-de/donottranslate-altchars.xml b/java/res/values-de/donottranslate-altchars.xml
index df27bce28..8b8b6aed7 100644
--- a/java/res/values-de/donottranslate-altchars.xml
+++ b/java/res/values-de/donottranslate-altchars.xml
@@ -18,14 +18,12 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">ä</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">ö9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ</string>
+ <string name="alternates_for_a">ä,â,à,á,æ,ã,å,ā</string>
+ <string name="alternates_for_e">3,ė</string>
+ <string name="alternates_for_o">9,ö,ô,ò,ó,õ,œ,ø,ō</string>
+ <string name="alternates_for_u">7,ü,û,ù,ú,ū</string>
+ <string name="alternates_for_s">ß,ś,š</string>
+ <string name="alternates_for_n">ñ,ń</string>
+ <string name="alternates_for_y"></string>
<string name="alternates_for_z">6</string>
</resources>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index 361a1505f..452d87e67 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrieren b. Tastendruck"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Ton bei Tastendruck"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pop-up bei Tastendruck"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Eingabefehler korrigieren"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Korrektur von Eingabefehlern aktivieren"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Eingabefehler im Querformat"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Korrektur von Eingabefehlern aktivieren"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Wortvorschläge"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Vorheriges Wort automatisch korrigieren"</string>
- <string name="prediction" msgid="466220283138359837">"Wortvorschläge"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Einstellungen für Wortvorschläge"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Automatische Vervollständigung während der Eingabe aktivieren"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autom. vervollständigen"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Textfeld vergrößern"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Wortvorschläge in Querformat ausblenden"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Einstellungen für Wortvorschläge"</string>
<string name="auto_cap" msgid="1719746674854628252">"Autom. Groß-/Kleinschr."</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Sätze mit Großbuchstaben beginnen"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Autom. Zeichensetzung"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Quick Fixes"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Korrigiert gängige Tippfehler"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Vorschläge anzeigen"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Vorgeschlagene Wörter während des Tippens anzeigen"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Autom. vervollständigen"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Leertaste und Interpunktion fügen autom. ein markiertes Wort ein"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Vorschläge anzeigen"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vorgeschlagene Wörter während der Eingabe anzeigen"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Immer anzeigen"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Im Hochformat anzeigen"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Immer ausblenden"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Einstellungstaste anz."</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisch"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Immer anzeigen"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Immer ausblenden"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Auto-Korrektur"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Leertaste und Zeichensetzung fügen automatisch ein hervorgehobenes Wort ein."</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Aus"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mäßig"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressiv"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigramm-Vorschläge"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Zur Verbesserung des Vorschlags vorheriges Wort verwenden"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Kein"</item>
- <item msgid="1669461741568287396">"Standard"</item>
- <item msgid="4894328801530136615">"Erweitert"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: gespeichert"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Zur Anzeige von Umlauten (ä, ö usw.) Taste gedrückt halten"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Zum Schließen der Tastatur ↶ drücken"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Auf Zahlen und Symbole zugreifen"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Lange auf das Wort ganz links außen drücken, um es zum Wörterbuch hinzuzufügen"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Diesen Hinweis berühren, um fortzufahren »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Hier berühren, um diesen Hinweis zu schließen und mit dem Tippen zu beginnen!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Die Tastatur wird immer dann geöffnet, wenn Sie ein Textfeld berühren."</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Halten Sie eine Taste gedrückt, um Akzente anzuzeigen"\n"(ø, ö, ô, ó usw.)."</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Wechseln Sie zu Ziffern und Symbolen, indem Sie diese Taste berühren."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Durch erneutes Drücken dieser Taste gelangen Sie zurück zu den Buchstaben."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Halten Sie diese Taste gedrückt, um die Tastatureinstellungen, wie beispielsweise die automatische Vervollständigung, zu ändern."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Probieren Sie es aus!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Los"</string>
<string name="label_next_key" msgid="362972844525672568">"Weiter"</string>
<string name="label_done_key" msgid="2441578748772529288">"Fertig"</string>
<string name="label_send_key" msgid="2815056534433717444">"Senden"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Mehr"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Warten"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Spracheingabe"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spracheingaben werden derzeit nicht für Ihre Sprache unterstützt, funktionieren jedoch in Englisch."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Die Spracheingabe ist eine Funktion im Versuchsstadium, die die vernetzte Spracherkennung von Google verwendet."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Wenn Sie die Spracheingabe deaktivieren möchten, rufen Sie die Tastatureinstellungen auf."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Um die Spracheingabe zu verwenden, drücken Sie die Mikrofontaste oder ziehen Sie Ihren Finger über die Bildschirmtastatur."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Für die Spracheingabe wird die Spracherkennung von Google verwendet. Es gelten die "<a href="http://m.google.com/privacy">"Google Mobile-Datenschutzbestimmungen"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Wenn Sie die Spracheingabe deaktivieren möchten, rufen Sie die Einstellungen für die Eingabemethode auf."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Drücken Sie die Mikrofontaste, um die Spracheingabe zu nutzen."</string>
<string name="voice_listening" msgid="467518160751321844">"Jetzt sprechen"</string>
<string name="voice_working" msgid="6666937792815731889">"Vorgang läuft"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Abbrechen"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Spracheingabe"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Auf Haupttastatur"</item>
- <item msgid="8529385602829095903">"Auf Symboltastatur"</item>
- <item msgid="7283103513488381103">"Aus"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofon auf Haupttastatur"</item>
- <item msgid="6907837061058876770">"Mikrofon auf Symboltastatur"</item>
- <item msgid="3664304608587798036">"Spracheingabe ist deaktiviert"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Nach Sprachaufnahme automatisch senden"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Drücken Sie auf die Eingabetaste, wenn Sie einen Suchvorgang durchführen oder zum nächsten Feld wechseln."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Tastatur öffnen"\n</b></font><font size="3">\n</font>"Berühren Sie ein beliebiges Textfeld."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tastatur schließen"\n</b></font><font size="3">\n</font>"Drücken Sie die Zurücktaste."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Für Optionen eine Taste berühren und gedrückt halten"\n</b></font><font size="3">\n</font>"Greifen Sie auf Satzzeichen und Akzente zu."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastatureinstellungen"\n</b></font><font size="3">\n</font>"Berühren und halten Sie die Taste "<b>"?123"</b>" gedrückt."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Auf Haupttastatur"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Auf Symboltastatur"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Aus"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikro auf Haupttastatur"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikro auf Symboltastatur"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spracheing. deaktiviert"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Eingabemethode auswählen"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Finger über die Leertaste bewegen, um die Eingabesprache zu wechseln"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Nutzer-Feedback aktivieren"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Tragen Sie zur Verbesserung dieses Eingabemethodeneditors bei, indem Sie automatisch Nutzungsstatistiken und Absturzberichte an Google senden."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Wortkorrektur"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Eingegebene Wörter zum Korrigieren berühren (nur wenn Vorschläge angezeigt werden)"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Eingegebene Wörter zum Korrigieren berühren (nur wenn Vorschläge angezeigt werden)"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tastaturdesign"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"Tastatur"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"Sprache"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tschechische Tastatur"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dänische Tastatur"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Deutsche Tastatur"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Englische Tastatur (GB)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Englische Tastatur (USA)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanische Tastatur"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spanische Tastatur (USA)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Französische Tastatur"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Französische Tastatur (Kanada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Französische Tastatur (Schweiz)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienische Tastatur"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegische Tastatur"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Niederländische Tastatur"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russische Tastatur"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbische Tastatur"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Schwedische Tastatur"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tschechische Stimme"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Deutsche Stimme"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanische Stimme"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Französische Stimme"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanische Stimme"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreanische Stimme"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polnische Stimme"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugiesische Stimme"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russische Stimme"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Türkische Stimme"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modus für Studie zur Benutzerfreundlichkeit"</string>
</resources>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index e0c38b02b..dba47e7e6 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Δόνηση κατά το πάτημα πλήκτρων"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Ήχος κατά το πάτημα πλήκτρων"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Εμφάνιση με το πάτημα πλήκτρου"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Διόρθωση σφαλμάτων πληκτρολόγησης"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Ενεργοποίηση διόρθωσης σφαλμάτων εισόδου"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Σφάλματα οριζόντιας εισαγωγής"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Ενεργοποίηση διόρθωσης σφαλμάτων εισόδου"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Υποδείξεις λέξεων"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Αυτόματη διόρθωση της προηγούμενης λέξης"</string>
- <string name="prediction" msgid="466220283138359837">"Υποδείξεις λέξεων"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Ρυθμίσεις υποδείξεων λέξεων"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Ενεργοποίηση αυτόματης συμπλήρωσης κατά την πληκτρολόγηση"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Αυτόματη συμπλήρωση"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Αυξήστε το μέγεθος του πεδίου κειμένου"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Απόκρυψη υποδείξεων λέξεων στην οριζόντια προβολή"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Ρυθμίσεις υποδείξεων λέξεων"</string>
<string name="auto_cap" msgid="1719746674854628252">"Αυτόματη χρήση κεφαλαίων"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Κεφαλαίο το πρώτο γράμμα της πρότασης"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Αυτόματος τονισμός"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Γρήγορες διορθώσεις"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Διορθώνει συνηθισμένα λάθη πληκτρολόγησης"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Εμφάνιση υποδείξεων"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Αυτόματη συμπλήρωση"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Τα πλήκ.διαστήμ.και τονισμού εισάγ.αυτόμ.την επιλ.λέξη"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Εμφάνιση υποδείξεων"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Να εμφανίζεται πάντα"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Εμφάνιση σε λειτουργία κατακόρυφου προσανατολισμού"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Πάντα απόκρυψη"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Εμφάνιση πλήκτρου ρυθμίσεων"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Αυτόματο"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Να εμφανίζεται πάντα"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Πάντα απόκρυψη"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Αυτόματη διόρθωση"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Το πλήκτρο διαστήματος και του τονισμού εισάγουν αυτόματα την επιλεγμένη λέξη"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Απενεργοποίηση"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Μέτρια"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Υψηλή"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Προτάσεις bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Χρήση προηγούμενης λέξης για τη βελτίωση πρότασης"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Καμία"</item>
- <item msgid="1669461741568287396">"Βασική"</item>
- <item msgid="4894328801530136615">"Σύνθετη"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Αποθηκεύτηκε"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Κρατήστε πατημένο ένα πλήκτρο για να δείτε τους τονισμένους χαρακτήρες (ø, ö, κ.τ.λ.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Πατήστε το πλήκτρο Πίσω ↶ για να κλείσετε το πληκτρολόγιο ανά πάσα στιγμή"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Πρόσβαση σε αριθμούς και σύμβολα"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Κρατήστε πατημένη τη λέξη στην άκρη αριστερά, για να την προσθέσετε στο λεξικό"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Αγγίξτε αυτή τη συμβουλή για να συνεχίσετε »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Αγγίξτε εδώ για να κλείσετε τη συμβουλή και να ξεκινήσετε την πληκτρολόγηση!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Το πληκτρολόγιο ανοίγει κάθε φορά που αγγίζετε ένα πεδίο κειμένου"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Αγγίξτε και κρατήστε κάποιο πλήκτρο για να προβάλετε τους τονισμένους χαρακτήρες"\n"(ø, ö, ô, ó κ.τ.λ.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Αλλαγή σε αριθμούς και σύμβολα με το πάτημα αυτού του πλήκτρου"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Επιστρέψτε στα γράμματα αγγίζοντας ξανά αυτό το πλήκτρο"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Αγγίξτε και κρατήστε πατημένο αυτό το πληκτρολόγιο για να αλλάξετε τις ρυθμίσεις πληκτρολογίου, όπως η αυτόματη συμπλήρωση"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Δοκιμάστε το!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Μετάβαση"</string>
<string name="label_next_key" msgid="362972844525672568">"Επόμενο"</string>
<string name="label_done_key" msgid="2441578748772529288">"Τέλος"</string>
<string name="label_send_key" msgid="2815056534433717444">"Αποστολή"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ΑΒΓ"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Περισσότερα"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Παύση"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Αναμ."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Φωνητική είσοδος"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Η φωνητική είσοδος δεν υποστηρίζεται αυτή τη στιγμή για τη γλώσσα σας, ωστόσο λειτουργεί στα Αγγλικά."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Οι φωνητικές εντολές είναι μια πειραματική λειτουργία, η οποία χρησιμοποιεί τη δικτυακή αναγνώριση ομιλίας της Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Για να απενεργοποιήσετε τη φωνητική είσοδο, μεταβείτε στις ρυθμίσεις πληκτρολογίου."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Για να χρησιμοποιήσετε τις φωνητικές εντολές, πιέστε το κουμπί μικροφώνου ή σύρετε το δάχτυλό σας κατά μήκος του πληκτρολογίου της οθόνης."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Η φωνητική εντολή κάνει χρήση της αναγνώρισης ομιλίας του Google. "<a href="http://m.google.com/privacy">"Ισχύει η Πολιτική Απορρήτου για κινητά"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Για να απενεργοποιήσετε τη φωνητική είσοδο, μεταβείτε στις ρυθμίσεις μεθόδου εισόδου."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Αν θέλετε να χρησιμοποιήσετε τη φωνητική είσοδο, πιέστε το κουμπί μικροφώνου."</string>
<string name="voice_listening" msgid="467518160751321844">"Μιλήστε τώρα"</string>
<string name="voice_working" msgid="6666937792815731889">"Σε λειτουργία"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Ακύρωση"</string>
<string name="ok" msgid="7898366843681727667">"ΟΚ"</string>
<string name="voice_input" msgid="2466640768843347841">"Φωνητική είσοδος"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Στο κύριο πληκτρολόγιο"</item>
- <item msgid="8529385602829095903">"Πληκτρολόγιο συμβόλων ενεργοποίησης"</item>
- <item msgid="7283103513488381103">"Απενεργοποίηση"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Μικρόφωνο στο κύριο πληκτρολόγιο"</item>
- <item msgid="6907837061058876770">"Μικρόφωνο στο πληκτρολόγιο συμβόλων"</item>
- <item msgid="3664304608587798036">"Η φωνητική είσοδος είναι απενεργοποιημένη"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Αυτόματη υποβολή μετά από ήχο"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Πατήστε enter αυτόματα κατά την αναζήτηση ή τη μετάβαση στο επόμενο πεδίο."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Ανοίξτε το πληκτρολόγιο"\n</b></font><font size="3">\n</font>"Αγγίξτε οποιοδήποτε πεδίο κειμένου."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Κλείστε το πληκτρολόγιο"\n</b></font><font size="3">\n</font>"Πατήστε το πλήκτρο Πίσω."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Αγγίξτε και κρατήστε ένα πλήκτρο για ορισμό επιλογών"\n</b></font><font size="3">\n</font>"Πρόσβαση στα σημεία στίξης και τονισμού."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ρυθμίσεις πληκτρολογίου"\n</b></font><font size="3">\n</font>"Αγγίξτε και κρατήστε το πλήκτρο "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Στο κύριο πληκτρολ."</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Πληκτρ. συμβ. ενερ."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Απενεργοποίηση"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Μικ. στο κύριο πληκ."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Μικ. στο πληκ. συμβ."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Απεν. φωνητ. είσοδος"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Επιλογή μεθόδου εισόδου"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Ενεργοποίηση σχολίων χρηστών"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Βοηθήστε μας να βελτιώσουμε αυτό το πρόγραμμα επεξεργασίας μεθόδου εισόδου στέλνοντας αυτόματα στατιστικά στοιχεία και αναφορές σφαλμάτων στην Google."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Αγγίξτε για να διορθώσετε τις λέξεις"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Αγγίξτε τις λέξεις που έχετε εισαγάγει για να τις διορθώσετε, μόνο όταν είναι ορατές οι προτάσεις"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Αγγίξτε τις λέξεις που έχετε εισαγάγει για να τις διορθώσετε, μόνο όταν είναι ορατές οι προτάσεις"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Θέμα πληκτρολογίου"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"πληκτρολόγιο"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"φωνητική"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Πληκτρολόγιο με τσέχικους χαρακτήρες"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Πληκτρολόγιο με δανικούς χαρακτήρες"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Πληκτρολόγιο με γερμανικούς χαρακτήρες"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Πληκτρολόγιο με αγγλικούς χαρακτήρες (Η.Β.)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Πληκτρολόγιο με αγγλικούς χαρακτήρες (ΗΠΑ)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Πληκτρολόγιο με ισπανικούς χαρακτήρες"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Πληκτρολόγιο με ισπανικούς χαρακτήρες (Η.Π.Α.)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Πληκτρολόγιο με γαλλικούς χαρακτήρες"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Πληκτρολόγιο με γαλλικούς χαρακτήρες (Καναδά)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Πληκτρολόγιο με γαλλικούς χαρακτήρες (Σουηδίας)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Πληκτρολόγιο με ιταλικούς χαρακτήρες"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Πληκτρολόγιο με νορβηγικούς χαρακτήρες"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Πληκτρολόγιο με ολλανδικούς χαρακτήρες"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Πληκτρολόγιο με ρωσικούς χαρακτήρες"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Πληκτρολόγιο με σέρβικους χαρακτήρες"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Πληκτρολόγιο με σουηδικούς χαρακτήρες"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Τσεχικά"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Γερμανικά"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Ισπανικά"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Γαλλικά"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Ιαπωνικά"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Κορεατικά"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Πολωνικά"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Πορτογαλικά"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Ρωσικά"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Τουρκικά"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Λειτουργία μελέτης χρήσης"</string>
</resources>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 56d666a3c..6fd332998 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrate on key-press"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Sound on key-press"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pop-up on key press"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Correct typing errors"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Enable input error correction"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Landscape input errors"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Enable input error correction"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Word suggestions"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Automatically correct the previous word"</string>
- <string name="prediction" msgid="466220283138359837">"Word suggestions"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Word suggestion settings"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Enable auto-completion while typing"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Auto-completion"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Increase text field size"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Hide word suggestions in landscape view"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Word suggestion settings"</string>
<string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Capitalise the start of a sentence"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Auto-punctuate"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Quick fixes"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corrects commonly typed mistakes"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Show suggestions"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Display suggested words while typing"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Auto-complete"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Spacebar and punctuation automatically insert highlighted word"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Show suggestions"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Display suggested words while typing"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Always show"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Show on portrait mode"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Always hide"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Show settings key"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatic"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Always show"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Always hide"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Auto-correction"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Spacebar and punctuation insert highlighted word automatically"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modest"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressive"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram Suggestions"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Use previous word to improve suggestion"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"None"</item>
- <item msgid="1669461741568287396">"Basic"</item>
- <item msgid="4894328801530136615">"Advanced"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Saved"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Hold a key down to see accents (ø, ö, etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Press the back key ↶ to close the keyboard at any point"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Access numbers and symbols"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"press and hold the left-most word to add it to the dictionary"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Touch this hint to continue »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Touch here to close this hint and start typing!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"The keyboard opens any time you touch a text field"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Touch &amp; hold a key to view accents"\n"(ø, ö, ô, ó and so on)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Switch to numbers and symbols by touching this key"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Go back to letters by touching this key again"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Touch &amp; hold this key to change keyboard settings, like auto-complete"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Try it!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Go"</string>
<string name="label_next_key" msgid="362972844525672568">"Next"</string>
<string name="label_done_key" msgid="2441578748772529288">"Done"</string>
<string name="label_send_key" msgid="2815056534433717444">"Send"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"More"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Wait"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Voice input"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Voice input is not currently supported for your language, but does work in English."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Voice input is an experimental feature using Google\'s networked speech recognition."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"To turn off voice input, go to keyboard settings."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"To use voice input, press the microphone button or slide your finger across the on-screen keyboard."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Voice input uses Google\'s speech recognition. "<a href="http://m.google.com/privacy">"The Mobile Privacy Policy"</a>" applies."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"To turn off voice input, go to input method settings."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"To use voice input, press the microphone button."</string>
<string name="voice_listening" msgid="467518160751321844">"Speak now"</string>
<string name="voice_working" msgid="6666937792815731889">"Working"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Cancel"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Voice input"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"On main keyboard"</item>
- <item msgid="8529385602829095903">"On symbols keyboard"</item>
- <item msgid="7283103513488381103">"Off"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mic on main keyboard"</item>
- <item msgid="6907837061058876770">"Mic on symbols keyboard"</item>
- <item msgid="3664304608587798036">"Voice input is disabled"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Auto-submit after voice"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Automatically press enter when searching or going to the next field."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Open the keyboard"\n</b></font><font size="3">\n</font>"Touch any text field."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Close the keyboard"\n</b></font><font size="3">\n</font>"Press the Back key."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Touch &amp; hold a key for options"\n</b></font><font size="3">\n</font>"Access punctuation and accents."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Keyboard settings"\n</b></font><font size="3">\n</font>"Touch &amp; hold the "<b>"?123"</b>" key."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"On main keyboard"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"On symbols keyboard"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Off"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic on main keyboard"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic on symbols keyboard"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Voice input is disabled"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Select input method"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Input languages"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Slide finger on spacebar to change language"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Enable user feedback"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Help improve this input method editor by sending usage statistics and crash reports automatically to Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Touch to correct words"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Touch words entered to correct them"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Touch words entered to correct them, only when suggestions are visible"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Keyboard Theme"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"keyboard"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"voice"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Czech Keyboard"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danish Keyboard"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German Keyboard"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"English (UK) Keyboard"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"English (US) Keyboard"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish Keyboard"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spanish (US) Keyboard"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French Keyboard"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) Keyboard"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) Keyboard"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italian Keyboard"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegian Keyboard"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Dutch Keyboard"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russian Keyboard"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbian Keyboard"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Swedish Keyboard"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech Voice"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German Voice"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanish Voice"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"French Voice"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese Voice"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean Voice"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polish Voice"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portuguese Voice"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russian Voice"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkish Voice"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Usability Study Mode"</string>
</resources>
diff --git a/java/res/values-en/donottranslate-altchars.xml b/java/res/values-en/donottranslate-altchars.xml
index 083befa19..3950d7dff 100644
--- a/java/res/values-en/donottranslate-altchars.xml
+++ b/java/res/values-en/donottranslate-altchars.xml
@@ -18,10 +18,11 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåāæ</string>
- <string name="alternates_for_e">3èéêëē</string>
- <string name="alternates_for_i">ìíîïī8</string>
- <string name="alternates_for_o">òóôõöōœø9</string>
- <string name="alternates_for_u">ùúûüū7</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">à,á,â,ä,æ,ã,å,ā</string>
+ <string name="alternates_for_e">3,è,é,ê,ë,ē</string>
+ <string name="alternates_for_i">8,î,ï,í,ī,ì</string>
+ <string name="alternates_for_o">9,ô,ö,ò,ó,œ,ø,ō,õ</string>
+ <string name="alternates_for_u">7,û,ü,ù,ú,ū</string>
+ <string name="alternates_for_n">ñ</string>
+ <string name="alternates_for_c">ç</string>
</resources>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index 3abc8ded6..a44b6e194 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar teclas"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Sonar al pulsar las teclas"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Aviso emergente sobre keypress"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Corregir errores de escritura"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Habilitar corrección de error de entrada"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Errores de entrada apaisada"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Habilitar corrección de error de entrada"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Sugerencias de palabras"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Corregir automáticamente la palabra anterior"</string>
- <string name="prediction" msgid="466220283138359837">"Sugerencias de palabras"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Configuración de sugerencia de palabra"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Habilitar finalización automática al escribir"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Finalización automática"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar el tamaño del campo de texto"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugerencias de palabras en vista apaisada"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Configuración de sugerencia de palabra"</string>
<string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Poner en mayúscula el inicio de una oración"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Puntuación automática"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Arreglos rápidos"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige errores de escritura comunes"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Mostrar sugerencias"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Mostrar palabras sugeridas mientras escribe"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Completar automát."</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada."</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugerencias"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostrar palabras sugeridas al escribir"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar en modo retrato"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar siempre"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de configuración"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automático"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar siempre"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ocultar siempre"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Corrección automática"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada."</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivado"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderado"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Total"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Sugerencias de Vigoran"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utiliza la palabra anterior para mejorar la sugerencia"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Ninguno"</item>
- <item msgid="1669461741568287396">"Básico"</item>
- <item msgid="4894328801530136615">"Avanzado"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Mantén una tecla presionada para ver los acentos (ø, ö, etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Pulsa la tecla hacia atrás ↶ para cerrar el teclado en cualquier momento"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Acceder a números y símbolos"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Presiona y mantén presionada la palabra de la izquierda para agregarla al diccionario"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Toca esta sugerencia para continuar »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Toca aquí para cerrar esta sugerencia y comenzar a escribir."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"El teclado se abre cada vez que tocas un campo de texto."</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Toca y mantén presionada una tecla para ver los acentos"\n"(ø, ö, ô, ó, y así sucesivamente)."</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Cambia de números a símbolos tocando esta tecla."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Vuelve a letras tocando esta tecla nuevamente."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Toca y mantén presionada esta tecla para cambiar la configuración del teclado, como completar automáticamente."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"¡Pruébalo!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
<string name="label_next_key" msgid="362972844525672568">"Siguiente"</string>
<string name="label_done_key" msgid="2441578748772529288">"Hecho"</string>
<string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Más"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada por voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La entrada por voz no está admitida en tu idioma, pero sí funciona en inglés."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La entrada por voz es una característica experimental que utiliza la red de reconocimiento de voz de Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar la entrada por voz, ve a configuración del teclado."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para realizar entrada por voz, presiona el botón del micrófono o desliza tus dedos por el teclado en pantalla."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada de voz utiliza el reconocimiento de voz de Google. "<a href="http://m.google.com/privacy">"Aplica la Política de privacidad de Google para celulares"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la entrada por voz, ve a la configuración de métodos de entrada."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar entrada de voz, presiona el botón micrófono."</string>
<string name="voice_listening" msgid="467518160751321844">"Habla ahora"</string>
<string name="voice_working" msgid="6666937792815731889">"Procesando"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
<string name="ok" msgid="7898366843681727667">"Aceptar"</string>
<string name="voice_input" msgid="2466640768843347841">"Entrada por voz"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"En el teclado principal"</item>
- <item msgid="8529385602829095903">"En el teclado de símbolos"</item>
- <item msgid="7283103513488381103">"Apagado"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Micrófono en el teclado principal"</item>
- <item msgid="6907837061058876770">"Micrófono en el teclado de símbolos"</item>
- <item msgid="3664304608587798036">"La entrada por voz está inhabilitada."</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Enviar automáticamente después del audio"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Presionar automáticamente Ingresar al buscar o ir al campo siguiente."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Tocar cualquier campo de texto."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Cerrar el teclado"\n</b></font><font size="3">\n</font>"Presionar la tecla Atrás."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tocar &amp; y mantener presionada una tecla para las opciones"\n</b></font><font size="3">\n</font>"Acceder a puntuación y acentos."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configuración del teclado"\n</b></font><font size="3">\n</font>"Tocar &amp; y mantener presionada la tecla "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"En el teclado principal"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"En el teclado de símbolos"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivado"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micrófono en el teclado principal"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micrófono en el teclado de símbolos"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"La entrada por voz está inhabilitada"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de entrada"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Deslizarse manualmente por la barra espaciadora para cambiar el idioma"</string>
@@ -133,8 +92,40 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar los comentarios del usuario"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Ayuda a mejorar este editor de método de introducción de texto al enviar las estadísticas de uso y los informes de error a Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir palabras"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toca las palabras ingresadas que desees corregir"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca las palabras ingresadas que desees corregir, solo cuando las sugerencias estén visibles."</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema del teclado"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"Teclado"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"Voz"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado en checo"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado en danés"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado en alemán"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado en inglés (Reino Unido)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado en inglés (EE.UU.)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado en español"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclado en español (EE.UU.)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado en francés"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado en francés (Canadá)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado en francés (Suiza)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado en italiano"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado en noruego"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado en holandés"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado en ruso"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado en serbio"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado en sueco"</string>
+ <string name="subtype_mode_af_voice">"Voz en afrikáans"</string>
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz en checo"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz en alemán"</string>
+ <string name="subtype_mode_en_voice">"Voz en inglés"</string>
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz en español"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz en francés"</string>
+ <string name="subtype_mode_it_voice">"Voz en italiano"</string>
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz en japonés"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz en coreano"</string>
+ <string name="subtype_mode_nl_voice">"Voz en holandés"</string>
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz en polaco"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz en portugués"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz en ruso"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz en turco"</string>
+ <string name="subtype_mode_yue_voice">"Voz en chino, yue"</string>
+ <string name="subtype_mode_zh_voice">"Voz en chino, mandarín"</string>
+ <string name="subtype_mode_zu_voice">"Voz en isiZulu"</string>
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modo estudio de usabilidad"</string>
</resources>
diff --git a/java/res/values-es/donottranslate-altchars.xml b/java/res/values-es/donottranslate-altchars.xml
index 721062d2d..99f1663a1 100644
--- a/java/res/values-es/donottranslate-altchars.xml
+++ b/java/res/values-es/donottranslate-altchars.xml
@@ -18,13 +18,11 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">á</string>
- <string name="alternates_for_e">3é</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">ó9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">á,à,ä,â,ã,å,ą,æ,ā,ª</string>
+ <string name="alternates_for_e">3,é,è,ë,ê,ę,ė,ē</string>
+ <string name="alternates_for_i">8,í,ï,ì,î,į,ī</string>
+ <string name="alternates_for_o">9,ó,ò,ö,ô,õ,ø,œ,ō,º</string>
+ <string name="alternates_for_u">7,ú,ü,ù,û,ū</string>
+ <string name="alternates_for_n">ñ,ń</string>
+ <string name="alternates_for_c">ç,ć,č</string>
</resources>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index d39fbdf41..6e5679fd8 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar tecla"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Sonido al pulsar tecla"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup al pulsar tecla"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Corregir errores de escritura"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Habilitar la introducción de corrección de errores"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Errores de introducción de datos en vista horizontal"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Habilitar la introducción de corrección de errores"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Sugerencias de palabras"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Corregir automáticamente la palabra anterior"</string>
- <string name="prediction" msgid="466220283138359837">"Sugerencias de palabras"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Ajustes de sugerencia de palabras"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Habilitar Autocompletar al escribir"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autocompletar"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar el tamaño del campo de texto"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugerencias de palabras en la vista horizontal"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Ajustes de sugerencia de palabras"</string>
<string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Escribir en mayúscula el principio de la frase"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Puntuación automática"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Correcciones rápidas"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige los errores tipográficos que se cometen con más frecuencia."</string>
- <string name="show_suggestions" msgid="507074425254289133">"Mostrar sugerencias"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Muestra las palabras sugeridas mientras se escribe."</string>
- <string name="auto_complete" msgid="1103196318775486023">"Autocompletar"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada."</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugerencias"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Muestra las palabras sugeridas mientras se escribe."</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar en modo vertical"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar siempre"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de ajustes"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automáticamente"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar siempre"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ocultar siempre"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Autocorrección"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada."</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivada"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Parcial"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Total"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Sugerencias de bigramas"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Usar palabra anterior para mejorar sugerencias"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Ninguno"</item>
- <item msgid="1669461741568287396">"Básico"</item>
- <item msgid="4894328801530136615">"Avanzado"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Mantén pulsada una tecla para ver los caracteres acentuados (ø, ö, etc.)."</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Pulsa la tecla \"Atrás\" ↶ para cerrar el teclado en cualquier momento."</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Acceso a números y símbolos"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Mantén pulsada la palabra situada más a la izquierda para añadirla al diccionario."</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Toca esta sugerencia para continuar »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Toca aquí para cerrar la sugerencia y comenzar a escribir."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"El teclado se abre cada vez que tocas un campo de texto"</b>"."</string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Mantén pulsada una tecla para ver los caracteres acentuados"\n"(ø, ö, ô, ó, etc.)."</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Cambiar a números y a símbolos tocando esta tecla"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Volver a las letras tocando esta tecla de nuevo"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Mantén pulsada esta tecla para cambiar la configuración de teclado a, por ejemplo, autocompletar"</b>"."</string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"¡Pruébalo!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
<string name="label_next_key" msgid="362972844525672568">"Sig."</string>
<string name="label_done_key" msgid="2441578748772529288">"Listo"</string>
<string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Más"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Introducción de voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente la introducción de voz no está disponible en tu idioma, pero se puede utilizar en inglés."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La introducción de voz es una función en fase experimental que utiliza la tecnología de reconocimiento de voz en red de Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar la función de introducción de voz, accede a la configuración del teclado."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para utilizar la función de introducción de voz, pulsa el botón de micrófono o desliza el dedo por el teclado en pantalla."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La introducción de voz utiliza el reconocimiento de voz de Google. Se aplica la "<a href="http://m.google.com/privacy">"Política de privacidad de Google para móviles"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la función de introducción de voz, accede a la configuración del método de introducción de texto."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar la introducción de voz, pulsa el botón de micrófono."</string>
<string name="voice_listening" msgid="467518160751321844">"Habla ahora"</string>
<string name="voice_working" msgid="6666937792815731889">"En curso"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
<string name="ok" msgid="7898366843681727667">"Aceptar"</string>
<string name="voice_input" msgid="2466640768843347841">"Introducción de voz"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"En teclado principal"</item>
- <item msgid="8529385602829095903">"En teclado de símbolos"</item>
- <item msgid="7283103513488381103">"Desactivado"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Micrófono en teclado principal"</item>
- <item msgid="6907837061058876770">"Micrófono en teclado de símbolos"</item>
- <item msgid="3664304608587798036">"La función de introducción de voz no está habilitada."</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Enviar automáticamente después de la introducción de voz"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Pulsar Intro automáticamente al buscar o al pasar al siguiente campo"</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Toca cualquier campo de texto."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Cerrar el teclado"\n</b></font><font size="3">\n</font>"Pulsa la tecla \"Atrás\"."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Mantén pulsada una tecla para acceder a las opciones."\n</b></font><font size="3">\n</font>"Accede a los signos de puntuación y a los acentos."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ajustes del teclado"\n</b></font><font size="3">\n</font>"Mantén pulsada la tecla "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"En teclado principal"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"En teclado símbolos"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivada"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micro en tecl princ"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro en tecl símb"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entrada de voz inhab"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de introducción de texto"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Deslizar el dedo por la barra espaciadora para cambiar el idioma"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar comentarios de usuarios"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Ayuda a mejorar este editor de método de introducción de texto enviando estadísticas de uso e informes de error a Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tocar palabras introducidas para corregirlas"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca las palabras introducidas para corregirlas, solo cuando las sugerencias sean visibles."</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema de teclado"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclado"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"voz"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado checo"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado danés"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado alemán"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglés (Reino Unido)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado de inglés (EE.UU.)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado español"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclado en español (EE.UU.)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francés"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francés (Canadá)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francés (Suiza)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado noruego"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandés"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado ruso"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado serbio"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice en checo"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice en alemán"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Google Voice en español"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Google Voice en francés"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice en japonés"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice en coreano"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Google Voice en polaco"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Google Voice en portugués"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Google Voice en ruso"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Google Voice en turco"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modo de estudio de uso"</string>
</resources>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index cc4391a05..f55049e17 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"لرزش با فشار کلید"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"صدا با فشار کلید"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"بازشو با فشار کلید"</string>
- <string name="hit_correction" msgid="4855351009261318389">"تصحیح خطاهای تایپی"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"فعال کردن تصحیح خطای ورودی"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"خطاهای ورود افقی"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"فعال کردن تصحیح خطای ورودی"</string>
- <string name="auto_correction" msgid="7911639788808958255">"پیشنهادات کلمه"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"تصحیح خودکار کلمه قبلی"</string>
- <string name="prediction" msgid="466220283138359837">"پیشنهادات کلمه"</string>
- <string name="prediction_category" msgid="7027100625580696660">"تنظیمات پیشنهاد کلمه"</string>
- <string name="prediction_summary" msgid="459788228830873110">"فعال کردن تکمیل خودکار در حین تایپ"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"تکمیل خودکار"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"افزایش اندازه قسمت متنی"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"پنهان کردن پیشنهادات کلمه در نمای افقی"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"تنظیمات پیشنهاد کلمه"</string>
<string name="auto_cap" msgid="1719746674854628252">"نوشتن با حروف بزرگ خودکار"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"بزرگ کردن اول هر جمله"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"نشان گذاری خودکار"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"راه حل های سریع"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"تصحیح خطاهای تایپی رایج"</string>
- <string name="show_suggestions" msgid="507074425254289133">"نمایش پیشنهادات"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"نمایش واژه های پیشنهادی در حین تایپ"</string>
- <string name="auto_complete" msgid="1103196318775486023">"تکمیل خودکار"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"کلید خط فاصله و علائم نگارشی به صورت خودکار کلمه برجسته شده را وارد می کنند."</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"نمایش پیشنهادات"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"نمایش واژه های پیشنهادی در حین تایپ"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"همیشه نمایش"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"نمایش در حالت عمودی"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"همیشه پنهان"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"نمایش کلید تنظیمات"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"خودکار"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"همیشه نمایش"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"همیشه پنهان"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"تصحیح خودکار"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"کلید خط فاصله و علائم نگارشی به صورت خودکار کلمه برجسته شده را وارد می کنند"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"خاموش"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"متوسط"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"فعال"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"توضیحات بیگرام"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"برای بهبود پیشنهاد از کلمه قبلی استفاده شود"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"هیچکدام"</item>
- <item msgid="1669461741568287396">"پایه"</item>
- <item msgid="4894328801530136615">"پیشرفته"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ذخیره شد"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"برای مشاهده علائم تکیه (ø، ö و موارد دیگر) کلیدی را پایین نگه دارید"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"برای بستن صفحه کلید در هر نقطه که بخواهید، کلید برگشت ↶ را فشار دهید"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"دسترسی به اعداد و نمادها"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"انتهای سمت چپ واژه را برای افزودن آن به فرهنگ لغت فشار داده و نگه دارید"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"این نکته را برای ادامه لمس کنید »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"برای بستن این نکته و شروع تایپ، اینجا را لمس کنید!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"هر زمان که قسمت متنی را لمس می کنید، صفحه کلید باز می شود"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"یک کلید را برای مشاهده تکیه های صدا لمس کرده و نگه دارید (ø، ö، ô، ó و موارد دیگر)"\n</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"تغییر شماره ها و نمادها با لمس این کلید"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"با لمس مجدد این کلید، به حروف برگردید"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"این کلید را برای تغییر تنظیمات صفحه کلید مانند تکمیل خودکار لمس کرده و فشار دهید"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"امتحان کنید!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"برو"</string>
<string name="label_next_key" msgid="362972844525672568">"بعدی"</string>
<string name="label_done_key" msgid="2441578748772529288">"انجام شد"</string>
<string name="label_send_key" msgid="2815056534433717444">"ارسال"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"بیشتر"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"توقف موقت"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"منتظر بمانید"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"ورودی صوتی"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ورودی صوتی در حال حاضر برای زبان شما پشتیبانی نمی شود اما برای زبان انگلیسی فعال است."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"ورودی صوتی یک ویژگی آزمایشی با استفاده از تشخیص گفتار شبکه Google است."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"برای خاموش کردن ورودی صدا، به تنظیمات صفحه کلید بروید."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"برای استفاده از ورودی صوتی، دکمه میکروفن را فشار دهید یا انگشت خود را روی صفحه کلید روی صفحه حرکت دهید."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ورودی صوتی از ویژگی تشخیص صدای Google استفاده می کند. "<a href="http://m.google.com/privacy">"خط مشی رازداری تلفن همراه"</a>" اعمال می شود."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"برای خاموش کردن ورودی صدا، به تنظیمات روش ورودی بروید."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"برای استفاده از ورودی صوتی، دکمه میکروفن را فشار دهید."</string>
<string name="voice_listening" msgid="467518160751321844">"اکنون صحبت کنید"</string>
<string name="voice_working" msgid="6666937792815731889">"در حال کار"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"لغو"</string>
<string name="ok" msgid="7898366843681727667">"تأیید"</string>
<string name="voice_input" msgid="2466640768843347841">"ورودی صوتی"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"در صفحه کلید اصلی"</item>
- <item msgid="8529385602829095903">"در صفحه کلید نمادها"</item>
- <item msgid="7283103513488381103">"خاموش"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"میکروفن در صفحه کلید اصلی"</item>
- <item msgid="6907837061058876770">"میکروفن در صفحه کلید نمادها"</item>
- <item msgid="3664304608587798036">"ورودی صوتی غیر فعال شده است"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"ارائه خودکار بعد از صدا"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"هنگام جستجو یا رفتن به قسمت بعدی، Enter را به صورت خودکار فشار دهید."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"صفحه کلید را باز کنید"\n</b></font><font size="3">\n</font>"هر قسمت متنی را لمس کنید."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"بستن صفحه کلید"\n</b></font><font size="3">\n</font>"کلید برگشت را فشار دهید."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"یک کلید را برای گزینه های"\n</b></font><font size="3">\n</font>" دسترسی به علائم نگارشی و تکیه های صدا لمس کرده و نگه دارید."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"تنظیمات صفحه کلید"\n</b></font><font size="3">\n</font>"کلید "<b>"?123"</b>" را لمس کرده و نگهدارید."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"در صفحه کلید اصلی"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"در صفحه کلید نمادها"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"خاموش"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"میکروفن در صفحه کلید اصلی"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"میکروفن در صفحه کلید نمادها"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ورودی صدا غیرفعال است"</string>
<string name="selectInputMethod" msgid="315076553378705821">"انتخاب روش ورودی"</string>
<string name="language_selection_title" msgid="1651299598555326750">"زبان های ورودی"</string>
<string name="language_selection_summary" msgid="187110938289512256">"برای تغییر زبان انگشت را روی کلید فاصله بلغزانید"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"فعال کردن بازخورد کاربر"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"با ارسال خودکار آمارهای کاربرد و گزارش های خرابی به Google، به بهبود این ویرایشگر روش ورودی کمک کنید."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"برای تصحیح کلمات لمس کنید"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"برای تصحیح کلمات وارد شده آنها را لمس کنید"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"فقط زمانی که پیشنهادها قابل مشاهده هستند، کلمات وارد شده را برای تصحیح آنها لمس کنید"</string>
<string name="keyboard_layout" msgid="437433231038683666">"طرح زمینه صفحه کلید"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"صفحه کلید"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"صوتی"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"صفحه کلید چک"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"صفحه کلید دانمارکی"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"صفحه کلید آلمانی"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"صفح کلید انگلیسی (انگلستان)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"صفحه کلید انگلیسی (آمریکا)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"صفحه کلید اسپانیایی"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"صفحه کلید اسپانیایی (آمریکایی)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"صفحه کلید فرانسوی"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"صفحه کلید فرانسوی (کانادایی)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"صفحه کلید فرانسوی (سوییس)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"صفحه کلید ایتالیایی"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"صفحه کلید نروژی"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"صفحه کلید هلندی"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"صفحه کلید روسی"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"صفحه کلید صربی"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"صفحه کلید سوئدی"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صدای چک"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صدای آلمانی"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"صدای اسپانیایی"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"صدای فرانسوی"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"صدای ژاپنی"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"صدای کره ای"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"صدای لهستانی"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"صدای پرتغالی"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"صدای روسی"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"صدای ترکی"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"حالت بررسی قابلیت استفاده"</string>
</resources>
diff --git a/java/res/values-ko/donottranslate-altchars.xml b/java/res/values-fi/donottranslate-altchars.xml
index d3beafade..ff87a3258 100644
--- a/java/res/values-ko/donottranslate-altchars.xml
+++ b/java/res/values-fi/donottranslate-altchars.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -18,13 +18,13 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òóôõöœø9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">æ,à,á,â,ã,ā</string>
+ <string name="alternates_for_o">9,ø,ô,ò,ó,õ,œ,ō</string>
+ <string name="alternates_for_u">7,ü</string>
+ <string name="alternates_for_s">š,ß,ś</string>
+ <string name="alternates_for_z">ž,ź,ż</string>
+ <string name="keylabel_for_scandinavia_row2_10">ö</string>
+ <string name="keylabel_for_scandinavia_row2_11">ä</string>
+ <string name="alternates_for_scandinavia_row2_10">ø</string>
+ <string name="alternates_for_scandinavia_row2_11">æ</string>
</resources>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index 3c36a632e..df17332c4 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Käytä värinää näppäimiä painettaessa"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Toista ääni näppäimiä painettaessa"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Ponnahdusikkuna painalluksella"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Korjaa kirjoitusvirheet"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Ota syöttövirheen korjaus käyttöön"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Vaakasuunnan syöttövirheet"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Ota syöttövirheen korjaus käyttöön"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Sanaehdotukset"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Korjaa edellinen sana automaattisesti"</string>
- <string name="prediction" msgid="466220283138359837">"Sanaehdotukset"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Sanaehdotusasetukset"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Ota automaattinen täydennys käyttöön kirjoitettaessa"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automaattinen täydennys"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Suurenna tekstikenttää"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Piilota sanaehdotukset vaakasuuntaisessa näkymässä"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Sanaehdotusasetukset"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automaattiset isot kirjaimet"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Aloittaa lauseet isolla kirjaimella"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automaattiset välimerkit"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Pikakorjaukset"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Korjaa yleiset kirjoitusvirheet"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Näytä ehdotukset"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Näytä sanaehdotukset kirjoitettaessa"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Automaattinen täydennys"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Välilyönti ja välimerkki lisäävät automaattisesti korostetun sanan"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Näytä ehdotukset"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Näytä sanaehdotukset kirjoitettaessa"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Näytä aina"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Näytä pystysuunnassa"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Piilota aina"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Näytä asetukset-näppäin"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automaattinen"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Näytä aina"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Piilota aina"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Autom. korjaus"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Välilyönti ja välimerkki lisäävät automaattisesti korostetun sanan"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Älä käytä"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Osittainen"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Täysi"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram-ehdotukset"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Paranna ehdotusta aiemman sanan avulla"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Ei mitään"</item>
- <item msgid="1669461741568287396">"Tavallinen"</item>
- <item msgid="4894328801530136615">"Edistynyt"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Tallennettu"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Näet aksenttimerkit (ø, ö jne.) pitämällä näppäintä painettuna."</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Voit sulkea näppäimistön milloin tahansa painamalla Takaisin-painiketta ↶"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Käytä numeroita ja symboleita"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Lisää vasemmanpuoleinen sana sanakirjaan pitämällä sitä painettuna"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Jatka koskettamalla tätä vihjettä »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Sulje tämä vihje ja aloita kirjoittaa koskettamalla tätä!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Näppäimistö avautuu, kun kosketat tekstikenttää"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Näytä aksenttimerkit pitämällä näppäintä painettuna"\n"(ø, ö, ô, ó ja niin edelleen"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Vaihda numeroihin ja symboleihin koskettamalla tätä näppäintä"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Siirry takaisin kirjaimiin koskettamalla tätä näppäintä uudelleen"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Muuta näppäimistön asetuksia, kuten automaattista täydentämistä, pitämällä tätä näppäintä painettuna"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Kokeile!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Siirry"</string>
<string name="label_next_key" msgid="362972844525672568">"Seuraava"</string>
<string name="label_done_key" msgid="2441578748772529288">"Valmis"</string>
<string name="label_send_key" msgid="2815056534433717444">"Lähetä"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Lisää"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Tauko"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Odota"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Äänisyöte"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Äänisyötettä ei vielä tueta kielelläsi, mutta voit käyttää sitä englanniksi."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Äänisyöte on kokeellinen Googlen puheentunnistusta käyttävä ominaisuus."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Siirry näppäimistön asetuksiin poistaaksesi äänisyötteen käytöstä."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Käytä äänisyötettä painamalla mikrofonipainiketta tai liu\'uttamalla sormeasi näytön näppäimistön poikki."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Äänisyöte käyttää Googlen puheentunnistusta, ja siihen sovelletaan "<a href="http://m.google.com/privacy">"mobiilitietosuojakäytäntöä"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Siirry syöttötavan asetuksiin, jos haluat poistaa äänisyötteen käytöstä."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Voit käyttää äänisyötettä painamalla mikrofonipainiketta."</string>
<string name="voice_listening" msgid="467518160751321844">"Puhu nyt"</string>
<string name="voice_working" msgid="6666937792815731889">"Työstetään"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Peruuta"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Äänisyöte"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Päänäppäimistössä"</item>
- <item msgid="8529385602829095903">"Symbolinäppäimistössä"</item>
- <item msgid="7283103513488381103">"Pois käytöstä"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Päänäppäimistön mikrofoni"</item>
- <item msgid="6907837061058876770">"Symbolinäppäimistön mikrofoni"</item>
- <item msgid="3664304608587798036">"Äänisyöte ei ole käytössä"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Lähetä automaattisesti puheen jälkeen"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Paina automaattisesti enter-näppäintä tehdessäsi hakuja tai siirtyessäsi seuraavaan kenttään."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Avaa näppäimistö"\n</b></font><font size="3">\n</font>"Kosketa tekstikenttää."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Sulje näppäimistö"\n</b></font><font size="3">\n</font>"Paina Takaisin-näppäintä."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Näet asetukset pitämällä näppäintä painettuna"\n</b></font><font size="3">\n</font>"Käytä välimerkkejä ja aksenttimerkkejä."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Näppäimistön asetukset"\n</b></font><font size="3">\n</font>"Pidä painettuna"<b>"?123"</b>"-näppäintä."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Päänäppäimistössä"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Symbolinäppäimistössä"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Älä näytä"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr. päänäppäim."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. symbolinäppäim."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Ääniohjaus on pois käytöstä"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Valitse syöttötapa"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Syöttökielet"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Vaihda kieltä liu\'uttamalla sormea välilyöntinäppäimellä"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Ota käyttäjäpalaute käyttöön"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Auta parantamaan tätä syöttötavan muokkausohjelmaa lähettämällä automaattisesti käyttötietoja ja kaatumisraportteja Googlelle."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Korjaa sanoja koskettamalla"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Korjaa sanoja koskettamalla niitä"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Kun sanalle on näkyvissä korjausehdotus, voit hyväksyä sen koskettamalla sitä."</string>
<string name="keyboard_layout" msgid="437433231038683666">"Näppäimistön teema"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"näppäimistö"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"ääni"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Näppäimistö: tšekki"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Näppäimistö: tanska"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Näppäimistö: saksa"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Näppäimistö: englanti (Iso-Britannia)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Näppäimistö: englanti (Yhdysvallat)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Näppäimistö: espanja"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Näppäimistö: espanja (Yhdysvallat)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Näppäimistö: ranska"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Näppäimistö: ranska (Kanada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Näppäimistö: ranska (Sveitsi)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Näppäimistö: italia"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Näppäimistö: norja"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Näppäimistö: hollanti"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Näppäimistö: venäjä"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Näppäimistö: serbia"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Näppäimistö: ruotsi"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Ääni: tšekki"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Ääni: saksa"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Ääni: espanja"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Ääni: ranska"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Ääni: japani"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Ääni: korea"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Ääni: puola"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Ääni: portugali"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Ääni: venäjä"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Ääni: turkki"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Käytettävyydentutkimistila"</string>
</resources>
diff --git a/java/res/values-fr/donottranslate-altchars.xml b/java/res/values-fr/donottranslate-altchars.xml
index 874d89dab..e01f63f14 100644
--- a/java/res/values-fr/donottranslate-altchars.xml
+++ b/java/res/values-fr/donottranslate-altchars.xml
@@ -18,15 +18,13 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">1àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òóôõöœø9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">1,à,â,æ,á,ä,ã,å,ā,ª</string>
+ <string name="alternates_for_e">3,é,è,ê,ë,ę,ė,ē</string>
+ <string name="alternates_for_i">8,î,ï,ì,í,į,ī</string>
+ <string name="alternates_for_o">9,ô,œ,ö,ò,ó,õ,ø,ō,º</string>
+ <string name="alternates_for_u">7,û,ù,ü,ú,ū</string>
+ <string name="alternates_for_c">ç,ć,č</string>
+ <string name="alternates_for_y">6,ÿ</string>
<string name="alternates_for_q"></string>
<string name="alternates_for_w"></string>
<string name="alternates_for_z">2</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index f8f4bac09..855d6a1e1 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer à chaque touche"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Son à chaque touche"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Agrandir les caractères à chaque touche"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Corriger les fautes de frappe"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Activer la correction des erreurs de saisie"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Erreurs de saisie en mode paysage"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activer la correction des erreurs de saisie"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Saisie prédictive"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Corriger automatiquement le mot précédent"</string>
- <string name="prediction" msgid="466220283138359837">"Saisie prédictive"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Paramètres de la saisie prédictive"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Activer la saisie semi-automatique"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Saisie semi-automatique"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Agrandir le champ de texte"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Masquer la saisie prédictive en mode paysage"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Paramètres de la saisie prédictive"</string>
<string name="auto_cap" msgid="1719746674854628252">"Majuscules auto"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Mettre en majuscule la première lettre de chaque phrase"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Ponctuation automatique"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Corrections rapides"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige les fautes de frappe courantes"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Afficher les suggestions"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Afficher les suggestions de terme lors de la saisie"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Saisie semi-automatique"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Insérer auto. le terme surligné avec barre espace/ponctuation"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Afficher les suggestions"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Afficher les suggestions de terme lors de la saisie"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Toujours afficher"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afficher en mode Portrait"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Toujours masquer"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Afficher la touche des paramètres"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatique"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Toujours afficher"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Toujours masquer"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Correction auto."</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"La barre d\'espace et les signes de ponctuation permettent d\'insérer automatiquement le mot surligné."</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Désactiver"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Simple"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Proactive"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Suggestions de type bigramme"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Améliorer la suggestion en fonction du mot précédent"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Aucun"</item>
- <item msgid="1669461741568287396">"Simple"</item>
- <item msgid="4894328801530136615">"Avancé"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : enregistré"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Maintenir une touche enfoncée pour afficher les accents (à, é, etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Appuyez sur la touche Retour ↶ pour fermer le clavier à tout moment."</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Accéder aux chiffres et symboles"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Appuyer et maintenir le doigt sur le mot le plus à gauche pour l\'ajouter au dictionnaire"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Touchez ce conseil pour continuer »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Touchez ici pour fermer ce conseil et commencer à saisir votre texte."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Le clavier s\'affiche à chaque fois que vous touchez une zone de texte."</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Maintenez une touche enfoncée pour afficher les accents"\n"(ø, ö, ô, ó, etc.)"</b>"."</string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Appuyez sur cette touche pour basculer vers les chiffres et les symboles."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Appuyez de nouveau sur cette touche pour retourner aux lettres."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Maintenez cette touche enfoncée afin de modifier les paramètres du clavier, tels que la saisie semi-automatique."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Essayez !"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"OK"</string>
<string name="label_next_key" msgid="362972844525672568">"Suivant"</string>
<string name="label_done_key" msgid="2441578748772529288">"OK"</string>
<string name="label_send_key" msgid="2815056534433717444">"Envoyer"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Plus"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Attente"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Saisie vocale"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La saisie vocale n\'est pas encore prise en charge pour votre langue, mais elle fonctionne en anglais."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La saisie vocale est une fonctionnalité expérimentale qui fait appel à la reconnaissance vocale en réseau de Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Pour désactiver la saisie vocale, accédez aux paramètres du clavier."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Pour utiliser la saisie vocale, appuyez sur la touche du microphone ou faites glisser votre doigt sur le clavier à l\'écran."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La saisie vocale utilise la technologie de reconnaissance vocale de Google. Les "<a href="http://m.google.com/privacy">"règles de confidentialité de Google Mobile"</a>" s\'appliquent."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Pour désactiver la saisie vocale, accédez aux paramètres du mode de saisie."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Pour utiliser la saisie vocale, appuyez sur le bouton représentant un microphone."</string>
<string name="voice_listening" msgid="467518160751321844">"Parlez maintenant"</string>
<string name="voice_working" msgid="6666937792815731889">"Traitement en cours"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Annuler"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Saisie vocale"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Sur le clavier principal"</item>
- <item msgid="8529385602829095903">"Sur le clavier des symboles"</item>
- <item msgid="7283103513488381103">"Désactivée"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Micro sur le clavier principal"</item>
- <item msgid="6907837061058876770">"Micro sur le clavier des symboles"</item>
- <item msgid="3664304608587798036">"Saisie vocale désactivée"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Envoi automatique après la saisie vocale"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Appuyez automatiquement sur Entrée pour effectuer une recherche ou accéder au champ suivant."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Ouvrir le clavier"\n</b></font><font size="3">\n</font>"Appuyez sur un champ de texte."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Fermer le clavier"\n</b></font><font size="3">\n</font>"Appuyez sur la touche Retour."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Appuyez sur une touche de manière prolongée pour accéder aux options"\n</b></font><font size="3">\n</font>"Accédez aux signes de ponctuation et aux accents."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Paramètres du clavier"\n</b></font><font size="3">\n</font>"Appuyez sur la touche "<b>"?123"</b>" de manière prolongée."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gouv"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Sur clavier principal"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sur clavier symboles"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Désactiver"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micro clavier principal"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro sur clavier symboles"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Saisie vocale désactivée"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Sélectionner un mode de saisie."</string>
<string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Faites glisser votre doigt sur la barre d\'espacement pour changer la langue."</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Autoriser les commentaires des utilisateurs"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'incident à Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Appuyer pour corriger les suggestions"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Appuyer sur les mots saisis pour les corriger"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Appuyer sur les mots saisis pour les modifier, uniquement lorsque les suggestions sont visibles"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Thème du clavier"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"clavier"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"voix"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Clavier tchèque"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Clavier danois"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Clavier allemand"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Clavier anglais (Royaume-Uni)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Clavier anglais (États-Unis)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Clavier espagnol"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Clavier espagnol (États-Unis)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Clavier français"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Clavier français (Canada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Clavier français (Suisse)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Clavier italien"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Clavier norvégien"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Clavier néerlandais"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Clavier russe"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Clavier serbe"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Clavier suédois"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voix parlant tchèque"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voix parlant allemand"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voix parlant espagnol"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voix parlant français"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voix parlant japonais"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voix parlant coréen"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voix parlant polonais"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voix parlant portugais"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voix parlant russe"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voix parlant turc"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mode Étude de l\'utilisation"</string>
</resources>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index 82d66168f..48a9019bd 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibracija pri pritisku na tipku"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk pri pritisku tipke"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Povećanja na pritisak tipke"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Ispravi pogreške u pisanju"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Omogućavanje ispravka pogreške pri unosu"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Pogreške pri pejzažnom unosu"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Omogućavanje ispravka pogreške pri unosu"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Prijedlozi riječi"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Automatsko ispravljanje prethodne riječi"</string>
- <string name="prediction" msgid="466220283138359837">"Prijedlozi riječi"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Postavke prijedloga riječi"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Omogućavanje automatskog dovršavanja pri upisivanju"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatsko dovršavanje"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Povećaj tekstualno polje"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Sakrij prijedloge riječi u pejzažnom prikazu"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Postavke prijedloga riječi"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automatsko pisanje velikih slova"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Stavi veliko slovo na početku rečenice"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatsko stavljanje interpunkcije"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Brzi popravci"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Ispravlja uobičajene pogreške u pisanju"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Pokaži prijedloge"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Prikazivanje predloženih riječi prilikom upisivanja"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Automatsko dovršavanje"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Razmaknica i interpunkcija automatski umeću istaknutu riječ"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokaži prijedloge"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Prikazivanje predloženih riječi prilikom upisivanja"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Uvijek prikaži"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Prikaži u portretnom načinu"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Uvijek sakrij"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Prikaži tipku postavki"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatski"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Uvijek prikaži"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Uvijek sakrij"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Autoispravak"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Razmaknica i interpunkcija automatski umeću istaknutu riječ"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Isključeno"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Skromno"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivno"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram prijedlozi"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Upotrijebi prethodnu riječ radi poboljšanja prijedloga"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Nijedan"</item>
- <item msgid="1669461741568287396">"Osnovni"</item>
- <item msgid="4894328801530136615">"Napredno"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Spremljeno"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Pritisnite i držite tipku da biste vidjeli naglaske (ø, ö itd.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Pritisnite tipku \"Natrag\" ↶ za zatvaranje tipkovnice"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Pristup brojevima i simbolima"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pritisnite i držite krajnju lijevu riječ da biste je dodali u rječnik."</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Dodirnite ovaj savjet za nastavak »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Dodirnite ovdje da biste zatvorili savjet i počeli upisivati!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tipkovnica se otvara svaki put kada dodirnete tekstualno polje"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Dodirnite i držite tipku da biste vidjeli naglaske"\n"(ø, ö, ô, ó i tako dalje)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Prijeđite na brojeve i simbole dodirom na ovu tipku"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Dodirnite ponovo ovu tipku za povratak na slova"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Dodirnite i držite ovu tipku da biste promijenili postavke tipkovnice, poput automatskog dovršavanja"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Isprobajte!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Idi"</string>
<string name="label_next_key" msgid="362972844525672568">"Dalje"</string>
<string name="label_done_key" msgid="2441578748772529288">"Gotovo"</string>
<string name="label_send_key" msgid="2815056534433717444">"Pošalji"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Više"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Pričekaj"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Glasovni unos"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Vaš jezik trenutno nije podržan za glasovni unos, ali radi za engleski."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Glasovni unos je pokusna značajka koja koristi Googleovo umreženo prepoznavanje govora."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Za isključivanje glasovnog unosa idite na postavke tipkovnice."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Da biste koristili glasovni unos pritisnite gumb mikrofona ili kliznite prstom preko tipkovnice na zaslonu."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni unos upotrebljava Googleovo prepoznavanje govora. Primjenjuju se "<a href="http://m.google.com/privacy">"Pravila o privatnosti za Mobile"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Za isključivanje glasovnog unosa idite na postavke načina unosa."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Da biste upotrijebili glasovni unos, pritisnite gumb mikrofona."</string>
<string name="voice_listening" msgid="467518160751321844">"Govorite sad"</string>
<string name="voice_working" msgid="6666937792815731889">"Obrada"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Odustani"</string>
<string name="ok" msgid="7898366843681727667">"U redu"</string>
<string name="voice_input" msgid="2466640768843347841">"Glasovni unos"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Na glavnoj tipkovnici"</item>
- <item msgid="8529385602829095903">"Na tipkovnici sa simbolima"</item>
- <item msgid="7283103513488381103">"Isključeno"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofon na glavnoj tipkovnici"</item>
- <item msgid="6907837061058876770">"Mikrofon na tipkovnici sa simbolima"</item>
- <item msgid="3664304608587798036">"Glasovni unos je onemogućen"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Automatski pošalji nakon glasovnog unosa"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Automatski se pritišće \"Enter\" kad pretražujete ili idete na sljedeće polje."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otvaranje tipkovnice"\n</b></font><font size="3">\n</font>"Dodirnite bilo koje tekstualno polje"</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zatvaranje tipkovnice"\n</b></font><font size="3">\n</font>"Pritisnite tipku \"Natrag\"."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Dodirnite i držite tipku da biste vidjeli opcije"\n</b></font><font size="3">\n</font>"Pristup interpunkciji i naglascima."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Postavke tipkovnice"\n</b></font><font size="3">\n</font>"Dodirnite i držite tipku "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na glavnoj tipkovnici"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na tipkovnici simb."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Isključeno"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik. na gl. tipk."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. na tipk. simb."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. unos onemog."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Odabir ulazne metode"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Jezici unosa"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Kliznite prstom po razmaknici za promjenu jezika"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Omogući korisničke povratne informacije"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Pomozite u poboljšanju ovog urednika ulazne metode automatskim slanjem statistike upotrebe i padova Googleu."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dodirnite za ispravak riječi"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dodirnite unesene riječi radi ispravka"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dodirnite unesene riječi radi ispravka, samo kad se prikazuju prijedlozi"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema tipkovnice"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tipkovnica"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"glas"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Češka tipkovnica"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danska tipkovnica"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Njemačka tipkovnica"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engleska (UK) tipkovnica"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engleska (SAD) tipkovnica"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španjolska tipkovnica"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Španjolska (SAD) tipkovnica"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francuska tipkovnica"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francuska (Kanada) tipkovnica"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francuska (Švicarska) tipkovnica"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Talijanska tipkovnica"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveška tipkovnica"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nizozemska tipkovnica"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ruska tipkovnica"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Srpska tipkovnica"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švedska tipkovnica"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Češki glas"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Njemački glas"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Španjolski glas"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francuski glas"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanski glas"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korejski glas"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Poljski glas"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugalski glas"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Ruski glas"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turski glas"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Način studije upotrebljivosti"</string>
</resources>
diff --git a/java/res/values-el/donottranslate-altchars.xml b/java/res/values-hu/donottranslate-altchars.xml
index d3beafade..ae28cc5b8 100644
--- a/java/res/values-el/donottranslate-altchars.xml
+++ b/java/res/values-hu/donottranslate-altchars.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -18,13 +18,11 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òóôõöœø9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">á,à,â,ä,æ,ã,å,ā</string>
+ <string name="alternates_for_e">3,é,è,ê,ë,ę,ė,ē</string>
+ <string name="alternates_for_i">8,í,î,ï,ì,į,ī</string>
+ <string name="alternates_for_o">9,ó,ö,ő,ô,ò,õ,œ,ø,ō</string>
+ <string name="alternates_for_u">7,ú,ü,ű,û,ù,ū</string>
+ <string name="alternates_for_y"></string>
+ <string name="alternates_for_z">6</string>
</resources>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index 7c2f2164f..a22e436cb 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Rezgés billentyű megnyomása esetén"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Hangjelzés billentyű megnyomása esetén"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Legyen nagyobb billentyű lenyomásakor"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Gépelési hibák kijavítása"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Beviteli hibák javításának engedélyezése"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Fekvő beviteli hibák"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Beviteli hibák javításának engedélyezése"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Szójavaslatok"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Az előző szó automatikus kijavítása"</string>
- <string name="prediction" msgid="466220283138359837">"Szójavaslatok"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Szójavaslati beállítások"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Automatikus kiegészítés engedélyezése gépelés közben"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatikus kiegészítés"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"A szövegmező méretének növelése"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Szójavaslatok elrejtése fekvő nézetben"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Szójavaslati beállítások"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automatikusan nagy kezdőbetű"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Nagybetűvel kezdi a mondatot"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatikus központozás"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Gyorsjavítások"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Kijavítja a gyakori gépelési hibákat"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Javaslatok megjelenítése"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"A javasolt szavak megjelenítése gépelés közben"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Automatikus kiegészítés"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"A szóköz és az írásjelek használata automatikusan beszúrja a kiemelt szót"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Javaslatok megjelenítése"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"A javasolt szavak megjelenítése gépelés közben"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mindig látszik"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Megjelenítés portré módban"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Mindig rejtve"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Beállítások billentyű megjelenítése"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatikus"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mindig látszik"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Mindig rejtve"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Automatikus javítás"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"A szóköz és az írásjelek használata automatikusan beszúrja a kiemelt szót"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Ki"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mérsékelt"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresszív"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram javaslatok"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Előző szó használata a javaslatok javításához"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Nincs"</item>
- <item msgid="1669461741568287396">"Alap"</item>
- <item msgid="4894328801530136615">"Speciális"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : mentve"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Az ékezetes betűk megtekintéséhez tartsa lenyomva valamelyik billentyűt (ø, ö stb.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"A vissza gomb ↶ megnyomásával bármikor elrejtheti a billentyűzetet"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Számok és szimbólumok elérése"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"A szótárhoz történő hozzáadásához nyomja meg hosszan a bal oldali legszélső szót"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"A folytatáshoz érintse meg ezt a tippet »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Érintse meg itt a tipp bezárásához és a gépelés megkezdéséhez."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Szövegmező megérintésekor a billentyűzet mindig megjelenik"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Érintse meg és tartsa lenyomva valamelyik billentyűt az ékezetes betűk megtekintéséhez"\n"(ø, ö, ô, ó stb.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Számokra és szimbólumokra ennek a billentyűnek a megérintésével válthat"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"A billentyű újbóli megérintésével visszatérhet a betűkhöz"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Érintse meg és tartsa lenyomva ezt a billentyűt a billentyűzet-beállítások (pl. az automatikus kiegészítés) módosításához"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Próbálja ki!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Ugrás"</string>
<string name="label_next_key" msgid="362972844525672568">"Tovább"</string>
<string name="label_done_key" msgid="2441578748772529288">"Kész"</string>
<string name="label_send_key" msgid="2815056534433717444">"Küldés"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Egyebek"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Szün."</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Vár"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Hangbevitel"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A hangbevitel szolgáltatás jelenleg nem támogatja az Ön nyelvét, ám angolul működik."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A hangbevitel a Google hálózati beszédfelismerését alkalmazó kísérleti funkció."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"A hangbevitelt a billentyűzet beállításai között lehet kikapcsolni."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"A hangbevitel használatához nyomja meg a mikrofon gombját vagy húzza végig az ujját a képernyő-billentyűzeten."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A hangbevitel a Google beszédfelismerését használja. A "<a href="http://m.google.com/privacy">"mobil adatvédelmi irányelvek"</a>" érvényesek."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"A hangbevitelt a bemeneti módok beállításai között lehet kikapcsolni."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"A hangbemenet használatához nyomja meg a mikrofongombot."</string>
<string name="voice_listening" msgid="467518160751321844">"Most beszéljen"</string>
<string name="voice_working" msgid="6666937792815731889">"Feldolgozás"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Mégse"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Hangbevitel"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Főbillentyűzeten"</item>
- <item msgid="8529385602829095903">"Szimbólumbillentyűzeten"</item>
- <item msgid="7283103513488381103">"Ki"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofon a főbillentyűzeten"</item>
- <item msgid="6907837061058876770">"Mikrofon a szimbólumbillentyűzeten"</item>
- <item msgid="3664304608587798036">"A hangbevitel ki van kapcsolva"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Automatikus küldés a beszéd után"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Az Enter automatikus megnyomása keresés vagy a következő mezőre ugrás során."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"A billentyűzet megjelenítése"\n</b></font><font size="3">\n</font>"Érintse meg valamelyik szövegmezőt."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"A billentyűzet bezárása"\n</b></font><font size="3">\n</font>"Nyomja meg a Vissza billentyűt."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"A lehetőségek megjelenítéséhez érintse meg és tartsa lenyomva valamelyik billentyűt"\n</b></font><font size="3">\n</font>"Az írásjelek és az ékezetes betűk elérése."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Billentyűzetbeállítások"\n</b></font><font size="3">\n</font>"Érintse meg és tartsa lenyomva a "<b>"?123"</b>" billentyűt."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"A fő billentyűzeten"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Szimbólumoknál"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Ki"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr. a billentyűzeten"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. a szimbólumoknál"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hangbevivel KI"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Beviteli mód kiválasztása"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Beviteli nyelvek"</string>
<string name="language_selection_summary" msgid="187110938289512256">"A nyelv módosításához húzza végig az ujját a szóköz billentyűn"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Felhasználói visszajelzés engedélyezése"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Segíthet ennek a beviteli módszernek a javításában, ha engedélyezi a használati statisztikák és a hibajelentések elküldését a Google-nak."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Javítás a szavak megérintésével"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"A beírt szavakat megérintve kijavíthatja őket"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Akkor érintse meg a beírt szavakat a kijavításukhoz, amikor a javaslatok láthatóak"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Billentyűzettéma"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"billentyűzet"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"hang"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Cseh billentyűzet"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dán billentyűzet"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Német billentyűzet"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angol (Egyesült Királyság) billentyűzet"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angol (Egyesült Államok) billentyűzet"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanyol billentyűzet"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spanyol (Egyesült Államok) billentyűzet"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francia billentyűzet"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francia (kanadai) billentyűzet"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francia (Svájc) billentyűzet"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Olasz billentyűzet"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvég billentyűzet"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holland billentyűzet"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Orosz billentyűzet"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Szerb billentyűzet"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svéd billentyűzet"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Cseh hang"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Német hang"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanyol hang"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francia hang"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japán hang"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreai hang"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Lengyel hang"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugál hang"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Orosz hang"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Török hang"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Használhatósági Tanulmány mód"</string>
</resources>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index ec5be6711..c574824b2 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar jika tombol ditekan"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Berbunyi jika tombol ditekan"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Muncul saat tombol ditekan"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Perbaiki kesalahan ketik"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Aktifkan perbaikan galat masukan"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Galat masukan lanskap"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Aktifkan perbaikan galat masukan"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Saran kata"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Perbaiki kata sebelumnya secara otomatis"</string>
- <string name="prediction" msgid="466220283138359837">"Saran kata"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Setelan saran kata"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Aktifkan pengisian otomatis saat mengetik"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Pengisian otomatis"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Tambah ukuran bidang teks"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Sembunyikan saran kata dalam tampilan melintang"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Setelan saran kata"</string>
<string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Kapitalisasi awal kalimat"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Beri tanda baca otomatis"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Perbaikan cepat"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Memperbaiki kesalahan ketik umum"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Perlihatkan saran"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Tampilkan kata yang disarankan ketika mengetik"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Pengisian otomatis"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Bilah spasi dan tanda baca secara otomatis memasukkan kata yang disorot"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Perlihatkan saran"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Tampilkan kata yang disarankan ketika mengetik"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Selalu tampilkan"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Tampilkan dengan mode potret"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Selalu sembunyikan"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Lihat tombol setelan"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Otomatis"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Selalu tampilkan"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Selalu sembunyikan"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Koreksi otomatis"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Bilah spasi dan tanda baca secara otomatis memasukkan kata yang disorot"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Mati"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Sederhana"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresif"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Saran Bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Gunakan kata sebelumnya untuk meningkatkan sara"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Tak Satu Pun"</item>
- <item msgid="1669461741568287396">"Dasar"</item>
- <item msgid="4894328801530136615">"Lanjutan"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Telah disimpan"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Tahan tombol untuk melihat aksen (ø, ö, dll.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Tekan tombol kembali ↶ untuk menutup keyboard kapan saja"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Akses angka dan simbol"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tekan terus kata yang paling kiri untuk menambahkannya ke kamus"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Sentuh petunjuk ini untuk melanjutkan »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Sentuh di sini untuk menutup petunjuk dan mulailah mengetik!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Keyboard terbuka setiap kali Anda menyentuh bidang teks"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Sentuh &amp; tahan tombol untuk melihat aksen"\n"(ø, ö, ô, ó, dan seterusnya)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Beralih ke angka dan simbol dengan menekan tombol ini"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Kembali ke huruf dengan menekan tombol ini lagi"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Sentuh &amp; tahan tombol ini untuk mengubah setelan keyboard, seperti lengkapi otomatis"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Cobalah!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Buka"</string>
<string name="label_next_key" msgid="362972844525672568">"Berikutnya"</string>
<string name="label_done_key" msgid="2441578748772529288">"Selesai"</string>
<string name="label_send_key" msgid="2815056534433717444">"Kirimkan"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Lainnya"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Jeda"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Tunggu"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Masukan suara"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Masukan suara saat ini tidak didukung untuk bahasa Anda, tetapi bekerja dalam Bahasa Inggris."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Masukan suara adalah fitur eksperimental yang menggunakan pengenal suara berjaringan Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Untuk mematikan masukan suara, buka setelan keyboard."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Untuk menggunakan masukan suara, tekan tombol mikrofon atau geser jari Anda di sepanjang keyboard pada layar."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Masukan suara menggunakan pengenalan ucapan. "<a href="http://m.google.com/privacy">"Kebijakan Privasi Seluler"</a>" berlaku."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Untuk mematikan masukan suara, buka setelan metode masukan."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Untuk menggunakan masukan suara, tekan tombol mikrofon."</string>
<string name="voice_listening" msgid="467518160751321844">"Ucapkan sekarang"</string>
<string name="voice_working" msgid="6666937792815731889">"Bekerja"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Batal"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Masukan suara"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Di keyboard utama"</item>
- <item msgid="8529385602829095903">"Di keyboard simbol"</item>
- <item msgid="7283103513488381103">"Mati"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mik di keyboard utama"</item>
- <item msgid="6907837061058876770">"Mik di keyboard simbol"</item>
- <item msgid="3664304608587798036">"Masukan suara dinonaktifkan"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Kirim otomatis setelah suara"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Tekan enter secara otomatis saat menelusuri atau menuju ke bidang berikutnya."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Buka keyboard"\n</b></font><font size="3">\n</font>"Sentuh bidang teks mana pun."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tutup keyboard"\n</b></font><font size="3">\n</font>"Tekan tombol Kembali."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Sentuh &amp; tahan tombol tertentu untuk opsi"\n</b></font><font size="3">\n</font>"Akses tanda baca dan aksen."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Setelan keyboard"\n</b></font><font size="3">\n</font>"Sentuh &amp; tahan tombol "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pada keyboard utama"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pada keyboard simbol"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Mati"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik pada keyboard utama"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik pada keyboard simbol"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Masukan suara dinonaktifkan"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Pilih metode masukan"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Bahasa masukan"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Geser jari pada bilah spasi untuk mengubah bahasa"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktifkan umpan balik pengguna"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Bantu tingkatkan metode editor masukan dengan mengirim statistik penggunaan dan laporan kerusakan ke Google secara otomatis."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Sentuh untuk memperbaiki kata"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Sentuk kata yang dimasukkan untuk memperbaikinya"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Sentuh kata yang dimasukkan untuk memperbaikinya, hanya saat saran terlihat"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema Keyboard"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"keyboard"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"suara"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Keyboard Cheska"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Keyboard Denmark"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Keyboard Jerman"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Keyboard Inggris (Britania)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Keyboard Inggris (AS)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Keyboard Spanyol"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Keyboard Spanyol (AS)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Keyboard Prancis"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Keyboard Prancis (Kanada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Keyboard Prancis (Swiss)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Keyboard Italia"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Keyboard Norwegia"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Keyboard Belanda"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Keyboard Rusia"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Keyboard Serbia"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Keyboard Swedia"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Suara Cheska"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Suara Jerman"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Suara Bahasa Spanyol"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Suara Prancis"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Suara Jepang"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Suara Bahasa Korea"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Suara Bahasa Polandia"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Suara Bahasa Portugis"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Suara Bahasa Rusia"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Suara Bahasa Turki"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mode Belajar Daya Guna"</string>
</resources>
diff --git a/java/res/values-it/donottranslate-altchars.xml b/java/res/values-it/donottranslate-altchars.xml
index 23960171b..1131d4852 100644
--- a/java/res/values-it/donottranslate-altchars.xml
+++ b/java/res/values-it/donottranslate-altchars.xml
@@ -18,13 +18,9 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àá</string>
- <string name="alternates_for_e">3èé</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òó9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">à,á,â,ä,æ,ã,å,ā,ª</string>
+ <string name="alternates_for_e">3,è,é,ê,ë,ę,ė,ē</string>
+ <string name="alternates_for_i">8,ì,í,î,ï,į,ī</string>
+ <string name="alternates_for_o">9,ò,ó,ô,ö,õ,œ,ø,ō,º</string>
+ <string name="alternates_for_u">7,ù,ú,û,ü,ū</string>
</resources>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 4abe88a95..8fd626c93 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrazione tasti"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Suono tasti"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup alla pressione di un tasto"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Correggi errori di digitazione"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Attiva la correzione degli errori di inserimento"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Errori di inserimento in visualizzazione orizzontale"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Attiva la correzione degli errori di inserimento"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Suggerimenti parola"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Correggi automaticamente la parola precedente"</string>
- <string name="prediction" msgid="466220283138359837">"Suggerimenti parola"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Impostazioni suggerimento parole"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Attiva il completamento automatico durante la digitazione"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Completamento automatico"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Aumenta dimensioni campo di testo"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Nascondi i suggerimenti delle parole in visualizzazione orizzontale"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Impostazioni suggerimento parole"</string>
<string name="auto_cap" msgid="1719746674854628252">"Maiuscole automatiche"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Rendi maiuscole le iniziali delle frasi"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Punteggiatura automat."</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Correzioni veloci"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corregge gli errori di digitazione più comuni"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Mostra suggerimenti"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Visualizza le parole suggerite durante la digitazione"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Completamento autom."</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Barra spaziatrice e punteggiatura inseriscono la parola evidenziata"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostra suggerimenti"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Visualizza le parole suggerite durante la digitazione"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostra sempre"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostra in modalità verticale"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Nascondi sempre"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostra tasto impostazioni"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatico"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostra sempre"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Nascondi sempre"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Correzione automatica"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Barra spaziatrice e punteggiatura inseriscono automaticamente la parola evidenziata"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Media"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Massima"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Suggerimenti sui bigrammi"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilizza parola precedente per migliorare il suggerimento"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Nessuna"</item>
- <item msgid="1669461741568287396">"Base"</item>
- <item msgid="4894328801530136615">"Avanzate"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : parola salvata"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Tieni premuto un tasto per vedere le lettere con segni diacritici (ø, ö etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Premi il tasto Indietro ↶ per chiudere la tastiera"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Accedi a numeri e simboli"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tieni premuto sulla parola all\'estrema sinistra per aggiungerla al dizionario"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Tocca questo suggerimento per continuare »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Tocca qui per chiudere questo suggerimento e iniziare a digitare."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"La tastiera si apre ogni volta che tocchi un campo di testo"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocca e tieni premuto un pulsante per visualizzare le lettere con segni diacritici"\n"(ø, ö, ô, ó e così via)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Passa a numeri e simboli toccando questo pulsante"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Torna alle lettere toccando di nuovo questo pulsante"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tocca e tieni premuto questo pulsante per modificare le impostazioni della tastiera, come il completamento automatico"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prova!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Vai"</string>
<string name="label_next_key" msgid="362972844525672568">"Avanti"</string>
<string name="label_done_key" msgid="2441578748772529288">"Fine"</string>
<string name="label_send_key" msgid="2815056534433717444">"Invia"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Altro"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Attesa"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Comandi vocali"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"I comandi vocali non sono attualmente supportati per la tua lingua ma funzionano in inglese."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"I comandi vocali sono una funzione sperimentale che utilizza il riconoscimento vocale in rete di Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Per disattivare i comandi vocali, vai alle impostazioni della tastiera."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Per utilizzare i comandi vocali, premi il pulsante del microfono o fai scorrere il dito sulla tastiera sullo schermo."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Per i comandi vocali viene utilizzata la funzione di riconoscimento vocale di Google. Valgono le "<a href="http://m.google.com/privacy">"Norme sulla privacy di Google Mobile"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per disattivare i comandi vocali, vai alle impostazioni del metodo di inserimento."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Per utilizzare i comandi vocali, premi il tasto microfono."</string>
<string name="voice_listening" msgid="467518160751321844">"Parla ora"</string>
<string name="voice_working" msgid="6666937792815731889">"Elaborazione in corso"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Annulla"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Comandi vocali"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Su tastiera principale"</item>
- <item msgid="8529385602829095903">"Su tastiera simboli"</item>
- <item msgid="7283103513488381103">"Non attivi"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Microfono su tastiera principale"</item>
- <item msgid="6907837061058876770">"Microfono su tastiera simboli"</item>
- <item msgid="3664304608587798036">"Comandi vocali disabilitati"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Invia automaticamente dopo comando vocale"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Premi automaticamente \"Invio\" durante una ricerca o un passaggio al campo successivo."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Apertura tastiera"\n</b></font><font size="3">\n</font>"Tocca qualsiasi campo di testo."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Chiusura tastiera"\n</b></font><font size="3">\n</font>"Premi il tasto Indietro."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tocca e tieni premuto un pulsante per le opzioni"\n</b></font><font size="3">\n</font>"Accesso a punteggiatura e accenti."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Impostazioni tastiera"\n</b></font><font size="3">\n</font>"Tocca e tieni premuto il pulsante "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Su tastiera principale"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Su tastiera simboli"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Off"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic su tastiera princ."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic su tastiera simboli"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Comandi vocali disatt."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Seleziona metodo di inserimento"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Scorri il dito sulla barra spaziatrice per cambiare la lingua"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Attiva commenti degli utenti"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Aiuta a migliorare l\'editor del metodo di inserimento inviando automaticamente a Google statistiche sull\'utilizzo e segnalazioni sugli arresti anomali."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocca per correggere le parole"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tocca le parole inserite per correggerle, soltanto quando sono visibili i suggerimenti"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tocca le parole inserite per correggerle, soltanto quando sono visibili i suggerimenti"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema della tastiera"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastiera"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"vocale"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tastiera ceca"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Tastiera danese"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tastiera tedesca"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastiera inglese (Regno Unito)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tastiera inglese (USA)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Tastiera spagnola"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Tastiera spagnola (USA)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastiera francese"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastiera francese (Canada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastiera francese (Svizzera)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Tastiera italiana"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Tastiera norvegese"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Tastiera olandese"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Tastiera russa"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Tastiera serba"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Tastiera svedese"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voce ceca"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voce tedesca"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voce spagnola"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voce francese"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voce giapponese"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voce coreana"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voce polacca"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voce portoghese"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voce russa"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voce turca"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modalità Studio sull\'usabilità"</string>
</resources>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index abc5c397c..3cfcebc99 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"רטט עם לחיצה על מקשים"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"צלילים עם לחיצה על מקשים"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"חלון קופץ עם לחיצה על מקשים"</string>
- <string name="hit_correction" msgid="4855351009261318389">"תקן שגיאות הקלדה"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"הפוך תיקון שגיאות קלט לפעיל"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"שגיאות קלט בפריסה לרוחב"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"הפוך תיקון שגיאות קלט לפעיל"</string>
- <string name="auto_correction" msgid="7911639788808958255">"הצעות למילים"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"תקן באופן אוטומטי את המילה הקודמת"</string>
- <string name="prediction" msgid="466220283138359837">"הצעות למילים"</string>
- <string name="prediction_category" msgid="7027100625580696660">"הגדרות של הצעות מילים"</string>
- <string name="prediction_summary" msgid="459788228830873110">"הפוך השלמה אוטומטית לפעילה בעת הקלדה"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"השלמה אוטומטית"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"הגדל את הגודל של שדה הטקסט"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"הסתר הצעות למילים בתצוגה לרוחב"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"הגדרות של הצעות מילים"</string>
<string name="auto_cap" msgid="1719746674854628252">"הפיכה אוטומטית של אותיות לרישיות"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"הוסף אות רישית בתחילת משפט"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"פיסוק אוטומטי"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"תיקונים מהירים"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"מתקן שגיאות הקלדה נפוצות"</string>
- <string name="show_suggestions" msgid="507074425254289133">"הצג הצעות"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"הצג הצעות למילים בעת הקלדה"</string>
- <string name="auto_complete" msgid="1103196318775486023">"השלמה אוטומטית"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"הקשה על מקש הרווח וסימני הפיסוק תוסיף באופן אוטומטי את המילה המסומנת"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"הצג הצעות"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"הצג הצעות למילים בעת ההקלדה"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"הצג תמיד"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"הצג במצב פריסה לאורך"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"הסתר תמיד"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"הצג מקש הגדרות"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"אוטומטי"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"הצג תמיד"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"הסתר תמיד"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"תיקון אוטומטי"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"הקשה על מקש הרווח וסימני הפיסוק תוסיף באופן אוטומטי את המילה המסומנת"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"כבוי"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"מצומצם"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"מחמיר"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"הצעות של צמדי אותיות (Bigram)"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"השתמש במילה הקודמת כדי לשפר את ההצעה"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"ללא"</item>
- <item msgid="1669461741568287396">"בסיסי"</item>
- <item msgid="4894328801530136615">"מתקדם"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : נשמרה"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"החזק מקש לחוץ כדי לראות אקצנטים (ø, ö וכדומה)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"לחץ על המקש \'הקודם\' ↶ כדי לסגור את המקלדת בכל עת"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"גישה למספרים וסמלים"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"לחץ על המילה השמאלית הקיצונית והחזק אותה לחוצה כדי להוסיף למילון"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"גע ברמז זה כדי להמשיך »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"גע כאן כדי לסגור רמז זה ולהתחיל בהקלדה!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"המקלדת נפתחת בכל פעם שאתה נוגע בשדה טקסט"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"גע במקש והחזק אותו לחוץ כדי להציג אקצנטים"\n"(ø, ö, ô, ó וכדומה)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"עבור למספרים וסמלים על ידי נגיעה במקש זה"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"חזור לאותיות על ידי מגע במקש זה שוב"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"גע במקש זה והחזק אותו לחוץ כדי לשנות את הגדרות המקלדת, כגון השלמה אוטומטית"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"נסה אותו!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"בצע"</string>
<string name="label_next_key" msgid="362972844525672568">"הבא"</string>
<string name="label_done_key" msgid="2441578748772529288">"בוצע"</string>
<string name="label_send_key" msgid="2815056534433717444">"שלח"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"עוד"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"השהה"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"המתן"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"קלט קולי"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"קלט קולי אינו נתמך בשלב זה בשפתך, אך הוא פועל באנגלית."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"קלט קולי הוא תכונה ניסיונית של זיהוי הדיבור ברשת של Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"כדי לכבות את הקלט הקולי, עבור להגדרות מקלדת."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"כדי להשתמש בקלט הקולי, לחץ על לחצן המיקרופון או החלק את האצבע על המקלדת שבמסך."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"קלט קולי משתמש בזיהוי הדיבור של Google. "<a href="http://m.google.com/privacy">"מדיניות הפרטיות של \'Google לנייד\'"</a>" חלה."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"כדי לכבות את הקלט הקולי, עבור להגדרות של שיטת קלט."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"כדי להשתמש בקלט קולי, לחץ על לחצן המיקרופון."</string>
<string name="voice_listening" msgid="467518160751321844">"דבר כעת"</string>
<string name="voice_working" msgid="6666937792815731889">"פועל"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"ביטול"</string>
<string name="ok" msgid="7898366843681727667">"אישור"</string>
<string name="voice_input" msgid="2466640768843347841">"קלט קולי"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"במקלדת הראשית"</item>
- <item msgid="8529385602829095903">"מקלדת סמלים מופעלת"</item>
- <item msgid="7283103513488381103">"כבוי"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"מיקרופון במקלדת הראשית"</item>
- <item msgid="6907837061058876770">"מיקרופון במקלדת סמלים"</item>
- <item msgid="3664304608587798036">"הקלט הקולי מושבת"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"שליחה אוטומטית לאחר הקלטת קול"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"הקש על Enter באופן אוטומטי בעת חיפוש או מעבר לשדה הבא."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"פתח את המקלדת"\n</b></font><font size="3">\n</font>"גע בשדה טקסט כלשהו."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"סגור את המקלדת"\n</b></font><font size="3">\n</font>"לחץ על הלחצן \'הקודם\'."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"גע במקש והחזק אותו לחוץ לקבלת אפשרויות"\n</b></font><font size="3">\n</font>"קבל גישה לסימני פיסוק ואקצנטים."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"הגדרות מקלדת"\n</b></font><font size="3">\n</font>"גע במקש "<b>"?123"</b>" והחזק אותו לחוץ."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">"‎.com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">"‎.net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">"‎.org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">"‎.gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">"‎.edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"במקלדת הראשית"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"במקלדת הסמלים"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"כבוי"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"מיקרופון במקלדת הראשית"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"מיקרופון במקלדת הסמלים"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"הקלט הקולי מושבת"</string>
<string name="selectInputMethod" msgid="315076553378705821">"בחר שיטת קלט"</string>
<string name="language_selection_title" msgid="1651299598555326750">"שפות קלט"</string>
<string name="language_selection_summary" msgid="187110938289512256">"החלק את האצבע על מקש הרווח כדי לשנות שפה"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"הפוך משוב ממשתמשים לפעיל"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"עזור לשפר שיטת קלט זו על ידי שליחה אוטומטית של סטטיסטיקת שימוש ודוחות קריסת מחשב ל-Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"גע כדי לתקן מילים"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"גע במילים שהוזנו כדי לתקן אותן"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"גע במילים שהוזנו כדי לתקן אותן רק כשהצעות גלויות"</string>
<string name="keyboard_layout" msgid="437433231038683666">"עיצוב מקלדת"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"מקלדת"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"קולי"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"מקלדת צ\'כית"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"מקלדת דנית"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"מקלדת גרמנית "</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"מקלדת אנגלית (בריטניה)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"מקלדת אנגלית (ארצות הברית)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"מקלדת ספרדית"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"מקלדת ספרדית (ארה\"ב)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"מקלדת צרפתית"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"מקלדת צרפתית (קנדה)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"מקלדת צרפתית (שוויץ)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"מקלדת איטלקית "</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"מקלדת נורווגית"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"מקלדת הולנדית"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"מקלדת רוסית"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"מקלדת סרבית"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"מקלדת שוודית"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice צ\'כי"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice גרמני"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Google Voice ספרדי"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Google Voice צרפתי"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice יפני"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice קוריאני"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Google Voice פולני"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Google Voice פורטוגזי"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Google Voice רוסי"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Google Voice תורכי"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"מצב בדיקת שימושיות"</string>
</resources>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index c08998687..955339eba 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"キー操作バイブ"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"キー操作音"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"キー押下時ポップアップ"</string>
- <string name="hit_correction" msgid="4855351009261318389">"入力ミス補正"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"入力間違いを自動修正する"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"横表示での入力修正"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"入力間違いを自動修正する"</string>
- <string name="auto_correction" msgid="7911639788808958255">"入力候補表示"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"前の単語を自動修正する"</string>
- <string name="prediction" msgid="466220283138359837">"入力候補表示"</string>
- <string name="prediction_category" msgid="7027100625580696660">"入力候補の設定"</string>
- <string name="prediction_summary" msgid="459788228830873110">"オートコンプリートを使用する"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"オートコンプリート"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"入力作業スペースを広げる"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"横表示では入力候補を表示しない"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"入力候補の設定"</string>
<string name="auto_cap" msgid="1719746674854628252">"自動大文字変換"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"英字入力で文頭文字を大文字にする"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"句読点を自動入力"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"クイックフィックス"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"よくある誤字・脱字を修正します"</string>
- <string name="show_suggestions" msgid="507074425254289133">"入力候補を表示"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"入力時に入力候補を表示する"</string>
- <string name="auto_complete" msgid="1103196318775486023">"オートコンプリート"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"反転表示されている変換候補をスペースまたは句読点キーで挿入する"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"入力候補を表示"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"入力中に入力候補を表示する"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"常に表示"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"縦向きで表示"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"常に非表示"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"設定キーを表示"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"自動"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"常に表示"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"常に非表示"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"自動修正"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"反転表示されている変換候補をSpaceまたは句読点キーで挿入する"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"OFF"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"中"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"強"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"バイグラム入力候補表示"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"直前の単語から入力候補を予測します"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"なし"</item>
- <item msgid="1669461741568287396">"基本"</item>
- <item msgid="4894328801530136615">"高度"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:保存しました"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"キー長押しでアクセント文字を表示(ø、öなど)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"戻るキーでキーボードを閉じます"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"数字と記号"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"一番左の単語を長押しすると辞書に追加されます"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"続けるにはここをタッチ"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"タッチしてこのヒントを終了し、入力を開始してください。"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"テキストフィールドを選択するとキーボードが表示されます"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"キーを長押しするとアクセント付き文字"\n"(ø、ö、ô、óなど)が表示されます"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"このキーを押すと、数字/記号入力に切り替わります"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"このキーを押すと、文字入力に再度切り替わります"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"オートコンプリートなどのキーボードの設定を変更するには、このキーを長押しします"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"試してみてください。"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"実行"</string>
<string name="label_next_key" msgid="362972844525672568">"次へ"</string>
<string name="label_done_key" msgid="2441578748772529288">"完了"</string>
<string name="label_send_key" msgid="2815056534433717444">"送信"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Shift"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"停止"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"待機"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"音声入力"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"音声入力は現在英語には対応していますが、日本語には対応していません。"</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"音声入力はGoogleのネットワーク音声認識技術を利用した試験段階の機能です。"</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"音声入力をOFFにするには、キーボードの設定を開きます。"</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"音声入力するには、マイクボタンを押すか画面キーボードをスワイプしてください。"</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"音声入力にはGoogleの音声認識機能を使用します。"<a href="http://m.google.com/privacy">"モバイルプライバシーポリシー"</a>"が適用されます。"</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"音声入力をOFFにするには、入力方法の設定を開きます。"</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"音声入力するには、マイクボタンを押してください。"</string>
<string name="voice_listening" msgid="467518160751321844">"お話しください"</string>
<string name="voice_working" msgid="6666937792815731889">"処理中"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"キャンセル"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"音声入力"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"メインキーボード上"</item>
- <item msgid="8529385602829095903">"記号キーボード上"</item>
- <item msgid="7283103513488381103">"OFF"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"メインキーボードのマイク"</item>
- <item msgid="6907837061058876770">"記号キーボードのマイク"</item>
- <item msgid="3664304608587798036">"音声入力は無効です"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"入力後に自動送信する"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"検索または次のフィールドに進む際、Enterキーが自動的に押されます。"</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"キーボードを開く"\n</b></font><font size="3">\n</font>"テキストフィールドをタップします。"</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"キーボードを閉じる"\n</b></font><font size="3">\n</font>"[戻る]キーを押します。"</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"キーを長押しして選択する"\n</b></font><font size="3">\n</font>"句読点キーとアクセント文字を表示します。"</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"キーボードの設定"\n</b></font><font size="3">\n</font>"["<b>"?123"</b>"]キーを長押しします。"</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"メインキーボード上"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"記号キーボード上"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"OFF"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"メインキーボードのマイク"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"記号キーボードのマイク"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"音声入力は無効です"</string>
<string name="selectInputMethod" msgid="315076553378705821">"入力方法の選択"</string>
<string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string>
<string name="language_selection_summary" msgid="187110938289512256">"スペースバーで指をスライドさせて言語を変更する"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"ユーザーフィードバックを有効にする"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。"</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"タップして語句を修正"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"候補が表示されているときのみ、入力した語句をタップして修正します"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"候補が表示されているときのみ、入力した語句をタップして修正します"</string>
<string name="keyboard_layout" msgid="437433231038683666">"キーボードテーマ"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"キーボード"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"音声"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"チェコ語のキーボード"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"デンマーク語のキーボード"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"ドイツ語のキーボード"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英語(英国)のキーボード"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英語(米国)のキーボード"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"スペイン語のキーボード"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"スペイン語(米国)のキーボード"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"フランス語のキーボード"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"フランス語(カナダ)のキーボード"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"フランス語(スイス)のキーボード"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"イタリア語のキーボード"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"ノルウェー語キーボード"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"オランダ語のキーボード"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"ロシア語のキーボード"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"セルビア語のキーボード"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"スウェーデン語のキーボード"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"チェコ語の音声"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"ドイツ語の音声"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"スペイン語の音声"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"フランス語音声"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日本語の音声"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韓国語の音声"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"ポーランド語の音声"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"ポルトガル語の音声"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"ロシア語の音声"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"トルコ語の音声"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"使いやすさの研究モード"</string>
</resources>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index 4419b99fe..9d7d1d9f1 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"키를 누를 때 진동 발생"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"키를 누를 때 소리 발생"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"키를 누를 때 팝업"</string>
- <string name="hit_correction" msgid="4855351009261318389">"입력 오류 수정"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"입력 오류 수정 사용"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"가로 입력 오류"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"입력 오류 수정 사용"</string>
- <string name="auto_correction" msgid="7911639788808958255">"단어 추천"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"이전 단어를 자동으로 수정"</string>
- <string name="prediction" msgid="466220283138359837">"단어 추천"</string>
- <string name="prediction_category" msgid="7027100625580696660">"단어 추천 설정"</string>
- <string name="prediction_summary" msgid="459788228830873110">"입력할 때 자동 완성 사용"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"자동 완성"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"입력란 크기 늘리기"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"가로 보기에서 추천 단어 숨기기"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"단어 추천 설정"</string>
<string name="auto_cap" msgid="1719746674854628252">"자동 대문자화"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"문장의 첫 글자를 대문자로 표시"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"자동 구두점 입력"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"빠른 수정"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"자주 발생하는 오타를 수정합니다."</string>
- <string name="show_suggestions" msgid="507074425254289133">"추천 단어 표시"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"글자를 입력하는 동안 추천 단어를 표시"</string>
- <string name="auto_complete" msgid="1103196318775486023">"자동 완성"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"스페이스바와 문장부호 키로 강조 표시된 단어를 자동 삽입"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"추천 단어 표시"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"글자를 입력하는 동안 추천 단어 표시"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"항상 표시"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"세로 모드로 표시"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"항상 숨기기"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"설정 키 표시"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"자동"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"항상 표시"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"항상 숨기기"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"자동 수정"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"스페이스바와 구두점을 사용하면 강조 표시된 단어가 자동으로 삽입됩니다."</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"사용 안함"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"보통"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"적극적"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram 추천"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"이전 단어를 사용하여 추천 기능 개선"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"없음"</item>
- <item msgid="1669461741568287396">"기본"</item>
- <item msgid="4894328801530136615">"고급"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: 저장됨"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"키를 길게 누르면 악센트(ø, ö 등)가 표시됩니다."</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"키보드를 닫으려면 언제든지 뒤로 키(↶)를 누르세요."</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"숫자 및 기호 사용"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"맨 왼쪽에 있는 단어를 길게 누르면 사전에 추가됩니다."</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"계속하려면 힌트를 터치하세요. »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"힌트를 닫고 입력을 시작하려면 여기를 터치하세요."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"언제든지 입력란을 터치하면 키보드가 열립니다."</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"키를 길게 터치하면 악센트"\n"(ø, ö, ô, ó 등)가 표시됩니다."</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"이 키를 터치하면 숫자 및 기호 키보드로 전환됩니다."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"이 키를 다시 터치하면 문자 키보드로 돌아갑니다."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"자동 완성과 같은 키보드 설정을 변경하려면 이 키를 길게 터치하세요."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"이제 사용해 보세요."</b></string>
<string name="label_go_key" msgid="1635148082137219148">"이동"</string>
<string name="label_next_key" msgid="362972844525672568">"다음"</string>
<string name="label_done_key" msgid="2441578748772529288">"완료"</string>
<string name="label_send_key" msgid="2815056534433717444">"전송"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"더보기"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"일시 중지"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"대기"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"음성 입력"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"음성 입력은 현재 자국어로 지원되지 않으며 영어로 작동됩니다."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"음성 입력은 Google의 네트워크화된 음성 인식을 사용하는 실험적 기능입니다."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"음성 입력을 사용하지 않으려면 키보드 설정으로 이동하세요."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"음성 입력을 사용하려면 마이크 버튼을 누르거나 터치 키보드 위로 손가락을 미끄러지듯 움직이세요."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"음성 입력은 Google의 음성 인식을 사용합니다. "<a href="http://m.google.com/privacy">"모바일 개인정보취급방침"</a>"이 적용됩니다."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"음성 입력을 사용하지 않으려면 입력 방법 설정으로 이동하세요."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"음성 입력을 사용하려면 마이크 버튼을 누르세요."</string>
<string name="voice_listening" msgid="467518160751321844">"지금 말하세요."</string>
<string name="voice_working" msgid="6666937792815731889">"인식 중"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"취소"</string>
<string name="ok" msgid="7898366843681727667">"확인"</string>
<string name="voice_input" msgid="2466640768843347841">"음성 입력"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"기본 키보드"</item>
- <item msgid="8529385602829095903">"기호 키보드"</item>
- <item msgid="7283103513488381103">"사용 안함"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"기본 키보드의 마이크"</item>
- <item msgid="6907837061058876770">"기호 키보드의 마이크"</item>
- <item msgid="3664304608587798036">"음성 입력이 사용 중지됨"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"음성을 입력한 다음 자동 제출"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"검색하거나 다음 입력란으로 이동할 때 자동으로 Enter 키를 누릅니다."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"키보드 열기"\n</b></font><font size="3">\n</font>"아무 텍스트 입력란이나 터치하세요."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"키보드 닫기"\n</b></font><font size="3">\n</font>"\'뒤로\' 키를 누르세요."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"키를 길게 눌러 옵션 보기"\n</b></font><font size="3">\n</font>"문장 부호 및 악센트 기호 입력창이 열립니다."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"키보드 설정"\n</b></font><font size="3">\n</font><b>"?123"</b>" 키를 길게 누르세요."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"기본 키보드"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"기호 키보드"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"사용 안함"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"기본 키보드의 마이크"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"기호 키보드의 마이크"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"음성 입력이 사용 중지됨"</string>
<string name="selectInputMethod" msgid="315076553378705821">"입력 방법 선택"</string>
<string name="language_selection_title" msgid="1651299598555326750">"입력 언어"</string>
<string name="language_selection_summary" msgid="187110938289512256">"손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"사용자 의견 사용"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"사용 통계 및 충돌 보고서를 Google에 자동으로 전송하여 입력 방법 편집기의 개선에 도움을 줍니다."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"터치하여 단어 수정"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"추천 검색어가 표시된 경우에만 입력한 단어를 터치하여 수정"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"추천 검색어가 표시된 경우에만 입력한 단어를 터치하여 수정"</string>
<string name="keyboard_layout" msgid="437433231038683666">"키보드 테마"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"키보드"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"음성"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"체코어 키보드"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"덴마크어 키보드"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"독일어 키보드"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"영어(영국) 키보드"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"영어(미국) 키보드"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"스페인어 키보드"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"스페인어(미국) 키보드"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"프랑스어 키보드"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"프랑스어(캐나다) 키보드"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"프랑스어(스위스) 키보드"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"이탈리아어 키보드"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"노르웨이어 키보드"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"네덜란드어 키보드"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"러시아어 키보드"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"세르비아어 키보드"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"스웨덴어 키보드"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"체코어 음성검색"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"독일어 음성검색"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"스페인어 음성검색"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"프랑스어 음성검색"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"일본어 음성검색"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"한국어 음성검색"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"폴란드어 음성검색"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"포르투갈어 음성검색"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"러시아어 음성검색"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"터키어 음성검색"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"사용성 평가 모드"</string>
</resources>
diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml
index 043f4b363..7df124bfc 100644
--- a/java/res/values-land/dimens.xml
+++ b/java/res/values-land/dimens.xml
@@ -19,17 +19,20 @@
-->
<resources>
+ <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+ <dimen name="keyboardHeight">1.060in</dimen>
<!-- key_height + key_bottom_gap = popup_key_height -->
- <dimen name="key_height">0.250in</dimen>
+<!-- <dimen name="key_height">0.250in</dimen>-->
<dimen name="key_bottom_gap">0.020in</dimen>
<dimen name="popup_key_height">0.270in</dimen>
+ <dimen name="keyboard_top_padding">0.0in</dimen>
<dimen name="keyboard_bottom_padding">0.0in</dimen>
<dimen name="candidate_strip_height">38dip</dimen>
<dimen name="candidate_strip_fading_edge_length">63dip</dimen>
<dimen name="spacebar_vertical_correction">2dip</dimen>
<!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
- <!-- popup_key_height x 1.7 -->
- <dimen name="mini_keyboard_slide_allowance">0.459in</dimen>
- <!-- popup_key_height x 1.0 -->
+ <!-- popup_key_height x 1.2 -->
+ <dimen name="mini_keyboard_slide_allowance">0.324in</dimen>
+ <!-- popup_key_height x -1.0 -->
<dimen name="mini_keyboard_vertical_correction">-0.270in</dimen>
</resources>
diff --git a/java/res/values-es-rUS/donottranslate-altchars.xml b/java/res/values-lt/donottranslate-altchars.xml
index d3beafade..4aba93a3a 100644
--- a/java/res/values-es-rUS/donottranslate-altchars.xml
+++ b/java/res/values-lt/donottranslate-altchars.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -18,13 +18,11 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òóôõöœø9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">ą,à,á,â,ä,æ,ã,å,ā</string>
+ <string name="alternates_for_e">3,ė,ę,è,é,ê,ë,ē</string>
+ <string name="alternates_for_i">8,į,î,ï,ì,í,ī</string>
+ <string name="alternates_for_u">7,ų,ū,û,ü,ù,ú</string>
+ <string name="alternates_for_s">š,ß,ś</string>
+ <string name="alternates_for_c">č,ç,ć</string>
+ <string name="alternates_for_z">ž,ź,ż</string>
</resources>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index 09208049a..55c489817 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibruoti, kai paspaudžiami klavišai"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Klavišo paspaudimo garsas"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Iššoka paspaudus klavišą"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Taisyti rašybos klaidas"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Įgalinti įvesties klaidos taisymą"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Gulsčia įvestis"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Įgalinti įvesties klaidos taisymą"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Žodžių pasiūlymai"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Automatiškai taisyti ankstesnį žodį"</string>
- <string name="prediction" msgid="466220283138359837">"Žodžių pasiūlymai"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Žodžių pasiūlymo nustatymai"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Įgalinti automatinį užbaigimą, kai įvedinėjamas tekstas"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatinis užbaigimas"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Padidinti teksto lauko dydį"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Gulsčiame rodinyje slėpti žodžių pasiūlymus"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Žodžių pasiūlymo nustatymai"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automatinis didžiųjų raidžių rašymas"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Sakinio pradžią rašyti didžiąja raide"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatiškai dėti skyrybos ženklus"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Greiti pataisymai"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Taiso dažnai padarytas rašybos klaidas"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Rodyti pasiūlymus"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Įvedant tekstą pateikti siūlomus žodžius"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Automatiškai užbaigti"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Tarpo klavišas ir skyrybos ženklai automatiškai įterpia paryškintą žodį"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Rodyti pasiūlymus"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Įvedant tekstą pateikti siūlomus žodžius"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Visada rodyti"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Rodyti portreto režimu"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Visada slėpti"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Rodyti nustatymų raktą"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatinis"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Visada rodyti"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Visada slėpti"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Automatinis taisymas"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Tarpo klavišas ir skyrybos ženklai automatiškai įterpia paryškintą žodį"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Išjungta"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Vidutinis"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Atkaklus"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Digramų pasiūlymai"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Naudoti ankstesnį žodį pasiūlymui patobulinti"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Nėra"</item>
- <item msgid="1669461741568287396">"Paprastas"</item>
- <item msgid="4894328801530136615">"Išplėstinis"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: išsaugota"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Laikykite klavišą nuspaudę, kad pamatytumėte kirčius (ø, ö ir t. t.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Paspauskite klavišą „Atgal“ ↶, kad uždarytumėte klaviatūrą"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Pasiekti skaičius ir simbolius"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Paspauskite ir laikykite nuspaudę kairiausią žodį, kad pridėtumėte jį prie žodyno"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Palieskite šią užuominą, jei norite tęsti »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Paleiskite čia, kad uždarytumėte šią užuominą ir pradėtumėte įvedinėti tekstą!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klaviatūra atsidarys kaskart, kai paliesite teksto lauką"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Palieskite ir laikykite klavišą, kad pamatytumėte kirčius"\n"(ø, ö, ô, ó, and so on)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Perjunkite į skaičius ir simbolius, paliesdami šį klavišą"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Grįžkite prie raidžių dar kartą paliesdami šį klavišą"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Palieskite ir laikykite šį klavišą, kad pakeistumėte klaviatūros nustatymus, pvz., automatinį užbaigimą"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Išbandykite tai!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Pradėti"</string>
<string name="label_next_key" msgid="362972844525672568">"Kitas"</string>
<string name="label_done_key" msgid="2441578748772529288">"Atlikta"</string>
<string name="label_send_key" msgid="2815056534433717444">"Siųsti"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Daugiau"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Prist."</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Lauk."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Balso įvestis"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Šiuo metu balso įvestis jūsų kompiuteryje nepalaikoma, bet ji veikia anglų k."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Balso įvestis – tai eksperimentinė funkcija, naudojanti „Google“ tinklo kalbos atpažinimą."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Jei norite išjungti balso įvestį, eikite į klaviatūros nustatymus."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Jei norite naudoti balso įvestį, paspauskite mikrofono mygtuką arba pirštu slyskite ekranine klaviatūra."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balso įvestis naudoja „Google“ balso atpažinimą. Taikoma "<a href="http://m.google.com/privacy">"Privatumo politika mobiliesiems"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Jei norite išjungti balso įvestį, eikite į įvesties metodo nustatymus."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Jei norite naudoti balso įvestį, paspauskite mikrofono mygtuką."</string>
<string name="voice_listening" msgid="467518160751321844">"Kalbėkite dabar"</string>
<string name="voice_working" msgid="6666937792815731889">"Veikia"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Atšaukti"</string>
<string name="ok" msgid="7898366843681727667">"Gerai"</string>
<string name="voice_input" msgid="2466640768843347841">"Balso įvestis"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Pagrindinėje klaviatūroje"</item>
- <item msgid="8529385602829095903">"Simbolių klaviatūroje"</item>
- <item msgid="7283103513488381103">"Išjungta"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Pagrindinės klaviatūros mikrofonas"</item>
- <item msgid="6907837061058876770">"Mikrofonas simbolių klaviatūroje"</item>
- <item msgid="3664304608587798036">"Balso įvestis išjungta"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Automatiškai pateikti po balso"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Automatiškai spausti „Įvesti“ ieškant ar einant į kitą lauką."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Atidarykite klaviatūrą"\n</b></font><font size="3">\n</font>"Palieskite bet kurį teksto lauką."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Uždarykite klaviatūrą"\n</b></font><font size="3">\n</font>"Paspauskite klavišą „Atgal“."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Palieskite ir laikykite klavišą, kad pamatytumėte parinktis"\n</b></font><font size="3">\n</font>"Pasiekite skyrybos ženklus ir kirčius."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Klaviatūros nustatymai"\n</b></font><font size="3">\n</font>"Palieskite ir laikykite klavišą "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pagr. klaviatūroje"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Simbolių klaviatūr."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Išjungta"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrof. pagr. klav."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrof. simb. klav."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balso įv. neleidž."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Pasirinkti įvesties metodą"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Įvesties kalbos"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Pirštu slyskite tarpo klavišu, kad pakeistumėte kalbą"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Įgalinti naudotojų atsiliepimus"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Padėkite patobulinti šią įvesties metodo redagavimo programą automatiškai „Google“ siųsdami naudojimo statistiką ir strigčių ataskaitas."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Jei norite ištaisyti žodžius, palieskite"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Jei norite ištaisyti įvestus žodžius, palieskite juos"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Jei norite ištaisyti įvestus žodžius, palieskite juos tik tada, kai matomi pasiūlymai"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Klaviatūros tema"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klaviatūra"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"Voice"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Čekiška klaviatūra"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Daniška klaviatūra"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vokiška klaviatūra"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angliška (JK) klaviatūra"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angliška (JAV) klaviatūra"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ispaniška klaviatūra"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Ispaniška (JAV) klaviatūra"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Prancūziška klaviatūra"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Prancūziška (Kanada) klaviatūra"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Prancūziška (Šveicarija) klaviatūra"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itališka klaviatūra"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvegiška klaviatūra"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Olandiška klaviatūra"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Rusiška klaviatūra"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbiška klaviatūra"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švediška klaviatūra"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"„Voice“ čekų k."</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"„Voice“ vokiečių k."</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"„Voice“ ispanų k."</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"„Voice“ prancūzų k."</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"„Voice“ japonų k."</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"„Voice“ korėjiečių k."</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"„Voice“ lenkų k."</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"„Voice“ portugalų k."</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"„Voice“ rusų k."</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"„Voice“ turkų k."</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Tinkamumo analizės režimas"</string>
</resources>
diff --git a/java/res/values-lv/donottranslate-altchars.xml b/java/res/values-lv/donottranslate-altchars.xml
new file mode 100644
index 000000000..05d9bc894
--- /dev/null
+++ b/java/res/values-lv/donottranslate-altchars.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="alternates_for_a">ā,à,á,â,ä,æ,ã,å</string>
+ <string name="alternates_for_e">3,ē,è,é,ê,ë,ę,ė</string>
+ <string name="alternates_for_i">8,ī,î,ï,ì,í,į</string>
+ <string name="alternates_for_u">7,ū,û,ü,ù,ú</string>
+ <string name="alternates_for_s">š,ß,ś</string>
+ <string name="alternates_for_n">ņ,ñ,ń</string>
+ <string name="alternates_for_c">č,ç,ć</string>
+ <string name="alternates_for_r">4,ŗ</string>
+ <string name="alternates_for_z">ž,ź,ż</string>
+ <string name="alternates_for_k">ķ</string>
+ <string name="alternates_for_l">ļ,ł</string>
+ <string name="alternates_for_g">ģ</string>
+</resources>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index 3c0be2519..ccb41bd11 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrēt, nospiežot taustiņu"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Skaņa, nospiežot taustiņu"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Nospiežot taustiņu, parādīt uznirstošo izvēlni"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Labot drukas kļūdas"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Iespējot ievades kļūdu labošanu"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Ainavas orientācijas ievades kļūdas"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Iespējot ievades kļūdu labošanu"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Vārdu ieteikumi"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Automātiski labot iepriekšējo vārdu"</string>
- <string name="prediction" msgid="466220283138359837">"Vārdu ieteikumi"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Vārdu ieteikumu iestatījumi"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Iespējot automātisko pabeigšanu ievades laikā"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automātiska pabeigšana"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Palielināt teksta lauka lielumu"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ainavas skatījumā slēpt vārdu ieteikumus"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Vārdu ieteikumu iestatījumi"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automātiska lielo burtu lietošana"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Sākt teikumu ar lielo burtu"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automātiska pieturzīmju lietošana"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Ātrie labojumi"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Nodrošina izplatītu drukas kļūdu labošanu."</string>
- <string name="show_suggestions" msgid="507074425254289133">"Rādīt ieteikumus"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Ievades laikā attēlot ieteiktos vārdus"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Automātiska pabeigšana"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Automātiski ievietot iezīmēto vārdu, izmantojot atstarpes taustiņu un pieturzīmes"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Rādīt ieteikumus"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Ievades laikā attēlot ieteiktos vārdus"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vienmēr rādīt"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Rādīt portreta režīmā"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vienmēr slēpt"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Rādīt iestatījumu taustiņu"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automātiski"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vienmēr rādīt"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vienmēr slēpt"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Automāt. korekcija"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Automātiski ievietot iezīmēto vārdu, izmantojot atstarpes taustiņu un pieturzīmes"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izslēgta"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mērena"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresīva"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram ieteikumi"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Ieteikuma uzlabošanai izmantot iepriekšējo vārdu"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Nav"</item>
- <item msgid="1669461741568287396">"Pamata"</item>
- <item msgid="4894328801530136615">"Uzlabots"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: saglabāts"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Turiet taustiņu nospiestu, lai skatītu uzsvēruma zīmes (ø, ö u.c.)."</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Jebkurā brīdī nospiediet taustiņu Atpakaļ ↶, lai aizvērtu tastatūru."</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Piekļūt cipariem un simboliem"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Nospiediet kreisajā pusē esošo vārdu un turiet, lai pievienotu to vārdnīcai."</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Pieskarieties šim ieteikumam, lai turpinātu »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Pieskarieties šeit, lai aizvērtu šo ieteikumu un sāktu ievadi."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastatūra tiek atvērta ikreiz, kad pieskaraties teksta laukam"</b>"."</string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Pieskarieties taustiņam un turiet, lai skatītu uzsvara zīmes"\n"(ø, ö, ô, ó utt.)."</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Pieskarieties šim taustiņam, lai izmantotu ciparus un simbolus."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Vēlreiz pieskarieties šim taustiņam, lai atkal izmantotu burtus."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Pieskarieties taustiņam un turiet, lai mainītu tastatūras iestatījumus, piemēram, automātisko pabeigšanu."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Izmēģiniet to!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Sākt"</string>
<string name="label_next_key" msgid="362972844525672568">"Tālāk"</string>
<string name="label_done_key" msgid="2441578748772529288">"Gatavs"</string>
<string name="label_send_key" msgid="2815056534433717444">"Sūtīt"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Vairāk"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pauze"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Gaidīt"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Balss ievade"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Balss ievade jūsu valodā pašlaik netiek atbalstīta, taču tā ir pieejama angļu valodā."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Balss ievade ir izmēģinājuma funkcija, kuras pamatā ir Google tīkla runas atpazīšanas līdzeklis."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Lai izslēgtu balss ievadi, atveriet tastatūras iestatījumus."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Lai izmantotu balss ievadi, nospiediet mikrofona pogu vai slidiniet pirkstus pāri ekrāna tastatūrai."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balss ievadei tiek izmantota Google runas atpazīšanas funkcija. Uz šīs funkcijas lietošanu attiecas "<a href="http://m.google.com/privacy">"Mobilo sakaru ierīču lietošanas konfidencialitātes politika"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Lai izslēgtu balss ievadi, atveriet ievades metodes iestatījumus."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Lai izmantotu balss ievadi, nospiediet mikrofona pogu."</string>
<string name="voice_listening" msgid="467518160751321844">"Runājiet!"</string>
<string name="voice_working" msgid="6666937792815731889">"Notiek apstrāde"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Atcelt"</string>
<string name="ok" msgid="7898366843681727667">"Labi"</string>
<string name="voice_input" msgid="2466640768843347841">"Balss ievade"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Izmantojot galveno tastatūru"</item>
- <item msgid="8529385602829095903">"Izmantojot simbolu tastatūru"</item>
- <item msgid="7283103513488381103">"Izsl."</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Galvenās tastatūras mikrofons"</item>
- <item msgid="6907837061058876770">"Simbolu tastatūras mikrofons"</item>
- <item msgid="3664304608587798036">"Balss ievade ir atspējota"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Automātiski iesniegt pēc balss ievades"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Automātiski nospiest ievades taustiņu, meklējot vai pārejot uz nākamo lauku."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Tastatūras atvēršana"\n</b></font><font size="3">\n</font>"Pieskarieties jebkuram teksta laukam."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tastatūras aizvēršana"\n</b></font><font size="3">\n</font>"Nospiediet taustiņu Atpakaļ."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Pieskarieties taustiņam un turiet, lai skatītu opcijas."\n</b></font><font size="3">\n</font>"Piekļūstiet pieturzīmēm un uzsvara zīmēm."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastatūras iestatījumi"\n</b></font><font size="3">\n</font>"Pieskarieties taustiņam "<b>"?123"</b>" un turiet."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Uz galv. tastatūras"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Uz simbolu tastat."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Izslēgts"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr.uz galv.tastat."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr.uz simb.tastat."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balss iev. atspējota"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Atlasīt ievades metodi"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Ievades valodas"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Slidiniet pirkstu uz atstarpes taustiņa, lai mainītu valodu"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Iespējot lietotāju atsauksmes"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Palīdziet uzlabot šo ievades metodes redaktoru, automātiski nosūtot lietojuma statistiku un pārskatus par avārijām uzņēmumam Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Pieskarties, lai izlabotu vārdus"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Pieskarties ievadītajiem vārdiem, lai tos labotu"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Lai labotu ievadītos vārdus, pieskarieties tiem tikai tad, kad ir redzami ieteikumi."</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tastatūras motīvs"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatūra"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"balss"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Čehu tastatūra"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dāņu tastatūra"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vācu valodas tastatūra"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angļu valodas (Lielbritānija) tastatūra"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angļu valodas (ASV) tastatūra"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spāņu tastatūra"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spāņu valodas (ASV) tastatūra"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franču tastatūra"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franču tastatūra (Kanāda)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franču valodas (Šveice) tastatūra"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itāļu valodas tastatūra"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvēģu tastatūra"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holandiešu tastatūra"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Krievu tastatūra"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbu tastatūra"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Zviedru tastatūra"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice čehu valodā"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice vācu valodā"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voice spāņu valodā"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voice franču valodā"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voice japāņu valodā"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voice korejiešu valodā"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voice poļu valodā"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voice portugāļu valodā"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voice krievu valodā"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voice turku valodā"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Lietojamības izpētes režīms"</string>
</resources>
diff --git a/java/res/values-nb/donottranslate-altchars.xml b/java/res/values-nb/donottranslate-altchars.xml
index 6257dfc31..798e51c9a 100644
--- a/java/res/values-nb/donottranslate-altchars.xml
+++ b/java/res/values-nb/donottranslate-altchars.xml
@@ -18,20 +18,12 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">äáàâąã</string>
- <string name="alternates_for_e">3éèêëę€</string>
- <string name="alternates_for_i">íìîï8</string>
- <string name="alternates_for_o">öóòôõ9</string>
- <string name="alternates_for_u">üúùûū7</string>
- <string name="alternates_for_s">śšşß</string>
- <string name="alternates_for_n">ńñň</string>
- <string name="alternates_for_c">çćč</string>
- <string name="alternates_for_y">ýÿ6</string>
- <string name="alternates_for_d">ðď</string>
- <string name="alternates_for_r">ř4</string>
- <string name="alternates_for_t">ťþ5</string>
- <string name="alternates_for_z">źžż</string>
- <string name="alternates_for_l">ł</string>
- <string name="alternates_for_v">w</string>
- <string name="alternates_for_oe">œ</string>
+ <string name="alternates_for_a">à,ä,á,â,ã,ā</string>
+ <string name="alternates_for_e">3,é,è,ê,ë,ę,ė,ē</string>
+ <string name="alternates_for_o">9,ô,ò,ó,ö,õ,œ,ō</string>
+ <string name="alternates_for_u">7,ü,û,ù,ú,ū</string>
+ <string name="keylabel_for_scandinavia_row2_10">ø</string>
+ <string name="keylabel_for_scandinavia_row2_11">æ</string>
+ <string name="alternates_for_scandinavia_row2_10">ö</string>
+ <string name="alternates_for_scandinavia_row2_11">ä</string>
</resources>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index 74062449b..314ba1fa8 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer ved tastetrykk"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Lyd ved tastetrykk"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Hurtigvindu ved tastetrykk"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Rett opp skrivefeil"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Slå på retting av skrivefeil"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Rett opp skrivefeil i breddeformat"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Slå på retting av skrivefeil"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Autokorrektur"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Autokorriger forrige ord"</string>
- <string name="prediction" msgid="466220283138359837">"Ordforslag"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Innstillinger for ordforslag"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Skru på autofullføring under skriving"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autofullfør"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Større tekstfelt"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skjul ordforslag i breddeformat"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Innstillinger for ordforslag"</string>
<string name="auto_cap" msgid="1719746674854628252">"Stor forbokstav"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Start automatisk setninger med stor bokstav"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatisk punktum"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Autokorrektur"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Retter vanlige stavefeil"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Vis forslag"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Vis foreslåtte ord under skriving"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Autofullføring"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Mellomrom og punktum setter automatisk inn valgt ord"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Vis forslag"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vis ordforslag under skriving"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vis alltid"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Vis i stående retning"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Skjul alltid"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Vis innstillingsnøkkel"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisk"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vis alltid"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Skjul alltid"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Automatisk retting"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Mellomromstast og skilletegn setter automatisk inn det uthevede ordet"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderat"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Omfattende"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram-forslag"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Bruk forrige ord til å forbedre forslaget"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Ingen"</item>
- <item msgid="1669461741568287396">"Grunnleggende"</item>
- <item msgid="4894328801530136615">"Avansert"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Lagret"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Hold en tast nede for å se aksenterte tegn (ø, ö, osv.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Trykk tilbakeknappen, ↶, for å lukke tastaturet"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Få tilgang til tall og symboler"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Trykk lenge på ordet lengst til venstre for å legge det til i ordlisten"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Trykk på dette hintet for å forsette »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Trykk her for å lukke dette hintet og begynne å skrive!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastaturet åpnes når du tar på et tekstfelt"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Trykk på og hold nede en tast for å se aksenter"\n"(ø, ö, ô, ó, osv.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Bytt til tall og symboler ved å trykke på denne tasten"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Gå tilbake til bokstaver igjen ved å trykke på denne tasten"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Trykk på og hold nede denne tasten for å endre tastaturinnstillinger, som autofullføring"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prøv det!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Gå"</string>
<string name="label_next_key" msgid="362972844525672568">"Neste"</string>
<string name="label_done_key" msgid="2441578748772529288">"Utfør"</string>
<string name="label_send_key" msgid="2815056534433717444">"Send"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Mer"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Stemmedata"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmedata håndteres foreløpig ikke på ditt språk, men fungerer på engelsk."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Talekommandoer er en eksperimentell funksjon som bruker Googles nettverksbaserte talegjenkjenning."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Gå til innstillinger for tastatur for å slå av stemmedata."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Du bruker talekommandoer ved å trykke på mikrofonknappen eller skyve fingeren over tastaturet på skjermen."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Talekommandoer bruker Googles funksjon for talegjenkjenning. "<a href="http://m.google.com/privacy">"Personvernreglene for Google for mobil "</a>" gjelder."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Gå til innstillinger for inndatametode for å slå av stemmedata."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Trykk på mikrofonknappen for å bruke taleinndata."</string>
<string name="voice_listening" msgid="467518160751321844">"Snakk nå"</string>
<string name="voice_working" msgid="6666937792815731889">"Arbeider"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Avbryt"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Talekommando"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"På hovedtastatur"</item>
- <item msgid="8529385602829095903">"På talltastatur"</item>
- <item msgid="7283103513488381103">"Av"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofon på hovedtastatur"</item>
- <item msgid="6907837061058876770">"Mikrofon på talltastatur"</item>
- <item msgid="3664304608587798036">"Talekommando er deaktivert"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Send inn automatisk etter tale"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Trykk Enter automatisk ved søk eller flytting til neste felt."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Åpne tastaturet"\n</b></font><font size="3">\n</font>"Trykk på et tekstfelt."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Lukke tastaturet"\n</b></font><font size="3">\n</font>"Trykk på tilbaketasten."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Trykk og hold nede en tast for flere valg"\n</b></font><font size="3">\n</font>"Få tilgang til skilletegn og aksenter."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Innstillinger for tastatur"\n</b></font><font size="3">\n</font>"Trykk på &amp; hold "<b>"?123"</b>"-tasten."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".no"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".com"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".net"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".org"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".info"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På hovedtastatur"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På talltastatur"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Av"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon på hovedtast."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofon på talltastatur"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Taleinndata er deaktiv."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Velg inndatametode"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Dra fingeren på mellomromstasten for å endre språk"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brukertilbakemelding"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Ved å sende bruksstatistikk og programstopprapporter til Google automatisk, hjelper du oss med å gjøre redigeringsfunksjonen for denne inndatametoden enda bedre."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Trykk for å korrigere ord"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Trykk på ordene for å korrigere dem når forslag vises"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Trykk på ordene for å korrigere dem når forslag vises"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tastaturtema"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatur"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"stemme"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjekkisk tastatur"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dansk tastatur"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tysk tastatur"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannia)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spansk tastatur"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Sveits)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlandsk tastatur"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjekkisk tale"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Tysk tale"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spansk tale"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransk tale"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japansk tale"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreansk tale"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polsk tale"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugisisk tale"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russisk tale"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Tyrkisk tale"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modus for nyttighetsvurdering"</string>
</resources>
diff --git a/java/res/values-nl/donottranslate-altchars.xml b/java/res/values-nl/donottranslate-altchars.xml
index d3beafade..e26a74967 100644
--- a/java/res/values-nl/donottranslate-altchars.xml
+++ b/java/res/values-nl/donottranslate-altchars.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -18,13 +18,10 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òóôõöœø9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">á,ä,â,à,æ,ã,å,ā</string>
+ <string name="alternates_for_e">3,é,ë,ê,è,ę,ė,ē</string>
+ <string name="alternates_for_i">8,í,ï,ì,î,į,ī</string>
+ <string name="alternates_for_o">9,ó,ö,ô,ò,õ,œ,ø,ō</string>
+ <string name="alternates_for_u">7,ú,ü,û,ù,ū</string>
+ <string name="alternates_for_n">ñ,ń</string>
</resources>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index b4c611d70..a2a2ea7fe 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Trillen bij toetsaanslag"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Geluid bij toetsaanslag"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pop-up bij toetsaanslag"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Typefouten corrigeren"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Foutcorrectie tijdens invoer inschakelen"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Invoerfouten in liggende weergave"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Foutcorrectie tijdens invoer inschakelen"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Woordsuggesties"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Het vorige woord automatisch corrigeren"</string>
- <string name="prediction" msgid="466220283138359837">"Woordsuggesties"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Instellingen voor woordsuggesties"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Automatisch voltooien tijdens typen inschakelen"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatisch voltooien"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Tekstveld vergroten"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Woordsuggesties verbergen in liggende weergave"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Instellingen voor woordsuggesties"</string>
<string name="auto_cap" msgid="1719746674854628252">"Auto-hoofdlettergebruik"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Hoofdletter gebruiken aan het begin van een zin"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatische interpunctie"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Snelle oplossingen"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Hiermee worden veelvoorkomende typefouten gecorrigeerd"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Suggesties weergeven"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Voorgestelde woorden weergeven tijdens typen"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Auto-aanvullen"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Suggesties weergeven"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Voorgestelde woorden weergeven tijdens typen"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Altijd weergeven"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Weergeven in staande modus"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Altijd verbergen"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Instellingscode weergeven"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisch"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Altijd weergeven"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Altijd verbergen"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Autocorrectie"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Met de spatiebalk en interpunctie wordt het gemarkeerde woord automatisch ingevoegd"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Uitgeschakeld"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Normaal"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agressief"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Digram-suggesties"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Vorig woord gebruiken om suggestie te verbeteren"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Geen"</item>
- <item msgid="1669461741568287396">"Basis"</item>
- <item msgid="4894328801530136615">"Geavanceerd"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: opgeslagen"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Houd een toets ingedrukt om diakritische tekens weer te geven (ø, ö, enzovoort)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Druk op elk gewenst moment op de toets Terug ↶ om het toetsenbord te sluiten"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Toegang tot cijfers en symbolen"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Blijf drukken op het meest linkse woord om het toe te voegen aan het woordenboek"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Raak deze tip aan om door te gaan »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Raak dit punt aan om deze tip te sluiten en te beginnen met typen."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Het toetsenbord wordt geopend wanneer u een tekstveld aanraakt"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Blijf een toets aanraken om diakritische tekens weer te geven"\n"(ø, ö, ô, ó, enzovoort)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Schakel over naar cijfers en symbolen door deze toets aan te raken"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Ga terug naar letters door deze toets nogmaals aan te raken"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Blijf deze toets aanraken om toetsenbordinstellingen te wijzigen, zoals auto-aanvullen"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Probeer het zelf!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Beginnen"</string>
<string name="label_next_key" msgid="362972844525672568">"Volgende"</string>
<string name="label_done_key" msgid="2441578748772529288">"Gereed"</string>
<string name="label_send_key" msgid="2815056534433717444">"Verzenden"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"Alt"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Meer"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Onderbr."</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Wacht"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Spraakinvoer"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spraakinvoer wordt momenteel niet ondersteund in uw taal, maar is wel beschikbaar in het Engels."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Spraakinvoer is een experimentele functie met de spraakherkenning van het Google-netwerk."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Als u spraakinvoer wilt uitschakelen, gaat u naar de toetsenbordinstellingen."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Als u spraakinvoer gebruikt, drukt u op de microfoonknop of schuift u uw vinger over het schermtoetsenbord."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Spraakinvoer maakt gebruik van de spraakherkenning van Google. Het "<a href="http://m.google.com/privacy">"Privacybeleid van Google Mobile"</a>" is van toepassing."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Als u spraakinvoer wilt uitschakelen, gaat u naar de instellingen voor invoermethoden."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Druk op de microfoontoets om spraakinvoer te gebruiken."</string>
<string name="voice_listening" msgid="467518160751321844">"Nu spreken"</string>
<string name="voice_working" msgid="6666937792815731889">"Wordt uitgevoerd"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Annuleren"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Spraakinvoer"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Op hoofdtoetsenbord"</item>
- <item msgid="8529385602829095903">"Op toetsenbord voor symbolen"</item>
- <item msgid="7283103513488381103">"Uit"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Microfoon op hoofdtoetsenbord"</item>
- <item msgid="6907837061058876770">"Microfoon op toetsenbord voor symbolen"</item>
- <item msgid="3664304608587798036">"Spraakinvoer is uitgeschakeld"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Automatisch verzenden na spraak"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Drukt automatisch op Enter tijdens het zoeken of wanneer u naar het volgende veld wilt gaan."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Het toetsenbord openen"\n</b></font><font size="3">\n</font>"Raak een tekstveld aan."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Het toetsenbord sluiten"\n</b></font><font size="3">\n</font>"Druk op de terugtoets."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Een toets blijven aanraken voor opties"\n</b></font><font size="3">\n</font>"Toegang tot interpunctie en diakritische tekens."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Toetsenbordinstellingen"\n</b></font><font size="3">\n</font>"Blijf de toets \'"<b>"?123"</b>"\' aanraken."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Op hoofdtoetsenbord"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Op symbooltoetsenb."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Uitgeschakeld"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic op hoofdtoetsb."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic op symb.toetsb."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spraakinvoer is uit"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Invoermethode selecteren"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Schuif uw vinger over de spatiebalk om de taal te wijzigen"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Gebruikersfeedback inschakelen."</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Help deze invoermethode te verbeteren door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Raak aan om woorden te corrigeren"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Ingevoerde woorden aanraken om ze te verbeteren, alleen mogelijk wanneer er suggesties worden weergegeven"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Ingevoerde woorden aanraken om ze te verbeteren, alleen mogelijk wanneer er suggesties worden weergegeven"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Toetsenbordthema"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"toetsenbord"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"spraak"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjechisch toetsenbord"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Deens toetsenbord"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Duits toetsenbord"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engels toetsenbord (VK)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engels toetsenbord (VS)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spaans toetsenbord"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spaans toetsenbord (VS)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Frans toetsenbord"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Frans toetsenbord (Canada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Frans toetsenbord (Zwitserland)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiaans toetsenbord"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Noors toetsenbord"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlands toetsenbord"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisch toetsenbord"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Servisch toetsenbord"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Zweeds toetsenbord"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjechische stem"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Duitse stem"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spaanse stem"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Franse stem"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanse stem"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreaanse stem"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Poolse stem"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugese stem"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russische stem"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkse stem"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modus voor gebruiksvriendelijkheidsonderzoek"</string>
</resources>
diff --git a/java/res/values-pl/donottranslate-altchars.xml b/java/res/values-pl/donottranslate-altchars.xml
index da6b5fd5c..971d73bc5 100644
--- a/java/res/values-pl/donottranslate-altchars.xml
+++ b/java/res/values-pl/donottranslate-altchars.xml
@@ -18,15 +18,12 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">ą</string>
- <string name="alternates_for_e">ę3</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">ó9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">ś</string>
- <string name="alternates_for_n">ń</string>
- <string name="alternates_for_c">ć</string>
- <string name="alternates_for_y">ýÿ6</string>
- <string name="alternates_for_z">źż</string>
+ <string name="alternates_for_a">ą,á,à,â,ä,æ,ã,å,ā</string>
+ <string name="alternates_for_e">3,ę,è,é,ê,ë,ė,ē</string>
+ <string name="alternates_for_o">9,ó,ö,ô,ò,õ,œ,ø,ō</string>
+ <string name="alternates_for_s">ś,ß,š</string>
+ <string name="alternates_for_n">ń,ñ</string>
+ <string name="alternates_for_c">ć,ç,č</string>
+ <string name="alternates_for_z">ż,ź,ž</string>
<string name="alternates_for_l">ł</string>
</resources>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index cd2cb69f0..f66a02449 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Wibracja przy naciśnięciu"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Dźwięk przy naciśnięciu"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Powiększ po naciśnięciu"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Popraw błędy pisowni"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Włącz poprawianie błędów wprowadzania"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Błędy wprowadzania w orientacji poziomej"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Włącz poprawianie błędów wprowadzania"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Sugestie słów"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Automatycznie poprawiaj poprzednie słowo"</string>
- <string name="prediction" msgid="466220283138359837">"Sugestie słów"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Ustawienia propozycji słów"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Włącz autouzupełnianie podczas wpisywania"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autouzupełnianie"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Zwiększ rozmiar pola tekstowego"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Wyłącz sugestie słów w orientacji poziomej"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Ustawienia sugestii słów"</string>
<string name="auto_cap" msgid="1719746674854628252">"Wstawiaj wielkie litery"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Zamieniaj na wielką pierwszą literę zdania"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatyczna interpunkcja"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Szybkie poprawki"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Poprawia częste błędy wpisywania"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Pokaż sugestie"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Wyświetl sugerowane słowa podczas wpisywania"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Autouzupełnianie"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Spacja i znaki przestankowe wstawiają wyróżnione słowo"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokazuj sugestie"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Wyświetl proponowane słowa podczas wpisywania"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Zawsze pokazuj"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Pokaż w orientacji pionowej"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Zawsze ukrywaj"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Pokaż klawisz ustawień"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatycznie"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Zawsze pokazuj"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Zawsze ukrywaj"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Autokorekta"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Spacja i znaki przestankowe automatycznie wstawiają podświetlone słowo"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Wyłącz"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Umiarkowana"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresywna"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Sugestie dla bigramów"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Używaj poprzedniego wyrazu, aby polepszyć sugestię"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Brak"</item>
- <item msgid="1669461741568287396">"Podstawowy"</item>
- <item msgid="4894328801530136615">"Zaawansowany"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Zapisano"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Przytrzymaj klawisz, aby wyświetlić znaki akcentowane (ą, ó itp.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Naciśnij klawisz cofania ↶, aby zamknąć klawiaturę w dowolnym momencie"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Przejdź do cyfr i symboli"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Naciśnij i przytrzymaj słowo po lewej stronie w celu dodania go do słownika"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Dotknij tej podpowiedzi, aby kontynuować »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Dotknij tutaj, aby zamknąć tę podpowiedź i zacząć pisać!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klawiatura jest otwierana po każdym dotknięciu pola tekstowego."</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Dotknij i przytrzymaj klawisz, aby wyświetlić znaki akcentowane"\n"(ą, ę, ł, ó itd.)."</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Przełącz na cyfry i symbole, dotykając tego klawisza."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Wróć do trybu liter, dotykając ponownie tego klawisza."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Dotknij i przytrzymaj ten klawisz, aby zmienić ustawienia klawiatury, takie jak autouzupełnianie."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Wypróbuj!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"OK"</string>
<string name="label_next_key" msgid="362972844525672568">"Dalej"</string>
<string name="label_done_key" msgid="2441578748772529288">"OK"</string>
<string name="label_send_key" msgid="2815056534433717444">"Wyślij"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Więcej"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Czekaj"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Wprowadzanie głosowe"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Wprowadzanie głosowe obecnie nie jest obsługiwane w Twoim języku, ale działa w języku angielskim."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Wprowadzanie głosowe to funkcja eksperymentalna wykorzystująca funkcję firmy Google umożliwiającą rozpoznawanie mowy przy użyciu sieci."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Aby wyłączyć wprowadzanie głosowe, przejdź do ustawień klawiatury."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Aby skorzystać z wprowadzania głosowego, naciśnij przycisk mikrofonu lub przesuń palcem po klawiaturze ekranowej."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Wprowadzanie głosowe używa mechanizmu rozpoznawania mowy opracowanego przez Google. Obowiązuje "<a href="http://m.google.com/privacy">"Polityka prywatności Google Mobile"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Aby wyłączyć wprowadzanie głosowe, przejdź do ustawień metody wprowadzania."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Aby używać wprowadzania głosowego, naciśnij przycisk mikrofonu."</string>
<string name="voice_listening" msgid="467518160751321844">"Mów teraz"</string>
<string name="voice_working" msgid="6666937792815731889">"W toku"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Anuluj"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Wprowadzanie głosowe"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Na klawiaturze głównej"</item>
- <item msgid="8529385602829095903">"Na klawiaturze z symbolami"</item>
- <item msgid="7283103513488381103">"Wyłączone"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofon na klawiaturze głównej"</item>
- <item msgid="6907837061058876770">"Mikrofon na klawiaturze z symbolami"</item>
- <item msgid="3664304608587798036">"Wprowadzanie głosowe jest wyłączone"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Automatyczne przesyłanie uruchamiane głosem"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Podczas wyszukiwania lub przechodzenia do następnego pola automatycznie naciśnij klawisz Enter."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otwórz klawiaturę"\n</b></font><font size="3">\n</font>"Dotknij dowolnego pola tekstowego."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zamknij klawiaturę"\n</b></font><font size="3">\n</font>"Naciśnij klawisz Wróć."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Dotknij klawisza i przytrzymaj go, aby wyświetlić opcje"\n</b></font><font size="3">\n</font>"Dostęp do znaków przestankowych i akcentowanych."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ustawienia klawiatury"\n</b></font><font size="3">\n</font>"Dotknij klawisza "<b>"?123"</b>" i przytrzymaj go."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na klawiaturze głównej"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klawiaturze z symbolami"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Wyłącz"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon na klawiaturze głównej"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofon na klawiaturze z symbolami"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Wprowadzanie głosowe jest wyłączone"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Wybierz metodę wprowadzania"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Przesuń palcem po spacji, aby zmienić język"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Włącz przesyłanie opinii użytkownika"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Pomóż ulepszyć edytor tej metody wprowadzania, automatycznie wysyłając do Google statystyki użycia i raporty o awariach."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Popraw dotknięte słowo"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotknięte słowo zostanie poprawione"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Popraw dotknięte słowo tylko jeśli wyświetlone są sugestie"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Motyw klawiatury"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klawiatura"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"głosowe"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Klawiatura czeska"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Klawiatura duńska"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Klawiatura niemiecka"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klawiatura angielska (Wielka Brytania)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klawiatura angielska (Stany Zjednoczone)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klawiatura hiszpańska"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Klawiatura hiszpańska (Stany Zjednoczone)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klawiatura francuska"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klawiatura francuska (Kanada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klawiatura francuska (Szwajcaria)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klawiatura włoska"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klawiatura norweska"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klawiatura holenderska"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klawiatura rosyjska"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klawiatura serbska"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klawiatura szwedzka"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Lektor czeski"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Lektor niemiecki"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Lektor hiszpański"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Lektor francuski"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Lektor japoński"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Lektor koreański"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Lektor polski"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Lektor portugalski"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Lektor rosyjski"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Lektor turecki"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Tryb badania użyteczności"</string>
</resources>
diff --git a/java/res/values-pt-rPT/donottranslate-altchars.xml b/java/res/values-pt-rPT/donottranslate-altchars.xml
deleted file mode 100644
index d3beafade..000000000
--- a/java/res/values-pt-rPT/donottranslate-altchars.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òóôõöœø9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
-</resources>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 3d7ea1852..9bcc1ac23 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao primir as teclas"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Som ao premir as teclas"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Mostrar popup ao premir tecla"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Corrigir erros de escrita"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Activar a correcção de erros de entrada"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Erros de entrada na horizontal"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activar a correcção de erros de entrada"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Sugestões de palavras"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Corrigir automaticamente a palavra anterior"</string>
- <string name="prediction" msgid="466220283138359837">"Sugestões de palavras"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Definições de sugestão de palavras"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Activar a conclusão automática durante a escrita"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Conclusão automática"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar o tamanho do campo de texto"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugestões de palavras na vista horizontal"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Definições de sugestão de palavras"</string>
<string name="auto_cap" msgid="1719746674854628252">"Letras maiúsculas automáticas"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Colocar inicial maiúscula no início de uma frase"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Pontuação automática"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Correcções rápidas"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige os erros de escrita comuns"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Mostrar sugestões"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Apresentar sugestões de palavras ao escrever"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Conclusão automática"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"A barra de espaços e a pontuação inserem automaticamente uma palavra realçada"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugestões"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Apresentar sugestões de palavras ao escrever"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar em modo de retrato"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar sempre"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla das definições"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automático"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar sempre"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ocultar sempre"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Auto correcção"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"A barra de espaço e a pontuação inserem automaticamente uma palavra realçada"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desligar"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agressiva"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Sugestões Bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilizar a palavra anterior para melhorar a sugestão"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Nenhum"</item>
- <item msgid="1669461741568287396">"Básico"</item>
- <item msgid="4894328801530136615">"Avançados"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Mantenha uma tecla premida para ver os acentos (ø, ö, etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Prima a tecla de retrocesso ↶ para fechar o teclado a qualquer momento"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Aceder a números e símbolos"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Prima e mantenha premida a palavra mais à esquerda para a adicionar ao dicionário"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Toque nesta sugestão para continuar »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Toque aqui para fechar esta sugestão e começar a escrever!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"O teclado abre quando tocar num campo de texto"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Mantenha premida uma tecla para ver os acentos"\n"(ø, ö, ô, ó, etc.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Mude para números e símbolos tocando nesta tecla"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Regresse às letras tocando novamente nesta tecla"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Mantenha premida esta tecla para alterar definições do teclado, tais como a conclusão automática"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Experimente!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
<string name="label_next_key" msgid="362972844525672568">"Seguinte"</string>
<string name="label_done_key" msgid="2441578748772529288">"Feito"</string>
<string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Mais"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente, a entrada de voz não é suportada para o seu idioma, mas funciona em inglês."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A entrada de voz é uma funcionalidade experimental que utiliza o reconhecimento de voz em rede da Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar a entrada de voz, aceda às definições do teclado."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para utilizar a entrada de voz, prima o botão do microfone ou deslize o dedo no teclado do ecrã."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz utiliza o reconhecimento de voz da Google. É aplicável "<a href="http://m.google.com/privacy">"a política de privacidade do Google Mobile "</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar a entrada de voz, aceda às definições de entrada de som."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar a entrada de voz, prima o botão do microfone."</string>
<string name="voice_listening" msgid="467518160751321844">"Falar agora"</string>
<string name="voice_working" msgid="6666937792815731889">"A executar"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Entrada de voz"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"No teclado principal"</item>
- <item msgid="8529385602829095903">"No teclado de símbolos"</item>
- <item msgid="7283103513488381103">"Desactivada"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Microfone no teclado principal"</item>
- <item msgid="6907837061058876770">"Microfone no teclado de símbolos"</item>
- <item msgid="3664304608587798036">"A entrada de voz está desactivada"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Enviar automaticamente depois da voz"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Premir automaticamente ENTER ao pesquisar ou avançar para o campo seguinte."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abra o teclado"\n</b></font><font size="3">\n</font>"Toque em qualquer campo de texto."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Feche o teclado"\n</b></font><font size="3">\n</font>"Prima a tecla \"Anterior\"."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Mantenha premida uma tecla para as opções"\n</b></font><font size="3">\n</font>"Aceder a pontuação e acentos."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Definições do teclado"\n</b></font><font size="3">\n</font>"Mantenha premida a tecla "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"No teclado principal"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"No teclado símbolos"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Desligar"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic. tecl. principal"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic. tecl. símbolos"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. voz desact."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de entrada"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo pela barra de espaço para alterar o idioma"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Activar comentários do utilizador"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Envie automaticamente estatísticas de utilização e relatórios de falhas para a Google e ajude-nos a melhor este editor de método de introdução."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corrigir palavras"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toque nas palavras que introduziu para as corrigir, apenas quando aparecerem sugestões."</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toque nas palavras que introduziu para as corrigir, apenas quando aparecerem sugestões."</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema do teclado"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclado"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"voz"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado checo"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado dinamarquês"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado alemão"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglês (Reino Unido)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado inglês (EUA)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado espanhol"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclado espanhol (EUA)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francês"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francês (Canadá)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francês (Suíça)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado norueguês"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandês"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado russo"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado sérvio"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz checa"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz alemã"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz espanhola"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz francesa"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz japonesa"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz coreana"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz polaca"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz portuguesa"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz russa"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz turca"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modo de estudo da capacidade de utilização"</string>
</resources>
diff --git a/java/res/values-pt/donottranslate-altchars.xml b/java/res/values-pt/donottranslate-altchars.xml
index d3beafade..a39976151 100644
--- a/java/res/values-pt/donottranslate-altchars.xml
+++ b/java/res/values-pt/donottranslate-altchars.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -18,13 +18,10 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òóôõöœø9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">á,ã,à,â,ä,å,æ,ª</string>
+ <string name="alternates_for_e">3,é,ê,è,ę,ė,ē,ë</string>
+ <string name="alternates_for_i">8,í,î,ì,ï,į,ī</string>
+ <string name="alternates_for_o">9,ó,õ,ô,ò,ö,œ,ø,ō,º</string>
+ <string name="alternates_for_u">7,ú,ü,ù,û,ū</string>
+ <string name="alternates_for_c">ç,č,ć</string>
</resources>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index d359ce932..94e3cb54d 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao tocar a tecla"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Som ao tocar a tecla"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Exibir pop-up ao digitar"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Corrigir erros de digitação"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Ativar a correção de erro de entrada"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Erros de entrada de paisagem"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Ativar a correção de erro de entrada"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Sugestões de palavra"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Corrigir automaticamente a palavra anterior"</string>
- <string name="prediction" msgid="466220283138359837">"Sugestões de palavra"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Configurações de sugestão de palavra"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Ativar a conclusão automática durante a digitação"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Conclusão automática"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar o tamanho do arquivo de texto"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugestões de palavra na visualização da paisagem"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Configurações de sugestão de palavra"</string>
<string name="auto_cap" msgid="1719746674854628252">"Capitaliz. automática"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Colocar em maiúscula o início de uma frase"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Pontuação automática"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Reparos rápidos"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige erros comuns de digitação"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Mostrar sugestões"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Exibir sugestões de palavras durante a digitação"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Conclusão automática"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Barra de espaço e pontuação inserem a palavra destacada"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugestões"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Exibir sugestões de palavras durante a digitação"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar no modo de retrato"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Sempre ocultar"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de config."</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automático"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar sempre"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Sempre ocultar"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Autocorreção"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Barra de espaço e pontuação inserem automaticamente a palavra destacada"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desativado"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderado"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agressivo"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Sugestões de bigrama"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Usar palavra anterior para melhorar a sugestão"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Nenhum"</item>
- <item msgid="1669461741568287396">"Básico"</item>
- <item msgid="4894328801530136615">"Avançado"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Salvo"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Segure uma tecla pressionada para ver os acentos (ø, ö, etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Apertar a tecla voltar ↶ para fechar o teclado, em qualquer ponto"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Acessar números e símbolos"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pressione e segure a palavra mais à esquerda para adicioná-la ao dicionário"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Toque nesta dica para continuar »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Toque aqui para fechar esta dica e começar a digitar!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"O teclado abre toda vez que você tocar em um campo de texto"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocar e segurar uma tecla para visualizar acentos"\n"(ø, ö, ô, ó e assim por diante)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Alternar para números e símbolos tocando nessa tecla"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Voltar às letras tocando novamente nessa tecla"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tocar e segurar esta tecla para alterar as configurações do teclado, como a conclusão automática"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Experimente!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
<string name="label_next_key" msgid="362972844525672568">"Avançar"</string>
<string name="label_done_key" msgid="2441578748772529288">"Feito"</string>
<string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Mais"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A entrada de voz não é suportada no momento para o seu idioma, mas funciona em inglês."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A entrada de voz é um recurso experimental que usa o reconhecimento de fala de rede do Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desativar a entrada de voz, vá para as configurações do teclado."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para usar a entrada de voz, pressione o botão com o microfone ou deslize o dedo sobre o teclado na tela."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz usa o reconhecimento de voz do Google e está sujeita à "<a href="http://m.google.com/privacy">"Política de privacidade do Google Celular"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desativar a entrada de voz, acesse as configurações do método de entrada."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para usar a entrada de voz, pressione o botão do microfone."</string>
<string name="voice_listening" msgid="467518160751321844">"Fale agora"</string>
<string name="voice_working" msgid="6666937792815731889">"Trabalhando"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Cancelar"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Entrada de voz"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"No teclado principal"</item>
- <item msgid="8529385602829095903">"No teclado de símbolos"</item>
- <item msgid="7283103513488381103">"Desativado"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Microfone no teclado principal"</item>
- <item msgid="6907837061058876770">"Microfone no teclado de símbolos"</item>
- <item msgid="3664304608587798036">"Entrada de voz desativada"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Enviar automaticamente depois de falar"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Pressione Enter automaticamente ao pesquisar ou ir para o próximo campo."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abra o teclado"\n</b></font><font size="3">\n</font>"Toque em qualquer campo de texto."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Feche o teclado"\n</b></font><font size="3">\n</font>"Pressione a tecla Voltar."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Toque e mantenha pressionada uma tecla para ver as opções"\n</b></font><font size="3">\n</font>"Acesse a pontuação e as pronúncias."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configurações de teclado"\n</b></font><font size="3">\n</font>"Toque e mantenha pressionada a tecla "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"No teclado principal"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"No teclado de símb."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Desativado"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic. no teclado"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic. no teclado"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Texto por voz desat."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Selecionar método de entrada"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo na barra de espaços para alterar o idioma"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Ativar comentário do usuário"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Ajude a melhorar este editor de método de entrada enviando automaticamente ao Google estatísticas de uso e relatórios de falhas."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corrigir"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toque as palavras para corrigi-las"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toque nas palavras digitadas para corrigi-las somente quando houver sugestões visíveis"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema do teclado"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclado"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"voz"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado em tcheco"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado em dinamarquês"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado em alemão"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado em inglês (RU)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado em inglês (EUA)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado em espanhol"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclado em espanhol (EUA)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado em francês"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado em francês (Canadá)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado em francês (Suíça)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado em italiano"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado em norueguês"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado em holandês"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado em russo"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado em sérvio"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado em sueco"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice em tcheco"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice em alemão"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Google Voice em espanhol"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Google Voice em francês"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice em japonês"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice em coreano"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Google Voice em polonês"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Google Voice em português"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Google Voice em russo"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Google Voice em turco"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modo de estudo de usabilidade"</string>
</resources>
diff --git a/java/res/values-rm/donottranslate-altchars.xml b/java/res/values-rm/donottranslate-altchars.xml
index f17026fa9..0a5d2aad1 100644
--- a/java/res/values-rm/donottranslate-altchars.xml
+++ b/java/res/values-rm/donottranslate-altchars.xml
@@ -18,13 +18,5 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">òóöôõœø9</string>
- <string name="alternates_for_u">ùúûü7</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_o">9,ò,ó,ö,ô,õ,œ,ø</string>
</resources>
diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml
index 47afae9a6..3372d0f62 100644
--- a/java/res/values-rm/strings.xml
+++ b/java/res/values-rm/strings.xml
@@ -27,28 +27,22 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar cun smatgar in buttun"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Tun cun smatgar in buttun"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pop-up cun smatgar ina tasta"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Curreger sbagls d\'endataziun"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Activar la correctura da sbagls d\'endataziun"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Sbagls d\'endataziun en il format orizontal"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activar la correctura da sbagls d\'endataziun"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Propostas da pleds"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Curreger automaticamain il pled precedent"</string>
- <string name="prediction" msgid="466220283138359837">"Propostas da pleds"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Parameters da las propostas per pleds"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Activar la cumplettaziun automatica durant l\'endataziun"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Cumplettaziun automatica"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Engrondir il champ da text"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Zuppentar propostas da pleds en il format orizontal"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 7027100625580696660 --> <string name="prediction_category" msgid="6361242011806282176">"Parameters da las propostas per pleds"</string>
<string name="auto_cap" msgid="1719746674854628252">"Maiusclas automaticas"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Scriver grond l\'entschatta da mintga frasa"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Interpuncziun automatica"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Correcturas sveltas"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Curregia sbagls da tippar currents"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Mussar las propostas"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Mussar pleds proponids durant l\'endataziun"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Cumplettaziun automatica"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Inserir auto. il pled marcà cun la tasta da vid/interpuncziun"</string>
+ <!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
+ <skip />
+ <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) -->
+ <skip />
+ <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) -->
+ <skip />
+ <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) -->
+ <skip />
+ <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) -->
+ <skip />
<!-- no translation found for prefs_settings_key (4623341240804046498) -->
<skip />
<!-- no translation found for settings_key_mode_auto_name (2993460277873684680) -->
@@ -57,42 +51,34 @@
<skip />
<!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
<skip />
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Propostas da pleds"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Curreger automaticamain il pled precedent"</string>
+ <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) -->
+ <skip />
+ <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) -->
+ <skip />
+ <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) -->
+ <skip />
<string name="bigram_suggestion" msgid="1323347224043514969">"Propostas da tip bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Meglierar la proposta cun agid dal pled precedent"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Nagin"</item>
- <item msgid="1669461741568287396">"Simpel"</item>
- <item msgid="4894328801530136615">"Avanzà"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Memorisà"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"\"Tegnair smatgà per mussar ils accents (à, é, etc.)\""</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Smatgar ↶ per serrar la tastatura"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Acceder a cifras e simbols"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Smatgar ditg sin il pled dal tut a sanestra per l\'agiuntar al dicziunari"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Tutgar quest commentari per cuntinuar »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"\"Tutgar qua, per serrar quest commentari e cumenzar a tippar!\""</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"La tastatura vegn adina averta sche Vus tutgais in champ da text."</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501">"\""<b>"Tegnai smatgà ina tasta per mussar ils segns spezials"\n"(ø, ö, ô, ó etc.)."</b>"\""</string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Midai a numers e simbols cun tutgar quest buttun."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Turnai a letras cun smatgar danovamain quest buttun."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128">"\""<b>"Tegnai smatgà quest buttun per midar ils parameters da tastatura, sco p. ex. la cumplettaziun automatica."</b>"\""</string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Empruvai!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Dai"</string>
<string name="label_next_key" msgid="362972844525672568">"Vinavant"</string>
<string name="label_done_key" msgid="2441578748772529288">"Finì"</string>
<string name="label_send_key" msgid="2815056534433717444">"Trametter"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
<string name="voice_warning_title" msgid="4419354150908395008">"Cumonds vocals"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"\"Cumonds vocals en Vossa lingua na vegnan actualmain betg sustegnids, ma la funcziun è disponibla per englais.\""</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"\"Per deactivar ils cumonds vocals, avri ils parameters da tastatura.\""</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"\"Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur.\""</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"\"Per deactivar ils cumonds vocals, avri ils parameters da tastatura.\""</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"\"Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur.\""</string>
<string name="voice_listening" msgid="467518160751321844">"Ussa discurrer"</string>
<string name="voice_working" msgid="6666937792815731889">"Operaziun en progress"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -109,27 +95,18 @@
<string name="cancel" msgid="6830980399865683324">"Interrumper"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Cumonds vocals"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Sin la tastatura principala"</item>
- <item msgid="8529385602829095903">"Sin la tastatura da simbols"</item>
- <item msgid="7283103513488381103">"Deactivà"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Microfon sin la tastatura principala"</item>
- <item msgid="6907837061058876770">"Microfon sin la tastatura da simbols"</item>
- <item msgid="3664304608587798036">"Ils cumonds vocals èn deactivads"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Trametter automaticamain suenter il cumond vocal"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Smatgai sin la tasta enter sche Vus exequis ina tschertga u siglis al proxim champ."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Avrir la tastatura"\n</b></font><font size="3">\n</font>"Tutgai inqual champ da text."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103">"\""<font size="17"><b>"Serrar la tastatura"\n</b></font><font size="3">\n</font>"Smatgai il buttun \"\"Enavos\"\".\""</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tutgar e tegnair smatgà in buttun per acceder a las opziuns"\n</b></font><font size="3">\n</font>"Accedi a segns d\'interpuncziun ed accents."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Parameters da tastatura"\n</b></font><font size="3">\n</font>"Tutgai e tegnai smatgà il buttun "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) -->
+ <skip />
+ <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) -->
+ <skip />
+ <!-- no translation found for voice_input_modes_off (3745699748218082014) -->
+ <skip />
+ <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) -->
+ <skip />
+ <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) -->
+ <skip />
+ <!-- no translation found for voice_input_modes_summary_off (63875609591897607) -->
+ <skip />
<!-- no translation found for selectInputMethod (315076553378705821) -->
<skip />
<string name="language_selection_title" msgid="1651299598555326750">"Linguas da cumonds vocals"</string>
@@ -140,9 +117,75 @@
<string name="prefs_description_log" msgid="5827825607258246003">"Gidai a meglierar quest editur da la metoda d\'endataziun cun trametter automaticamain datas statisticas davart l\'utilisaziun e rapports da collaps a Google."</string>
<!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
<skip />
- <!-- no translation found for prefs_enable_recorrection_summary (1056068922330206170) -->
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
<skip />
<string name="keyboard_layout" msgid="437433231038683666">"Design da la tastatura"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatura"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"vusch"</string>
+ <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) -->
+ <skip />
+ <!-- no translation found for subtype_mode_da_keyboard (1243570804427922104) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_keyboard (1990979135959462145) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_keyboard (7945856548410373708) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (3708655163769735410) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) -->
+ <skip />
+ <!-- no translation found for subtype_mode_fr_keyboard (8016515336759761014) -->
+ <skip />
+ <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) -->
+ <skip />
+ <!-- no translation found for subtype_mode_it_keyboard (4934199655425394484) -->
+ <skip />
+ <!-- no translation found for subtype_mode_nb_keyboard (1175783216100212360) -->
+ <skip />
+ <!-- no translation found for subtype_mode_nl_keyboard (5090278083256037936) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ru_keyboard (1383995915064277943) -->
+ <skip />
+ <!-- no translation found for subtype_mode_sr_keyboard (5019440799612208168) -->
+ <skip />
+ <!-- no translation found for subtype_mode_sv_keyboard (4933838139861753401) -->
+ <skip />
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- no translation found for subtype_mode_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_voice (1323473601346507487) -->
+ <skip />
+ <!-- no translation found for subtype_mode_fr_voice (4675914209337824269) -->
+ <skip />
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <skip />
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- no translation found for subtype_mode_pl_voice (2076196021014840487) -->
+ <skip />
+ <!-- no translation found for subtype_mode_pt_voice (8036522712795994397) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ru_voice (8034596947963787529) -->
+ <skip />
+ <!-- no translation found for subtype_mode_tr_voice (3402067436761140005) -->
+ <skip />
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-ro/donottranslate-altchars.xml b/java/res/values-ro/donottranslate-altchars.xml
new file mode 100644
index 000000000..728ead472
--- /dev/null
+++ b/java/res/values-ro/donottranslate-altchars.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="alternates_for_a">ă,â,à,á,ä,æ,ã,å,ā</string>
+ <string name="alternates_for_i">8,î,ï,ì,í,į,ī</string>
+ <string name="alternates_for_s">ș,ß,ś,š</string>
+ <string name="alternates_for_t">5,ț</string>
+</resources>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index e0628ca6a..5f9de8db8 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrare la apăsarea tastei"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Sunet la apăsarea tastei"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Fereastră pop-up la apăsarea tastei"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Corectaţi erorile de dactilografiere"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Activaţi corectarea erorii de intrare"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Erori de introducere în modul peisaj"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activaţi corectarea erorii de intrare"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Sugestii de cuvinte"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Corecţie automată a cuvântului anterior"</string>
- <string name="prediction" msgid="466220283138359837">"Sugestii de cuvinte"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Setările sugestiei de cuvinte"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Activaţi completarea automată în timpul introducerii textului"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Completare automată"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Măriţi dimensiunea câmpului text"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ascundeţi sugestiile de cuvinte în vizualizarea de tip peisaj"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Setările sugestiei de cuvinte"</string>
<string name="auto_cap" msgid="1719746674854628252">"Auto-capitalizare"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Doresc să se scrie cu majusculă începutul propoziţiilor"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Punctuaţie automată"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Remedieri rapide"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corectează greşelile introduse frecvent"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Afişaţi sugestiile"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Afişare sugestii de cuvinte în timpul introducerii de text"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Completare automată"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Bara de spaţiu şi punctuaţia inserează automat un cuvânt evidenţiat"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Afişaţi sugestiile"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Afişare sugestii de cuvinte în timpul introducerii de text"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Afişaţi întotdeauna"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afişaţi în modul Portret"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ascundeţi întotdeauna"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Afişaţi tasta setări"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automat"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Afişaţi întotdeauna"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ascundeţi întotdeauna"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Autocorecţie"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Bara de spaţiu şi punctuaţia inserează automat un cuvânt evidenţiat"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Dezactivată"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderată"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivă"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Sugestii pentru cuvinte de două litere"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilizaţi cuvântul anterior pentru a îmbunătăţi sugestia"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Niciunul"</item>
- <item msgid="1669461741568287396">"De bază"</item>
- <item msgid="4894328801530136615">"Avansat"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: salvat"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Ţineţi o tastă apăsată pentru a vedea accentele (ø, ö, etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Apăsaţi tasta Înapoi ↶ pentru a închide oricând tastatura"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Accesaţi numere şi simboluri"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Apăsaţi şi ţineţi apăsat pe cuvântul cel mai din stânga, pentru a-l adăuga la dicţionar"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Atingeţi acest indiciu pentru a continua »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Atingeţi aici pentru a închide acest indiciu şi începeţi să introduceţi text!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastatura se deschide de fiecare dată când atingeţi un câmp text"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Atingeţi şi ţineţi apăsată o tastă pentru a vizualiza accentele"\n"(ø, ö, ô, ó etc.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Comutaţi între numere şi simboluri atingând această tastă"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Reveniţi la litere prin atingerea acestei taste din nou"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Apăsaţi şi ţineţi apăsată această tastă pentru a schimba setările tastaturii, cum ar fi completarea automată"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Încercaţi!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Accesaţi"</string>
<string name="label_next_key" msgid="362972844525672568">"Înainte"</string>
<string name="label_done_key" msgid="2441578748772529288">"Terminat"</string>
<string name="label_send_key" msgid="2815056534433717444">"Trimiteţi"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Mai multe"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pauză"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Aşt."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Intrare voce"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Intrarea vocală nu este acceptată în prezent pentru limba dvs., însă funcţionează în limba engleză."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Intrarea vocală este o funcţie experimentală ce utilizează recunoaşterea vocală în reţea oferită de Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Pentru a dezactiva intrarea vocală, accesaţi setările tastaturii."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Pentru a utiliza intrarea vocală, apăsaţi butonul de microfon sau glisaţi degetul de-a lungul tastaturii de pe ecran."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Intrarea vocală utilizează funcţia Google de recunoaştere a vorbirii. Se aplică "<a href="http://m.google.com/privacy">"Politica de confidenţialitate Google Mobil"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Pentru a dezactiva intrarea vocală, accesaţi setările metodei de intrare."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Pentru a utiliza intrarea de voce, apăsaţi pe butonul Microfon."</string>
<string name="voice_listening" msgid="467518160751321844">"Vorbiţi acum"</string>
<string name="voice_working" msgid="6666937792815731889">"Se analizează"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Anulaţi"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Intrare voce"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Pe tastatura principală"</item>
- <item msgid="8529385602829095903">"Pe tastatura de simboluri"</item>
- <item msgid="7283103513488381103">"Dezactivat"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Microfon pe tastatura principală"</item>
- <item msgid="6907837061058876770">"Microfon pe tastatura de simboluri"</item>
- <item msgid="3664304608587798036">"Intrarea vocală este dezactivată"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Trimitere automată după intrarea vocală"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Apăsaţi automat tasta Enter atunci când se face o căutare sau când se trece la câmpul următor."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Deschideţi tastatura"\n</b></font><font size="3">\n</font>"Atingeţi orice câmp de text."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Închideţi tastatura"\n</b></font><font size="3">\n</font>"Apăsaţi pe tasta Înapoi."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Atingeţi şi ţineţi apăsată o tastă pentru opţiuni"\n</b></font><font size="3">\n</font>"Accesaţi punctuaţia şi accentele."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Setările tastaturii"\n</b></font><font size="3">\n</font>"Atingeţi şi ţineţi apăsată tasta "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pe tastat. princip."</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pe tastat. simbol."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Dezactivată"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic. pe tast. princ."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micr. pe tast. simb."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Intr. vocală dezact."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Selectaţi metoda de introducere a textului"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Selectaţi limba"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Glisaţi degetul pe bara de spaţiu pentru a schimba limba"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Activaţi feedback de la utilizatori"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Ajutaţi la îmbunătăţirea acestui instrument de editare a metodelor de introducere a textului trimiţând în mod automat la Google statistici de utilizare şi rapoarte de blocare."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Atingeţi pentru a corecta cuvintele"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Atingeţi cuvintele introduse pentru a le corecta"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Atingeţi cuvintele introduse pentru a le corecta, numai atunci când sunt vizibile sugestii"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Temă pentru tastatură"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatură"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"voce"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tastatură cehă"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Tastatură daneză"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tastatură germană"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastatură englezească (Regatul Unit)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tastatură engleză (S.U.A.)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Tastatură spaniolă"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Tastatură spaniolă (S.U.A.)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastatură franceză"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastatură franceză (Canada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastatură franceză (Elveţia)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Tastatură italiană"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Tastatură norvegiană"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Tastatură olandeză"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Tastatură rusă"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Tastatură sârbă"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Tastatură suedeză"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voce cehă"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voce germană"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voce spaniolă"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voce franceză"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voce japoneză"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voce coreeană"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voce poloneză"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voce portugheză"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voce rusă"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voce turcă"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modul Studiu de utilizare"</string>
</resources>
diff --git a/java/res/values-ru/donottranslate-altchars.xml b/java/res/values-ru/donottranslate-altchars.xml
index 46241a62a..2da8b8469 100644
--- a/java/res/values-ru/donottranslate-altchars.xml
+++ b/java/res/values-ru/donottranslate-altchars.xml
@@ -18,15 +18,6 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">èéêë</string>
- <string name="alternates_for_i">ìíîï</string>
- <string name="alternates_for_o">òóôõöœø</string>
- <string name="alternates_for_u">ùúûü</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ</string>
- <string name="alternates_for_cyrillic_e">ё5</string>
+ <string name="alternates_for_cyrillic_e">5,ё</string>
<string name="alternates_for_cyrillic_soft_sign">ъ</string>
</resources>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index eba8af187..6c5b96f6e 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Виброотклик клавиш"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Звук клавиш"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Увеличение нажатых"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Исправлять опечатки"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Включить исправление ошибок при вводе"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Ошибки при вводе в горизонтальной ориентации"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Включить исправление ошибок при вводе"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Предложение слов"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Автоматически исправлять предыдущее слово"</string>
- <string name="prediction" msgid="466220283138359837">"Предложение слов"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Настройки подсказок"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Включить автоматическое завершение слов при вводе"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Автоматическое завершение"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Увеличить размер текстового поля"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скрывать предложение слов в горизонтальной ориентации"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Настройки подсказок"</string>
<string name="auto_cap" msgid="1719746674854628252">"Автоподст. заглавных"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Делать заглавной первую букву предложения"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Автопунктуация"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Быстрое исправление"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Исправлять распространенные опечатки"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Предлагать варианты"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Предлагать варианты слов во время ввода"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Автозавершение"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"При нажатии пробела вставлять предложенное слово"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Предлагать подсказки"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Предлагать варианты слов во время ввода"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Всегда показывать"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показать вертикально"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Всегда скрывать"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Кнопка настроек"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматически"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Всегда показывать"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Всегда скрывать"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Автоисправление"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"При нажатии пробела или знака препинания вставлять предложенное слово"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Выкл."</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умеренное"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Активное"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Биграммные подсказки"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Используйте предыдущее слово, чтобы исправить подсказку"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Нет"</item>
- <item msgid="1669461741568287396">"Основной"</item>
- <item msgid="4894328801530136615">"Дополнительно"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: сохранено"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Удерживайте клавишу, чтобы увидеть варианты с диакритическими знаками (ø, ö и т.д.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Нажмите клавишу \"Назад\" ↶, чтобы закрыть клавиатуру в любой момент"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Открыть цифры и символы"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Нажмите и удерживайте слово слева, чтобы добавить его в словарь"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Чтобы продолжить, нажмите на эту подсказку »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Нажмите здесь, чтобы закрыть подсказку и начать вводить текст."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавиатура появляется автоматически при касании текстового поля"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Нажмите и удерживайте клавишу для отображения вариантов с диакритическими знаками "\n"(ø, ö, ô, ó и т. п.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Для переключения между вводом цифр и символов используйте эту клавишу"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Чтобы вернуться к буквенной клавиатуре, снова нажмите на эту клавишу"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Чтобы изменить настройки клавиатуры (такие как автозавершение), нажмите и удерживайте эту клавишу"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Попробуйте!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Поиск"</string>
<string name="label_next_key" msgid="362972844525672568">"Далее"</string>
<string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
<string name="label_send_key" msgid="2815056534433717444">"Отправить"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"АБВ"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Ещё"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Приостановить"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Подождите"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Голосовой ввод"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"В настоящее время функция голосового ввода не поддерживает ваш язык, но вы можете пользоваться ей на английском."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Голосовой ввод – экспериментальная функция на основе технологии сетевого распознавания речи от Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Функция голосового ввода отключается в настройках клавиатуры."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Чтобы использовать голосовой ввод, нажмите кнопку микрофона или проведите пальцем по экранной клавиатуре."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Функция голосового ввода использует технологию распознавания речи Google. Применяется "<a href="http://m.google.com/privacy">"Политика конфиденциальности для мобильных устройств"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Функция голосового ввода отключается в настройках способа ввода."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Для использования голосового ввода нажмите на кнопку микрофона."</string>
<string name="voice_listening" msgid="467518160751321844">"Говорите"</string>
<string name="voice_working" msgid="6666937792815731889">"Обработка запроса"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Отмена"</string>
<string name="ok" msgid="7898366843681727667">"ОК"</string>
<string name="voice_input" msgid="2466640768843347841">"Голосовой ввод"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"На основной клавиатуре"</item>
- <item msgid="8529385602829095903">"На клавиатуре символов"</item>
- <item msgid="7283103513488381103">"Выкл."</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Микрофон на основной клавиатуре"</item>
- <item msgid="6907837061058876770">"Микрофон на клавиатуре символов"</item>
- <item msgid="3664304608587798036">"Голосовой ввод отключен"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Автоматически отправлять по окончании голосового ввода"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Автоматически нажимать \"Ввод\" при поиске или переходе к следующему полю."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Открытие клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите на любое текстовое поле."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Закрытие клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите клавишу \"Назад\"."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Нажмите и удерживайте клавишу для вызова параметров"\n</b></font><font size="3">\n</font>"Доступ к пунктуационным и диакритическим знакам."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Настройки клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите и удерживайте клавишу "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На осн. клавиатуре"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На клавиатуре симв."</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Выкл."</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Микр. на осн. клав."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Микр. на клавиатуре симв."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голосовой ввод откл."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Выбрать способ ввода"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Для изменения языка проведите пальцем по пробелу"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Включить отправку сведений"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Помогите усовершенствовать редактор способа ввода, разрешив отправку статистики и отчетов о сбоях в Google."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Исправление нажатие"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"При отображении подсказки нажмите на введенное слово, чтобы исправить его."</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"При отображении подсказки нажмите на введенное слово, чтобы исправить его."</string>
<string name="keyboard_layout" msgid="437433231038683666">"Вид клавиатуры"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"клавиатура"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"голосовой"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Клавиатура: чешский"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Клавиатура: датский"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Клавиатура: немецкий"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Клавиатура: английский (США)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Клавиатура: английский (США)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Клавиатура: испанский"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Клавиатура: испанский (США)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Клавиатура: французский"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Клавиатура: французский (Канада)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Клавиатура: французский (Швейцария)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Клавиатура: итальянский"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Клавиатура: норвежский"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Клавиатура: голландский"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Клавиатура: русский"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Клавиатура: сербский"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Клавиатура: шведский"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Голос: чешский"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Голос: немецкий"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Голос: испанский"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Голос: французский"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Голос: японский"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Голос: корейский"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Голос: польский"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Голос: португальский"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Голос: русский"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Голос: турецкий"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Режим анализа использования"</string>
</resources>
diff --git a/java/res/values-sk/donottranslate-altchars.xml b/java/res/values-sk/donottranslate-altchars.xml
new file mode 100644
index 000000000..6d9836e9c
--- /dev/null
+++ b/java/res/values-sk/donottranslate-altchars.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="alternates_for_a">ä,á,à,â,æ,ã,å,ā</string>
+ <string name="alternates_for_e">3,é,ě,è,ê,ë,ę,ė,ē</string>
+ <string name="alternates_for_i">8,í,î,ï,ì,į,ī</string>
+ <string name="alternates_for_o">9,ô,ó,ö,ò,õ,œ,ø,ō</string>
+ <string name="alternates_for_u">7,ú,ú,û,ü,ù,ū</string>
+ <string name="alternates_for_s">š,ß,ś</string>
+ <string name="alternates_for_n">ň,ñ,ń</string>
+ <string name="alternates_for_c">č,ç,ć</string>
+ <string name="alternates_for_y">6,ý,ÿ</string>
+ <string name="alternates_for_d">ď</string>
+ <string name="alternates_for_r">4,ŕ,ř</string>
+ <string name="alternates_for_t">5,ť</string>
+ <string name="alternates_for_z">ž,ź,ż</string>
+ <string name="alternates_for_l">ľ,ĺ,ł</string>
+</resources>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index 89e3bea29..08248cd3b 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Pri stlačení klávesu vibrovať"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk pri stlačení klávesu"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Zobraziť znaky pri stlačení klávesu"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Opravovať preklepy"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Povoliť opravu chýb vstupu"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Chyby vstupu v zobrazení na šírku"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Povoliť opravu chýb vstupu"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Návrhy slov"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Automaticky opraviť predchádzajúce slovo"</string>
- <string name="prediction" msgid="466220283138359837">"Návrhy slov"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Nastavenia návrhov slov"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Povoliť automatické dokončovanie pri písaní"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatické dokončovanie"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Zväčšiť textové pole"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skryť návrhy slov v zobrazení na šírku"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Nastavenia návrhov slov"</string>
<string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Začať vetu veľkým písmenom"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatická interpunkcia"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Rýchle opravy"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje najčastejšie chyby pri písaní"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Zobraziť návrhy"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Zobrazovať navrhované slová počas písania"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Automatické dokončovanie"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Stlačením medzerníka alebo interpunkčného znamienka automaticky vložíte zvýraznené slovo."</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobraziť návrhy"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Zobrazovať navrhované slová počas písania"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vždy zobrazovať"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Zobraziť v režime na výšku"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vždy skrývať"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Zobraziť kláves Nastavenia"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automaticky"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vždy zobrazovať"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vždy skrývať"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Automatické opravy"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Stlačením medzerníka alebo interpunkčného znamienka automaticky vložíte zvýraznené slovo."</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuté"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mierne"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresívne"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Návrh Bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Na zlepšenie návrhu použiť predchádzajúce slovo"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Žiadne"</item>
- <item msgid="1669461741568287396">"Základné"</item>
- <item msgid="4894328801530136615">"Rozšírené"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Uložené"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Podržaním klávesu zobrazíte diakritiku (á, ž atď.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Stlačením klávesu Späť ↶ môžete klávesnicu kedykoľvek zavrieť."</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Prístup k číslam a symbolom"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Stlačením a podržaním slova úplne vľavo toto slovo pridáte do slovníka."</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Ak chcete pokračovať, dotknite sa tohto tipu »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Ak chcete tento tip zavrieť a začať písať, dotknite sa tu."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klávesnica sa otvorí vždy, keď sa dotknete textového poľa."</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Pridržaním klávesu zobrazíte diakritiku"\n"(ó, ø, ö, ô apod.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Ak chcete prepnúť na režim zadávania číslic a symbolov, dotknite sa tohto klávesu."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Ak chcete prejsť späť na zadávanie písmen, dotknite sa znova tohto klávesu."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Pridržaním tohto klávesu zmeníte nastavenia klávesnice (napr. automatické dokončovanie)."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Skúste si to."</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Hľadať"</string>
<string name="label_next_key" msgid="362972844525672568">"Ďalej"</string>
<string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string>
<string name="label_send_key" msgid="2815056534433717444">"Odoslať"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Viac"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pozastaviť"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Čakajte"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pre váš jazyk aktuálne nie je hlasový vstup podporovaný, ale funguje v angličtine."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Hlasový vstup je experimentálna funkcia, ktorá využíva sieťové rozpoznanie reči spoločnosti Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Ak chcete vypnúť hlasový vstup, prejdite na nastavenia klávesnice."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Ak chcete použiť hlasový vstup, stlačte tlačidlo mikrofónu alebo prejdite prstom po klávesnici na obrazovke."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup používa rozpoznávanie hlasu Google. Na používanie hlasového vstupu sa vzťahujú "<a href="http://m.google.com/privacy">"Pravidlá ochrany osobných údajov pre mobilné služby"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ak chcete vypnúť hlasový vstup, prejdite na nastavenia metódy vstupu."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ak chcete použiť hlasový vstup, stlačte tlačidlo mikrofón."</string>
<string name="voice_listening" msgid="467518160751321844">"Hovorte"</string>
<string name="voice_working" msgid="6666937792815731889">"Prebieha spracovanie"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Zrušiť"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Hlasový vstup"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Na hlavnej klávesnici"</item>
- <item msgid="8529385602829095903">"Na klávesnici so symbolmi"</item>
- <item msgid="7283103513488381103">"Vypnuté"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofón na hlavnej klávesnici"</item>
- <item msgid="6907837061058876770">"Mikrofón na klávesnici so symbolmi"</item>
- <item msgid="3664304608587798036">"Hlasový vstup je zakázaný"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Po hlasovom vstupe automaticky odoslať"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Pri vyhľadávaní alebo prechode na ďalšie pole automaticky stlačiť kláves Enter."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otvorte klávesnicu"\n</b></font><font size="3">\n</font>"Dotknite sa ľubovoľného textového poľa."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zatvorte klávesnicu"\n</b></font><font size="3">\n</font>"Stlačte tlačidlo Späť."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Dotknutím a pridržaním klávesu zobrazíte možnosti"\n</b></font><font size="3">\n</font>"Prístup k interpunkčným znamienkam a diakritike."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavenia klávesnice"\n</b></font><font size="3">\n</font>"Dotknite sa klávesu "<b>"?123"</b>" a podržte ho."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".sk"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".net"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".eu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na hlavnej klávesnici"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klávesnici so symbolmi"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Vypnuté"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofón na hlavnej klávesnici"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofón na klávesnici so symbolmi"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup je zakázaný"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Výber metódy vstupu"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Jazyky vstupu"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Jazyk môžete zmeniť posunutím prsta po medzerníku."</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Povoliť spätnú väzbu od používateľov"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Automatickým zasielaním štatistík o využívaní editora metódy vstupu a správ o jeho zlyhaní do služby Google môžete prispieť k vylepšeniu tohto nástroja."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykom opravíte slová"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotykom zadaným slov ich opravíte"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotykom na zadané slová tieto slová opravíte, musia však byť viditeľné návrhy"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Motív klávesnice"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klávesnica"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"hlasová"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"klávesnica – čeština"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"klávesnica – dánčina"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"klávesnica – nemčina"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"klávesnica – angličtina (Spojené kráľovstvo)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"klávesnica – angličtina (Spojené štáty)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"klávesnica – španielčina"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"klávesnica – španielčina (Spojené štáty)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"klávesnica – francúzština"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"klávesnica – francúzština (Kanada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"klávesnica – francúzština (Švajčiarsko)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"klávesnica – taliančina"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"klávesnica – nórčina"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"klávesnica – holandčina"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"klávesnica – ruština"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"hlas – srbčina"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"klávesnica – švédčina"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"hlas – čeština"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"hlas – nemčina"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"hlas – španielčina"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"hlas – francúzština"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"hlas – japončina"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"hlas – kórejčina"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"hlas – poľština"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"hlas – portugalčina"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"hlas – ruština"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"hlas – turečtina"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Režim štúdia vhodnosti použitia"</string>
</resources>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index 090e0b92e..9194a920b 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibriranje ob pritisku tipke"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Zvok ob pritisku tipke"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Pojavno okno ob pritisku tipke"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Popravljanje tipkarskih napak"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Omogoči popravljanje napak pri vnosu"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Napake pri vnosu v ležečem položaju"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Omogoči popravljanje napak pri vnosu"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Predlogi besed"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Samodejno popravi prejšnjo besedo"</string>
- <string name="prediction" msgid="466220283138359837">"Predlogi besed"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Nastavitve za predlaganje besede"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Omogoči samodokončanje med tipkanjem"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Samodokončanje"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Povečaj velikost besedilnega polja"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skrij predloge besed v ležečem pogledu"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Nastavitve za predlaganje besede"</string>
<string name="auto_cap" msgid="1719746674854628252">"Samodejne velike začetnice"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Napiši začetek stavka z veliko začetnico"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Samodejno vstavljanje ločil"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Hitri popravki"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Popravi pogoste tipkarske napake"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Pokaži predloge"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Prikaži predlagane besede med tipkanjem"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Samodokončanje"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Preslednica in ločila samodejno vnesejo označeno besedo"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokaži predloge"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Prikaži predlagane besede med tipkanjem"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vedno pokaži"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Pokaži v pokončnem načinu"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vedno skrij"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Pokaži tipko za nastavitve"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Samodejno"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vedno pokaži"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vedno skrij"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Samodejni popravek"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Preslednica in ločila samodejno vnesejo označeno besedo"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izklopljeno"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Zmerno"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivno"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigramni predlogi"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Predlog izboljšaj s prejšnjo besedo"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Brez"</item>
- <item msgid="1669461741568287396">"Osnovni"</item>
- <item msgid="4894328801530136615">"Dodatno"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: shranjeno"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Držite tipko, da prikažete poudarke (ø, ö itd.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Kadar koli lahko pritisnete tipko »Nazaj« ↶, da zaprete tipkovnico"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Dostop do številk in simbolov"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Če besedo želite dodati v slovar, jo pridržite"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Dotaknite se tega nasveta za nadaljevanje »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Dotaknite se tukaj, da zaprete nasvet in začnete tipkati!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tipkovnice se odpre, kadar se dotaknete besedilnega polja"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Za ogled poudarkov pridržite tipko"\n"(ø, ö, ô, ó itd.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Preklopite na številke in simbole z dotikom te tipke"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Na črke se vrnete, če se še enkrat dotaknete te tipke"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Pridržite to tipko, če želite spremeniti nastavitve tipkovnice, npr. samodokončanje"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Poskusite!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Pojdi"</string>
<string name="label_next_key" msgid="362972844525672568">"Naprej"</string>
<string name="label_done_key" msgid="2441578748772529288">"Dokončano"</string>
<string name="label_send_key" msgid="2815056534433717444">"Pošlji"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Več"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Premor"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Čakaj"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Glasovni vnos"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Glasovni vnos trenutno ni podprt v vašem jeziku, deluje pa v angleščini."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Glasovni vnos je poskusna funkcija, ki uporablja Googlovo omrežno prepoznavanje govora."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Če želite izklopiti glasovni vnos, pojdite na nastavitve tipkovnice."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Če želite uporabiti glasovni vnos, pritisnite gumb z mikrofonom ali podrsajte s prstom po zaslonski tipkovnici."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni vhod uporablja Googlovo tehnologijo prepoznavanja govora. To storitev ureja "<a href="http://m.google.com/privacy">"pravilnik o zasebnosti za mobilne naprave"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Če želite izklopiti glasovni vnos, pojdite na nastavitve načina vnosa."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Če želite uporabljati glasovni vhod, pritisnite gumb mikrofona."</string>
<string name="voice_listening" msgid="467518160751321844">"Začnite govoriti"</string>
<string name="voice_working" msgid="6666937792815731889">"Obdelava"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Prekliči"</string>
<string name="ok" msgid="7898366843681727667">"V redu"</string>
<string name="voice_input" msgid="2466640768843347841">"Glasovni vnos"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Na glavni tipkovnici"</item>
- <item msgid="8529385602829095903">"Na tipkovnici s simboli"</item>
- <item msgid="7283103513488381103">"Izklopljeno"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofon na glavni tipkovnici"</item>
- <item msgid="6907837061058876770">"Mikrofon na tipkovnici s simboli"</item>
- <item msgid="3664304608587798036">"Glasovni vnos je onemogočen"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Samodejno pošlji po govoru"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Samodejno pritisni »Enter« pri iskanju ali prehodu na naslednje polje."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Odprite tipkovnico"\n</b></font><font size="3">\n</font>"Dotaknite se katerega koli besedilnega polja."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zaprite tipkovnico"\n</b></font><font size="3">\n</font>"Pritisnite tipko »Nazaj«."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Pridržite tipko za ogled možnosti"\n</b></font><font size="3">\n</font>"Dostop do ločil in poudarkov."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavitve "\n</b></font><font size="3">\n</font>"Pridržite tipko "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na glavni tipkovnici"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na tipk. s simboli"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Izklopljeno"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik. na glavni tipk."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. na tipk. s sim."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. vnos je onem."</string>
<string name="selectInputMethod" msgid="315076553378705821">"Izberite način vnosa"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Jeziki vnosa"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Podrsajte s prstom po preslednici, da zamenjate jezik"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Omogoči povratne informacije uporabnikov"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"S samodejnim pošiljanjem statističnih podatkov o uporabi in poročil o zrušitvah Googlu nam lahko pomagate izboljšati urejevalnik načina vnosa."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotaknite se besed in jih popravite"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotaknite se vnesenih besed in jih popravite"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotaknite se vnesenih besed, da jih popravite, samo ko so predlogi vidni"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema tipkovnice"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tipkovnica"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"govor"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Češka tipkovnica"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danska tipkovnica"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Nemška tipkovnica"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angleška (VB) tipkovnica"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angleška (ZDA) tipkovnica"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španska tipkovnica"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Španska (ZDA) tipkovnica"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francoska tipkovnica"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tipkovnica za kanadsko francoščino"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francoska (Švica) tipkovnica"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italijanska tipkovnica"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveška tipkovnica"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nizozemska tipkovnica"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ruska tipkovnica"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Srbska tipkovnica"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švedska tipkovnica"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Govor v češčini"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Govor v nemščini"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Govor v španščini"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Govor v francoščini"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Govor v japonščini"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Govor v korejščini"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Govor v poljščini"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Govor v portugalščini"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Govor v ruščini"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Govor v turščini"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Način raziskave uporabnosti"</string>
</resources>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index 7b00501a5..37299eb11 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Вибрирај на притисак тастера"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Звук на притисак тастера"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Искачући прозор приликом притиска тастера"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Исправи грешке у куцању"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Омогућавање исправљања грешака током уноса"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Грешке приликом уноса у положеном приказу"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Омогућавање исправљања грешака током уноса"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Предлагање речи"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Аутоматско исправљање претходне речи"</string>
- <string name="prediction" msgid="466220283138359837">"Предлагање речи"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Подешавања за предлагање речи"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Омогућавање аутоматског довршавања током уноса текста"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Аутоматско довршавање"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Повећај величину поља за текст"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скривање предложених речи у положеном приказу"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Подешавања за предлагање речи"</string>
<string name="auto_cap" msgid="1719746674854628252">"Аутоматски унос великих слова"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Унос великог слова на почетку реченице"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Аутоматска интерпункција"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Брзе исправке"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Исправља честе грешке у куцању"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Прикажи предлоге"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Приказивање предложених речи током уноса текста"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Аутоматско довршавање"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Означена реч се аутоматски умеће када притиснете размак или знак интерпункције"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Прикажи предлоге"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Приказивање предложених речи током уноса текста"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Увек прикажи"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Прикажи у усправном режиму"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Увек сакриј"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Прикажи тастер за подешавања"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Аутоматски"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Увек прикажи"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Увек сакриј"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Аутоматско исправљање"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Означена реч се аутоматски умеће када притиснете размак или знак интерпункције"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Искључи"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умерено"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Агресивно"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram предлози"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Користи претходну реч за побољшање предлога"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Ништа"</item>
- <item msgid="1669461741568287396">"Основни"</item>
- <item msgid="4894328801530136615">"Напредно"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Сачувано"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Држите тастер да бисте видели акценте (ø, ö итд.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Притисните тастер „Назад“ ↶ у било ком тренутку да бисте затворили тастатуру"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Приступите бројевима и симболима"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Притисните и држите прву реч са леве стране да бисте је додали у речник"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Додирните овај савет да бисте наставили »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Додирните овде да бисте затворили овај савет и почели да уносите текст!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Тастатура се отвара сваки пут када додирнете поље за текст"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Додирните и држите тастер да бисте видели акценте"\n"(ø, ö, ô, ó, и тако даље)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Пређите на бројеве и симболе тако што ћете додирнути овај тастер"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Вратите се на слова тако што ћете поново додирнути овај тастер"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Додирните и држите овај тастер да бисте променили подешавања тастатуре, као што је аутоматско довршавање"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Пробајте!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Иди"</string>
<string name="label_next_key" msgid="362972844525672568">"Следеће"</string>
<string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
<string name="label_send_key" msgid="2815056534433717444">"Пошаљи"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Још"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Паузирај"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Сачекајте"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Гласовни унос"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Гласовни унос тренутно није подржан за ваш језик, али функционише на енглеском."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Гласовни унос је експериментална функција која користи Google-ово мрежно препознавање гласа."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Да бисте искључили гласовни унос, идите на подешавања тастатуре."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Да бисте користили гласовни унос, притисните дугме за микрофон или превуците прст преко тастатуре на екрану."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовни унос користи Google-ово препознавање говора. Важи "<a href="http://m.google.com/privacy">"Политика приватности за мобилне уређаје"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Да бисте искључили гласовни унос, идите на подешавања метода уноса."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Да бисте користили гласовни унос, притисните дугме микрофона."</string>
<string name="voice_listening" msgid="467518160751321844">"Говорите сада"</string>
<string name="voice_working" msgid="6666937792815731889">"Обрада"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Откажи"</string>
<string name="ok" msgid="7898366843681727667">"Потврди"</string>
<string name="voice_input" msgid="2466640768843347841">"Гласовни унос"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"На главној тастатури"</item>
- <item msgid="8529385602829095903">"На тастатури са симболима"</item>
- <item msgid="7283103513488381103">"Искључено"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Микрофон на главној тастатури"</item>
- <item msgid="6907837061058876770">"Микрофон на тастатури са симболима"</item>
- <item msgid="3664304608587798036">"Гласовни унос је онемогућен"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Аутоматски пошаљи после гласа"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Аутоматски притисак на enter приликом претраге или преласка на следеће поље."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Активирање тастатуре"\n</b></font><font size="3">\n</font>"Додирните било које поље за текст."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Затварање тастатуре"\n</b></font><font size="3">\n</font>"Притисните тастер „Назад“."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Додирните и држите тастер да би се приказале опције"\n</b></font><font size="3">\n</font>"Приступ знаковима интерпункције и акцентима."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Подешавања тастатуре"\n</b></font><font size="3">\n</font>"Додирните и држите тастер "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На главној тастатури"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На тастатури са симболима"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Искључи"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Микрофон на главној тастатури"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Микрофон на тастатури са симболима"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Гласовни унос је онемогућен"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Изаберите метод уноса"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Језици за унос"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Превуците прст преко тастера за размак да бисте променили језик"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Омогући повратну информацију корисника"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Помозите да се побољша овај уређивач режима уноса тако што ће се аутоматски послати статистика о коришћењу и извештаји о грешкама компанији Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Додирните да бисте исправили речи"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Додирните унете речи да бисте их исправили"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Додирните унете речи да бисте их исправили само када се виде предлози"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Тема тастатуре"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"тастатура"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"глас"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Језик тастатуре: чешки"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Језик тастатуре: дански"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Језик тастатуре: немачки"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Језик тастатуре: енглески (УК)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Језик тастатуре: енглески (САД)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Језик тастатуре: шпански"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Језик тастатуре: шпански (САД)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Језик тастатуре: француски"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Језик тастатуре: француски (Канада)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Језик тастатуре: француски (Швајцарска)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Језик тастатуре: италијански"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Језик тастатуре: норвешки"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Језик тастатуре: холандски"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Језик тастатуре: руски"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Језик тастатуре: српски"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Језик тастатуре: шведски"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"глас на чешком"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"глас на немачком"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"глас на шпанском"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"глас на француском"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"глас на јапанском"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"глас на корејском"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"глас на пољском"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"глас на португалском"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"глас на руском"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"глас на турском"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Режим студије употребљивости"</string>
</resources>
diff --git a/java/res/values-sv/donottranslate-altchars.xml b/java/res/values-sv/donottranslate-altchars.xml
index 4d26e6c47..d03ae1a6c 100644
--- a/java/res/values-sv/donottranslate-altchars.xml
+++ b/java/res/values-sv/donottranslate-altchars.xml
@@ -18,21 +18,12 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">áàâąã</string>
- <string name="alternates_for_e">3éèêëę€</string>
- <string name="alternates_for_i">íìîï8</string>
- <string name="alternates_for_o">óòôõ9</string>
- <string name="alternates_for_u">úùûū7</string>
- <string name="alternates_for_s">śšşß</string>
- <string name="alternates_for_n">ńñň</string>
- <string name="alternates_for_c">çćč</string>
- <string name="alternates_for_y">ýÿü6</string>
- <string name="alternates_for_d">ðď</string>
- <string name="alternates_for_r">ř4</string>
- <string name="alternates_for_t">ťþ5</string>
- <string name="alternates_for_z">źžż</string>
- <string name="alternates_for_l">ł</string>
- <string name="alternates_for_v">w</string>
- <string name="alternates_for_a_umlaut">æ</string>
- <string name="alternates_for_o_umlaut">øœ</string>
+ <string name="alternates_for_e">3,é,è,ê,ë,ę</string>
+ <string name="alternates_for_o">9,œ,ô,ò,ó,õ,ō</string>
+ <string name="alternates_for_u">7,ü,û,ù,ú,ū</string>
+ <string name="alternates_for_s">ß,ś,š</string>
+ <string name="keylabel_for_scandinavia_row2_10">ö</string>
+ <string name="keylabel_for_scandinavia_row2_11">ä</string>
+ <string name="alternates_for_scandinavia_row2_10">ø</string>
+ <string name="alternates_for_scandinavia_row2_11">æ</string>
</resources>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 1a8536b66..7e9541e5c 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrera vid tangenttryck"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Knappljud"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup vid knapptryck"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Rätta skrivfel"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Aktivera rättning av felaktiga inmatningar"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Inmatningsfel i liggande vy"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Aktivera rättning av felaktiga inmatningar"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Ordförslag"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Rätta automatiskt föregående ord"</string>
- <string name="prediction" msgid="466220283138359837">"Ordförslag"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Inställningar för ordförslag"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Aktivera Komplettera automatiskt när du skriver"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Komplettera automatiskt"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Gör textfältet större"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Dölj ordförslag i liggande vy"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Inställningar för ordförslag"</string>
<string name="auto_cap" msgid="1719746674854628252">"Automatiska versaler"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Använd versal i början av mening"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatiska punkter"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Snabba lösningar"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Åtgärdar automatiskt vanliga misstag"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Visa förslag"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Visar ordförslag när du skriver"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Komplettera automatiskt"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Blanksteg och punkt infogar automatiskt markerat ord"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Visa förslag"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Visar ordförslag när du skriver"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Visa alltid"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Visa stående"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Dölj alltid"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Visa inställningsknapp"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatiskt"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Visa alltid"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Dölj alltid"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Autokorrigering"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Blanksteg och punkt infogar automatiskt markerat ord"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Måttlig"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressiv"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigramförslag"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Förbättra förslaget med föregående ord"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Inget"</item>
- <item msgid="1669461741568287396">"Grundinställningar"</item>
- <item msgid="4894328801530136615">"Avancerade"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: sparat"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Håll nere en tangent om du vill visa accenter (ø, ö, etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Tryck på Tillbaka ↶ om du vill stänga tangentbordet"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"För siffror och symboler"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tryck och håll ned ordet längst till vänster om du vill lägga till det i ordlistan"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Tryck på tipset för att fortsätta »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Tryck här om du vill stänga tipset och börja skriva!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tangentbordet öppnas när du trycker på ett textfält"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tryck och håll nere en tangent om du vill visa accenter"\n"(ø, ö, ô, ó och så vidare)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Växla till siffror och symboler med den här tangenten"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Återvänd till bokstäver genom att trycka på tangenten en gång till"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tryck och håll ned tangenten om du vill ändra inställningarna för tangentbordet, till exempel Komplettera automatiskt"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Testa!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Kör"</string>
<string name="label_next_key" msgid="362972844525672568">"Nästa"</string>
<string name="label_done_key" msgid="2441578748772529288">"Färdig"</string>
<string name="label_send_key" msgid="2815056534433717444">"Skicka"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Mer"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Vänta"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Röstindata"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Röstindata stöds inte på ditt språk än, men tjänsten fungerar på engelska."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Röstinmatning är en funktion på experimentstadiet som använder Googles nätverks taligenkänning."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Om du vill stänga av röstindata öppnar du inställningarna för tangentbordet."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Om du vill använda röstinmatning trycker du på mikrofonknappen eller drar fingret över tangentbordet på skärmen."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Röstinmatning använder sig av Googles tjänst för taligenkänning. "<a href="http://m.google.com/privacy">"Sekretesspolicyn för mobila enheter"</a>" gäller."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Om du vill stänga av röstinmatning öppnar du inställningarna för inmatningsmetod."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Om du vill använda röstinmatning trycker du på mikrofonknappen."</string>
<string name="voice_listening" msgid="467518160751321844">"Tala nu"</string>
<string name="voice_working" msgid="6666937792815731889">"Fungerar"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Avbryt"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Röstindata"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"På huvudtangentbordet"</item>
- <item msgid="8529385602829095903">"På symboltangentbordet"</item>
- <item msgid="7283103513488381103">"Av"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mikrofon på huvudtangentbordet"</item>
- <item msgid="6907837061058876770">"Mikrofon på symboltangentbordet"</item>
- <item msgid="3664304608587798036">"Röstindata är inaktiverat"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Skicka automatiskt efter röst"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Tryck automatiskt på retur vid sökning eller när du fortsätter till nästa fält."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Öppna tangentbordet"\n</b></font><font size="3">\n</font>"Tryck på ett textfält."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Stäng tangentbordet"\n</b></font><font size="3">\n</font>"Tryck på Tillbaka."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tryck länge på en tangent om du vill se alternativ"\n</b></font><font size="3">\n</font>"Använda skiljetecken och accenter."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tangentbordsinställningar"\n</b></font><font size="3">\n</font>"Tryck länge på tangenten"<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På huvudtangentbord"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På symboltangentbord"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Av"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mick huvudtangentbord"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mick bland symboler"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Röstinmatning inaktiv"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Välj inmatningsmetod"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Dra med fingret på blanksteg om du vill ändra språk"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktivera synpunkter från användare"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Du kan hjälpa till att förbättra inmatningsmetoden genom att automatiskt skicka användningsstatistik och felrapporter till Google."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryck om du vill korrigera ord"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tryck på skrivna ord om du vill korrigera dem, endast när förslag visas"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tryck på skrivna ord om du vill korrigera dem, endast när förslag visas"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tangentbordstema"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tangentbord"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"röst"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tjeckiskt tangentbord"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danskt tangentbord"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tyskt tangentbord"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelskt tangentbord (Storbritannien)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelskt tangentbord (USA)"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanskt tangentbord"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spanskt tangentbord (USA)"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franskt tangentbord"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franskt tangentbord (Kanada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franskt tangentbord (Schweiz)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienskt tangentbord"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norskt tangentbord"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holländskt tangentbord"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ryskt tangentbord"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbiskt tangentbord"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svenskt tangentbord"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Röst på tjeckiska"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Röst på tyska"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Röst på spanska"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Röst på franska"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Röst på japanska"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Röst på koreanska"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Röst på polska"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Röst på portugisiska"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Röst på ryska"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Röst på turkiska"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Läge för användbarhetsstudie"</string>
</resources>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index 0812a894d..45b0af08f 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"สั่นเมื่อกดปุ่ม"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"ส่งเสียงเมื่อกดปุ่ม"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"ป๊อปอัปเมื่อกดแป้น"</string>
- <string name="hit_correction" msgid="4855351009261318389">"แก้ไขข้อผิดพลาดในการพิมพ์"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"เปิดการใช้งานการแก้ไขข้อผิดพลาดในการป้อนข้อมูล"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"ข้อผิดพลาดในการป้อนข้อมูลแนวนอน"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"เปิดการใช้งานการแก้ไขข้อผิดพลาดในการป้อนข้อมูล"</string>
- <string name="auto_correction" msgid="7911639788808958255">"การแนะนำคำ"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"แก้ไขคำก่อนหน้าอัตโนมัติ"</string>
- <string name="prediction" msgid="466220283138359837">"การแนะนำคำ"</string>
- <string name="prediction_category" msgid="7027100625580696660">"การตั้งค่าการแนะนำคำ"</string>
- <string name="prediction_summary" msgid="459788228830873110">"เปิดใช้งานการเติมคำอัตโนมัติขณะพิมพ์"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"เติมคำอัตโนมัติ"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"เพิ่มขนาดฟิลด์ข้อความ"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"ซ่อนการแนะนำคำในมุมมองแนวนอน"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"การตั้งค่าการแนะนำคำ"</string>
<string name="auto_cap" msgid="1719746674854628252">"ปรับเป็นตัวพิมพ์ใหญ่อัตโนมัติ"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"ใช้ตัวพิมพ์ใหญ่เมื่อขึ้นต้นประโยค"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"ใส่เครื่องหมายวรรคตอนอัตโนมัติ"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"แก้ไขด่วน"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"แก้ไขข้อผิดพลาดในการพิมพ์ที่พบบ่อย"</string>
- <string name="show_suggestions" msgid="507074425254289133">"แสดงคำแนะนำ"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"แสดงคำที่แนะนำขณะพิมพ์"</string>
- <string name="auto_complete" msgid="1103196318775486023">"เติมคำอัตโนมัติ"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"ใช้แป้นเคาะวรรคและเครื่องหมายวรรคตอนเพื่อแทรกคำที่ไฮไลต์โดยอัตโนมัติ"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"แสดงคำแนะนำ"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"แสดงคำที่แนะนำขณะพิมพ์"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"แสดงตลอดเวลา"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"แสดงในโหมดแนวตั้ง"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ซ่อนตลอดเวลา"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"แสดงแป้นการตั้งค่า"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"อัตโนมัติ"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"แสดงตลอดเวลา"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"ซ่อนตลอดเวลา"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"การแก้ไขอัตโนมัติ"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"ใช้แป้นเคาะวรรคและเครื่องหมายวรรคตอนเพื่อแทรกคำที่ไฮไลต์โดยอัตโนมัติ"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ปิด"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"ปานกลาง"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"เข้มงวด"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"คำแนะนำ Bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"ใช้คำก่อนหน้านี้เพื่อปรับปรุงคำแนะนำ"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"ไม่มี"</item>
- <item msgid="1669461741568287396">"พื้นฐาน"</item>
- <item msgid="4894328801530136615">"ขั้นสูง"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : บันทึกแล้ว"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"กดปุ่มค้างไว้เพื่อดูการออกเสียง (ø, ö, ฯลฯ)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"กดปุ่ม ย้อนกลับ เพื่อปิดแป้นพิมพ์เมื่อใดก็ได้"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"เข้าถึงหมายเลขและสัญลักษณ์"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"กดคำซ้ายสุดค้างไว้เพื่อเพิ่มลงในพจนานุกรม"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"แตะคำแนะนำนี้เพื่อทำงานต่อ »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"แตะที่นี่เพื่อปิดคำแนะนำนี้และเริ่มพิมพ์!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"แป้นพิมพ์จะเปิดขึ้นเมื่อคุณแตะฟิลด์ข้อความ"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"แตะปุ่มค้างไว้เพื่อดูการออกเสียง"\n"(ø, ö, ô, ó และอื่นๆ)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"เปลี่ยนเป็นตัวเลขและสัญลักษณ์เมื่อแตะปุ่มนี้"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"กลับไปที่ตัวอักษรโดยการแตะปุ่มนี้อีกครั้ง"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"แตะปุ่มนี้ค้างไว้เพื่อเปลี่ยนการตั้งค่าแป้นพิมพ์ เช่น การเติมคำอัตโนมัติ"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"ลองดูสิ!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"ไป"</string>
<string name="label_next_key" msgid="362972844525672568">"ถัดไป"</string>
<string name="label_done_key" msgid="2441578748772529288">"เสร็จสิ้น"</string>
<string name="label_send_key" msgid="2815056534433717444">"ส่ง"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"เพิ่มเติม"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"หยุดชั่วคราว"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"รอ"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"การป้อนข้อมูลด้วยเสียง"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ขณะนี้การป้อนข้อมูลด้วยเสียงยังไม่ได้รับการสนับสนุนในภาษาของคุณ แต่ใช้ได้ในภาษาอังกฤษ"</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"การป้อนข้อมูลด้วยเสียงเป็นคุณลักษณะทดลองที่ใช้การจดจำเสียงที่มีการสร้างเครือข่ายไว้ของ Google"</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"หากต้องการปิดการป้อนข้อมูลด้วยเสียง ไปที่การตั้งค่าแป้นพิมพ์"</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"หากต้องการใช้การป้อนข้อมูลด้วยเสียง กดปุ่มไมโครโฟนหรือเลื่อนนิ้วผ่านแป้นพิมพ์บนหน้าจอ"</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"การป้อนข้อมูลด้วยเสียงโดยใช้การจดจำเสียงของ Google จะเป็นไปตาม"<a href="http://m.google.com/privacy">"นโยบายส่วนบุคคลของมือถือ"</a></string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"หากต้องการปิดการป้อนข้อมูลด้วยเสียง ไปที่การตั้งค่าวิธีป้อนข้อมูล"</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"หากต้องการใช้งานการป้อนข้อมูลด้วยเสียง ให้กดปุ่มไมโครโฟน"</string>
<string name="voice_listening" msgid="467518160751321844">"พูดได้เลย"</string>
<string name="voice_working" msgid="6666937792815731889">"กำลังทำงาน"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"ยกเลิก"</string>
<string name="ok" msgid="7898366843681727667">"ตกลง"</string>
<string name="voice_input" msgid="2466640768843347841">"การป้อนข้อมูลด้วยเสียง"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"บนแป้นพิมพ์หลัก"</item>
- <item msgid="8529385602829095903">"บนแป้นพิมพ์สัญลักษณ์"</item>
- <item msgid="7283103513488381103">"ปิด"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"ไมโครโฟนบนแป้นพิมพ์หลัก"</item>
- <item msgid="6907837061058876770">"ไมโครโฟนบนแป้นพิมพ์สัญลักษณ์"</item>
- <item msgid="3664304608587798036">"การป้อนข้อมูลด้วยเสียงถูกปิดการใช้งาน"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"ส่งอัตโนมัติหลังบันทึกเสียง"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"กด Enter อัตโนมัติเมื่อค้นหาหรือไปที่ฟิลด์ถัดไป"</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"เปิดแป้นพิมพ์"\n</b></font><font size="3">\n</font>"แตะฟิลด์ข้อความใดก็ได้"</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"ปิดแป้นพิมพ์"\n</b></font><font size="3">\n</font>"กดปุ่ม ย้อนกลับ"</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"แตะปุ่มค้างไว้เพื่อดูตัวเลือก "\n</b></font><font size="3">\n</font>"เข้าถึงเครื่องหมายวรรคตอนและการออกเสียง"</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"การตั้งค่าแป้นพิมพ์"\n</b></font><font size="3">\n</font>"แตะปุ่ม "<b>"?123"</b>"ค้างไว้"</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"บนแป้นพิมพ์หลัก"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"บนแป้นพิมพ์สัญลักษณ์"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"ปิด"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"ไมค์บนแป้นพิมพ์หลัก"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"ไมค์บนแป้นพิมพ์สัญลักษณ์"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ปิดใช้งานป้อนข้อมูลด้วยเสียง"</string>
<string name="selectInputMethod" msgid="315076553378705821">"เลือกวิธีการป้อนข้อมูล"</string>
<string name="language_selection_title" msgid="1651299598555326750">"ภาษาในการป้อนข้อมูล"</string>
<string name="language_selection_summary" msgid="187110938289512256">"เลื่อนนิ้วไปบนแป้นเคาะวรรคเพื่อเปลี่ยนภาษา"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"เปิดใช้งานการแสดงความคิดเห็นจากผู้ใช้"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"ช่วยปรับปรุงตัวแก้ไขวิธีการป้อนข้อมูลนี้โดยการส่งสถิติการใช้งานและรายงานการขัดข้องถึง Google โดยอัตโนมัติ"</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"แตะเพื่อแก้ไขคำ"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"แตะคำที่ป้อนไว้เพื่อแก้ไข"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"แตะคำที่ป้อนไว้เพื่อแก้ไข เฉพาะเมื่อมีคำแนะนำปรากฏเท่านั้น"</string>
<string name="keyboard_layout" msgid="437433231038683666">"ชุดรูปแบบแป้นพิมพ์"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"แป้นพิมพ์"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"เสียง"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"แป้นพิมพ์ภาษาเช็ก"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"แป้นพิมพ์ภาษาเดนมาร์ก"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"แป้นพิมพ์ภาษาเยอรมัน"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"แป้นพิมพ์ภาษาอังกฤษ (อังกฤษ)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"แป้นพิมพ์ภาษาอังกฤษ (สหรัฐฯ)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"แปันพิมพ์ภาษาสเปน"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"แป้นพิมพ์ภาษาสเปน (สหรัฐฯ)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"แป้นพิมพ์ภาษาฝรั่งเศส"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"แป้นพิมพ์ภาษาฝรั่งเศส (แคนาดา)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"แป้นพิมพ์ภาษาฝรั่งเศส (สวิตเซอร์แลนด์)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"แป้นพิมพ์ภาษาอิตาลี"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"แป้นพิมพ์ภาษานอร์เวย์"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"แป้นพิมพ์ภาษาดัตช์"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"แป้นพิมพ์ภาษารัสเซีย"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"แป้นพิมพ์ภาษาเซอร์เบีย"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"แป้นพิมพ์ภาษาสวีเดน"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"เสียงภาษาเช็ก"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"เสียงภาษาเยอรมัน"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"เสียงภาษาสเปน"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"เสียงภาษาฝรั่งเศส"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"เสียงภาษาญี่ปุ่น"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"เสียงภาษาเกาหลี"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"เสียงภาษาโปแลนด์"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"เสียงภาษาโปรตุเกส"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"เสียงภาษารัสเซีย"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"เสียงภาษาตุรกี"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"โหมดเรียนรู้การใช้งาน"</string>
</resources>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index 2ab36ea35..e51304ce6 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Mag-vibrate sa keypress"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Tunog sa keypress"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup sa keypress"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Itama ang mga error sa pag-type"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Paganahin ang pagtatama ng error sa pag-input"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Mga error sa pag-input ng landscape"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Paganahin ang pagtatama ng error sa pag-input"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Mga suhestiyon ng salita"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Awtomatikong itama ang nakaraang salita"</string>
- <string name="prediction" msgid="466220283138359837">"Mga suhestiyon ng salita"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Mga setting ng suhestiyon ng salita"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Paganahin ang awtomatikong pagkumpleto habang nagta-type"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Awtomatikong pagkumpleto"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Taasan ang laki ng field ng teksto"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Itago ang mga suhestiyon ng salita sa lanscape na view"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Mga setting ng suhestiyon ng salita"</string>
<string name="auto_cap" msgid="1719746674854628252">"Auto-capitalization"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"I-capitalize ang simula ng isang pangungusap"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"I-auto-punctuate"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Mga mabilisang pagsasaayos"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Itinatama ang mga karaniwang na-type na mali"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Ipakita ang mga suhestiyon"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Ipakita ang mga iminumungkahing salita habang nagta-type"</string>
- <string name="auto_complete" msgid="1103196318775486023">"I-auto-complete"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Awtomatikong ipinapasok ng spacebar at bantas ang naka-highlight na salita"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Ipakita ang mga suhestiyon"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Ipakita ang mga iminumungkahing salita habang nagta-type"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Palaging ipakita"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Magpakita sa mode na portrait"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Palaging itago"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Ipakita ang key ng mga setting"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Awtomatiko"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Palaging ipakita"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Palaging itago"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Awtomatikong pagwasto"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Awtomatikong ipinapasok ng spacebar at bantas ang naka-highlight na salita"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Naka-off"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modest"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresibo"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Mga Suhestiyon na Bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Gamitin ang nakaraang salita upang pahusayin ang suhestiyon"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Wala"</item>
- <item msgid="1669461741568287396">"Batayan"</item>
- <item msgid="4894328801530136615">"Advanced"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Na-save"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Pinduting nang matagal ang isang key pababa upang makita ang mga accent (ø, ö, atbp.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Pindutin ang key na bumalik ↶ upang isara ang keyboard anumang oras"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"I-access ang mga numero at simbolo"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pindutin nang matagal ang salita sa kaliwang bahagi upang idagdag ito sa diksyunaryo"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Galawin ang pahiwatig na ito upang magpatuloy »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Galawin dito upang isara ang pahiwatig na ito at simulan ang pag-type!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Nagbubukas ang keyboard anumang oras na galawin mo ang field ng teksto"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Galawin &amp; pinduting nang matagal ang isang key upang tingnan ang mga accent"\n"(ø, ö, ô, ó, at iba pa)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Lumipat sa mga numero at simbolo sa pamamagitan ng paggalaw sa key na "</b>" na ito"</string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Pumunta muli sa mga titik sa pamamagitan ng muling paggalaw sa key na ito"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Galawin &amp; pinduting nang matagal ang key na ito upang baguhin ang mga setting ng keyboard, tulad ng awtomatikong pagkumpleto"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Subukan ito!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Pumunta"</string>
<string name="label_next_key" msgid="362972844525672568">"Susunod"</string>
<string name="label_done_key" msgid="2441578748772529288">"Tapos na"</string>
<string name="label_send_key" msgid="2815056534433717444">"Ipadala"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Higit pa"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Intay"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Pag-input ng boses"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Hindi kasalukuyang suportado ang pag-input ng boses para sa iyong wika, ngunit gumagana sa Ingles."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ang pag-input ng boses ay isang tampok na pang-eksperimento na gumagamit ng naka-network na pagkilala sa pananalita ng Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Upang i-off ang pag-input ng boses, pumunta sa mga setting ng keyboard."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Upang gumamit ng pag-input ng boses, pindutin ang pindutang microphone o i-slide ang iyong daliri sa screen keyboard."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Gumagamit ang input ng Voice ng pagkakilanlan ng pananalita ng Google. Nalalapat ang "<a href="http://m.google.com/privacy">"Ang Patakaran ng Privacy ng Mobile"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Upang i-off ang pag-input na boses, pumunta sa mga setting ng paraan ng pag-input."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Upang gamitin ang voice input, pindutin ang pindutan na microphone."</string>
<string name="voice_listening" msgid="467518160751321844">"Magsalita ngayon"</string>
<string name="voice_working" msgid="6666937792815731889">"Nagtatrabaho"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Kanselahin"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Pag-input ng boses"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"I-on ang pangunahing keyboard"</item>
- <item msgid="8529385602829095903">"Sa mga simbolo ng keyboard"</item>
- <item msgid="7283103513488381103">"Naka-off"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Mic sa pangunahing keyboard"</item>
- <item msgid="6907837061058876770">"Mic sa keyboard ng mga simbolo"</item>
- <item msgid="3664304608587798036">"Hindi pinagana ang pag-input ng boses"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Awtomatikong isumite pagkatapos ng boses"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Awtomatikong pindutin ang enter kapag naghahanap o pupunta sa susunod na field."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Buksan ang keyboard"\n</b></font><font size="3">\n</font>"Galawin ang kahit anong field ng teksto."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Isara ang keyboard"\n</b></font><font size="3">\n</font>"Pindutin ang key na Bumalik."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Galawin &amp; pinduting nang matagal ang isang key para sa mga pagpipilian"\n</b></font><font size="3">\n</font>"I-access ang bantas at mga accent."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Mga setting ng keyboard"\n</b></font><font size="3">\n</font>"Galawin &amp; pindutin nang matagal ang "<b>"?123"</b>" na key."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Sa pangunahing keyboard"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sa keyboard ng mga simbolo"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Naka-off"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic sa pangunahing keyboard"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic sa keyboard ng mga simbolo"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hindi pinagana ang voice input"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Pumili ng paraan ng pag-input"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Mag-input ng mga wika"</string>
<string name="language_selection_summary" msgid="187110938289512256">"I-slide ang daliri sa spacebar upang palitan ang wika"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Paganahin ang feedback ng user"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Tumulong na pahusayin ang editor ng paraan ng pag-input na ito sa pamamagitan ng awtomatikong pagpapadala ng mga istatistika ng paggamit at mga ulat ng crash sa Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Pindutin upang itama ang mga salita"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Pindutin ang mga ipinasok na salita upang itama ang mga ito"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pindutin ang mga ipinasok na salita upang iwasto ang mga iyon, kapag makikita lang ang mga suhestiyon"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Tema ng Keyboard"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"keyboard"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"boses"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Czech na Keyboard"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danish na Keyboard"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German na Keyboard"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Ingles (UK) na Keyboard"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Ingles (US) na Keyboard"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish na Keyboard"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Espanyol (US) na Keyboard"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French na Keyboard"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) na Keyboard"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) na Keyboard"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italian na Keyboard"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegian na Keyboard"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Dutch na Keyboard"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russian na Keyboard"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbian na Keyboard"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Swedish na Keyboard"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech na Voice"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German na Voice"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanish na Boses"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"French na Boses"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese na Boses"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean na Boses"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polish na Boses"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portuguese na Boses"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russian na Boses"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkish na Boses"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mode sa Pag-aaral ng Pagkamagagamit"</string>
</resources>
diff --git a/java/res/values-tr/donottranslate-altchars.xml b/java/res/values-tr/donottranslate-altchars.xml
index 4200d949e..1b83b65c8 100644
--- a/java/res/values-tr/donottranslate-altchars.xml
+++ b/java/res/values-tr/donottranslate-altchars.xml
@@ -18,14 +18,11 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">3èéêë</string>
- <string name="alternates_for_i">ìíîï8</string>
- <string name="alternates_for_o">öòóôõœø9</string>
- <string name="alternates_for_u">üùúû7</string>
- <string name="alternates_for_s">ş§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ6</string>
+ <string name="alternates_for_a">â</string>
+ <string name="alternates_for_i">8,ı,î,ï,ì,í,į,ī</string>
+ <string name="alternates_for_o">9,ö,ô,œ,ò,ó,õ,ø,ō</string>
+ <string name="alternates_for_u">7,ü,û,ù,ú,ū</string>
+ <string name="alternates_for_s">ş,ß,ś,š</string>
<string name="alternates_for_g">ğ</string>
-</resources> \ No newline at end of file
+ <string name="alternates_for_c">ç,ć,č</string>
+</resources>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index 0b55bc0c1..930890111 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Tuşa basıldığında titret"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Tuşa basıldığında ses çıkar"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Tuşa basıldığında pop-up aç"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Yazım hatalarını düzelt"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Giriş hatası düzeltmeyi etkinleştir"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Yatay giriş hataları"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Giriş hatası düzeltmeyi etkinleştir"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Kelime önerileri"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Önceki kelimeyi otomatik olarak düzelt"</string>
- <string name="prediction" msgid="466220283138359837">"Kelime önerileri"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Kelime önerme ayarları"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Yazarken otomatik tamamlamayı etkinleştir"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Otomatik tamamlama"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Metin alanı boyutunu artır"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Yatay görünümde kelime önerilerini gizle"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Kelime önerme ayarları"</string>
<string name="auto_cap" msgid="1719746674854628252">"Otomatik olarak büyük harf yap"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Cümlenin baş harfini büyük yap"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Otomatik noktalama"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Hızlı onarımlar"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Yaygın olarak yapılan yazım hatalarını düzeltir"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Önerileri göster"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Yazarken önerilen kelimeleri görüntüle"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Otomatik tamamla"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Önerileri göster"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Yazarken önerilen kelimeleri görüntüle"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Her zaman göster"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Dikey modda göster"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Her zaman gizle"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Ayarları göster tuşu"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Otomatik"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Her zaman göster"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Her zaman gizle"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Otomatik düzeltme"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Kapalı"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Ölçülü"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresif"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Bigram Önerileri"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Öneriyi geliştirmek için önceki kelimeyi kullanın"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Yok"</item>
- <item msgid="1669461741568287396">"Temel"</item>
- <item msgid="4894328801530136615">"Gelişmiş"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kaydedildi"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Vurguları görmek için bir tuşu basılı tutun (ø, ö, v.b.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Klavyeyi herhangi bir anda kapatmak için geri tuşuna ↶ basın"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Sayılara ve simgelere erişin"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Sözlüğe eklemek için en soldaki kelimeye basın ve basılı tutun"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Devam etmek için bu ipucuna dokunun »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Bu ipucunu kapatmak için buraya dokunun ve yazmaya başlayın!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Bir metin alanına dokunduğunuzda klavye açılır"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Vurguları görüntülemek için bir tuşa basın ve basılı tutun"\n"(ø, ö, ô, ó v.b.)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Bu tuşa dokunarak sayılar ve simgeler arasında geçiş yap"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Bu tuşa tekrar dokunarak harflere geri dönün"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Otomatik tamamlama gibi klavye ayarlarını değiştirmek için bu tuşa basın ve basılı tutun"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Deneyin!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Git"</string>
<string name="label_next_key" msgid="362972844525672568">"İleri"</string>
<string name="label_done_key" msgid="2441578748772529288">"Bitti"</string>
<string name="label_send_key" msgid="2815056534433717444">"Gönder"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Diğer"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Durkl"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Bekle"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Ses girişi"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Ses girişi, şu anda sizin diliniz için desteklenmiyor ama İngilizce dilinde kullanılabilir."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ses girişi, Google\'ın ağ bağlantılı ses tanıma işlevini kullanan deneysel bir özelliktir."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Ses girişini kapatmak için klavye ayarlarına gidin."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Ses girişini kullanmak için mikrofon düğmesine basın veya parmağınızı dokunmatik klavye üzerinde kaydırın."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ses girişi Google\'ın konuşma tanımasını kullanır. "<a href="http://m.google.com/privacy">" Mobil gizlilik politikası"</a>" geçerlidir."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ses girişini kapatmak için giriş yöntemi ayarlarına gidin."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ses girişini kullanmak için mikrofon düğmesine basın."</string>
<string name="voice_listening" msgid="467518160751321844">"Şimdi konuşun"</string>
<string name="voice_working" msgid="6666937792815731889">"Çalışıyor"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"İptal"</string>
<string name="ok" msgid="7898366843681727667">"Tamam"</string>
<string name="voice_input" msgid="2466640768843347841">"Ses girişi"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Ana klavyede"</item>
- <item msgid="8529385602829095903">"Simge klavyesinde"</item>
- <item msgid="7283103513488381103">"Kapalı"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Ana klavyedeki mikrofon"</item>
- <item msgid="6907837061058876770">"Simge klavyesindeki mikrofon"</item>
- <item msgid="3664304608587798036">"Sesle giriş devre dışı bırakıldı"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Sesten sonra otomatik gönder"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Arama yaparken veya bir sonraki alana giderken enter tuşuna otomatik olarak basın."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Klavyeyi açın"\n</b></font><font size="3">\n</font>"Herhangi bir metin alanına dokunun."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Klavyeyi kapatın"\n</b></font><font size="3">\n</font>"Geri tuşuna basın."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Seçenekler için bir tuşa dokunun ve basılı tutun"\n</b></font><font size="3">\n</font>"Noktalama ve vurgulama işaretlerine erişin."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Klavye ayarları"\n</b></font><font size="3">\n</font><b>"?123"</b>" tuşuna dokunun ve basılı tutun."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Ana klavyede"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Simge klavyesinde"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Kapalı"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Ana klavyede mikrfn"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Simge klavysnd mikrf"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Sesle giriş devr dşı"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Giriş yöntemini seç"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Kullanıcı geri bildirimini etkinleştir"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Kullanım istatistiklerini ve kilitlenme raporlarını Google\'a otomatik olarak göndererek bu giriş yöntemi düzenleyicisinin iyileştirilmesine yardımcı olun."</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Kelimeleri düzeltmek için dokunun"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Girilen kelimelere yalnızca öneriler görünür durumdayken dokunarak düzeltin"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Girilen kelimelere yalnızca öneriler görünür durumdayken dokunarak düzeltin"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Klavye Teması"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klavye"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"ses"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Çekçe Klavye"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danca Klavye"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Almanca Klavye"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"İngilizce (İngiltere) Klavye"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"İngilizce (US) Klavye"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"İspanyolca Klavye"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"İspanyolca (US) Klavye"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransızca Klavye"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransızca (Kanada) Klavye"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransızca (İsviçre) Klavye"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"İtalyanca Klavye"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveççe Klavye"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Hollandaca Klavye"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Rusça Klavye"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Sırpça Klavye"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"İsveççe Klavye"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Çekçe Ses"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Almanca Ses"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"İspanyolca Ses"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransızca Ses"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japonca Ses"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korece Ses"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Lehçe Ses"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portekizce Ses"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Rusça Ses"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Türkçe Ses"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Kullanılabilirlik Araştırması Modu"</string>
</resources>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 8788021be..8d0c929bb 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Вібр при натиску клав."</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натиску клав."</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Сплив. при нат.клав."</string>
- <string name="hit_correction" msgid="4855351009261318389">"Виправ. помилки вводу"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Увімкн. виправл. помилок вводу"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Помилки альбомного вводу"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Увімкн. виправл. помилок вводу"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Пропозиції слів"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Автоматично виправляти попереднє слово"</string>
- <string name="prediction" msgid="466220283138359837">"Пропозиції слів"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Налашт-ня пропозицій слів"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Увімкн. автозаповнення при вводі"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Автозаповнення"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Збільш. розмір текст. поля"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Сховати пропозиції слів в альбом. режимі"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Налаштування пропозицій слів"</string>
<string name="auto_cap" msgid="1719746674854628252">"Авто викор. вел. літер"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Поч. писати речення з великої літери"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Авто пунктуація"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Шв. виправлення"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Виправляє поширені помилки"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Показати пропозиції"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Відображати при вводі пропоновані слова"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Автозаповнення"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Пробіл і пунктуація автоматично вставляє виділене слово"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Показати пропозиції"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Відображати при вводі пропоновані слова"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Завжди показувати"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показувати в книжковому режимі"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Завжди ховати"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Показ. клав. налашт."</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматично"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Завжди показ."</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Завжди ховати"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Автомат. виправлення"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Пробіл і пунктуація автоматично вставляє виділене слово"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Вимк."</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Середнє"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Повне"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Двобуквені пропозиції"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Викор. попер. слово для покращ. пропозиції"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Немає"</item>
- <item msgid="1669461741568287396">"Базовий"</item>
- <item msgid="4894328801530136615">"Розшир."</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : збережено"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Утр. клав. натис., щоб див. нагол. (ø, ö, тощо)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Натисн. клавішу назад ↶, щоб будь-коли закрити клавіат."</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Доступ до цифр і символів"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Натисн. і утримуйте ліве крайнє слово, щоб додати його до словн."</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Натис. цю підказку для продовж.»"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Натисн. тут, щоб закрити цю підказку і почати ввод."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавіатура відривається при торканні текстового поля"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Натис. і утрим. клавішу для перегл. наголосів"\n"(ø, ö, ô, ó тощо)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Перемк. до цифр і символів, натиснувши цю кнопку "</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Поверніться до літер, знову натиснувши цю клавішу"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Натис. і утрим. клавішу, щоб змін. налашт-ння клавіат., такі як автозапов."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Спробуйте!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Іти"</string>
<string name="label_next_key" msgid="362972844525672568">"Далі"</string>
<string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
<string name="label_send_key" msgid="2815056534433717444">"Надісл."</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Більше"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Чек."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Голос. ввід"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Голос. ввід наразі не підтрим. для вашої мови, але можна користуватися англійською."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Голос. ввід є експеремент. ф-цією, яка викор. мережеве розпізнавання голосу Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Щоб вимкн. голос ввід, йдіть до налашт-нь клавіатури."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Щоб викор. голос. ввід, натисніть кнопку мікрофона або пересуньте палець на екранній клавіатурі."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовий ввід використовує розпізнавання мовлення Google. Застосовується "<a href="http://m.google.com/privacy">"Політика конфіденційності для мобільних пристроїв"</a>"."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Щоб вимкнути голосовий ввід, перейдіть до налаштувань методів введення."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Щоб використовувати голосовий ввід, натисніть кнопку мікрофона."</string>
<string name="voice_listening" msgid="467518160751321844">"Диктуйте"</string>
<string name="voice_working" msgid="6666937792815731889">"Працює"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Скасувати"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Голос. ввід"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"На осн. клавіатурі"</item>
- <item msgid="8529385602829095903">"Символьна клавіатура"</item>
- <item msgid="7283103513488381103">"Вимк."</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Miкр. на осн. клавіатурі"</item>
- <item msgid="6907837061058876770">"Miкр. на символ. клавіатурі"</item>
- <item msgid="3664304608587798036">"Голос. ввід вимкнуто"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Авто подав. після гол. пош."</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Автомат. натиск. enter під час пошуку або переходу до наступного поля."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Відкр. клавіатуру"\n</b></font><font size="3">\n</font>"Натисн. якесь текст. поле."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Закрити клавіатуру"\n</b></font><font size="3">\n</font>"Натисн. клавішу Назад."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Натис.і утрим. клавішк для отрим. парам."\n</b></font><font size="3">\n</font>"Доступ до пункт. та наголос."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Налашт-ння клавіатури"\n</b></font><font size="3">\n</font>"Натисн. і утрим. клавішу "<b>"?123"</b></string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На основ. клавіатурі"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Символьна клавіатура"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Вимк."</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Miкр. на осн. клав."</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Miкр. на симв. клавіат."</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голос. ввід вимкнено"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Вибрати метод введення"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Мови вводу"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Переміст. палець на пробіл, щоб змін. мову"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Увімк. відгуки корист."</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Допоможіть покращ. редактор методу введ., автомат. надсилаючи в Google статистику використ. та звіти про збої."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Торкн., щоб виправ. слова"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Торкн. введених слів, щоб виправити їх"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Торкніться введених слів, щоб виправити їх, лише коли відображаються пропозиції"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Тема клавіатури"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"клавіатура"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"голос."</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Чеська розкладка"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Данська розкладка"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Німецька розкладка"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Англійська розкладка (Великобританія)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Англійська розкладка (США)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Іспанська розкладка"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Іспанська розкладка (США)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Франц. розкладка"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Французька розкладка (Канада)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Voice французькою мовою (Швейцарія)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Італійська розкладка"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Норвезька розкладка"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Голланд. розклад."</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Російська розкладка"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Сербська розкладка"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Шведська розкладка"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice чеською мовою"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice німецькою мовою"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Іспанський голос"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Франц. голос"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Японський голос"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Корейськ. голос"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Польський голос"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Португал. голос"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Російський голос"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Турецький голос"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Режим вивчення зручності у використанні"</string>
</resources>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index 53ec91c1b..421605873 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Rung khi nhấn phím"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Âm thanh khi nhấn phím"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Cửa sổ bật lên khi nhấn phím"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Sửa lỗi đánh máy"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Bật sửa lỗi nhập"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Lỗi nhập theo khổ ngang"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Bật sửa lỗi nhập"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Đề xuất từ"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Tự động sửa từ trước đó"</string>
- <string name="prediction" msgid="466220283138359837">"Đề xuất từ"</string>
- <string name="prediction_category" msgid="7027100625580696660">"Cài đặt đề xuất từ"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Bật tự động hoàn tất khi nhập"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Tự động hoàn tất"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Tăng kích cỡ trường văn bản"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ẩn đề xuất từ trong chế độ xem ngang"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"Cài đặt đề xuất từ"</string>
<string name="auto_cap" msgid="1719746674854628252">"Tự động viết hoa"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Viết hoa chữ cái đầu câu"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Tự động chấm câu"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Sửa nhanh"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Sửa lỗi nhập thông thường"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Hiển thị đề xuất"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Hiển thị từ được đề xuất khi nhập"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Tự động hoàn tất"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Dấu cách và dấu câu tự động chèn vào từ được đánh dấu"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Hiển thị đề xuất"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Hiển thị từ được đề xuất khi nhập"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Luôn hiển thị"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Hiển thị trong chế độ dọc"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Luôn ẩn"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Hiển thị phím cài đặt"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Tự động"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Luôn hiển thị"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Luôn ẩn"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"Tự động sửa"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Dấu cách và dấu câu tự động chèn vào từ được đánh dấu"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Tắt"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Đơn giản"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Linh hoạt"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"Đề xuất Bigram"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Sử dụng từ trước đó để cải tiến đề xuất"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Không"</item>
- <item msgid="1669461741568287396">"Cơ bản"</item>
- <item msgid="4894328801530136615">"Nâng cao"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Đã lưu"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Giữ phím xuống để xem dấu trọng âm (ø, ö, v.v...)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Nhấn phím quay lại ↶ để đóng bàn phím bất kỳ lúc nào"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Truy cập các số và ký hiệu"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Nhấn và giữ từ ngoài cùng bên trái để thêm từ đó vào từ điển"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Chạm vào gợi ý này để tiếp tục »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Chạm vào đây để đóng gợi ý này và bắt đầu nhập"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Bàn phím mở ra bất cứ khi nào bạn chạm vào trường văn bản"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Chạm &amp; giữ phím để xem dấu trọng âm"\n"(ø, ö, ô, ó, v.v...)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Chuyển sang số và ký hiệu bằng cách chạm vào phím này"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Quay lại các chữ cái bằng cách chạm vào phím này lần nữa"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Chạm &amp; giữ phím này để thay đổi cài đặt bàn phím, như tự động hoàn tất"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Hãy dùng thử!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Đến"</string>
<string name="label_next_key" msgid="362972844525672568">"Tiếp theo"</string>
<string name="label_done_key" msgid="2441578748772529288">"Xong"</string>
<string name="label_send_key" msgid="2815056534433717444">"Gửi"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"Khác"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Tạm dừng"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Đợi"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Nhập liệu bằng giọng nói"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Nhập liệu bằng giọng nói hiện không được hỗ trợ cho ngôn ngữ của bạn nhưng hoạt động với ngôn ngữ tiếng Anh."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Nhập liệu bằng giọng nói là tính năng thử nghiệm sử dụng nhận dạng tiếng nói được kết nối mạng của Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Để tắt nhập liệu bằng giọng nói, đi tới cài đặt bàn phím."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Để sử dụng nhập liệu bằng giọng nói, hãy nhấn nút micrô hoặc trượt ngón tay trên bàn phím ảo."</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Nhập liệu bằng giọng nói sử dụng nhận dạng giọng nói của Google. "<a href="http://m.google.com/privacy">"Chính sách bảo mật dành cho điện thoại di động"</a>" được áp dụng."</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Để tắt nhập liệu bằng giọng nói, đi tới cài đặt phương thức nhập."</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Để sử dụng nhập liệu bằng giọng nói, bấm nút micrô."</string>
<string name="voice_listening" msgid="467518160751321844">"Xin mời nói"</string>
<string name="voice_working" msgid="6666937792815731889">"Đang hoạt động"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"Huỷ"</string>
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="2466640768843347841">"Nhập liệu bằng giọng nói"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"Trên bàn phím chính"</item>
- <item msgid="8529385602829095903">"Trên bàn phím có biểu tượng"</item>
- <item msgid="7283103513488381103">"Tắt"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"Micrô trên bàn phím chính"</item>
- <item msgid="6907837061058876770">"Micrô trên bàn phím có biểu tượng"</item>
- <item msgid="3664304608587798036">"Nhập liệu bằng giọng nói đã bị vô hiệu hoá"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"Tự động gửi sau thoại"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"Tự đông nhấn enter khi tìm kiếm hoặc đi tới trường tiếp theo."</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Mở bàn phím"\n</b></font><font size="3">\n</font>"Chạm vào bất kỳ trường văn bản nào."</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Đóng bàn phím"\n</b></font><font size="3">\n</font>"Nhấn phím Quay lại."</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Chạm &amp; giữ phím cho các tuỳ chọn"\n</b></font><font size="3">\n</font>"Truy cập dấu câu và dấu trọng âm."</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Cài đặt bàn phím"\n</b></font><font size="3">\n</font>"Chạm &amp; giữ phím "<b>"?123"</b>"."</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Trên bàn phím chính"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Trên bàn phím biểu tượng"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"Tắt"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micrô trên bàn phím chính"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micrô trên bàn phím biểu tượng"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Nhập liệu bằng giọng nói đã bị vô hiệu hóa"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Chọn phương thức nhập"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Ngôn ngữ nhập"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Trượt ngón tay trên phím cách để thay đổi ngôn ngữ"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Bật phản hồi của người dùng"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Giúp nâng cao trình chỉnh sửa phương thức nhập này bằng cách tự động gửi thống kê sử dụng và báo cáo sự cố cho Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Chạm để sửa từ"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Chạm các từ đã nhập để sửa"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Chạm các từ đã nhập để sửa, chỉ khi các đề xuất được hiển thị"</string>
<string name="keyboard_layout" msgid="437433231038683666">"Chủ đề bàn phím"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"bàn phím"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"thoại"</string>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Bàn phím tiếng Séc"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Bàn phím tiếng Đan Mạch"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Bàn phím tiếng Đức"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Bàn phím tiếng Anh (Anh)"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Bàn phím tiếng Anh (Mỹ)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Bàn phím tiếng Tây Ban Nha"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Bàn phím tiếng Tây Ban Nha (Hoa Kỳ)"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Bàn phím tiếng Pháp"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Bàn phím tiếng Pháp (Canada)"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Bàn phím tiếng Pháp (Thụy Sĩ)"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Bàn phím tiếng Ý"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Bàn phím tiếng Na Uy"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Bàn phím tiếng Hà Lan"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Bàn phím tiếng Nga"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Bàn phím tiếng Serbia"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Bàn phím tiếng Thụy Điển"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Giọng nói tiếng Séc"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Giọng nói tiếng Đức"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Giọng nói tiếng Tây Ban Nha"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Giọng nói tiếng Pháp"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Giọng nói tiếng Nhật"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Giọng nói tiếng Hàn"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Giọng nói tiếng Ba Lan"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Giọng nói tiếng Bồ Đào Nha"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Giọng nói tiếng Nga"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Giọng nói tiếng Thổ Nhĩ Kỳ"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Chế độ nghiên cứu tính khả dụng"</string>
</resources>
diff --git a/java/res/values-xlarge-land/dimens.xml b/java/res/values-xlarge-land/dimens.xml
new file mode 100644
index 000000000..625dd263c
--- /dev/null
+++ b/java/res/values-xlarge-land/dimens.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources>
+ <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+ <dimen name="keyboardHeight">58.0mm</dimen>
+ <!-- key_height + key_bottom_gap = popup_key_height -->
+ <!-- <dimen name="key_height">14.5mm</dimen> -->
+ <dimen name="key_bottom_gap">0.0mm</dimen>
+ <dimen name="key_horizontal_gap">0.0mm</dimen>
+ <dimen name="popup_key_height">13.0mm</dimen>
+ <dimen name="keyboard_top_padding">1.1mm</dimen>
+ <dimen name="keyboard_bottom_padding">0.0mm</dimen>
+ <!-- key_height x 1.0 -->
+ <dimen name="key_preview_height">13.0mm</dimen>
+
+ <dimen name="key_letter_size">28dip</dimen>
+ <dimen name="key_label_text_size">20dip</dimen>
+ <!-- left or right padding of label alignment -->
+ <dimen name="key_label_horizontal_alignment_padding">18dip</dimen>
+ <dimen name="candidate_strip_padding">40.0mm</dimen>
+</resources>
diff --git a/java/res/values-xlarge/config.xml b/java/res/values-xlarge/config.xml
new file mode 100644
index 000000000..40fdce0fd
--- /dev/null
+++ b/java/res/values-xlarge/config.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources>
+ <bool name="config_enable_show_settings_key_option">false</bool>
+ <bool name="config_enable_show_subtype_settings">false</bool>
+ <bool name="config_enable_show_voice_key_option">false</bool>
+ <bool name="config_enable_show_popup_on_keypress_option">false</bool>
+ <bool name="config_enable_show_recorrection_option">false</bool>
+ <bool name="config_enable_quick_fixes_option">false</bool>
+ <bool name="config_enable_bigram_suggestions_option">false</bool>
+ <bool name="config_candidate_highlight_font_color_enabled">false</bool>
+ <bool name="config_swipe_down_dismiss_keyboard_enabled">false</bool>
+ <bool name="config_sliding_key_input_enabled">false</bool>
+ <bool name="config_digit_popup_characters_enabled">false</bool>
+ <!-- Whether or not Popup on key press is enabled by default -->
+ <bool name="config_default_popup_preview">false</bool>
+ <bool name="config_use_spacebar_language_switcher">false</bool>
+ <!-- Showing mini keyboard, just above the touched point if true, aligned to the key if false -->
+ <bool name="config_show_mini_keyboard_at_touched_point">true</bool>
+ <!-- The language is never displayed if == 0, always displayed if < 0 -->
+ <integer name="config_delay_before_fadeout_language_on_spacebar">1200</integer>
+ <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. -->
+ <string name="config_default_keyboard_theme_id" translatable="false">5</string>
+ <string name="config_text_size_of_language_on_spacebar" translatable="false">medium</string>
+ <integer name="config_max_popup_keyboard_column">5</integer>
+</resources>
diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml
new file mode 100644
index 000000000..69283202e
--- /dev/null
+++ b/java/res/values-xlarge/dimens.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources>
+ <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+ <dimen name="keyboardHeight">48.0mm</dimen>
+ <!-- key_height + key_bottom_gap = popup_key_height -->
+ <!-- <dimen name="key_height">14.5mm</dimen> -->
+ <dimen name="key_bottom_gap">0.0mm</dimen>
+ <dimen name="key_horizontal_gap">0.0mm</dimen>
+ <dimen name="popup_key_height">10.0mm</dimen>
+ <dimen name="keyboard_top_padding">1.1mm</dimen>
+ <dimen name="keyboard_bottom_padding">0.0mm</dimen>
+ <!-- key_height x 1.0 -->
+ <dimen name="key_preview_height">13.0mm</dimen>
+ <dimen name="mini_keyboard_key_horizontal_padding">12dip</dimen>
+ <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
+ <!-- popup_key_height x 1.2 -->
+ <dimen name="mini_keyboard_slide_allowance">15.6mm</dimen>
+ <!-- popup_key_height x -1.0 -->
+ <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen>
+
+ <dimen name="key_letter_size">26dip</dimen>
+ <dimen name="key_label_text_size">16dip</dimen>
+ <dimen name="key_preview_text_size_large">24dip</dimen>
+ <!-- left or right padding of label alignment -->
+ <dimen name="key_label_horizontal_alignment_padding">6dip</dimen>
+
+ <dimen name="candidate_strip_height">46dip</dimen>
+ <dimen name="candidate_strip_padding">15.0mm</dimen>
+ <dimen name="candidate_min_width">0.3in</dimen>
+ <dimen name="candidate_padding">12dip</dimen>
+ <dimen name="candidate_text_size">22dip</dimen>
+</resources>
diff --git a/java/res/values-zh-rCN/donottranslate-altchars.xml b/java/res/values-xlarge/donottranslate.xml
index c165b11c5..672dea589 100644
--- a/java/res/values-zh-rCN/donottranslate-altchars.xml
+++ b/java/res/values-xlarge/donottranslate.xml
@@ -18,13 +18,6 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">èéêë</string>
- <string name="alternates_for_i">ìíîï</string>
- <string name="alternates_for_o">òóôõöœø</string>
- <string name="alternates_for_u">ùúûü</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ</string>
+ <!-- Default value of the visibility of the suggestion strip -->
+ <string name="prefs_suggestion_visibility_default_value" translatable="false">2</string>
</resources>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index bb68245ec..9f2eff9db 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"按键时振动"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"按键时播放音效"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"按键时显示弹出窗口"</string>
- <string name="hit_correction" msgid="4855351009261318389">"纠正输入错误"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"启用输入错误纠正功能"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"横向输入错误"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"启用输入错误纠正功能"</string>
- <string name="auto_correction" msgid="7911639788808958255">"字词建议"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"自动纠正前面的字词"</string>
- <string name="prediction" msgid="466220283138359837">"字词建议"</string>
- <string name="prediction_category" msgid="7027100625580696660">"字词建议设置"</string>
- <string name="prediction_summary" msgid="459788228830873110">"输入时启用自动填写功能"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"自动完成"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"扩大文字字段"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"在横向视图中隐藏字词建议"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"字词建议设置"</string>
<string name="auto_cap" msgid="1719746674854628252">"自动大写"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"句首字母大写"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"自动加标点"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"快速纠正"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"纠正常见的输入错误"</string>
- <string name="show_suggestions" msgid="507074425254289133">"显示建议"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"输入时启用联想提示"</string>
- <string name="auto_complete" msgid="1103196318775486023">"自动填写"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"按空格键和标点符号时自动插入突出显示的字词"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"显示建议"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"输入时显示建议的字词"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"始终显示"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"以纵向模式显示"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"始终隐藏"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"显示设置键"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"自动"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"始终显示"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"始终隐藏"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"自动更正"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"空格和标点符号会自动插入突出显示的字词"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"关闭"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"部分"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"全部"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"双连词建议"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"使用以前的字词改进建议"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"无"</item>
- <item msgid="1669461741568287396">"基本模式"</item>
- <item msgid="4894328801530136615">"高级"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已保存"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"按住某个键可看到重音符号(例如 ø、ö 等)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"随时可以通过按后退键 ↶ 关闭键盘"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"访问数字和符号"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"长按最左侧的字可将其添加到词典中"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"轻触此提示继续 »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"轻触此处可关闭该提示,然后便可开始输入内容!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"您可以随时通过触摸文字字段打开键盘"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"轻触并按住某个键可以查看重音符号"\n"(ø、ö、ô、ó 等)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"轻触该键即可切换到数字和符号键盘"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"再次轻触该键即可返回字母键盘"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"触摸并按住该键可更改键盘设置,例如自动完成"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"试试吧!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"开始"</string>
<string name="label_next_key" msgid="362972844525672568">"下一步"</string>
<string name="label_done_key" msgid="2441578748772529288">"完成"</string>
<string name="label_send_key" msgid="2815056534433717444">"发送"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"更多"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"暂停"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"等待"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"语音输入"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"语音输入功能当前还不支持您的语言,您只能输入英语语音。"</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"语音输入是一项试验性的功能,它采用了 Google 的网络语音识别功能。"</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"要关闭语音输入功能,请转至键盘设置。"</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"要使用语音输入,请按麦克风按钮或者在屏幕键盘上滑动手指。"</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"语音输入采用了 Google 的语音识别功能,因此请遵守 "<a href="http://m.google.com/privacy">"Google 移动隐私权政策"</a>"。"</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"要关闭语音输入功能,请转到输入法设置。"</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"要使用语音输入设备,请按麦克风按钮。"</string>
<string name="voice_listening" msgid="467518160751321844">"请开始说话"</string>
<string name="voice_working" msgid="6666937792815731889">"正在处理"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"取消"</string>
<string name="ok" msgid="7898366843681727667">"确定"</string>
<string name="voice_input" msgid="2466640768843347841">"语音输入"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"主键盘上"</item>
- <item msgid="8529385602829095903">"符号键盘上"</item>
- <item msgid="7283103513488381103">"关"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"主键盘上的麦克风"</item>
- <item msgid="6907837061058876770">"符号键盘上的麦克风"</item>
- <item msgid="3664304608587798036">"已停用语音输入"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"语音结束后自动提交"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"搜索或转到下一字段时自动按 Enter。"</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"打开键盘"\n</b></font><font size="3">\n</font>"触摸任意文本字段。"</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"关闭键盘"\n</b></font><font size="3">\n</font>"按“返回”键。"</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"触摸并按住选项键"\n</b></font><font size="3">\n</font>"进入标点/重音符号界面。"</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"键盘设置"\n</b></font><font size="3">\n</font>"触摸并按住 "<b>"?123"</b>" 键。"</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"主键盘上"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"符号键盘上"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"关闭"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"主键盘上的麦克风"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"符号键盘上的麦克风"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"语音输入功能已停用"</string>
<string name="selectInputMethod" msgid="315076553378705821">"选择输入法"</string>
<string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string>
<string name="language_selection_summary" msgid="187110938289512256">"在空格键上滑动手指可更改语言"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"启用用户反馈"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"自动向 Google 发送使用情况统计信息和崩溃报告,帮助改进该输入法编辑器。"</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"触摸更正字词"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"仅在系统显示建议后,触摸输入的字词进行更正"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"仅在系统显示建议后,触摸输入的字词进行更正"</string>
<string name="keyboard_layout" msgid="437433231038683666">"键盘主题"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"键盘"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"语音"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"捷克语键盘"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"丹麦语键盘"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"德语键盘"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英语(英国)键盘"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英语(美国)键盘"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙语键盘"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"西班牙语(美国)键盘"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法语键盘"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法语(加拿大)键盘"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法语(瑞士)键盘"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"意大利语键盘"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"挪威语键盘"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"荷兰语键盘"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"俄语键盘"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"塞尔维亚语键盘"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"瑞典语键盘"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"捷克语语音"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"德语语音"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"西班牙语语音"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"法语语音"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日语语音"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韩语语音"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"波兰语语音"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"葡萄牙语语音"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"俄语语音"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"土耳其语语音"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"可用性研究模式"</string>
</resources>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index b345cca40..f1241d24d 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -26,68 +26,42 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"按鍵時震動"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"按鍵時播放音效"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"按鍵時顯示彈出式視窗"</string>
- <string name="hit_correction" msgid="4855351009261318389">"修正輸入錯誤"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"啟用輸入錯誤修正功能"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"橫向輸入錯誤"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"啟用輸入錯誤修正功能"</string>
- <string name="auto_correction" msgid="7911639788808958255">"字詞建議"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"自動修正前一個字詞"</string>
- <string name="prediction" msgid="466220283138359837">"字詞建議"</string>
- <string name="prediction_category" msgid="7027100625580696660">"字詞建議設定"</string>
- <string name="prediction_summary" msgid="459788228830873110">"輸入時啟用自動完成"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"自動完成"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"放大文字欄位大小"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"在橫向檢視模式中隱藏字詞建議"</string>
+ <!-- no translation found for general_category (1859088467017573195) -->
+ <skip />
+ <!-- outdated translation 8633658064951690350 --> <string name="prediction_category" msgid="6361242011806282176">"字詞建議設定"</string>
<string name="auto_cap" msgid="1719746674854628252">"自動大寫"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"句首字母大寫"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"自動標點"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"快速修正"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"修正一般打字錯誤"</string>
- <string name="show_suggestions" msgid="507074425254289133">"顯示建議"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"打字時顯示建議字詞"</string>
- <string name="auto_complete" msgid="1103196318775486023">"自動完成"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤"</string>
+ <!-- outdated translation 1375526087676269770 --> <string name="prefs_show_suggestions" msgid="8026799663445531637">"顯示建議"</string>
+ <!-- outdated translation 2564386479780335351 --> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"輸入時顯示建議字詞"</string>
+ <!-- outdated translation 8350173747634837929 --> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"永遠顯示"</string>
+ <!-- outdated translation 670278993111469619 --> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"在垂直模式中顯示"</string>
+ <!-- outdated translation 2750493093338023345 --> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"永遠隱藏"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"顯示設定金鑰"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"自動"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"永遠顯示"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"永遠隱藏"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <string name="auto_correction" msgid="4979925752001319458">"自動修正"</string>
+ <!-- outdated translation 6260001790426244084 --> <string name="auto_correction_summary" msgid="5625751551134658006">"在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"關閉"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"普通模式"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"全部"</string>
<string name="bigram_suggestion" msgid="1323347224043514969">"雙連詞建議"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"根據前一個字詞自動找出更適合的建議"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"無"</item>
- <item msgid="1669461741568287396">"基本模式"</item>
- <item msgid="4894328801530136615">"進階模式"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已儲存"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"按住按鍵可查看重音符號 (ø、ö 等)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"隨時可以透過按後退鍵 ↶ 關閉鍵盤"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"使用數字和符號"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"按住最左邊的字詞,將其新增到字典中"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"輕觸此提示繼續 »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"輕觸此處以關閉提示,並開始打字!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"輕觸文字欄位時即會開啟鍵盤"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"輕觸並按住某個鍵即可查看聲調"\n"(ø、ö、ô、ó 等)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"輕觸此鍵即可切換到數字和符號鍵盤"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"再次輕觸此鍵即可返回到字母鍵盤"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"輕觸並按住此鍵即可變更鍵盤設定,例如自動完成"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"試試看!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"開始"</string>
<string name="label_next_key" msgid="362972844525672568">"繼續"</string>
<string name="label_done_key" msgid="2441578748772529288">"完成"</string>
<string name="label_send_key" msgid="2815056534433717444">"傳送"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- outdated translation 3103719164112604010 --> <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
+ <string name="label_more_key" msgid="3760239494604948502">"更多"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"暫停"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"等候"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"語音輸入"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"語音輸入目前不支援您的語言,但是可以辨識英文。"</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"語音輸入這項實驗功能運用了 Google 的網路語音辨識系統。"</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"請前往鍵盤設定來關閉語音輸入。"</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"如要使用語音輸入,按下 [麥克風] 按鈕,或將手指滑過螢幕小鍵盤即可。"</string>
+ <!-- outdated translation 5450473727606344027 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"語音輸入使用 Google 語音辨識功能,並遵守《"<a href="http://m.google.com/privacy">"Google 行動服務隱私權政策"</a>"》。"</string>
+ <!-- outdated translation 8461922898209345270 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"如要關閉語音輸入功能,請前往輸入法設定進行操作。"</string>
+ <!-- outdated translation 6099357096490592798 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"輕按 [麥克風] 按鈕,即可使用語音輸入。"</string>
<string name="voice_listening" msgid="467518160751321844">"請說話"</string>
<string name="voice_working" msgid="6666937792815731889">"辨識中"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +78,12 @@
<string name="cancel" msgid="6830980399865683324">"取消"</string>
<string name="ok" msgid="7898366843681727667">"確定"</string>
<string name="voice_input" msgid="2466640768843347841">"語音輸入"</string>
- <string-array name="voice_input_modes">
- <item msgid="1349082139076086774">"於主鍵盤"</item>
- <item msgid="8529385602829095903">"符號鍵盤上"</item>
- <item msgid="7283103513488381103">"關閉"</item>
- </string-array>
- <string-array name="voice_input_modes_summary">
- <item msgid="554248625705084903">"主鍵盤上的麥克風"</item>
- <item msgid="6907837061058876770">"符號鍵盤上的麥克風"</item>
- <item msgid="3664304608587798036">"已停用語音輸入"</item>
- </string-array>
- <string name="auto_submit" msgid="9151008027068358518">"說話後自動提交"</string>
- <string name="auto_submit_summary" msgid="4961875269610384226">"搜尋或前往下一個欄位時自動按下輸入。"</string>
- <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"開啟鍵盤"\n</b></font><font size="3">\n</font>"輕觸任何文字欄位。"</string>
- <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"關閉鍵盤"\n</b></font><font size="3">\n</font>"按下 Back 鍵。"</string>
- <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>\n"輕觸並按住按鍵開啟選項"</b></font><font size="3">\n</font>"輸入標點與輕重音。"</string>
- <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"鍵盤設定"\n</b></font><font size="3">\n</font>"輕觸並按住 "<b>"?123"</b>" 鍵。"</string>
- <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
- <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
- <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
- <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
- <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"主鍵盤上"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"於符號鍵盤"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"關閉"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"主鍵盤上的麥克風"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"於符號鍵盤顯示麥克風"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"已停用語音輸入"</string>
<string name="selectInputMethod" msgid="315076553378705821">"選取輸入法"</string>
<string name="language_selection_title" msgid="1651299598555326750">"輸入語言"</string>
<string name="language_selection_summary" msgid="187110938289512256">"以手指在空白鍵上滑動可變更語言"</string>
@@ -133,8 +92,47 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"啟用使用者意見回饋"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"自動將使用統計資料和當機報告傳送給 Google,協助改善這個輸入法編輯器。"</string>
<!-- outdated translation 6143241861730430695 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"輕觸即可更正字詞"</string>
- <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"輕觸即可更正輸入的文字 (僅適用於建議顯示時)"</string>
+ <!-- outdated translation 3119549956172710725 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"輕觸即可更正輸入的文字 (僅適用於建議顯示時)"</string>
<string name="keyboard_layout" msgid="437433231038683666">"鍵盤主題"</string>
- <string name="subtype_mode_keyboard" msgid="2242090416595003881">"鍵盤"</string>
- <string name="subtype_mode_voice" msgid="4394113125441627771">"語音"</string>
+ <!-- outdated translation 1186679497674833204 --> <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"捷克文鍵盤"</string>
+ <!-- outdated translation 1395637124037817510 --> <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"丹麥文鍵盤"</string>
+ <!-- outdated translation 1145552122692431122 --> <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"德文鍵盤"</string>
+ <!-- outdated translation 5050923189634470413 --> <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英文 (英國) 鍵盤"</string>
+ <!-- outdated translation 3435344903704397043 --> <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英文 (美國) 鍵盤"</string>
+ <!-- outdated translation 1030419781157491328 --> <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙文鍵盤"</string>
+ <!-- outdated translation 5792199241357098918 --> <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"西班牙文 (美國) 鍵盤"</string>
+ <!-- outdated translation 4855416218650524164 --> <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法文件盤"</string>
+ <!-- outdated translation 6458285776720480201 --> <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法文 (加拿大) 鍵盤"</string>
+ <!-- outdated translation 5966960427086795964 --> <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法文 (瑞士) 鍵盤"</string>
+ <!-- outdated translation 6927754583816493555 --> <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"義大利文鍵盤"</string>
+ <!-- outdated translation 771634025467668613 --> <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"挪威文鍵盤"</string>
+ <!-- outdated translation 3397048533451717478 --> <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"荷蘭文鍵盤"</string>
+ <!-- outdated translation 3812694929448916712 --> <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"俄文鍵盤"</string>
+ <!-- outdated translation 7947963963114184275 --> <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"塞爾維亞文鍵盤"</string>
+ <!-- outdated translation 3874083866564515371 --> <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"瑞典文鍵盤"</string>
+ <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+ <skip />
+ <!-- outdated translation 8290007904951946296 --> <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"捷克文語音"</string>
+ <!-- outdated translation 672328729666823853 --> <string name="subtype_mode_de_voice" msgid="8378803143958089866">"德文語音"</string>
+ <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+ <skip />
+ <!-- outdated translation 1243071504878834350 --> <string name="subtype_mode_es_voice" msgid="1323473601346507487">"西班牙文語音"</string>
+ <!-- outdated translation 2048805677248981105 --> <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"法文語音"</string>
+ <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+ <skip />
+ <!-- outdated translation 1855513591711108481 --> <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日文語音服務"</string>
+ <!-- outdated translation 3453153041889151316 --> <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韓文語音"</string>
+ <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+ <skip />
+ <!-- outdated translation 6730658974157645735 --> <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"波蘭文語音服務"</string>
+ <!-- outdated translation 4508062762756741654 --> <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"葡萄牙文語音"</string>
+ <!-- outdated translation 554299262138845594 --> <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"俄文語音服務"</string>
+ <!-- outdated translation 5242644971865917801 --> <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"土耳其文語音服務"</string>
+ <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+ <skip />
+ <!-- outdated translation 8423000345880575687 --> <string name="prefs_usability_study_mode" msgid="6937813623647419810">"使用性研究模式"</string>
</resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 995373e84..9759e0eb6 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -16,7 +16,7 @@
<resources>
- <declare-styleable name="LatinKeyboardBaseView">
+ <declare-styleable name="KeyboardView">
<!-- Default KeyboardView style. -->
<attr name="keyboardViewStyle" format="reference" />
@@ -25,8 +25,8 @@
checkable+checked+pressed. -->
<attr name="keyBackground" format="reference" />
- <!-- Size of the text for character keys. -->
- <attr name="keyTextSize" format="dimension" />
+ <!-- Size of the text for one letter character keys. -->
+ <attr name="keyLetterSize" format="dimension" />
<!-- Size of the text for custom keys with some text and no icon. -->
<attr name="labelTextSize" format="dimension" />
@@ -34,6 +34,9 @@
<!-- Color to use for the label in a key. -->
<attr name="keyTextColor" format="color" />
+ <!-- Color to use for the label in a key when in disabled state. -->
+ <attr name="keyTextColorDisabled" format="color" />
+
<!-- Layout resource for key press feedback.-->
<attr name="keyPreviewLayout" format="reference" />
@@ -56,17 +59,131 @@
<attr name="shadowRadius" format="float" />
<attr name="backgroundDimAmount" format="float" />
- <attr name="keyTextStyle">
- <flag name="normal" value="0" />
- <flag name="bold" value="1" />
- <flag name="italic" value="2" />
+ <attr name="keyLetterStyle">
+ <!-- This should be aligned with Typeface.NORMAL etc. -->
+ <enum name="normal" value="0" />
+ <enum name="bold" value="1" />
+ <enum name="italic" value="2" />
+ <enum name="boldItalic" value="3" />
</attr>
- <attr name="symbolColorScheme">
- <flag name="white" value="0" />
- <flag name="black" value="1" />
+ <attr name="colorScheme">
+ <!-- This should be aligned with KeyboardView.COLOR_SCHEME_* -->
+ <enum name="white" value="0" />
+ <enum name="black" value="1" />
</attr>
</declare-styleable>
+ <declare-styleable name="Keyboard">
+ <!-- Default keyboard height -->
+ <attr name="keyboardHeight" format="dimension" />
+ <!-- Maximum keyboard height, in pixels or percentage of display height -->
+ <attr name="maxKeyboardHeight" format="dimension|fraction" />
+ <!-- Default width of a key, in pixels or percentage of display width. -->
+ <attr name="keyWidth" format="dimension|fraction" />
+ <!-- Default height of a row (key height + vertical gap), in pixels or percentage of
+ keyboard height. -->
+ <attr name="rowHeight" format="dimension|fraction" />
+ <!-- Default horizontal gap between keys. -->
+ <attr name="horizontalGap" format="dimension|fraction" />
+ <!-- Default vertical gap between rows of keys. -->
+ <attr name="verticalGap" format="dimension|fraction" />
+ <!-- Popup keyboard layout template -->
+ <attr name="popupKeyboardTemplate" format="reference" />
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_Key">
+ <!-- The unicode value that this key outputs. -->
+ <attr name="code" format="integer" />
+ <!-- The characters to display in the popup keyboard. -->
+ <attr name="popupCharacters" format="string" />
+ <!-- Maximum column of popup keyboard -->
+ <attr name="maxPopupKeyboardColumn" format="integer" />
+ <!-- Key edge flags. -->
+ <attr name="keyEdgeFlags">
+ <!-- Key is anchored to the left of the keyboard. -->
+ <flag name="left" value="1" />
+ <!-- Key is anchored to the right of the keyboard. -->
+ <flag name="right" value="2" />
+ </attr>
+ <!-- Whether this is a modifier key such as Alt or Shift. -->
+ <attr name="isModifier" format="boolean" />
+ <!-- Whether this is a toggle key. -->
+ <attr name="isSticky" format="boolean" />
+ <!-- Whether long-pressing on this key will make it repeat. -->
+ <attr name="isRepeatable" format="boolean" />
+ <!-- The icon to show in the popup preview. -->
+ <attr name="iconPreview" format="reference" />
+ <!-- The string of characters to output when this key is pressed. -->
+ <attr name="keyOutputText" format="string" />
+ <!-- The label to display on the key. -->
+ <attr name="keyLabel" format="string" />
+ <!-- The key label option -->
+ <attr name="keyLabelOption">
+ <!-- This should be aligned with KeyboardView.KEY_LABEL_OPTION_* -->
+ <flag name="alignLeft" value="1" />
+ <flag name="alignRight" value="2" />
+ <flag name="alignBottom" value="8" />
+ <flag name="fontNormal" value="16" />
+ </attr>
+ <!-- The unicode that this key generates in manual temporary upper case mode. -->
+ <attr name="manualTemporaryUpperCaseCode" format="integer" />
+ <!-- The icon to display on the key instead of the label. -->
+ <attr name="keyIcon" format="reference" />
+ <!-- The hint icon to display on the key in conjunction with the label -->
+ <attr name="keyHintIcon" format="reference" />
+ <!-- The hint icon to display on the key when keyboard is in manual temporary upper case
+ mode. -->
+ <attr name="manualTemporaryUpperCaseHintIcon" format="reference" />
+ <!-- The key style to specify a set of key attributes defined by <key_style/> -->
+ <attr name="keyStyle" format="string" />
+ <!-- Shift key icon for shifted state -->
+ <attr name="shiftedIcon" format="reference" />
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_Row">
+ <!-- Row edge flags. -->
+ <attr name="rowEdgeFlags">
+ <!-- Row is anchored to the top of the keyboard. -->
+ <flag name="top" value="4" />
+ <!-- Row is anchored to the bottom of the keyboard. -->
+ <flag name="bottom" value="8" />
+ </attr>
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_Include">
+ <attr name="keyboardLayout" format="reference" />
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_Case">
+ <!-- This should be aligned with KeyboardId.MODE_* -->
+ <attr name="mode">
+ <enum name="text" value="0" />
+ <enum name="url" value="1" />
+ <enum name="email" value="2" />
+ <enum name="im" value="3" />
+ <enum name="web" value="4" />
+ <enum name="phone" value="5" />
+ </attr>
+ <attr name="hasSettingsKey" format="string" />
+ <attr name="voiceKeyEnabled" format="string" />
+ <attr name="hasVoiceKey" format="string" />
+ <attr name="imeOptions">
+ <!-- This should be aligned with EditorInfo.IME_ACTION_* -->
+ <flag name="actionUnspecified" value="0" />
+ <flag name="actionNone" value="1" />
+ <flag name="actionGo" value="2" />
+ <flag name="actionSearch" value="3" />
+ <flag name="actionSend" value="4" />
+ <flag name="actionNext" value="5" />
+ <flag name="actionDone" value="6" />
+ <flag name="actionPrevious" value="7" />
+ </attr>
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_KeyStyle">
+ <attr name="styleName" format="string" />
+ <attr name="parentStyle" format="string" />
+ </declare-styleable>
</resources>
diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml
index 5a24e4c60..2a181e17d 100644
--- a/java/res/values/bools.xml
+++ b/java/res/values/bools.xml
@@ -18,16 +18,9 @@
*/
-->
<resources>
- <!-- Whether or not auto-correction should be enabled by default -->
- <bool name="enable_autocorrect">true</bool>
<!-- Whether this input method should be used as the default for a locale. Override it
for latin languages. -->
<bool name="im_is_default">false</bool>
<!-- Whether or not voice input is enabled by default. -->
<bool name="voice_input_default">true</bool>
- <bool name="config_swipeDisambiguation">true</bool>
- <!-- Whether or not Popup on key press is enabled by default -->
- <bool name="default_popup_preview">true</bool>
- <bool name="default_recorrection_enabled">true</bool>
- <bool name="config_long_press_comma_for_settings_enabled">true</bool>
</resources>
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index edb6cd845..ceb4f1252 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -19,6 +19,33 @@
-->
<resources>
+ <bool name="config_swipeDisambiguation">true</bool>
+ <bool name="default_recorrection_enabled">true</bool>
+ <bool name="config_long_press_comma_for_settings_enabled">true</bool>
+ <bool name="config_enable_show_settings_key_option">true</bool>
+ <bool name="config_enable_show_subtype_settings">true</bool>
+ <bool name="config_enable_show_voice_key_option">true</bool>
+ <bool name="config_enable_show_popup_on_keypress_option">true</bool>
+ <bool name="config_enable_show_recorrection_option">true</bool>
+ <bool name="config_enable_quick_fixes_option">true</bool>
+ <bool name="config_enable_bigram_suggestions_option">true</bool>
+ <bool name="config_enable_usability_study_mode_option">false</bool>
+ <bool name="config_candidate_highlight_font_color_enabled">true</bool>
+ <bool name="config_swipe_down_dismiss_keyboard_enabled">true</bool>
+ <bool name="config_sliding_key_input_enabled">true</bool>
+ <bool name="config_digit_popup_characters_enabled">true</bool>
+ <!-- Whether or not Popup on key press is enabled by default -->
+ <bool name="config_default_popup_preview">true</bool>
+ <!-- Default values for whether quick fixes and bigram suggestions are activated -->
+ <bool name="config_default_quick_fixes">true</bool>
+ <bool name="config_default_bigram_suggestions">true</bool>
+ <bool name="config_use_spacebar_language_switcher">true</bool>
+ <!-- Showing mini keyboard, just above the touched point if true, aligned to the key if false -->
+ <bool name="config_show_mini_keyboard_at_touched_point">false</bool>
+ <!-- The language is never displayed if == 0, always displayed if < 0 -->
+ <integer name="config_delay_before_fadeout_language_on_spacebar">-1</integer>
+ <integer name="config_duration_of_fadeout_language_on_spacebar">50</integer>
+ <integer name="config_final_fadeout_percentage_of_language_on_spacebar">15</integer>
<integer name="config_delay_before_preview">0</integer>
<integer name="config_delay_after_preview">10</integer>
<integer name="config_preview_fadein_anim_time">0</integer>
@@ -27,6 +54,26 @@
<integer name="config_mini_keyboard_fadeout_anim_time">100</integer>
<integer name="config_delay_before_key_repeat_start">400</integer>
<integer name="config_key_repeat_interval">50</integer>
+ <integer name="config_keyboard_grid_width">32</integer>
+ <integer name="config_keyboard_grid_height">16</integer>
<integer name="config_long_press_key_timeout">400</integer>
- <integer name="config_multi_tap_key_timeout">800</integer>
+ <integer name="config_long_press_shift_key_timeout">1200</integer>
+ <integer name="config_touch_noise_threshold_millis">40</integer>
+ <dimen name="config_touch_noise_threshold_distance">2.0mm</dimen>
+ <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. -->
+ <string name="config_default_keyboard_theme_id" translatable="false">4</string>
+ <string name="config_text_size_of_language_on_spacebar" translatable="false">small</string>
+ <integer name="config_max_popup_keyboard_column">10</integer>
+ <!-- Whether or not auto-correction should be enabled by default -->
+ <bool name="enable_autocorrect">true</bool>
+ <string-array name="auto_correction_threshold_values" translatable="false">
+ <!-- Off, When auto correction setting is Off, this value is not used. -->
+ <item></item>
+ <!-- Modest : Suggestion whose normalized score is greater than this value
+ will be subject to auto-correction. -->
+ <item>0.22</item>
+ <!-- Aggressive : Suggestion whose normalized score is greater than this value
+ will be subject to auto-correction. -->
+ <item>0</item>
+ </string-array>
</resources>
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 0c3b6ad2e..7f00cdba3 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -19,32 +19,45 @@
-->
<resources>
+ <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+ <dimen name="keyboardHeight">1.265in</dimen>
<!-- key_height + key_bottom_gap = popup_key_height -->
- <dimen name="key_height">0.290in</dimen>
+ <!-- <dimen name="key_height">0.290in</dimen> -->
<dimen name="key_bottom_gap">0.035in</dimen>
+ <dimen name="key_horizontal_gap">0.000in</dimen>
<dimen name="popup_key_height">0.325in</dimen>
+ <dimen name="keyboard_top_padding">0.00in</dimen>
<dimen name="keyboard_bottom_padding">0.06in</dimen>
- <dimen name="bubble_pointer_offset">22dip</dimen>
- <dimen name="candidate_strip_height">42dip</dimen>
- <dimen name="candidate_strip_fading_edge_length">63dip</dimen>
- <dimen name="spacebar_vertical_correction">4dip</dimen>
- <!-- If the screen height in landscape is larger than the below value, then the keyboard
- will not go into extract (fullscreen) mode. -->
- <dimen name="max_height_for_fullscreen">2.5in</dimen>
- <dimen name="key_text_size">0.13in</dimen>
- <dimen name="key_label_text_size">0.083in</dimen>
- <dimen name="key_preview_text_size_large">40sp</dimen>
- <dimen name="key_preview_offset">0.000in</dimen>
<!-- key_preview_text_size_large x 2 -->
<dimen name="key_preview_height">80sp</dimen>
+ <dimen name="mini_keyboard_key_horizontal_padding">8dip</dimen>
<!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
- <!-- popup_key_height x 1.7 -->
- <dimen name="mini_keyboard_slide_allowance">0.553in</dimen>
- <!-- popup_key_height x 1.0 -->
+ <!-- popup_key_height x 1.2 -->
+ <dimen name="mini_keyboard_slide_allowance">0.390in</dimen>
+ <!-- popup_key_height x -1.0 -->
<dimen name="mini_keyboard_vertical_correction">-0.325in</dimen>
- <dimen name="key_hysteresis_distance">0.05in</dimen>
+
+ <dimen name="key_letter_size">0.13in</dimen>
+ <dimen name="key_label_text_size">0.083in</dimen>
+ <dimen name="key_preview_text_size_large">40sp</dimen>
+ <!-- left or right padding of label alignment -->
+ <dimen name="key_label_horizontal_alignment_padding">0.13in</dimen>
+ <dimen name="key_preview_offset">0.000in</dimen>
<!-- We use "inch", not "dip" because this value tries dealing with physical distance related
to user's finger. -->
<dimen name="keyboard_vertical_correction">-0.05in</dimen>
- <dimen name="candidate_min_touchable_width">0.3in</dimen>
+
+ <dimen name="candidate_strip_height">42dip</dimen>
+ <dimen name="candidate_strip_fading_edge_length">63dip</dimen>
+ <dimen name="candidate_strip_padding">0dip</dimen>
+ <dimen name="candidate_min_width">0.3in</dimen>
+ <dimen name="candidate_padding">6dip</dimen>
+ <dimen name="candidate_text_size">18dip</dimen>
+ <dimen name="spacebar_vertical_correction">4dip</dimen>
+ <!-- If the screen height in landscape is larger than the below value, then the keyboard
+ will not go into extract (fullscreen) mode. -->
+ <dimen name="max_height_for_fullscreen">2.5in</dimen>
+ <dimen name="bubble_pointer_offset">22dip</dimen>
+
+ <dimen name="key_hysteresis_distance">0.05in</dimen>
</resources>
diff --git a/java/res/values/donottranslate-altchars.xml b/java/res/values/donottranslate-altchars.xml
index bba7282c9..4b1a6ae6d 100644
--- a/java/res/values/donottranslate-altchars.xml
+++ b/java/res/values/donottranslate-altchars.xml
@@ -18,29 +18,39 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">èéêë</string>
- <string name="alternates_for_i">ìíîï</string>
- <string name="alternates_for_o">òóôõöœø</string>
- <string name="alternates_for_u">ùúûü</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ</string>
+ <string name="alternates_for_a"></string>
+ <string name="alternates_for_e">3</string>
+ <string name="alternates_for_i">8</string>
+ <string name="alternates_for_o">9</string>
+ <string name="alternates_for_u">7</string>
+ <string name="alternates_for_s"></string>
+ <string name="alternates_for_n"></string>
+ <string name="alternates_for_c"></string>
+ <string name="alternates_for_y">6</string>
<string name="alternates_for_q">1</string>
<string name="alternates_for_w">2</string>
<string name="alternates_for_d"></string>
<string name="alternates_for_r">4</string>
<string name="alternates_for_t">5</string>
<string name="alternates_for_z"></string>
+ <string name="alternates_for_k"></string>
<string name="alternates_for_l"></string>
<string name="alternates_for_g"></string>
<string name="alternates_for_p">0</string>
<string name="alternates_for_v"></string>
- <string name="alternates_for_ae"></string>
- <string name="alternates_for_oe"></string>
+ <string name="keylabel_for_scandinavia_row2_10"></string>
+ <string name="keylabel_for_scandinavia_row2_11"></string>
+ <string name="alternates_for_scandinavia_row2_10"></string>
+ <string name="alternates_for_scandinavia_row2_11"></string>
<string name="alternates_for_cyrillic_e"></string>
<string name="alternates_for_cyrillic_soft_sign"></string>
- <string name="alternates_for_a_umlaut"></string>
- <string name="alternates_for_o_umlaut"></string>
+ <string name="alternates_for_mic">"\@drawable/sym_keyboard_settings|\@integer/key_settings,\@drawable/sym_keyboard_mic|\@integer/key_voice"</string>
+ <string name="alternates_for_smiley">":-)|:-) ,:-(|:-( ,;-)|;-) ,:-P|:-P ,=-O|=-O ,:-*|:-* ,:O|:O ,B-)|B-) ,:-$|:-$ ,:-!|:-! ,:-[|:-[ ,O:-)|O:-) ,:-\\\\\\\\|:-\\\\\\\\ ,:\'(|:\'( ,:-D|:-D "</string>
+ <string name="alternates_for_settings_slash">"\@drawable/sym_keyboard_settings|\@integer/key_settings,/"</string>
+ <string name="alternates_for_settings_at">"\@drawable/sym_keyboard_settings|\@integer/key_settings,\@"</string>
+ <string name="alternates_for_settings_comma">"\@drawable/sym_keyboard_settings|\@integer/key_settings,\\,"</string>
+ <string name="alternates_for_punctuation">":,/,&amp;,(,),-,+,;,\@,\',\",\?,!,\\,"</string>
+ <string name="keylabel_for_popular_domain">".com"</string>
+ <!-- popular web domains for the locale - most popular, displayed on the keyboard -->
+ <string name="alternates_for_popular_domain">".net,.org,.gov,.edu"</string>
</resources>
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index 936609924..6a1069e99 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -23,13 +23,129 @@
<!-- Symbols that are sentence separators, for purposes of making it hug the last sentence. -->
<string name="sentence_separators">.,!?)</string>
<!-- Symbols that are suggested between words -->
- <string name="suggested_punctuations">!?,\u0022\u0027:()-/@_</string>
+ <string name="suggested_punctuations">!?,\u0022\u0027:();-/@_</string>
+
+ <!-- Label for ALT modifier key. Must be short to fit on key! -->
+ <string name="label_alt_key">ALT</string>
+ <!-- Label for "Tab" key. Must be short to fit on key! -->
+ <string name="label_tab_key">Tab</string>
+ <!-- Label for "switch to symbols" key. Must be short to fit on key! -->
+ <string name="label_to_symbol_key">\?123</string>
+ <!-- Label for "switch to numeric" key. Must be short to fit on key! -->
+ <string name="label_to_numeric_key">123</string>
<!-- Option values to show/hide the settings key in onscreen keyboard -->
<!-- Automatically decide to show or hide the settings key -->
- <string name="settings_key_mode_auto" translatable="false">0</string>
+ <string name="settings_key_mode_auto">0</string>
<!-- Always show the settings key -->
- <string name="settings_key_mode_always_show" translatable="false">1</string>
+ <string name="settings_key_mode_always_show">1</string>
<!-- Always hide the settings key -->
- <string name="settings_key_mode_always_hide" translatable="false">2</string>
+ <string name="settings_key_mode_always_hide">2</string>
+ <!-- Array of the settings key mode values -->
+ <string-array name="settings_key_modes_values">
+ <item>@string/settings_key_mode_auto</item>
+ <item>@string/settings_key_mode_always_show</item>
+ <item>@string/settings_key_mode_always_hide</item>
+ </string-array>
+ <!-- Array of the settings key modes -->
+ <string-array name="settings_key_modes">
+ <item>@string/settings_key_mode_auto_name</item>
+ <item>@string/settings_key_mode_always_show_name</item>
+ <item>@string/settings_key_mode_always_hide_name</item>
+ </string-array>
+
+ <!-- Always show the suggestion strip -->
+ <string name="prefs_suggestion_visibility_show_value">0</string>
+ <!-- Show the suggestion strip only on portrait mode -->
+ <string name="prefs_suggestion_visibility_show_only_portrait_value">1</string>
+ <!-- Always hide the suggestion strip -->
+ <string name="prefs_suggestion_visibility_hide_value">2</string>
+ <!-- Default value of the visibility of the suggestion strip -->
+ <string name="prefs_suggestion_visibility_default_value">0</string>
+ <!-- Option to show/hide the suggestion strip -->
+ <string-array name="prefs_suggestion_visibility_values">
+ <item>@string/prefs_suggestion_visibility_show_value</item>
+ <item>@string/prefs_suggestion_visibility_show_only_portrait_value</item>
+ <item>@string/prefs_suggestion_visibility_hide_value</item>
+ </string-array>
+ <string-array name="prefs_suggestion_visibilities">
+ <item>@string/prefs_suggestion_visibility_show_name</item>
+ <item>@string/prefs_suggestion_visibility_show_only_portrait_name</item>
+ <item>@string/prefs_suggestion_visibility_hide_name</item>
+ </string-array>
+
+ <string name="auto_correction_threshold_mode_index_off">0</string>
+ <string name="auto_correction_threshold_mode_index_modest">1</string>
+ <string name="auto_correction_threshold_mode_index_aggeressive">2</string>
+ <string-array name="auto_correction_threshold_mode_indexes">
+ <item>@string/auto_correction_threshold_mode_index_off</item>
+ <item>@string/auto_correction_threshold_mode_index_modest</item>
+ <item>@string/auto_correction_threshold_mode_index_aggeressive</item>
+ </string-array>
+ <string-array name="auto_correction_threshold_modes">
+ <item>@string/auto_correction_threshold_mode_off</item>
+ <item>@string/auto_correction_threshold_mode_modest</item>
+ <item>@string/auto_correction_threshold_mode_aggeressive</item>
+ </string-array>
+
+ <string name="voice_mode_main">0</string>
+ <string name="voice_mode_symbols">1</string>
+ <string name="voice_mode_off">2</string>
+ <string-array name="voice_input_modes_values">
+ <item>@string/voice_mode_main</item>
+ <item>@string/voice_mode_symbols</item>
+ <item>@string/voice_mode_off</item>
+ </string-array>
+ <!-- Array of Voice Input modes -->
+ <string-array name="voice_input_modes">
+ <item>@string/voice_input_modes_main_keyboard</item>
+ <item>@string/voice_input_modes_symbols_keyboard</item>
+ <item>@string/voice_input_modes_off</item>
+ </string-array>
+ <!-- Array of Voice Input modes summary -->
+ <string-array name="voice_input_modes_summary">
+ <item>@string/voice_input_modes_summary_main_keyboard</item>
+ <item>@string/voice_input_modes_summary_symbols_keyboard</item>
+ <item>@string/voice_input_modes_summary_off</item>
+ </string-array>
+
+ <!-- Title for Latin keyboard debug settings activity / dialog -->
+ <string name="english_ime_debug_settings">Android keyboard Debug settings</string>
+ <string name="prefs_debug_mode">Debug Mode</string>
+
+ <!-- Keyboard theme names -->
+ <string name="layout_basic">Basic</string>
+ <string name="layout_high_contrast">Basic (High Contrast)</string>
+ <string name="layout_stone_bold">Stone (bold)</string>
+ <string name="layout_stone_normal">Stone (normal)</string>
+ <string name="layout_gingerbread">Gingerbread</string>
+ <string name="layout_honeycomb">Honeycomb</string>
+
+ <!-- For keyboard theme switcher dialog -->
+ <string-array name="keyboard_layout_modes">
+ <item>@string/layout_basic</item>
+ <item>@string/layout_high_contrast</item>
+ <item>@string/layout_stone_normal</item>
+ <item>@string/layout_stone_bold</item>
+ <item>@string/layout_gingerbread</item>
+ <item>@string/layout_honeycomb</item>
+ </string-array>
+ <string-array name="keyboard_layout_modes_values">
+ <item>0</item>
+ <item>1</item>
+ <item>2</item>
+ <item>3</item>
+ <item>4</item>
+ <item>5</item>
+ </string-array>
+
+ <!-- Subtype locale name exceptions -->
+ <string-array name="subtype_locale_exception_keys">
+ <item>en_US</item>
+ <item>en_GB</item>
+ </string-array>
+ <string-array name="subtype_locale_exception_values">
+ <item>English (US)</item>
+ <item>English (UK)</item>
+ </string-array>
</resources>
diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml
index c5d5b3cd1..6c18cb42a 100644
--- a/java/res/values/keycodes.xml
+++ b/java/res/values/keycodes.xml
@@ -19,14 +19,13 @@
-->
<resources>
+ <!-- These code should be aligned with Keyboard.CODE_*. -->
<integer name="key_tab">9</integer>
<integer name="key_return">10</integer>
<integer name="key_space">32</integer>
<integer name="key_shift">-1</integer>
- <integer name="key_symbol">-2</integer>
+ <integer name="key_switch_alpha_symbol">-2</integer>
<integer name="key_delete">-5</integer>
- <!-- Keycode for F1 (function) key. This one switches between language switch & comma/.com -->
<integer name="key_settings">-100</integer>
<integer name="key_voice">-102</integer>
- <integer name="key_f1">-103</integer>
</resources>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 6644d2224..f63d6816c 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -22,7 +22,7 @@
<string name="english_ime_name">Android keyboard</string>
<!-- Title for Latin keyboard settings activity / dialog -->
<string name="english_ime_settings">Android keyboard settings</string>
- <!-- Title for Latin keyboard input options dialog -->
+ <!-- Title for Latin keyboard input options dialog [CHAR LIMIT=25] -->
<string name="english_ime_input_options">Input options</string>
<!-- Option to provide vibrate/haptic feedback on keypress -->
@@ -31,151 +31,60 @@
<!-- Option to play back sound on keypress in soft keyboard -->
<string name="sound_on_keypress">Sound on keypress</string>
- <!-- Option to pop up the character with a larger font above soft keyboard -->
+ <!-- Option to control whether or not to show a popup with a larger font on each key press. -->
<string name="popup_on_keypress">Popup on keypress</string>
- <!-- Option to enable using nearby keys when correcting/predicting -->
- <string name="hit_correction">Correct typing errors</string>
-
- <!-- Description for hit_correction -->
- <string name="hit_correction_summary">Enable input error correction</string>
-
- <!-- Option to enable using nearby keys when correcting/predicting in landscape-->
- <string name="hit_correction_land">Landscape input errors</string>
-
- <!-- Description for hit_correction in landscape -->
- <string name="hit_correction_land_summary">Enable input error correction</string>
-
- <!-- Option to automatically correct word on hitting space -->
- <string name="auto_correction">Word suggestions</string>
-
- <!-- Description for auto_correction -->
- <string name="auto_correction_summary">Automatically correct the previous word</string>
-
- <!-- Option to enable text prediction -->
- <string name="prediction">Word suggestions</string>
+ <!-- Category title for general settings for Android keyboard -->
+ <string name="general_category">General</string>
+
<!-- Category title for text prediction -->
- <string name="prediction_category">Word suggestion settings</string>
- <!-- Description for text prediction -->
- <string name="prediction_summary">Enable auto completion while typing</string>
-
- <!-- Dialog title for auto complete choices -->
- <string name="auto_complete_dialog_title">Auto completion</string>
-
- <!-- Option to enable text prediction in landscape -->
- <string name="prediction_landscape">Increase text field size</string>
- <!-- Description for text prediction -->
- <string name="prediction_landscape_summary">Hide word suggestions in landscape view</string>
-
+ <string name="prediction_category">Text correction</string>
+
<!-- Option to enable auto capitalization of sentences -->
- <string name="auto_cap">Auto-capitalization</string>
- <!-- Description for auto cap -->
- <string name="auto_cap_summary">Capitalize the start of a sentence</string>
- <!-- Option to enable auto punctuate -->
- <string name="auto_punctuate">Auto-punctuate</string>
- <!-- Description for auto punctuate -->
- <string name="auto_punctuate_summary"></string>
-
+ <string name="auto_cap">Auto-capitalization</string>
+
<!-- Option to enable quick fixes -->
<string name="quick_fixes">Quick fixes</string>
<!-- Description for quick fixes -->
<string name="quick_fixes_summary">Corrects commonly typed mistakes</string>
-
+
<!-- Option to enable showing suggestions -->
- <string name="show_suggestions">Show suggestions</string>
+ <string name="prefs_show_suggestions">Show correction suggestions</string>
<!-- Description for show suggestions -->
- <string name="show_suggestions_summary">Display suggested words while typing</string>
-
- <!-- Option to enable auto completion -->
- <string name="auto_complete">Auto-complete</string>
- <!-- Description for auto completion -->
- <string name="auto_complete_summary">Spacebar and punctuation automatically insert highlighted word</string>
-
+ <string name="prefs_show_suggestions_summary">Display suggested words while typing</string>
+ <string name="prefs_suggestion_visibility_show_name">Always show</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name">Show on portrait mode</string>
+ <string name="prefs_suggestion_visibility_hide_name">Always hide</string>
+
<!-- Option to show/hide the settings key -->
<string name="prefs_settings_key">Show settings key</string>
- <!-- Array of the settings key mode values -->
- <string-array name="settings_key_modes_values" translatable="false">
- <item>@string/settings_key_mode_auto</item>
- <item>@string/settings_key_mode_always_show</item>
- <item>@string/settings_key_mode_always_hide</item>
- </string-array>
<!-- Option to automatically decide to show/hide the settings key -->
<string name="settings_key_mode_auto_name">Automatic</string>
<!-- Option to always show the settings key -->
<string name="settings_key_mode_always_show_name">Always show</string>
<!-- Option to always hide the settings key -->
<string name="settings_key_mode_always_hide_name">Always hide</string>
- <!-- Array of the settings key modes -->
- <string-array name="settings_key_modes">
- <item>@string/settings_key_mode_auto_name</item>
- <item>@string/settings_key_mode_always_show_name</item>
- <item>@string/settings_key_mode_always_hide_name</item>
- </string-array>
-
- <!-- Option to enable bigram completion -->
+
+ <!-- Option to decide the auto correction threshold score -->
+ <!-- Option to enable auto correction [CHAR LIMIT=20]-->
+ <string name="auto_correction">Auto correction</string>
+ <!-- Description for auto correction [CHAR LIMIT=35] -->
+ <string name="auto_correction_summary">Spacebar and punctuation automatically correct mistyped words</string>
+ <!-- Option to disable auto correction. [CHAR LIMIT=20] -->
+ <string name="auto_correction_threshold_mode_off">Off</string>
+ <!-- Option to suggest auto correction candidates modestly. Auto-corrects only to a word which has small edit distance from typed word. [CHAR LIMIT=20] -->
+ <string name="auto_correction_threshold_mode_modest">Modest</string>
+ <!-- Option to suggest auto correction candidates aggressively. Auto-corrects to a word which has even large edit distance from typed word. [CHAR LIMIT=20] -->
+ <string name="auto_correction_threshold_mode_aggeressive">Aggressive</string>
+
+ <!-- Option to enable bigram correction -->
<string name="bigram_suggestion">Bigram Suggestions</string>
- <!-- Description for auto completion -->
+ <!-- Description for auto correction -->
<string name="bigram_suggestion_summary">Use previous word to improve suggestion</string>
- <!-- Array of prediction modes -->
- <string-array name="prediction_modes">
- <item>None</item>
- <item>Basic</item>
- <item>Advanced</item>
- </string-array>
-
- <!-- Don't translate -->
- <string name="prediction_none" translatable="false">0</string>
- <!-- Don't translate -->
- <string name="prediction_basic" translatable="false">1</string>
- <!-- Don't translate -->
- <string name="prediction_full" translatable="false">2</string>
-
- <string-array name="prediction_modes_values" translatable="false">
- <item>@string/prediction_none</item>
- <item>@string/prediction_basic</item>
- <item>@string/prediction_full</item>
- </string-array>
-
<!-- Indicates that a word has been added to the dictionary -->
<string name="added_word"><xliff:g id="word">%s</xliff:g> : Saved</string>
-
- <!-- Tip to long press on keys -->
- <string name="tip_long_press">Hold a key down to see accents (ø, ö, etc.)</string>
- <!-- Tip to dismiss keyboard -->
- <string name="tip_dismiss">Press the back key \u21B6 to close the keyboard at any point</string>
- <!-- Tip to press ?123 to access numbers and symbols -->
- <string name="tip_access_symbols">Access numbers and symbols</string>
- <!-- Tip to long press on typed word to add to dictionary -->
- <string name="tip_add_to_dictionary">Press and hold the left-most word to add it to the dictionary
- </string>
-
- <!-- Instruction to touch the bubble to continue -->
- <string name="touch_to_continue">Touch this hint to continue »</string>
-
- <!-- Instruction to touch the bubble to start typing -->
- <string name="touch_to_finish">Touch here to close this hint and start typing!</string>
-
- <!-- Tutorial tip 1 - The keyboard opens any time you touch a text field -->
- <string name="tip_to_open_keyboard"><b>The keyboard opens any time you touch a text field</b></string>
-
- <!-- Tutorial tip 2 - Touch and hold a key to view accents (examples) -->
- <string name="tip_to_view_accents"><b>Touch &amp; hold a key to view accents\n(ø, ö, ô, ó, and so on)</b>
- </string>
-
- <!-- Tutorial tip 3 - How to switch to number/symbol keyboard -->
- <string name="tip_to_open_symbols"><b>Switch to numbers and symbols by touching this key</b></string>
-
- <!-- Tutorial tip 4 - How to switch back to alphabet keyboard -->
- <string name="tip_to_close_symbols"><b>Go back to letters by touching this key again</b></string>
-
- <!-- Tutorial tip 5 - How to launch keyboard settings -->
- <string name="tip_to_launch_settings"><b>Touch &amp; hold this key to change keyboard settings, like auto complete</b></string>
-
- <!-- Tutorial tip 6 - Done with the tutorial -->
- <string name="tip_to_start_typing"><b>Try it!</b></string>
-
-
+
<!-- Label for soft enter key when it performs GO action. Must be short to fit on key! -->
<string name="label_go_key">Go</string>
<!-- Label for soft enter key when it performs NEXT action. Must be short to fit on key! -->
@@ -184,38 +93,38 @@
<string name="label_done_key">Done</string>
<!-- Label for soft enter key when it performs SEND action. Must be short to fit on key! -->
<string name="label_send_key">Send</string>
- <!-- Label for "switch to symbols" key. Must be short to fit on key! -->
- <string name="label_symbol_key">\?123</string>
- <!-- Label for "switch to numeric" key. Must be short to fit on key! -->
- <string name="label_phone_key">123</string>
<!-- Label for "switch to alphabetic" key. Must be short to fit on key! -->
- <string name="label_alpha_key">ABC</string>
- <!-- Label for ALT modifier key. Must be short to fit on key! -->
- <string name="label_alt_key">ALT</string>
+ <string name="label_to_alpha_key">ABC</string>
+ <!-- Label for Shift modifier key of symbol keyboard. Must be short to fit on key! -->
+ <string name="label_more_key">More</string>
+ <!-- Label for "Pause" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5] -->
+ <string name="label_pause_key">Pause</string>
+ <!-- Label for "Wait" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5]-->
+ <string name="label_wait_key">Wait</string>
<!-- Voice related labels -->
<!-- Title of the warning dialog that shows when a user initiates voice input for
the first time. -->
<string name="voice_warning_title">Voice input</string>
-
+
<!-- Message that gets put at the top of the warning dialog if the user is attempting to use
voice input in a currently unsupported locale. Voice input will work for such a user,
but it will only recognize them in English. -->
<string name="voice_warning_locale_not_supported">Voice input is not currently supported for your language, but does work in English.</string>
-
+
<!-- Message of the warning dialog that shows when a user initiates voice input for
- the first time, or turns it on in settings. -->
- <string name="voice_warning_may_not_understand">Voice input is an experimental feature using Google\'s networked speech recognition.</string>
-
+ the first time, or turns it on in settings. [CHAR LIMIT=200] -->
+ <string name="voice_warning_may_not_understand">Voice input uses Google\'s speech recognition. <a href="http://m.google.com/privacy">The Mobile Privacy Policy</a> applies.</string>
+
<!-- An additional part of the warning dialog for voice input that only shows when the user
- actually initiates voice input, rather than just turning it on in settings. -->
- <string name="voice_warning_how_to_turn_off">To turn off voice input, go to keyboard settings.</string>
-
- <!-- Message to show when user clicks the swiping hint (which says
- "Swipe across keyboard to speak"). Also shown when enabling settings. -->
- <string name="voice_hint_dialog_message">To use voice input, press the microphone button or slide your finger across the on-screen keyboard.</string>
-
+ actually initiates voice input, rather than just turning it on in settings. [CHAR LIMIT=200] -->
+ <string name="voice_warning_how_to_turn_off">To turn off voice input, go to input method settings.</string>
+
+ <!-- Message to show when user enables the voice input settings (which says
+ "Press the microphone button"). [CHAR LIMIT=100] -->
+ <string name="voice_hint_dialog_message">To use voice input, press the microphone button.</string>
+
<!-- Short message to tell the user the system is ready for them to speak. -->
<string name="voice_listening">Speak now</string>
@@ -230,7 +139,7 @@
<!-- Short message shown for a network error. -->
<string name="voice_network_error">Couldn\'t connect</string>
-
+
<!-- Short message shown for a network error where the utterance was really long,
in which case we should suggest that the user speak less. -->
<string name="voice_too_much_speech">Error, too much speech.</string>
@@ -247,8 +156,7 @@
<!-- Short message shown when the server couldn't parse any speech. -->
<string name="voice_no_match">No matches found</string>
- <!-- Short message shown when the user initiates voice and voice
- search is not installed. -->
+ <!-- Short message shown when the user initiates voice and voice search is not installed. -->
<string name="voice_not_installed">Voice search not installed</string>
<!-- Short hint shown in candidate view to explain voice input. -->
@@ -266,74 +174,32 @@
<!-- Preferences item for enabling speech input -->
<string name="voice_input">Voice input</string>
- <!-- Array of Voice Input modes -->
- <string-array name="voice_input_modes">
- <item>On main keyboard</item>
- <item>On symbols keyboard</item>
- <item>Off</item>
- </string-array>
-
- <!-- Don't translate -->
- <string name="voice_mode_main" translatable="false">0</string>
- <!-- Don't translate -->
- <string name="voice_mode_symbols" translatable="false">1</string>
- <!-- Don't translate -->
- <string name="voice_mode_off" translatable="false">2</string>
-
- <string-array name="voice_input_modes_values" translatable="false">
- <item>@string/voice_mode_main</item>
- <item>@string/voice_mode_symbols</item>
- <item>@string/voice_mode_off</item>
- </string-array>
-
- <!-- Array of Voice Input modes summary -->
- <string-array name="voice_input_modes_summary">
- <item>Mic on main keyboard</item>
- <item>Mic on symbols keyboard</item>
- <item>Voice input is disabled</item>
- </string-array>
-
- <!-- Press the "enter" key after the user speaks. Option on settings.-->
- <string name="auto_submit">Auto submit after voice</string>
-
- <!-- Press the "enter" key after the user speaks. Summary of option in settings.-->
- <string name="auto_submit_summary">Automatically press enter when searching or going to the next field.</string>
-
- <!-- IME Tutorial screen (ROMAN) --><skip />
- <!-- appears above image showing the user to click on a TextView to show the IME -->
- <string name="open_the_keyboard"><font size="17"><b>Open the keyboard\n</b></font><font size="3">\n</font>Touch any text field.</string>
-
- <!-- appears above the image showing the back button used to close the keyboard -->
- <string name="close_the_keyboard"><font size="17"><b>Close the keyboard\n</b></font><font size="3">\n</font>Press the Back key.</string>
-
- <!-- appears above image showing how to use touch and hold -->
- <string name="touch_and_hold"><font size="17"><b>Touch \u0026 hold a key for options\n</b></font><font size="3">\n</font>Access punctuation and accents.</string>
-
- <!-- appears above image showing how to access keyboard settings -->
- <string name="keyboard_settings"><font size="17"><b>Keyboard settings\n</b></font><font size="3">\n</font>Touch \u0026 hold the <b>\?123\</b> key.</string>
-
- <!-- popular web domains for the locale - most popular, displayed on the keyboard -->
- <string name="popular_domain_0">".com"</string>
- <!-- popular web domains for the locale - item 1, displayed in the popup -->
- <string name="popular_domain_1">".net"</string>
- <!-- popular web domains for the locale - item 2, displayed in the popup -->
- <string name="popular_domain_2">".org"</string>
- <!-- popular web domains for the locale - item 3, displayed in the popup -->
- <string name="popular_domain_3">".gov"</string>
- <!-- popular web domains for the locale - item 4, displayed in the popup -->
- <string name="popular_domain_4">".edu"</string>
-
- <!-- Menu item for launching Input method picker -->
+ <!-- Voice Input modes -->
+ <!-- On settings screen, voice input pop-up menu option to show voice key on main keyboard [CHAR LIMIT=20] -->
+ <string name="voice_input_modes_main_keyboard">On main keyboard</string>
+ <!-- On settings screen, voice input pop-up menu option to show voice key on symbols keyboard [CHAR LIMIT=20] -->
+ <string name="voice_input_modes_symbols_keyboard">On symbols keyboard</string>
+ <!-- On settings screen, voice input pop-up menu option to never show voice key [CHAR LIMIT=20] -->
+ <string name="voice_input_modes_off">Off</string>
+ <!-- Voice Input modes summary -->
+ <!-- On settings screen, voice input pop-up menu summary text to show voice key on main keyboard [CHAR LIMIT=20] -->
+ <string name="voice_input_modes_summary_main_keyboard">Mic on main keyboard</string>
+ <!-- On settings screen, voice input pop-up menu summary text to show voice key on symbols keyboard [CHAR LIMIT=20] -->
+ <string name="voice_input_modes_summary_symbols_keyboard">Mic on symbols keyboard</string>
+ <!-- On settings screen, voice input pop-up menu summary text to never show voice key [CHAR LIMIT=20] -->
+ <string name="voice_input_modes_summary_off">Voice input is disabled</string>
+
+ <!-- Title of the dialog for selecting input methods. [CHAR LIMIT=20] -->
<string name="selectInputMethod">Select input method</string>
<!-- Title for input language selection screen -->
<string name="language_selection_title">Input languages</string>
<!-- Title summary for input language selection screen -->
<string name="language_selection_summary">Slide finger on spacebar to change language</string>
-
+
<!-- Add to dictionary hint -->
<string name="hint_add_to_dictionary">\u2190 Touch again to save</string>
-
+
<!-- Inform the user that a particular language has an available dictionary -->
<string name="has_dictionary">Dictionary available</string>
@@ -341,39 +207,81 @@
<string name="prefs_enable_log">Enable user feedback</string>
<!-- Description for enabling to send user statistics to Google -->
<string name="prefs_description_log">Help improve this input method editor by automatically sending usage statistics and crash reports to Google.</string>
- <!-- Preferences item for enabling to correct suggestions by touching words you have typed -->
+ <!-- Preferences item for enabling to correct suggestions by touching words you have typed [CHAR LIMIT= 35] -->
<string name="prefs_enable_recorrection">Touch to correct words</string>
- <!-- The summary for the preferences item for enabling to correct suggestions by touching words you have typed -->
- <string name="prefs_enable_recorrection_summary">Touch entered words to correct them</string>
+ <!-- The summary for the preferences item for enabling to correct suggestions by touching words you have typed [CHAR LIMIT= 100] -->
+ <string name="prefs_enable_recorrection_summary">Touch entered words to correct them, only when suggestions are visible</string>
- <!-- Description for keyboard theme switcher -->
+ <!-- Title of the item to change the keyboard theme [CHAR LIMIT=20]-->
<string name="keyboard_layout">Keyboard Theme</string>
- <string name="layout_basic" translatable="false">Basic</string>
- <string name="layout_high_contrast" translatable="false">Basic (High Contrast)</string>
- <string name="layout_stone_bold" translatable="false">Stone (bold)</string>
- <string name="layout_stone_normal" translatable="false">Stone (normal)</string>
- <string name="layout_gingerbread" translatable="false">Gingerbread</string>
-
- <string-array name="keyboard_layout_modes" translatable="false">
- <item>@string/layout_basic</item>
- <item>@string/layout_high_contrast</item>
- <item>@string/layout_stone_normal</item>
- <item>@string/layout_stone_bold</item>
- <item>@string/layout_gingerbread</item>
- </string-array>
-
- <string-array name="keyboard_layout_modes_values" translatable="false">
- <item>0</item>
- <item>1</item>
- <item>2</item>
- <item>3</item>
- <item>4</item>
- </string-array>
-
- <string name="subtype_mode_keyboard">keyboard</string>
- <string name="subtype_mode_voice">voice</string>
-
- <!-- Title for Latin keyboard debug settings activity / dialog -->
- <string name="english_ime_debug_settings" translatable="false">Android keyboard Debug settings</string>
- <string name="prefs_debug_mode" translatable="false">Debug Mode</string>
+
+ <!-- Description for Czech keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_cs_keyboard">Czech Keyboard</string>
+ <!-- Description for Danish keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_da_keyboard">Danish Keyboard</string>
+ <!-- Description for German keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_de_keyboard">German Keyboard</string>
+ <!-- Description for English (United Kingdom) keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_en_GB_keyboard">English (UK) Keyboard</string>
+ <!-- Description for English (United States) keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_en_US_keyboard">English (US) Keyboard</string>
+ <!-- Description for Spanish keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_es_keyboard">Spanish Keyboard</string>
+ <!-- Description for Spanish (United States) keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_es_US_keyboard">Spanish (US) Keyboard</string>
+ <!-- Description for French keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_fr_keyboard">French Keyboard</string>
+ <!-- Description for French (Canada) keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_fr_CA_keyboard">French (Canada) Keyboard</string>
+ <!-- Description for French (Switzerland) keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_fr_CH_keyboard">French (Switzerland) Keyboard</string>
+ <!-- Description for Italian keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_it_keyboard">Italian Keyboard</string>
+ <!-- Description for Norwegian keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_nb_keyboard">Norwegian Keyboard</string>
+ <!-- Description for Dutch keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_nl_keyboard">Dutch Keyboard</string>
+ <!-- Description for Russian keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_ru_keyboard">Russian Keyboard</string>
+ <!-- Description for Serbian keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_sr_keyboard">Serbian Keyboard</string>
+ <!-- Description for Swedish keyboard subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_sv_keyboard">Swedish Keyboard</string>
+ <!-- Description for Afrikaans voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_af_voice">Afrikaans Voice</string>
+ <!-- Description for Czech voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_cs_voice">Czech Voice</string>
+ <!-- Description for German voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_de_voice">German Voice</string>
+ <!-- Description for English voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_en_voice">English Voice</string>
+ <!-- Description for Spanish voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_es_voice">Spanish Voice</string>
+ <!-- Description for French voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_fr_voice">French Voice</string>
+ <!-- Description for Italian voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_it_voice">Italian Voice</string>
+ <!-- Description for Japanese voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_ja_voice">Japanese Voice</string>
+ <!-- Description for Korean voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_ko_voice">Korean Voice</string>
+ <!-- Description for Dutch voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_nl_voice">Dutch Voice</string>
+ <!-- Description for Polish voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_pl_voice">Polish Voice</string>
+ <!-- Description for Portuguese voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_pt_voice">Portuguese Voice</string>
+ <!-- Description for Russian voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_ru_voice">Russian Voice</string>
+ <!-- Description for Turkish voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_tr_voice">Turkish Voice</string>
+ <!-- Description for Chinese, Yue voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_yue_voice">Chinese, Yue Voice</string>
+ <!-- Description for Chinese, Mandarin voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_zh_voice">Chinese, Mandarin Voice</string>
+ <!-- Description for isiZulu voice input subtype [CHAR LIMIT=35] -->
+ <string name="subtype_mode_zu_voice">isiZulu Voice</string>
+
+ <!-- Title of an option for usability study mode -->
+ <string name="prefs_usability_study_mode">Usability Study Mode</string>
</resources>
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index 0372b07cf..130714fd3 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -15,12 +15,14 @@
-->
<resources>
- <style name="LatinKeyboardBaseView">
+ <style name="KeyboardView">
<item name="android:background">@drawable/keyboard_background</item>
<item name="keyBackground">@drawable/btn_keyboard_key</item>
- <item name="keyTextSize">@dimen/key_text_size</item>
+ <item name="keyLetterSize">@dimen/key_letter_size</item>
+ <item name="keyLetterStyle">normal</item>
<item name="keyTextColor">#FFFFFFFF</item>
+ <item name="keyTextColorDisabled">#FFFFFFFF</item>
<item name="keyPreviewLayout">@layout/key_preview</item>
<item name="keyPreviewOffset">@dimen/key_preview_offset</item>
<item name="keyPreviewHeight">@dimen/key_preview_height</item>
@@ -31,7 +33,7 @@
<item name="shadowColor">#BB000000</item>
<item name="shadowRadius">2.75</item>
<item name="backgroundDimAmount">0.5</item>
- <item name="symbolColorScheme">white</item>
+ <item name="colorScheme">white</item>
</style>
<style name="KeyPreviewAnimation">
<item name="android:windowEnterAnimation">@anim/key_preview_fadein</item>
diff --git a/java/res/xml-cs/kbd_qwerty.xml b/java/res/xml-cs/kbd_qwerty.xml
new file mode 100644
index 000000000..010bdb3f7
--- /dev/null
+++ b/java/res/xml-cs/kbd_qwerty.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwertz_rows" />
+</Keyboard>
diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml
index b7b1b1769..441b7cb17 100644
--- a/java/res/xml-da/kbd_qwerty.xml
+++ b/java/res/xml-da/kbd_qwerty.xml
@@ -18,519 +18,16 @@
*/
-->
-<!--
- Danish Keyboard Layout
-
- Just a copy of the Norwegian layout, with æ/ø switched.
--->
-
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p" />
- <Key
- android:keyLabel="å"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l" />
- <Key
- android:keyLabel="æ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_ae" />
- <Key
- android:keyLabel="ø"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_oe"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="10%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_keyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
</Keyboard>
diff --git a/java/res/xml-da/kbd_qwerty_black.xml b/java/res/xml-da/kbd_qwerty_black.xml
deleted file mode 100644
index 3fb4acd1b..000000000
--- a/java/res/xml-da/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,478 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!--
- Danish Keyboard Layout
-
- Just a copy of the Norwegian layout, with æ/ø switched.
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p" />
- <Key
- android:keyLabel="å"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l" />
- <Key
- android:keyLabel="æ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_ae" />
- <Key
- android:keyLabel="ø"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_oe"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="10%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_bkeyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml
index 6f34b45f1..a23e4fbf0 100644
--- a/java/res/xml-de/kbd_qwerty.xml
+++ b/java/res/xml-de/kbd_qwerty.xml
@@ -19,497 +19,16 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_keyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwertz_rows" />
</Keyboard>
diff --git a/java/res/xml-de/kbd_qwerty_black.xml b/java/res/xml-de/kbd_qwerty_black.xml
deleted file mode 100644
index 833537019..000000000
--- a/java/res/xml-de/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,457 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_bkeyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="/" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="\@" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:keyLabel="/" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:keyLabel="\@" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml-fi/kbd_qwerty.xml b/java/res/xml-fi/kbd_qwerty.xml
new file mode 100644
index 000000000..b0a7b3eb0
--- /dev/null
+++ b/java/res/xml-fi/kbd_qwerty.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
+</Keyboard>
diff --git a/java/res/xml-fr-rCA/kbd_qwerty.xml b/java/res/xml-fr-rCA/kbd_qwerty.xml
new file mode 100644
index 000000000..92d92f0e6
--- /dev/null
+++ b/java/res/xml-fr-rCA/kbd_qwerty.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_rows" />
+</Keyboard>
diff --git a/java/res/xml-fr-rCH/kbd_qwerty.xml b/java/res/xml-fr-rCH/kbd_qwerty.xml
new file mode 100644
index 000000000..a23e4fbf0
--- /dev/null
+++ b/java/res/xml-fr-rCH/kbd_qwerty.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwertz_rows" />
+</Keyboard>
diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml
index 9a2c75d8c..2d0b42baf 100644
--- a/java/res/xml-fr/kbd_qwerty.xml
+++ b/java/res/xml-fr/kbd_qwerty.xml
@@ -19,498 +19,16 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l" />
- <Key
- android:keyLabel="m"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_keyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="\'" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_azerty_rows" />
</Keyboard>
diff --git a/java/res/xml-fr/kbd_qwerty_black.xml b/java/res/xml-fr/kbd_qwerty_black.xml
deleted file mode 100644
index f11c4a0ba..000000000
--- a/java/res/xml-fr/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,458 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l" />
- <Key
- android:keyLabel="m"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_bkeyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="\'" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml-hu/kbd_qwerty.xml b/java/res/xml-hu/kbd_qwerty.xml
new file mode 100644
index 000000000..010bdb3f7
--- /dev/null
+++ b/java/res/xml-hu/kbd_qwerty.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwertz_rows" />
+</Keyboard>
diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml
index 5d8338ae8..98bfd7e0b 100644
--- a/java/res/xml-iw/kbd_qwerty.xml
+++ b/java/res/xml-iw/kbd_qwerty.xml
@@ -19,456 +19,94 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
+ <Spacer
+ latin:horizontalGap="5%p" />
<Key
- android:keyLabel="ק"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="ק"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="ר" />
+ latin:keyLabel="ר" />
<Key
- android:keyLabel="א" />
+ latin:keyLabel="א" />
<Key
- android:keyLabel="ט" />
+ latin:keyLabel="ט" />
<Key
- android:keyLabel="ו" />
+ latin:keyLabel="ו" />
<Key
- android:keyLabel="ן" />
+ latin:keyLabel="ן" />
<Key
- android:keyLabel="ם" />
+ latin:keyLabel="ם" />
<Key
- android:keyLabel="פ" />
+ latin:keyLabel="פ" />
+ <Spacer
+ latin:horizontalGap="1.25%p" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="13.75%p"
- android:isModifier="true"
- android:horizontalGap="1.25%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="13.75%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:keyLabel="ש"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="ש"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="ד" />
+ latin:keyLabel="ד" />
<Key
- android:keyLabel="ג" />
+ latin:keyLabel="ג" />
<Key
- android:keyLabel="כ" />
+ latin:keyLabel="כ" />
<Key
- android:keyLabel="ע" />
+ latin:keyLabel="ע" />
<Key
- android:keyLabel="י" />
+ latin:keyLabel="י" />
<Key
- android:keyLabel="ח" />
+ latin:keyLabel="ח" />
<Key
- android:keyLabel="ל" />
+ latin:keyLabel="ל" />
<Key
- android:keyLabel="ך" />
+ latin:keyLabel="ך" />
<Key
- android:keyLabel="ף"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="ף"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
+ <Spacer
+ latin:horizontalGap="5%p" />
<Key
- android:keyLabel="ז"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="ז"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="ס" />
+ latin:keyLabel="ס" />
<Key
- android:keyLabel="ב" />
+ latin:keyLabel="ב" />
<Key
- android:keyLabel="ה" />
+ latin:keyLabel="ה" />
<Key
- android:keyLabel="נ" />
+ latin:keyLabel="נ" />
<Key
- android:keyLabel="מ" />
+ latin:keyLabel="מ" />
<Key
- android:keyLabel="צ" />
+ latin:keyLabel="צ" />
<Key
- android:keyLabel="ת" />
+ latin:keyLabel="ת" />
<Key
- android:keyLabel="ץ"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="ץ"
+ latin:keyEdgeFlags="right" />
</Row>
+ <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
</Keyboard>
diff --git a/java/res/xml-iw/kbd_qwerty_black.xml b/java/res/xml-iw/kbd_qwerty_black.xml
deleted file mode 100644
index eee6dc158..000000000
--- a/java/res/xml-iw/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,416 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="ק"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ר" />
- <Key
- android:keyLabel="א" />
- <Key
- android:keyLabel="ט" />
- <Key
- android:keyLabel="ו" />
- <Key
- android:keyLabel="ן" />
- <Key
- android:keyLabel="ם" />
- <Key
- android:keyLabel="פ" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="13.75%p"
- android:horizontalGap="1.25%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="ש"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ד" />
- <Key
- android:keyLabel="ג" />
- <Key
- android:keyLabel="כ" />
- <Key
- android:keyLabel="ע" />
- <Key
- android:keyLabel="י" />
- <Key
- android:keyLabel="ח" />
- <Key
- android:keyLabel="ל" />
- <Key
- android:keyLabel="ך" />
- <Key
- android:keyLabel="ף"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="ז"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ס" />
- <Key
- android:keyLabel="ב" />
- <Key
- android:keyLabel="ה" />
- <Key
- android:keyLabel="נ" />
- <Key
- android:keyLabel="מ" />
- <Key
- android:keyLabel="צ" />
- <Key
- android:keyLabel="ת" />
- <Key
- android:keyLabel="ץ"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml
index 14071d770..441b7cb17 100644
--- a/java/res/xml-nb/kbd_qwerty.xml
+++ b/java/res/xml-nb/kbd_qwerty.xml
@@ -18,519 +18,16 @@
*/
-->
-<!--
- Norwegian Keyboard Layout
-
- Just a copy of the Swedish layout, with ä/æ and ö/ø switched.
--->
-
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p" />
- <Key
- android:keyLabel="å"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l" />
- <Key
- android:keyLabel="ø"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_oe" />
- <Key
- android:keyLabel="æ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_ae"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="10%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_keyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
</Keyboard>
diff --git a/java/res/xml-nb/kbd_qwerty_black.xml b/java/res/xml-nb/kbd_qwerty_black.xml
deleted file mode 100644
index d90313a0b..000000000
--- a/java/res/xml-nb/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,478 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!--
- Norwegian Keyboard Layout
-
- Just a copy of the Swedish layout, with ä/æ and ö/ø switched.
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p" />
- <Key
- android:keyLabel="å"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l" />
- <Key
- android:keyLabel="ø"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_oe" />
- <Key
- android:keyLabel="æ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_ae"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="10%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_bkeyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml
index c0b98bafa..0eb311501 100644
--- a/java/res/xml-ru/kbd_qwerty.xml
+++ b/java/res/xml-ru/kbd_qwerty.xml
@@ -19,496 +19,15 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="й"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="1"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ц"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="2" />
- <Key
- android:keyLabel="у"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="3" />
- <Key
- android:keyLabel="к"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="4" />
- <Key
- android:keyLabel="е"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_cyrillic_e" />
- <Key
- android:keyLabel="н"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="6" />
- <Key
- android:keyLabel="г"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="7" />
- <Key
- android:keyLabel="ш"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="8" />
- <Key
- android:keyLabel="щ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="9" />
- <Key
- android:keyLabel="з"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="0" />
- <Key
- android:keyLabel="х"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="ф"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ы" />
- <Key
- android:keyLabel="в" />
- <Key
- android:keyLabel="а" />
- <Key
- android:keyLabel="п" />
- <Key
- android:keyLabel="р" />
- <Key
- android:keyLabel="о" />
- <Key
- android:keyLabel="л" />
- <Key
- android:keyLabel="д" />
- <Key
- android:keyLabel="ж" />
- <Key
- android:keyLabel="э"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="8.5%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_keyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="11.75%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="я" />
- <Key
- android:keyLabel="ч" />
- <Key
- android:keyLabel="с" />
- <Key
- android:keyLabel="м" />
- <Key
- android:keyLabel="и" />
- <Key
- android:keyLabel="т" />
- <Key
- android:keyLabel="ь"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
- <Key
- android:keyLabel="б" />
- <Key
- android:keyLabel="ю" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="11.75%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_ru_rows" />
</Keyboard>
diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml
deleted file mode 100644
index 94a450cfa..000000000
--- a/java/res/xml-ru/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,456 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="й"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="1"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ц"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="2" />
- <Key
- android:keyLabel="у"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="3" />
- <Key
- android:keyLabel="к"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="4" />
- <Key
- android:keyLabel="е"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_cyrillic_e" />
- <Key
- android:keyLabel="н"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="6" />
- <Key
- android:keyLabel="г"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="7" />
- <Key
- android:keyLabel="ш"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="8" />
- <Key
- android:keyLabel="щ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="9" />
- <Key
- android:keyLabel="з"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="0" />
- <Key
- android:keyLabel="х"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="ф"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ы" />
- <Key
- android:keyLabel="в" />
- <Key
- android:keyLabel="а" />
- <Key
- android:keyLabel="п" />
- <Key
- android:keyLabel="р" />
- <Key
- android:keyLabel="о" />
- <Key
- android:keyLabel="л" />
- <Key
- android:keyLabel="д" />
- <Key
- android:keyLabel="ж" />
- <Key
- android:keyLabel="э"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="8.5%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_bkeyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="11.75%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="я" />
- <Key
- android:keyLabel="ч" />
- <Key
- android:keyLabel="с" />
- <Key
- android:keyLabel="м" />
- <Key
- android:keyLabel="и" />
- <Key
- android:keyLabel="т" />
- <Key
- android:keyLabel="ь"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
- <Key
- android:keyLabel="б" />
- <Key
- android:keyLabel="ю" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="11.75%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml
index 464c74f40..3995e4e27 100644
--- a/java/res/xml-sr/kbd_qwerty.xml
+++ b/java/res/xml-sr/kbd_qwerty.xml
@@ -18,490 +18,16 @@
*/
-->
-<!-- Serbian keyboard layout, based on the X11 layout for Serbian -->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="љ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="1"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="њ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="2" />
- <Key
- android:keyLabel="е"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="3" />
- <Key
- android:keyLabel="р"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="4" />
- <Key
- android:keyLabel="т"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="5" />
- <Key
- android:keyLabel="з"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="6" />
- <Key
- android:keyLabel="у"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="7" />
- <Key
- android:keyLabel="и"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="8" />
- <Key
- android:keyLabel="о"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="9" />
- <Key
- android:keyLabel="п"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="0" />
- <Key
- android:keyLabel="ш"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="а"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="с" />
- <Key
- android:keyLabel="д" />
- <Key
- android:keyLabel="ф" />
- <Key
- android:keyLabel="г" />
- <Key
- android:keyLabel="х" />
- <Key
- android:keyLabel="ј" />
- <Key
- android:keyLabel="к" />
- <Key
- android:keyLabel="л" />
- <Key
- android:keyLabel="ч" />
- <Key
- android:keyLabel="ћ" />
- <Key
- android:keyLabel="ђ"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="8.5%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_keyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="11.75%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ж" />
- <Key
- android:keyLabel="џ" />
- <Key
- android:keyLabel="ц" />
- <Key
- android:keyLabel="в" />
- <Key
- android:keyLabel="б" />
- <Key
- android:keyLabel="н" />
- <Key
- android:keyLabel="м" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="11.75%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_sr_rows" />
</Keyboard>
diff --git a/java/res/xml-sr/kbd_qwerty_black.xml b/java/res/xml-sr/kbd_qwerty_black.xml
deleted file mode 100644
index 2ffa240f5..000000000
--- a/java/res/xml-sr/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,449 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- Serbian keyboard layout, based on the X11 layout for Serbian -->
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="љ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="1"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="њ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="2" />
- <Key
- android:keyLabel="е"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="3" />
- <Key
- android:keyLabel="р"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="4" />
- <Key
- android:keyLabel="т"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="5" />
- <Key
- android:keyLabel="з"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="6" />
- <Key
- android:keyLabel="у"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="7" />
- <Key
- android:keyLabel="и"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="8" />
- <Key
- android:keyLabel="о"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="9" />
- <Key
- android:keyLabel="п"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="0" />
- <Key
- android:keyLabel="ш"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="а"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="с" />
- <Key
- android:keyLabel="д" />
- <Key
- android:keyLabel="ф" />
- <Key
- android:keyLabel="г" />
- <Key
- android:keyLabel="х" />
- <Key
- android:keyLabel="ј" />
- <Key
- android:keyLabel="к" />
- <Key
- android:keyLabel="л" />
- <Key
- android:keyLabel="ч" />
- <Key
- android:keyLabel="ћ" />
- <Key
- android:keyLabel="ђ"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="8.5%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_bkeyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="11.75%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ж" />
- <Key
- android:keyLabel="џ" />
- <Key
- android:keyLabel="ц" />
- <Key
- android:keyLabel="в" />
- <Key
- android:keyLabel="б" />
- <Key
- android:keyLabel="н" />
- <Key
- android:keyLabel="м" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="11.75%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml
index 0fc80a341..72bdc339e 100644
--- a/java/res/xml-sv/kbd_qwerty.xml
+++ b/java/res/xml-sv/kbd_qwerty.xml
@@ -18,520 +18,16 @@
*/
-->
-<!--
- Swedish Keyboard Layout
-
- Key positioning: Svensk standard SS 66 22 41
- Foreign letters: Svenska skrivregler (2:a uppl.) §302
- Local additions: ۧ
--->
-
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p" />
- <Key
- android:keyLabel="å"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l" />
- <Key
- android:keyLabel="ö"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o_umlaut" />
- <Key
- android:keyLabel="ä"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a_umlaut"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="10%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_keyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
</Keyboard>
diff --git a/java/res/xml-sv/kbd_qwerty_black.xml b/java/res/xml-sv/kbd_qwerty_black.xml
deleted file mode 100644
index d03fb773a..000000000
--- a/java/res/xml-sv/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,480 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!--
- Swedish Keyboard Layout
-
- Key positioning: Svensk standard SS 66 22 41
- Foreign letters: Svenska skrivregler (2:a uppl.) §302
- Local additions: ۧ
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.09%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p" />
- <Key
- android:keyLabel="å"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l" />
- <Key
- android:keyLabel="ö"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_o_umlaut" />
- <Key
- android:keyLabel="ä"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a_umlaut"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyWidth="10%p"
- >
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_bkeyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/popup_at.xml b/java/res/xml-xlarge-land/kbd_popup_template.xml
index 197eea445..3caae1a60 100644
--- a/java/res/xml/popup_at.xml
+++ b/java/res/xml-xlarge-land/kbd_popup_template.xml
@@ -18,22 +18,10 @@
*/
-->
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top|bottom"
+<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyWidth="3.5%p"
+ latin:horizontalGap="0px"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
>
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="\@"
- android:keyEdgeFlags="right" />
- </Row>
</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_azerty_rows.xml b/java/res/xml-xlarge/kbd_azerty_rows.xml
new file mode 100644
index 000000000..564f77629
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_azerty_rows.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a" />
+ <Key
+ latin:keyLabel="z"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="e"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.157%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="10.167%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k"
+ latin:popupCharacters="@string/alternates_for_k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyLabel="m"
+ latin:keyEdgeFlags="right" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="8.593%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="\'"
+ latin:manualTemporaryUpperCaseCode="58"
+ latin:keyHintIcon="@drawable/key_hint_colon_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
+ latin:popupCharacters=":" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:manualTemporaryUpperCaseCode="33"
+ latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+ latin:popupCharacters="!" />
+ <Key
+ latin:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="63"
+ latin:keyHintIcon="@drawable/key_hint_question_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+ latin:popupCharacters="\?" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_key_styles.xml b/java/res/xml-xlarge/kbd_key_styles.xml
new file mode 100644
index 000000000..d211e5e61
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_key_styles.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <!-- Functional key styles -->
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle"
+ latin:isModifier="true" />
+ <key-style
+ latin:styleName="shiftKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyIcon="@drawable/sym_keyboard_shift_holo"
+ latin:shiftedIcon="@drawable/sym_keyboard_shift_locked_holo"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="deleteKeyStyle"
+ latin:code="@integer/key_delete"
+ latin:keyIcon="@drawable/sym_keyboard_delete_holo"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isRepeatable="true" />
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_keyboard_return_holo"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="spaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ <key-style
+ latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ <key-style
+ latin:styleName="smileyKeyStyle"
+ latin:keyLabel=":-)"
+ latin:keyOutputText=":-) "
+ latin:keyHintIcon="@drawable/hint_popup_holo"
+ latin:popupCharacters="@string/alternates_for_smiley"
+ latin:maxPopupKeyboardColumn="5" />
+ <key-style
+ latin:styleName="settingsKeyStyle"
+ latin:code="@integer/key_settings"
+ latin:keyIcon="@drawable/sym_keyboard_settings_holo"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="micKeyStyle"
+ latin:code="@integer/key_voice"
+ latin:keyIcon="@drawable/sym_keyboard_voice_holo"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle" />
+ <key-style
+ latin:styleName="shiftKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyIcon="@drawable/sym_bkeyboard_shift"
+ latin:shiftedIcon="@drawable/sym_bkeyboard_shift_locked"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="deleteKeyStyle"
+ latin:code="@integer/key_delete"
+ latin:keyIcon="@drawable/sym_bkeyboard_delete"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isRepeatable="true" />
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_bkeyboard_return"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="spaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ <key-style
+ latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ <key-style
+ latin:styleName="smileyKeyStyle"
+ latin:keyLabel=":-)"
+ latin:keyOutputText=":-) "
+ latin:keyHintIcon="@drawable/hint_popup_holo"
+ latin:popupCharacters="@string/alternates_for_smiley"
+ latin:maxPopupKeyboardColumn="5" />
+ <key-style
+ latin:styleName="settingsKeyStyle"
+ latin:code="@integer/key_settings"
+ latin:keyIcon="@drawable/sym_bkeyboard_settings"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="micKeyStyle"
+ latin:code="@integer/key_voice"
+ latin:keyIcon="@drawable/sym_bkeyboard_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ </switch>
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyLabel="@string/label_tab_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="toAlphaKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_alpha_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="moreKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyLabel="@string/label_more_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="comKeyStyle"
+ latin:keyLabel="@string/keylabel_for_popular_domain"
+ latin:keyLabelOption="fontNormal"
+ latin:keyOutputText="@string/keylabel_for_popular_domain"
+ latin:keyHintIcon="@drawable/hint_popup_holo"
+ latin:popupCharacters="@string/alternates_for_popular_domain" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_number.xml b/java/res/xml-xlarge/kbd_number.xml
new file mode 100644
index 000000000..875548ba7
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_number.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="11.949%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyEdgeFlags="left" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="-"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel="+"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel="."
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="1" />
+ <Key
+ latin:keyLabel="2" />
+ <Key
+ latin:keyLabel="3" />
+ <Spacer
+ latin:horizontalGap="9.360%p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.804%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Spacer
+ latin:horizontalGap="16.406%p" />
+ <Key
+ latin:keyLabel="*"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel="/"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel=","
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="4" />
+ <Key
+ latin:keyLabel="5" />
+ <Key
+ latin:keyLabel="6" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="14.706%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <!-- There is an empty area bellow the "More" key and left of the "(" key. To ignore
+ the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="16.406%p" />
+ <Key
+ latin:keyLabel="("
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel=")"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel="="
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="7" />
+ <Key
+ latin:keyLabel="8" />
+ <Key
+ latin:keyLabel="9" />
+ <!-- There is an empty area bellow the "Enter" key and right of the "9" key. To ignore
+ the touch event on the area, "9" is intentionally not marked as a right edge key. -->
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore
+ the touch event on the area, "space" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="8.362%p" />
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyWidth="24.127%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="*" />
+ <Key
+ latin:keyLabel="0" />
+ <Key
+ latin:keyLabel="#" />
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyWidth="8.042%p" />
+ </case>
+ </switch>
+ <!-- There is an empty area bellow the "Enter" key and right of the "#" key. To ignore
+ the touch event on the area, "#" is intentionally not marked as a right edge key. -->
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_numkey_styles.xml b/java/res/xml-xlarge/kbd_numkey_styles.xml
new file mode 100644
index 000000000..e27db94c7
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_numkey_styles.xml
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="num0KeyStyle"
+ latin:code="48"
+ latin:keyIcon="@drawable/sym_keyboard_num0_holo" />
+ <key-style
+ latin:styleName="num1KeyStyle"
+ latin:code="49"
+ latin:keyIcon="@drawable/sym_keyboard_num1_holo" />
+ <key-style
+ latin:styleName="num2KeyStyle"
+ latin:code="50"
+ latin:keyIcon="@drawable/sym_keyboard_num2_holo" />
+ <key-style
+ latin:styleName="num3KeyStyle"
+ latin:code="51"
+ latin:keyIcon="@drawable/sym_keyboard_num3_holo" />
+ <key-style
+ latin:styleName="num4KeyStyle"
+ latin:code="52"
+ latin:keyIcon="@drawable/sym_keyboard_num4_holo" />
+ <key-style
+ latin:styleName="num5KeyStyle"
+ latin:code="53"
+ latin:keyIcon="@drawable/sym_keyboard_num5_holo" />
+ <key-style
+ latin:styleName="num6KeyStyle"
+ latin:code="54"
+ latin:keyIcon="@drawable/sym_keyboard_num6_holo" />
+ <key-style
+ latin:styleName="num7KeyStyle"
+ latin:code="55"
+ latin:keyIcon="@drawable/sym_keyboard_num7_holo" />
+ <key-style
+ latin:styleName="num8KeyStyle"
+ latin:code="56"
+ latin:keyIcon="@drawable/sym_keyboard_num8_holo" />
+ <key-style
+ latin:styleName="num9KeyStyle"
+ latin:code="57"
+ latin:keyIcon="@drawable/sym_keyboard_num9_holo" />
+ <key-style
+ latin:styleName="numStarKeyStyle"
+ latin:code="42"
+ latin:keyIcon="@drawable/sym_keyboard_numbstar_holo" />
+ <key-style
+ latin:styleName="numPoundKeyStyle"
+ latin:code="35"
+ latin:keyIcon="@drawable/sym_keyboard_numbpound_holo" />
+ <key-style
+ latin:styleName="numAltKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_keyboard_numalt"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="num0KeyStyle"
+ latin:code="48"
+ latin:keyIcon="@drawable/sym_bkeyboard_num0" />
+ <key-style
+ latin:styleName="num1KeyStyle"
+ latin:code="49"
+ latin:keyIcon="@drawable/sym_bkeyboard_num1" />
+ <key-style
+ latin:styleName="num2KeyStyle"
+ latin:code="50"
+ latin:keyIcon="@drawable/sym_bkeyboard_num2" />
+ <key-style
+ latin:styleName="num3KeyStyle"
+ latin:code="51"
+ latin:keyIcon="@drawable/sym_bkeyboard_num3" />
+ <key-style
+ latin:styleName="num4KeyStyle"
+ latin:code="52"
+ latin:keyIcon="@drawable/sym_bkeyboard_num4" />
+ <key-style
+ latin:styleName="num5KeyStyle"
+ latin:code="53"
+ latin:keyIcon="@drawable/sym_bkeyboard_num5" />
+ <key-style
+ latin:styleName="num6KeyStyle"
+ latin:code="54"
+ latin:keyIcon="@drawable/sym_bkeyboard_num6" />
+ <key-style
+ latin:styleName="num7KeyStyle"
+ latin:code="55"
+ latin:keyIcon="@drawable/sym_bkeyboard_num7" />
+ <key-style
+ latin:styleName="num8KeyStyle"
+ latin:code="56"
+ latin:keyIcon="@drawable/sym_bkeyboard_num8" />
+ <key-style
+ latin:styleName="num9KeyStyle"
+ latin:code="57"
+ latin:keyIcon="@drawable/sym_bkeyboard_num9" />
+ <key-style
+ latin:styleName="numStarKeyStyle"
+ latin:code="42"
+ latin:keyIcon="@drawable/sym_bkeyboard_numstar" />
+ <key-style
+ latin:styleName="numPoundKeyStyle"
+ latin:code="35"
+ latin:keyIcon="@drawable/sym_bkeyboard_numpound" />
+ <key-style
+ latin:styleName="numAltKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_bkeyboard_numalt"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ </switch>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_phone.xml b/java/res/xml-xlarge/kbd_phone.xml
new file mode 100644
index 000000000..b9444ad50
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_phone.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="11.949%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_numkey_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyEdgeFlags="left" />
+ <!-- To match one character label size with "Tab", I placed spaces around the char '-'
+ and '+'. -->
+ <Spacer
+ latin:horizontalGap="8.470%p" />
+ <Key
+ latin:code="45"
+ latin:keyLabel=" - "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="43"
+ latin:keyLabel=" + "
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="8.479%p" />
+ <Key
+ latin:keyStyle="num1KeyStyle" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Spacer
+ latin:horizontalGap="9.360%p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.804%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyEdgeFlags="left" />
+ <!-- To match one character label size with "More", I placed spaces around the char ','
+ and '.'. -->
+ <Spacer
+ latin:horizontalGap="8.470%p" />
+ <Key
+ latin:code="44"
+ latin:keyLabel=" , "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="46"
+ latin:keyLabel=" . "
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="8.479%p" />
+ <Key
+ latin:keyStyle="num4KeyStyle" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="14.706%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <!-- To match one character label size with "More", I placed spaces around the char '('
+ and ')'. -->
+ <!-- There is an empty area bellow the "More" key and left of the "(" key. To ignore
+ the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="20.427%p" />
+ <Key
+ latin:code="40"
+ latin:keyLabel=" ( "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="41"
+ latin:keyLabel=" ) "
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="8.479%p" />
+ <Key
+ latin:keyStyle="num7KeyStyle" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ <!-- There is an empty area bellow the "Enter" key and right of the "9" key. To ignore
+ the touch event on the area, "9" is intentionally not marked as a right edge key. -->
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore
+ the touch event on the area, "space" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="12.340%p" />
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyWidth="16.084%p" />
+ <Spacer
+ latin:horizontalGap="8.479%p" />
+ <Key
+ latin:keyStyle="numStarKeyStyle" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Key
+ latin:keyStyle="numPoundKeyStyle" />
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyWidth="8.042%p" />
+ </case>
+ </switch>
+ <!-- There is an empty area bellow the "Enter" key and right of the "#" key. To ignore
+ the touch event on the area, "#" is intentionally not marked as a right edge key. -->
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_phone_symbols.xml b/java/res/xml-xlarge/kbd_phone_symbols.xml
new file mode 100644
index 000000000..690bcde0c
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_phone_symbols.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="11.949%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_numkey_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyEdgeFlags="left" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:code="45"
+ latin:keyLabel=" - "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="43"
+ latin:keyLabel=" + "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="44"
+ latin:keyLabel="@string/label_pause_key"
+ latin:keyWidth="8.042%p" />
+ <!-- To match one character label size with "Tab" and "Pause, I placed spaces around the
+ char '-' and '+'. -->
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="num1KeyStyle" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Spacer
+ latin:horizontalGap="9.360%p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.804%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyEdgeFlags="left" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:code="44"
+ latin:keyLabel=" , "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="46"
+ latin:keyLabel=" . "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="59"
+ latin:keyLabel="@string/label_wait_key"
+ latin:keyWidth="8.042%p" />
+ <!-- To match one character label size with "More" and "Wait", I placed spaces around the
+ char ',' and '.'. -->
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="num4KeyStyle" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="14.706%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <!-- To match one character label size with "More" and etc., I placed spaces around the
+ char 'N', '(' and ')'. -->
+ <!-- There is an empty area bellow the "More" key and left of the "(" key. To ignore
+ the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="16.406%p" />
+ <Key
+ latin:code="40"
+ latin:keyLabel=" ( "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="41"
+ latin:keyLabel=" ) "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="78"
+ latin:keyLabel=" N "
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="num7KeyStyle" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ <!-- There is an empty area bellow the "Enter" key and right of the "9" key. To ignore
+ the touch event on the area, "9" is intentionally not marked as a right edge key. -->
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore
+ the touch event on the area, "space" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="8.362%p" />
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyWidth="24.127%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="numStarKeyStyle" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Key
+ latin:keyStyle="numPoundKeyStyle" />
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyWidth="8.042%p" />
+ </case>
+ </switch>
+ <!-- There is an empty area bellow the "Enter" key and right of the "#" key. To ignore
+ the touch event on the area, "#" is intentionally not marked as a right edge key. -->
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_popup_template.xml b/java/res/xml-xlarge/kbd_popup_template.xml
new file mode 100644
index 000000000..7d39d1a3a
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_popup_template.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyWidth="5.0%p"
+ latin:horizontalGap="0px"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
+ >
+</Keyboard>
diff --git a/java/res/values-zh-rTW/donottranslate-altchars.xml b/java/res/xml-xlarge/kbd_qwerty.xml
index c165b11c5..1c8d51ffe 100644
--- a/java/res/values-zh-rTW/donottranslate-altchars.xml
+++ b/java/res/xml-xlarge/kbd_qwerty.xml
@@ -17,14 +17,17 @@
** limitations under the License.
*/
-->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">èéêë</string>
- <string name="alternates_for_i">ìíîï</string>
- <string name="alternates_for_o">òóôõöœø</string>
- <string name="alternates_for_u">ùúûü</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ</string>
-</resources>
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_rows" />
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row1.xml b/java/res/xml-xlarge/kbd_qwerty_row1.xml
new file mode 100644
index 000000000..f5135591c
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_row1.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row2.xml b/java/res/xml-xlarge/kbd_qwerty_row2.xml
new file mode 100644
index 000000000..02bd0a6c9
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_row2.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="8.157%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.167%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k"
+ latin:popupCharacters="@string/alternates_for_k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="15.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row3.xml b/java/res/xml-xlarge/kbd_qwerty_row3.xml
new file mode 100644
index 000000000..b7e9bcff9
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_row3.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="z"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="m" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:manualTemporaryUpperCaseCode="33"
+ latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+ latin:popupCharacters="!" />
+ <Key
+ latin:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="63"
+ latin:keyHintIcon="@drawable/key_hint_question_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+ latin:popupCharacters="\?" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row4.xml b/java/res/xml-xlarge/kbd_qwerty_row4.xml
new file mode 100644
index 000000000..9d0fd81c7
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_row4.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Spacer
+ latin:horizontalGap="8.362%p" />
+ <Key
+ latin:keyStyle="settingsKeyStyle" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle" />
+ <Key
+ latin:keyLabel="\@" />
+ </case>
+ <!-- TODO: implement logical OR for <case> attribute -->
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle"
+ latin:keyWidth="16.084%p" />
+ </case>
+ <default>
+ <switch>
+ <case
+ latin:imeOptions="actionSearch"
+ >
+ <Key
+ latin:keyLabel=":"
+ latin:manualTemporaryUpperCaseCode="43"
+ latin:keyHintIcon="@drawable/key_hint_plus_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
+ latin:popupCharacters="+" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="smileyKeyStyle" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel="/"
+ latin:manualTemporaryUpperCaseCode="64"
+ latin:keyHintIcon="@drawable/key_hint_at_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo"
+ latin:popupCharacters="\@" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="37.454%p" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="-" />
+ </case>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyLabel="/"
+ latin:manualTemporaryUpperCaseCode="58"
+ latin:keyHintIcon="@drawable/key_hint_colon_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
+ latin:popupCharacters=":" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="\'"
+ latin:manualTemporaryUpperCaseCode="34"
+ latin:keyHintIcon="@drawable/key_hint_quote_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_quote_large_holo"
+ latin:popupCharacters="&quot;" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="_" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="-"
+ latin:manualTemporaryUpperCaseCode="95"
+ latin:keyHintIcon="@drawable/key_hint_underline_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+ latin:popupCharacters="_" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </case>
+ </switch>
+ </Row>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_rows.xml b/java/res/xml-xlarge/kbd_qwerty_rows.xml
new file mode 100644
index 000000000..6237712f6
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_rows.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row1" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
new file mode 100644
index 000000000..fb2034fb7
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyLabel="å" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k"
+ latin:popupCharacters="@string/alternates_for_k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_scandinavia_row2_10"
+ latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_scandinavia_row2_11"
+ latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwertz_rows.xml b/java/res/xml-xlarge/kbd_qwertz_rows.xml
new file mode 100644
index 000000000..3e99f0511
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwertz_rows.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="z"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="u"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="m" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:manualTemporaryUpperCaseCode="33"
+ latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+ latin:popupCharacters="!" />
+ <Key
+ latin:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="63"
+ latin:keyHintIcon="@drawable/key_hint_question_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+ latin:popupCharacters="\?" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_ru_rows.xml b/java/res/xml-xlarge/kbd_ru_rows.xml
new file mode 100644
index 000000000..008988a84
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_ru_rows.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="й"
+ latin:popupCharacters="1" />
+ <Key
+ latin:keyLabel="ц"
+ latin:popupCharacters="2" />
+ <Key
+ latin:keyLabel="у"
+ latin:popupCharacters="3" />
+ <Key
+ latin:keyLabel="к"
+ latin:popupCharacters="4" />
+ <Key
+ latin:keyLabel="е"
+ latin:popupCharacters="@string/alternates_for_cyrillic_e" />
+ <Key
+ latin:keyLabel="н"
+ latin:popupCharacters="6" />
+ <Key
+ latin:keyLabel="г"
+ latin:popupCharacters="7" />
+ <Key
+ latin:keyLabel="ш"
+ latin:popupCharacters="8" />
+ <Key
+ latin:keyLabel="щ"
+ latin:popupCharacters="9" />
+ <Key
+ latin:keyLabel="з"
+ latin:popupCharacters="0" />
+ <Key
+ latin:keyLabel="х" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="ф" />
+ <Key
+ latin:keyLabel="ы" />
+ <Key
+ latin:keyLabel="в" />
+ <Key
+ latin:keyLabel="а" />
+ <Key
+ latin:keyLabel="п" />
+ <Key
+ latin:keyLabel="р" />
+ <Key
+ latin:keyLabel="о" />
+ <Key
+ latin:keyLabel="л" />
+ <Key
+ latin:keyLabel="д" />
+ <Key
+ latin:keyLabel="ж" />
+ <Key
+ latin:keyLabel="э" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="я" />
+ <Key
+ latin:keyLabel="ч" />
+ <Key
+ latin:keyLabel="с" />
+ <Key
+ latin:keyLabel="м" />
+ <Key
+ latin:keyLabel="и" />
+ <Key
+ latin:keyLabel="т" />
+ <Key
+ latin:keyLabel="ь"
+ latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
+ <Key
+ latin:keyLabel="б" />
+ <Key
+ latin:keyLabel="ю" />
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_sr_rows.xml b/java/res/xml-xlarge/kbd_sr_rows.xml
new file mode 100644
index 000000000..ce9e20817
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_sr_rows.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="љ"
+ latin:popupCharacters="1" />
+ <Key
+ latin:keyLabel="њ"
+ latin:popupCharacters="2" />
+ <Key
+ latin:keyLabel="е"
+ latin:popupCharacters="3" />
+ <Key
+ latin:keyLabel="р"
+ latin:popupCharacters="4" />
+ <Key
+ latin:keyLabel="т"
+ latin:popupCharacters="5" />
+ <Key
+ latin:keyLabel="з"
+ latin:popupCharacters="6" />
+ <Key
+ latin:keyLabel="у"
+ latin:popupCharacters="7" />
+ <Key
+ latin:keyLabel="и"
+ latin:popupCharacters="8" />
+ <Key
+ latin:keyLabel="о"
+ latin:popupCharacters="9" />
+ <Key
+ latin:keyLabel="п"
+ latin:popupCharacters="0" />
+ <Key
+ latin:keyLabel="ш" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="а" />
+ <Key
+ latin:keyLabel="с" />
+ <Key
+ latin:keyLabel="д" />
+ <Key
+ latin:keyLabel="ф" />
+ <Key
+ latin:keyLabel="г" />
+ <Key
+ latin:keyLabel="х" />
+ <Key
+ latin:keyLabel="ј" />
+ <Key
+ latin:keyLabel="к" />
+ <Key
+ latin:keyLabel="л" />
+ <Key
+ latin:keyLabel="ч" />
+ <Key
+ latin:keyLabel="ћ" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.400%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="ђ" />
+ <Key
+ latin:keyLabel="ж" />
+ <Key
+ latin:keyLabel="џ" />
+ <Key
+ latin:keyLabel="ц" />
+ <Key
+ latin:keyLabel="в" />
+ <Key
+ latin:keyLabel="б" />
+ <Key
+ latin:keyLabel="н" />
+ <Key
+ latin:keyLabel="м" />
+ <Key
+ latin:keyLabel=","
+ latin:manualTemporaryUpperCaseCode="33"
+ latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+ latin:popupCharacters="!" />
+ <Key
+ latin:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="63"
+ latin:keyHintIcon="@drawable/key_hint_question_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+ latin:popupCharacters="\?" />
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.400%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml
new file mode 100644
index 000000000..e56cc92d2
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_symbols.xml
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="1"
+ latin:popupCharacters="¹,½,⅓,¼,⅛" />
+ <Key
+ latin:keyLabel="2"
+ latin:popupCharacters="²,⅔" />
+ <Key
+ latin:keyLabel="3"
+ latin:popupCharacters="³,¾,⅜" />
+ <Key
+ latin:keyLabel="4"
+ latin:popupCharacters="⁴" />
+ <Key
+ latin:keyLabel="5"
+ latin:popupCharacters="⅝" />
+ <Key
+ latin:keyLabel="6" />
+ <Key
+ latin:keyLabel="7"
+ latin:popupCharacters="⅞" />
+ <Key
+ latin:keyLabel="8" />
+ <Key
+ latin:keyLabel="9" />
+ <Key
+ latin:keyLabel="0"
+ latin:popupCharacters="ⁿ,∅" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.157%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.167%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="#" />
+ <Key
+ latin:keyLabel="$"
+ latin:popupCharacters="¢,£,€,¥,₣,₤,₱" />
+ <Key
+ latin:keyLabel="%"
+ latin:popupCharacters="‰" />
+ <Key
+ latin:keyLabel="&amp;" />
+ <Key
+ latin:keyLabel="*"
+ latin:popupCharacters="†,‡,★" />
+ <Key
+ latin:keyLabel="-"
+ latin:popupCharacters="_,–,—" />
+ <Key
+ latin:keyLabel="+"
+ latin:popupCharacters="±" />
+ <Key
+ latin:keyLabel="("
+ latin:popupCharacters="[,{,&lt;" />
+ <Key
+ latin:keyLabel=")"
+ latin:popupCharacters="],},&gt;" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="15.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="&lt;"
+ latin:popupCharacters="≤,«,‹" />
+ <Key
+ latin:keyLabel="&gt;"
+ latin:popupCharacters="≥,»,›" />
+ <Key
+ latin:keyLabel="="
+ latin:popupCharacters="≠,≈" />
+ <Key
+ latin:keyLabel=":" />
+ <Key
+ latin:keyLabel=";" />
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ <Key
+ latin:keyLabel="!"
+ latin:popupCharacters="¡" />
+ <Key
+ latin:keyLabel="\?"
+ latin:popupCharacters="¿" />
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Spacer
+ latin:horizontalGap="8.362%p" />
+ <Key
+ latin:keyStyle="settingsKeyStyle" />
+ <Key
+ latin:keyLabel="/" />
+ <Key
+ latin:keyLabel="\@" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="37.454%p" />
+ <Key
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»,˝" />
+ <Key
+ latin:keyLabel="_" />
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </case>
+ </switch>
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml
new file mode 100644
index 000000000..f7cf24a3f
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_symbols_shift.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="~" />
+ <Key
+ latin:keyLabel="`" />
+ <Key
+ latin:keyLabel="|" />
+ <Key
+ latin:keyLabel="•"
+ latin:popupCharacters="♪,♥,♠,♦,♣" />
+ <Key
+ latin:keyLabel="√" />
+ <Key
+ latin:keyLabel="π"
+ latin:popupCharacters="Π" />
+ <Key
+ latin:keyLabel="÷" />
+ <Key
+ latin:keyLabel="×" />
+ <Key
+ latin:keyLabel="§"
+ latin:popupCharacters="¶" />
+ <Key
+ latin:keyLabel="Δ" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.157%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.167%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="£" />
+ <Key
+ latin:keyLabel="¢" />
+ <Key
+ latin:keyLabel="€" />
+ <Key
+ latin:keyLabel="¥" />
+ <Key
+ latin:keyLabel="^"
+ latin:popupCharacters="↑,↓,←,→" />
+ <Key
+ latin:keyLabel="°" />
+ <Key
+ latin:keyLabel="±"
+ latin:popupCharacters="∞" />
+ <Key
+ latin:keyLabel="{" />
+ <Key
+ latin:keyLabel="}" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="15.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="\\" />
+ <Key
+ latin:keyLabel="©" />
+ <Key
+ latin:keyLabel="®" />
+ <Key
+ latin:keyLabel="™" />
+ <Key
+ latin:keyLabel="℅" />
+ <Key
+ latin:keyLabel="[" />
+ <Key
+ latin:keyLabel="]" />
+ <Key
+ latin:keyLabel="¡" />
+ <Key
+ latin:keyLabel="¿" />
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Spacer
+ latin:horizontalGap="24.446%p" />
+ <Key
+ latin:keyStyle="settingsKeyStyle" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="37.454%p" />
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </case>
+ </switch>
+ </Row>
+</Keyboard>
diff --git a/java/res/xml/kbd_azerty_rows.xml b/java/res/xml/kbd_azerty_rows.xml
new file mode 100644
index 000000000..9eeb22ecb
--- /dev/null
+++ b/java/res/xml/kbd_azerty_rows.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="10%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="a"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="@string/alternates_for_a"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="z"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="@string/alternates_for_p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k"
+ latin:popupCharacters="@string/alternates_for_k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyLabel="m"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="\'" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
new file mode 100644
index 000000000..3b35f3560
--- /dev/null
+++ b/java/res/xml/kbd_key_styles.xml
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <!-- Functional key styles -->
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle"
+ latin:isModifier="true" />
+ <key-style
+ latin:styleName="shiftKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyIcon="@drawable/sym_keyboard_shift"
+ latin:shiftedIcon="@drawable/sym_keyboard_shift_locked"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="deleteKeyStyle"
+ latin:code="@integer/key_delete"
+ latin:keyIcon="@drawable/sym_keyboard_delete"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isRepeatable="true" />
+ <switch>
+ <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+ symbol keyboard will have mic key. That means we should use "?123mic" key
+ here. -->
+ <case
+ latin:voiceKeyEnabled="true"
+ latin:hasVoiceKey="false"
+ >
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_keyboard_123_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <default>
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </default>
+ </switch>
+ <key-style
+ latin:styleName="settingsKeyStyle"
+ latin:code="@integer/key_settings"
+ latin:keyIcon="@drawable/sym_keyboard_settings"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="spaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_keyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_keyboard_tab"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="micKeyStyle"
+ latin:code="@integer/key_voice"
+ latin:keyIcon="@drawable/sym_keyboard_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ <!-- Note: This key style is not for functional tab key. This is used for the tab key
+ which is laid out as normal letter key. -->
+ <key-style
+ latin:styleName="nonSpecialBackgroundTabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_keyboard_tab"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_tab" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle" />
+ <key-style
+ latin:styleName="shiftKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyIcon="@drawable/sym_bkeyboard_shift"
+ latin:shiftedIcon="@drawable/sym_bkeyboard_shift_locked"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="deleteKeyStyle"
+ latin:code="@integer/key_delete"
+ latin:keyIcon="@drawable/sym_bkeyboard_delete"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isRepeatable="true" />
+ <switch>
+ <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+ symbol keyboard will have mic key. That means we should use "?123mic" key
+ here. -->
+ <case
+ latin:voiceKeyEnabled="true"
+ latin:hasVoiceKey="false"
+ >
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <default>
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </default>
+ </switch>
+ <key-style
+ latin:styleName="settingsKeyStyle"
+ latin:code="@integer/key_settings"
+ latin:keyIcon="@drawable/sym_bkeyboard_settings"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="spaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_bkeyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_bkeyboard_tab"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="micKeyStyle"
+ latin:code="@integer/key_voice"
+ latin:keyIcon="@drawable/sym_bkeyboard_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ <!-- Note: This key style is not for functional tab key. This is used for the tab key
+ which is laid out as normal letter key. -->
+ <key-style
+ latin:styleName="nonSpecialBackgroundTabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_bkeyboard_tab"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_tab" />
+ </case>
+ </switch>
+ <!-- Return key style -->
+ <switch>
+ <case
+ latin:imeOptions="actionGo"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_go_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeOptions="actionNext"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_next_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeOptions="actionDone"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_done_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeOptions="actionSend"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_send_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeOptions="actionSearch"
+ >
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_keyboard_search"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_search"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_bkeyboard_search"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_search"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ </switch>
+ </case>
+ <default>
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_keyboard_return"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_bkeyboard_return"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ </switch>
+ </default>
+ </switch>
+ <key-style
+ latin:styleName="toAlphaKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_alpha_key"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="altKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyLabel="@string/label_alt_key"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="smileyKeyStyle"
+ latin:keyLabel=":-)"
+ latin:keyOutputText=":-) "
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_smiley"
+ latin:maxPopupKeyboardColumn="5"
+ latin:parentStyle="functionalKeyStyle" />
+</merge> \ No newline at end of file
diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml
new file mode 100644
index 000000000..f4fe8401a
--- /dev/null
+++ b/java/res/xml/kbd_number.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="26.67%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_keyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_bkeyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ </switch>
+ <Row
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="1"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="2" />
+ <Key
+ latin:keyLabel="3" />
+ <Key
+ latin:keyLabel="-"
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyLabel="4"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="5" />
+ <Key
+ latin:keyLabel="6" />
+ <Key
+ latin:keyLabel=","
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyLabel="7"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="8" />
+ <Key
+ latin:keyLabel="9" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:rowEdgeFlags="bottom"
+ >
+ <Key
+ latin:keyStyle="numSpaceKeyStyle"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="0" />
+ <Key
+ latin:keyLabel="." />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</Keyboard>
diff --git a/java/res/xml/kbd_numkey_styles.xml b/java/res/xml/kbd_numkey_styles.xml
new file mode 100644
index 000000000..2f9ae325a
--- /dev/null
+++ b/java/res/xml/kbd_numkey_styles.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="num0KeyStyle"
+ latin:code="48"
+ latin:keyIcon="@drawable/sym_keyboard_num0" />
+ <key-style
+ latin:styleName="num1KeyStyle"
+ latin:code="49"
+ latin:keyIcon="@drawable/sym_keyboard_num1" />
+ <key-style
+ latin:styleName="num2KeyStyle"
+ latin:code="50"
+ latin:keyIcon="@drawable/sym_keyboard_num2" />
+ <key-style
+ latin:styleName="num3KeyStyle"
+ latin:code="51"
+ latin:keyIcon="@drawable/sym_keyboard_num3" />
+ <key-style
+ latin:styleName="num4KeyStyle"
+ latin:code="52"
+ latin:keyIcon="@drawable/sym_keyboard_num4" />
+ <key-style
+ latin:styleName="num5KeyStyle"
+ latin:code="53"
+ latin:keyIcon="@drawable/sym_keyboard_num5" />
+ <key-style
+ latin:styleName="num6KeyStyle"
+ latin:code="54"
+ latin:keyIcon="@drawable/sym_keyboard_num6" />
+ <key-style
+ latin:styleName="num7KeyStyle"
+ latin:code="55"
+ latin:keyIcon="@drawable/sym_keyboard_num7" />
+ <key-style
+ latin:styleName="num8KeyStyle"
+ latin:code="56"
+ latin:keyIcon="@drawable/sym_keyboard_num8" />
+ <key-style
+ latin:styleName="num9KeyStyle"
+ latin:code="57"
+ latin:keyIcon="@drawable/sym_keyboard_num9" />
+ <key-style
+ latin:styleName="numStarKeyStyle"
+ latin:code="42"
+ latin:keyIcon="@drawable/sym_keyboard_numstar" />
+ <key-style
+ latin:styleName="numPoundKeyStyle"
+ latin:code="35"
+ latin:keyIcon="@drawable/sym_keyboard_numpound" />
+ <key-style
+ latin:styleName="numAltKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_keyboard_numalt"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_keyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="num0KeyStyle"
+ latin:code="48"
+ latin:keyIcon="@drawable/sym_bkeyboard_num0" />
+ <key-style
+ latin:styleName="num1KeyStyle"
+ latin:code="49"
+ latin:keyIcon="@drawable/sym_bkeyboard_num1" />
+ <key-style
+ latin:styleName="num2KeyStyle"
+ latin:code="50"
+ latin:keyIcon="@drawable/sym_bkeyboard_num2" />
+ <key-style
+ latin:styleName="num3KeyStyle"
+ latin:code="51"
+ latin:keyIcon="@drawable/sym_bkeyboard_num3" />
+ <key-style
+ latin:styleName="num4KeyStyle"
+ latin:code="52"
+ latin:keyIcon="@drawable/sym_bkeyboard_num4" />
+ <key-style
+ latin:styleName="num5KeyStyle"
+ latin:code="53"
+ latin:keyIcon="@drawable/sym_bkeyboard_num5" />
+ <key-style
+ latin:styleName="num6KeyStyle"
+ latin:code="54"
+ latin:keyIcon="@drawable/sym_bkeyboard_num6" />
+ <key-style
+ latin:styleName="num7KeyStyle"
+ latin:code="55"
+ latin:keyIcon="@drawable/sym_bkeyboard_num7" />
+ <key-style
+ latin:styleName="num8KeyStyle"
+ latin:code="56"
+ latin:keyIcon="@drawable/sym_bkeyboard_num8" />
+ <key-style
+ latin:styleName="num9KeyStyle"
+ latin:code="57"
+ latin:keyIcon="@drawable/sym_bkeyboard_num9" />
+ <key-style
+ latin:styleName="numStarKeyStyle"
+ latin:code="42"
+ latin:keyIcon="@drawable/sym_bkeyboard_numstar" />
+ <key-style
+ latin:styleName="numPoundKeyStyle"
+ latin:code="35"
+ latin:keyIcon="@drawable/sym_bkeyboard_numpound" />
+ <key-style
+ latin:styleName="numAltKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_bkeyboard_numalt"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_bkeyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
index 10774c666..62fbdeeec 100644
--- a/java/res/xml/kbd_phone.xml
+++ b/java/res/xml/kbd_phone.xml
@@ -19,88 +19,76 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="26.67%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="26.67%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_numkey_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
<Key
- android:codes="49"
- android:keyIcon="@drawable/sym_keyboard_num1"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="num1KeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:codes="50"
- android:keyIcon="@drawable/sym_keyboard_num2" />
+ latin:keyStyle="num2KeyStyle" />
<Key
- android:codes="51"
- android:keyIcon="@drawable/sym_keyboard_num3" />
+ latin:keyStyle="num3KeyStyle" />
<Key
- android:keyLabel="-"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="-"
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="52"
- android:keyIcon="@drawable/sym_keyboard_num4"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="num4KeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:codes="53"
- android:keyIcon="@drawable/sym_keyboard_num5" />
+ latin:keyStyle="num5KeyStyle" />
<Key
- android:codes="54"
- android:keyIcon="@drawable/sym_keyboard_num6" />
+ latin:keyStyle="num6KeyStyle" />
<Key
- android:keyLabel="."
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="."
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="55"
- android:keyIcon="@drawable/sym_keyboard_num7"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="num7KeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:codes="56"
- android:keyIcon="@drawable/sym_keyboard_num8" />
+ latin:keyStyle="num8KeyStyle" />
<Key
- android:codes="57"
- android:keyIcon="@drawable/sym_keyboard_num9" />
+ latin:keyStyle="num9KeyStyle" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row
- android:rowEdgeFlags="bottom"
+ latin:rowEdgeFlags="bottom"
>
<Key
- android:codes="@integer/key_symbol"
- android:keyIcon="@drawable/sym_keyboard_numalt"
- android:iconPreview="@drawable/sym_keyboard_feedback_numalt"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="numAltKeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:codes="48"
- android:keyIcon="@drawable/sym_keyboard_num0" />
+ latin:keyStyle="num0KeyStyle" />
<Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ latin:keyStyle="numSpaceKeyStyle" />
<Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
</Keyboard>
diff --git a/java/res/xml/kbd_phone_black.xml b/java/res/xml/kbd_phone_black.xml
deleted file mode 100644
index 5afa9a194..000000000
--- a/java/res/xml/kbd_phone_black.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="26.67%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:codes="49"
- android:keyIcon="@drawable/sym_bkeyboard_num1"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="50"
- android:keyIcon="@drawable/sym_bkeyboard_num2" />
- <Key
- android:codes="51"
- android:keyIcon="@drawable/sym_bkeyboard_num3" />
- <Key
- android:keyLabel="-"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="52"
- android:keyIcon="@drawable/sym_bkeyboard_num4"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="53"
- android:keyIcon="@drawable/sym_bkeyboard_num5" />
- <Key
- android:codes="54"
- android:keyIcon="@drawable/sym_bkeyboard_num6" />
- <Key
- android:keyLabel="."
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="55"
- android:keyIcon="@drawable/sym_bkeyboard_num7"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="56"
- android:keyIcon="@drawable/sym_bkeyboard_num8" />
- <Key
- android:codes="57"
- android:keyIcon="@drawable/sym_bkeyboard_num9" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="20%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyIcon="@drawable/sym_bkeyboard_numalt"
- android:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
- <Key
- android:codes="48"
- android:keyIcon="@drawable/sym_bkeyboard_num0" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml
index 4c928a8d8..67cd330e7 100644
--- a/java/res/xml/kbd_phone_symbols.xml
+++ b/java/res/xml/kbd_phone_symbols.xml
@@ -19,84 +19,82 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="26.67%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="26.67%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_numkey_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
<Key
- android:keyLabel="("
- android:keyEdgeFlags="left" />
+ latin:keyLabel="("
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="/" />
+ latin:keyLabel="/" />
<Key
- android:keyLabel=")" />
+ latin:keyLabel=")" />
<Key
- android:keyLabel="-"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="-"
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:keyLabel="N"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="N"
+ latin:keyEdgeFlags="left" />
<!-- Pause is a comma. Check PhoneNumberUtils.java to see if this
has changed. -->
<Key
- android:codes="44"
- android:keyLabel="Pause" />
+ latin:code="44"
+ latin:keyLabel="Pause" />
<Key
- android:keyLabel="," />
+ latin:keyLabel="," />
<Key
- android:keyLabel="."
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="."
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="42"
- android:keyIcon="@drawable/sym_keyboard_numstar"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="numStarKeyStyle"
+ latin:keyEdgeFlags="left" />
<!-- Wait is a semicolon. -->
<Key
- android:codes="59"
- android:keyLabel="Wait" />
+ latin:code="59"
+ latin:keyLabel="Wait" />
<Key
- android:codes="35"
- android:keyIcon="@drawable/sym_keyboard_numpound" />
+ latin:keyStyle="numPoundKeyStyle" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row
- android:rowEdgeFlags="bottom"
+ latin:rowEdgeFlags="bottom"
>
<Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_phone_key"
- android:keyEdgeFlags="left" />
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_numeric_key"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="+" />
+ latin:keyLabel="+" />
<Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ latin:keyStyle="numSpaceKeyStyle" />
<Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
</Keyboard>
diff --git a/java/res/xml/kbd_phone_symbols_black.xml b/java/res/xml/kbd_phone_symbols_black.xml
deleted file mode 100644
index 4d686e145..000000000
--- a/java/res/xml/kbd_phone_symbols_black.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="26.67%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="("
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="/" />
- <Key
- android:keyLabel=")" />
- <Key
- android:keyLabel="-"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="N"
- android:keyEdgeFlags="left" />
- <!-- Pause is a comma. Check PhoneNumberUtils.java to see if this
- has changed. -->
- <Key
- android:codes="44"
- android:keyLabel="Pause" />
- <Key
- android:keyLabel="," />
- <Key
- android:keyLabel="."
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="42"
- android:keyIcon="@drawable/sym_bkeyboard_numstar"
- android:keyEdgeFlags="left" />
- <!-- Wait is a semicolon. -->
- <Key
- android:codes="59"
- android:keyLabel="Wait" />
- <Key
- android:codes="35"
- android:keyIcon="@drawable/sym_bkeyboard_numpound" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="20%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_phone_key"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="+" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_popup_narrow_template.xml b/java/res/xml/kbd_popup_narrow_template.xml
index 23c686e8b..36caf1c15 100644
--- a/java/res/xml/kbd_popup_narrow_template.xml
+++ b/java/res/xml/kbd_popup_narrow_template.xml
@@ -18,10 +18,10 @@
*/
-->
-<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.45%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
+<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyWidth="9.45%p"
+ latin:horizontalGap="0px"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
>
</Keyboard>
diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml
index a287be1fd..9ee27493d 100644
--- a/java/res/xml/kbd_popup_template.xml
+++ b/java/res/xml/kbd_popup_template.xml
@@ -18,10 +18,10 @@
*/
-->
-<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
+<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
>
</Keyboard>
diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml
index a4ab0f8fe..92d92f0e6 100644
--- a/java/res/xml/kbd_qwerty.xml
+++ b/java/res/xml/kbd_qwerty.xml
@@ -19,487 +19,16 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_narrow_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_keyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_rows" />
</Keyboard>
diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml
deleted file mode 100644
index 787e4ef7c..000000000
--- a/java/res/xml/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,447 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_narrow_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_bkeyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_qwerty_black_symbol.xml b/java/res/xml/kbd_qwerty_black_symbol.xml
new file mode 100644
index 000000000..6e45c12bf
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_black_symbol.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:hasSettingsKey="false"
+ >
+ <switch>
+ <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+ symbol keyboard will have mic key. That means we should use "?123mic" key here.
+ -->
+ <case
+ latin:voiceKeyEnabled="true"
+ latin:hasVoiceKey="false"
+ >
+ <Key
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+ latin:keyWidth="20%p"
+ latin:isModifier="true"
+ latin:keyEdgeFlags="left" />
+ </case>
+ <default>
+ <Key
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:keyWidth="20%p"
+ latin:isModifier="true"
+ latin:keyEdgeFlags="left" />
+ </default>
+ </switch>
+ </case>
+ <case
+ latin:hasSettingsKey="true"
+ >
+ <switch>
+ <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+ symbol keyboard will have mic key. That means we should use "?123mic" key here.
+ -->
+ <case
+ latin:voiceKeyEnabled="true"
+ latin:hasVoiceKey="false"
+ >
+ <Key
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+ latin:keyWidth="15%p"
+ latin:isModifier="true"
+ latin:keyEdgeFlags="left" />
+ </case>
+ <default>
+ <Key
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:keyWidth="15%p"
+ latin:isModifier="true"
+ latin:keyEdgeFlags="left" />
+ </default>
+ </switch>
+ </case>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_f1.xml b/java/res/xml/kbd_qwerty_f1.xml
new file mode 100644
index 000000000..cbdb8c09a
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_f1.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyLabel="/"
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_settings_slash"
+ latin:isModifier="true" />
+ </case>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="\@"
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_settings_at"
+ latin:isModifier="true" />
+ </case>
+ <default>
+ <switch>
+ <case
+ latin:hasVoiceKey="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </case>
+ <case
+ latin:hasVoiceKey="false"
+ >
+ <Key
+ latin:keyLabel=","
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_settings_comma"
+ latin:isModifier="true" />
+ </case>
+ </switch>
+ </default>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_row1.xml b/java/res/xml/kbd_qwerty_row1.xml
new file mode 100644
index 000000000..d9249657e
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row1.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="10%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="@string/alternates_for_p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_row2.xml b/java/res/xml/kbd_qwerty_row2.xml
new file mode 100644
index 000000000..9ed4553c4
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row2.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Spacer
+ latin:horizontalGap="5%p" />
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k"
+ latin:popupCharacters="@string/alternates_for_k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_row3.xml b/java/res/xml/kbd_qwerty_row3.xml
new file mode 100644
index 000000000..26608fd71
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row3.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="z"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="m" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml
new file mode 100644
index 000000000..0db011672
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="10%p"
+ latin:rowEdgeFlags="bottom"
+ >
+ <switch>
+ <case
+ latin:hasSettingsKey="false"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="left" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f1" />
+ <switch>
+ <case
+ latin:mode="web"
+ >
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="20%p" />
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyWidth="20%p" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="40%p" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel="."
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ <case
+ latin:hasSettingsKey="true"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="settingsKeyStyle" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f1" />
+ <switch>
+ <case
+ latin:mode="web"
+ >
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="30%p" />
+ <Key
+ latin:keyStyle="tabKeyStyle" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="30%p" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel="."
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <case
+ latin:mode="web"
+ >
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ </switch>
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_rows.xml b/java/res/xml/kbd_qwerty_rows.xml
new file mode 100644
index 000000000..6237712f6
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_rows.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row1" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_qwerty_rows_scandinavia.xml b/java/res/xml/kbd_qwerty_rows_scandinavia.xml
new file mode 100644
index 000000000..1aae5a0a8
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_rows_scandinavia.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="9.09%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyLabel="å"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="9.09%p"
+ >
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k"
+ latin:popupCharacters="@string/alternates_for_k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_scandinavia_row2_10"
+ latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_scandinavia_row2_11"
+ latin:popupCharacters="@string/alternates_for_scandinavia_row2_11"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_qwertz_rows.xml b/java/res/xml/kbd_qwertz_rows.xml
new file mode 100644
index 000000000..375f12335
--- /dev/null
+++ b/java/res/xml/kbd_qwertz_rows.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="10%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="z"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="@string/alternates_for_p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="m" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_ru_rows.xml b/java/res/xml/kbd_ru_rows.xml
new file mode 100644
index 000000000..fa2af3be0
--- /dev/null
+++ b/java/res/xml/kbd_ru_rows.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="9.091%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="й"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="1"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="ц"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="2" />
+ <Key
+ latin:keyLabel="у"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="3" />
+ <Key
+ latin:keyLabel="к"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="4" />
+ <Key
+ latin:keyLabel="е"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_cyrillic_e" />
+ <Key
+ latin:keyLabel="н"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="6" />
+ <Key
+ latin:keyLabel="г"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="7" />
+ <Key
+ latin:keyLabel="ш"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="8" />
+ <Key
+ latin:keyLabel="щ"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="9" />
+ <Key
+ latin:keyLabel="з"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="0" />
+ <Key
+ latin:keyLabel="х"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="9.091%p"
+ >
+ <Key
+ latin:keyLabel="ф"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="ы" />
+ <Key
+ latin:keyLabel="в" />
+ <Key
+ latin:keyLabel="а" />
+ <Key
+ latin:keyLabel="п" />
+ <Key
+ latin:keyLabel="р" />
+ <Key
+ latin:keyLabel="о" />
+ <Key
+ latin:keyLabel="л" />
+ <Key
+ latin:keyLabel="д" />
+ <Key
+ latin:keyLabel="ж" />
+ <Key
+ latin:keyLabel="э"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.5%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="11.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="я" />
+ <Key
+ latin:keyLabel="ч" />
+ <Key
+ latin:keyLabel="с" />
+ <Key
+ latin:keyLabel="м" />
+ <Key
+ latin:keyLabel="и" />
+ <Key
+ latin:keyLabel="т" />
+ <Key
+ latin:keyLabel="ь"
+ latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
+ <Key
+ latin:keyLabel="б" />
+ <Key
+ latin:keyLabel="ю" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="11.75%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_sr_rows.xml b/java/res/xml/kbd_sr_rows.xml
new file mode 100644
index 000000000..4a5ed1195
--- /dev/null
+++ b/java/res/xml/kbd_sr_rows.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="9.09%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="љ"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="1"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="њ"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="2" />
+ <Key
+ latin:keyLabel="е"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="3" />
+ <Key
+ latin:keyLabel="р"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="4" />
+ <Key
+ latin:keyLabel="т"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="5" />
+ <Key
+ latin:keyLabel="з"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="6" />
+ <Key
+ latin:keyLabel="у"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="7" />
+ <Key
+ latin:keyLabel="и"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="8" />
+ <Key
+ latin:keyLabel="о"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="9" />
+ <Key
+ latin:keyLabel="п"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="0" />
+ <Key
+ latin:keyLabel="ш"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.333%p"
+ >
+ <Key
+ latin:keyLabel="а"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="с" />
+ <Key
+ latin:keyLabel="д" />
+ <Key
+ latin:keyLabel="ф" />
+ <Key
+ latin:keyLabel="г" />
+ <Key
+ latin:keyLabel="х" />
+ <Key
+ latin:keyLabel="ј" />
+ <Key
+ latin:keyLabel="к" />
+ <Key
+ latin:keyLabel="л" />
+ <Key
+ latin:keyLabel="ч" />
+ <Key
+ latin:keyLabel="ћ" />
+ <Key
+ latin:keyLabel="ђ"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.5%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="11.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="ж" />
+ <Key
+ latin:keyLabel="џ" />
+ <Key
+ latin:keyLabel="ц" />
+ <Key
+ latin:keyLabel="в" />
+ <Key
+ latin:keyLabel="б" />
+ <Key
+ latin:keyLabel="н" />
+ <Key
+ latin:keyLabel="м" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="11.75%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml
index bcb6e8ae8..5d62deaa4 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -19,196 +19,109 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
<Key
- android:keyLabel="1"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¹½⅓¼⅛"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="1"
+ latin:popupCharacters="¹,½,⅓,¼,⅛"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="2"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="²⅔" />
+ latin:keyLabel="2"
+ latin:popupCharacters="²,⅔" />
<Key
- android:keyLabel="3"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="³¾⅜" />
+ latin:keyLabel="3"
+ latin:popupCharacters="³,¾,⅜" />
<Key
- android:keyLabel="4"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⁴" />
+ latin:keyLabel="4"
+ latin:popupCharacters="⁴" />
<Key
- android:keyLabel="5"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⅝" />
+ latin:keyLabel="5"
+ latin:popupCharacters="⅝" />
<Key
- android:keyLabel="6" />
+ latin:keyLabel="6" />
<Key
- android:keyLabel="7"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⅞" />
+ latin:keyLabel="7"
+ latin:popupCharacters="⅞" />
<Key
- android:keyLabel="8" />
+ latin:keyLabel="8" />
<Key
- android:keyLabel="9" />
+ latin:keyLabel="9" />
<Key
- android:keyLabel="0"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="ⁿ∅"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="0"
+ latin:popupCharacters="ⁿ,∅"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:keyLabel="\@"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="\@"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="\#" />
+ latin:keyLabel="\#" />
<Key
- android:keyLabel="$"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¢£€¥₣₤₱" />
+ latin:keyLabel="$"
+ latin:popupCharacters="¢,£,€,¥,₣,₤,₱" />
<Key
- android:keyLabel="%"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="‰" />
+ latin:keyLabel="%"
+ latin:popupCharacters="‰" />
<Key
- android:keyLabel="&amp;" />
+ latin:keyLabel="&amp;" />
<Key
- android:keyLabel="*"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="†‡★" />
+ latin:keyLabel="*"
+ latin:popupCharacters="†,‡,★" />
<Key
- android:keyLabel="-"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="_–—" />
+ latin:keyLabel="-"
+ latin:popupCharacters="_,–,—" />
<Key
- android:keyLabel="+"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="±" />
+ latin:keyLabel="+"
+ latin:popupCharacters="±" />
<Key
- android:keyLabel="("
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="[{&lt;" />
+ latin:keyLabel="("
+ latin:popupCharacters="[,{,&lt;" />
<Key
- android:keyLabel=")"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="]}&gt;"
- android:keyEdgeFlags="right" />
+ latin:keyLabel=")"
+ latin:popupCharacters="],},&gt;"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="@integer/key_shift"
- android:keyLabel="@string/label_alt_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="altKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="!"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¡" />
+ latin:keyLabel="!"
+ latin:popupCharacters="¡" />
<Key
- android:keyLabel="&quot;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="“”«»˝" />
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»,˝" />
<Key
- android:keyLabel="\'"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="‘’" />
+ latin:keyLabel="\'"
+ latin:popupCharacters="‘,’" />
<Key
- android:keyLabel=":" />
+ latin:keyLabel=":" />
<Key
- android:keyLabel=";" />
+ latin:keyLabel=";" />
<Key
- android:keyLabel="/" />
+ latin:keyLabel="/" />
<Key
- android:keyLabel="\?"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¿" />
+ latin:keyLabel="\?"
+ latin:popupCharacters="¿" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
</Row>
+ <include latin:keyboardLayout="@xml/kbd_symbols_row4" />
</Keyboard>
diff --git a/java/res/xml/kbd_symbols_black.xml b/java/res/xml/kbd_symbols_black.xml
deleted file mode 100644
index add6c01c5..000000000
--- a/java/res/xml/kbd_symbols_black.xml
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="1"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¹½⅓¼⅛"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="2"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="²⅔" />
- <Key
- android:keyLabel="3"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="³¾⅜" />
- <Key
- android:keyLabel="4"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⁴" />
- <Key
- android:keyLabel="5"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⅝" />
- <Key
- android:keyLabel="6" />
- <Key
- android:keyLabel="7"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⅞" />
- <Key
- android:keyLabel="8" />
- <Key
- android:keyLabel="9" />
- <Key
- android:keyLabel="0"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="ⁿ∅"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="\@"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="\#" />
- <Key
- android:keyLabel="$"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¢£€¥₣₤₱" />
- <Key
- android:keyLabel="%"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="‰" />
- <Key
- android:keyLabel="&amp;" />
- <Key
- android:keyLabel="*"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="†‡★" />
- <Key
- android:keyLabel="-"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="_–—" />
- <Key
- android:keyLabel="+"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="±" />
- <Key
- android:keyLabel="("
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="[{&lt;" />
- <Key
- android:keyLabel=")"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="]}&gt;"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyLabel="@string/label_alt_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="!"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¡" />
- <Key
- android:keyLabel="&quot;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="“”«»˝" />
- <Key
- android:keyLabel="\'"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="‘’" />
- <Key
- android:keyLabel=":" />
- <Key
- android:keyLabel=";" />
- <Key
- android:keyLabel="/" />
- <Key
- android:keyLabel="\?"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¿" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_symbols_f1.xml b/java/res/xml/kbd_symbols_f1.xml
new file mode 100644
index 000000000..8487b6158
--- /dev/null
+++ b/java/res/xml/kbd_symbols_f1.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:hasVoiceKey="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </case>
+ <case
+ latin:hasVoiceKey="false"
+ >
+ <Key
+ latin:keyLabel=","
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_settings_comma"
+ latin:keyStyle="functionalKeyStyle" />
+ </case>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml
new file mode 100644
index 000000000..b330095af
--- /dev/null
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:rowEdgeFlags="bottom"
+ >
+ <switch>
+ <case
+ latin:hasSettingsKey="false"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="left" />
+ <include
+ latin:keyboardLayout="@xml/kbd_symbols_f1" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="40%p" />
+ <Key
+ latin:keyLabel="."
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ <case
+ latin:hasSettingsKey="true"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="settingsKeyStyle" />
+ <include
+ latin:keyboardLayout="@xml/kbd_symbols_f1" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="30%p" />
+ <Key
+ latin:keyLabel="."
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ </switch>
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
index 9bee22069..368ee805b 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -19,171 +19,98 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
<Key
- android:keyLabel="~"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="~"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="`" />
+ latin:keyLabel="`" />
<Key
- android:keyLabel="|" />
+ latin:keyLabel="|" />
<Key
- android:keyLabel="•"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="♪♥♠♦♣" />
+ latin:keyLabel="•"
+ latin:popupCharacters="♪,♥,♠,♦,♣" />
<Key
- android:keyLabel="√" />
+ latin:keyLabel="√" />
<Key
- android:keyLabel="π"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="Π" />
+ latin:keyLabel="π"
+ latin:popupCharacters="Π" />
<Key
- android:keyLabel="÷" />
+ latin:keyLabel="÷" />
<Key
- android:keyLabel="×" />
+ latin:keyLabel="×" />
<Key
- android:keyLabel="{" />
+ latin:keyLabel="{" />
<Key
- android:keyLabel="}"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="}"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="@integer/key_tab"
- android:keyLabel="\u21E5"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="nonSpecialBackgroundTabKeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="£" />
+ latin:keyLabel="£" />
<Key
- android:keyLabel="¢" />
+ latin:keyLabel="¢" />
<Key
- android:keyLabel="€" />
+ latin:keyLabel="€" />
<Key
- android:keyLabel="°" />
+ latin:keyLabel="°" />
<Key
- android:keyLabel="^"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="↑↓←→" />
+ latin:keyLabel="^"
+ latin:popupCharacters="↑,↓,←,→" />
<Key
- android:keyLabel="_" />
+ latin:keyLabel="_" />
<Key
- android:keyLabel="="
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≠≈∞" />
+ latin:keyLabel="="
+ latin:popupCharacters="≠,≈,∞" />
<Key
- android:keyLabel="[" />
+ latin:keyLabel="[" />
<Key
- android:keyLabel="]"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="]"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="@integer/key_shift"
- android:keyLabel="@string/label_alt_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="™" />
+ latin:keyLabel="™" />
<Key
- android:keyLabel="®" />
+ latin:keyLabel="®" />
<Key
- android:keyLabel="©" />
+ latin:keyLabel="©" />
<Key
- android:keyLabel="¶"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="§" />
+ latin:keyLabel="¶"
+ latin:popupCharacters="§" />
<Key
- android:keyLabel="\\" />
+ latin:keyLabel="\\" />
<Key
- android:keyLabel="&lt;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≤«‹" />
+ latin:keyLabel="&lt;"
+ latin:popupCharacters="≤,«,‹" />
<Key
- android:keyLabel="&gt;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≥»›" />
+ latin:keyLabel="&gt;"
+ latin:popupCharacters="≥,»,›" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="„"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="…"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:keyLabel="„"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="…"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
</Row>
+ <include latin:keyboardLayout="@xml/kbd_symbols_shift_row4" />
</Keyboard>
diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml
deleted file mode 100644
index 52b67c3de..000000000
--- a/java/res/xml/kbd_symbols_shift_black.xml
+++ /dev/null
@@ -1,177 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="~"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="`" />
- <Key
- android:keyLabel="|" />
- <Key
- android:keyLabel="•"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="♪♥♠♦♣" />
- <Key
- android:keyLabel="√" />
- <Key
- android:keyLabel="π"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="Π" />
- <Key
- android:keyLabel="÷" />
- <Key
- android:keyLabel="×" />
- <Key
- android:keyLabel="{" />
- <Key
- android:keyLabel="}"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_tab"
- android:keyLabel="\u21E5"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="£" />
- <Key
- android:keyLabel="¢" />
- <Key
- android:keyLabel="€" />
- <Key
- android:keyLabel="°" />
- <Key
- android:keyLabel="^"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="↑↓←→" />
- <Key
- android:keyLabel="_" />
- <Key
- android:keyLabel="="
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≠≈∞" />
- <Key
- android:keyLabel="[" />
- <Key
- android:keyLabel="]"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyLabel="@string/label_alt_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="™" />
- <Key
- android:keyLabel="®" />
- <Key
- android:keyLabel="©" />
- <Key
- android:keyLabel="¶"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="§" />
- <Key
- android:keyLabel="\\" />
- <Key
- android:keyLabel="&lt;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≤«‹" />
- <Key
- android:keyLabel="&gt;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≥»›" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="„" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="…" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:keyLabel="„" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="…" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml
new file mode 100644
index 000000000..9159bab24
--- /dev/null
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:rowEdgeFlags="bottom"
+ >
+ <switch>
+ <case
+ latin:hasSettingsKey="false"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="„"
+ latin:keyStyle="functionalKeyStyle" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="40%p" />
+ <Key
+ latin:keyLabel="…"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ <case
+ latin:hasSettingsKey="true"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="settingsKeyStyle" />
+ <Key
+ latin:keyLabel="„"
+ latin:keyStyle="functionalKeyStyle" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="30%p" />
+ <Key
+ latin:keyLabel="…"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ </switch>
+ </Row>
+</merge>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index e5654e96d..b1f737903 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -20,7 +20,190 @@
<!-- The attributes in this XML file provide configuration information -->
<!-- for the Input Method Manager. -->
+<!-- Keyboard: en_US, en_GB, cs, da, de, es, es_US, fr, fr_CA, fr_CH, it, nb, nl, sr, sv -->
+<!-- Voice: af, cs, da, de, en, es, fr, it, ja, ko, nl, pl, pt, ru, tr, yue, zh, zu -->
+<!-- TODO: use <lang>_keyboard icon instead of a common keyboard icon. -->
+<!-- TODO: use <lang>_mic icon instead of a common mic icon. -->
+<!-- If IME doesn't have an applicable subtype, the first subtype will be used as a default
+ subtype.-->
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
- android:settingsActivity="com.android.inputmethod.latin.LatinIMESettings"
- android:isDefault="@bool/im_is_default"
-/>
+ android:settingsActivity="com.android.inputmethod.latin.Settings"
+ android:isDefault="@bool/im_is_default">
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_en_US_keyboard"
+ android:imeSubtypeLocale="en_US"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_en_voice"
+ android:imeSubtypeLocale="en"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_en_GB_keyboard"
+ android:imeSubtypeLocale="en_GB"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_cs_keyboard"
+ android:imeSubtypeLocale="cs"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_cs_voice"
+ android:imeSubtypeLocale="cs"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_da_keyboard"
+ android:imeSubtypeLocale="da"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_de_keyboard"
+ android:imeSubtypeLocale="de"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_de_voice"
+ android:imeSubtypeLocale="de"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_es_keyboard"
+ android:imeSubtypeLocale="es"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_es_voice"
+ android:imeSubtypeLocale="es"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_fr_keyboard"
+ android:imeSubtypeLocale="fr"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_fr_voice"
+ android:imeSubtypeLocale="fr"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_fr_CA_keyboard"
+ android:imeSubtypeLocale="fr_CA"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_fr_CH_keyboard"
+ android:imeSubtypeLocale="fr_CH"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_it_keyboard"
+ android:imeSubtypeLocale="it"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_it_voice"
+ android:imeSubtypeLocale="it"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_nb_keyboard"
+ android:imeSubtypeLocale="nb"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_nl_keyboard"
+ android:imeSubtypeLocale="nl"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_nl_voice"
+ android:imeSubtypeLocale="nl"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_ru_keyboard"
+ android:imeSubtypeLocale="ru"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_sr_keyboard"
+ android:imeSubtypeLocale="sr"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_mode_sv_keyboard"
+ android:imeSubtypeLocale="sv"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_af_voice"
+ android:imeSubtypeLocale="af"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_ja_voice"
+ android:imeSubtypeLocale="ja"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_ko_voice"
+ android:imeSubtypeLocale="ko"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_pl_voice"
+ android:imeSubtypeLocale="pl"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_pt_voice"
+ android:imeSubtypeLocale="pt"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_ru_voice"
+ android:imeSubtypeLocale="ru"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_tr_voice"
+ android:imeSubtypeLocale="tr"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_yue_voice"
+ android:imeSubtypeLocale="yue"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_zh_voice"
+ android:imeSubtypeLocale="zh"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic"
+ android:label="@string/subtype_mode_zu_voice"
+ android:imeSubtypeLocale="zu"
+ android:imeSubtypeMode="voice"
+ android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity"
+ />
+</input-method>
diff --git a/java/res/xml/popup_domains.xml b/java/res/xml/popup_domains.xml
deleted file mode 100644
index 4e9789ff7..000000000
--- a/java/res/xml/popup_domains.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="15%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top|bottom"
- >
- <Key
- android:keyLabel="@string/popular_domain_1"
- android:keyOutputText="@string/popular_domain_1"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="@string/popular_domain_2"
- android:keyOutputText="@string/popular_domain_2" />
- <Key
- android:keyLabel="@string/popular_domain_3"
- android:keyOutputText="@string/popular_domain_3" />
- <Key
- android:keyLabel="@string/popular_domain_4"
- android:keyOutputText="@string/popular_domain_4"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/popup_mic.xml b/java/res/xml/popup_mic.xml
deleted file mode 100644
index 5bbd7dfa5..000000000
--- a/java/res/xml/popup_mic.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top|bottom"
- >
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_voice"
- android:keyIcon="@drawable/sym_keyboard_mic"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/popup_punctuation.xml b/java/res/xml/popup_punctuation.xml
deleted file mode 100644
index c429e38bc..000000000
--- a/java/res/xml/popup_punctuation.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel=":"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="/" />
- <Key
- android:keyLabel="&amp;" />
- <Key
- android:keyLabel="(" />
- <Key
- android:keyLabel=")" />
- <Key
- android:keyLabel="-" />
- <Key
- android:keyLabel="+"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:keyLabel=";"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="\@" />
- <Key
- android:keyLabel="\'" />
- <Key
- android:keyLabel="&quot;" />
- <Key
- android:keyLabel="\?" />
- <Key
- android:keyLabel="!" />
- <Key
- android:keyLabel=","
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/popup_smileys.xml b/java/res/xml/popup_smileys.xml
deleted file mode 100644
index 1a14e1df1..000000000
--- a/java/res/xml/popup_smileys.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="15%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel=":-("
- android:keyOutputText=":-( " />
- <Key
- android:keyLabel=";-)"
- android:keyOutputText=";-) " />
- <Key
- android:keyLabel=":-P"
- android:keyOutputText=":-P " />
- <Key
- android:keyLabel="=-O"
- android:keyOutputText="=-O "
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel=":-*"
- android:keyOutputText=":-* "
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel=":O"
- android:keyOutputText=":O " />
- <Key
- android:keyLabel="B-)"
- android:keyOutputText="B-) " />
- <Key
- android:keyLabel=":-$"
- android:keyOutputText=":-$ " />
- <Key
- android:keyLabel=":-!"
- android:keyOutputText=":-! "
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:keyLabel=":-["
- android:keyOutputText=":-[ "
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="O:-)"
- android:keyOutputText="O:-) " />
- <Key
- android:keyLabel=":-\\"
- android:keyOutputText=":-\\ " />
- <Key
- android:keyLabel=":'("
- android:keyOutputText=":'( " />
- <Key
- android:keyLabel=":-D"
- android:keyOutputText=":-D "
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index 9348e954a..9ea801ef7 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -4,9 +4,9 @@
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -18,65 +18,68 @@
android:title="@string/english_ime_settings"
android:key="english_ime_settings">
- <CheckBoxPreference
- android:key="vibrate_on"
- android:title="@string/vibrate_on_keypress"
- android:persistent="true"
- />
-
- <CheckBoxPreference
- android:key="sound_on"
- android:title="@string/sound_on_keypress"
- android:persistent="true"
- />
-
- <CheckBoxPreference
- android:key="popup_on"
- android:title="@string/popup_on_keypress"
- android:persistent="true"
- android:defaultValue="@bool/default_popup_preview"
- />
-
- <CheckBoxPreference
- android:key="recorrection_enabled"
- android:title="@string/prefs_enable_recorrection"
- android:summary="@string/prefs_enable_recorrection_summary"
- android:persistent="true"
- android:defaultValue="@bool/default_recorrection_enabled"
- />
+ <PreferenceCategory
+ android:title="@string/general_category"
+ android:key="general_settings">
- <CheckBoxPreference
- android:key="auto_cap"
- android:title="@string/auto_cap"
- android:persistent="true"
- android:defaultValue="true"
- />
+ <CheckBoxPreference
+ android:key="auto_cap"
+ android:title="@string/auto_cap"
+ android:persistent="true"
+ android:defaultValue="true"
+ />
- <ListPreference
- android:key="settings_key"
- android:title="@string/prefs_settings_key"
- android:persistent="true"
- android:entryValues="@array/settings_key_modes_values"
- android:entries="@array/settings_key_modes"
- android:defaultValue="@string/settings_key_mode_auto"
- />
+ <CheckBoxPreference
+ android:key="vibrate_on"
+ android:title="@string/vibrate_on_keypress"
+ android:persistent="true"
+ />
- <ListPreference
- android:key="voice_mode"
- android:title="@string/voice_input"
- android:persistent="true"
- android:entryValues="@array/voice_input_modes_values"
- android:entries="@array/voice_input_modes"
- android:defaultValue="@string/voice_mode_main"
- />
+ <CheckBoxPreference
+ android:key="sound_on"
+ android:title="@string/sound_on_keypress"
+ android:persistent="true"
+ />
+ <CheckBoxPreference
+ android:key="popup_on"
+ android:title="@string/popup_on_keypress"
+ android:persistent="true"
+ android:defaultValue="@bool/config_default_popup_preview"
+ />
- <PreferenceScreen
- android:title="@string/language_selection_title"
- android:summary="@string/language_selection_summary">
- <intent
- android:action="com.android.inputmethod.latin.INPUT_LANGUAGE_SELECTION"/>
- </PreferenceScreen>
+ <CheckBoxPreference
+ android:key="recorrection_enabled"
+ android:title="@string/prefs_enable_recorrection"
+ android:summary="@string/prefs_enable_recorrection_summary"
+ android:persistent="true"
+ android:defaultValue="@bool/default_recorrection_enabled"
+ />
+
+ <ListPreference
+ android:key="settings_key"
+ android:title="@string/prefs_settings_key"
+ android:persistent="true"
+ android:entryValues="@array/settings_key_modes_values"
+ android:entries="@array/settings_key_modes"
+ android:defaultValue="@string/settings_key_mode_auto"
+ />
+
+ <ListPreference
+ android:key="voice_mode"
+ android:title="@string/voice_input"
+ android:persistent="true"
+ android:entryValues="@array/voice_input_modes_values"
+ android:entries="@array/voice_input_modes"
+ android:defaultValue="@string/voice_mode_main"
+ />
+
+ <PreferenceScreen
+ android:key="subtype_settings"
+ android:title="@string/language_selection_title"
+ android:summary="@string/language_selection_summary" />
+
+ </PreferenceCategory>
<PreferenceCategory
android:title="@string/prediction_category"
@@ -90,22 +93,40 @@
android:defaultValue="true"
/>
+ <ListPreference
+ android:key="auto_correction_threshold"
+ android:title="@string/auto_correction"
+ android:summary="@string/auto_correction_summary"
+ android:persistent="true"
+ android:entryValues="@array/auto_correction_threshold_mode_indexes"
+ android:entries="@array/auto_correction_threshold_modes"
+ android:defaultValue="@string/auto_correction_threshold_mode_index_modest"
+ />
+
+ <ListPreference
+ android:key="show_suggestions_setting"
+ android:summary="@string/prefs_show_suggestions_summary"
+ android:title="@string/prefs_show_suggestions"
+ android:persistent="true"
+ android:entryValues="@array/prefs_suggestion_visibility_values"
+ android:entries="@array/prefs_suggestion_visibilities"
+ android:defaultValue="@string/prefs_suggestion_visibility_default_value"
+ />
+
<CheckBoxPreference
- android:key="show_suggestions"
- android:title="@string/show_suggestions"
- android:summary="@string/show_suggestions_summary"
+ android:key="bigram_suggestion"
+ android:title="@string/bigram_suggestion"
+ android:summary="@string/bigram_suggestion_summary"
android:persistent="true"
android:defaultValue="true"
/>
+ </PreferenceCategory>
- <CheckBoxPreference
- android:key="auto_complete"
- android:title="@string/auto_complete"
- android:summary="@string/auto_complete_summary"
- android:persistent="true"
- android:defaultValue="@bool/enable_autocorrect"
- android:dependency="show_suggestions"
+ <CheckBoxPreference
+ android:key="usability_study_mode"
+ android:title="@string/prefs_usability_study_mode"
+ android:persistent="true"
+ android:defaultValue="false"
/>
- </PreferenceCategory>
</PreferenceScreen>
diff --git a/java/res/xml/prefs_for_debug.xml b/java/res/xml/prefs_for_debug.xml
index 8177d3c6a..2dad17148 100644
--- a/java/res/xml/prefs_for_debug.xml
+++ b/java/res/xml/prefs_for_debug.xml
@@ -32,7 +32,7 @@
android:persistent="true"
android:entryValues="@array/keyboard_layout_modes_values"
android:entries="@array/keyboard_layout_modes"
- android:defaultValue="4"
+ android:defaultValue="@string/config_default_keyboard_theme_id"
/>
<CheckBoxPreference
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
new file mode 100644
index 000000000..23886ad97
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -0,0 +1,422 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.keyboard.KeyStyles.KeyStyle;
+import com.android.inputmethod.keyboard.KeyboardParser.ParseException;
+import com.android.inputmethod.latin.R;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.Xml;
+
+import java.util.ArrayList;
+
+/**
+ * Class for describing the position and characteristics of a single key in the keyboard.
+ */
+public class Key {
+ /**
+ * The key code (unicode or custom code) that this key generates.
+ */
+ public final int mCode;
+ /** The unicode that this key generates in manual temporary upper case mode. */
+ public final int mManualTemporaryUpperCaseCode;
+
+ /** Label to display */
+ public final CharSequence mLabel;
+ /** Option of the label */
+ public final int mLabelOption;
+
+ /** Icon to display instead of a label. Icon takes precedence over a label */
+ private Drawable mIcon;
+ /** Preview version of the icon, for the preview popup */
+ private Drawable mPreviewIcon;
+ /** Hint icon to display on the key in conjunction with the label */
+ public final Drawable mHintIcon;
+ /**
+ * The hint icon to display on the key when keyboard is in manual temporary upper case
+ * mode.
+ */
+ public final Drawable mManualTemporaryUpperCaseHintIcon;
+
+ /** Width of the key, not including the gap */
+ public final int mWidth;
+ /** Height of the key, not including the gap */
+ public final int mHeight;
+ /** The horizontal gap before this key */
+ public final int mGap;
+ /** Whether this key is sticky, i.e., a toggle key */
+ public final boolean mSticky;
+ /** X coordinate of the key in the keyboard layout */
+ public final int mX;
+ /** Y coordinate of the key in the keyboard layout */
+ public final int mY;
+ /** Text to output when pressed. This can be multiple characters, like ".com" */
+ public final CharSequence mOutputText;
+ /** Popup characters */
+ public final CharSequence[] mPopupCharacters;
+ /** Popup keyboard maximum column number */
+ public final int mMaxPopupColumn;
+
+ /**
+ * Flags that specify the anchoring to edges of the keyboard for detecting touch events
+ * that are just out of the boundary of the key. This is a bit mask of
+ * {@link Keyboard#EDGE_LEFT}, {@link Keyboard#EDGE_RIGHT},
+ * {@link Keyboard#EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM}.
+ */
+ public final int mEdgeFlags;
+ /** Whether this is a modifier key, such as Shift or Alt */
+ public final boolean mModifier;
+ /** Whether this key repeats itself when held down */
+ public final boolean mRepeatable;
+
+ /** The Keyboard that this key belongs to */
+ private final Keyboard mKeyboard;
+
+ /** The current pressed state of this key */
+ public boolean mPressed;
+ /** If this is a sticky key, is it on? */
+ public boolean mOn;
+ /** Key is enabled or not. */
+ public boolean mEnabled = true;
+
+ private final static int[] KEY_STATE_NORMAL_ON = {
+ android.R.attr.state_checkable,
+ android.R.attr.state_checked
+ };
+
+ private final static int[] KEY_STATE_PRESSED_ON = {
+ android.R.attr.state_pressed,
+ android.R.attr.state_checkable,
+ android.R.attr.state_checked
+ };
+
+ private final static int[] KEY_STATE_NORMAL_OFF = {
+ android.R.attr.state_checkable
+ };
+
+ private final static int[] KEY_STATE_PRESSED_OFF = {
+ android.R.attr.state_pressed,
+ android.R.attr.state_checkable
+ };
+
+ private final static int[] KEY_STATE_NORMAL = {
+ };
+
+ private final static int[] KEY_STATE_PRESSED = {
+ android.R.attr.state_pressed
+ };
+
+ // functional normal state (with properties)
+ private static final int[] KEY_STATE_FUNCTIONAL_NORMAL = {
+ android.R.attr.state_single
+ };
+
+ // functional pressed state (with properties)
+ private static final int[] KEY_STATE_FUNCTIONAL_PRESSED = {
+ android.R.attr.state_single,
+ android.R.attr.state_pressed
+ };
+
+ /**
+ * This constructor is being used only for key in mini popup keyboard.
+ */
+ public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y,
+ int width, int edgeFlags) {
+ mKeyboard = keyboard;
+ mHeight = keyboard.getRowHeight() - keyboard.getVerticalGap();
+ mGap = keyboard.getHorizontalGap();
+ mWidth = width - mGap;
+ mEdgeFlags = edgeFlags;
+ mHintIcon = null;
+ mManualTemporaryUpperCaseHintIcon = null;
+ mManualTemporaryUpperCaseCode = Keyboard.CODE_DUMMY;
+ mLabelOption = 0;
+ mModifier = false;
+ mSticky = false;
+ mRepeatable = false;
+ mPopupCharacters = null;
+ mMaxPopupColumn = 0;
+ final String popupSpecification = popupCharacter.toString();
+ mLabel = PopupCharactersParser.getLabel(popupSpecification);
+ mOutputText = PopupCharactersParser.getOutputText(popupSpecification);
+ mCode = PopupCharactersParser.getCode(res, popupSpecification);
+ mIcon = PopupCharactersParser.getIcon(res, popupSpecification);
+ // Horizontal gap is divided equally to both sides of the key.
+ mX = x + mGap / 2;
+ mY = y;
+ }
+
+ /**
+ * Create a key with the given top-left coordinate and extract its attributes from the XML
+ * parser.
+ * @param res resources associated with the caller's context
+ * @param row the row that this key belongs to. The row must already be attached to
+ * a {@link Keyboard}.
+ * @param x the x coordinate of the top-left
+ * @param y the y coordinate of the top-left
+ * @param parser the XML parser containing the attributes for this key
+ */
+ public Key(Resources res, Row row, int x, int y, XmlResourceParser parser,
+ KeyStyles keyStyles) {
+ mKeyboard = row.getKeyboard();
+
+ final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ try {
+ mHeight = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_rowHeight,
+ mKeyboard.getKeyboardHeight(), row.mDefaultHeight) - row.mVerticalGap;
+ mGap = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_horizontalGap,
+ mKeyboard.getDisplayWidth(), row.mDefaultHorizontalGap);
+ mWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_keyWidth,
+ mKeyboard.getDisplayWidth(), row.mDefaultWidth) - mGap;
+ } finally {
+ keyboardAttr.recycle();
+ }
+
+ // Horizontal gap is divided equally to both sides of the key.
+ this.mX = x + mGap / 2;
+ this.mY = y;
+
+ final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Key);
+ try {
+ final KeyStyle style;
+ if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyStyle)) {
+ String styleName = keyAttr.getString(R.styleable.Keyboard_Key_keyStyle);
+ style = keyStyles.getKeyStyle(styleName);
+ if (style == null)
+ throw new ParseException("Unknown key style: " + styleName, parser);
+ } else {
+ style = keyStyles.getEmptyKeyStyle();
+ }
+
+ final CharSequence[] popupCharacters = style.getTextArray(keyAttr,
+ R.styleable.Keyboard_Key_popupCharacters);
+ if (res.getBoolean(R.bool.config_digit_popup_characters_enabled)) {
+ mPopupCharacters = popupCharacters;
+ } else {
+ mPopupCharacters = filterOutDigitPopupCharacters(popupCharacters);
+ }
+ mMaxPopupColumn = style.getInt(keyboardAttr,
+ R.styleable.Keyboard_Key_maxPopupKeyboardColumn,
+ mKeyboard.getMaxPopupKeyboardColumn());
+
+ mRepeatable = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable, false);
+ mModifier = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isModifier, false);
+ mSticky = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky, false);
+ mEdgeFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyEdgeFlags, 0)
+ | row.mRowEdgeFlags;
+
+ mPreviewIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_iconPreview);
+ Keyboard.setDefaultBounds(mPreviewIcon);
+ mIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_keyIcon);
+ Keyboard.setDefaultBounds(mIcon);
+ mHintIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_keyHintIcon);
+ Keyboard.setDefaultBounds(mHintIcon);
+ mManualTemporaryUpperCaseHintIcon = style.getDrawable(keyAttr,
+ R.styleable.Keyboard_Key_manualTemporaryUpperCaseHintIcon);
+ Keyboard.setDefaultBounds(mManualTemporaryUpperCaseHintIcon);
+
+ mLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyLabel);
+ mLabelOption = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption, 0);
+ mManualTemporaryUpperCaseCode = style.getInt(keyAttr,
+ R.styleable.Keyboard_Key_manualTemporaryUpperCaseCode, Keyboard.CODE_DUMMY);
+ mOutputText = style.getText(keyAttr, R.styleable.Keyboard_Key_keyOutputText);
+ // Choose the first letter of the label as primary code if not
+ // specified.
+ final int code = style.getInt(keyAttr, R.styleable.Keyboard_Key_code,
+ Keyboard.CODE_UNSPECIFIED);
+ if (code == Keyboard.CODE_UNSPECIFIED && !TextUtils.isEmpty(mLabel)) {
+ mCode = mLabel.charAt(0);
+ } else if (code != Keyboard.CODE_UNSPECIFIED) {
+ mCode = code;
+ } else {
+ mCode = Keyboard.CODE_DUMMY;
+ }
+
+ final Drawable shiftedIcon = style.getDrawable(keyAttr,
+ R.styleable.Keyboard_Key_shiftedIcon);
+ if (shiftedIcon != null)
+ mKeyboard.getShiftedIcons().put(this, shiftedIcon);
+ } finally {
+ keyAttr.recycle();
+ }
+ }
+
+ private static boolean isDigitPopupCharacter(CharSequence label) {
+ return label.length() == 1 && Character.isDigit(label.charAt(0));
+ }
+
+ private static CharSequence[] filterOutDigitPopupCharacters(CharSequence[] popupCharacters) {
+ if (popupCharacters == null || popupCharacters.length < 1)
+ return null;
+ if (popupCharacters.length == 1 && isDigitPopupCharacter(
+ PopupCharactersParser.getLabel(popupCharacters[0].toString())))
+ return null;
+ ArrayList<CharSequence> filtered = null;
+ for (int i = 0; i < popupCharacters.length; i++) {
+ final CharSequence popupSpec = popupCharacters[i];
+ if (isDigitPopupCharacter(PopupCharactersParser.getLabel(popupSpec.toString()))) {
+ if (filtered == null) {
+ filtered = new ArrayList<CharSequence>();
+ for (int j = 0; j < i; j++)
+ filtered.add(popupCharacters[j]);
+ }
+ } else if (filtered != null) {
+ filtered.add(popupSpec);
+ }
+ }
+ if (filtered == null)
+ return popupCharacters;
+ if (filtered.size() == 0)
+ return null;
+ return filtered.toArray(new CharSequence[filtered.size()]);
+ }
+
+ public Drawable getIcon() {
+ return mIcon;
+ }
+
+ public Drawable getPreviewIcon() {
+ return mPreviewIcon;
+ }
+
+ public void setIcon(Drawable icon) {
+ mIcon = icon;
+ }
+
+ public void setPreviewIcon(Drawable icon) {
+ mPreviewIcon = icon;
+ }
+
+ /**
+ * Informs the key that it has been pressed, in case it needs to change its appearance or
+ * state.
+ * @see #onReleased(boolean)
+ */
+ public void onPressed() {
+ mPressed = !mPressed;
+ }
+
+ /**
+ * Changes the pressed state of the key. If it is a sticky key, it will also change the
+ * toggled state of the key if the finger was release inside.
+ * @param inside whether the finger was released inside the key
+ * @see #onPressed()
+ */
+ public void onReleased(boolean inside) {
+ mPressed = !mPressed;
+ if (mSticky && !mKeyboard.isShiftLockEnabled(this))
+ mOn = !mOn;
+ }
+
+ public boolean isInside(int x, int y) {
+ return mKeyboard.isInside(this, x, y);
+ }
+
+ /**
+ * Detects if a point falls on this key.
+ * @param x the x-coordinate of the point
+ * @param y the y-coordinate of the point
+ * @return whether or not the point falls on the key. If the key is attached to an edge, it will
+ * assume that all points between the key and the edge are considered to be on the key.
+ */
+ public boolean isOnKey(int x, int y) {
+ final int flags = mEdgeFlags;
+ final boolean leftEdge = (flags & Keyboard.EDGE_LEFT) != 0;
+ final boolean rightEdge = (flags & Keyboard.EDGE_RIGHT) != 0;
+ final boolean topEdge = (flags & Keyboard.EDGE_TOP) != 0;
+ final boolean bottomEdge = (flags & Keyboard.EDGE_BOTTOM) != 0;
+ final int left = this.mX;
+ final int right = left + this.mWidth;
+ final int top = this.mY;
+ final int bottom = top + this.mHeight;
+ return (x >= left || leftEdge) && (x < right || rightEdge)
+ && (y >= top || topEdge) && (y < bottom || bottomEdge);
+ }
+
+ /**
+ * Returns the square of the distance to the nearest edge of the key and the given point.
+ * @param x the x-coordinate of the point
+ * @param y the y-coordinate of the point
+ * @return the square of the distance of the point from the nearest edge of the key
+ */
+ public int squaredDistanceToEdge(int x, int y) {
+ final int left = this.mX;
+ final int right = left + this.mWidth;
+ final int top = this.mY;
+ final int bottom = top + this.mHeight;
+ final int edgeX = x < left ? left : (x > right ? right : x);
+ final int edgeY = y < top ? top : (y > bottom ? bottom : y);
+ final int dx = x - edgeX;
+ final int dy = y - edgeY;
+ return dx * dx + dy * dy;
+ }
+
+ // sticky is used for shift key. If a key is not sticky and is modifier,
+ // the key will be treated as functional.
+ private boolean isFunctionalKey() {
+ return !mSticky && mModifier;
+ }
+
+ /**
+ * Returns the drawable state for the key, based on the current state and type of the key.
+ * @return the drawable state of the key.
+ * @see android.graphics.drawable.StateListDrawable#setState(int[])
+ */
+ public int[] getCurrentDrawableState() {
+ final boolean pressed = mEnabled && mPressed;
+ if (isFunctionalKey()) {
+ if (pressed) {
+ return KEY_STATE_FUNCTIONAL_PRESSED;
+ } else {
+ return KEY_STATE_FUNCTIONAL_NORMAL;
+ }
+ }
+
+ int[] states = KEY_STATE_NORMAL;
+
+ if (mOn) {
+ if (pressed) {
+ states = KEY_STATE_PRESSED_ON;
+ } else {
+ states = KEY_STATE_NORMAL_ON;
+ }
+ } else {
+ if (mSticky) {
+ if (pressed) {
+ states = KEY_STATE_PRESSED_OFF;
+ } else {
+ states = KEY_STATE_NORMAL_OFF;
+ }
+ } else {
+ if (pressed) {
+ states = KEY_STATE_PRESSED;
+ }
+ }
+ }
+ return states;
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index 76fe1200e..e7a9d8513 100644
--- a/java/src/com/android/inputmethod/latin/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -14,15 +14,14 @@
* the License.
*/
-package com.android.inputmethod.latin;
-
-import android.inputmethodservice.Keyboard;
-import android.inputmethodservice.Keyboard.Key;
+package com.android.inputmethod.keyboard;
import java.util.Arrays;
import java.util.List;
-abstract class KeyDetector {
+public abstract class KeyDetector {
+ public static final int NOT_A_KEY = -1;
+
protected Keyboard mKeyboard;
private Key[] mKeys;
@@ -80,12 +79,11 @@ abstract class KeyDetector {
*
* @return Allocates and returns an array that can hold all key indices returned by
* {@link #getKeyIndexAndNearbyCodes} method. All elements in the returned array are
- * initialized by {@link com.android.inputmethod.latin.LatinKeyboardView.NOT_A_KEY}
- * value.
+ * initialized by {@link #NOT_A_KEY} value.
*/
public int[] newCodeArray() {
int[] codes = new int[getMaxNearbyKeys()];
- Arrays.fill(codes, LatinKeyboardBaseView.NOT_A_KEY);
+ Arrays.fill(codes, NOT_A_KEY);
return codes;
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/KeyStyles.java
new file mode 100644
index 000000000..44ec53181
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyStyles.java
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.keyboard.KeyboardParser.ParseException;
+import com.android.inputmethod.latin.R;
+
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class KeyStyles {
+ private static final String TAG = "KeyStyles";
+ private static final boolean DEBUG = false;
+
+ private final HashMap<String, DeclaredKeyStyle> mStyles =
+ new HashMap<String, DeclaredKeyStyle>();
+ private static final KeyStyle EMPTY_KEY_STYLE = new EmptyKeyStyle();
+
+ public interface KeyStyle {
+ public CharSequence[] getTextArray(TypedArray a, int index);
+ public Drawable getDrawable(TypedArray a, int index);
+ public CharSequence getText(TypedArray a, int index);
+ public int getInt(TypedArray a, int index, int defaultValue);
+ public int getFlag(TypedArray a, int index, int defaultValue);
+ public boolean getBoolean(TypedArray a, int index, boolean defaultValue);
+ }
+
+ /* package */ static class EmptyKeyStyle implements KeyStyle {
+ private EmptyKeyStyle() {
+ // Nothing to do.
+ }
+
+ @Override
+ public CharSequence[] getTextArray(TypedArray a, int index) {
+ return parseTextArray(a, index);
+ }
+
+ @Override
+ public Drawable getDrawable(TypedArray a, int index) {
+ return a.getDrawable(index);
+ }
+
+ @Override
+ public CharSequence getText(TypedArray a, int index) {
+ return a.getText(index);
+ }
+
+ @Override
+ public int getInt(TypedArray a, int index, int defaultValue) {
+ return a.getInt(index, defaultValue);
+ }
+
+ @Override
+ public int getFlag(TypedArray a, int index, int defaultValue) {
+ return a.getInt(index, defaultValue);
+ }
+
+ @Override
+ public boolean getBoolean(TypedArray a, int index, boolean defaultValue) {
+ return a.getBoolean(index, defaultValue);
+ }
+
+ protected static CharSequence[] parseTextArray(TypedArray a, int index) {
+ if (!a.hasValue(index))
+ return null;
+ final CharSequence text = a.getText(index);
+ return parseCsvText(text);
+ }
+
+ /* package */ static CharSequence[] parseCsvText(CharSequence text) {
+ final int size = text.length();
+ if (size == 0) return null;
+ if (size == 1) return new CharSequence[] { text };
+ final StringBuilder sb = new StringBuilder();
+ ArrayList<CharSequence> list = null;
+ int start = 0;
+ for (int pos = 0; pos < size; pos++) {
+ final char c = text.charAt(pos);
+ if (c == ',') {
+ if (list == null) list = new ArrayList<CharSequence>();
+ if (sb.length() == 0) {
+ list.add(text.subSequence(start, pos));
+ } else {
+ list.add(sb.toString());
+ sb.setLength(0);
+ }
+ start = pos + 1;
+ continue;
+ } else if (c == '\\') {
+ if (start == pos) {
+ // Skip escape character at the beginning of the value.
+ start++;
+ pos++;
+ } else {
+ if (start < pos && sb.length() == 0)
+ sb.append(text.subSequence(start, pos));
+ pos++;
+ if (pos < size)
+ sb.append(text.charAt(pos));
+ }
+ } else if (sb.length() > 0) {
+ sb.append(c);
+ }
+ }
+ if (list == null) {
+ return new CharSequence[] { sb.length() > 0 ? sb : text.subSequence(start, size) };
+ } else {
+ list.add(sb.length() > 0 ? sb : text.subSequence(start, size));
+ return list.toArray(new CharSequence[list.size()]);
+ }
+ }
+ }
+
+ private static class DeclaredKeyStyle extends EmptyKeyStyle {
+ private final HashMap<Integer, Object> mAttributes = new HashMap<Integer, Object>();
+
+ @Override
+ public CharSequence[] getTextArray(TypedArray a, int index) {
+ return a.hasValue(index)
+ ? super.getTextArray(a, index) : (CharSequence[])mAttributes.get(index);
+ }
+
+ @Override
+ public Drawable getDrawable(TypedArray a, int index) {
+ return a.hasValue(index)
+ ? super.getDrawable(a, index) : (Drawable)mAttributes.get(index);
+ }
+
+ @Override
+ public CharSequence getText(TypedArray a, int index) {
+ return a.hasValue(index)
+ ? super.getText(a, index) : (CharSequence)mAttributes.get(index);
+ }
+
+ @Override
+ public int getInt(TypedArray a, int index, int defaultValue) {
+ final Integer value = (Integer)mAttributes.get(index);
+ return super.getInt(a, index, (value != null) ? value : defaultValue);
+ }
+
+ @Override
+ public int getFlag(TypedArray a, int index, int defaultValue) {
+ final Integer value = (Integer)mAttributes.get(index);
+ return super.getFlag(a, index, defaultValue) | (value != null ? value : 0);
+ }
+
+ @Override
+ public boolean getBoolean(TypedArray a, int index, boolean defaultValue) {
+ final Boolean value = (Boolean)mAttributes.get(index);
+ return super.getBoolean(a, index, (value != null) ? value : defaultValue);
+ }
+
+ private DeclaredKeyStyle() {
+ super();
+ }
+
+ private void parseKeyStyleAttributes(TypedArray keyAttr) {
+ // TODO: Currently not all Key attributes can be declared as style.
+ readInt(keyAttr, R.styleable.Keyboard_Key_code);
+ readText(keyAttr, R.styleable.Keyboard_Key_keyLabel);
+ readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption);
+ readTextArray(keyAttr, R.styleable.Keyboard_Key_popupCharacters);
+ readInt(keyAttr, R.styleable.Keyboard_Key_maxPopupKeyboardColumn);
+ readText(keyAttr, R.styleable.Keyboard_Key_keyOutputText);
+ readDrawable(keyAttr, R.styleable.Keyboard_Key_keyIcon);
+ readDrawable(keyAttr, R.styleable.Keyboard_Key_iconPreview);
+ readDrawable(keyAttr, R.styleable.Keyboard_Key_keyHintIcon);
+ readDrawable(keyAttr, R.styleable.Keyboard_Key_shiftedIcon);
+ readBoolean(keyAttr, R.styleable.Keyboard_Key_isModifier);
+ readBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky);
+ readBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable);
+ }
+
+ private void readDrawable(TypedArray a, int index) {
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getDrawable(index));
+ }
+
+ private void readText(TypedArray a, int index) {
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getText(index));
+ }
+
+ private void readInt(TypedArray a, int index) {
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getInt(index, 0));
+ }
+
+ private void readFlag(TypedArray a, int index) {
+ final Integer value = (Integer)mAttributes.get(index);
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getInt(index, 0) | (value != null ? value : 0));
+ }
+
+ private void readBoolean(TypedArray a, int index) {
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getBoolean(index, false));
+ }
+
+ private void readTextArray(TypedArray a, int index) {
+ final CharSequence[] value = parseTextArray(a, index);
+ if (value != null)
+ mAttributes.put(index, value);
+ }
+
+ private void addParent(DeclaredKeyStyle parentStyle) {
+ mAttributes.putAll(parentStyle.mAttributes);
+ }
+ }
+
+ public void parseKeyStyleAttributes(TypedArray keyStyleAttr, TypedArray keyAttrs,
+ XmlResourceParser parser) {
+ String styleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_styleName);
+ if (DEBUG) Log.d(TAG, String.format("<%s styleName=%s />",
+ KeyboardParser.TAG_KEY_STYLE, styleName));
+ if (mStyles.containsKey(styleName))
+ throw new ParseException("duplicate key style declared: " + styleName, parser);
+
+ final DeclaredKeyStyle style = new DeclaredKeyStyle();
+ if (keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_parentStyle)) {
+ String parentStyle = keyStyleAttr.getString(
+ R.styleable.Keyboard_KeyStyle_parentStyle);
+ final DeclaredKeyStyle parent = mStyles.get(parentStyle);
+ if (parent == null)
+ throw new ParseException("Unknown parentStyle " + parent, parser);
+ style.addParent(parent);
+ }
+ style.parseKeyStyleAttributes(keyAttrs);
+ mStyles.put(styleName, style);
+ }
+
+ public KeyStyle getKeyStyle(String styleName) {
+ return mStyles.get(styleName);
+ }
+
+ public KeyStyle getEmptyKeyStyle() {
+ return EMPTY_KEY_STYLE;
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
new file mode 100644
index 000000000..3a0bf53ab
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -0,0 +1,417 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard
+ * consists of rows of keys.
+ * <p>The layout file for a keyboard contains XML that looks like the following snippet:</p>
+ * <pre>
+ * &lt;Keyboard
+ * latin:keyWidth="%10p"
+ * latin:keyHeight="50px"
+ * latin:horizontalGap="2px"
+ * latin:verticalGap="2px" &gt;
+ * &lt;Row latin:keyWidth="32px" &gt;
+ * &lt;Key latin:keyLabel="A" /&gt;
+ * ...
+ * &lt;/Row&gt;
+ * ...
+ * &lt;/Keyboard&gt;
+ * </pre>
+ */
+public class Keyboard {
+ private static final String TAG = "Keyboard";
+
+ public static final int EDGE_LEFT = 0x01;
+ public static final int EDGE_RIGHT = 0x02;
+ public static final int EDGE_TOP = 0x04;
+ public static final int EDGE_BOTTOM = 0x08;
+
+ /** Some common keys code. These should be aligned with values/keycodes.xml */
+ public static final int CODE_ENTER = '\n';
+ public static final int CODE_TAB = '\t';
+ public static final int CODE_SPACE = ' ';
+ public static final int CODE_PERIOD = '.';
+
+ /** Special keys code. These should be aligned with values/keycodes.xml */
+ public static final int CODE_DUMMY = 0;
+ public static final int CODE_SHIFT = -1;
+ public static final int CODE_SWITCH_ALPHA_SYMBOL = -2;
+ public static final int CODE_CANCEL = -3;
+ public static final int CODE_DONE = -4;
+ public static final int CODE_DELETE = -5;
+ public static final int CODE_ALT = -6;
+ // Code value representing the code is not specified.
+ public static final int CODE_UNSPECIFIED = -99;
+ public static final int CODE_SETTINGS = -100;
+ public static final int CODE_SETTINGS_LONGPRESS = -101;
+ // TODO: remove this once LatinIME stops referring to this.
+ public static final int CODE_VOICE = -102;
+ public static final int CODE_CAPSLOCK = -103;
+ public static final int CODE_NEXT_LANGUAGE = -104;
+ public static final int CODE_PREV_LANGUAGE = -105;
+
+ /** Horizontal gap default for all rows */
+ private int mDefaultHorizontalGap;
+
+ /** Default key width */
+ private int mDefaultWidth;
+
+ /** Default key height */
+ private int mDefaultHeight;
+
+ /** Default gap between rows */
+ private int mDefaultVerticalGap;
+
+ /** Popup keyboard template */
+ private int mPopupKeyboardResId;
+
+ /** Maximum column for popup keyboard */
+ private int mMaxPopupColumn;
+
+ /** List of shift keys in this keyboard and its icons and state */
+ private final List<Key> mShiftKeys = new ArrayList<Key>();
+ private final HashMap<Key, Drawable> mShiftedIcons = new HashMap<Key, Drawable>();
+ private final HashMap<Key, Drawable> mNormalShiftIcons = new HashMap<Key, Drawable>();
+ private final HashSet<Key> mShiftLockEnabled = new HashSet<Key>();
+ private final KeyboardShiftState mShiftState = new KeyboardShiftState();
+
+ /** Total height of the keyboard, including the padding and keys */
+ private int mTotalHeight;
+
+ /**
+ * Total width (minimum width) of the keyboard, including left side gaps and keys, but not any
+ * gaps on the right side.
+ */
+ private int mMinWidth;
+
+ /** List of keys in this keyboard */
+ private final List<Key> mKeys = new ArrayList<Key>();
+
+ /** Width of the screen available to fit the keyboard */
+ private final int mDisplayWidth;
+
+ /** Height of the screen */
+ private final int mDisplayHeight;
+
+ /** Height of keyboard */
+ private int mKeyboardHeight;
+
+ public final KeyboardId mId;
+
+ // Variables for pre-computing nearest keys.
+
+ public final int GRID_WIDTH;
+ public final int GRID_HEIGHT;
+ private final int GRID_SIZE;
+ private int mCellWidth;
+ private int mCellHeight;
+ private int[][] mGridNeighbors;
+ private int mProximityThreshold;
+ private static int[] EMPTY_INT_ARRAY = new int[0];
+ /** Number of key widths from current touch point to search for nearest keys. */
+ private static float SEARCH_DISTANCE = 1.2f;
+
+ /**
+ * Creates a keyboard from the given xml key layout file.
+ * @param context the application or service context
+ * @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
+ * @param id keyboard identifier
+ */
+ public Keyboard(Context context, int xmlLayoutResId, KeyboardId id) {
+ this(context, xmlLayoutResId, id,
+ context.getResources().getDisplayMetrics().widthPixels,
+ context.getResources().getDisplayMetrics().heightPixels);
+ }
+
+ private Keyboard(Context context, int xmlLayoutResId, KeyboardId id, int width,
+ int height) {
+ Resources res = context.getResources();
+ GRID_WIDTH = res.getInteger(R.integer.config_keyboard_grid_width);
+ GRID_HEIGHT = res.getInteger(R.integer.config_keyboard_grid_height);
+ GRID_SIZE = GRID_WIDTH * GRID_HEIGHT;
+
+ mDisplayWidth = width;
+ mDisplayHeight = height;
+
+ mDefaultHorizontalGap = 0;
+ setKeyWidth(mDisplayWidth / 10);
+ mDefaultVerticalGap = 0;
+ mDefaultHeight = mDefaultWidth;
+ mId = id;
+ loadKeyboard(context, xmlLayoutResId);
+ }
+
+ public List<Key> getKeys() {
+ return mKeys;
+ }
+
+ public int getHorizontalGap() {
+ return mDefaultHorizontalGap;
+ }
+
+ public void setHorizontalGap(int gap) {
+ mDefaultHorizontalGap = gap;
+ }
+
+ public int getVerticalGap() {
+ return mDefaultVerticalGap;
+ }
+
+ public void setVerticalGap(int gap) {
+ mDefaultVerticalGap = gap;
+ }
+
+ public int getRowHeight() {
+ return mDefaultHeight;
+ }
+
+ public void setRowHeight(int height) {
+ mDefaultHeight = height;
+ }
+
+ public int getKeyWidth() {
+ return mDefaultWidth;
+ }
+
+ public void setKeyWidth(int width) {
+ mDefaultWidth = width;
+ final int threshold = (int) (width * SEARCH_DISTANCE);
+ mProximityThreshold = threshold * threshold;
+ }
+
+ /**
+ * Returns the total height of the keyboard
+ * @return the total height of the keyboard
+ */
+ public int getHeight() {
+ return mTotalHeight;
+ }
+
+ public void setHeight(int height) {
+ mTotalHeight = height;
+ }
+
+ public int getMinWidth() {
+ return mMinWidth;
+ }
+
+ public void setMinWidth(int minWidth) {
+ mMinWidth = minWidth;
+ }
+
+ public int getDisplayHeight() {
+ return mDisplayHeight;
+ }
+
+ public int getDisplayWidth() {
+ return mDisplayWidth;
+ }
+
+ public int getKeyboardHeight() {
+ return mKeyboardHeight;
+ }
+
+ public void setKeyboardHeight(int height) {
+ mKeyboardHeight = height;
+ }
+
+ public int getPopupKeyboardResId() {
+ return mPopupKeyboardResId;
+ }
+
+ public void setPopupKeyboardResId(int resId) {
+ mPopupKeyboardResId = resId;
+ }
+
+ public int getMaxPopupKeyboardColumn() {
+ return mMaxPopupColumn;
+ }
+
+ public void setMaxPopupKeyboardColumn(int column) {
+ mMaxPopupColumn = column;
+ }
+
+ public List<Key> getShiftKeys() {
+ return mShiftKeys;
+ }
+
+ public Map<Key, Drawable> getShiftedIcons() {
+ return mShiftedIcons;
+ }
+
+ public void enableShiftLock() {
+ for (final Key key : getShiftKeys()) {
+ mShiftLockEnabled.add(key);
+ mNormalShiftIcons.put(key, key.getIcon());
+ }
+ }
+
+ public boolean isShiftLockEnabled(Key key) {
+ return mShiftLockEnabled.contains(key);
+ }
+
+ public boolean setShiftLocked(boolean newShiftLockState) {
+ final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
+ for (final Key key : getShiftKeys()) {
+ key.mOn = newShiftLockState;
+ key.setIcon(newShiftLockState ? shiftedIcons.get(key) : mNormalShiftIcons.get(key));
+ }
+ mShiftState.setShiftLocked(newShiftLockState);
+ return true;
+ }
+
+ public boolean isShiftLocked() {
+ return mShiftState.isShiftLocked();
+ }
+
+ public boolean setShifted(boolean newShiftState) {
+ final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
+ for (final Key key : getShiftKeys()) {
+ if (!newShiftState && !mShiftState.isShiftLocked()) {
+ key.setIcon(mNormalShiftIcons.get(key));
+ } else if (newShiftState && !mShiftState.isShiftedOrShiftLocked()) {
+ key.setIcon(shiftedIcons.get(key));
+ }
+ }
+ return mShiftState.setShifted(newShiftState);
+ }
+
+ public boolean isShiftedOrShiftLocked() {
+ return mShiftState.isShiftedOrShiftLocked();
+ }
+
+ public void setAutomaticTemporaryUpperCase() {
+ setShifted(true);
+ mShiftState.setAutomaticTemporaryUpperCase();
+ }
+
+ public boolean isAutomaticTemporaryUpperCase() {
+ return isAlphaKeyboard() && mShiftState.isAutomaticTemporaryUpperCase();
+ }
+
+ public boolean isManualTemporaryUpperCase() {
+ return isAlphaKeyboard() && mShiftState.isManualTemporaryUpperCase();
+ }
+
+ public boolean isManualTemporaryUpperCaseFromAuto() {
+ return isAlphaKeyboard() && mShiftState.isManualTemporaryUpperCaseFromAuto();
+ }
+
+ public KeyboardShiftState getKeyboardShiftState() {
+ return mShiftState;
+ }
+
+ public boolean isAlphaKeyboard() {
+ return mId != null && mId.isAlphabetKeyboard();
+ }
+
+ public boolean isPhoneKeyboard() {
+ return mId != null && mId.isPhoneKeyboard();
+ }
+
+ public boolean isNumberKeyboard() {
+ return mId != null && mId.isNumberKeyboard();
+ }
+
+ private void computeNearestNeighbors() {
+ // Round-up so we don't have any pixels outside the grid
+ mCellWidth = (getMinWidth() + GRID_WIDTH - 1) / GRID_WIDTH;
+ mCellHeight = (getHeight() + GRID_HEIGHT - 1) / GRID_HEIGHT;
+ mGridNeighbors = new int[GRID_SIZE][];
+ final int[] indices = new int[mKeys.size()];
+ final int gridWidth = GRID_WIDTH * mCellWidth;
+ final int gridHeight = GRID_HEIGHT * mCellHeight;
+ final int threshold = mProximityThreshold;
+ for (int x = 0; x < gridWidth; x += mCellWidth) {
+ for (int y = 0; y < gridHeight; y += mCellHeight) {
+ final int centerX = x + mCellWidth / 2;
+ final int centerY = y + mCellHeight / 2;
+ int count = 0;
+ for (int i = 0; i < mKeys.size(); i++) {
+ final Key key = mKeys.get(i);
+ if (key.squaredDistanceToEdge(centerX, centerY) < threshold)
+ indices[count++] = i;
+ }
+ final int[] cell = new int[count];
+ System.arraycopy(indices, 0, cell, 0, count);
+ mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell;
+ }
+ }
+ }
+
+ public boolean isInside(Key key, int x, int y) {
+ return key.isOnKey(x, y);
+ }
+
+ /**
+ * Returns the indices of the keys that are closest to the given point.
+ * @param x the x-coordinate of the point
+ * @param y the y-coordinate of the point
+ * @return the array of integer indices for the nearest keys to the given point. If the given
+ * point is out of range, then an array of size zero is returned.
+ */
+ public int[] getNearestKeys(int x, int y) {
+ if (mGridNeighbors == null) computeNearestNeighbors();
+ if (x >= 0 && x < getMinWidth() && y >= 0 && y < getHeight()) {
+ int index = (y / mCellHeight) * GRID_WIDTH + (x / mCellWidth);
+ if (index < GRID_SIZE) {
+ return mGridNeighbors[index];
+ }
+ }
+ return EMPTY_INT_ARRAY;
+ }
+
+ private void loadKeyboard(Context context, int xmlLayoutResId) {
+ try {
+ KeyboardParser parser = new KeyboardParser(this, context.getResources());
+ parser.parseKeyboard(xmlLayoutResId);
+ // mMinWidth is the width of this keyboard which is maximum width of row.
+ mMinWidth = parser.getMaxRowWidth();
+ mTotalHeight = parser.getTotalHeight();
+ } catch (XmlPullParserException e) {
+ Log.w(TAG, "keyboard XML parse error: " + e);
+ throw new IllegalArgumentException(e);
+ } catch (IOException e) {
+ Log.w(TAG, "keyboard XML parse error: " + e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected static void setDefaultBounds(Drawable drawable) {
+ if (drawable != null)
+ drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
+ drawable.getIntrinsicHeight());
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
new file mode 100644
index 000000000..734a55a79
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+public interface KeyboardActionListener {
+
+ /**
+ * Called when the user presses a key. This is sent before the {@link #onCodeInput} is called.
+ * For keys that repeat, this is only called once.
+ *
+ * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid key,
+ * the value will be zero.
+ */
+ public void onPress(int primaryCode);
+
+ /**
+ * Called when the user releases a key. This is sent after the {@link #onCodeInput} is called.
+ * For keys that repeat, this is only called once.
+ *
+ * @param primaryCode the code of the key that was released
+ */
+ public void onRelease(int primaryCode);
+
+ /**
+ * Send a key code to the listener.
+ *
+ * @param primaryCode this is the code of the key that was pressed
+ * @param keyCodes the codes for all the possible alternative keys with the primary code being
+ * the first. If the primary key code is a single character such as an alphabet or
+ * number or symbol, the alternatives will include other characters that may be on
+ * the same key or adjacent keys. These codes are useful to correct for accidental
+ * presses of a key adjacent to the intended key.
+ * @param x x-coordinate pixel of touched event. If {@link #onCodeInput} is not called by
+ * {@link PointerTracker#onTouchEvent} or so, the value should be
+ * {@link #NOT_A_TOUCH_COORDINATE}.
+ * @param y y-coordinate pixel of touched event. If {@link #onCodeInput} is not called by
+ * {@link PointerTracker#onTouchEvent} or so, the value should be
+ * {@link #NOT_A_TOUCH_COORDINATE}.
+ */
+ public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y);
+
+ public static final int NOT_A_TOUCH_COORDINATE = -1;
+
+ /**
+ * Sends a sequence of characters to the listener.
+ *
+ * @param text the sequence of characters to be displayed.
+ */
+ public void onTextInput(CharSequence text);
+
+ /**
+ * Called when user released a finger outside any key.
+ */
+ public void onCancelInput();
+
+ /**
+ * Called when the user quickly moves the finger from up to down.
+ */
+ public void onSwipeDown();
+}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
new file mode 100644
index 000000000..db86740c3
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import android.view.inputmethod.EditorInfo;
+
+import java.util.Arrays;
+import java.util.Locale;
+
+/**
+ * Represents the parameters necessary to construct a new LatinKeyboard,
+ * which also serve as a unique identifier for each keyboard type.
+ */
+public class KeyboardId {
+ public static final int MODE_TEXT = 0;
+ public static final int MODE_URL = 1;
+ public static final int MODE_EMAIL = 2;
+ public static final int MODE_IM = 3;
+ public static final int MODE_WEB = 4;
+ public static final int MODE_PHONE = 5;
+ public static final int MODE_NUMBER = 6;
+
+ public final Locale mLocale;
+ public final int mOrientation;
+ public final int mMode;
+ public final int mXmlId;
+ public final int mColorScheme;
+ public final boolean mHasSettingsKey;
+ public final boolean mVoiceKeyEnabled;
+ public final boolean mHasVoiceKey;
+ public final int mImeOptions;
+ public final boolean mEnableShiftLock;
+ public final String mXmlName;
+
+ private final int mHashCode;
+
+ public KeyboardId(String xmlName, int xmlId, Locale locale, int orientation, int mode,
+ int colorScheme, boolean hasSettingsKey, boolean voiceKeyEnabled, boolean hasVoiceKey,
+ int imeOptions, boolean enableShiftLock) {
+ this.mLocale = locale;
+ this.mOrientation = orientation;
+ this.mMode = mode;
+ this.mXmlId = xmlId;
+ this.mColorScheme = colorScheme;
+ this.mHasSettingsKey = hasSettingsKey;
+ this.mVoiceKeyEnabled = voiceKeyEnabled;
+ this.mHasVoiceKey = hasVoiceKey;
+ // We are interested only in IME_MASK_ACTION enum value and IME_FLAG_NO_ENTER_ACTION.
+ this.mImeOptions = imeOptions
+ & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION);
+ this.mEnableShiftLock = enableShiftLock;
+ this.mXmlName = xmlName;
+
+ this.mHashCode = Arrays.hashCode(new Object[] {
+ locale,
+ orientation,
+ mode,
+ xmlId,
+ colorScheme,
+ hasSettingsKey,
+ voiceKeyEnabled,
+ hasVoiceKey,
+ imeOptions,
+ enableShiftLock,
+ });
+ }
+
+ public int getXmlId() {
+ return mXmlId;
+ }
+
+ public boolean isAlphabetKeyboard() {
+ return mXmlId == R.xml.kbd_qwerty;
+ }
+
+ public boolean isSymbolsKeyboard() {
+ return mXmlId == R.xml.kbd_symbols;
+ }
+
+ public boolean isPhoneKeyboard() {
+ return mMode == MODE_PHONE;
+ }
+
+ public boolean isNumberKeyboard() {
+ return mMode == MODE_NUMBER;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other instanceof KeyboardId && equals((KeyboardId) other);
+ }
+
+ boolean equals(KeyboardId other) {
+ return other.mLocale.equals(this.mLocale)
+ && other.mOrientation == this.mOrientation
+ && other.mMode == this.mMode
+ && other.mXmlId == this.mXmlId
+ && other.mColorScheme == this.mColorScheme
+ && other.mHasSettingsKey == this.mHasSettingsKey
+ && other.mVoiceKeyEnabled == this.mVoiceKeyEnabled
+ && other.mHasVoiceKey == this.mHasVoiceKey
+ && other.mImeOptions == this.mImeOptions
+ && other.mEnableShiftLock == this.mEnableShiftLock;
+ }
+
+ @Override
+ public int hashCode() {
+ return mHashCode;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("[%s.xml %s %s %s imeOptions=%s %s%s%s%s%s]",
+ mXmlName,
+ mLocale,
+ (mOrientation == 1 ? "port" : "land"),
+ modeName(mMode),
+ imeOptionsName(mImeOptions),
+ colorSchemeName(mColorScheme),
+ (mHasSettingsKey ? " hasSettingsKey" : ""),
+ (mVoiceKeyEnabled ? " voiceKeyEnabled" : ""),
+ (mHasVoiceKey ? " hasVoiceKey" : ""),
+ (mEnableShiftLock ? " enableShiftLock" : ""));
+ }
+
+ public static String modeName(int mode) {
+ switch (mode) {
+ case MODE_TEXT: return "text";
+ case MODE_URL: return "url";
+ case MODE_EMAIL: return "email";
+ case MODE_IM: return "im";
+ case MODE_WEB: return "web";
+ case MODE_PHONE: return "phone";
+ case MODE_NUMBER: return "number";
+ }
+ return null;
+ }
+
+ public static String colorSchemeName(int colorScheme) {
+ switch (colorScheme) {
+ case KeyboardView.COLOR_SCHEME_WHITE: return "white";
+ case KeyboardView.COLOR_SCHEME_BLACK: return "black";
+ }
+ return null;
+ }
+
+ public static String imeOptionsName(int imeOptions) {
+ if (imeOptions == -1) return null;
+ final int actionNo = imeOptions & EditorInfo.IME_MASK_ACTION;
+ final String action;
+ switch (actionNo) {
+ case EditorInfo.IME_ACTION_UNSPECIFIED: action = "actionUnspecified"; break;
+ case EditorInfo.IME_ACTION_NONE: action = "actionNone"; break;
+ case EditorInfo.IME_ACTION_GO: action = "actionGo"; break;
+ case EditorInfo.IME_ACTION_SEARCH: action = "actionSearch"; break;
+ case EditorInfo.IME_ACTION_SEND: action = "actionSend"; break;
+ case EditorInfo.IME_ACTION_DONE: action = "actionDone"; break;
+ case EditorInfo.IME_ACTION_PREVIOUS: action = "actionPrevious"; break;
+ default: action = "actionUnknown(" + actionNo + ")"; break;
+ }
+ if ((imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
+ return "flagNoEnterAction|" + action;
+ } else {
+ return action;
+ }
+ }
+}
+
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
new file mode 100644
index 000000000..e8324e5fd
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
@@ -0,0 +1,578 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.util.Log;
+import android.util.TypedValue;
+import android.util.Xml;
+import android.view.InflateException;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Parser for BaseKeyboard.
+ *
+ * This class parses Keyboard XML file and fill out keys in Keyboard.
+ * The Keyboard XML file looks like:
+ * <pre>
+ * &gt;!-- xml/keyboard.xml --&lt;
+ * &gt;Keyboard keyboard_attributes*&lt;
+ * &gt;!-- Keyboard Content --&lt;
+ * &gt;Row row_attributes*&lt;
+ * &gt;!-- Row Content --&lt;
+ * &gt;Key key_attributes* /&lt;
+ * &gt;Spacer horizontalGap="0.2in" /&lt;
+ * &gt;include keyboardLayout="@xml/other_keys"&lt;
+ * ...
+ * &gt;/Row&lt;
+ * &gt;include keyboardLayout="@xml/other_rows"&lt;
+ * ...
+ * &gt;/Keyboard&lt;
+ * </pre>
+ * The XML file which is included in other file must have &gt;merge&lt; as root element, such as:
+ * <pre>
+ * &gt;!-- xml/other_keys.xml --&lt;
+ * &gt;merge&lt;
+ * &gt;Key key_attributes* /&lt;
+ * ...
+ * &gt;/merge&lt;
+ * </pre>
+ * and
+ * <pre>
+ * &gt;!-- xml/other_rows.xml --&lt;
+ * &gt;merge&lt;
+ * &gt;Row row_attributes*&lt;
+ * &gt;Key key_attributes* /&lt;
+ * &gt;/Row&lt;
+ * ...
+ * &gt;/merge&lt;
+ * </pre>
+ * You can also use switch-case-default tags to select Rows and Keys.
+ * <pre>
+ * &gt;switch&lt;
+ * &gt;case case_attribute*&lt;
+ * &gt;!-- Any valid tags at switch position --&lt;
+ * &gt;/case&lt;
+ * ...
+ * &gt;default&lt;
+ * &gt;!-- Any valid tags at switch position --&lt;
+ * &gt;/default&lt;
+ * &gt;/switch&lt;
+ * </pre>
+ * You can declare Key style and specify styles within Key tags.
+ * <pre>
+ * &gt;switch&lt;
+ * &gt;case colorScheme="white"&lt;
+ * &gt;key-style styleName="shift-key" parentStyle="modifier-key"
+ * keyIcon="@drawable/sym_keyboard_shift"
+ * /&lt;
+ * &gt;/case&lt;
+ * &gt;case colorScheme="black"&lt;
+ * &gt;key-style styleName="shift-key" parentStyle="modifier-key"
+ * keyIcon="@drawable/sym_bkeyboard_shift"
+ * /&lt;
+ * &gt;/case&lt;
+ * &gt;/switch&lt;
+ * ...
+ * &gt;Key keyStyle="shift-key" ... /&lt;
+ * </pre>
+ */
+
+public class KeyboardParser {
+ private static final String TAG = "KeyboardParser";
+ private static final boolean DEBUG = false;
+
+ // Keyboard XML Tags
+ private static final String TAG_KEYBOARD = "Keyboard";
+ private static final String TAG_ROW = "Row";
+ private static final String TAG_KEY = "Key";
+ private static final String TAG_SPACER = "Spacer";
+ private static final String TAG_INCLUDE = "include";
+ private static final String TAG_MERGE = "merge";
+ private static final String TAG_SWITCH = "switch";
+ private static final String TAG_CASE = "case";
+ private static final String TAG_DEFAULT = "default";
+ public static final String TAG_KEY_STYLE = "key-style";
+
+ private final Keyboard mKeyboard;
+ private final Resources mResources;
+
+ private int mCurrentX = 0;
+ private int mCurrentY = 0;
+ private int mMaxRowWidth = 0;
+ private int mTotalHeight = 0;
+ private Row mCurrentRow = null;
+ private final KeyStyles mKeyStyles = new KeyStyles();
+
+ public KeyboardParser(Keyboard keyboard, Resources res) {
+ mKeyboard = keyboard;
+ mResources = res;
+ }
+
+ public int getMaxRowWidth() {
+ return mMaxRowWidth;
+ }
+
+ public int getTotalHeight() {
+ return mTotalHeight;
+ }
+
+ public void parseKeyboard(int resId) throws XmlPullParserException, IOException {
+ if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_KEYBOARD, mKeyboard.mId));
+ final XmlResourceParser parser = mResources.getXml(resId);
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_KEYBOARD.equals(tag)) {
+ parseKeyboardAttributes(parser);
+ parseKeyboardContent(parser, mKeyboard.getKeys());
+ break;
+ } else {
+ throw new IllegalStartTag(parser, TAG_KEYBOARD);
+ }
+ }
+ }
+ }
+
+ private void parseKeyboardAttributes(XmlResourceParser parser) {
+ final Keyboard keyboard = mKeyboard;
+ final TypedArray keyboardAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Key);
+ try {
+ final int displayHeight = keyboard.getDisplayHeight();
+ final int keyboardHeight = (int)keyboardAttr.getDimension(
+ R.styleable.Keyboard_keyboardHeight, displayHeight / 2);
+ final int maxKeyboardHeight = getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_maxKeyboardHeight, displayHeight, displayHeight / 2);
+ // Keyboard height will not exceed maxKeyboardHeight.
+ final int height = Math.min(keyboardHeight, maxKeyboardHeight);
+ final int width = keyboard.getDisplayWidth();
+
+ keyboard.setKeyboardHeight(height);
+ keyboard.setKeyWidth(getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_keyWidth, width, width / 10));
+ keyboard.setRowHeight(getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_rowHeight, height, 50));
+ keyboard.setHorizontalGap(getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_horizontalGap, width, 0));
+ keyboard.setVerticalGap(getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_verticalGap, height, 0));
+ keyboard.setPopupKeyboardResId(keyboardAttr.getResourceId(
+ R.styleable.Keyboard_popupKeyboardTemplate, 0));
+
+ keyboard.setMaxPopupKeyboardColumn(keyAttr.getInt(
+ R.styleable.Keyboard_Key_maxPopupKeyboardColumn, 5));
+ } finally {
+ keyAttr.recycle();
+ keyboardAttr.recycle();
+ }
+ }
+
+ private void parseKeyboardContent(XmlResourceParser parser, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_ROW.equals(tag)) {
+ Row row = new Row(mResources, mKeyboard, parser);
+ if (DEBUG) Log.d(TAG, String.format("<%s>", TAG_ROW));
+ if (keys != null)
+ startRow(row);
+ parseRowContent(parser, row, keys);
+ } else if (TAG_INCLUDE.equals(tag)) {
+ parseIncludeKeyboardContent(parser, keys);
+ } else if (TAG_SWITCH.equals(tag)) {
+ parseSwitchKeyboardContent(parser, keys);
+ } else if (TAG_KEY_STYLE.equals(tag)) {
+ parseKeyStyle(parser, keys);
+ } else {
+ throw new IllegalStartTag(parser, TAG_ROW);
+ }
+ } else if (event == XmlPullParser.END_TAG) {
+ final String tag = parser.getName();
+ if (TAG_KEYBOARD.equals(tag)) {
+ endKeyboard(mKeyboard.getVerticalGap());
+ break;
+ } else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag)
+ || TAG_MERGE.equals(tag)) {
+ if (DEBUG) Log.d(TAG, String.format("</%s>", tag));
+ break;
+ } else if (TAG_KEY_STYLE.equals(tag)) {
+ continue;
+ } else {
+ throw new IllegalEndTag(parser, TAG_ROW);
+ }
+ }
+ }
+ }
+
+ private void parseRowContent(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_KEY.equals(tag)) {
+ parseKey(parser, row, keys);
+ } else if (TAG_SPACER.equals(tag)) {
+ parseSpacer(parser, keys);
+ } else if (TAG_INCLUDE.equals(tag)) {
+ parseIncludeRowContent(parser, row, keys);
+ } else if (TAG_SWITCH.equals(tag)) {
+ parseSwitchRowContent(parser, row, keys);
+ } else if (TAG_KEY_STYLE.equals(tag)) {
+ parseKeyStyle(parser, keys);
+ } else {
+ throw new IllegalStartTag(parser, TAG_KEY);
+ }
+ } else if (event == XmlPullParser.END_TAG) {
+ final String tag = parser.getName();
+ if (TAG_ROW.equals(tag)) {
+ if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_ROW));
+ if (keys != null)
+ endRow();
+ break;
+ } else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag)
+ || TAG_MERGE.equals(tag)) {
+ if (DEBUG) Log.d(TAG, String.format("</%s>", tag));
+ break;
+ } else if (TAG_KEY_STYLE.equals(tag)) {
+ continue;
+ } else {
+ throw new IllegalEndTag(parser, TAG_KEY);
+ }
+ }
+ }
+ }
+
+ private void parseKey(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (keys == null) {
+ checkEndTag(TAG_KEY, parser);
+ } else {
+ Key key = new Key(mResources, row, mCurrentX, mCurrentY, parser, mKeyStyles);
+ if (DEBUG) Log.d(TAG, String.format("<%s keyLabel=%s code=%d popupCharacters=%s />",
+ TAG_KEY, key.mLabel, key.mCode,
+ Arrays.toString(key.mPopupCharacters)));
+ checkEndTag(TAG_KEY, parser);
+ keys.add(key);
+ if (key.mCode == Keyboard.CODE_SHIFT)
+ mKeyboard.getShiftKeys().add(key);
+ endKey(key);
+ }
+ }
+
+ private void parseSpacer(XmlResourceParser parser, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (keys == null) {
+ checkEndTag(TAG_SPACER, parser);
+ } else {
+ if (DEBUG) Log.d(TAG, String.format("<%s />", TAG_SPACER));
+ final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ final int gap = getDimensionOrFraction(a, R.styleable.Keyboard_horizontalGap,
+ mKeyboard.getDisplayWidth(), 0);
+ a.recycle();
+ checkEndTag(TAG_SPACER, parser);
+ setSpacer(gap);
+ }
+ }
+
+ private void parseIncludeKeyboardContent(XmlResourceParser parser, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ parseIncludeInternal(parser, null, keys);
+ }
+
+ private void parseIncludeRowContent(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ parseIncludeInternal(parser, row, keys);
+ }
+
+ private void parseIncludeInternal(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (keys == null) {
+ checkEndTag(TAG_INCLUDE, parser);
+ } else {
+ final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Include);
+ final int keyboardLayout = a.getResourceId(
+ R.styleable.Keyboard_Include_keyboardLayout, 0);
+ a.recycle();
+
+ checkEndTag(TAG_INCLUDE, parser);
+ if (keyboardLayout == 0)
+ throw new ParseException("No keyboardLayout attribute in <include/>", parser);
+ if (DEBUG) Log.d(TAG, String.format("<%s keyboardLayout=%s />",
+ TAG_INCLUDE, mResources.getResourceEntryName(keyboardLayout)));
+ parseMerge(mResources.getLayout(keyboardLayout), row, keys);
+ }
+ }
+
+ private void parseMerge(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_MERGE.equals(tag)) {
+ if (row == null) {
+ parseKeyboardContent(parser, keys);
+ } else {
+ parseRowContent(parser, row, keys);
+ }
+ break;
+ } else {
+ throw new ParseException(
+ "Included keyboard layout must have <merge> root element", parser);
+ }
+ }
+ }
+ }
+
+ private void parseSwitchKeyboardContent(XmlResourceParser parser, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ parseSwitchInternal(parser, null, keys);
+ }
+
+ private void parseSwitchRowContent(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ parseSwitchInternal(parser, row, keys);
+ }
+
+ private void parseSwitchInternal(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_SWITCH, mKeyboard.mId));
+ boolean selected = false;
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_CASE.equals(tag)) {
+ selected |= parseCase(parser, row, selected ? null : keys);
+ } else if (TAG_DEFAULT.equals(tag)) {
+ selected |= parseDefault(parser, row, selected ? null : keys);
+ } else {
+ throw new IllegalStartTag(parser, TAG_KEY);
+ }
+ } else if (event == XmlPullParser.END_TAG) {
+ final String tag = parser.getName();
+ if (TAG_SWITCH.equals(tag)) {
+ if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_SWITCH));
+ break;
+ } else {
+ throw new IllegalEndTag(parser, TAG_KEY);
+ }
+ }
+ }
+ }
+
+ private boolean parseCase(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ final boolean selected = parseCaseCondition(parser);
+ if (row == null) {
+ // Processing Rows.
+ parseKeyboardContent(parser, selected ? keys : null);
+ } else {
+ // Processing Keys.
+ parseRowContent(parser, row, selected ? keys : null);
+ }
+ return selected;
+ }
+
+ private boolean parseCaseCondition(XmlResourceParser parser) {
+ final KeyboardId id = mKeyboard.mId;
+ if (id == null)
+ return true;
+
+ final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Case);
+ final TypedArray viewAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.KeyboardView);
+ try {
+ final boolean modeMatched = matchInteger(a,
+ R.styleable.Keyboard_Case_mode, id.mMode);
+ final boolean settingsKeyMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_hasSettingsKey, id.mHasSettingsKey);
+ final boolean voiceEnabledMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_voiceKeyEnabled, id.mVoiceKeyEnabled);
+ final boolean voiceKeyMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_hasVoiceKey, id.mHasVoiceKey);
+ final boolean colorSchemeMatched = matchInteger(viewAttr,
+ R.styleable.KeyboardView_colorScheme, id.mColorScheme);
+ // As noted at KeyboardSwitcher.KeyboardId class, we are interested only in
+ // enum value masked by IME_MASK_ACTION and IME_FLAG_NO_ENTER_ACTION. So matching
+ // this attribute with id.mImeOptions as integer value is enough for our purpose.
+ final boolean imeOptionsMatched = matchInteger(a,
+ R.styleable.Keyboard_Case_imeOptions, id.mImeOptions);
+ final boolean selected = modeMatched && settingsKeyMatched && voiceEnabledMatched
+ && voiceKeyMatched && colorSchemeMatched && imeOptionsMatched;
+
+ if (DEBUG) Log.d(TAG, String.format("<%s%s%s%s%s%s%s> %s", TAG_CASE,
+ textAttr(KeyboardId.modeName(
+ a.getInt(R.styleable.Keyboard_Case_mode, -1)), "mode"),
+ textAttr(KeyboardId.colorSchemeName(
+ a.getInt(R.styleable.KeyboardView_colorScheme, -1)), "colorSchemeName"),
+ booleanAttr(a, R.styleable.Keyboard_Case_hasSettingsKey, "hasSettingsKey"),
+ booleanAttr(a, R.styleable.Keyboard_Case_voiceKeyEnabled, "voiceKeyEnabled"),
+ booleanAttr(a, R.styleable.Keyboard_Case_hasVoiceKey, "hasVoiceKey"),
+ textAttr(KeyboardId.imeOptionsName(
+ a.getInt(R.styleable.Keyboard_Case_imeOptions, -1)), "imeOptions"),
+ Boolean.toString(selected)));
+
+ return selected;
+ } finally {
+ a.recycle();
+ viewAttr.recycle();
+ }
+ }
+
+ private static boolean matchInteger(TypedArray a, int index, int value) {
+ // If <case> does not have "index" attribute, that means this <case> is wild-card for the
+ // attribute.
+ return !a.hasValue(index) || a.getInt(index, 0) == value;
+ }
+
+ private static boolean matchBoolean(TypedArray a, int index, boolean value) {
+ // If <case> does not have "index" attribute, that means this <case> is wild-card for the
+ // attribute.
+ return !a.hasValue(index) || a.getBoolean(index, false) == value;
+ }
+
+ private boolean parseDefault(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (DEBUG) Log.d(TAG, String.format("<%s>", TAG_DEFAULT));
+ if (row == null) {
+ parseKeyboardContent(parser, keys);
+ } else {
+ parseRowContent(parser, row, keys);
+ }
+ return true;
+ }
+
+ private void parseKeyStyle(XmlResourceParser parser, List<Key> keys) {
+ TypedArray keyStyleAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_KeyStyle);
+ TypedArray keyAttrs = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Key);
+ try {
+ if (!keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_styleName))
+ throw new ParseException("<" + TAG_KEY_STYLE
+ + "/> needs styleName attribute", parser);
+ if (keys != null)
+ mKeyStyles.parseKeyStyleAttributes(keyStyleAttr, keyAttrs, parser);
+ } finally {
+ keyStyleAttr.recycle();
+ keyAttrs.recycle();
+ }
+ }
+
+ private static void checkEndTag(String tag, XmlResourceParser parser)
+ throws XmlPullParserException, IOException {
+ if (parser.next() == XmlPullParser.END_TAG && tag.equals(parser.getName()))
+ return;
+ throw new NonEmptyTag(tag, parser);
+ }
+
+ private void startRow(Row row) {
+ mCurrentX = 0;
+ mCurrentRow = row;
+ }
+
+ private void endRow() {
+ if (mCurrentRow == null)
+ throw new InflateException("orphant end row tag");
+ mCurrentY += mCurrentRow.mDefaultHeight;
+ mCurrentRow = null;
+ }
+
+ private void endKey(Key key) {
+ mCurrentX += key.mGap + key.mWidth;
+ if (mCurrentX > mMaxRowWidth)
+ mMaxRowWidth = mCurrentX;
+ }
+
+ private void endKeyboard(int defaultVerticalGap) {
+ mTotalHeight = mCurrentY - defaultVerticalGap;
+ }
+
+ private void setSpacer(int gap) {
+ mCurrentX += gap;
+ }
+
+ public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) {
+ final TypedValue value = a.peekValue(index);
+ if (value == null)
+ return defValue;
+ if (value.type == TypedValue.TYPE_DIMENSION) {
+ return a.getDimensionPixelOffset(index, defValue);
+ } else if (value.type == TypedValue.TYPE_FRACTION) {
+ // Round it to avoid values like 47.9999 from getting truncated
+ return Math.round(a.getFraction(index, base, base, defValue));
+ }
+ return defValue;
+ }
+
+ @SuppressWarnings("serial")
+ public static class ParseException extends InflateException {
+ public ParseException(String msg, XmlResourceParser parser) {
+ super(msg + " at line " + parser.getLineNumber());
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private static class IllegalStartTag extends ParseException {
+ public IllegalStartTag(XmlResourceParser parser, String parent) {
+ super("Illegal start tag " + parser.getName() + " in " + parent, parser);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private static class IllegalEndTag extends ParseException {
+ public IllegalEndTag(XmlResourceParser parser, String parent) {
+ super("Illegal end tag " + parser.getName() + " in " + parent, parser);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private static class NonEmptyTag extends ParseException {
+ public NonEmptyTag(String tag, XmlResourceParser parser) {
+ super(tag + " must be empty tag", parser);
+ }
+ }
+
+ private static String textAttr(String value, String name) {
+ return value != null ? String.format(" %s=%s", name, value) : "";
+ }
+
+ private static String booleanAttr(TypedArray a, int index, String name) {
+ return a.hasValue(index) ? String.format(" %s=%s", name, a.getBoolean(index, false)) : "";
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java b/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
new file mode 100644
index 000000000..d5412791d
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import android.util.Log;
+
+public class KeyboardShiftState {
+ private static final String TAG = "KeyboardShiftState";
+ private static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE;
+
+ private static final int NORMAL = 0;
+ private static final int MANUAL_SHIFTED = 1;
+ private static final int MANUAL_SHIFTED_FROM_AUTO = 2;
+ private static final int AUTO_SHIFTED = 3;
+ private static final int SHIFT_LOCKED = 4;
+ private static final int SHIFT_LOCK_SHIFTED = 5;
+
+ private int mState = NORMAL;
+
+ public boolean setShifted(boolean newShiftState) {
+ final int oldState = mState;
+ if (newShiftState) {
+ switch (oldState) {
+ case NORMAL:
+ mState = MANUAL_SHIFTED;
+ break;
+ case AUTO_SHIFTED:
+ mState = MANUAL_SHIFTED_FROM_AUTO;
+ break;
+ case SHIFT_LOCKED:
+ mState = SHIFT_LOCK_SHIFTED;
+ break;
+ }
+ } else {
+ switch (oldState) {
+ case MANUAL_SHIFTED:
+ case MANUAL_SHIFTED_FROM_AUTO:
+ case AUTO_SHIFTED:
+ mState = NORMAL;
+ break;
+ case SHIFT_LOCK_SHIFTED:
+ mState = SHIFT_LOCKED;
+ break;
+ }
+ }
+ if (DEBUG)
+ Log.d(TAG, "setShifted(" + newShiftState + "): " + toString(oldState) + " > " + this);
+ return mState != oldState;
+ }
+
+ public void setShiftLocked(boolean newShiftLockState) {
+ final int oldState = mState;
+ if (newShiftLockState) {
+ switch (oldState) {
+ case NORMAL:
+ case MANUAL_SHIFTED:
+ case MANUAL_SHIFTED_FROM_AUTO:
+ case AUTO_SHIFTED:
+ mState = SHIFT_LOCKED;
+ break;
+ }
+ } else {
+ switch (oldState) {
+ case SHIFT_LOCKED:
+ case SHIFT_LOCK_SHIFTED:
+ mState = NORMAL;
+ break;
+ }
+ }
+ if (DEBUG)
+ Log.d(TAG, "setShiftLocked(" + newShiftLockState + "): " + toString(oldState)
+ + " > " + this);
+ }
+
+ public void setAutomaticTemporaryUpperCase() {
+ final int oldState = mState;
+ mState = AUTO_SHIFTED;
+ if (DEBUG)
+ Log.d(TAG, "setAutomaticTemporaryUpperCase: " + toString(oldState) + " > " + this);
+ }
+
+ public boolean isShiftedOrShiftLocked() {
+ return mState != NORMAL;
+ }
+
+ public boolean isShiftLocked() {
+ return mState == SHIFT_LOCKED || mState == SHIFT_LOCK_SHIFTED;
+ }
+
+ public boolean isAutomaticTemporaryUpperCase() {
+ return mState == AUTO_SHIFTED;
+ }
+
+ public boolean isManualTemporaryUpperCase() {
+ return mState == MANUAL_SHIFTED || mState == MANUAL_SHIFTED_FROM_AUTO
+ || mState == SHIFT_LOCK_SHIFTED;
+ }
+
+ public boolean isManualTemporaryUpperCaseFromAuto() {
+ return mState == MANUAL_SHIFTED_FROM_AUTO;
+ }
+
+ @Override
+ public String toString() {
+ return toString(mState);
+ }
+
+ private static String toString(int state) {
+ switch (state) {
+ case NORMAL: return "NORMAL";
+ case MANUAL_SHIFTED: return "MANUAL_SHIFTED";
+ case MANUAL_SHIFTED_FROM_AUTO: return "MANUAL_SHIFTED_FROM_AUTO";
+ case AUTO_SHIFTED: return "AUTO_SHIFTED";
+ case SHIFT_LOCKED: return "SHIFT_LOCKED";
+ case SHIFT_LOCK_SHIFTED: return "SHIFT_LOCK_SHIFTED";
+ default: return "UKNOWN";
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
new file mode 100644
index 000000000..2648ff3d4
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -0,0 +1,738 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.LatinIME;
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.Settings;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+import com.android.inputmethod.latin.Utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.util.Log;
+import android.view.InflateException;
+import android.view.inputmethod.InputMethodManager;
+
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.Locale;
+
+public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener {
+ private static final String TAG = "KeyboardSwitcher";
+ private static final boolean DEBUG = false;
+ public static final boolean DEBUG_STATE = false;
+
+ private static String sConfigDefaultKeyboardThemeId;
+ public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902";
+ private static final int[] KEYBOARD_THEMES = {
+ R.layout.input_basic,
+ R.layout.input_basic_highcontrast,
+ R.layout.input_stone_normal,
+ R.layout.input_stone_bold,
+ R.layout.input_gingerbread,
+ R.layout.input_honeycomb,
+ };
+
+ private SubtypeSwitcher mSubtypeSwitcher;
+ private SharedPreferences mPrefs;
+
+ private LatinKeyboardView mInputView;
+ private LatinIME mInputMethodService;
+
+ private ShiftKeyState mShiftKeyState = new ShiftKeyState("Shift");
+ private ModifierKeyState mSymbolKeyState = new ModifierKeyState("Symbol");
+
+ private KeyboardId mSymbolsId;
+ private KeyboardId mSymbolsShiftedId;
+
+ private KeyboardId mCurrentId;
+ private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboardCache =
+ new HashMap<KeyboardId, SoftReference<LatinKeyboard>>();
+
+ private int mMode = KeyboardId.MODE_TEXT; /* default value */
+ private int mImeOptions;
+ private boolean mIsSymbols;
+ /** mIsAutoCorrectionActive indicates that auto corrected word will be input instead of
+ * what user actually typed. */
+ private boolean mIsAutoCorrectionActive;
+ private boolean mVoiceKeyEnabled;
+ private boolean mVoiceButtonOnPrimary;
+
+ private static final int AUTO_MODE_SWITCH_STATE_ALPHA = 0;
+ private static final int AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN = 1;
+ private static final int AUTO_MODE_SWITCH_STATE_SYMBOL = 2;
+ // The following states are used only on the distinct multi-touch panel devices.
+ private static final int AUTO_MODE_SWITCH_STATE_MOMENTARY = 3;
+ private static final int AUTO_MODE_SWITCH_STATE_CHORDING = 4;
+ private int mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
+
+ // Indicates whether or not we have the settings key
+ private boolean mHasSettingsKey;
+ private static final int SETTINGS_KEY_MODE_AUTO = R.string.settings_key_mode_auto;
+ private static final int SETTINGS_KEY_MODE_ALWAYS_SHOW =
+ R.string.settings_key_mode_always_show;
+ // NOTE: No need to have SETTINGS_KEY_MODE_ALWAYS_HIDE here because it's not being referred to
+ // in the source code now.
+ // Default is SETTINGS_KEY_MODE_AUTO.
+ private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO;
+
+ private int mLayoutId;
+
+ private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();
+
+ public static KeyboardSwitcher getInstance() {
+ return sInstance;
+ }
+
+ private KeyboardSwitcher() {
+ // Intentional empty constructor for singleton.
+ }
+
+ public static void init(LatinIME ims, SharedPreferences prefs) {
+ sInstance.mInputMethodService = ims;
+ sInstance.mPrefs = prefs;
+ sInstance.mSubtypeSwitcher = SubtypeSwitcher.getInstance();
+
+ try {
+ sConfigDefaultKeyboardThemeId = ims.getString(
+ R.string.config_default_keyboard_theme_id);
+ sInstance.mLayoutId = Integer.valueOf(
+ prefs.getString(PREF_KEYBOARD_LAYOUT, sConfigDefaultKeyboardThemeId));
+ } catch (NumberFormatException e) {
+ sConfigDefaultKeyboardThemeId = "0";
+ sInstance.mLayoutId = 0;
+ }
+ prefs.registerOnSharedPreferenceChangeListener(sInstance);
+ }
+
+ private void makeSymbolsKeyboardIds() {
+ final Locale locale = mSubtypeSwitcher.getInputLocale();
+ final Resources res = mInputMethodService.getResources();
+ final int orientation = res.getConfiguration().orientation;
+ final int mode = mMode;
+ final int colorScheme = getColorScheme();
+ final boolean hasSettingsKey = mHasSettingsKey;
+ final boolean voiceKeyEnabled = mVoiceKeyEnabled;
+ final boolean hasVoiceKey = voiceKeyEnabled && !mVoiceButtonOnPrimary;
+ final int imeOptions = mImeOptions;
+ // Note: This comment is only applied for phone number keyboard layout.
+ // On non-xlarge device, "@integer/key_switch_alpha_symbol" key code is used to switch
+ // between "phone keyboard" and "phone symbols keyboard". But on xlarge device,
+ // "@integer/key_shift" key code is used for that purpose in order to properly display
+ // "more" and "locked more" key labels. To achieve these behavior, we should initialize
+ // mSymbolsId and mSymbolsShiftedId to "phone keyboard" and "phone symbols keyboard"
+ // respectively here for xlarge device's layout switching.
+ int xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone : R.xml.kbd_symbols;
+ mSymbolsId = new KeyboardId(
+ res.getResourceEntryName(xmlId), xmlId, locale, orientation, mode, colorScheme,
+ hasSettingsKey, voiceKeyEnabled, hasVoiceKey, imeOptions, true);
+ xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone_symbols : R.xml.kbd_symbols_shift;
+ mSymbolsShiftedId = new KeyboardId(
+ res.getResourceEntryName(xmlId), xmlId, locale, orientation, mode, colorScheme,
+ hasSettingsKey, voiceKeyEnabled, hasVoiceKey, imeOptions, true);
+ }
+
+ private boolean hasVoiceKey(boolean isSymbols) {
+ return mVoiceKeyEnabled && (isSymbols != mVoiceButtonOnPrimary);
+ }
+
+ public void loadKeyboard(int mode, int imeOptions, boolean voiceKeyEnabled,
+ boolean voiceButtonOnPrimary) {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
+ try {
+ if (mInputView == null) return;
+ final Keyboard oldKeyboard = mInputView.getKeyboard();
+ loadKeyboardInternal(mode, imeOptions, voiceKeyEnabled, voiceButtonOnPrimary, false);
+ final Keyboard newKeyboard = mInputView.getKeyboard();
+ if (newKeyboard.isAlphaKeyboard()) {
+ final boolean localeChanged = (oldKeyboard == null)
+ || !newKeyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
+ mInputMethodService.mHandler.startDisplayLanguageOnSpacebar(localeChanged);
+ }
+ } catch (RuntimeException e) {
+ Log.w(TAG, e);
+ LatinImeLogger.logOnException(mode + "," + imeOptions, e);
+ }
+ }
+
+ private void loadKeyboardInternal(int mode, int imeOptions, boolean voiceButtonEnabled,
+ boolean voiceButtonOnPrimary, boolean isSymbols) {
+ if (mInputView == null) return;
+
+ mMode = mode;
+ mImeOptions = imeOptions;
+ mVoiceKeyEnabled = voiceButtonEnabled;
+ mVoiceButtonOnPrimary = voiceButtonOnPrimary;
+ mIsSymbols = isSymbols;
+ // Update the settings key state because number of enabled IMEs could have been changed
+ mHasSettingsKey = getSettingsKeyMode(mPrefs, mInputMethodService);
+ final KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
+
+ final Keyboard oldKeyboard = mInputView.getKeyboard();
+ if (oldKeyboard != null && oldKeyboard.mId.equals(id))
+ return;
+
+ makeSymbolsKeyboardIds();
+ mCurrentId = id;
+ mInputView.setPreviewEnabled(mInputMethodService.getPopupOn());
+ mInputView.setKeyboard(getKeyboard(id));
+ }
+
+ private LatinKeyboard getKeyboard(KeyboardId id) {
+ final SoftReference<LatinKeyboard> ref = mKeyboardCache.get(id);
+ LatinKeyboard keyboard = (ref == null) ? null : ref.get();
+ if (keyboard == null) {
+ final Locale savedLocale = mSubtypeSwitcher.changeSystemLocale(
+ mSubtypeSwitcher.getInputLocale());
+
+ keyboard = new LatinKeyboard(mInputMethodService, id);
+
+ if (id.mEnableShiftLock) {
+ keyboard.enableShiftLock();
+ }
+
+ mKeyboardCache.put(id, new SoftReference<LatinKeyboard>(keyboard));
+ if (DEBUG)
+ Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": "
+ + ((ref == null) ? "LOAD" : "GCed") + " id=" + id);
+
+ mSubtypeSwitcher.changeSystemLocale(savedLocale);
+ } else if (DEBUG) {
+ Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": HIT id=" + id);
+ }
+
+ keyboard.onAutoCorrectionStateChanged(mIsAutoCorrectionActive);
+ keyboard.setShifted(false);
+ // If the cached keyboard had been switched to another keyboard while the language was
+ // displayed on its spacebar, it might have had arbitrary text fade factor. In such case,
+ // we should reset the text fade factor. It is also applicable to shortcut key.
+ keyboard.setSpacebarTextFadeFactor(0.0f, null);
+ keyboard.updateShortcutKey(mSubtypeSwitcher.isShortcutAvailable(), null);
+ return keyboard;
+ }
+
+ private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) {
+ final boolean hasVoiceKey = hasVoiceKey(isSymbols);
+ final int charColorId = getColorScheme();
+ final int xmlId;
+ final boolean enableShiftLock;
+
+ if (isSymbols) {
+ if (mode == KeyboardId.MODE_PHONE) {
+ xmlId = R.xml.kbd_phone_symbols;
+ } else if (mode == KeyboardId.MODE_NUMBER) {
+ // Note: MODE_NUMBER keyboard layout has no "switch alpha symbol" key.
+ xmlId = R.xml.kbd_number;
+ } else {
+ xmlId = R.xml.kbd_symbols;
+ }
+ enableShiftLock = false;
+ } else {
+ if (mode == KeyboardId.MODE_PHONE) {
+ xmlId = R.xml.kbd_phone;
+ enableShiftLock = false;
+ } else if (mode == KeyboardId.MODE_NUMBER) {
+ xmlId = R.xml.kbd_number;
+ enableShiftLock = false;
+ } else {
+ xmlId = R.xml.kbd_qwerty;
+ enableShiftLock = true;
+ }
+ }
+ final Resources res = mInputMethodService.getResources();
+ final int orientation = res.getConfiguration().orientation;
+ final Locale locale = mSubtypeSwitcher.getInputLocale();
+ return new KeyboardId(
+ res.getResourceEntryName(xmlId), xmlId, locale, orientation, mode, charColorId,
+ mHasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, imeOptions, enableShiftLock);
+ }
+
+ public int getKeyboardMode() {
+ return mMode;
+ }
+
+ public boolean isAlphabetMode() {
+ return mCurrentId != null && mCurrentId.isAlphabetKeyboard();
+ }
+
+ public boolean isInputViewShown() {
+ return mInputView != null && mInputView.isShown();
+ }
+
+ public boolean isKeyboardAvailable() {
+ if (mInputView != null)
+ return mInputView.getLatinKeyboard() != null;
+ return false;
+ }
+
+ private LatinKeyboard getLatinKeyboard() {
+ if (mInputView != null)
+ return mInputView.getLatinKeyboard();
+ return null;
+ }
+
+ public void setPreferredLetters(int[] frequencies) {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ latinKeyboard.setPreferredLetters(frequencies);
+ }
+
+ public void keyReleased() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ latinKeyboard.keyReleased();
+ }
+
+ public boolean isShiftedOrShiftLocked() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ return latinKeyboard.isShiftedOrShiftLocked();
+ return false;
+ }
+
+ public boolean isShiftLocked() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ return latinKeyboard.isShiftLocked();
+ return false;
+ }
+
+ public boolean isAutomaticTemporaryUpperCase() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ return latinKeyboard.isAutomaticTemporaryUpperCase();
+ return false;
+ }
+
+ public boolean isManualTemporaryUpperCase() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ return latinKeyboard.isManualTemporaryUpperCase();
+ return false;
+ }
+
+ private boolean isManualTemporaryUpperCaseFromAuto() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ return latinKeyboard.isManualTemporaryUpperCaseFromAuto();
+ return false;
+ }
+
+ private void setManualTemporaryUpperCase(boolean shifted) {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null) {
+ // On non-distinct multi touch panel device, we should also turn off the shift locked
+ // state when shift key is pressed to go to normal mode.
+ // On the other hand, on distinct multi touch panel device, turning off the shift locked
+ // state with shift key pressing is handled by onReleaseShift().
+ if (!hasDistinctMultitouch() && !shifted && latinKeyboard.isShiftLocked()) {
+ latinKeyboard.setShiftLocked(false);
+ }
+ if (latinKeyboard.setShifted(shifted)) {
+ mInputView.invalidateAllKeys();
+ }
+ }
+ }
+
+ private void setShiftLocked(boolean shiftLocked) {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null && latinKeyboard.setShiftLocked(shiftLocked)) {
+ mInputView.invalidateAllKeys();
+ }
+ }
+
+ /**
+ * Toggle keyboard shift state triggered by user touch event.
+ */
+ public void toggleShift() {
+ mInputMethodService.mHandler.cancelUpdateShiftState();
+ if (DEBUG_STATE)
+ Log.d(TAG, "toggleShift:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + mShiftKeyState);
+ if (isAlphabetMode()) {
+ setManualTemporaryUpperCase(!isShiftedOrShiftLocked());
+ } else {
+ toggleShiftInSymbol();
+ }
+ }
+
+ public void toggleCapsLock() {
+ mInputMethodService.mHandler.cancelUpdateShiftState();
+ if (DEBUG_STATE)
+ Log.d(TAG, "toggleCapsLock:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + mShiftKeyState);
+ if (isAlphabetMode()) {
+ if (isShiftLocked()) {
+ // Shift key is long pressed while caps lock state, we will toggle back to normal
+ // state. And mark as if shift key is released.
+ setShiftLocked(false);
+ mShiftKeyState.onRelease();
+ } else {
+ setShiftLocked(true);
+ }
+ }
+ }
+
+ private void setAutomaticTemporaryUpperCase() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null) {
+ latinKeyboard.setAutomaticTemporaryUpperCase();
+ mInputView.invalidateAllKeys();
+ }
+ }
+
+ /**
+ * Update keyboard shift state triggered by connected EditText status change.
+ */
+ public void updateShiftState() {
+ final ShiftKeyState shiftKeyState = mShiftKeyState;
+ if (DEBUG_STATE)
+ Log.d(TAG, "updateShiftState:"
+ + " autoCaps=" + mInputMethodService.getCurrentAutoCapsState()
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + shiftKeyState);
+ if (isAlphabetMode()) {
+ if (!isShiftLocked() && !shiftKeyState.isIgnoring()) {
+ if (shiftKeyState.isReleasing() && mInputMethodService.getCurrentAutoCapsState()) {
+ // Only when shift key is releasing, automatic temporary upper case will be set.
+ setAutomaticTemporaryUpperCase();
+ } else {
+ setManualTemporaryUpperCase(shiftKeyState.isMomentary());
+ }
+ }
+ } else {
+ // In symbol keyboard mode, we should clear shift key state because only alphabet
+ // keyboard has shift key.
+ shiftKeyState.onRelease();
+ }
+ }
+
+ public void changeKeyboardMode() {
+ if (DEBUG_STATE)
+ Log.d(TAG, "changeKeyboardMode:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + mShiftKeyState);
+ toggleKeyboardMode();
+ if (isShiftLocked() && isAlphabetMode())
+ setShiftLocked(true);
+ updateShiftState();
+ }
+
+ public void onPressShift() {
+ if (!isKeyboardAvailable())
+ return;
+ ShiftKeyState shiftKeyState = mShiftKeyState;
+ if (DEBUG_STATE)
+ Log.d(TAG, "onPressShift:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + shiftKeyState);
+ if (isAlphabetMode()) {
+ if (isShiftLocked()) {
+ // Shift key is pressed while caps lock state, we will treat this state as shifted
+ // caps lock state and mark as if shift key pressed while normal state.
+ shiftKeyState.onPress();
+ setManualTemporaryUpperCase(true);
+ } else if (isAutomaticTemporaryUpperCase()) {
+ // Shift key is pressed while automatic temporary upper case, we have to move to
+ // manual temporary upper case.
+ shiftKeyState.onPress();
+ setManualTemporaryUpperCase(true);
+ } else if (isShiftedOrShiftLocked()) {
+ // In manual upper case state, we just record shift key has been pressing while
+ // shifted state.
+ shiftKeyState.onPressOnShifted();
+ } else {
+ // In base layout, chording or manual temporary upper case mode is started.
+ shiftKeyState.onPress();
+ toggleShift();
+ }
+ } else {
+ // In symbol mode, just toggle symbol and symbol more keyboard.
+ shiftKeyState.onPress();
+ toggleShift();
+ }
+ }
+
+ public void onReleaseShift() {
+ if (!isKeyboardAvailable())
+ return;
+ ShiftKeyState shiftKeyState = mShiftKeyState;
+ if (DEBUG_STATE)
+ Log.d(TAG, "onReleaseShift:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + shiftKeyState);
+ if (isAlphabetMode()) {
+ if (shiftKeyState.isMomentary()) {
+ // After chording input while normal state.
+ toggleShift();
+ } else if (isShiftLocked() && !shiftKeyState.isIgnoring()) {
+ // Shift has been pressed without chording while caps lock state.
+ toggleCapsLock();
+ } else if (isShiftedOrShiftLocked() && shiftKeyState.isPressingOnShifted()) {
+ // Shift has been pressed without chording while shifted state.
+ toggleShift();
+ } else if (isManualTemporaryUpperCaseFromAuto() && shiftKeyState.isPressing()) {
+ // Shift has been pressed without chording while manual temporary upper case
+ // transited from automatic temporary upper case.
+ toggleShift();
+ }
+ }
+ shiftKeyState.onRelease();
+ }
+
+ public void onPressSymbol() {
+ if (DEBUG_STATE)
+ Log.d(TAG, "onPressSymbol:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " symbolKeyState=" + mSymbolKeyState);
+ changeKeyboardMode();
+ mSymbolKeyState.onPress();
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_MOMENTARY;
+ }
+
+ public void onReleaseSymbol() {
+ if (DEBUG_STATE)
+ Log.d(TAG, "onReleaseSymbol:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " symbolKeyState=" + mSymbolKeyState);
+ // Snap back to the previous keyboard mode if the user chords the mode change key and
+ // other key, then released the mode change key.
+ if (mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_CHORDING)
+ changeKeyboardMode();
+ mSymbolKeyState.onRelease();
+ }
+
+ public void onOtherKeyPressed() {
+ if (DEBUG_STATE)
+ Log.d(TAG, "onOtherKeyPressed:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + mShiftKeyState
+ + " symbolKeyState=" + mSymbolKeyState);
+ mShiftKeyState.onOtherKeyPressed();
+ mSymbolKeyState.onOtherKeyPressed();
+ }
+
+ public void onCancelInput() {
+ // Snap back to the previous keyboard mode if the user cancels sliding input.
+ if (mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY && getPointerCount() == 1)
+ changeKeyboardMode();
+ }
+
+ private void toggleShiftInSymbol() {
+ if (isAlphabetMode())
+ return;
+ final LatinKeyboard keyboard;
+ if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) {
+ mCurrentId = mSymbolsShiftedId;
+ keyboard = getKeyboard(mCurrentId);
+ // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To
+ // enable the indicator, we need to call enableShiftLock() and setShiftLocked(true).
+ // Thus we can keep the ALT key's Key.on value true while LatinKey.onRelease() is
+ // called.
+ keyboard.setShiftLocked(true);
+ } else {
+ mCurrentId = mSymbolsId;
+ keyboard = getKeyboard(mCurrentId);
+ // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the
+ // indicator, we need to call enableShiftLock() and setShiftLocked(false).
+ keyboard.setShifted(false);
+ }
+ mInputView.setKeyboard(keyboard);
+ }
+
+ public boolean isInMomentaryAutoModeSwitchState() {
+ return mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY;
+ }
+
+ public boolean isVibrateAndSoundFeedbackRequired() {
+ return mInputView == null || !mInputView.isInSlidingKeyInput();
+ }
+
+ private int getPointerCount() {
+ return mInputView == null ? 0 : mInputView.getPointerCount();
+ }
+
+ private void toggleKeyboardMode() {
+ loadKeyboardInternal(mMode, mImeOptions, mVoiceKeyEnabled, mVoiceButtonOnPrimary,
+ !mIsSymbols);
+ if (mIsSymbols) {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN;
+ } else {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
+ }
+ }
+
+ public boolean hasDistinctMultitouch() {
+ return mInputView != null && mInputView.hasDistinctMultitouch();
+ }
+
+ /**
+ * Updates state machine to figure out when to automatically snap back to the previous mode.
+ */
+ public void onKey(int key) {
+ if (DEBUG_STATE)
+ Log.d(TAG, "onKey: code=" + key + " autoModeSwitchState=" + mAutoModeSwitchState
+ + " pointers=" + getPointerCount());
+ switch (mAutoModeSwitchState) {
+ case AUTO_MODE_SWITCH_STATE_MOMENTARY:
+ // Only distinct multi touch devices can be in this state.
+ // On non-distinct multi touch devices, mode change key is handled by
+ // {@link LatinIME#onCodeInput}, not by {@link LatinIME#onPress} and
+ // {@link LatinIME#onRelease}. So, on such devices, {@link #mAutoModeSwitchState} starts
+ // from {@link #AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN}, or
+ // {@link #AUTO_MODE_SWITCH_STATE_ALPHA}, not from
+ // {@link #AUTO_MODE_SWITCH_STATE_MOMENTARY}.
+ if (key == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
+ // Detected only the mode change key has been pressed, and then released.
+ if (mIsSymbols) {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN;
+ } else {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
+ }
+ } else if (getPointerCount() == 1) {
+ // Snap back to the previous keyboard mode if the user pressed the mode change key
+ // and slid to other key, then released the finger.
+ // If the user cancels the sliding input, snapping back to the previous keyboard
+ // mode is handled by {@link #onCancelInput}.
+ changeKeyboardMode();
+ } else {
+ // Chording input is being started. The keyboard mode will be snapped back to the
+ // previous mode in {@link onReleaseSymbol} when the mode change key is released.
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_CHORDING;
+ }
+ break;
+ case AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN:
+ if (key != Keyboard.CODE_SPACE && key != Keyboard.CODE_ENTER && key >= 0) {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL;
+ }
+ break;
+ case AUTO_MODE_SWITCH_STATE_SYMBOL:
+ // Snap back to alpha keyboard mode if user types one or more non-space/enter
+ // characters followed by a space/enter.
+ if (key == Keyboard.CODE_ENTER || key == Keyboard.CODE_SPACE) {
+ changeKeyboardMode();
+ }
+ break;
+ }
+ }
+
+ public LatinKeyboardView getInputView() {
+ return mInputView;
+ }
+
+ public LatinKeyboardView onCreateInputView() {
+ createInputViewInternal(mLayoutId, true);
+ return mInputView;
+ }
+
+ private void createInputViewInternal(int newLayout, boolean forceReset) {
+ int layoutId = newLayout;
+ if (mLayoutId != layoutId || mInputView == null || forceReset) {
+ if (mInputView != null) {
+ mInputView.closing();
+ }
+ if (KEYBOARD_THEMES.length <= layoutId) {
+ layoutId = Integer.valueOf(sConfigDefaultKeyboardThemeId);
+ }
+
+ Utils.GCUtils.getInstance().reset();
+ boolean tryGC = true;
+ for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
+ try {
+ mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater(
+ ).inflate(KEYBOARD_THEMES[layoutId], null);
+ tryGC = false;
+ } catch (OutOfMemoryError e) {
+ Log.w(TAG, "load keyboard failed: " + e);
+ tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
+ mLayoutId + "," + layoutId, e);
+ } catch (InflateException e) {
+ Log.w(TAG, "load keyboard failed: " + e);
+ tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
+ mLayoutId + "," + layoutId, e);
+ }
+ }
+ mInputView.setOnKeyboardActionListener(mInputMethodService);
+ mLayoutId = layoutId;
+ }
+ }
+
+ private void postSetInputView() {
+ mInputMethodService.mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mInputView != null) {
+ mInputMethodService.setInputView(mInputView);
+ }
+ mInputMethodService.updateInputViewShown();
+ }
+ });
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ if (PREF_KEYBOARD_LAYOUT.equals(key)) {
+ final int layoutId = Integer.valueOf(
+ sharedPreferences.getString(key, sConfigDefaultKeyboardThemeId));
+ createInputViewInternal(layoutId, false);
+ postSetInputView();
+ } else if (Settings.PREF_SETTINGS_KEY.equals(key)) {
+ mHasSettingsKey = getSettingsKeyMode(sharedPreferences, mInputMethodService);
+ createInputViewInternal(mLayoutId, true);
+ postSetInputView();
+ }
+ }
+
+ private int getColorScheme() {
+ return (mInputView != null)
+ ? mInputView.getColorScheme() : KeyboardView.COLOR_SCHEME_WHITE;
+ }
+
+ public void onAutoCorrectionStateChanged(boolean isAutoCorrection) {
+ if (isAutoCorrection != mIsAutoCorrectionActive) {
+ LatinKeyboardView keyboardView = getInputView();
+ mIsAutoCorrectionActive = isAutoCorrection;
+ keyboardView.invalidateKey(((LatinKeyboard) keyboardView.getKeyboard())
+ .onAutoCorrectionStateChanged(isAutoCorrection));
+ }
+ }
+
+ private static boolean getSettingsKeyMode(SharedPreferences prefs, Context context) {
+ Resources resources = context.getResources();
+ final boolean showSettingsKeyOption = resources.getBoolean(
+ R.bool.config_enable_show_settings_key_option);
+ if (showSettingsKeyOption) {
+ final String settingsKeyMode = prefs.getString(Settings.PREF_SETTINGS_KEY,
+ resources.getString(DEFAULT_SETTINGS_KEY_MODE));
+ // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or
+ // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system
+ if (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))
+ || (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO))
+ && Utils.hasMultipleEnabledIMEsOrSubtypes(
+ ((InputMethodManager) context.getSystemService(
+ Context.INPUT_METHOD_SERVICE))))) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index 008d37202..19f1fa8ee 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -14,7 +14,11 @@
* limitations under the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -29,8 +33,6 @@ import android.graphics.Rect;
import android.graphics.Region.Op;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
-import android.inputmethodservice.Keyboard;
-import android.inputmethodservice.Keyboard.Key;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
@@ -43,132 +45,54 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
+import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.LinkedList;
import java.util.List;
import java.util.WeakHashMap;
/**
- * A view that renders a virtual {@link LatinKeyboard}. It handles rendering of keys and
- * detecting key presses and touch movements.
- *
- * TODO: References to LatinKeyboard in this class should be replaced with ones to its base class.
+ * A view that renders a virtual {@link Keyboard}. It handles rendering of keys and detecting key
+ * presses and touch movements.
*
- * @attr ref R.styleable#LatinKeyboardBaseView_keyBackground
- * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewLayout
- * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewOffset
- * @attr ref R.styleable#LatinKeyboardBaseView_labelTextSize
- * @attr ref R.styleable#LatinKeyboardBaseView_keyTextSize
- * @attr ref R.styleable#LatinKeyboardBaseView_keyTextColor
- * @attr ref R.styleable#LatinKeyboardBaseView_verticalCorrection
- * @attr ref R.styleable#LatinKeyboardBaseView_popupLayout
+ * @attr ref R.styleable#KeyboardView_keyBackground
+ * @attr ref R.styleable#KeyboardView_keyPreviewLayout
+ * @attr ref R.styleable#KeyboardView_keyPreviewOffset
+ * @attr ref R.styleable#KeyboardView_labelTextSize
+ * @attr ref R.styleable#KeyboardView_keyTextSize
+ * @attr ref R.styleable#KeyboardView_keyTextColor
+ * @attr ref R.styleable#KeyboardView_verticalCorrection
+ * @attr ref R.styleable#KeyboardView_popupLayout
*/
-public class LatinKeyboardBaseView extends View implements PointerTracker.UIProxy {
- private static final String TAG = "LatinKeyboardBaseView";
+public class KeyboardView extends View implements PointerTracker.UIProxy {
+ private static final String TAG = "KeyboardView";
private static final boolean DEBUG = false;
+ private static final boolean DEBUG_SHOW_ALIGN = false;
+ private static final boolean DEBUG_KEYBOARD_GRID = false;
- public static final int NOT_A_TOUCH_COORDINATE = -1;
-
- public interface OnKeyboardActionListener {
-
- /**
- * Called when the user presses a key. This is sent before the
- * {@link #onKey} is called. For keys that repeat, this is only
- * called once.
- *
- * @param primaryCode
- * the unicode of the key being pressed. If the touch is
- * not on a valid key, the value will be zero.
- */
- void onPress(int primaryCode);
-
- /**
- * Called when the user releases a key. This is sent after the
- * {@link #onKey} is called. For keys that repeat, this is only
- * called once.
- *
- * @param primaryCode
- * the code of the key that was released
- */
- void onRelease(int primaryCode);
-
- /**
- * Send a key press to the listener.
- *
- * @param primaryCode
- * this is the key that was pressed
- * @param keyCodes
- * the codes for all the possible alternative keys with
- * the primary code being the first. If the primary key
- * code is a single character such as an alphabet or
- * number or symbol, the alternatives will include other
- * characters that may be on the same key or adjacent
- * keys. These codes are useful to correct for
- * accidental presses of a key adjacent to the intended
- * key.
- * @param x
- * x-coordinate pixel of touched event. If onKey is not called by onTouchEvent,
- * the value should be NOT_A_TOUCH_COORDINATE.
- * @param y
- * y-coordinate pixel of touched event. If onKey is not called by onTouchEvent,
- * the value should be NOT_A_TOUCH_COORDINATE.
- */
- void onKey(int primaryCode, int[] keyCodes, int x, int y);
-
- /**
- * Sends a sequence of characters to the listener.
- *
- * @param text
- * the sequence of characters to be displayed.
- */
- void onText(CharSequence text);
-
- /**
- * Called when user released a finger outside any key.
- */
- void onCancel();
-
- /**
- * Called when the user quickly moves the finger from right to
- * left.
- */
- void swipeLeft();
-
- /**
- * Called when the user quickly moves the finger from left to
- * right.
- */
- void swipeRight();
-
- /**
- * Called when the user quickly moves the finger from up to down.
- */
- void swipeDown();
-
- /**
- * Called when the user quickly moves the finger from down to up.
- */
- void swipeUp();
- }
+ private static final boolean ENABLE_CAPSLOCK_BY_LONGPRESS = false;
+ private static final boolean ENABLE_CAPSLOCK_BY_DOUBLETAP = true;
+
+ public static final int COLOR_SCHEME_WHITE = 0;
+ public static final int COLOR_SCHEME_BLACK = 1;
// Timing constants
private final int mKeyRepeatInterval;
// Miscellaneous constants
- /* package */ static final int NOT_A_KEY = -1;
private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable };
- private static final int NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL = -1;
+ private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1;
// XML attribute
- private int mKeyTextSize;
+ private int mKeyLetterSize;
private int mKeyTextColor;
- private Typeface mKeyTextStyle = Typeface.DEFAULT;
+ private int mKeyTextColorDisabled;
+ private Typeface mKeyLetterStyle = Typeface.DEFAULT;
private int mLabelTextSize;
- private int mSymbolColorScheme = 0;
+ private int mColorScheme = COLOR_SCHEME_WHITE;
private int mShadowColor;
private float mShadowRadius;
private Drawable mKeyBackground;
@@ -182,15 +106,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// Main keyboard
private Keyboard mKeyboard;
private Key[] mKeys;
- // TODO this attribute should be gotten from Keyboard.
- private int mKeyboardVerticalGap;
// Key preview popup
+ private boolean mInForeground;
private TextView mPreviewText;
private PopupWindow mPreviewPopup;
private int mPreviewTextSizeLarge;
private int[] mOffsetInWindow;
- private int mOldPreviewKeyIndex = NOT_A_KEY;
+ private int mOldPreviewKeyIndex = KeyDetector.NOT_A_KEY;
private boolean mShowPreview = true;
private boolean mShowTouchPoints = true;
private int mPopupPreviewOffsetX;
@@ -202,7 +125,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// Popup mini keyboard
private PopupWindow mMiniKeyboardPopup;
- private LatinKeyboardBaseView mMiniKeyboard;
+ private KeyboardView mMiniKeyboardView;
private View mMiniKeyboardParent;
private final WeakHashMap<Key, View> mMiniKeyboardCache = new WeakHashMap<Key, View>();
private int mMiniKeyboardOriginX;
@@ -211,14 +134,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private int[] mWindowOffset;
private final float mMiniKeyboardSlideAllowance;
private int mMiniKeyboardTrackerId;
+ private final boolean mConfigShowMiniKeyboardAtTouchedPoint;
- /** Listener for {@link OnKeyboardActionListener}. */
- private OnKeyboardActionListener mKeyboardActionListener;
+ /** Listener for {@link KeyboardActionListener}. */
+ private KeyboardActionListener mKeyboardActionListener;
private final ArrayList<PointerTracker> mPointerTrackers = new ArrayList<PointerTracker>();
// TODO: Let the PointerTracker class manage this pointer queue
- private final PointerQueue mPointerQueue = new PointerQueue();
+ private final PointerTrackerQueue mPointerQueue = new PointerTrackerQueue();
private final boolean mHasDistinctMultitouch;
private int mOldPointerCount = 1;
@@ -248,9 +172,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private final Rect mClipRegion = new Rect(0, 0, 0, 0);
// This map caches key label text height in pixel as value and key label text size as map key.
private final HashMap<Integer, Integer> mTextHeightCache = new HashMap<Integer, Integer>();
- // Distance from horizontal center of the key, proportional to key label text height.
- private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR = 0.55f;
- private final String KEY_LABEL_HEIGHT_REFERENCE_CHAR = "H";
+ // Distance from horizontal center of the key, proportional to key label text height and width.
+ private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER = 0.45f;
+ private final float KEY_LABEL_VERTICAL_PADDING_FACTOR = 1.60f;
+ private final String KEY_LABEL_REFERENCE_CHAR = "H";
+ private final int KEY_LABEL_OPTION_ALIGN_LEFT = 1;
+ private final int KEY_LABEL_OPTION_ALIGN_RIGHT = 2;
+ private final int KEY_LABEL_OPTION_ALIGN_BOTTOM = 8;
+ private final int KEY_LABEL_OPTION_FONT_NORMAL = 16;
+ private final int mKeyLabelHorizontalPadding;
private final UIHandler mHandler = new UIHandler();
@@ -259,6 +189,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private static final int MSG_DISMISS_PREVIEW = 2;
private static final int MSG_REPEAT_KEY = 3;
private static final int MSG_LONGPRESS_KEY = 4;
+ private static final int MSG_LONGPRESS_SHIFT_KEY = 5;
private boolean mInKeyRepeat;
@@ -282,6 +213,11 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
openPopupIfRequired(msg.arg1, tracker);
break;
}
+ case MSG_LONGPRESS_SHIFT_KEY: {
+ final PointerTracker tracker = (PointerTracker)msg.obj;
+ onLongPressShiftKey(tracker);
+ break;
+ }
}
}
@@ -325,17 +261,26 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
public void startLongPressTimer(long delay, int keyIndex, PointerTracker tracker) {
- removeMessages(MSG_LONGPRESS_KEY);
+ cancelLongPressTimers();
sendMessageDelayed(obtainMessage(MSG_LONGPRESS_KEY, keyIndex, 0, tracker), delay);
}
- public void cancelLongPressTimer() {
+ public void startLongPressShiftTimer(long delay, int keyIndex, PointerTracker tracker) {
+ cancelLongPressTimers();
+ if (ENABLE_CAPSLOCK_BY_LONGPRESS) {
+ sendMessageDelayed(
+ obtainMessage(MSG_LONGPRESS_SHIFT_KEY, keyIndex, 0, tracker), delay);
+ }
+ }
+
+ public void cancelLongPressTimers() {
removeMessages(MSG_LONGPRESS_KEY);
+ removeMessages(MSG_LONGPRESS_SHIFT_KEY);
}
public void cancelKeyTimers() {
cancelKeyRepeatTimer();
- cancelLongPressTimer();
+ cancelLongPressTimers();
}
public void cancelAllMessages() {
@@ -345,73 +290,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
}
- static class PointerQueue {
- private LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>();
-
- public void add(PointerTracker tracker) {
- mQueue.add(tracker);
- }
-
- public int lastIndexOf(PointerTracker tracker) {
- LinkedList<PointerTracker> queue = mQueue;
- for (int index = queue.size() - 1; index >= 0; index--) {
- PointerTracker t = queue.get(index);
- if (t == tracker)
- return index;
- }
- return -1;
- }
-
- public void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) {
- LinkedList<PointerTracker> queue = mQueue;
- int oldestPos = 0;
- for (PointerTracker t = queue.get(oldestPos); t != tracker; t = queue.get(oldestPos)) {
- if (t.isModifier()) {
- oldestPos++;
- } else {
- t.onUpEvent(t.getLastX(), t.getLastY(), eventTime);
- t.setAlreadyProcessed();
- queue.remove(oldestPos);
- }
- }
- }
-
- public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
- for (PointerTracker t : mQueue) {
- if (t == tracker)
- continue;
- t.onUpEvent(t.getLastX(), t.getLastY(), eventTime);
- t.setAlreadyProcessed();
- }
- mQueue.clear();
- if (tracker != null)
- mQueue.add(tracker);
- }
-
- public void remove(PointerTracker tracker) {
- mQueue.remove(tracker);
- }
-
- public boolean isInSlidingKeyInput() {
- for (final PointerTracker tracker : mQueue) {
- if (tracker.isInSlidingKeyInput())
- return true;
- }
- return false;
- }
- }
-
- public LatinKeyboardBaseView(Context context, AttributeSet attrs) {
+ public KeyboardView(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.keyboardViewStyle);
}
- public LatinKeyboardBaseView(Context context, AttributeSet attrs, int defStyle) {
+ public KeyboardView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- TypedArray a = context.obtainStyledAttributes(
- attrs, R.styleable.LatinKeyboardBaseView, defStyle, R.style.LatinKeyboardBaseView);
- LayoutInflater inflate =
- (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.KeyboardView, defStyle, R.style.KeyboardView);
int previewLayout = 0;
int keyTextSize = 0;
@@ -421,63 +308,54 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
int attr = a.getIndex(i);
switch (attr) {
- case R.styleable.LatinKeyboardBaseView_keyBackground:
+ case R.styleable.KeyboardView_keyBackground:
mKeyBackground = a.getDrawable(attr);
break;
- case R.styleable.LatinKeyboardBaseView_keyHysteresisDistance:
+ case R.styleable.KeyboardView_keyHysteresisDistance:
mKeyHysteresisDistance = a.getDimensionPixelOffset(attr, 0);
break;
- case R.styleable.LatinKeyboardBaseView_verticalCorrection:
+ case R.styleable.KeyboardView_verticalCorrection:
mVerticalCorrection = a.getDimensionPixelOffset(attr, 0);
break;
- case R.styleable.LatinKeyboardBaseView_keyPreviewLayout:
+ case R.styleable.KeyboardView_keyPreviewLayout:
previewLayout = a.getResourceId(attr, 0);
break;
- case R.styleable.LatinKeyboardBaseView_keyPreviewOffset:
+ case R.styleable.KeyboardView_keyPreviewOffset:
mPreviewOffset = a.getDimensionPixelOffset(attr, 0);
break;
- case R.styleable.LatinKeyboardBaseView_keyPreviewHeight:
+ case R.styleable.KeyboardView_keyPreviewHeight:
mPreviewHeight = a.getDimensionPixelSize(attr, 80);
break;
- case R.styleable.LatinKeyboardBaseView_keyTextSize:
- mKeyTextSize = a.getDimensionPixelSize(attr, 18);
+ case R.styleable.KeyboardView_keyLetterSize:
+ mKeyLetterSize = a.getDimensionPixelSize(attr, 18);
break;
- case R.styleable.LatinKeyboardBaseView_keyTextColor:
+ case R.styleable.KeyboardView_keyTextColor:
mKeyTextColor = a.getColor(attr, 0xFF000000);
break;
- case R.styleable.LatinKeyboardBaseView_labelTextSize:
+ case R.styleable.KeyboardView_keyTextColorDisabled:
+ mKeyTextColorDisabled = a.getColor(attr, 0xFF000000);
+ break;
+ case R.styleable.KeyboardView_labelTextSize:
mLabelTextSize = a.getDimensionPixelSize(attr, 14);
break;
- case R.styleable.LatinKeyboardBaseView_popupLayout:
+ case R.styleable.KeyboardView_popupLayout:
mPopupLayout = a.getResourceId(attr, 0);
break;
- case R.styleable.LatinKeyboardBaseView_shadowColor:
+ case R.styleable.KeyboardView_shadowColor:
mShadowColor = a.getColor(attr, 0);
break;
- case R.styleable.LatinKeyboardBaseView_shadowRadius:
+ case R.styleable.KeyboardView_shadowRadius:
mShadowRadius = a.getFloat(attr, 0f);
break;
// TODO: Use Theme (android.R.styleable.Theme_backgroundDimAmount)
- case R.styleable.LatinKeyboardBaseView_backgroundDimAmount:
+ case R.styleable.KeyboardView_backgroundDimAmount:
mBackgroundDimAmount = a.getFloat(attr, 0.5f);
break;
- //case android.R.styleable.
- case R.styleable.LatinKeyboardBaseView_keyTextStyle:
- int textStyle = a.getInt(attr, 0);
- switch (textStyle) {
- case 0:
- mKeyTextStyle = Typeface.DEFAULT;
- break;
- case 1:
- mKeyTextStyle = Typeface.DEFAULT_BOLD;
- break;
- default:
- mKeyTextStyle = Typeface.defaultFromStyle(textStyle);
- break;
- }
+ case R.styleable.KeyboardView_keyLetterStyle:
+ mKeyLetterStyle = Typeface.defaultFromStyle(a.getInt(attr, Typeface.NORMAL));
break;
- case R.styleable.LatinKeyboardBaseView_symbolColorScheme:
- mSymbolColorScheme = a.getInt(attr, 0);
+ case R.styleable.KeyboardView_colorScheme:
+ mColorScheme = a.getInt(attr, COLOR_SCHEME_WHITE);
break;
}
}
@@ -486,7 +364,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mPreviewPopup = new PopupWindow(context);
if (previewLayout != 0) {
- mPreviewText = (TextView) inflate.inflate(previewLayout, null);
+ mPreviewText = (TextView) LayoutInflater.from(context).inflate(previewLayout, null);
mPreviewTextSizeLarge = (int) res.getDimension(R.dimen.key_preview_text_size_large);
mPreviewPopup.setContentView(mPreviewText);
mPreviewPopup.setBackgroundDrawable(null);
@@ -497,11 +375,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mPreviewPopup.setAnimationStyle(R.style.KeyPreviewAnimation);
mDelayBeforePreview = res.getInteger(R.integer.config_delay_before_preview);
mDelayAfterPreview = res.getInteger(R.integer.config_delay_after_preview);
+ mKeyLabelHorizontalPadding = (int)res.getDimension(
+ R.dimen.key_label_horizontal_alignment_padding);
mMiniKeyboardParent = this;
mMiniKeyboardPopup = new PopupWindow(context);
mMiniKeyboardPopup.setBackgroundDrawable(null);
mMiniKeyboardPopup.setAnimationStyle(R.style.MiniKeyboardAnimation);
+ // Allow popup window to be drawn off the screen.
+ mMiniKeyboardPopup.setClippingEnabled(false);
mPaint = new Paint();
mPaint.setAntiAlias(true);
@@ -516,43 +398,65 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// TODO: Refer frameworks/base/core/res/res/values/config.xml
mDisambiguateSwipe = res.getBoolean(R.bool.config_swipeDisambiguation);
mMiniKeyboardSlideAllowance = res.getDimension(R.dimen.mini_keyboard_slide_allowance);
+ mConfigShowMiniKeyboardAtTouchedPoint = res.getBoolean(
+ R.bool.config_show_mini_keyboard_at_touched_point);
GestureDetector.SimpleOnGestureListener listener =
new GestureDetector.SimpleOnGestureListener() {
+ private boolean mProcessingShiftDoubleTapEvent = false;
+
@Override
public boolean onFling(MotionEvent me1, MotionEvent me2, float velocityX,
float velocityY) {
final float absX = Math.abs(velocityX);
final float absY = Math.abs(velocityY);
- float deltaX = me2.getX() - me1.getX();
float deltaY = me2.getY() - me1.getY();
- int travelX = getWidth() / 2; // Half the keyboard width
int travelY = getHeight() / 2; // Half the keyboard height
mSwipeTracker.computeCurrentVelocity(1000);
- final float endingVelocityX = mSwipeTracker.getXVelocity();
final float endingVelocityY = mSwipeTracker.getYVelocity();
- if (velocityX > mSwipeThreshold && absY < absX && deltaX > travelX) {
- if (mDisambiguateSwipe && endingVelocityX >= velocityX / 4) {
- swipeRight();
- return true;
- }
- } else if (velocityX < -mSwipeThreshold && absY < absX && deltaX < -travelX) {
- if (mDisambiguateSwipe && endingVelocityX <= velocityX / 4) {
- swipeLeft();
+ if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) {
+ if (mDisambiguateSwipe && endingVelocityY >= velocityY / 4) {
+ onSwipeDown();
return true;
}
- } else if (velocityY < -mSwipeThreshold && absX < absY && deltaY < -travelY) {
- if (mDisambiguateSwipe && endingVelocityY <= velocityY / 4) {
- swipeUp();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onDoubleTap(MotionEvent firstDown) {
+ if (ENABLE_CAPSLOCK_BY_DOUBLETAP && mKeyboard instanceof LatinKeyboard
+ && ((LatinKeyboard) mKeyboard).isAlphaKeyboard()) {
+ final int pointerIndex = firstDown.getActionIndex();
+ final int id = firstDown.getPointerId(pointerIndex);
+ final PointerTracker tracker = getPointerTracker(id);
+ // If the first down event is on shift key.
+ if (tracker.isOnShiftKey((int)firstDown.getX(), (int)firstDown.getY())) {
+ mProcessingShiftDoubleTapEvent = true;
return true;
}
- } else if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) {
- if (mDisambiguateSwipe && endingVelocityY >= velocityY / 4) {
- swipeDown();
+ }
+ mProcessingShiftDoubleTapEvent = false;
+ return false;
+ }
+
+ @Override
+ public boolean onDoubleTapEvent(MotionEvent secondTap) {
+ if (mProcessingShiftDoubleTapEvent
+ && secondTap.getAction() == MotionEvent.ACTION_DOWN) {
+ final MotionEvent secondDown = secondTap;
+ final int pointerIndex = secondDown.getActionIndex();
+ final int id = secondDown.getPointerId(pointerIndex);
+ final PointerTracker tracker = getPointerTracker(id);
+ // If the second down event is also on shift key.
+ if (tracker.isOnShiftKey((int)secondDown.getX(), (int)secondDown.getY())) {
+ onDoubleTapShiftKey(tracker);
return true;
}
+ // Otherwise these events should not be handled as double tap.
+ mProcessingShiftDoubleTapEvent = false;
}
- return false;
+ return mProcessingShiftDoubleTapEvent;
}
};
@@ -565,7 +469,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval);
}
- public void setOnKeyboardActionListener(OnKeyboardActionListener listener) {
+ public void setOnKeyboardActionListener(KeyboardActionListener listener) {
mKeyboardActionListener = listener;
for (PointerTracker tracker : mPointerTrackers) {
tracker.setOnKeyboardActionListener(listener);
@@ -573,10 +477,10 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
/**
- * Returns the {@link OnKeyboardActionListener} object.
+ * Returns the {@link KeyboardActionListener} object.
* @return the listener attached to this keyboard
*/
- protected OnKeyboardActionListener getOnKeyboardActionListener() {
+ protected KeyboardActionListener getOnKeyboardActionListener() {
return mKeyboardActionListener;
}
@@ -598,15 +502,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
LatinImeLogger.onSetKeyboard(keyboard);
mKeys = mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(),
-getPaddingTop() + mVerticalCorrection);
- mKeyboardVerticalGap = (int)getResources().getDimension(R.dimen.key_bottom_gap);
for (PointerTracker tracker : mPointerTrackers) {
- tracker.setKeyboard(mKeys, mKeyHysteresisDistance);
+ tracker.setKeyboard(keyboard, mKeys, mKeyHysteresisDistance);
}
requestLayout();
// Hint to reallocate the buffer if the size changed
mKeyboardChanged = true;
invalidateAllKeys();
- computeProximityThreshold(keyboard);
+ computeProximityThreshold(keyboard, mKeys);
mMiniKeyboardCache.clear();
}
@@ -623,39 +526,12 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
* Return whether the device has distinct multi-touch panel.
* @return true if the device has distinct multi-touch panel.
*/
+ @Override
public boolean hasDistinctMultitouch() {
return mHasDistinctMultitouch;
}
/**
- * Sets the state of the shift key of the keyboard, if any.
- * @param shifted whether or not to enable the state of the shift key
- * @return true if the shift key state changed, false if there was no change
- */
- public boolean setShifted(boolean shifted) {
- if (mKeyboard != null) {
- if (mKeyboard.setShifted(shifted)) {
- // The whole keyboard probably needs to be redrawn
- invalidateAllKeys();
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns the state of the shift key of the keyboard, if any.
- * @return true if the shift is in a pressed state, false otherwise. If there is
- * no shift key on the keyboard or there is no keyboard attached, it returns false.
- */
- public boolean isShifted() {
- if (mKeyboard != null) {
- return mKeyboard.isShifted();
- }
- return false;
- }
-
- /**
* Enables or disables the key feedback popup. This is a popup that shows a magnified
* version of the depressed key. By default the preview is enabled.
* @param previewEnabled whether or not to enable the key feedback popup
@@ -674,12 +550,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return mShowPreview;
}
- public int getSymbolColorScheme() {
- return mSymbolColorScheme;
- }
-
- public void setPopupParent(View v) {
- mMiniKeyboardParent = v;
+ public int getColorScheme() {
+ return mColorScheme;
}
public void setPopupOffset(int x, int y) {
@@ -689,7 +561,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
/**
- * When enabled, calls to {@link OnKeyboardActionListener#onKey} will include key
+ * When enabled, calls to {@link KeyboardActionListener#onCodeInput} will include key
* codes for adjacent keys. When disabled, only the primary key code will be
* reported.
* @param enabled whether or not the proximity correction is enabled
@@ -706,9 +578,9 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
protected CharSequence adjustCase(CharSequence label) {
- if (mKeyboard.isShifted() && label != null && label.length() < 3
+ if (mKeyboard.isShiftedOrShiftLocked() && label != null && label.length() < 3
&& Character.isLowerCase(label.charAt(0))) {
- label = label.toString().toUpperCase();
+ return label.toString().toUpperCase();
}
return label;
}
@@ -730,23 +602,27 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
/**
- * Compute the average distance between adjacent keys (horizontally and vertically)
- * and square it to get the proximity threshold. We use a square here and in computing
- * the touch distance from a key's center to avoid taking a square root.
+ * Compute the most common key width and use it as proximity key detection threshold.
* @param keyboard
+ * @param keys
*/
- private void computeProximityThreshold(Keyboard keyboard) {
- if (keyboard == null) return;
- final Key[] keys = mKeys;
- if (keys == null) return;
- int length = keys.length;
- int dimensionSum = 0;
- for (int i = 0; i < length; i++) {
- Key key = keys[i];
- dimensionSum += Math.min(key.width, key.height + mKeyboardVerticalGap) + key.gap;
+ private void computeProximityThreshold(Keyboard keyboard, Key[] keys) {
+ if (keyboard == null || keys == null || keys.length == 0) return;
+ final HashMap<Integer, Integer> histogram = new HashMap<Integer, Integer>();
+ int maxCount = 0;
+ int mostCommonWidth = 0;
+ for (Key key : keys) {
+ final Integer width = key.mWidth + key.mGap;
+ Integer count = histogram.get(width);
+ if (count == null)
+ count = 0;
+ histogram.put(width, ++count);
+ if (count > maxCount) {
+ maxCount = count;
+ mostCommonWidth = width;
+ }
}
- if (dimensionSum < 0 || length == 0) return;
- mKeyDetector.setProximityThreshold((int) (dimensionSum * 1.4f / length));
+ mKeyDetector.setProximityThreshold(mostCommonWidth);
}
@Override
@@ -765,6 +641,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
canvas.drawBitmap(mBuffer, 0, 0, null);
}
+ @SuppressWarnings("unused")
private void onBufferDraw() {
if (mBuffer == null || mKeyboardChanged) {
if (mBuffer == null || mKeyboardChanged &&
@@ -791,16 +668,16 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
final int kbdPaddingTop = getPaddingTop();
final Key[] keys = mKeys;
final Key invalidKey = mInvalidatedKey;
+ final boolean isManualTemporaryUpperCase = mKeyboard.isManualTemporaryUpperCase();
- paint.setColor(mKeyTextColor);
boolean drawSingleKey = false;
if (invalidKey != null && canvas.getClipBounds(clipRegion)) {
// TODO we should use Rect.inset and Rect.contains here.
// Is clipRegion completely contained within the invalidated key?
- if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left &&
- invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top &&
- invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right &&
- invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) {
+ if (invalidKey.mX + kbdPaddingLeft - 1 <= clipRegion.left &&
+ invalidKey.mY + kbdPaddingTop - 1 <= clipRegion.top &&
+ invalidKey.mX + invalidKey.mWidth + kbdPaddingLeft + 1 >= clipRegion.right &&
+ invalidKey.mY + invalidKey.mHeight + kbdPaddingTop + 1 >= clipRegion.bottom) {
drawSingleKey = true;
}
}
@@ -815,80 +692,128 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
keyBackground.setState(drawableState);
// Switch the character to uppercase if shift is pressed
- String label = key.label == null? null : adjustCase(key.label).toString();
+ String label = key.mLabel == null? null : adjustCase(key.mLabel).toString();
final Rect bounds = keyBackground.getBounds();
- if (key.width != bounds.right || key.height != bounds.bottom) {
- keyBackground.setBounds(0, 0, key.width, key.height);
+ if (key.mWidth != bounds.right || key.mHeight != bounds.bottom) {
+ keyBackground.setBounds(0, 0, key.mWidth, key.mHeight);
}
- canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop);
+ canvas.translate(key.mX + kbdPaddingLeft, key.mY + kbdPaddingTop);
keyBackground.draw(canvas);
- boolean shouldDrawIcon = true;
+ final int rowHeight = padding.top + key.mHeight;
+ // Draw key label
if (label != null) {
// For characters, use large font. For labels like "Done", use small font.
- final int labelSize;
- if (label.length() > 1 && key.codes.length < 2) {
- labelSize = mLabelTextSize;
- paint.setTypeface(Typeface.DEFAULT_BOLD);
+ final int labelSize = getLabelSizeAndSetPaint(label, key.mLabelOption, paint);
+ final int labelCharHeight = getLabelCharHeight(labelSize, paint);
+
+ // Vertical label text alignment.
+ final float baseline;
+ if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_BOTTOM) != 0) {
+ baseline = key.mHeight -
+ + labelCharHeight * KEY_LABEL_VERTICAL_PADDING_FACTOR;
+ if (DEBUG_SHOW_ALIGN)
+ drawHorizontalLine(canvas, (int)baseline, key.mWidth, 0xc0008000,
+ new Paint());
+ } else { // Align center
+ final float centerY = (key.mHeight + padding.top - padding.bottom) / 2;
+ baseline = centerY
+ + labelCharHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER;
+ if (DEBUG_SHOW_ALIGN)
+ drawHorizontalLine(canvas, (int)baseline, key.mWidth, 0xc0008000,
+ new Paint());
+ }
+ // Horizontal label text alignment
+ final int positionX;
+ if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_LEFT) != 0) {
+ positionX = mKeyLabelHorizontalPadding + padding.left;
+ paint.setTextAlign(Align.LEFT);
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, positionX, rowHeight, 0xc0800080, new Paint());
+ } else if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_RIGHT) != 0) {
+ positionX = key.mWidth - mKeyLabelHorizontalPadding - padding.right;
+ paint.setTextAlign(Align.RIGHT);
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, positionX, rowHeight, 0xc0808000, new Paint());
} else {
- labelSize = mKeyTextSize;
- paint.setTypeface(mKeyTextStyle);
+ positionX = (key.mWidth + padding.left - padding.right) / 2;
+ paint.setTextAlign(Align.CENTER);
+ if (DEBUG_SHOW_ALIGN && label.length() > 1)
+ drawVerticalLine(canvas, positionX, rowHeight, 0xc0008080, new Paint());
}
- paint.setTextSize(labelSize);
-
- Integer labelHeightValue = mTextHeightCache.get(labelSize);
- final int labelHeight;
- if (labelHeightValue != null) {
- labelHeight = labelHeightValue;
+ if (key.mManualTemporaryUpperCaseHintIcon != null && isManualTemporaryUpperCase) {
+ paint.setColor(mKeyTextColorDisabled);
} else {
- Rect textBounds = new Rect();
- paint.getTextBounds(KEY_LABEL_HEIGHT_REFERENCE_CHAR, 0, 1, textBounds);
- labelHeight = textBounds.height();
- mTextHeightCache.put(labelSize, labelHeight);
+ paint.setColor(mKeyTextColor);
}
-
- // Draw a drop shadow for the text
+ // Set a drop shadow for the text
paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor);
- final int centerX = (key.width + padding.left - padding.right) / 2;
- final int centerY = (key.height + padding.top - padding.bottom) / 2;
- final float baseline = centerY
- + labelHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR;
- canvas.drawText(label, centerX, baseline, paint);
+ canvas.drawText(label, positionX, baseline, paint);
// Turn off drop shadow
paint.setShadowLayer(0, 0, 0, 0);
-
- // Usually don't draw icon if label is not null, but we draw icon for the number
- // hint and popup hint.
- shouldDrawIcon = shouldDrawLabelAndIcon(key);
}
- if (key.icon != null && shouldDrawIcon) {
- // Special handing for the upper-right number hint icons
- final int drawableWidth;
- final int drawableHeight;
+ // Draw key icon
+ final Drawable icon = key.getIcon();
+ if (key.mLabel == null && icon != null) {
+ final int drawableWidth = icon.getIntrinsicWidth();
+ final int drawableHeight = icon.getIntrinsicHeight();
final int drawableX;
- final int drawableY;
- if (shouldDrawIconFully(key)) {
- drawableWidth = key.width;
- drawableHeight = key.height;
- drawableX = 0;
- drawableY = NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL;
- } else {
- drawableWidth = key.icon.getIntrinsicWidth();
- drawableHeight = key.icon.getIntrinsicHeight();
- drawableX = (key.width + padding.left - padding.right - drawableWidth) / 2;
- drawableY = (key.height + padding.top - padding.bottom - drawableHeight) / 2;
+ final int drawableY = (
+ key.mHeight + padding.top - padding.bottom - drawableHeight) / 2;
+ if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_LEFT) != 0) {
+ drawableX = padding.left + mKeyLabelHorizontalPadding;
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, drawableX, rowHeight, 0xc0800080, new Paint());
+ } else if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_RIGHT) != 0) {
+ drawableX = key.mWidth - padding.right - mKeyLabelHorizontalPadding
+ - drawableWidth;
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, drawableX + drawableWidth, rowHeight,
+ 0xc0808000, new Paint());
+ } else { // Align center
+ drawableX = (key.mWidth + padding.left - padding.right - drawableWidth) / 2;
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, drawableX + drawableWidth / 2, rowHeight,
+ 0xc0008080, new Paint());
}
- canvas.translate(drawableX, drawableY);
- key.icon.setBounds(0, 0, drawableWidth, drawableHeight);
- key.icon.draw(canvas);
- canvas.translate(-drawableX, -drawableY);
+ drawIcon(canvas, icon, drawableX, drawableY, drawableWidth, drawableHeight);
+ if (DEBUG_SHOW_ALIGN)
+ drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight,
+ 0x80c00000, new Paint());
+ }
+ if (key.mHintIcon != null) {
+ final int drawableWidth = key.mWidth;
+ final int drawableHeight = key.mHeight;
+ final int drawableX = 0;
+ final int drawableY = HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL;
+ Drawable hintIcon = (isManualTemporaryUpperCase
+ && key.mManualTemporaryUpperCaseHintIcon != null)
+ ? key.mManualTemporaryUpperCaseHintIcon : key.mHintIcon;
+ drawIcon(canvas, hintIcon, drawableX, drawableY, drawableWidth, drawableHeight);
+ if (DEBUG_SHOW_ALIGN)
+ drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight,
+ 0x80c0c000, new Paint());
}
- canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop);
+ canvas.translate(-key.mX - kbdPaddingLeft, -key.mY - kbdPaddingTop);
+ }
+
+ if (DEBUG_KEYBOARD_GRID) {
+ Paint p = new Paint();
+ p.setStyle(Paint.Style.STROKE);
+ p.setStrokeWidth(1.0f);
+ p.setColor(0x800000c0);
+ int cw = (mKeyboard.getMinWidth() + mKeyboard.GRID_WIDTH - 1) / mKeyboard.GRID_WIDTH;
+ int ch = (mKeyboard.getHeight() + mKeyboard.GRID_HEIGHT - 1) / mKeyboard.GRID_HEIGHT;
+ for (int i = 0; i <= mKeyboard.GRID_WIDTH; i++)
+ canvas.drawLine(i * cw, 0, i * cw, ch * mKeyboard.GRID_HEIGHT, p);
+ for (int i = 0; i <= mKeyboard.GRID_HEIGHT; i++)
+ canvas.drawLine(0, i * ch, cw * mKeyboard.GRID_WIDTH, i * ch, p);
}
+
mInvalidatedKey = null;
// Overlay a dark rectangle to dim the keyboard
- if (mMiniKeyboard != null) {
+ if (mMiniKeyboardView != null) {
paint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24);
canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
}
@@ -916,28 +841,97 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mDirtyRect.setEmpty();
}
+ public int getLabelSizeAndSetPaint(CharSequence label, int keyLabelOption, Paint paint) {
+ // For characters, use large font. For labels like "Done", use small font.
+ final int labelSize;
+ final Typeface labelStyle;
+ if (label.length() > 1) {
+ labelSize = mLabelTextSize;
+ if ((keyLabelOption & KEY_LABEL_OPTION_FONT_NORMAL) != 0) {
+ labelStyle = Typeface.DEFAULT;
+ } else {
+ labelStyle = Typeface.DEFAULT_BOLD;
+ }
+ } else {
+ labelSize = mKeyLetterSize;
+ labelStyle = mKeyLetterStyle;
+ }
+ paint.setTextSize(labelSize);
+ paint.setTypeface(labelStyle);
+ return labelSize;
+ }
+
+ private int getLabelCharHeight(int labelSize, Paint paint) {
+ Integer labelHeightValue = mTextHeightCache.get(labelSize);
+ final int labelCharHeight;
+ if (labelHeightValue != null) {
+ labelCharHeight = labelHeightValue;
+ } else {
+ Rect textBounds = new Rect();
+ paint.getTextBounds(KEY_LABEL_REFERENCE_CHAR, 0, 1, textBounds);
+ labelCharHeight = textBounds.height();
+ mTextHeightCache.put(labelSize, labelCharHeight);
+ }
+ return labelCharHeight;
+ }
+
+ private static void drawIcon(Canvas canvas, Drawable icon, int x, int y, int width,
+ int height) {
+ canvas.translate(x, y);
+ icon.setBounds(0, 0, width, height);
+ icon.draw(canvas);
+ canvas.translate(-x, -y);
+ }
+
+ private static void drawHorizontalLine(Canvas canvas, int y, int w, int color, Paint paint) {
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(1.0f);
+ paint.setColor(color);
+ canvas.drawLine(0, y, w, y, paint);
+ }
+
+ private static void drawVerticalLine(Canvas canvas, int x, int h, int color, Paint paint) {
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(1.0f);
+ paint.setColor(color);
+ canvas.drawLine(x, 0, x, h, paint);
+ }
+
+ private static void drawRectangle(Canvas canvas, int x, int y, int w, int h, int color,
+ Paint paint) {
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(1.0f);
+ paint.setColor(color);
+ canvas.translate(x, y);
+ canvas.drawRect(0, 0, w, h, paint);
+ canvas.translate(-x, -y);
+ }
+
+ public void setForeground(boolean foreground) {
+ mInForeground = foreground;
+ }
+
// TODO: clean up this method.
private void dismissKeyPreview() {
for (PointerTracker tracker : mPointerTrackers)
- tracker.updateKey(NOT_A_KEY);
- showPreview(NOT_A_KEY, null);
+ tracker.releaseKey();
+ showPreview(KeyDetector.NOT_A_KEY, null);
}
+ @Override
public void showPreview(int keyIndex, PointerTracker tracker) {
int oldKeyIndex = mOldPreviewKeyIndex;
mOldPreviewKeyIndex = keyIndex;
- final boolean isLanguageSwitchEnabled = (mKeyboard instanceof LatinKeyboard)
- && ((LatinKeyboard)mKeyboard).isLanguageSwitchEnabled();
// We should re-draw popup preview when 1) we need to hide the preview, 2) we will show
// the space key preview and 3) pointer moves off the space key to other letter key, we
// should hide the preview of the previous key.
final boolean hidePreviewOrShowSpaceKeyPreview = (tracker == null)
- || tracker.isSpaceKey(keyIndex) || tracker.isSpaceKey(oldKeyIndex);
+ || (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher()
+ && SubtypeSwitcher.getInstance().needsToDisplayLanguage()
+ && (tracker.isSpaceKey(keyIndex) || tracker.isSpaceKey(oldKeyIndex)));
// If key changed and preview is on or the key is space (language switch is enabled)
- if (oldKeyIndex != keyIndex
- && (mShowPreview
- || (hidePreviewOrShowSpaceKeyPreview && isLanguageSwitchEnabled))) {
- if (keyIndex == NOT_A_KEY) {
+ if (oldKeyIndex != keyIndex && (mShowPreview || (hidePreviewOrShowSpaceKeyPreview))) {
+ if (keyIndex == KeyDetector.NOT_A_KEY) {
mHandler.cancelPopupPreview();
mHandler.dismissPreview(mDelayAfterPreview);
} else if (tracker != null) {
@@ -946,29 +940,35 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
}
+ // TODO Must fix popup preview on xlarge layout
private void showKey(final int keyIndex, PointerTracker tracker) {
Key key = tracker.getKey(keyIndex);
- if (key == null)
+ // If keyIndex is invalid or IME is already closed, we must not show key preview.
+ // Trying to show preview PopupWindow while root window is closed causes
+ // WindowManager.BadTokenException.
+ if (key == null || !mInForeground)
return;
- // Should not draw hint icon in key preview
- if (key.icon != null && !shouldDrawLabelAndIcon(key)) {
- mPreviewText.setCompoundDrawables(null, null, null,
- key.iconPreview != null ? key.iconPreview : key.icon);
- mPreviewText.setText(null);
- } else {
+ // What we show as preview should match what we show on key top in onBufferDraw().
+ if (key.mLabel != null) {
+ // TODO Should take care of temporaryShiftLabel here.
mPreviewText.setCompoundDrawables(null, null, null, null);
mPreviewText.setText(adjustCase(tracker.getPreviewText(key)));
- if (key.label.length() > 1 && key.codes.length < 2) {
- mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyTextSize);
+ if (key.mLabel.length() > 1) {
+ mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyLetterSize);
mPreviewText.setTypeface(Typeface.DEFAULT_BOLD);
} else {
mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge);
- mPreviewText.setTypeface(mKeyTextStyle);
+ mPreviewText.setTypeface(mKeyLetterStyle);
}
+ } else {
+ final Drawable previewIcon = key.getPreviewIcon();
+ mPreviewText.setCompoundDrawables(null, null, null,
+ previewIcon != null ? previewIcon : key.getIcon());
+ mPreviewText.setText(null);
}
mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
- int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.width
+ int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.mWidth
+ mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight());
final int popupHeight = mPreviewHeight;
LayoutParams lp = mPreviewText.getLayoutParams();
@@ -977,8 +977,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
lp.height = popupHeight;
}
- int popupPreviewX = key.x - (popupWidth - key.width) / 2;
- int popupPreviewY = key.y - popupHeight + mPreviewOffset;
+ int popupPreviewX = key.mX - (popupWidth - key.mWidth) / 2;
+ int popupPreviewY = key.mY - popupHeight + mPreviewOffset;
mHandler.cancelDismissPreview();
if (mOffsetInWindow == null) {
@@ -992,7 +992,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
// Set the preview background state
mPreviewText.getBackground().setState(
- key.popupResId != 0 ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET);
+ key.mPopupCharacters != null ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET);
popupPreviewX += mOffsetInWindow[0];
popupPreviewY += mOffsetInWindow[1];
@@ -1000,21 +1000,26 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
if (popupPreviewY + mWindowY < 0) {
// If the key you're pressing is on the left side of the keyboard, show the popup on
// the right, offset by enough to see at least one key to the left/right.
- if (key.x + key.width <= getWidth() / 2) {
- popupPreviewX += (int) (key.width * 2.5);
+ if (key.mX + key.mWidth <= getWidth() / 2) {
+ popupPreviewX += (int) (key.mWidth * 2.5);
} else {
- popupPreviewX -= (int) (key.width * 2.5);
+ popupPreviewX -= (int) (key.mWidth * 2.5);
}
popupPreviewY += popupHeight;
}
- if (mPreviewPopup.isShowing()) {
- mPreviewPopup.update(popupPreviewX, popupPreviewY, popupWidth, popupHeight);
- } else {
- mPreviewPopup.setWidth(popupWidth);
- mPreviewPopup.setHeight(popupHeight);
- mPreviewPopup.showAtLocation(mMiniKeyboardParent, Gravity.NO_GRAVITY,
- popupPreviewX, popupPreviewY);
+ try {
+ if (mPreviewPopup.isShowing()) {
+ mPreviewPopup.update(popupPreviewX, popupPreviewY, popupWidth, popupHeight);
+ } else {
+ mPreviewPopup.setWidth(popupWidth);
+ mPreviewPopup.setHeight(popupHeight);
+ mPreviewPopup.showAtLocation(mMiniKeyboardParent, Gravity.NO_GRAVITY,
+ popupPreviewX, popupPreviewY);
+ }
+ } catch (WindowManager.BadTokenException e) {
+ // Swallow the exception which will be happened when IME is already closed.
+ Log.w(TAG, "LatinIME is already closed when tried showing key preview.");
}
// Record popup preview position to display mini-keyboard later at the same positon
mPopupPreviewDisplayedY = popupPreviewY;
@@ -1040,16 +1045,17 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
* @param key key in the attached {@link Keyboard}.
* @see #invalidateAllKeys
*/
+ @Override
public void invalidateKey(Key key) {
if (key == null)
return;
mInvalidatedKey = key;
// TODO we should clean up this and record key's region to use in onBufferDraw.
- mDirtyRect.union(key.x + getPaddingLeft(), key.y + getPaddingTop(),
- key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop());
+ mDirtyRect.union(key.mX + getPaddingLeft(), key.mY + getPaddingTop(),
+ key.mX + key.mWidth + getPaddingLeft(), key.mY + key.mHeight + getPaddingTop());
onBufferDraw();
- invalidate(key.x + getPaddingLeft(), key.y + getPaddingTop(),
- key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop());
+ invalidate(key.mX + getPaddingLeft(), key.mY + getPaddingTop(),
+ key.mX + key.mWidth + getPaddingLeft(), key.mY + key.mHeight + getPaddingTop());
}
private boolean openPopupIfRequired(int keyIndex, PointerTracker tracker) {
@@ -1061,7 +1067,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
Key popupKey = tracker.getKey(keyIndex);
if (popupKey == null)
return false;
- boolean result = onLongPress(popupKey);
+ boolean result = onLongPress(popupKey, tracker);
if (result) {
dismissKeyPreview();
mMiniKeyboardTrackerId = tracker.mPointerId;
@@ -1072,61 +1078,67 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return result;
}
+ private void onLongPressShiftKey(PointerTracker tracker) {
+ tracker.setAlreadyProcessed();
+ mPointerQueue.remove(tracker);
+ mKeyboardActionListener.onCodeInput(Keyboard.CODE_CAPSLOCK, null, 0, 0);
+ }
+
+ private void onDoubleTapShiftKey(@SuppressWarnings("unused") PointerTracker tracker) {
+ // When shift key is double tapped, the first tap is correctly processed as usual tap. And
+ // the second tap is treated as this double tap event, so that we need not mark tracker
+ // calling setAlreadyProcessed() nor remove the tracker from mPointerQueueueue.
+ mKeyboardActionListener.onCodeInput(Keyboard.CODE_CAPSLOCK, null, 0, 0);
+ }
+
private View inflateMiniKeyboardContainer(Key popupKey) {
- int popupKeyboardId = popupKey.popupResId;
- LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- View container = inflater.inflate(mPopupLayout, null);
+ final View container = LayoutInflater.from(getContext()).inflate(mPopupLayout, null);
if (container == null)
throw new NullPointerException();
- LatinKeyboardBaseView miniKeyboard =
- (LatinKeyboardBaseView)container.findViewById(R.id.LatinKeyboardBaseView);
- miniKeyboard.setOnKeyboardActionListener(new OnKeyboardActionListener() {
- public void onKey(int primaryCode, int[] keyCodes, int x, int y) {
- mKeyboardActionListener.onKey(primaryCode, keyCodes, x, y);
+ final KeyboardView miniKeyboardView =
+ (KeyboardView)container.findViewById(R.id.KeyboardView);
+ miniKeyboardView.setOnKeyboardActionListener(new KeyboardActionListener() {
+ @Override
+ public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) {
+ mKeyboardActionListener.onCodeInput(primaryCode, keyCodes, x, y);
dismissPopupKeyboard();
}
- public void onText(CharSequence text) {
- mKeyboardActionListener.onText(text);
+ @Override
+ public void onTextInput(CharSequence text) {
+ mKeyboardActionListener.onTextInput(text);
dismissPopupKeyboard();
}
- public void onCancel() {
- mKeyboardActionListener.onCancel();
+ @Override
+ public void onCancelInput() {
+ mKeyboardActionListener.onCancelInput();
dismissPopupKeyboard();
}
- public void swipeLeft() {
- }
- public void swipeRight() {
- }
- public void swipeUp() {
- }
- public void swipeDown() {
+ @Override
+ public void onSwipeDown() {
+ // Nothing to do.
}
+ @Override
public void onPress(int primaryCode) {
mKeyboardActionListener.onPress(primaryCode);
}
+ @Override
public void onRelease(int primaryCode) {
mKeyboardActionListener.onRelease(primaryCode);
}
});
// Override default ProximityKeyDetector.
- miniKeyboard.mKeyDetector = new MiniKeyboardKeyDetector(mMiniKeyboardSlideAllowance);
+ miniKeyboardView.mKeyDetector = new MiniKeyboardKeyDetector(mMiniKeyboardSlideAllowance);
// Remove gesture detector on mini-keyboard
- miniKeyboard.mGestureDetector = null;
+ miniKeyboardView.mGestureDetector = null;
- Keyboard keyboard;
- if (popupKey.popupCharacters != null) {
- keyboard = new Keyboard(getContext(), popupKeyboardId, popupKey.popupCharacters,
- -1, getPaddingLeft() + getPaddingRight());
- } else {
- keyboard = new Keyboard(getContext(), popupKeyboardId);
- }
- miniKeyboard.setKeyboard(keyboard);
- miniKeyboard.setPopupParent(this);
+ final Keyboard keyboard = new MiniKeyboardBuilder(this, mKeyboard.getPopupKeyboardResId(),
+ popupKey).build();
+ miniKeyboardView.setKeyboard(keyboard);
+ miniKeyboardView.mMiniKeyboardParent = this;
container.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
@@ -1136,14 +1148,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private static boolean isOneRowKeys(List<Key> keys) {
if (keys.size() == 0) return false;
- final int edgeFlags = keys.get(0).edgeFlags;
+ final int edgeFlags = keys.get(0).mEdgeFlags;
// HACK: The first key of mini keyboard which was inflated from xml and has multiple rows,
// does not have both top and bottom edge flags on at the same time. On the other hand,
// the first key of mini keyboard that was created with popupCharacters must have both top
// and bottom edge flags on.
// When you want to use one row mini-keyboard from xml file, make sure that the row has
// both top and bottom edge flags set.
- return (edgeFlags & Keyboard.EDGE_TOP) != 0 && (edgeFlags & Keyboard.EDGE_BOTTOM) != 0;
+ return (edgeFlags & Keyboard.EDGE_TOP) != 0
+ && (edgeFlags & Keyboard.EDGE_BOTTOM) != 0;
}
/**
@@ -1153,11 +1166,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
* @return true if the long press is handled, false otherwise. Subclasses should call the
* method on the base class if the subclass doesn't wish to handle the call.
*/
- protected boolean onLongPress(Key popupKey) {
- // TODO if popupKey.popupCharacters has only one letter, send it as key without opening
- // mini keyboard.
-
- if (popupKey.popupResId == 0)
+ protected boolean onLongPress(Key popupKey, PointerTracker tracker) {
+ if (popupKey.mPopupCharacters == null)
return false;
View container = mMiniKeyboardCache.get(popupKey);
@@ -1165,120 +1175,51 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
container = inflateMiniKeyboardContainer(popupKey);
mMiniKeyboardCache.put(popupKey, container);
}
- mMiniKeyboard = (LatinKeyboardBaseView)container.findViewById(R.id.LatinKeyboardBaseView);
+ mMiniKeyboardView = (KeyboardView)container.findViewById(R.id.KeyboardView);
+ final MiniKeyboard miniKeyboard = (MiniKeyboard)mMiniKeyboardView.getKeyboard();
+
if (mWindowOffset == null) {
mWindowOffset = new int[2];
getLocationInWindow(mWindowOffset);
}
-
- // Get width of a key in the mini popup keyboard = "miniKeyWidth".
- // On the other hand, "popupKey.width" is width of the pressed key on the main keyboard.
- // We adjust the position of mini popup keyboard with the edge key in it:
- // a) When we have the leftmost key in popup keyboard directly above the pressed key
- // Right edges of both keys should be aligned for consistent default selection
- // b) When we have the rightmost key in popup keyboard directly above the pressed key
- // Left edges of both keys should be aligned for consistent default selection
- final List<Key> miniKeys = mMiniKeyboard.getKeyboard().getKeys();
- final int miniKeyWidth = miniKeys.size() > 0 ? miniKeys.get(0).width : 0;
-
- // HACK: Have the leftmost number in the popup characters right above the key
- boolean isNumberAtLeftmost =
- hasMultiplePopupChars(popupKey) && isNumberAtLeftmostPopupChar(popupKey);
- int popupX = popupKey.x + mWindowOffset[0];
- popupX += getPaddingLeft();
- if (isNumberAtLeftmost) {
- popupX += popupKey.width - miniKeyWidth; // adjustment for a) described above
- popupX -= container.getPaddingLeft();
- } else {
- popupX += miniKeyWidth; // adjustment for b) described above
- popupX -= container.getMeasuredWidth();
- popupX += container.getPaddingRight();
- }
- int popupY = popupKey.y + mWindowOffset[1];
- popupY += getPaddingTop();
- popupY -= container.getMeasuredHeight();
- popupY += container.getPaddingBottom();
+ final int pointX = (mConfigShowMiniKeyboardAtTouchedPoint) ? tracker.getLastX()
+ : popupKey.mX + popupKey.mWidth / 2;
+ final int popupX = pointX - miniKeyboard.getDefaultCoordX()
+ - container.getPaddingLeft()
+ + getPaddingLeft() + mWindowOffset[0];
+ final int popupY = popupKey.mY - mKeyboard.getVerticalGap()
+ - (container.getMeasuredHeight() - container.getPaddingBottom())
+ + getPaddingTop() + mWindowOffset[1];
final int x = popupX;
- final int y = mShowPreview && isOneRowKeys(miniKeys) ? mPopupPreviewDisplayedY : popupY;
+ final int y = mShowPreview && isOneRowKeys(miniKeyboard.getKeys())
+ ? mPopupPreviewDisplayedY : popupY;
- int adjustedX = x;
- if (x < 0) {
- adjustedX = 0;
- } else if (x > (getMeasuredWidth() - container.getMeasuredWidth())) {
- adjustedX = getMeasuredWidth() - container.getMeasuredWidth();
- }
- mMiniKeyboardOriginX = adjustedX + container.getPaddingLeft() - mWindowOffset[0];
+ mMiniKeyboardOriginX = x + container.getPaddingLeft() - mWindowOffset[0];
mMiniKeyboardOriginY = y + container.getPaddingTop() - mWindowOffset[1];
- mMiniKeyboard.setPopupOffset(adjustedX, y);
- mMiniKeyboard.setShifted(isShifted());
+ mMiniKeyboardView.setPopupOffset(x, y);
+ if (miniKeyboard.setShifted(
+ mKeyboard == null ? false : mKeyboard.isShiftedOrShiftLocked())) {
+ mMiniKeyboardView.invalidateAllKeys();
+ }
// Mini keyboard needs no pop-up key preview displayed.
- mMiniKeyboard.setPreviewEnabled(false);
+ mMiniKeyboardView.setPreviewEnabled(false);
mMiniKeyboardPopup.setContentView(container);
mMiniKeyboardPopup.setWidth(container.getMeasuredWidth());
mMiniKeyboardPopup.setHeight(container.getMeasuredHeight());
mMiniKeyboardPopup.showAtLocation(this, Gravity.NO_GRAVITY, x, y);
// Inject down event on the key to mini keyboard.
- long eventTime = SystemClock.uptimeMillis();
+ final long eventTime = SystemClock.uptimeMillis();
mMiniKeyboardPopupTime = eventTime;
- MotionEvent downEvent = generateMiniKeyboardMotionEvent(MotionEvent.ACTION_DOWN, popupKey.x
- + popupKey.width / 2, popupKey.y + popupKey.height / 2, eventTime);
- mMiniKeyboard.onTouchEvent(downEvent);
+ final MotionEvent downEvent = generateMiniKeyboardMotionEvent(MotionEvent.ACTION_DOWN,
+ pointX, popupKey.mY + popupKey.mHeight / 2, eventTime);
+ mMiniKeyboardView.onTouchEvent(downEvent);
downEvent.recycle();
invalidateAllKeys();
return true;
}
- private static boolean hasMultiplePopupChars(Key key) {
- if (key.popupCharacters != null && key.popupCharacters.length() > 1) {
- return true;
- }
- return false;
- }
-
- private boolean shouldDrawIconFully(Key key) {
- return isNumberAtEdgeOfPopupChars(key) || isLatinF1Key(key)
- || LatinKeyboard.hasPuncOrSmileysPopup(key);
- }
-
- private boolean shouldDrawLabelAndIcon(Key key) {
- return isNumberAtEdgeOfPopupChars(key) || isNonMicLatinF1Key(key)
- || LatinKeyboard.hasPuncOrSmileysPopup(key);
- }
-
- private boolean isLatinF1Key(Key key) {
- return (mKeyboard instanceof LatinKeyboard) && ((LatinKeyboard)mKeyboard).isF1Key(key);
- }
-
- private boolean isNonMicLatinF1Key(Key key) {
- return isLatinF1Key(key) && key.label != null;
- }
-
- private static boolean isNumberAtEdgeOfPopupChars(Key key) {
- return isNumberAtLeftmostPopupChar(key) || isNumberAtRightmostPopupChar(key);
- }
-
- /* package */ static boolean isNumberAtLeftmostPopupChar(Key key) {
- if (key.popupCharacters != null && key.popupCharacters.length() > 0
- && isAsciiDigit(key.popupCharacters.charAt(0))) {
- return true;
- }
- return false;
- }
-
- /* package */ static boolean isNumberAtRightmostPopupChar(Key key) {
- if (key.popupCharacters != null && key.popupCharacters.length() > 0
- && isAsciiDigit(key.popupCharacters.charAt(key.popupCharacters.length() - 1))) {
- return true;
- }
- return false;
- }
-
- private static boolean isAsciiDigit(char c) {
- return (c < 0x80) && Character.isDigit(c);
- }
-
private MotionEvent generateMiniKeyboardMotionEvent(int action, int x, int y, long eventTime) {
return MotionEvent.obtain(mMiniKeyboardPopupTime, eventTime, action,
x - mMiniKeyboardOriginX, y - mMiniKeyboardOriginY, 0);
@@ -1287,14 +1228,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private PointerTracker getPointerTracker(final int id) {
final ArrayList<PointerTracker> pointers = mPointerTrackers;
final Key[] keys = mKeys;
- final OnKeyboardActionListener listener = mKeyboardActionListener;
+ final KeyboardActionListener listener = mKeyboardActionListener;
// Create pointer trackers until we can get 'id+1'-th tracker, if needed.
for (int i = pointers.size(); i <= id; i++) {
final PointerTracker tracker =
new PointerTracker(i, mHandler, mKeyDetector, this, getResources());
if (keys != null)
- tracker.setKeyboard(keys, mKeyHysteresisDistance);
+ tracker.setKeyboard(mKeyboard, keys, mKeyHysteresisDistance);
if (listener != null)
tracker.setOnKeyboardActionListener(listener);
pointers.add(tracker);
@@ -1304,8 +1245,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
public boolean isInSlidingKeyInput() {
- if (mMiniKeyboard != null) {
- return mMiniKeyboard.isInSlidingKeyInput();
+ if (mMiniKeyboardView != null) {
+ return mMiniKeyboardView.isInSlidingKeyInput();
} else {
return mPointerQueue.isInSlidingKeyInput();
}
@@ -1333,7 +1274,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mSwipeTracker.addMovement(me);
// Gesture detector must be enabled only when mini-keyboard is not on the screen.
- if (mMiniKeyboard == null
+ if (mMiniKeyboardView == null
&& mGestureDetector != null && mGestureDetector.onTouchEvent(me)) {
dismissKeyPreview();
mHandler.cancelKeyTimers();
@@ -1348,14 +1289,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// Needs to be called after the gesture detector gets a turn, as it may have
// displayed the mini keyboard
- if (mMiniKeyboard != null) {
+ if (mMiniKeyboardView != null) {
final int miniKeyboardPointerIndex = me.findPointerIndex(mMiniKeyboardTrackerId);
if (miniKeyboardPointerIndex >= 0 && miniKeyboardPointerIndex < pointerCount) {
final int miniKeyboardX = (int)me.getX(miniKeyboardPointerIndex);
final int miniKeyboardY = (int)me.getY(miniKeyboardPointerIndex);
MotionEvent translated = generateMiniKeyboardMotionEvent(action,
miniKeyboardX, miniKeyboardY, eventTime);
- mMiniKeyboard.onTouchEvent(translated);
+ mMiniKeyboardView.onTouchEvent(translated);
translated.recycle();
}
return true;
@@ -1384,13 +1325,13 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
if (pointerCount == 1 && oldPointerCount == 2) {
// Multi-touch to single touch transition.
// Send a down event for the latest pointer.
- tracker.onDownEvent(x, y, eventTime);
+ tracker.onDownEvent(x, y, eventTime, null);
} else if (pointerCount == 2 && oldPointerCount == 1) {
// Single-touch to multi-touch transition.
// Send an up event for the last pointer.
- tracker.onUpEvent(tracker.getLastX(), tracker.getLastY(), eventTime);
+ tracker.onUpEvent(tracker.getLastX(), tracker.getLastY(), eventTime, null);
} else if (pointerCount == 1 && oldPointerCount == 1) {
- tracker.onTouchEvent(action, x, y, eventTime);
+ tracker.onTouchEvent(action, x, y, eventTime, null);
} else {
Log.w(TAG, "Unknown touch panel behavior: pointer count is " + pointerCount
+ " (old " + oldPointerCount + ")");
@@ -1398,24 +1339,25 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return true;
}
+ final PointerTrackerQueue queue = mPointerQueue;
if (action == MotionEvent.ACTION_MOVE) {
for (int i = 0; i < pointerCount; i++) {
- PointerTracker tracker = getPointerTracker(me.getPointerId(i));
- tracker.onMoveEvent((int)me.getX(i), (int)me.getY(i), eventTime);
+ final PointerTracker tracker = getPointerTracker(me.getPointerId(i));
+ tracker.onMoveEvent((int)me.getX(i), (int)me.getY(i), eventTime, queue);
}
} else {
- PointerTracker tracker = getPointerTracker(id);
+ final PointerTracker tracker = getPointerTracker(id);
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
- onDownEvent(tracker, x, y, eventTime);
+ tracker.onDownEvent(x, y, eventTime, queue);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
- onUpEvent(tracker, x, y, eventTime);
+ tracker.onUpEvent(x, y, eventTime, queue);
break;
case MotionEvent.ACTION_CANCEL:
- onCancelEvent(tracker, x, y, eventTime);
+ tracker.onCancelEvent(x, y, eventTime, queue);
break;
}
}
@@ -1423,53 +1365,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return true;
}
- private void onDownEvent(PointerTracker tracker, int x, int y, long eventTime) {
- if (tracker.isOnModifierKey(x, y)) {
- // Before processing a down event of modifier key, all pointers already being tracked
- // should be released.
- mPointerQueue.releaseAllPointersExcept(null, eventTime);
- }
- tracker.onDownEvent(x, y, eventTime);
- mPointerQueue.add(tracker);
- }
-
- private void onUpEvent(PointerTracker tracker, int x, int y, long eventTime) {
- if (tracker.isModifier()) {
- // Before processing an up event of modifier key, all pointers already being tracked
- // should be released.
- mPointerQueue.releaseAllPointersExcept(tracker, eventTime);
- } else {
- int index = mPointerQueue.lastIndexOf(tracker);
- if (index >= 0) {
- mPointerQueue.releaseAllPointersOlderThan(tracker, eventTime);
- } else {
- Log.w(TAG, "onUpEvent: corresponding down event not found for pointer "
- + tracker.mPointerId);
- }
- }
- tracker.onUpEvent(x, y, eventTime);
- mPointerQueue.remove(tracker);
- }
-
- private void onCancelEvent(PointerTracker tracker, int x, int y, long eventTime) {
- tracker.onCancelEvent(x, y, eventTime);
- mPointerQueue.remove(tracker);
- }
-
- protected void swipeRight() {
- mKeyboardActionListener.swipeRight();
- }
-
- protected void swipeLeft() {
- mKeyboardActionListener.swipeLeft();
- }
-
- protected void swipeUp() {
- mKeyboardActionListener.swipeUp();
- }
-
- protected void swipeDown() {
- mKeyboardActionListener.swipeDown();
+ protected void onSwipeDown() {
+ mKeyboardActionListener.onSwipeDown();
}
public void closing() {
@@ -1477,9 +1374,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mHandler.cancelAllMessages();
dismissPopupKeyboard();
- mBuffer = null;
- mCanvas = null;
+ mDirtyRect.union(0, 0, getWidth(), getHeight());
mMiniKeyboardCache.clear();
+ requestLayout();
+ }
+
+ public void purgeKeyboardAndClosing() {
+ mKeyboard = null;
+ closing();
}
@Override
@@ -1491,7 +1393,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private void dismissPopupKeyboard() {
if (mMiniKeyboardPopup.isShowing()) {
mMiniKeyboardPopup.dismiss();
- mMiniKeyboard = null;
+ mMiniKeyboardView = null;
mMiniKeyboardOriginX = 0;
mMiniKeyboardOriginY = 0;
invalidateAllKeys();
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
new file mode 100644
index 000000000..ffb8d6410
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
@@ -0,0 +1,496 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import java.util.List;
+import java.util.Locale;
+
+// TODO: We should remove this class
+public class LatinKeyboard extends Keyboard {
+
+ private static final boolean DEBUG_PREFERRED_LETTER = false;
+ private static final String TAG = "LatinKeyboard";
+
+ public static final int OPACITY_FULLY_OPAQUE = 255;
+ private static final int SPACE_LED_LENGTH_PERCENT = 80;
+
+ private final Context mContext;
+
+ /* Space key and its icons, drawables and colors. */
+ private final Key mSpaceKey;
+ private final Drawable mSpaceIcon;
+ private final Drawable mSpacePreviewIcon;
+ private final int[] mSpaceKeyIndexArray;
+ private final Drawable mSpaceAutoCorrectionIndicator;
+ private final Drawable mButtonArrowLeftIcon;
+ private final Drawable mButtonArrowRightIcon;
+ private final int mSpacebarTextColor;
+ private final int mSpacebarTextShadowColor;
+ private final int mSpacebarVerticalCorrection;
+ private float mSpacebarTextFadeFactor = 0.0f;
+ private int mSpaceDragStartX;
+ private int mSpaceDragLastDiff;
+ private boolean mCurrentlyInSpace;
+ private SlidingLocaleDrawable mSlidingLocaleIcon;
+
+ /* Shortcut key and its icons if available */
+ private final Key mShortcutKey;
+ private final Drawable mEnabledShortcutIcon;
+ private final Drawable mDisabledShortcutIcon;
+
+ private int[] mPrefLetterFrequencies;
+ private int mPrefLetter;
+ private int mPrefLetterX;
+ private int mPrefLetterY;
+ private int mPrefDistance;
+
+ private static final float SPACEBAR_DRAG_THRESHOLD = 0.8f;
+ private static final float OVERLAP_PERCENTAGE_LOW_PROB = 0.70f;
+ private static final float OVERLAP_PERCENTAGE_HIGH_PROB = 0.85f;
+ // Minimum width of space key preview (proportional to keyboard width)
+ private static final float SPACEBAR_POPUP_MIN_RATIO = 0.4f;
+ // Height in space key the language name will be drawn. (proportional to space key height)
+ public static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f;
+ // If the full language name needs to be smaller than this value to be drawn on space key,
+ // its short language name will be used instead.
+ private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f;
+
+ private static final String SMALL_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "small";
+ private static final String MEDIUM_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "medium";
+
+ public LatinKeyboard(Context context, KeyboardId id) {
+ super(context, id.getXmlId(), id);
+ final Resources res = context.getResources();
+ mContext = context;
+
+ final List<Key> keys = getKeys();
+ int spaceKeyIndex = -1;
+ int shortcutKeyIndex = -1;
+ final int keyCount = keys.size();
+ for (int index = 0; index < keyCount; index++) {
+ // For now, assuming there are up to one space key and one shortcut key respectively.
+ switch (keys.get(index).mCode) {
+ case CODE_SPACE:
+ spaceKeyIndex = index;
+ break;
+ case CODE_VOICE:
+ shortcutKeyIndex = index;
+ break;
+ }
+ }
+
+ // The index of space key is available only after Keyboard constructor has finished.
+ mSpaceKey = (spaceKeyIndex >= 0) ? keys.get(spaceKeyIndex) : null;
+ mSpaceIcon = (mSpaceKey != null) ? mSpaceKey.getIcon() : null;
+ mSpacePreviewIcon = (mSpaceKey != null) ? mSpaceKey.getPreviewIcon() : null;
+ mSpaceKeyIndexArray = new int[] { spaceKeyIndex };
+
+ mShortcutKey = (shortcutKeyIndex >= 0) ? keys.get(shortcutKeyIndex) : null;
+ mEnabledShortcutIcon = (mShortcutKey != null) ? mShortcutKey.getIcon() : null;
+
+ mSpacebarTextColor = res.getColor(R.color.latinkeyboard_bar_language_text);
+ if (id.mColorScheme == KeyboardView.COLOR_SCHEME_BLACK) {
+ mSpacebarTextShadowColor = res.getColor(
+ R.color.latinkeyboard_bar_language_shadow_black);
+ mDisabledShortcutIcon = res.getDrawable(R.drawable.sym_bkeyboard_voice_off);
+ } else { // default color scheme is KeyboardView.COLOR_SCHEME_WHITE
+ mSpacebarTextShadowColor = res.getColor(
+ R.color.latinkeyboard_bar_language_shadow_white);
+ mDisabledShortcutIcon = res.getDrawable(R.drawable.sym_keyboard_voice_off_holo);
+ }
+ mSpaceAutoCorrectionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led);
+ mButtonArrowLeftIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_left);
+ mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right);
+ mSpacebarVerticalCorrection = res.getDimensionPixelOffset(
+ R.dimen.spacebar_vertical_correction);
+ }
+
+ public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboardView view) {
+ mSpacebarTextFadeFactor = fadeFactor;
+ updateSpacebarForLocale(false);
+ if (view != null)
+ view.invalidateKey(mSpaceKey);
+ }
+
+ private static int getSpacebarTextColor(int color, float fadeFactor) {
+ final int newColor = Color.argb((int)(Color.alpha(color) * fadeFactor),
+ Color.red(color), Color.green(color), Color.blue(color));
+ return newColor;
+ }
+
+ public void updateShortcutKey(boolean available, LatinKeyboardView view) {
+ if (mShortcutKey == null)
+ return;
+ mShortcutKey.mEnabled = available;
+ mShortcutKey.setIcon(available ? mEnabledShortcutIcon : mDisabledShortcutIcon);
+ if (view != null)
+ view.invalidateKey(mShortcutKey);
+ }
+
+ /**
+ * @return a key which should be invalidated.
+ */
+ public Key onAutoCorrectionStateChanged(boolean isAutoCorrection) {
+ updateSpacebarForLocale(isAutoCorrection);
+ return mSpaceKey;
+ }
+
+ private void updateSpacebarForLocale(boolean isAutoCorrection) {
+ final Resources res = mContext.getResources();
+ // If application locales are explicitly selected.
+ if (SubtypeSwitcher.getInstance().needsToDisplayLanguage()) {
+ mSpaceKey.setIcon(new BitmapDrawable(res,
+ drawSpacebar(OPACITY_FULLY_OPAQUE, isAutoCorrection)));
+ } else {
+ // sym_keyboard_space_led can be shared with Black and White symbol themes.
+ if (isAutoCorrection) {
+ mSpaceKey.setIcon(new BitmapDrawable(res,
+ drawSpacebar(OPACITY_FULLY_OPAQUE, isAutoCorrection)));
+ } else {
+ mSpaceKey.setIcon(mSpaceIcon);
+ }
+ }
+ }
+
+ // Compute width of text with specified text size using paint.
+ private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) {
+ paint.setTextSize(textSize);
+ paint.getTextBounds(text, 0, text.length(), bounds);
+ return bounds.width();
+ }
+
+ // Layout local language name and left and right arrow on spacebar.
+ private static String layoutSpacebar(Paint paint, Locale locale, Drawable lArrow,
+ Drawable rArrow, int width, int height, float origTextSize,
+ boolean allowVariableTextSize) {
+ final float arrowWidth = lArrow.getIntrinsicWidth();
+ final float arrowHeight = lArrow.getIntrinsicHeight();
+ final float maxTextWidth = width - (arrowWidth + arrowWidth);
+ final Rect bounds = new Rect();
+
+ // Estimate appropriate language name text size to fit in maxTextWidth.
+ String language = SubtypeSwitcher.getFullDisplayName(locale, true);
+ int textWidth = getTextWidth(paint, language, origTextSize, bounds);
+ // Assuming text width and text size are proportional to each other.
+ float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f);
+
+ final boolean useShortName;
+ if (allowVariableTextSize) {
+ textWidth = getTextWidth(paint, language, textSize, bounds);
+ // If text size goes too small or text does not fit, use short name
+ useShortName = textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME
+ || textWidth > maxTextWidth;
+ } else {
+ useShortName = textWidth > maxTextWidth;
+ textSize = origTextSize;
+ }
+ if (useShortName) {
+ language = SubtypeSwitcher.getShortDisplayLanguage(locale);
+ textWidth = getTextWidth(paint, language, origTextSize, bounds);
+ textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f);
+ }
+ paint.setTextSize(textSize);
+
+ // Place left and right arrow just before and after language text.
+ final float baseline = height * SPACEBAR_LANGUAGE_BASELINE;
+ final int top = (int)(baseline - arrowHeight);
+ final float remains = (width - textWidth) / 2;
+ lArrow.setBounds((int)(remains - arrowWidth), top, (int)remains, (int)baseline);
+ rArrow.setBounds((int)(remains + textWidth), top, (int)(remains + textWidth + arrowWidth),
+ (int)baseline);
+
+ return language;
+ }
+
+ private Bitmap drawSpacebar(int opacity, boolean isAutoCorrection) {
+ final int width = mSpaceKey.mWidth;
+ final int height = mSpaceIcon != null ? mSpaceIcon.getIntrinsicHeight() : mSpaceKey.mHeight;
+ final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ final Canvas canvas = new Canvas(buffer);
+ final Resources res = mContext.getResources();
+ canvas.drawColor(res.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR);
+
+ SubtypeSwitcher subtypeSwitcher = SubtypeSwitcher.getInstance();
+ // If application locales are explicitly selected.
+ if (subtypeSwitcher.needsToDisplayLanguage()) {
+ final Paint paint = new Paint();
+ paint.setAlpha(opacity);
+ paint.setAntiAlias(true);
+ paint.setTextAlign(Align.CENTER);
+
+ final String textSizeOfLanguageOnSpacebar = res.getString(
+ R.string.config_text_size_of_language_on_spacebar,
+ SMALL_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR);
+ final int textStyle;
+ final int defaultTextSize;
+ if (MEDIUM_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR.equals(textSizeOfLanguageOnSpacebar)) {
+ textStyle = android.R.style.TextAppearance_Medium;
+ defaultTextSize = 18;
+ } else {
+ textStyle = android.R.style.TextAppearance_Small;
+ defaultTextSize = 14;
+ }
+
+ final boolean allowVariableTextSize = true;
+ final String language = layoutSpacebar(paint, subtypeSwitcher.getInputLocale(),
+ mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height,
+ getTextSizeFromTheme(textStyle, defaultTextSize),
+ allowVariableTextSize);
+
+ // Draw language text with shadow
+ // In case there is no space icon, we will place the language text at the center of
+ // spacebar.
+ final float descent = paint.descent();
+ final float textHeight = -paint.ascent() + descent;
+ final float baseline = (mSpaceIcon != null) ? height * SPACEBAR_LANGUAGE_BASELINE
+ : height / 2 + textHeight / 2;
+ paint.setColor(getSpacebarTextColor(mSpacebarTextShadowColor, mSpacebarTextFadeFactor));
+ canvas.drawText(language, width / 2, baseline - descent - 1, paint);
+ paint.setColor(getSpacebarTextColor(mSpacebarTextColor, mSpacebarTextFadeFactor));
+ canvas.drawText(language, width / 2, baseline - descent, paint);
+
+ // Put arrows that are already layed out on either side of the text
+ if (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher()
+ && subtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) {
+ mButtonArrowLeftIcon.draw(canvas);
+ mButtonArrowRightIcon.draw(canvas);
+ }
+ }
+
+ // Draw the spacebar icon at the bottom
+ if (isAutoCorrection) {
+ final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100;
+ final int iconHeight = mSpaceAutoCorrectionIndicator.getIntrinsicHeight();
+ int x = (width - iconWidth) / 2;
+ int y = height - iconHeight;
+ mSpaceAutoCorrectionIndicator.setBounds(x, y, x + iconWidth, y + iconHeight);
+ mSpaceAutoCorrectionIndicator.draw(canvas);
+ } else if (mSpaceIcon != null) {
+ final int iconWidth = mSpaceIcon.getIntrinsicWidth();
+ final int iconHeight = mSpaceIcon.getIntrinsicHeight();
+ int x = (width - iconWidth) / 2;
+ int y = height - iconHeight;
+ mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight);
+ mSpaceIcon.draw(canvas);
+ }
+ return buffer;
+ }
+
+ private void updateLocaleDrag(int diff) {
+ if (mSlidingLocaleIcon == null) {
+ final int width = Math.max(mSpaceKey.mWidth,
+ (int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO));
+ final int height = mSpacePreviewIcon.getIntrinsicHeight();
+ mSlidingLocaleIcon =
+ new SlidingLocaleDrawable(mContext, mSpacePreviewIcon, width, height);
+ mSlidingLocaleIcon.setBounds(0, 0, width, height);
+ mSpaceKey.setPreviewIcon(mSlidingLocaleIcon);
+ }
+ mSlidingLocaleIcon.setDiff(diff);
+ if (Math.abs(diff) == Integer.MAX_VALUE) {
+ mSpaceKey.setPreviewIcon(mSpacePreviewIcon);
+ } else {
+ mSpaceKey.setPreviewIcon(mSlidingLocaleIcon);
+ }
+ mSpaceKey.getPreviewIcon().invalidateSelf();
+ }
+
+ public int getLanguageChangeDirection() {
+ if (mSpaceKey == null || SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() <= 1
+ || Math.abs(mSpaceDragLastDiff) < mSpaceKey.mWidth * SPACEBAR_DRAG_THRESHOLD) {
+ return 0; // No change
+ }
+ return mSpaceDragLastDiff > 0 ? 1 : -1;
+ }
+
+ public void setPreferredLetters(int[] frequencies) {
+ mPrefLetterFrequencies = frequencies;
+ mPrefLetter = 0;
+ }
+
+ public void keyReleased() {
+ mCurrentlyInSpace = false;
+ mSpaceDragLastDiff = 0;
+ mPrefLetter = 0;
+ mPrefLetterX = 0;
+ mPrefLetterY = 0;
+ mPrefDistance = Integer.MAX_VALUE;
+ if (mSpaceKey != null) {
+ updateLocaleDrag(Integer.MAX_VALUE);
+ }
+ }
+
+ /**
+ * Does the magic of locking the touch gesture into the spacebar when
+ * switching input languages.
+ */
+ @Override
+ public boolean isInside(Key key, int pointX, int pointY) {
+ int x = pointX;
+ int y = pointY;
+ final int code = key.mCode;
+ if (code == CODE_SPACE) {
+ y += mSpacebarVerticalCorrection;
+ if (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher()
+ && SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() > 1) {
+ if (mCurrentlyInSpace) {
+ int diff = x - mSpaceDragStartX;
+ if (Math.abs(diff - mSpaceDragLastDiff) > 0) {
+ updateLocaleDrag(diff);
+ }
+ mSpaceDragLastDiff = diff;
+ return true;
+ } else {
+ boolean isOnSpace = key.isOnKey(x, y);
+ if (isOnSpace) {
+ mCurrentlyInSpace = true;
+ mSpaceDragStartX = x;
+ updateLocaleDrag(0);
+ }
+ return isOnSpace;
+ }
+ }
+ } else if (mPrefLetterFrequencies != null) {
+ // New coordinate? Reset
+ if (mPrefLetterX != x || mPrefLetterY != y) {
+ mPrefLetter = 0;
+ mPrefDistance = Integer.MAX_VALUE;
+ }
+ // Handle preferred next letter
+ final int[] pref = mPrefLetterFrequencies;
+ if (mPrefLetter > 0) {
+ if (DEBUG_PREFERRED_LETTER) {
+ if (mPrefLetter == code && !key.isOnKey(x, y)) {
+ Log.d(TAG, "CORRECTED !!!!!!");
+ }
+ }
+ return mPrefLetter == code;
+ } else {
+ final boolean isOnKey = key.isOnKey(x, y);
+ int[] nearby = getNearestKeys(x, y);
+ List<Key> nearbyKeys = getKeys();
+ if (isOnKey) {
+ // If it's a preferred letter
+ if (inPrefList(code, pref)) {
+ // Check if its frequency is much lower than a nearby key
+ mPrefLetter = code;
+ mPrefLetterX = x;
+ mPrefLetterY = y;
+ for (int i = 0; i < nearby.length; i++) {
+ Key k = nearbyKeys.get(nearby[i]);
+ if (k != key && inPrefList(k.mCode, pref)) {
+ final int dist = distanceFrom(k, x, y);
+ if (dist < (int) (k.mWidth * OVERLAP_PERCENTAGE_LOW_PROB) &&
+ (pref[k.mCode] > pref[mPrefLetter] * 3)) {
+ mPrefLetter = k.mCode;
+ mPrefDistance = dist;
+ if (DEBUG_PREFERRED_LETTER) {
+ Log.d(TAG, "CORRECTED ALTHOUGH PREFERRED !!!!!!");
+ }
+ break;
+ }
+ }
+ }
+
+ return mPrefLetter == code;
+ }
+ }
+
+ // Get the surrounding keys and intersect with the preferred list
+ // For all in the intersection
+ // if distance from touch point is within a reasonable distance
+ // make this the pref letter
+ // If no pref letter
+ // return inside;
+ // else return thiskey == prefletter;
+
+ for (int i = 0; i < nearby.length; i++) {
+ Key k = nearbyKeys.get(nearby[i]);
+ if (inPrefList(k.mCode, pref)) {
+ final int dist = distanceFrom(k, x, y);
+ if (dist < (int) (k.mWidth * OVERLAP_PERCENTAGE_HIGH_PROB)
+ && dist < mPrefDistance) {
+ mPrefLetter = k.mCode;
+ mPrefLetterX = x;
+ mPrefLetterY = y;
+ mPrefDistance = dist;
+ }
+ }
+ }
+ // Didn't find any
+ if (mPrefLetter == 0) {
+ return isOnKey;
+ } else {
+ return mPrefLetter == code;
+ }
+ }
+ }
+
+ // Lock into the spacebar
+ if (mCurrentlyInSpace) return false;
+
+ return key.isOnKey(x, y);
+ }
+
+ private boolean inPrefList(int code, int[] pref) {
+ if (code < pref.length && code >= 0) return pref[code] > 0;
+ return false;
+ }
+
+ private int distanceFrom(Key k, int x, int y) {
+ if (y > k.mY && y < k.mY + k.mHeight) {
+ return Math.abs(k.mX + k.mWidth / 2 - x);
+ } else {
+ return Integer.MAX_VALUE;
+ }
+ }
+
+ @Override
+ public int[] getNearestKeys(int x, int y) {
+ if (mCurrentlyInSpace) {
+ return mSpaceKeyIndexArray;
+ } else {
+ // Avoid dead pixels at edges of the keyboard
+ return super.getNearestKeys(Math.max(0, Math.min(x, getMinWidth() - 1)),
+ Math.max(0, Math.min(y, getHeight() - 1)));
+ }
+ }
+
+ private int getTextSizeFromTheme(int style, int defValue) {
+ TypedArray array = mContext.getTheme().obtainStyledAttributes(
+ style, new int[] { android.R.attr.textSize });
+ int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue);
+ return textSize;
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
new file mode 100644
index 000000000..af2fd5ce1
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.Utils;
+import com.android.inputmethod.voice.VoiceIMEConnector;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+
+// TODO: We should remove this class
+public class LatinKeyboardView extends KeyboardView {
+ private static final String TAG = LatinKeyboardView.class.getSimpleName();
+ private static boolean DEBUG_MODE = LatinImeLogger.sDBG;
+
+ /** Whether we've started dropping move events because we found a big jump */
+ private boolean mDroppingEvents;
+ /**
+ * Whether multi-touch disambiguation needs to be disabled if a real multi-touch event has
+ * occured
+ */
+ private boolean mDisableDisambiguation;
+ /** The distance threshold at which we start treating the touch session as a multi-touch */
+ private int mJumpThresholdSquare = Integer.MAX_VALUE;
+ /** The y coordinate of the last row */
+ private int mLastRowY;
+ private int mLastX;
+ private int mLastY;
+
+ public LatinKeyboardView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ public void setPreviewEnabled(boolean previewEnabled) {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null
+ && (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard())) {
+ // Phone and number keyboard never shows popup preview (except language switch).
+ super.setPreviewEnabled(false);
+ } else {
+ super.setPreviewEnabled(previewEnabled);
+ }
+ }
+
+ public void setLatinKeyboard(LatinKeyboard newKeyboard) {
+ final LatinKeyboard oldKeyboard = getLatinKeyboard();
+ if (oldKeyboard != null) {
+ // Reset old keyboard state before switching to new keyboard.
+ oldKeyboard.keyReleased();
+ }
+ super.setKeyboard(newKeyboard);
+ // One-seventh of the keyboard width seems like a reasonable threshold
+ mJumpThresholdSquare = newKeyboard.getMinWidth() / 7;
+ mJumpThresholdSquare *= mJumpThresholdSquare;
+ // Assuming there are 4 rows, this is the coordinate of the last row
+ mLastRowY = (newKeyboard.getHeight() * 3) / 4;
+ }
+
+ public LatinKeyboard getLatinKeyboard() {
+ Keyboard keyboard = getKeyboard();
+ if (keyboard instanceof LatinKeyboard) {
+ return (LatinKeyboard)keyboard;
+ } else {
+ return null;
+ }
+ }
+
+ public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboard oldKeyboard) {
+ final LatinKeyboard currentKeyboard = getLatinKeyboard();
+ // We should not set text fade factor to the keyboard which does not display the language on
+ // its spacebar.
+ if (currentKeyboard != null && currentKeyboard == oldKeyboard)
+ currentKeyboard.setSpacebarTextFadeFactor(fadeFactor, this);
+ }
+
+ @Override
+ protected boolean onLongPress(Key key, PointerTracker tracker) {
+ int primaryCode = key.mCode;
+ if (primaryCode == Keyboard.CODE_SETTINGS) {
+ return invokeOnKey(Keyboard.CODE_SETTINGS_LONGPRESS);
+ } else if (primaryCode == '0' && getLatinKeyboard().isPhoneKeyboard()) {
+ // Long pressing on 0 in phone number keypad gives you a '+'.
+ return invokeOnKey('+');
+ } else {
+ return super.onLongPress(key, tracker);
+ }
+ }
+
+ private boolean invokeOnKey(int primaryCode) {
+ getOnKeyboardActionListener().onCodeInput(primaryCode, null,
+ KeyboardActionListener.NOT_A_TOUCH_COORDINATE,
+ KeyboardActionListener.NOT_A_TOUCH_COORDINATE);
+ return true;
+ }
+
+ @Override
+ protected CharSequence adjustCase(CharSequence label) {
+ LatinKeyboard keyboard = getLatinKeyboard();
+ if (keyboard.isAlphaKeyboard()
+ && keyboard.isShiftedOrShiftLocked()
+ && !TextUtils.isEmpty(label) && label.length() < 3
+ && Character.isLowerCase(label.charAt(0))) {
+ return label.toString().toUpperCase();
+ }
+ return label;
+ }
+
+ /**
+ * This function checks to see if we need to handle any sudden jumps in the pointer location
+ * that could be due to a multi-touch being treated as a move by the firmware or hardware.
+ * Once a sudden jump is detected, all subsequent move events are discarded
+ * until an UP is received.<P>
+ * When a sudden jump is detected, an UP event is simulated at the last position and when
+ * the sudden moves subside, a DOWN event is simulated for the second key.
+ * @param me the motion event
+ * @return true if the event was consumed, so that it doesn't continue to be handled by
+ * KeyboardView.
+ */
+ private boolean handleSuddenJump(MotionEvent me) {
+ final int action = me.getAction();
+ final int x = (int) me.getX();
+ final int y = (int) me.getY();
+ boolean result = false;
+
+ // Real multi-touch event? Stop looking for sudden jumps
+ if (me.getPointerCount() > 1) {
+ mDisableDisambiguation = true;
+ }
+ if (mDisableDisambiguation) {
+ // If UP, reset the multi-touch flag
+ if (action == MotionEvent.ACTION_UP) mDisableDisambiguation = false;
+ return false;
+ }
+
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ // Reset the "session"
+ mDroppingEvents = false;
+ mDisableDisambiguation = false;
+ break;
+ case MotionEvent.ACTION_MOVE:
+ // Is this a big jump?
+ final int distanceSquare = (mLastX - x) * (mLastX - x) + (mLastY - y) * (mLastY - y);
+ // Check the distance and also if the move is not entirely within the bottom row
+ // If it's only in the bottom row, it might be an intentional slide gesture
+ // for language switching
+ if (distanceSquare > mJumpThresholdSquare
+ && (mLastY < mLastRowY || y < mLastRowY)) {
+ // If we're not yet dropping events, start dropping and send an UP event
+ if (!mDroppingEvents) {
+ mDroppingEvents = true;
+ // Send an up event
+ MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
+ MotionEvent.ACTION_UP,
+ mLastX, mLastY, me.getMetaState());
+ super.onTouchEvent(translated);
+ translated.recycle();
+ }
+ result = true;
+ } else if (mDroppingEvents) {
+ // If moves are small and we're already dropping events, continue dropping
+ result = true;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mDroppingEvents) {
+ // Send a down event first, as we dropped a bunch of sudden jumps and assume that
+ // the user is releasing the touch on the second key.
+ MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
+ MotionEvent.ACTION_DOWN,
+ x, y, me.getMetaState());
+ super.onTouchEvent(translated);
+ translated.recycle();
+ mDroppingEvents = false;
+ // Let the up event get processed as well, result = false
+ }
+ break;
+ }
+ // Track the previous coordinate
+ mLastX = x;
+ mLastY = y;
+ return result;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent me) {
+ LatinKeyboard keyboard = getLatinKeyboard();
+ if (keyboard == null) return true;
+
+ // If there was a sudden jump, return without processing the actual motion event.
+ if (handleSuddenJump(me)) {
+ if (DEBUG_MODE)
+ Log.w(TAG, "onTouchEvent: ignore sudden jump " + me);
+ return true;
+ }
+
+ // Reset any bounding box controls in the keyboard
+ if (me.getAction() == MotionEvent.ACTION_DOWN) {
+ keyboard.keyReleased();
+ }
+
+ if (me.getAction() == MotionEvent.ACTION_UP) {
+ int languageDirection = keyboard.getLanguageChangeDirection();
+ if (languageDirection != 0) {
+ getOnKeyboardActionListener().onCodeInput(
+ languageDirection == 1
+ ? Keyboard.CODE_NEXT_LANGUAGE : Keyboard.CODE_PREV_LANGUAGE,
+ null, mLastX, mLastY);
+ me.setAction(MotionEvent.ACTION_CANCEL);
+ keyboard.keyReleased();
+ return super.onTouchEvent(me);
+ }
+ }
+
+ return super.onTouchEvent(me);
+ }
+
+ @Override
+ public void draw(Canvas c) {
+ Utils.GCUtils.getInstance().reset();
+ boolean tryGC = true;
+ for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
+ try {
+ super.draw(c);
+ tryGC = false;
+ } catch (OutOfMemoryError e) {
+ tryGC = Utils.GCUtils.getInstance().tryGCOrWait("LatinKeyboardView", e);
+ }
+ }
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ // Token is available from here.
+ VoiceIMEConnector.getInstance().onAttachedToWindow();
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/ModifierKeyState.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
index 097e87abe..3b1408ccf 100644
--- a/java/src/com/android/inputmethod/latin/ModifierKeyState.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -14,29 +14,22 @@
* the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.keyboard;
-class ModifierKeyState {
- private static final int RELEASING = 0;
- private static final int PRESSING = 1;
- private static final int MOMENTARY = 2;
+import android.content.Context;
- private int mState = RELEASING;
+public class MiniKeyboard extends Keyboard {
+ private int mDefaultKeyCoordX;
- public void onPress() {
- mState = PRESSING;
+ public MiniKeyboard(Context context, int xmlLayoutResId, KeyboardId id) {
+ super(context, xmlLayoutResId, id);
}
- public void onRelease() {
- mState = RELEASING;
+ public void setDefaultCoordX(int pos) {
+ mDefaultKeyCoordX = pos;
}
- public void onOtherKeyPressed() {
- if (mState == PRESSING)
- mState = MOMENTARY;
- }
-
- public boolean isMomentary() {
- return mState == MOMENTARY;
+ public int getDefaultCoordX() {
+ return mDefaultKeyCoordX;
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
new file mode 100644
index 000000000..53dab9440
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Paint;
+import android.graphics.Rect;
+
+import java.util.List;
+
+public class MiniKeyboardBuilder {
+ private final Resources mRes;
+ private final MiniKeyboard mKeyboard;
+ private final CharSequence[] mPopupCharacters;
+ private final MiniKeyboardLayoutParams mParams;
+
+ /* package */ static class MiniKeyboardLayoutParams {
+ public final int mKeyWidth;
+ public final int mRowHeight;
+ /* package */ final boolean mTopRowNeedsCentering;
+ public final int mNumRows;
+ public final int mNumColumns;
+ public final int mLeftKeys;
+ public final int mRightKeys; // includes default key.
+
+ /**
+ * The object holding mini keyboard layout parameters.
+ *
+ * @param numKeys number of keys in this mini keyboard.
+ * @param maxColumns number of maximum columns of this mini keyboard.
+ * @param keyWidth mini keyboard key width in pixel, including horizontal gap.
+ * @param rowHeight mini keyboard row height in pixel, including vertical gap.
+ * @param coordXInParent coordinate x of the popup key in parent keyboard.
+ * @param parentKeyboardWidth parent keyboard width in pixel.
+ */
+ public MiniKeyboardLayoutParams(int numKeys, int maxColumns, int keyWidth, int rowHeight,
+ int coordXInParent, int parentKeyboardWidth) {
+ if (parentKeyboardWidth / keyWidth < maxColumns)
+ throw new IllegalArgumentException("Keyboard is too small to hold mini keyboard: "
+ + parentKeyboardWidth + " " + keyWidth + " " + maxColumns);
+ final int numRows = (numKeys + maxColumns - 1) / maxColumns;
+ mKeyWidth = keyWidth;
+ mRowHeight = rowHeight;
+ mNumRows = numRows;
+
+ final int numColumns = Math.min(numKeys, maxColumns);
+ final int topRowKeys = numKeys % numColumns;
+ mNumColumns = numColumns;
+ mTopRowNeedsCentering = topRowKeys != 0 && (numColumns - topRowKeys) % 2 != 0;
+
+ final int numLeftKeys = (numColumns - 1) / 2;
+ final int numRightKeys = numColumns - numLeftKeys; // including default key.
+ final int maxLeftKeys = coordXInParent / keyWidth;
+ final int maxRightKeys = Math.max(1, (parentKeyboardWidth - coordXInParent) / keyWidth);
+ if (numLeftKeys > maxLeftKeys) {
+ mLeftKeys = maxLeftKeys;
+ mRightKeys = numColumns - maxLeftKeys;
+ } else if (numRightKeys > maxRightKeys) {
+ mLeftKeys = numColumns - maxRightKeys;
+ mRightKeys = maxRightKeys;
+ } else {
+ mLeftKeys = numLeftKeys;
+ mRightKeys = numRightKeys;
+ }
+ }
+
+ // Return key position according to column count (0 is default).
+ /* package */ int getColumnPos(int n) {
+ final int col = n % mNumColumns;
+ if (col == 0) {
+ // default position.
+ return 0;
+ }
+ int pos = 0;
+ int right = 1; // include default position key.
+ int left = 0;
+ int i = 0;
+ while (true) {
+ // Assign right key if available.
+ if (right < mRightKeys) {
+ pos = right;
+ right++;
+ i++;
+ }
+ if (i >= col)
+ break;
+ // Assign left key if available.
+ if (left < mLeftKeys) {
+ left++;
+ pos = -left;
+ i++;
+ }
+ if (i >= col)
+ break;
+ }
+ return pos;
+ }
+
+ public int getDefaultKeyCoordX() {
+ return mLeftKeys * mKeyWidth;
+ }
+
+ public int getX(int n, int row) {
+ final int x = getColumnPos(n) * mKeyWidth + getDefaultKeyCoordX();
+ if (isLastRow(row) && mTopRowNeedsCentering)
+ return x - mKeyWidth / 2;
+ return x;
+ }
+
+ public int getY(int row) {
+ return (mNumRows - 1 - row) * mRowHeight;
+ }
+
+ public int getRowFlags(int row) {
+ int rowFlags = 0;
+ if (row == 0) rowFlags |= Keyboard.EDGE_TOP;
+ if (isLastRow(row)) rowFlags |= Keyboard.EDGE_BOTTOM;
+ return rowFlags;
+ }
+
+ private boolean isLastRow(int rowCount) {
+ return rowCount == mNumRows - 1;
+ }
+ }
+
+ public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key popupKey) {
+ final Context context = view.getContext();
+ mRes = context.getResources();
+ final MiniKeyboard keyboard = new MiniKeyboard(context, layoutTemplateResId, null);
+ mKeyboard = keyboard;
+ mPopupCharacters = popupKey.mPopupCharacters;
+
+ final int keyWidth = getMaxKeyWidth(view, mPopupCharacters, keyboard.getKeyWidth());
+ final MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+ mPopupCharacters.length, popupKey.mMaxPopupColumn,
+ keyWidth, keyboard.getRowHeight(),
+ popupKey.mX + (popupKey.mWidth + popupKey.mGap) / 2 - keyWidth / 2,
+ view.getMeasuredWidth());
+ mParams = params;
+
+ keyboard.setHeight(params.mNumRows * params.mRowHeight - keyboard.getVerticalGap());
+ keyboard.setMinWidth(params.mNumColumns * params.mKeyWidth);
+ keyboard.setDefaultCoordX(params.getDefaultKeyCoordX() + params.mKeyWidth / 2);
+ }
+
+ private static int getMaxKeyWidth(KeyboardView view, CharSequence[] popupCharacters,
+ int minKeyWidth) {
+ Paint paint = null;
+ Rect bounds = null;
+ int maxWidth = 0;
+ for (CharSequence popupSpec : popupCharacters) {
+ final CharSequence label = PopupCharactersParser.getLabel(popupSpec.toString());
+ // If the label is single letter, minKeyWidth is enough to hold the label.
+ if (label != null && label.length() > 1) {
+ if (paint == null) {
+ paint = new Paint();
+ paint.setAntiAlias(true);
+ }
+ final int labelSize = view.getLabelSizeAndSetPaint(label, 0, paint);
+ paint.setTextSize(labelSize);
+ if (bounds == null) bounds = new Rect();
+ paint.getTextBounds(label.toString(), 0, label.length(), bounds);
+ if (maxWidth < bounds.width())
+ maxWidth = bounds.width();
+ }
+ }
+ final int horizontalPadding = (int)view.getContext().getResources().getDimension(
+ R.dimen.mini_keyboard_key_horizontal_padding);
+ return Math.max(minKeyWidth, maxWidth + horizontalPadding);
+ }
+
+ public MiniKeyboard build() {
+ final MiniKeyboard keyboard = mKeyboard;
+ final List<Key> keys = keyboard.getKeys();
+ final MiniKeyboardLayoutParams params = mParams;
+ for (int n = 0; n < mPopupCharacters.length; n++) {
+ final CharSequence label = mPopupCharacters[n];
+ final int row = n / params.mNumColumns;
+ final Key key = new Key(mRes, keyboard, label, params.getX(n, row), params.getY(row),
+ params.mKeyWidth, params.getRowFlags(row));
+ keys.add(key);
+ }
+ return keyboard;
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
index 356e62d48..f04991eb7 100644
--- a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
@@ -14,11 +14,9 @@
* the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.keyboard;
-import android.inputmethodservice.Keyboard.Key;
-
-class MiniKeyboardKeyDetector extends KeyDetector {
+public class MiniKeyboardKeyDetector extends KeyDetector {
private static final int MAX_NEARBY_KEYS = 1;
private final int mSlideAllowanceSquare;
@@ -41,19 +39,20 @@ class MiniKeyboardKeyDetector extends KeyDetector {
final Key[] keys = getKeys();
final int touchX = getTouchX(x);
final int touchY = getTouchY(y);
- int closestKeyIndex = LatinKeyboardBaseView.NOT_A_KEY;
+
+ int closestKeyIndex = NOT_A_KEY;
int closestKeyDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare;
final int keyCount = keys.length;
- for (int i = 0; i < keyCount; i++) {
- final Key key = keys[i];
- int dist = key.squaredDistanceFrom(touchX, touchY);
+ for (int index = 0; index < keyCount; index++) {
+ final int dist = keys[index].squaredDistanceToEdge(touchX, touchY);
if (dist < closestKeyDist) {
- closestKeyIndex = i;
+ closestKeyIndex = index;
closestKeyDist = dist;
}
}
- if (allKeys != null && closestKeyIndex != LatinKeyboardBaseView.NOT_A_KEY)
- allKeys[0] = keys[closestKeyIndex].codes[0];
+
+ if (allKeys != null && closestKeyIndex != NOT_A_KEY)
+ allKeys[0] = keys[closestKeyIndex].mCode;
return closestKeyIndex;
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java b/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
new file mode 100644
index 000000000..f215db876
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import android.util.Log;
+
+public class ModifierKeyState {
+ protected static final String TAG = "ModifierKeyState";
+ protected static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE;
+
+ protected static final int RELEASING = 0;
+ protected static final int PRESSING = 1;
+ protected static final int MOMENTARY = 2;
+
+ protected final String mName;
+ protected int mState = RELEASING;
+
+ public ModifierKeyState(String name) {
+ mName = name;
+ }
+
+ public void onPress() {
+ final int oldState = mState;
+ mState = PRESSING;
+ if (DEBUG)
+ Log.d(TAG, mName + ".onPress: " + toString(oldState) + " > " + this);
+ }
+
+ public void onRelease() {
+ final int oldState = mState;
+ mState = RELEASING;
+ if (DEBUG)
+ Log.d(TAG, mName + ".onRelease: " + toString(oldState) + " > " + this);
+ }
+
+ public void onOtherKeyPressed() {
+ final int oldState = mState;
+ if (oldState == PRESSING)
+ mState = MOMENTARY;
+ if (DEBUG)
+ Log.d(TAG, mName + ".onOtherKeyPressed: " + toString(oldState) + " > " + this);
+ }
+
+ public boolean isPressing() {
+ return mState == PRESSING;
+ }
+
+ public boolean isReleasing() {
+ return mState == RELEASING;
+ }
+
+ public boolean isMomentary() {
+ return mState == MOMENTARY;
+ }
+
+ @Override
+ public String toString() {
+ return toString(mState);
+ }
+
+ protected String toString(int state) {
+ switch (state) {
+ case RELEASING: return "RELEASING";
+ case PRESSING: return "PRESSING";
+ case MOMENTARY: return "MOMENTARY";
+ default: return "UNKNOWN";
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
new file mode 100644
index 000000000..a981f724f
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -0,0 +1,599 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.keyboard.KeyboardView.UIHandler;
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.R;
+
+import android.content.res.Resources;
+import android.util.Log;
+import android.view.MotionEvent;
+
+import java.util.Arrays;
+
+public class PointerTracker {
+ private static final String TAG = PointerTracker.class.getSimpleName();
+ private static final boolean ENABLE_ASSERTION = false;
+ private static final boolean DEBUG_EVENT = false;
+ private static final boolean DEBUG_MOVE_EVENT = false;
+ private static final boolean DEBUG_LISTENER = false;
+ private static boolean DEBUG_MODE = LatinImeLogger.sDBG;
+
+ public interface UIProxy {
+ public void invalidateKey(Key key);
+ public void showPreview(int keyIndex, PointerTracker tracker);
+ public boolean hasDistinctMultitouch();
+ }
+
+ public final int mPointerId;
+
+ // Timing constants
+ private final int mDelayBeforeKeyRepeatStart;
+ private final int mLongPressKeyTimeout;
+ private final int mLongPressShiftKeyTimeout;
+
+ // Miscellaneous constants
+ private static final int NOT_A_KEY = KeyDetector.NOT_A_KEY;
+
+ private final UIProxy mProxy;
+ private final UIHandler mHandler;
+ private final KeyDetector mKeyDetector;
+ private KeyboardActionListener mListener = EMPTY_LISTENER;
+ private final KeyboardSwitcher mKeyboardSwitcher;
+ private final boolean mHasDistinctMultitouch;
+ private final boolean mConfigSlidingKeyInputEnabled;
+
+ private final int mTouchNoiseThresholdMillis;
+ private final int mTouchNoiseThresholdDistanceSquared;
+
+ private Keyboard mKeyboard;
+ private Key[] mKeys;
+ private int mKeyHysteresisDistanceSquared = -1;
+ private int mKeyQuarterWidthSquared;
+
+ private final PointerTrackerKeyState mKeyState;
+
+ // true if keyboard layout has been changed.
+ private boolean mKeyboardLayoutHasBeenChanged;
+
+ // true if event is already translated to a key action (long press or mini-keyboard)
+ private boolean mKeyAlreadyProcessed;
+
+ // true if this pointer is repeatable key
+ private boolean mIsRepeatableKey;
+
+ // true if this pointer is in sliding key input
+ private boolean mIsInSlidingKeyInput;
+
+ // true if sliding key is allowed.
+ private boolean mIsAllowedSlidingKeyInput;
+
+ // pressed key
+ private int mPreviousKey = NOT_A_KEY;
+
+ // Empty {@link KeyboardActionListener}
+ private static final KeyboardActionListener EMPTY_LISTENER = new KeyboardActionListener() {
+ @Override
+ public void onPress(int primaryCode) {}
+ @Override
+ public void onRelease(int primaryCode) {}
+ @Override
+ public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) {}
+ @Override
+ public void onTextInput(CharSequence text) {}
+ @Override
+ public void onCancelInput() {}
+ @Override
+ public void onSwipeDown() {}
+ };
+
+ public PointerTracker(int id, UIHandler handler, KeyDetector keyDetector, UIProxy proxy,
+ Resources res) {
+ if (proxy == null || handler == null || keyDetector == null)
+ throw new NullPointerException();
+ mPointerId = id;
+ mProxy = proxy;
+ mHandler = handler;
+ mKeyDetector = keyDetector;
+ mKeyboardSwitcher = KeyboardSwitcher.getInstance();
+ mKeyState = new PointerTrackerKeyState(keyDetector);
+ mHasDistinctMultitouch = proxy.hasDistinctMultitouch();
+ mConfigSlidingKeyInputEnabled = res.getBoolean(R.bool.config_sliding_key_input_enabled);
+ mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start);
+ mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout);
+ mLongPressShiftKeyTimeout = res.getInteger(R.integer.config_long_press_shift_key_timeout);
+ mTouchNoiseThresholdMillis = res.getInteger(R.integer.config_touch_noise_threshold_millis);
+ final float touchNoiseThresholdDistance = res.getDimension(
+ R.dimen.config_touch_noise_threshold_distance);
+ mTouchNoiseThresholdDistanceSquared = (int)(
+ touchNoiseThresholdDistance * touchNoiseThresholdDistance);
+ }
+
+ public void setOnKeyboardActionListener(KeyboardActionListener listener) {
+ mListener = listener;
+ }
+
+ // Returns true if keyboard has been changed by this callback.
+ private boolean callListenerOnPressAndCheckKeyboardLayoutChange(int primaryCode) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onPress : " + keyCodePrintable(primaryCode));
+ mListener.onPress(primaryCode);
+ final boolean keyboardLayoutHasBeenChanged = mKeyboardLayoutHasBeenChanged;
+ mKeyboardLayoutHasBeenChanged = false;
+ return keyboardLayoutHasBeenChanged;
+ }
+
+ private void callListenerOnCodeInput(int primaryCode, int[] keyCodes, int x, int y) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onCodeInput: " + keyCodePrintable(primaryCode)
+ + " codes="+ Arrays.toString(keyCodes) + " x=" + x + " y=" + y);
+ mListener.onCodeInput(primaryCode, keyCodes, x, y);
+ }
+
+ private void callListenerOnTextInput(CharSequence text) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onTextInput: text=" + text);
+ mListener.onTextInput(text);
+ }
+
+ private void callListenerOnRelease(int primaryCode) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onRelease : " + keyCodePrintable(primaryCode));
+ mListener.onRelease(primaryCode);
+ }
+
+ private void callListenerOnCancelInput() {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onCancelInput");
+ mListener.onCancelInput();
+ }
+
+ public void setKeyboard(Keyboard keyboard, Key[] keys, float keyHysteresisDistance) {
+ if (keyboard == null || keys == null || keyHysteresisDistance < 0)
+ throw new IllegalArgumentException();
+ mKeyboard = keyboard;
+ mKeys = keys;
+ mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance);
+ final int keyQuarterWidth = keyboard.getKeyWidth() / 4;
+ mKeyQuarterWidthSquared = keyQuarterWidth * keyQuarterWidth;
+ // Mark that keyboard layout has been changed.
+ mKeyboardLayoutHasBeenChanged = true;
+ }
+
+ public boolean isInSlidingKeyInput() {
+ return mIsInSlidingKeyInput;
+ }
+
+ private boolean isValidKeyIndex(int keyIndex) {
+ return keyIndex >= 0 && keyIndex < mKeys.length;
+ }
+
+ public Key getKey(int keyIndex) {
+ return isValidKeyIndex(keyIndex) ? mKeys[keyIndex] : null;
+ }
+
+ private static boolean isModifierCode(int primaryCode) {
+ return primaryCode == Keyboard.CODE_SHIFT
+ || primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL;
+ }
+
+ private boolean isModifierInternal(int keyIndex) {
+ final Key key = getKey(keyIndex);
+ return key == null ? false : isModifierCode(key.mCode);
+ }
+
+ public boolean isModifier() {
+ return isModifierInternal(mKeyState.getKeyIndex());
+ }
+
+ private boolean isOnModifierKey(int x, int y) {
+ return isModifierInternal(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null));
+ }
+
+ public boolean isOnShiftKey(int x, int y) {
+ final Key key = getKey(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null));
+ return key != null && key.mCode == Keyboard.CODE_SHIFT;
+ }
+
+ public boolean isSpaceKey(int keyIndex) {
+ Key key = getKey(keyIndex);
+ return key != null && key.mCode == Keyboard.CODE_SPACE;
+ }
+
+ public void releaseKey() {
+ updateKeyGraphics(NOT_A_KEY);
+ }
+
+ private void updateKeyGraphics(int keyIndex) {
+ int oldKeyIndex = mPreviousKey;
+ mPreviousKey = keyIndex;
+ if (keyIndex != oldKeyIndex) {
+ if (isValidKeyIndex(oldKeyIndex)) {
+ // if new key index is not a key, old key was just released inside of the key.
+ final boolean inside = (keyIndex == NOT_A_KEY);
+ mKeys[oldKeyIndex].onReleased(inside);
+ mProxy.invalidateKey(mKeys[oldKeyIndex]);
+ }
+ if (isValidKeyIndex(keyIndex)) {
+ mKeys[keyIndex].onPressed();
+ mProxy.invalidateKey(mKeys[keyIndex]);
+ }
+ }
+ }
+
+ public void setAlreadyProcessed() {
+ mKeyAlreadyProcessed = true;
+ }
+
+ private void checkAssertion(PointerTrackerQueue queue) {
+ if (mHasDistinctMultitouch && queue == null)
+ throw new RuntimeException(
+ "PointerTrackerQueue must be passed on distinct multi touch device");
+ if (!mHasDistinctMultitouch && queue != null)
+ throw new RuntimeException(
+ "PointerTrackerQueue must be null on non-distinct multi touch device");
+ }
+
+ public void onTouchEvent(int action, int x, int y, long eventTime, PointerTrackerQueue queue) {
+ switch (action) {
+ case MotionEvent.ACTION_MOVE:
+ onMoveEvent(x, y, eventTime, queue);
+ break;
+ case MotionEvent.ACTION_DOWN:
+ case MotionEvent.ACTION_POINTER_DOWN:
+ onDownEvent(x, y, eventTime, queue);
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_POINTER_UP:
+ onUpEvent(x, y, eventTime, queue);
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ onCancelEvent(x, y, eventTime, queue);
+ break;
+ }
+ }
+
+ public void onDownEvent(int x, int y, long eventTime, PointerTrackerQueue queue) {
+ if (ENABLE_ASSERTION) checkAssertion(queue);
+ if (DEBUG_EVENT)
+ printTouchEvent("onDownEvent:", x, y, eventTime);
+
+ // Naive up-to-down noise filter.
+ final long deltaT = eventTime - mKeyState.getUpTime();
+ if (deltaT < mTouchNoiseThresholdMillis) {
+ final int dx = x - mKeyState.getLastX();
+ final int dy = y - mKeyState.getLastY();
+ final int distanceSquared = (dx * dx + dy * dy);
+ if (distanceSquared < mTouchNoiseThresholdDistanceSquared) {
+ if (DEBUG_MODE)
+ Log.w(TAG, "onDownEvent: ignore potential noise: time=" + deltaT
+ + " distance=" + distanceSquared);
+ setAlreadyProcessed();
+ return;
+ }
+ }
+
+ if (queue != null) {
+ if (isOnModifierKey(x, y)) {
+ // Before processing a down event of modifier key, all pointers already being
+ // tracked should be released.
+ queue.releaseAllPointers(eventTime);
+ }
+ queue.add(this);
+ }
+ onDownEventInternal(x, y, eventTime);
+ }
+
+ private void onDownEventInternal(int x, int y, long eventTime) {
+ int keyIndex = mKeyState.onDownKey(x, y, eventTime);
+ // Sliding key is allowed when 1) enabled by configuration, 2) this pointer starts sliding
+ // from modifier key, or 3) this pointer is on mini-keyboard.
+ mIsAllowedSlidingKeyInput = mConfigSlidingKeyInputEnabled || isModifierInternal(keyIndex)
+ || mKeyDetector instanceof MiniKeyboardKeyDetector;
+ mKeyboardLayoutHasBeenChanged = false;
+ mKeyAlreadyProcessed = false;
+ mIsRepeatableKey = false;
+ mIsInSlidingKeyInput = false;
+ if (isValidKeyIndex(keyIndex)) {
+ // This onPress call may have changed keyboard layout. Those cases are detected at
+ // {@link #setKeyboard}. In those cases, we should update keyIndex according to the new
+ // keyboard layout.
+ if (callListenerOnPressAndCheckKeyboardLayoutChange(mKeys[keyIndex].mCode))
+ keyIndex = mKeyState.onDownKey(x, y, eventTime);
+ }
+ if (isValidKeyIndex(keyIndex)) {
+ if (mKeys[keyIndex].mRepeatable) {
+ repeatKey(keyIndex);
+ mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this);
+ mIsRepeatableKey = true;
+ }
+ startLongPressTimer(keyIndex);
+ }
+ showKeyPreviewAndUpdateKeyGraphics(keyIndex);
+ }
+
+ public void onMoveEvent(int x, int y, long eventTime, PointerTrackerQueue queue) {
+ if (ENABLE_ASSERTION) checkAssertion(queue);
+ if (DEBUG_MOVE_EVENT)
+ printTouchEvent("onMoveEvent:", x, y, eventTime);
+ if (mKeyAlreadyProcessed)
+ return;
+ final PointerTrackerKeyState keyState = mKeyState;
+
+ final int lastX = keyState.getLastX();
+ final int lastY = keyState.getLastY();
+ int keyIndex = keyState.onMoveKey(x, y);
+ final Key oldKey = getKey(keyState.getKeyIndex());
+ if (isValidKeyIndex(keyIndex)) {
+ if (oldKey == null) {
+ // The pointer has been slid in to the new key, but the finger was not on any keys.
+ // In this case, we must call onPress() to notify that the new key is being pressed.
+ // This onPress call may have changed keyboard layout. Those cases are detected at
+ // {@link #setKeyboard}. In those cases, we should update keyIndex according to the
+ // new keyboard layout.
+ if (callListenerOnPressAndCheckKeyboardLayoutChange(getKey(keyIndex).mCode))
+ keyIndex = keyState.onMoveKey(x, y);
+ keyState.onMoveToNewKey(keyIndex, x, y);
+ startLongPressTimer(keyIndex);
+ } else if (!isMinorMoveBounce(x, y, keyIndex)) {
+ // The pointer has been slid in to the new key from the previous key, we must call
+ // onRelease() first to notify that the previous key has been released, then call
+ // onPress() to notify that the new key is being pressed.
+ mIsInSlidingKeyInput = true;
+ callListenerOnRelease(oldKey.mCode);
+ mHandler.cancelLongPressTimers();
+ if (mIsAllowedSlidingKeyInput) {
+ // This onPress call may have changed keyboard layout. Those cases are detected
+ // at {@link #setKeyboard}. In those cases, we should update keyIndex according
+ // to the new keyboard layout.
+ if (callListenerOnPressAndCheckKeyboardLayoutChange(getKey(keyIndex).mCode))
+ keyIndex = keyState.onMoveKey(x, y);
+ keyState.onMoveToNewKey(keyIndex, x, y);
+ startLongPressTimer(keyIndex);
+ } else {
+ // HACK: On some devices, quick successive touches may be translated to sudden
+ // move by touch panel firmware. This hack detects the case and translates the
+ // move event to successive up and down events.
+ final int dx = x - lastX;
+ final int dy = y - lastY;
+ final int lastMoveSquared = dx * dx + dy * dy;
+ if (lastMoveSquared >= mKeyQuarterWidthSquared) {
+ if (DEBUG_MODE)
+ Log.w(TAG, String.format("onMoveEvent: sudden move is translated to "
+ + "up[%d,%d]/down[%d,%d] events", lastX, lastY, x, y));
+ onUpEventInternal(lastX, lastY, eventTime);
+ onDownEventInternal(x, y, eventTime);
+ } else {
+ setAlreadyProcessed();
+ showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY);
+ }
+ return;
+ }
+ }
+ } else {
+ if (oldKey != null && !isMinorMoveBounce(x, y, keyIndex)) {
+ // The pointer has been slid out from the previous key, we must call onRelease() to
+ // notify that the previous key has been released.
+ mIsInSlidingKeyInput = true;
+ callListenerOnRelease(oldKey.mCode);
+ mHandler.cancelLongPressTimers();
+ if (mIsAllowedSlidingKeyInput) {
+ keyState.onMoveToNewKey(keyIndex, x ,y);
+ } else {
+ setAlreadyProcessed();
+ showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY);
+ return;
+ }
+ }
+ }
+ showKeyPreviewAndUpdateKeyGraphics(mKeyState.getKeyIndex());
+ }
+
+ public void onUpEvent(int x, int y, long eventTime, PointerTrackerQueue queue) {
+ if (ENABLE_ASSERTION) checkAssertion(queue);
+ if (DEBUG_EVENT)
+ printTouchEvent("onUpEvent :", x, y, eventTime);
+
+ if (queue != null) {
+ if (isModifier()) {
+ // Before processing an up event of modifier key, all pointers already being
+ // tracked should be released.
+ queue.releaseAllPointersExcept(this, eventTime);
+ } else {
+ queue.releaseAllPointersOlderThan(this, eventTime);
+ }
+ queue.remove(this);
+ }
+ onUpEventInternal(x, y, eventTime);
+ }
+
+ public void onUpEventForRelease(int x, int y, long eventTime) {
+ onUpEventInternal(x, y, eventTime);
+ }
+
+ private void onUpEventInternal(int pointX, int pointY, long eventTime) {
+ int x = pointX;
+ int y = pointY;
+ mHandler.cancelKeyTimers();
+ mHandler.cancelPopupPreview();
+ showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY);
+ mIsInSlidingKeyInput = false;
+ if (mKeyAlreadyProcessed)
+ return;
+ final PointerTrackerKeyState keyState = mKeyState;
+ int keyIndex = keyState.onUpKey(x, y, eventTime);
+ if (isMinorMoveBounce(x, y, keyIndex)) {
+ // Use previous fixed key index and coordinates.
+ keyIndex = keyState.getKeyIndex();
+ x = keyState.getKeyX();
+ y = keyState.getKeyY();
+ }
+ if (!mIsRepeatableKey) {
+ detectAndSendKey(keyIndex, x, y);
+ }
+
+ if (isValidKeyIndex(keyIndex))
+ mProxy.invalidateKey(mKeys[keyIndex]);
+ }
+
+ public void onCancelEvent(int x, int y, long eventTime, PointerTrackerQueue queue) {
+ if (ENABLE_ASSERTION) checkAssertion(queue);
+ if (DEBUG_EVENT)
+ printTouchEvent("onCancelEvt:", x, y, eventTime);
+
+ if (queue != null)
+ queue.remove(this);
+ onCancelEventInternal();
+ }
+
+ private void onCancelEventInternal() {
+ mHandler.cancelKeyTimers();
+ mHandler.cancelPopupPreview();
+ showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY);
+ mIsInSlidingKeyInput = false;
+ int keyIndex = mKeyState.getKeyIndex();
+ if (isValidKeyIndex(keyIndex))
+ mProxy.invalidateKey(mKeys[keyIndex]);
+ }
+
+ public void repeatKey(int keyIndex) {
+ Key key = getKey(keyIndex);
+ if (key != null) {
+ detectAndSendKey(keyIndex, key.mX, key.mY);
+ }
+ }
+
+ public int getLastX() {
+ return mKeyState.getLastX();
+ }
+
+ public int getLastY() {
+ return mKeyState.getLastY();
+ }
+
+ public long getDownTime() {
+ return mKeyState.getDownTime();
+ }
+
+ // These package scope methods are only for debugging purpose.
+ /* package */ int getStartX() {
+ return mKeyState.getStartX();
+ }
+
+ /* package */ int getStartY() {
+ return mKeyState.getStartY();
+ }
+
+ private boolean isMinorMoveBounce(int x, int y, int newKey) {
+ if (mKeys == null || mKeyHysteresisDistanceSquared < 0)
+ throw new IllegalStateException("keyboard and/or hysteresis not set");
+ int curKey = mKeyState.getKeyIndex();
+ if (newKey == curKey) {
+ return true;
+ } else if (isValidKeyIndex(curKey)) {
+ return mKeys[curKey].squaredDistanceToEdge(x, y) < mKeyHysteresisDistanceSquared;
+ } else {
+ return false;
+ }
+ }
+
+ private void showKeyPreviewAndUpdateKeyGraphics(int keyIndex) {
+ updateKeyGraphics(keyIndex);
+ // The modifier key, such as shift key, should not be shown as preview when multi-touch is
+ // supported. On the other hand, if multi-touch is not supported, the modifier key should
+ // be shown as preview.
+ if (mHasDistinctMultitouch && isModifier()) {
+ mProxy.showPreview(NOT_A_KEY, this);
+ } else {
+ mProxy.showPreview(keyIndex, this);
+ }
+ }
+
+ private void startLongPressTimer(int keyIndex) {
+ Key key = getKey(keyIndex);
+ if (key.mCode == Keyboard.CODE_SHIFT) {
+ mHandler.startLongPressShiftTimer(mLongPressShiftKeyTimeout, keyIndex, this);
+ } else if (key.mManualTemporaryUpperCaseCode != Keyboard.CODE_DUMMY
+ && mKeyboard.isManualTemporaryUpperCase()) {
+ // We need not start long press timer on the key which has manual temporary upper case
+ // code defined and the keyboard is in manual temporary upper case mode.
+ return;
+ } else if (mKeyboardSwitcher.isInMomentaryAutoModeSwitchState()) {
+ // We use longer timeout for sliding finger input started from the symbols mode key.
+ mHandler.startLongPressTimer(mLongPressKeyTimeout * 3, keyIndex, this);
+ } else {
+ mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this);
+ }
+ }
+
+ private void detectAndSendKey(int index, int x, int y) {
+ final Key key = getKey(index);
+ if (key == null) {
+ callListenerOnCancelInput();
+ return;
+ }
+ if (key.mOutputText != null) {
+ callListenerOnTextInput(key.mOutputText);
+ callListenerOnRelease(key.mCode);
+ } else {
+ int code = key.mCode;
+ final int[] codes = mKeyDetector.newCodeArray();
+ mKeyDetector.getKeyIndexAndNearbyCodes(x, y, codes);
+
+ // If keyboard is in manual temporary upper case state and key has manual temporary
+ // shift code, alternate character code should be sent.
+ if (mKeyboard.isManualTemporaryUpperCase()
+ && key.mManualTemporaryUpperCaseCode != Keyboard.CODE_DUMMY) {
+ code = key.mManualTemporaryUpperCaseCode;
+ codes[0] = code;
+ }
+
+ // Swap the first and second values in the codes array if the primary code is not the
+ // first value but the second value in the array. This happens when key debouncing is
+ // in effect.
+ if (codes.length >= 2 && codes[0] != code && codes[1] == code) {
+ codes[1] = codes[0];
+ codes[0] = code;
+ }
+ if (key.mEnabled)
+ callListenerOnCodeInput(code, codes, x, y);
+ callListenerOnRelease(code);
+ }
+ }
+
+ public CharSequence getPreviewText(Key key) {
+ return key.mLabel;
+ }
+
+ private long mPreviousEventTime;
+
+ private void printTouchEvent(String title, int x, int y, long eventTime) {
+ final int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null);
+ final Key key = getKey(keyIndex);
+ final String code = (key == null) ? "----" : keyCodePrintable(key.mCode);
+ final long delta = eventTime - mPreviousEventTime;
+ Log.d(TAG, String.format("%s%s[%d] %4d %4d %5d %3d(%s)", title,
+ (mKeyAlreadyProcessed ? "-" : " "), mPointerId, x, y, delta, keyIndex, code));
+ mPreviousEventTime = eventTime;
+ }
+
+ private static String keyCodePrintable(int primaryCode) {
+ final String modifier = isModifierCode(primaryCode) ? " modifier" : "";
+ return String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode) + modifier;
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java b/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
new file mode 100644
index 000000000..250bb95eb
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+/**
+ * This class keeps track of a key index and a position where {@link PointerTracker} is.
+ */
+/* package */ class PointerTrackerKeyState {
+ private final KeyDetector mKeyDetector;
+
+ // The position and time at which first down event occurred.
+ private int mStartX;
+ private int mStartY;
+ private long mDownTime;
+ private long mUpTime;
+
+ // The current key index where this pointer is.
+ private int mKeyIndex = KeyDetector.NOT_A_KEY;
+ // The position where mKeyIndex was recognized for the first time.
+ private int mKeyX;
+ private int mKeyY;
+
+ // Last pointer position.
+ private int mLastX;
+ private int mLastY;
+
+ public PointerTrackerKeyState(KeyDetector keyDetecor) {
+ mKeyDetector = keyDetecor;
+ }
+
+ public int getKeyIndex() {
+ return mKeyIndex;
+ }
+
+ public int getKeyX() {
+ return mKeyX;
+ }
+
+ public int getKeyY() {
+ return mKeyY;
+ }
+
+ public int getStartX() {
+ return mStartX;
+ }
+
+ public int getStartY() {
+ return mStartY;
+ }
+
+ public long getDownTime() {
+ return mDownTime;
+ }
+
+ public long getUpTime() {
+ return mUpTime;
+ }
+
+ public int getLastX() {
+ return mLastX;
+ }
+
+ public int getLastY() {
+ return mLastY;
+ }
+
+ public int onDownKey(int x, int y, long eventTime) {
+ mStartX = x;
+ mStartY = y;
+ mDownTime = eventTime;
+ return onMoveToNewKey(onMoveKeyInternal(x, y), x, y);
+ }
+
+ private int onMoveKeyInternal(int x, int y) {
+ mLastX = x;
+ mLastY = y;
+ return mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null);
+ }
+
+ public int onMoveKey(int x, int y) {
+ return onMoveKeyInternal(x, y);
+ }
+
+ public int onMoveToNewKey(int keyIndex, int x, int y) {
+ mKeyIndex = keyIndex;
+ mKeyX = x;
+ mKeyY = y;
+ return keyIndex;
+ }
+
+ public int onUpKey(int x, int y, long eventTime) {
+ mUpTime = eventTime;
+ return onMoveKeyInternal(x, y);
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java
new file mode 100644
index 000000000..928f3cdc1
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import java.util.LinkedList;
+
+public class PointerTrackerQueue {
+ private LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>();
+
+ public void add(PointerTracker tracker) {
+ mQueue.add(tracker);
+ }
+
+ public void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) {
+ if (mQueue.lastIndexOf(tracker) < 0) {
+ return;
+ }
+ LinkedList<PointerTracker> queue = mQueue;
+ int oldestPos = 0;
+ for (PointerTracker t = queue.get(oldestPos); t != tracker; t = queue.get(oldestPos)) {
+ if (t.isModifier()) {
+ oldestPos++;
+ } else {
+ t.onUpEventForRelease(t.getLastX(), t.getLastY(), eventTime);
+ t.setAlreadyProcessed();
+ queue.remove(oldestPos);
+ }
+ }
+ }
+
+ public void releaseAllPointers(long eventTime) {
+ releaseAllPointersExcept(null, eventTime);
+ }
+
+ public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
+ for (PointerTracker t : mQueue) {
+ if (t == tracker)
+ continue;
+ t.onUpEventForRelease(t.getLastX(), t.getLastY(), eventTime);
+ t.setAlreadyProcessed();
+ }
+ mQueue.clear();
+ if (tracker != null)
+ mQueue.add(tracker);
+ }
+
+ public void remove(PointerTracker tracker) {
+ mQueue.remove(tracker);
+ }
+
+ public boolean isInSlidingKeyInput() {
+ for (final PointerTracker tracker : mQueue) {
+ if (tracker.isInSlidingKeyInput())
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("[");
+ for (PointerTracker tracker : mQueue) {
+ if (sb.length() > 1)
+ sb.append(" ");
+ sb.append(String.format("%d", tracker.mPointerId));
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java b/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
new file mode 100644
index 000000000..32c25801d
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+
+/**
+ * String parser of popupCharacters attribute of Key.
+ * The string is comma separated texts each of which represents one popup key.
+ * Each popup key text is one of the following:
+ * - A single letter (Letter)
+ * - Label optionally followed by keyOutputText or code (keyLabel|keyOutputText).
+ * - Icon followed by keyOutputText or code (@drawable/icon|@integer/key_code)
+ * Special character, comma ',' backslash '\', and bar '|' can be escaped by '\'
+ * character.
+ * Note that the character '@' and '\' are also parsed by XML parser and CSV parser as well.
+ */
+public class PopupCharactersParser {
+ private static final char ESCAPE = '\\';
+ private static final String LABEL_END = "|";
+ private static final String PREFIX_AT = "@";
+ private static final String PREFIX_ICON = PREFIX_AT + "drawable/";
+ private static final String PREFIX_CODE = PREFIX_AT + "integer/";
+
+ private PopupCharactersParser() {
+ // Intentional empty constructor for utility class.
+ }
+
+ private static boolean hasIcon(String popupSpec) {
+ if (popupSpec.startsWith(PREFIX_ICON)) {
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ if (end > 0)
+ return true;
+ throw new PopupCharactersParserError("outputText or code not specified: " + popupSpec);
+ }
+ return false;
+ }
+
+ private static boolean hasCode(String popupSpec) {
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ if (end > 0 && end + 1 < popupSpec.length()
+ && popupSpec.substring(end + 1).startsWith(PREFIX_CODE)) {
+ return true;
+ }
+ return false;
+ }
+
+ private static String parseEscape(String text) {
+ if (text.indexOf(ESCAPE) < 0)
+ return text;
+ final int length = text.length();
+ final StringBuilder sb = new StringBuilder();
+ for (int pos = 0; pos < length; pos++) {
+ final char c = text.charAt(pos);
+ if (c == ESCAPE && pos + 1 < length) {
+ sb.append(text.charAt(++pos));
+ } else {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+ private static int indexOfLabelEnd(String popupSpec, int start) {
+ if (popupSpec.indexOf(ESCAPE, start) < 0) {
+ final int end = popupSpec.indexOf(LABEL_END, start);
+ if (end == 0)
+ throw new PopupCharactersParserError(LABEL_END + " at " + start + ": " + popupSpec);
+ return end;
+ }
+ final int length = popupSpec.length();
+ for (int pos = start; pos < length; pos++) {
+ final char c = popupSpec.charAt(pos);
+ if (c == ESCAPE && pos + 1 < length) {
+ pos++;
+ } else if (popupSpec.startsWith(LABEL_END, pos)) {
+ return pos;
+ }
+ }
+ return -1;
+ }
+
+ public static String getLabel(String popupSpec) {
+ if (hasIcon(popupSpec))
+ return null;
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ final String label = (end > 0) ? parseEscape(popupSpec.substring(0, end))
+ : parseEscape(popupSpec);
+ if (TextUtils.isEmpty(label))
+ throw new PopupCharactersParserError("Empty label: " + popupSpec);
+ return label;
+ }
+
+ public static String getOutputText(String popupSpec) {
+ if (hasCode(popupSpec))
+ return null;
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ if (end > 0) {
+ if (indexOfLabelEnd(popupSpec, end + 1) >= 0)
+ throw new PopupCharactersParserError("Multiple " + LABEL_END + ": "
+ + popupSpec);
+ final String outputText = parseEscape(popupSpec.substring(end + LABEL_END.length()));
+ if (!TextUtils.isEmpty(outputText))
+ return outputText;
+ throw new PopupCharactersParserError("Empty outputText: " + popupSpec);
+ }
+ final String label = getLabel(popupSpec);
+ if (label == null)
+ throw new PopupCharactersParserError("Empty label: " + popupSpec);
+ // Code is automatically generated for one letter label. See {@link getCode()}.
+ if (label.length() == 1)
+ return null;
+ return label;
+ }
+
+ public static int getCode(Resources res, String popupSpec) {
+ if (hasCode(popupSpec)) {
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ if (indexOfLabelEnd(popupSpec, end + 1) >= 0)
+ throw new PopupCharactersParserError("Multiple " + LABEL_END + ": " + popupSpec);
+ final int resId = getResourceId(res,
+ popupSpec.substring(end + LABEL_END.length() + PREFIX_AT.length()));
+ final int code = res.getInteger(resId);
+ return code;
+ }
+ if (indexOfLabelEnd(popupSpec, 0) > 0)
+ return Keyboard.CODE_DUMMY;
+ final String label = getLabel(popupSpec);
+ // Code is automatically generated for one letter label.
+ if (label != null && label.length() == 1)
+ return label.charAt(0);
+ return Keyboard.CODE_DUMMY;
+ }
+
+ public static Drawable getIcon(Resources res, String popupSpec) {
+ if (hasIcon(popupSpec)) {
+ int end = popupSpec.indexOf(LABEL_END, PREFIX_ICON.length() + 1);
+ int resId = getResourceId(res, popupSpec.substring(PREFIX_AT.length(), end));
+ return res.getDrawable(resId);
+ }
+ return null;
+ }
+
+ private static int getResourceId(Resources res, String name) {
+ String packageName = res.getResourcePackageName(R.string.english_ime_name);
+ int resId = res.getIdentifier(name, null, packageName);
+ if (resId == 0)
+ throw new PopupCharactersParserError("Unknown resource: " + name);
+ return resId;
+ }
+
+ @SuppressWarnings("serial")
+ public static class PopupCharactersParserError extends RuntimeException {
+ public PopupCharactersParserError(String message) {
+ super(message);
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java
new file mode 100644
index 000000000..0920da2cb
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import java.util.Arrays;
+
+public class ProximityKeyDetector extends KeyDetector {
+ private static final int MAX_NEARBY_KEYS = 12;
+
+ // working area
+ private int[] mDistances = new int[MAX_NEARBY_KEYS];
+
+ @Override
+ protected int getMaxNearbyKeys() {
+ return MAX_NEARBY_KEYS;
+ }
+
+ @Override
+ public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) {
+ final Key[] keys = getKeys();
+ final int touchX = getTouchX(x);
+ final int touchY = getTouchY(y);
+
+ int primaryIndex = NOT_A_KEY;
+ final int[] distances = mDistances;
+ Arrays.fill(distances, Integer.MAX_VALUE);
+ for (final int index : mKeyboard.getNearestKeys(touchX, touchY)) {
+ final Key key = keys[index];
+ final boolean isInside = key.isInside(touchX, touchY);
+ if (isInside)
+ primaryIndex = index;
+ final int dist = key.squaredDistanceToEdge(touchX, touchY);
+ if (isInside || (mProximityCorrectOn && dist < mProximityThresholdSquare)) {
+ if (allKeys == null) continue;
+ // Find insertion point
+ for (int j = 0; j < distances.length; j++) {
+ if (distances[j] > dist) {
+ final int nextPos = j + 1;
+ System.arraycopy(distances, j, distances, nextPos,
+ distances.length - nextPos);
+ System.arraycopy(allKeys, j, allKeys, nextPos,
+ allKeys.length - nextPos);
+ distances[j] = dist;
+ allKeys[j] = key.mCode;
+ break;
+ }
+ }
+ }
+ }
+
+ return primaryIndex;
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/Row.java b/java/src/com/android/inputmethod/keyboard/Row.java
new file mode 100644
index 000000000..3618c0448
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/Row.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.util.Xml;
+
+/**
+ * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate.
+ * Some of the key size defaults can be overridden per row from what the {@link Keyboard}
+ * defines.
+ */
+public class Row {
+ /** Default width of a key in this row. */
+ public final int mDefaultWidth;
+ /** Default height of a key in this row. */
+ public final int mDefaultHeight;
+ /** Default horizontal gap between keys in this row. */
+ public final int mDefaultHorizontalGap;
+ /** Vertical gap following this row. */
+ public final int mVerticalGap;
+ /**
+ * Edge flags for this row of keys. Possible values that can be assigned are
+ * {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM}
+ */
+ public final int mRowEdgeFlags;
+
+ private final Keyboard mKeyboard;
+
+ public Row(Resources res, Keyboard keyboard, XmlResourceParser parser) {
+ this.mKeyboard = keyboard;
+ final int keyboardWidth = keyboard.getDisplayWidth();
+ final int keyboardHeight = keyboard.getKeyboardHeight();
+ TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ mDefaultWidth = KeyboardParser.getDimensionOrFraction(a,
+ R.styleable.Keyboard_keyWidth, keyboardWidth, keyboard.getKeyWidth());
+ mDefaultHeight = KeyboardParser.getDimensionOrFraction(a,
+ R.styleable.Keyboard_rowHeight, keyboardHeight, keyboard.getRowHeight());
+ mDefaultHorizontalGap = KeyboardParser.getDimensionOrFraction(a,
+ R.styleable.Keyboard_horizontalGap, keyboardWidth, keyboard.getHorizontalGap());
+ mVerticalGap = KeyboardParser.getDimensionOrFraction(a,
+ R.styleable.Keyboard_verticalGap, keyboardHeight, keyboard.getVerticalGap());
+ a.recycle();
+ a = res.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Row);
+ mRowEdgeFlags = a.getInt(R.styleable.Keyboard_Row_rowEdgeFlags, 0);
+ a.recycle();
+ }
+
+ public Keyboard getKeyboard() {
+ return mKeyboard;
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java b/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
new file mode 100644
index 000000000..9229208a9
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import android.util.Log;
+
+public class ShiftKeyState extends ModifierKeyState {
+ private static final int PRESSING_ON_SHIFTED = 3; // both temporary shifted & shift locked
+ private static final int IGNORING = 4;
+
+ public ShiftKeyState(String name) {
+ super(name);
+ }
+
+ @Override
+ public void onOtherKeyPressed() {
+ int oldState = mState;
+ if (oldState == PRESSING) {
+ mState = MOMENTARY;
+ } else if (oldState == PRESSING_ON_SHIFTED) {
+ mState = IGNORING;
+ }
+ if (DEBUG)
+ Log.d(TAG, mName + ".onOtherKeyPressed: " + toString(oldState) + " > " + this);
+ }
+
+ public void onPressOnShifted() {
+ int oldState = mState;
+ mState = PRESSING_ON_SHIFTED;
+ if (DEBUG)
+ Log.d(TAG, mName + ".onPressOnShifted: " + toString(oldState) + " > " + this);
+ }
+
+ public boolean isPressingOnShifted() {
+ return mState == PRESSING_ON_SHIFTED;
+ }
+
+ public boolean isIgnoring() {
+ return mState == IGNORING;
+ }
+
+ @Override
+ public String toString() {
+ return toString(mState);
+ }
+
+ @Override
+ protected String toString(int state) {
+ switch (state) {
+ case PRESSING_ON_SHIFTED: return "PRESSING_ON_SHIFTED";
+ case IGNORING: return "IGNORING";
+ default: return super.toString(state);
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java b/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
new file mode 100644
index 000000000..41f8c2a7c
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Paint.Align;
+import android.graphics.drawable.Drawable;
+import android.text.TextPaint;
+import android.view.ViewConfiguration;
+
+/**
+ * Animation to be displayed on the spacebar preview popup when switching languages by swiping the
+ * spacebar. It draws the current, previous and next languages and moves them by the delta of touch
+ * movement on the spacebar.
+ */
+public class SlidingLocaleDrawable extends Drawable {
+
+ private final Context mContext;
+ private final Resources mRes;
+ private final int mWidth;
+ private final int mHeight;
+ private final Drawable mBackground;
+ private final TextPaint mTextPaint;
+ private final int mMiddleX;
+ private final Drawable mLeftDrawable;
+ private final Drawable mRightDrawable;
+ private final int mThreshold;
+ private int mDiff;
+ private boolean mHitThreshold;
+ private String mCurrentLanguage;
+ private String mNextLanguage;
+ private String mPrevLanguage;
+
+ public SlidingLocaleDrawable(Context context, Drawable background, int width, int height) {
+ mContext = context;
+ mRes = context.getResources();
+ mBackground = background;
+ Keyboard.setDefaultBounds(mBackground);
+ mWidth = width;
+ mHeight = height;
+ final TextPaint textPaint = new TextPaint();
+ textPaint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18));
+ textPaint.setColor(R.color.latinkeyboard_transparent);
+ textPaint.setTextAlign(Align.CENTER);
+ textPaint.setAlpha(LatinKeyboard.OPACITY_FULLY_OPAQUE);
+ textPaint.setAntiAlias(true);
+ mTextPaint = textPaint;
+ mMiddleX = (mWidth - mBackground.getIntrinsicWidth()) / 2;
+ final Resources res = mRes;
+ mLeftDrawable = res.getDrawable(
+ R.drawable.sym_keyboard_feedback_language_arrows_left);
+ mRightDrawable = res.getDrawable(
+ R.drawable.sym_keyboard_feedback_language_arrows_right);
+ mThreshold = ViewConfiguration.get(mContext).getScaledTouchSlop();
+ }
+
+ private int getTextSizeFromTheme(int style, int defValue) {
+ TypedArray array = mContext.getTheme().obtainStyledAttributes(
+ style, new int[] { android.R.attr.textSize });
+ int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue);
+ return textSize;
+ }
+
+ void setDiff(int diff) {
+ if (diff == Integer.MAX_VALUE) {
+ mHitThreshold = false;
+ mCurrentLanguage = null;
+ return;
+ }
+ mDiff = diff;
+ if (mDiff > mWidth) mDiff = mWidth;
+ if (mDiff < -mWidth) mDiff = -mWidth;
+ if (Math.abs(mDiff) > mThreshold) mHitThreshold = true;
+ invalidateSelf();
+ }
+
+
+ @Override
+ public void draw(Canvas canvas) {
+ canvas.save();
+ if (mHitThreshold) {
+ Paint paint = mTextPaint;
+ final int width = mWidth;
+ final int height = mHeight;
+ final int diff = mDiff;
+ final Drawable lArrow = mLeftDrawable;
+ final Drawable rArrow = mRightDrawable;
+ canvas.clipRect(0, 0, width, height);
+ if (mCurrentLanguage == null) {
+ SubtypeSwitcher subtypeSwitcher = SubtypeSwitcher.getInstance();
+ mCurrentLanguage = subtypeSwitcher.getInputLanguageName();
+ mNextLanguage = subtypeSwitcher.getNextInputLanguageName();
+ mPrevLanguage = subtypeSwitcher.getPreviousInputLanguageName();
+ }
+ // Draw language text with shadow
+ final float baseline = mHeight * LatinKeyboard.SPACEBAR_LANGUAGE_BASELINE
+ - paint.descent();
+ paint.setColor(mRes.getColor(R.color.latinkeyboard_feedback_language_text));
+ canvas.drawText(mCurrentLanguage, width / 2 + diff, baseline, paint);
+ canvas.drawText(mNextLanguage, diff - width / 2, baseline, paint);
+ canvas.drawText(mPrevLanguage, diff + width + width / 2, baseline, paint);
+
+ Keyboard.setDefaultBounds(lArrow);
+ rArrow.setBounds(width - rArrow.getIntrinsicWidth(), 0, width,
+ rArrow.getIntrinsicHeight());
+ lArrow.draw(canvas);
+ rArrow.draw(canvas);
+ }
+ if (mBackground != null) {
+ canvas.translate(mMiddleX, 0);
+ mBackground.draw(canvas);
+ }
+ canvas.restore();
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.TRANSLUCENT;
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ // Ignore
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ // Ignore
+ }
+
+ @Override
+ public int getIntrinsicWidth() {
+ return mWidth;
+ }
+
+ @Override
+ public int getIntrinsicHeight() {
+ return mHeight;
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/SwipeTracker.java b/java/src/com/android/inputmethod/keyboard/SwipeTracker.java
index 970e91965..730cdc390 100644
--- a/java/src/com/android/inputmethod/latin/SwipeTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/SwipeTracker.java
@@ -14,11 +14,11 @@
* the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.keyboard;
import android.view.MotionEvent;
-class SwipeTracker {
+public class SwipeTracker {
private static final int NUM_PAST = 4;
private static final int LONGEST_PAST_TIME = 200;
@@ -91,7 +91,7 @@ class SwipeTracker {
return mYVelocity;
}
- static class EventRingBuffer {
+ public static class EventRingBuffer {
private final int bufSize;
private final float xBuf[];
private final float yBuf[];
@@ -154,4 +154,4 @@ class SwipeTracker {
end = advance(end);
}
}
-} \ No newline at end of file
+}
diff --git a/java/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/AutoDictionary.java
index 4fbb5b012..307b81d43 100644
--- a/java/src/com/android/inputmethod/latin/AutoDictionary.java
+++ b/java/src/com/android/inputmethod/latin/AutoDictionary.java
@@ -16,10 +16,6 @@
package com.android.inputmethod.latin;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.Map.Entry;
-
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
@@ -30,6 +26,10 @@ import android.os.AsyncTask;
import android.provider.BaseColumns;
import android.util.Log;
+import java.util.HashMap;
+import java.util.Map.Entry;
+import java.util.Set;
+
/**
* Stores new words temporarily until they are promoted to the user dictionary
* for longevity. Words in the auto dictionary are used to determine if it's ok
@@ -98,7 +98,7 @@ public class AutoDictionary extends ExpandableDictionary {
}
@Override
- public boolean isValidWord(CharSequence word) {
+ public synchronized boolean isValidWord(CharSequence word) {
final int frequency = getWordFrequency(word);
return frequency >= VALIDITY_THRESHOLD;
}
@@ -138,7 +138,8 @@ public class AutoDictionary extends ExpandableDictionary {
}
@Override
- public void addWord(String word, int addFrequency) {
+ public void addWord(String newWord, int addFrequency) {
+ String word = newWord;
final int length = word.length();
// Don't add very short or very long words.
if (length < 2 || length > getMaxWordLength()) return;
@@ -224,7 +225,7 @@ public class AutoDictionary extends ExpandableDictionary {
private final DatabaseHelper mDbHelper;
private final String mLocale;
- public UpdateDbTask(Context context, DatabaseHelper openHelper,
+ public UpdateDbTask(@SuppressWarnings("unused") Context context, DatabaseHelper openHelper,
HashMap<String, Integer> pendingWrites, String locale) {
mMap = pendingWrites;
mLocale = locale;
diff --git a/java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java b/java/src/com/android/inputmethod/latin/BackupAgent.java
index a14a4751f..ee070af75 100644
--- a/java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java
+++ b/java/src/com/android/inputmethod/latin/BackupAgent.java
@@ -22,7 +22,7 @@ import android.app.backup.SharedPreferencesBackupHelper;
/**
* Backs up the Latin IME shared preferences.
*/
-public class LatinIMEBackupAgent extends BackupAgentHelper {
+public class BackupAgent extends BackupAgentHelper {
@Override
public void onCreate() {
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index d0e143dd0..813f7d32f 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -1,12 +1,12 @@
/*
* Copyright (C) 2008 The Android Open Source Project
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,16 +16,12 @@
package com.android.inputmethod.latin;
-import java.io.InputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.channels.Channels;
-import java.util.Arrays;
-
import android.content.Context;
+import android.content.res.AssetFileDescriptor;
import android.util.Log;
+import java.util.Arrays;
+
/**
* Implements a static, compacted, binary dictionary of standard words.
*/
@@ -45,115 +41,79 @@ public class BinaryDictionary extends Dictionary {
private static final int MAX_BIGRAMS = 60;
private static final int TYPED_LETTER_MULTIPLIER = 2;
- private static final boolean ENABLE_MISSED_CHARACTERS = true;
+ private static final BinaryDictionary sInstance = new BinaryDictionary();
private int mDicTypeId;
private int mNativeDict;
- private int mDictLength;
- private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES];
- private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS];
- private char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS];
- private int[] mFrequencies = new int[MAX_WORDS];
- private int[] mFrequencies_bigrams = new int[MAX_BIGRAMS];
- // Keep a reference to the native dict direct buffer in Java to avoid
- // unexpected deallocation of the direct buffer.
- private ByteBuffer mNativeDictDirectBuffer;
+ private long mDictLength;
+ private final int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES];
+ private final char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS];
+ private final char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS];
+ private final int[] mFrequencies = new int[MAX_WORDS];
+ private final int[] mFrequencies_bigrams = new int[MAX_BIGRAMS];
static {
try {
System.loadLibrary("jni_latinime");
} catch (UnsatisfiedLinkError ule) {
- Log.e("BinaryDictionary", "Could not load native library jni_latinime");
+ Log.e(TAG, "Could not load native library jni_latinime");
}
}
- /**
- * Create a dictionary from a raw resource file
- * @param context application context for reading resources
- * @param resId the resource containing the raw binary dictionary
- */
- public BinaryDictionary(Context context, int[] resId, int dicTypeId) {
- if (resId != null && resId.length > 0 && resId[0] != 0) {
- loadDictionary(context, resId);
- }
- mDicTypeId = dicTypeId;
+ private BinaryDictionary() {
}
/**
- * Create a dictionary from a byte buffer. This is used for testing.
+ * Initialize a dictionary from a raw resource file
* @param context application context for reading resources
- * @param byteBuffer a ByteBuffer containing the binary dictionary
+ * @param resId the resource containing the raw binary dictionary
+ * @return initialized instance of BinaryDictionary
*/
- public BinaryDictionary(Context context, ByteBuffer byteBuffer, int dicTypeId) {
- if (byteBuffer != null) {
- if (byteBuffer.isDirect()) {
- mNativeDictDirectBuffer = byteBuffer;
- } else {
- mNativeDictDirectBuffer = ByteBuffer.allocateDirect(byteBuffer.capacity());
- byteBuffer.rewind();
- mNativeDictDirectBuffer.put(byteBuffer);
+ public static BinaryDictionary initDictionary(Context context, int resId, int dicTypeId) {
+ synchronized (sInstance) {
+ sInstance.closeInternal();
+ if (resId != 0) {
+ sInstance.loadDictionary(context, resId);
+ sInstance.mDicTypeId = dicTypeId;
}
- mDictLength = byteBuffer.capacity();
- mNativeDict = openNative(mNativeDictDirectBuffer,
- TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER);
}
- mDicTypeId = dicTypeId;
+ return sInstance;
}
- private native int openNative(ByteBuffer bb, int typedLetterMultiplier,
- int fullWordMultiplier);
+ private native int openNative(String sourceDir, long dictOffset, long dictSize,
+ int typedLetterMultiplier, int fullWordMultiplier, int maxWordLength,
+ int maxWords, int maxAlternatives);
private native void closeNative(int dict);
private native boolean isValidWordNative(int nativeData, char[] word, int wordLength);
- private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize,
- char[] outputChars, int[] frequencies, int maxWordLength, int maxWords,
- int maxAlternatives, int skipPos, int[] nextLettersFrequencies, int nextLettersSize);
+ private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize,
+ char[] outputChars, int[] frequencies,
+ int[] nextLettersFrequencies, int nextLettersSize);
private native int getBigramsNative(int dict, char[] prevWord, int prevWordLength,
int[] inputCodes, int inputCodesLength, char[] outputChars, int[] frequencies,
int maxWordLength, int maxBigrams, int maxAlternatives);
- private final void loadDictionary(Context context, int[] resId) {
- InputStream[] is = null;
+ private final void loadDictionary(Context context, int resId) {
try {
- // merging separated dictionary into one if dictionary is separated
- int total = 0;
- is = new InputStream[resId.length];
- for (int i = 0; i < resId.length; i++) {
- is[i] = context.getResources().openRawResource(resId[i]);
- total += is[i].available();
- }
-
- mNativeDictDirectBuffer =
- ByteBuffer.allocateDirect(total).order(ByteOrder.nativeOrder());
- int got = 0;
- for (int i = 0; i < resId.length; i++) {
- got += Channels.newChannel(is[i]).read(mNativeDictDirectBuffer);
- }
- if (got != total) {
- Log.e(TAG, "Read " + got + " bytes, expected " + total);
- } else {
- mNativeDict = openNative(mNativeDictDirectBuffer,
- TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER);
- mDictLength = total;
- }
- } catch (IOException e) {
- Log.w(TAG, "No available memory for binary dictionary");
- } finally {
- try {
- if (is != null) {
- for (int i = 0; i < is.length; i++) {
- is[i].close();
- }
- }
- } catch (IOException e) {
- Log.w(TAG, "Failed to close input stream");
+ final AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId);
+ if (afd == null) {
+ Log.e(TAG, "Found the resource but it is compressed. resId=" + resId);
+ return;
}
+ mNativeDict = openNative(context.getApplicationInfo().sourceDir,
+ afd.getStartOffset(), afd.getLength(),
+ TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER,
+ MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES);
+ mDictLength = afd.getLength();
+ } catch (android.content.res.Resources.NotFoundException e) {
+ Log.e(TAG, "Could not find the resource. resId=" + resId);
+ return;
}
}
-
@Override
public void getBigrams(final WordComposer codes, final CharSequence previousWord,
final WordCallback callback, int[] nextLettersFrequencies) {
+ if (mNativeDict == 0) return;
char[] chars = previousWord.toString().toCharArray();
Arrays.fill(mOutputChars_bigrams, (char) 0);
@@ -169,12 +129,12 @@ public class BinaryDictionary extends Dictionary {
mOutputChars_bigrams, mFrequencies_bigrams, MAX_WORD_LENGTH, MAX_BIGRAMS,
MAX_ALTERNATIVES);
- for (int j = 0; j < count; j++) {
+ for (int j = 0; j < count; ++j) {
if (mFrequencies_bigrams[j] < 1) break;
- int start = j * MAX_WORD_LENGTH;
+ final int start = j * MAX_WORD_LENGTH;
int len = 0;
- while (mOutputChars_bigrams[start + len] != 0) {
- len++;
+ while (len < MAX_WORD_LENGTH && mOutputChars_bigrams[start + len] != 0) {
+ ++len;
}
if (len > 0) {
callback.addWord(mOutputChars_bigrams, start, len, mFrequencies_bigrams[j],
@@ -186,10 +146,12 @@ public class BinaryDictionary extends Dictionary {
@Override
public void getWords(final WordComposer codes, final WordCallback callback,
int[] nextLettersFrequencies) {
+ if (mNativeDict == 0) return;
+
final int codesSize = codes.size();
// Won't deal with really long words.
if (codesSize > MAX_WORD_LENGTH - 1) return;
-
+
Arrays.fill(mInputCodes, -1);
for (int i = 0; i < codesSize; i++) {
int[] alternatives = codes.getCodesAt(i);
@@ -199,33 +161,16 @@ public class BinaryDictionary extends Dictionary {
Arrays.fill(mOutputChars, (char) 0);
Arrays.fill(mFrequencies, 0);
- int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize,
- mOutputChars, mFrequencies,
- MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, -1,
- nextLettersFrequencies,
+ int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, mOutputChars,
+ mFrequencies, nextLettersFrequencies,
nextLettersFrequencies != null ? nextLettersFrequencies.length : 0);
- // If there aren't sufficient suggestions, search for words by allowing wild cards at
- // the different character positions. This feature is not ready for prime-time as we need
- // to figure out the best ranking for such words compared to proximity corrections and
- // completions.
- if (ENABLE_MISSED_CHARACTERS && count < 5) {
- for (int skip = 0; skip < codesSize; skip++) {
- int tempCount = getSuggestionsNative(mNativeDict, mInputCodes, codesSize,
- mOutputChars, mFrequencies,
- MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, skip,
- null, 0);
- count = Math.max(count, tempCount);
- if (tempCount > 0) break;
- }
- }
-
- for (int j = 0; j < count; j++) {
+ for (int j = 0; j < count; ++j) {
if (mFrequencies[j] < 1) break;
- int start = j * MAX_WORD_LENGTH;
+ final int start = j * MAX_WORD_LENGTH;
int len = 0;
- while (mOutputChars[start + len] != 0) {
- len++;
+ while (len < MAX_WORD_LENGTH && mOutputChars[start + len] != 0) {
+ ++len;
}
if (len > 0) {
callback.addWord(mOutputChars, start, len, mFrequencies[j], mDicTypeId,
@@ -241,21 +186,29 @@ public class BinaryDictionary extends Dictionary {
return isValidWordNative(mNativeDict, chars, chars.length);
}
- public int getSize() {
- return mDictLength; // This value is initialized on the call to openNative()
+ public long getSize() {
+ return mDictLength; // This value is initialized in loadDictionary()
}
@Override
public synchronized void close() {
+ closeInternal();
+ }
+
+ private void closeInternal() {
if (mNativeDict != 0) {
closeNative(mNativeDict);
mNativeDict = 0;
+ mDictLength = 0;
}
}
@Override
protected void finalize() throws Throwable {
- close();
- super.finalize();
+ try {
+ closeInternal();
+ } finally {
+ super.finalize();
+ }
}
}
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index 68f288925..fc45c7c75 100755..100644
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -1,12 +1,12 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
- *
+ * Copyright (C) 2010 The Android Open Source Project
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,77 +16,106 @@
package com.android.inputmethod.latin;
+import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+
import android.content.Context;
import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.Rect;
+import android.graphics.Color;
import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Message;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.style.BackgroundColorSpan;
+import android.text.style.CharacterStyle;
+import android.text.style.ForegroundColorSpan;
+import android.text.style.StyleSpan;
+import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
-import android.view.GestureDetector;
import android.view.Gravity;
import android.view.LayoutInflater;
-import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewGroup.LayoutParams;
+import android.view.View.OnClickListener;
+import android.view.View.OnLongClickListener;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
-public class CandidateView extends View {
+public class CandidateView extends LinearLayout implements OnClickListener, OnLongClickListener {
- private static final int OUT_OF_BOUNDS_WORD_INDEX = -1;
- private static final int OUT_OF_BOUNDS_X_COORD = -1;
+ private static final CharacterStyle BOLD_SPAN = new StyleSpan(Typeface.BOLD);
+ private static final CharacterStyle UNDERLINE_SPAN = new UnderlineSpan();
+ private static final int MAX_SUGGESTIONS = 16;
- private LatinIME mService;
- private final ArrayList<CharSequence> mSuggestions = new ArrayList<CharSequence>();
- private boolean mShowingCompletions;
- private CharSequence mSelectedString;
- private int mSelectedIndex;
- private int mTouchX = OUT_OF_BOUNDS_X_COORD;
- private final Drawable mSelectionHighlight;
- private boolean mTypedWordValid;
-
- private boolean mHaveMinimalSuggestion;
-
- private Rect mBgPadding;
+ private static boolean DBG = LatinImeLogger.sDBG;
- private final TextView mPreviewText;
- private final PopupWindow mPreviewPopup;
- private int mCurrentWordIndex;
- private Drawable mDivider;
-
- private static final int MAX_SUGGESTIONS = 32;
- private static final int SCROLL_PIXELS = 20;
-
- private final int[] mWordWidth = new int[MAX_SUGGESTIONS];
- private final int[] mWordX = new int[MAX_SUGGESTIONS];
- private int mPopupPreviewX;
- private int mPopupPreviewY;
-
- private static final int X_GAP = 10;
-
+ private final ArrayList<View> mWords = new ArrayList<View>();
+ private final boolean mConfigCandidateHighlightFontColorEnabled;
+ private final CharacterStyle mInvertedForegroundColorSpan;
+ private final CharacterStyle mInvertedBackgroundColorSpan;
private final int mColorNormal;
private final int mColorRecommended;
private final int mColorOther;
- private final Paint mPaint;
- private final int mDescent;
- private boolean mScrolled;
+ private final PopupWindow mPreviewPopup;
+ private final TextView mPreviewText;
+
+ private LatinIME mService;
+ private SuggestedWords mSuggestions = SuggestedWords.EMPTY;
+ private boolean mShowingAutoCorrectionInverted;
private boolean mShowingAddToDictionary;
- private CharSequence mAddToDictionaryHint;
- private int mTargetScrollX;
+ private final UiHandler mHandler = new UiHandler();
+
+ private class UiHandler extends Handler {
+ private static final int MSG_HIDE_PREVIEW = 0;
+ private static final int MSG_UPDATE_SUGGESTION = 1;
+
+ private static final long DELAY_HIDE_PREVIEW = 1000;
+ private static final long DELAY_UPDATE_SUGGESTION = 300;
+
+ @Override
+ public void dispatchMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_HIDE_PREVIEW:
+ hidePreview();
+ break;
+ case MSG_UPDATE_SUGGESTION:
+ updateSuggestions();
+ break;
+ }
+ }
+
+ public void postHidePreview() {
+ cancelHidePreview();
+ sendMessageDelayed(obtainMessage(MSG_HIDE_PREVIEW), DELAY_HIDE_PREVIEW);
+ }
+
+ public void cancelHidePreview() {
+ removeMessages(MSG_HIDE_PREVIEW);
+ }
+
+ public void postUpdateSuggestions() {
+ cancelUpdateSuggestions();
+ sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTION),
+ DELAY_UPDATE_SUGGESTION);
+ }
- private final int mMinTouchableWidth;
+ public void cancelUpdateSuggestions() {
+ removeMessages(MSG_UPDATE_SUGGESTION);
+ }
- private int mTotalWidth;
-
- private final GestureDetector mGestureDetector;
+ public void cancelAllMessages() {
+ cancelHidePreview();
+ cancelUpdateSuggestions();
+ }
+ }
/**
* Construct a CandidateView for showing suggested words for completion.
@@ -95,95 +124,38 @@ public class CandidateView extends View {
*/
public CandidateView(Context context, AttributeSet attrs) {
super(context, attrs);
- mSelectionHighlight = context.getResources().getDrawable(
- R.drawable.list_selector_background_pressed);
- LayoutInflater inflate =
- (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Resources res = context.getResources();
mPreviewPopup = new PopupWindow(context);
- mPreviewText = (TextView) inflate.inflate(R.layout.candidate_preview, null);
- mPreviewPopup.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+ LayoutInflater inflater = LayoutInflater.from(context);
+ mPreviewText = (TextView) inflater.inflate(R.layout.candidate_preview, null);
+ mPreviewPopup.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
mPreviewPopup.setContentView(mPreviewText);
mPreviewPopup.setBackgroundDrawable(null);
mPreviewPopup.setAnimationStyle(R.style.KeyPreviewAnimation);
+ mConfigCandidateHighlightFontColorEnabled =
+ res.getBoolean(R.bool.config_candidate_highlight_font_color_enabled);
mColorNormal = res.getColor(R.color.candidate_normal);
mColorRecommended = res.getColor(R.color.candidate_recommended);
mColorOther = res.getColor(R.color.candidate_other);
- mDivider = res.getDrawable(R.drawable.keyboard_suggest_strip_divider);
- mAddToDictionaryHint = res.getString(R.string.hint_add_to_dictionary);
-
- mPaint = new Paint();
- mPaint.setColor(mColorNormal);
- mPaint.setAntiAlias(true);
- mPaint.setTextSize(mPreviewText.getTextSize());
- mPaint.setStrokeWidth(0);
- mPaint.setTextAlign(Align.CENTER);
- mDescent = (int) mPaint.descent();
- mMinTouchableWidth = (int)res.getDimension(R.dimen.candidate_min_touchable_width);
-
- mGestureDetector = new GestureDetector(
- new CandidateStripGestureListener(mMinTouchableWidth));
- setWillNotDraw(false);
- setHorizontalScrollBarEnabled(false);
- setVerticalScrollBarEnabled(false);
- scrollTo(0, getScrollY());
- }
-
- private class CandidateStripGestureListener extends GestureDetector.SimpleOnGestureListener {
- private final int mTouchSlopSquare;
-
- public CandidateStripGestureListener(int touchSlop) {
- // Slightly reluctant to scroll to be able to easily choose the suggestion
- mTouchSlopSquare = touchSlop * touchSlop;
+ mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorNormal ^ 0x00ffffff);
+ mInvertedBackgroundColorSpan = new BackgroundColorSpan(mColorNormal);
+
+ for (int i = 0; i < MAX_SUGGESTIONS; i++) {
+ View v = inflater.inflate(R.layout.candidate, null);
+ TextView tv = (TextView)v.findViewById(R.id.candidate_word);
+ tv.setTag(i);
+ tv.setOnClickListener(this);
+ if (i == 0)
+ tv.setOnLongClickListener(this);
+ ImageView divider = (ImageView)v.findViewById(R.id.candidate_divider);
+ // Do not display divider of first candidate.
+ divider.setVisibility(i == 0 ? GONE : VISIBLE);
+ mWords.add(v);
}
- @Override
- public void onLongPress(MotionEvent me) {
- if (mSuggestions.size() > 0) {
- if (me.getX() + getScrollX() < mWordWidth[0] && getScrollX() < 10) {
- longPressFirstWord();
- }
- }
- }
-
- @Override
- public boolean onDown(MotionEvent e) {
- mScrolled = false;
- return false;
- }
-
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY) {
- if (!mScrolled) {
- // This is applied only when we recognize that scrolling is starting.
- final int deltaX = (int) (e2.getX() - e1.getX());
- final int deltaY = (int) (e2.getY() - e1.getY());
- final int distance = (deltaX * deltaX) + (deltaY * deltaY);
- if (distance < mTouchSlopSquare) {
- return true;
- }
- mScrolled = true;
- }
-
- final int width = getWidth();
- mScrolled = true;
- int scrollX = getScrollX();
- scrollX += (int) distanceX;
- if (scrollX < 0) {
- scrollX = 0;
- }
- if (distanceX > 0 && scrollX + width > mTotalWidth) {
- scrollX -= (int) distanceX;
- }
- mTargetScrollX = scrollX;
- scrollTo(scrollX, getScrollY());
- hidePreview();
- invalidate();
- return true;
- }
+ scrollTo(0, getScrollY());
}
/**
@@ -193,158 +165,113 @@ public class CandidateView extends View {
public void setService(LatinIME listener) {
mService = listener;
}
-
- @Override
- public int computeHorizontalScrollRange() {
- return mTotalWidth;
- }
- /**
- * If the canvas is null, then only touch calculations are performed to pick the target
- * candidate.
- */
- @Override
- protected void onDraw(Canvas canvas) {
- if (canvas != null) {
- super.onDraw(canvas);
- }
- mTotalWidth = 0;
-
- final int height = getHeight();
- if (mBgPadding == null) {
- mBgPadding = new Rect(0, 0, 0, 0);
- if (getBackground() != null) {
- getBackground().getPadding(mBgPadding);
- }
- mDivider.setBounds(0, 0, mDivider.getIntrinsicWidth(),
- mDivider.getIntrinsicHeight());
+ public void setSuggestions(SuggestedWords suggestions) {
+ if (suggestions == null)
+ return;
+ mSuggestions = suggestions;
+ if (mShowingAutoCorrectionInverted) {
+ mHandler.postUpdateSuggestions();
+ } else {
+ updateSuggestions();
}
+ }
- final int count = mSuggestions.size();
- final Rect bgPadding = mBgPadding;
- final Paint paint = mPaint;
- final int touchX = mTouchX;
- final int scrollX = getScrollX();
- final boolean scrolled = mScrolled;
- final boolean typedWordValid = mTypedWordValid;
- final int y = (int) (height + mPaint.getTextSize() - mDescent) / 2;
-
- boolean existsAutoCompletion = false;
-
- int x = 0;
+ private void updateSuggestions() {
+ final SuggestedWords suggestions = mSuggestions;
+ clear();
+ final int count = suggestions.size();
for (int i = 0; i < count; i++) {
- CharSequence suggestion = mSuggestions.get(i);
- if (suggestion == null) continue;
- final int wordLength = suggestion.length();
-
- paint.setColor(mColorNormal);
- if (mHaveMinimalSuggestion
- && ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid))) {
- paint.setTypeface(Typeface.DEFAULT_BOLD);
- paint.setColor(mColorRecommended);
- existsAutoCompletion = true;
+ CharSequence word = suggestions.getWord(i);
+ if (word == null) continue;
+ final int wordLength = word.length();
+ final List<SuggestedWordInfo> suggestedWordInfoList =
+ suggestions.mSuggestedWordInfoList;
+
+ final View v = mWords.get(i);
+ final TextView tv = (TextView)v.findViewById(R.id.candidate_word);
+ final TextView dv = (TextView)v.findViewById(R.id.candidate_debug_info);
+ tv.setTextColor(mColorNormal);
+ // TODO: Needs safety net?
+ if (suggestions.mHasMinimalSuggestion
+ && ((i == 1 && !suggestions.mTypedWordValid)
+ || (i == 0 && suggestions.mTypedWordValid))) {
+ final CharacterStyle style;
+ if (mConfigCandidateHighlightFontColorEnabled) {
+ style = BOLD_SPAN;
+ tv.setTextColor(mColorRecommended);
+ } else {
+ style = UNDERLINE_SPAN;
+ }
+ final Spannable spannedWord = new SpannableString(word);
+ spannedWord.setSpan(style, 0, wordLength, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ word = spannedWord;
} else if (i != 0 || (wordLength == 1 && count > 1)) {
- // HACK: even if i == 0, we use mColorOther when this suggestion's length is 1 and
- // there are multiple suggestions, such as the default punctuation list.
- paint.setColor(mColorOther);
- }
- int wordWidth;
- if ((wordWidth = mWordWidth[i]) == 0) {
- float textWidth = paint.measureText(suggestion, 0, wordLength);
- wordWidth = Math.max(mMinTouchableWidth, (int) textWidth + X_GAP * 2);
- mWordWidth[i] = wordWidth;
+ // HACK: even if i == 0, we use mColorOther when this
+ // suggestion's length is 1
+ // and there are multiple suggestions, such as the default
+ // punctuation list.
+ if (mConfigCandidateHighlightFontColorEnabled)
+ tv.setTextColor(mColorOther);
}
-
- mWordX[i] = x;
-
- if (touchX != OUT_OF_BOUNDS_X_COORD && !scrolled
- && touchX + scrollX >= x && touchX + scrollX < x + wordWidth) {
- if (canvas != null && !mShowingAddToDictionary) {
- canvas.translate(x, 0);
- mSelectionHighlight.setBounds(0, bgPadding.top, wordWidth, height);
- mSelectionHighlight.draw(canvas);
- canvas.translate(-x, 0);
+ tv.setText(word);
+ tv.setClickable(true);
+
+ if (suggestedWordInfoList != null && suggestedWordInfoList.get(i) != null) {
+ final SuggestedWordInfo info = suggestedWordInfoList.get(i);
+ if (info.isPreviousSuggestedWord()) {
+ int color = tv.getCurrentTextColor();
+ tv.setTextColor(Color.argb((int)(Color.alpha(color) * 0.5f), Color.red(color),
+ Color.green(color), Color.blue(color)));
}
- mSelectedString = suggestion;
- mSelectedIndex = i;
- }
-
- if (canvas != null) {
- canvas.drawText(suggestion, 0, wordLength, x + wordWidth / 2, y, paint);
- paint.setColor(mColorOther);
- canvas.translate(x + wordWidth, 0);
- // Draw a divider unless it's after the hint
- if (!(mShowingAddToDictionary && i == 1)) {
- mDivider.draw(canvas);
+ final String debugString = info.getDebugString();
+ if (DBG) {
+ if (!TextUtils.isEmpty(debugString)) {
+ dv.setText(debugString);
+ dv.setVisibility(VISIBLE);
+ }
}
- canvas.translate(-x - wordWidth, 0);
- }
- paint.setTypeface(Typeface.DEFAULT);
- x += wordWidth;
- }
- mService.onAutoCompletionStateChanged(existsAutoCompletion);
- mTotalWidth = x;
- if (mTargetScrollX != scrollX) {
- scrollToTarget();
- }
- }
-
- private void scrollToTarget() {
- int scrollX = getScrollX();
- if (mTargetScrollX > scrollX) {
- scrollX += SCROLL_PIXELS;
- if (scrollX >= mTargetScrollX) {
- scrollX = mTargetScrollX;
- scrollTo(scrollX, getScrollY());
- requestLayout();
- } else {
- scrollTo(scrollX, getScrollY());
- }
- } else {
- scrollX -= SCROLL_PIXELS;
- if (scrollX <= mTargetScrollX) {
- scrollX = mTargetScrollX;
- scrollTo(scrollX, getScrollY());
- requestLayout();
} else {
- scrollTo(scrollX, getScrollY());
+ dv.setVisibility(GONE);
}
+ addView(v);
}
- invalidate();
- }
-
- public void setSuggestions(List<CharSequence> suggestions, boolean completions,
- boolean typedWordValid, boolean haveMinimalSuggestion) {
- clear();
- if (suggestions != null) {
- int insertCount = Math.min(suggestions.size(), MAX_SUGGESTIONS);
- for (CharSequence suggestion : suggestions) {
- mSuggestions.add(suggestion);
- if (--insertCount == 0)
- break;
- }
- }
- mShowingCompletions = completions;
- mTypedWordValid = typedWordValid;
+
scrollTo(0, getScrollY());
- mTargetScrollX = 0;
- mHaveMinimalSuggestion = haveMinimalSuggestion;
- // Compute the total width
- onDraw(null);
- invalidate();
requestLayout();
}
+ public void onAutoCorrectionInverted(CharSequence autoCorrectedWord) {
+ // Displaying auto corrected word as inverted is enabled only when highlighting candidate
+ // with color is disabled.
+ if (mConfigCandidateHighlightFontColorEnabled)
+ return;
+ final TextView tv = (TextView)mWords.get(1).findViewById(R.id.candidate_word);
+ final Spannable word = new SpannableString(autoCorrectedWord);
+ final int wordLength = word.length();
+ word.setSpan(mInvertedBackgroundColorSpan, 0, wordLength, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ word.setSpan(mInvertedForegroundColorSpan, 0, wordLength, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ tv.setText(word);
+ mShowingAutoCorrectionInverted = true;
+ }
+
+ public boolean isConfigCandidateHighlightFontColorEnabled() {
+ return mConfigCandidateHighlightFontColorEnabled;
+ }
+
public boolean isShowingAddToDictionaryHint() {
return mShowingAddToDictionary;
}
public void showAddToDictionaryHint(CharSequence word) {
- ArrayList<CharSequence> suggestions = new ArrayList<CharSequence>();
- suggestions.add(word);
- suggestions.add(mAddToDictionaryHint);
- setSuggestions(suggestions, false, false, false);
+ SuggestedWords.Builder builder = new SuggestedWords.Builder()
+ .addWord(word)
+ .addWord(getContext().getText(R.string.hint_add_to_dictionary));
+ setSuggestions(builder.build());
mShowingAddToDictionary = true;
+ // Disable R.string.hint_add_to_dictionary button
+ TextView tv = (TextView)getChildAt(1).findViewById(R.id.candidate_word);
+ tv.setClickable(false);
}
public boolean dismissAddToDictionaryHint() {
@@ -353,135 +280,78 @@ public class CandidateView extends View {
return true;
}
- /* package */ List<CharSequence> getSuggestions() {
+ public SuggestedWords getSuggestions() {
return mSuggestions;
}
public void clear() {
- // Don't call mSuggestions.clear() because it's being used for logging
- // in LatinIME.pickSuggestionManually().
- mSuggestions.clear();
- mTouchX = OUT_OF_BOUNDS_X_COORD;
- mSelectedString = null;
- mSelectedIndex = -1;
mShowingAddToDictionary = false;
- invalidate();
- Arrays.fill(mWordWidth, 0);
- Arrays.fill(mWordX, 0);
+ mShowingAutoCorrectionInverted = false;
+ removeAllViews();
}
-
- @Override
- public boolean onTouchEvent(MotionEvent me) {
- if (mGestureDetector.onTouchEvent(me)) {
- return true;
+ private void hidePreview() {
+ mPreviewPopup.dismiss();
+ }
+
+ private void showPreview(int index, CharSequence word) {
+ if (TextUtils.isEmpty(word))
+ return;
+
+ final TextView previewText = mPreviewText;
+ previewText.setTextColor(mColorNormal);
+ previewText.setText(word);
+ previewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
+ View v = getChildAt(index);
+ final int[] offsetInWindow = new int[2];
+ v.getLocationInWindow(offsetInWindow);
+ final int posX = offsetInWindow[0];
+ final int posY = offsetInWindow[1] - previewText.getMeasuredHeight();
+ final PopupWindow previewPopup = mPreviewPopup;
+ if (previewPopup.isShowing()) {
+ previewPopup.update(posX, posY, previewPopup.getWidth(), previewPopup.getHeight());
+ } else {
+ previewPopup.showAtLocation(this, Gravity.NO_GRAVITY, posX, posY);
}
+ previewText.setVisibility(VISIBLE);
+ mHandler.postHidePreview();
+ }
- int action = me.getAction();
- int x = (int) me.getX();
- int y = (int) me.getY();
- mTouchX = x;
-
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- invalidate();
- break;
- case MotionEvent.ACTION_MOVE:
- if (y <= 0) {
- // Fling up!?
- if (mSelectedString != null) {
- // If there are completions from the application, we don't change the state to
- // STATE_PICKED_SUGGESTION
- if (!mShowingCompletions) {
- // This "acceptedSuggestion" will not be counted as a word because
- // it will be counted in pickSuggestion instead.
- TextEntryState.acceptedSuggestion(mSuggestions.get(0),
- mSelectedString);
- }
- mService.pickSuggestionManually(mSelectedIndex, mSelectedString);
- mSelectedString = null;
- mSelectedIndex = -1;
- }
- }
- break;
- case MotionEvent.ACTION_UP:
- if (!mScrolled) {
- if (mSelectedString != null) {
- if (mShowingAddToDictionary) {
- longPressFirstWord();
- clear();
- } else {
- if (!mShowingCompletions) {
- TextEntryState.acceptedSuggestion(mSuggestions.get(0),
- mSelectedString);
- }
- mService.pickSuggestionManually(mSelectedIndex, mSelectedString);
- }
- }
- }
- mSelectedString = null;
- mSelectedIndex = -1;
- requestLayout();
- hidePreview();
- invalidate();
- break;
+ private void addToDictionary(CharSequence word) {
+ if (mService.addWordToDictionary(word.toString())) {
+ showPreview(0, getContext().getString(R.string.added_word, word));
}
- return true;
}
- private void hidePreview() {
- mTouchX = OUT_OF_BOUNDS_X_COORD;
- mCurrentWordIndex = OUT_OF_BOUNDS_WORD_INDEX;
- mPreviewPopup.dismiss();
+ @Override
+ public boolean onLongClick(View view) {
+ int index = (Integer) view.getTag();
+ CharSequence word = mSuggestions.getWord(index);
+ if (word.length() < 2)
+ return false;
+ addToDictionary(word);
+ return true;
}
-
- private void showPreview(int wordIndex, String altText) {
- int oldWordIndex = mCurrentWordIndex;
- mCurrentWordIndex = wordIndex;
- // If index changed or changing text
- if (oldWordIndex != mCurrentWordIndex || altText != null) {
- if (wordIndex == OUT_OF_BOUNDS_WORD_INDEX) {
- hidePreview();
- } else {
- CharSequence word = altText != null? altText : mSuggestions.get(wordIndex);
- mPreviewText.setText(word);
- mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
- int wordWidth = (int) (mPaint.measureText(word, 0, word.length()) + X_GAP * 2);
- final int popupWidth = wordWidth
- + mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight();
- final int popupHeight = mPreviewText.getMeasuredHeight();
- //mPreviewText.setVisibility(INVISIBLE);
- mPopupPreviewX = mWordX[wordIndex] - mPreviewText.getPaddingLeft() - getScrollX()
- + (mWordWidth[wordIndex] - wordWidth) / 2;
- mPopupPreviewY = - popupHeight;
- int [] offsetInWindow = new int[2];
- getLocationInWindow(offsetInWindow);
- if (mPreviewPopup.isShowing()) {
- mPreviewPopup.update(mPopupPreviewX, mPopupPreviewY + offsetInWindow[1],
- popupWidth, popupHeight);
- } else {
- mPreviewPopup.setWidth(popupWidth);
- mPreviewPopup.setHeight(popupHeight);
- mPreviewPopup.showAtLocation(this, Gravity.NO_GRAVITY, mPopupPreviewX,
- mPopupPreviewY + offsetInWindow[1]);
- }
- mPreviewText.setVisibility(VISIBLE);
+
+ @Override
+ public void onClick(View view) {
+ int index = (Integer) view.getTag();
+ CharSequence word = mSuggestions.getWord(index);
+ if (mShowingAddToDictionary && index == 0) {
+ addToDictionary(word);
+ } else {
+ if (!mSuggestions.mIsApplicationSpecifiedCompletions) {
+ TextEntryState.acceptedSuggestion(mSuggestions.getWord(0), word);
}
+ mService.pickSuggestionManually(index, word);
}
}
- private void longPressFirstWord() {
- CharSequence word = mSuggestions.get(0);
- if (word.length() < 2) return;
- if (mService.addWordToDictionary(word.toString())) {
- showPreview(0, getContext().getResources().getString(R.string.added_word, word));
- }
- }
-
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
+ mHandler.cancelAllMessages();
hidePreview();
}
}
diff --git a/java/src/com/android/inputmethod/latin/ContactsDictionary.java b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
index 95a3b5c7d..048f72dc5 100644
--- a/java/src/com/android/inputmethod/latin/ContactsDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.SystemClock;
+import android.provider.BaseColumns;
import android.provider.ContactsContract.Contacts;
import android.text.TextUtils;
import android.util.Log;
@@ -28,7 +29,7 @@ import android.util.Log;
public class ContactsDictionary extends ExpandableDictionary {
private static final String[] PROJECTION = {
- Contacts._ID,
+ BaseColumns._ID,
Contacts.DISPLAY_NAME,
};
diff --git a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java b/java/src/com/android/inputmethod/latin/DebugSettings.java
index cba1a0af9..03211f36b 100644
--- a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java
+++ b/java/src/com/android/inputmethod/latin/DebugSettings.java
@@ -24,10 +24,10 @@ import android.preference.CheckBoxPreference;
import android.preference.PreferenceActivity;
import android.util.Log;
-public class LatinIMEDebugSettings extends PreferenceActivity
+public class DebugSettings extends PreferenceActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {
- private static final String TAG = "LatinIMEDebugSettings";
+ private static final String TAG = "DebugSettings";
private static final String DEBUG_MODE_KEY = "debug_mode";
private CheckBoxPreference mDebugMode;
@@ -43,6 +43,7 @@ public class LatinIMEDebugSettings extends PreferenceActivity
updateDebugMode();
}
+ @Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals(DEBUG_MODE_KEY)) {
if (mDebugMode != null) {
diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java
index d04bf57a7..74933595c 100644
--- a/java/src/com/android/inputmethod/latin/Dictionary.java
+++ b/java/src/com/android/inputmethod/latin/Dictionary.java
@@ -20,7 +20,7 @@ package com.android.inputmethod.latin;
* Abstract base class for a dictionary that can do a fuzzy search for words based on a set of key
* strokes.
*/
-abstract public class Dictionary {
+public abstract class Dictionary {
/**
* Whether or not to replicate the typed word in the suggested list, even if it's valid.
*/
@@ -42,11 +42,11 @@ abstract public class Dictionary {
public interface WordCallback {
/**
* Adds a word to a list of suggestions. The word is expected to be ordered based on
- * the provided frequency.
+ * the provided frequency.
* @param word the character array containing the word
* @param wordOffset starting offset of the word in the character array
* @param wordLength length of valid characters in the character array
- * @param frequency the frequency of occurence. This is normalized between 1 and 255, but
+ * @param frequency the frequency of occurrence. This is normalized between 1 and 255, but
* can exceed those limits
* @param dicTypeId of the dictionary where word was from
* @param dataType tells type of this data
@@ -74,6 +74,7 @@ abstract public class Dictionary {
* Searches for pairs in the bigram dictionary that matches the previous word and all the
* possible words following are added through the callback object.
* @param composer the key sequence to match
+ * @param previousWord the word before
* @param callback the callback object to send possible word following previous word
* @param nextLettersFrequencies array of frequencies of next letters that could follow the
* word so far. For instance, "bracke" can be followed by "t", so array['t'] will have
@@ -116,5 +117,6 @@ abstract public class Dictionary {
* Override to clean up any resources.
*/
public void close() {
+ // empty base implementation
}
}
diff --git a/java/src/com/android/inputmethod/latin/EditingUtil.java b/java/src/com/android/inputmethod/latin/EditingUtils.java
index 781d7fd4a..0ca06ddfc 100644
--- a/java/src/com/android/inputmethod/latin/EditingUtil.java
+++ b/java/src/com/android/inputmethod/latin/EditingUtils.java
@@ -28,7 +28,7 @@ import java.util.regex.Pattern;
/**
* Utility methods to deal with editing text through an InputConnection.
*/
-public class EditingUtil {
+public class EditingUtils {
/**
* Number of characters we want to look back in order to identify the previous word
*/
@@ -39,7 +39,9 @@ public class EditingUtil {
private static Method sMethodGetSelectedText;
private static Method sMethodSetComposingRegion;
- private EditingUtil() {};
+ private EditingUtils() {
+ // Unintentional empty constructor for singleton.
+ }
/**
* Append newText to the text field represented by connection.
@@ -54,14 +56,15 @@ public class EditingUtil {
connection.finishComposingText();
// Add a space if the field already has text.
+ String text = newText;
CharSequence charBeforeCursor = connection.getTextBeforeCursor(1, 0);
if (charBeforeCursor != null
&& !charBeforeCursor.equals(" ")
&& (charBeforeCursor.length() > 0)) {
- newText = " " + newText;
+ text = " " + text;
}
- connection.setComposingText(newText, 1);
+ connection.setComposingText(text, 1);
}
private static int getCursorPosition(InputConnection connection) {
@@ -76,33 +79,29 @@ public class EditingUtil {
/**
* @param connection connection to the current text field.
* @param sep characters which may separate words
- * @param range the range object to store the result into
* @return the word that surrounds the cursor, including up to one trailing
* separator. For example, if the field contains "he|llo world", where |
* represents the cursor, then "hello " will be returned.
*/
- public static String getWordAtCursor(
- InputConnection connection, String separators, Range range) {
- Range r = getWordRangeAtCursor(connection, separators, range);
- return (r == null) ? null : r.word;
+ public static String getWordAtCursor(InputConnection connection, String separators) {
+ Range r = getWordRangeAtCursor(connection, separators);
+ return (r == null) ? null : r.mWord;
}
/**
* Removes the word surrounding the cursor. Parameters are identical to
* getWordAtCursor.
*/
- public static void deleteWordAtCursor(
- InputConnection connection, String separators) {
-
- Range range = getWordRangeAtCursor(connection, separators, null);
+ public static void deleteWordAtCursor(InputConnection connection, String separators) {
+ Range range = getWordRangeAtCursor(connection, separators);
if (range == null) return;
connection.finishComposingText();
// Move cursor to beginning of word, to avoid crash when cursor is outside
// of valid range after deleting text.
- int newCursor = getCursorPosition(connection) - range.charsBefore;
+ int newCursor = getCursorPosition(connection) - range.mCharsBefore;
connection.setSelection(newCursor, newCursor);
- connection.deleteSurroundingText(0, range.charsBefore + range.charsAfter);
+ connection.deleteSurroundingText(0, range.mCharsBefore + range.mCharsAfter);
}
/**
@@ -110,31 +109,28 @@ public class EditingUtil {
*/
public static class Range {
/** Characters before selection start */
- public int charsBefore;
+ public final int mCharsBefore;
/**
* Characters after selection start, including one trailing word
* separator.
*/
- public int charsAfter;
+ public final int mCharsAfter;
/** The actual characters that make up a word */
- public String word;
-
- public Range() {}
+ public final String mWord;
public Range(int charsBefore, int charsAfter, String word) {
if (charsBefore < 0 || charsAfter < 0) {
throw new IndexOutOfBoundsException();
}
- this.charsBefore = charsBefore;
- this.charsAfter = charsAfter;
- this.word = word;
+ this.mCharsBefore = charsBefore;
+ this.mCharsAfter = charsAfter;
+ this.mWord = word;
}
}
- private static Range getWordRangeAtCursor(
- InputConnection connection, String sep, Range range) {
+ private static Range getWordRangeAtCursor(InputConnection connection, String sep) {
if (connection == null || sep == null) {
return null;
}
@@ -150,18 +146,15 @@ public class EditingUtil {
// Find last word separator after the cursor
int end = -1;
- while (++end < after.length() && !isWhitespace(after.charAt(end), sep));
+ while (++end < after.length() && !isWhitespace(after.charAt(end), sep)) {
+ // Nothing to do here.
+ }
int cursor = getCursorPosition(connection);
if (start >= 0 && cursor + end <= after.length() + before.length()) {
String word = before.toString().substring(start, before.length())
+ after.toString().substring(0, end);
-
- Range returnRange = range != null? range : new Range();
- returnRange.charsBefore = before.length() - start;
- returnRange.charsAfter = end;
- returnRange.word = word;
- return returnRange;
+ return new Range(before.length() - start, end, word);
}
return null;
@@ -193,9 +186,15 @@ public class EditingUtil {
}
public static class SelectedWord {
- public int start;
- public int end;
- public CharSequence word;
+ public final int mStart;
+ public final int mEnd;
+ public final CharSequence mWord;
+
+ public SelectedWord(int start, int end, CharSequence word) {
+ mStart = start;
+ mEnd = end;
+ mWord = word;
+ }
}
/**
@@ -223,14 +222,10 @@ public class EditingUtil {
int selStart, int selEnd, String wordSeparators) {
if (selStart == selEnd) {
// There is just a cursor, so get the word at the cursor
- EditingUtil.Range range = new EditingUtil.Range();
- CharSequence touching = getWordAtCursor(ic, wordSeparators, range);
- if (!TextUtils.isEmpty(touching)) {
- SelectedWord selWord = new SelectedWord();
- selWord.word = touching;
- selWord.start = selStart - range.charsBefore;
- selWord.end = selEnd + range.charsAfter;
- return selWord;
+ EditingUtils.Range range = getWordRangeAtCursor(ic, wordSeparators);
+ if (range != null && !TextUtils.isEmpty(range.mWord)) {
+ return new SelectedWord(selStart - range.mCharsBefore, selEnd + range.mCharsAfter,
+ range.mWord);
}
} else {
// Is the previous character empty or a word separator? If not, return null.
@@ -256,11 +251,7 @@ public class EditingUtil {
}
}
// Prepare the selected word
- SelectedWord selWord = new SelectedWord();
- selWord.start = selStart;
- selWord.end = selEnd;
- selWord.word = touching;
- return selWord;
+ return new SelectedWord(selStart, selEnd, touching);
}
return null;
}
@@ -324,7 +315,7 @@ public class EditingUtil {
}
if (sMethodSetComposingRegion != null) {
try {
- sMethodSetComposingRegion.invoke(ic, word.start, word.end);
+ sMethodSetComposingRegion.invoke(ic, word.mStart, word.mEnd);
} catch (InvocationTargetException exc) {
// Ignore
} catch (IllegalArgumentException e) {
diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
index e954c0818..0fc86c335 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
@@ -16,11 +16,11 @@
package com.android.inputmethod.latin;
-import java.util.LinkedList;
-
import android.content.Context;
import android.os.AsyncTask;
+import java.util.LinkedList;
+
/**
* Base class for an in-memory dictionary that can grow dynamically and can
* be searched for suggestions and valid words.
@@ -49,53 +49,65 @@ public class ExpandableDictionary extends Dictionary {
// Use this lock before touching mUpdatingDictionary & mRequiresDownload
private Object mUpdatingLock = new Object();
- static class Node {
- char code;
- int frequency;
- boolean terminal;
- Node parent;
- NodeArray children;
- LinkedList<NextWord> ngrams; // Supports ngram
+ private static class Node {
+ char mCode;
+ int mFrequency;
+ boolean mTerminal;
+ Node mParent;
+ NodeArray mChildren;
+ LinkedList<NextWord> mNGrams; // Supports ngram
}
- static class NodeArray {
- Node[] data;
- int length = 0;
+ private static class NodeArray {
+ Node[] mData;
+ int mLength = 0;
private static final int INCREMENT = 2;
NodeArray() {
- data = new Node[INCREMENT];
+ mData = new Node[INCREMENT];
}
void add(Node n) {
- if (length + 1 > data.length) {
- Node[] tempData = new Node[length + INCREMENT];
- if (length > 0) {
- System.arraycopy(data, 0, tempData, 0, length);
+ if (mLength + 1 > mData.length) {
+ Node[] tempData = new Node[mLength + INCREMENT];
+ if (mLength > 0) {
+ System.arraycopy(mData, 0, tempData, 0, mLength);
}
- data = tempData;
+ mData = tempData;
}
- data[length++] = n;
+ mData[mLength++] = n;
}
}
- static class NextWord {
- Node word;
- NextWord nextWord;
- int frequency;
+ private static class NextWord {
+ public final Node mWord;
+ private int mFrequency;
- NextWord(Node word, int frequency) {
- this.word = word;
- this.frequency = frequency;
+ public NextWord(Node word, int frequency) {
+ mWord = word;
+ mFrequency = frequency;
+ }
+
+ public int getFrequency() {
+ return mFrequency;
+ }
+
+ public int setFrequency(int freq) {
+ mFrequency = freq;
+ return mFrequency;
}
- }
+ public int addFrequency(int add) {
+ mFrequency += add;
+ return mFrequency;
+ }
+ }
private NodeArray mRoots;
private int[][] mCodes;
- ExpandableDictionary(Context context, int dicTypeId) {
+ public ExpandableDictionary(Context context, int dicTypeId) {
mContext = context;
clearDictionary();
mCodes = new int[MAX_WORD_LENGTH][];
@@ -128,13 +140,14 @@ public class ExpandableDictionary extends Dictionary {
/** Override to load your dictionary here, on a background thread. */
public void loadDictionaryAsync() {
+ // empty base implementation
}
- Context getContext() {
+ public Context getContext() {
return mContext;
}
-
- int getMaxWordLength() {
+
+ public int getMaxWordLength() {
return MAX_WORD_LENGTH;
}
@@ -145,35 +158,36 @@ public class ExpandableDictionary extends Dictionary {
private void addWordRec(NodeArray children, final String word, final int depth,
final int frequency, Node parentNode) {
final int wordLength = word.length();
+ if (wordLength <= depth) return;
final char c = word.charAt(depth);
// Does children have the current character?
- final int childrenLength = children.length;
+ final int childrenLength = children.mLength;
Node childNode = null;
boolean found = false;
for (int i = 0; i < childrenLength; i++) {
- childNode = children.data[i];
- if (childNode.code == c) {
+ childNode = children.mData[i];
+ if (childNode.mCode == c) {
found = true;
break;
}
}
if (!found) {
childNode = new Node();
- childNode.code = c;
- childNode.parent = parentNode;
+ childNode.mCode = c;
+ childNode.mParent = parentNode;
children.add(childNode);
}
if (wordLength == depth + 1) {
// Terminate this word
- childNode.terminal = true;
- childNode.frequency = Math.max(frequency, childNode.frequency);
- if (childNode.frequency > 255) childNode.frequency = 255;
+ childNode.mTerminal = true;
+ childNode.mFrequency = Math.max(frequency, childNode.mFrequency);
+ if (childNode.mFrequency > 255) childNode.mFrequency = 255;
return;
}
- if (childNode.children == null) {
- childNode.children = new NodeArray();
+ if (childNode.mChildren == null) {
+ childNode.mChildren = new NodeArray();
}
- addWordRec(childNode.children, word, depth + 1, frequency, childNode);
+ addWordRec(childNode.mChildren, word, depth + 1, frequency, childNode);
}
@Override
@@ -216,7 +230,7 @@ public class ExpandableDictionary extends Dictionary {
*/
public int getWordFrequency(CharSequence word) {
Node node = searchNode(mRoots, word, 0, word.length());
- return (node == null) ? -1 : node.frequency;
+ return (node == null) ? -1 : node.mFrequency;
}
/**
@@ -241,7 +255,7 @@ public class ExpandableDictionary extends Dictionary {
protected void getWordsRec(NodeArray roots, final WordComposer codes, final char[] word,
final int depth, boolean completion, int snr, int inputIndex, int skipPos,
WordCallback callback) {
- final int count = roots.length;
+ final int count = roots.mLength;
final int codeSize = mInputLength;
// Optimization: Prune out words that are too long compared to how much was typed.
if (depth > mMaxDepth) {
@@ -255,12 +269,12 @@ public class ExpandableDictionary extends Dictionary {
}
for (int i = 0; i < count; i++) {
- final Node node = roots.data[i];
- final char c = node.code;
+ final Node node = roots.mData[i];
+ final char c = node.mCode;
final char lowerC = toLowerCase(c);
- final boolean terminal = node.terminal;
- final NodeArray children = node.children;
- final int freq = node.frequency;
+ final boolean terminal = node.mTerminal;
+ final NodeArray children = node.mChildren;
+ final int freq = node.mFrequency;
if (completion) {
word[depth] = c;
if (terminal) {
@@ -340,24 +354,22 @@ public class ExpandableDictionary extends Dictionary {
private int addOrSetBigram(String word1, String word2, int frequency, boolean addFrequency) {
Node firstWord = searchWord(mRoots, word1, 0, null);
Node secondWord = searchWord(mRoots, word2, 0, null);
- LinkedList<NextWord> bigram = firstWord.ngrams;
+ LinkedList<NextWord> bigram = firstWord.mNGrams;
if (bigram == null || bigram.size() == 0) {
- firstWord.ngrams = new LinkedList<NextWord>();
- bigram = firstWord.ngrams;
+ firstWord.mNGrams = new LinkedList<NextWord>();
+ bigram = firstWord.mNGrams;
} else {
for (NextWord nw : bigram) {
- if (nw.word == secondWord) {
+ if (nw.mWord == secondWord) {
if (addFrequency) {
- nw.frequency += frequency;
+ return nw.addFrequency(frequency);
} else {
- nw.frequency = frequency;
+ return nw.setFrequency(frequency);
}
- return nw.frequency;
}
}
}
- NextWord nw = new NextWord(secondWord, frequency);
- firstWord.ngrams.add(nw);
+ firstWord.mNGrams.add(new NextWord(secondWord, frequency));
return frequency;
}
@@ -369,31 +381,31 @@ public class ExpandableDictionary extends Dictionary {
final int wordLength = word.length();
final char c = word.charAt(depth);
// Does children have the current character?
- final int childrenLength = children.length;
+ final int childrenLength = children.mLength;
Node childNode = null;
boolean found = false;
for (int i = 0; i < childrenLength; i++) {
- childNode = children.data[i];
- if (childNode.code == c) {
+ childNode = children.mData[i];
+ if (childNode.mCode == c) {
found = true;
break;
}
}
if (!found) {
childNode = new Node();
- childNode.code = c;
- childNode.parent = parentNode;
+ childNode.mCode = c;
+ childNode.mParent = parentNode;
children.add(childNode);
}
if (wordLength == depth + 1) {
// Terminate this word
- childNode.terminal = true;
+ childNode.mTerminal = true;
return childNode;
}
- if (childNode.children == null) {
- childNode.children = new NodeArray();
+ if (childNode.mChildren == null) {
+ childNode.mChildren = new NodeArray();
}
- return searchWord(childNode.children, word, depth + 1, childNode);
+ return searchWord(childNode.mChildren, word, depth + 1, childNode);
}
// @VisibleForTesting
@@ -408,8 +420,8 @@ public class ExpandableDictionary extends Dictionary {
private void runReverseLookUp(final CharSequence previousWord, final WordCallback callback) {
Node prevWord = searchNode(mRoots, previousWord, 0, previousWord.length());
- if (prevWord != null && prevWord.ngrams != null) {
- reverseLookUp(prevWord.ngrams, callback);
+ if (prevWord != null && prevWord.mNGrams != null) {
+ reverseLookUp(prevWord.mNGrams, callback);
}
}
@@ -430,6 +442,7 @@ public class ExpandableDictionary extends Dictionary {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
+ //
}
}
}
@@ -444,14 +457,14 @@ public class ExpandableDictionary extends Dictionary {
Node node;
int freq;
for (NextWord nextWord : terminalNodes) {
- node = nextWord.word;
- freq = nextWord.frequency;
+ node = nextWord.mWord;
+ freq = nextWord.getFrequency();
// TODO Not the best way to limit suggestion threshold
if (freq >= UserBigramDictionary.SUGGEST_THRESHOLD) {
sb.setLength(0);
do {
- sb.insert(0, node.code);
- node = node.parent;
+ sb.insert(0, node.mCode);
+ node = node.mParent;
} while(node != null);
// TODO better way to feed char array?
@@ -468,18 +481,18 @@ public class ExpandableDictionary extends Dictionary {
private Node searchNode(final NodeArray children, final CharSequence word, final int offset,
final int length) {
// TODO Consider combining with addWordRec
- final int count = children.length;
+ final int count = children.mLength;
char currentChar = word.charAt(offset);
for (int j = 0; j < count; j++) {
- final Node node = children.data[j];
- if (node.code == currentChar) {
+ final Node node = children.mData[j];
+ if (node.mCode == currentChar) {
if (offset == length - 1) {
- if (node.terminal) {
+ if (node.mTerminal) {
return node;
}
} else {
- if (node.children != null) {
- Node returnNode = searchNode(node.children, word, offset + 1, length);
+ if (node.mChildren != null) {
+ Node returnNode = searchNode(node.mChildren, word, offset + 1, length);
if (returnNode != null) return returnNode;
}
}
@@ -504,15 +517,16 @@ public class ExpandableDictionary extends Dictionary {
}
static char toLowerCase(char c) {
+ char baseChar = c;
if (c < BASE_CHARS.length) {
- c = BASE_CHARS[c];
+ baseChar = BASE_CHARS[c];
}
- if (c >= 'A' && c <= 'Z') {
- c = (char) (c | 32);
- } else if (c > 127) {
- c = Character.toLowerCase(c);
+ if (baseChar >= 'A' && baseChar <= 'Z') {
+ return (char)(baseChar | 32);
+ } else if (baseChar > 127) {
+ return Character.toLowerCase(baseChar);
}
- return c;
+ return baseChar;
}
/**
diff --git a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
index e811a2cdd..a9f2c2c22 100644
--- a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
+++ b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
@@ -16,11 +16,6 @@
package com.android.inputmethod.latin;
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Locale;
-
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Configuration;
@@ -32,32 +27,43 @@ import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.text.TextUtils;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Locale;
+
public class InputLanguageSelection extends PreferenceActivity {
+ private SharedPreferences mPrefs;
private String mSelectedLanguages;
private ArrayList<Loc> mAvailableLanguages = new ArrayList<Loc>();
private static final String[] BLACKLIST_LANGUAGES = {
- "ko", "ja", "zh", "el"
+ "ko", "ja", "zh", "el", "zz"
};
private static class Loc implements Comparable<Object> {
- static Collator sCollator = Collator.getInstance();
+ private static Collator sCollator = Collator.getInstance();
- String label;
- Locale locale;
+ private String mLabel;
+ public final Locale mLocale;
public Loc(String label, Locale locale) {
- this.label = label;
- this.locale = locale;
+ this.mLabel = label;
+ this.mLocale = locale;
+ }
+
+ public void setLabel(String label) {
+ this.mLabel = label;
}
@Override
public String toString() {
- return this.label;
+ return this.mLabel;
}
+ @Override
public int compareTo(Object o) {
- return sCollator.compare(this.label, ((Loc) o).label);
+ return sCollator.compare(this.mLabel, ((Loc) o).mLabel);
}
}
@@ -66,15 +72,15 @@ public class InputLanguageSelection extends PreferenceActivity {
super.onCreate(icicle);
addPreferencesFromResource(R.xml.language_prefs);
// Get the settings preferences
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
- mSelectedLanguages = sp.getString(LatinIME.PREF_SELECTED_LANGUAGES, "");
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ mSelectedLanguages = mPrefs.getString(Settings.PREF_SELECTED_LANGUAGES, "");
String[] languageList = mSelectedLanguages.split(",");
mAvailableLanguages = getUniqueLocales();
PreferenceGroup parent = getPreferenceScreen();
for (int i = 0; i < mAvailableLanguages.size(); i++) {
CheckBoxPreference pref = new CheckBoxPreference(this);
- Locale locale = mAvailableLanguages.get(i).locale;
- pref.setTitle(LanguageSwitcher.toTitleCase(locale.getDisplayName(locale)));
+ Locale locale = mAvailableLanguages.get(i).mLocale;
+ pref.setTitle(SubtypeSwitcher.getFullDisplayName(locale, true));
boolean checked = isLocaleIn(locale, languageList);
pref.setChecked(checked);
if (hasDictionary(locale)) {
@@ -93,15 +99,15 @@ public class InputLanguageSelection extends PreferenceActivity {
}
private boolean hasDictionary(Locale locale) {
- Resources res = getResources();
- Configuration conf = res.getConfiguration();
- Locale saveLocale = conf.locale;
+ final Resources res = getResources();
+ final Configuration conf = res.getConfiguration();
+ final Locale saveLocale = conf.locale;
boolean haveDictionary = false;
conf.locale = locale;
res.updateConfiguration(conf, res.getDisplayMetrics());
- int[] dictionaries = LatinIME.getDictionary(res);
- BinaryDictionary bd = new BinaryDictionary(this, dictionaries, Suggest.DIC_MAIN);
+ int mainDicResId = LatinIME.getMainDictionaryResourceId(res);
+ BinaryDictionary bd = BinaryDictionary.initDictionary(this, mainDicResId, Suggest.DIC_MAIN);
// Is the dictionary larger than a placeholder? Arbitrarily chose a lower limit of
// 4000-5000 words, whereas the LARGE_DICTIONARY is about 20000+ words.
@@ -135,18 +141,17 @@ public class InputLanguageSelection extends PreferenceActivity {
for (int i = 0; i < count; i++) {
CheckBoxPreference pref = (CheckBoxPreference) parent.getPreference(i);
if (pref.isChecked()) {
- Locale locale = mAvailableLanguages.get(i).locale;
+ Locale locale = mAvailableLanguages.get(i).mLocale;
checkedLanguages += get5Code(locale) + ",";
}
}
if (checkedLanguages.length() < 1) checkedLanguages = null; // Save null
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
- Editor editor = sp.edit();
- editor.putString(LatinIME.PREF_SELECTED_LANGUAGES, checkedLanguages);
+ Editor editor = mPrefs.edit();
+ editor.putString(Settings.PREF_SELECTED_LANGUAGES, checkedLanguages);
SharedPreferencesCompat.apply(editor);
}
- ArrayList<Loc> getUniqueLocales() {
+ public ArrayList<Loc> getUniqueLocales() {
String[] locales = getAssets().getLocales();
Arrays.sort(locales);
ArrayList<Loc> uniqueLocales = new ArrayList<Loc>();
@@ -167,23 +172,24 @@ public class InputLanguageSelection extends PreferenceActivity {
if (finalSize == 0) {
preprocess[finalSize++] =
- new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(l)), l);
+ new Loc(SubtypeSwitcher.getFullDisplayName(l, true), l);
} else {
// check previous entry:
// same lang and a country -> upgrade to full name and
// insert ours with full name
// diff lang -> insert ours with lang-only name
- if (preprocess[finalSize-1].locale.getLanguage().equals(
+ if (preprocess[finalSize-1].mLocale.getLanguage().equals(
language)) {
- preprocess[finalSize-1].label = LanguageSwitcher.toTitleCase(
- preprocess[finalSize-1].locale.getDisplayName());
+ preprocess[finalSize-1].setLabel(SubtypeSwitcher.getFullDisplayName(
+ preprocess[finalSize-1].mLocale, false));
preprocess[finalSize++] =
- new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName()), l);
+ new Loc(SubtypeSwitcher.getFullDisplayName(l, false), l);
} else {
String displayName;
if (s.equals("zz_ZZ")) {
+ // ignore this locale
} else {
- displayName = LanguageSwitcher.toTitleCase(l.getDisplayName(l));
+ displayName = SubtypeSwitcher.getFullDisplayName(l, true);
preprocess[finalSize++] = new Loc(displayName, l);
}
}
diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
deleted file mode 100644
index 0db204ed8..000000000
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ /dev/null
@@ -1,606 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.SharedPreferences;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.preference.PreferenceManager;
-import android.view.InflateException;
-
-import java.lang.ref.SoftReference;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Locale;
-
-public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener {
-
- public static final int MODE_NONE = 0;
- public static final int MODE_TEXT = 1;
- public static final int MODE_SYMBOLS = 2;
- public static final int MODE_PHONE = 3;
- public static final int MODE_URL = 4;
- public static final int MODE_EMAIL = 5;
- public static final int MODE_IM = 6;
- public static final int MODE_WEB = 7;
-
- // Main keyboard layouts without the settings key
- public static final int KEYBOARDMODE_NORMAL = R.id.mode_normal;
- public static final int KEYBOARDMODE_URL = R.id.mode_url;
- public static final int KEYBOARDMODE_EMAIL = R.id.mode_email;
- public static final int KEYBOARDMODE_IM = R.id.mode_im;
- public static final int KEYBOARDMODE_WEB = R.id.mode_webentry;
- // Main keyboard layouts with the settings key
- public static final int KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY =
- R.id.mode_normal_with_settings_key;
- public static final int KEYBOARDMODE_URL_WITH_SETTINGS_KEY =
- R.id.mode_url_with_settings_key;
- public static final int KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY =
- R.id.mode_email_with_settings_key;
- public static final int KEYBOARDMODE_IM_WITH_SETTINGS_KEY =
- R.id.mode_im_with_settings_key;
- public static final int KEYBOARDMODE_WEB_WITH_SETTINGS_KEY =
- R.id.mode_webentry_with_settings_key;
-
- // Symbols keyboard layout without the settings key
- public static final int KEYBOARDMODE_SYMBOLS = R.id.mode_symbols;
- // Symbols keyboard layout with the settings key
- public static final int KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY =
- R.id.mode_symbols_with_settings_key;
-
- public static final String DEFAULT_LAYOUT_ID = "4";
- public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902";
- private static final int[] THEMES = new int [] {
- R.layout.input_basic, R.layout.input_basic_highcontrast, R.layout.input_stone_normal,
- R.layout.input_stone_bold, R.layout.input_gingerbread};
-
- // Ids for each characters' color in the keyboard
- private static final int CHAR_THEME_COLOR_WHITE = 0;
- private static final int CHAR_THEME_COLOR_BLACK = 1;
-
- // Tables which contains resource ids for each character theme color
- private static final int[] KBD_PHONE = new int[] {R.xml.kbd_phone, R.xml.kbd_phone_black};
- private static final int[] KBD_PHONE_SYMBOLS = new int[] {
- R.xml.kbd_phone_symbols, R.xml.kbd_phone_symbols_black};
- private static final int[] KBD_SYMBOLS = new int[] {
- R.xml.kbd_symbols, R.xml.kbd_symbols_black};
- private static final int[] KBD_SYMBOLS_SHIFT = new int[] {
- R.xml.kbd_symbols_shift, R.xml.kbd_symbols_shift_black};
- private static final int[] KBD_QWERTY = new int[] {R.xml.kbd_qwerty, R.xml.kbd_qwerty_black};
-
- private LatinKeyboardView mInputView;
- private static final int[] ALPHABET_MODES = {
- KEYBOARDMODE_NORMAL,
- KEYBOARDMODE_URL,
- KEYBOARDMODE_EMAIL,
- KEYBOARDMODE_IM,
- KEYBOARDMODE_WEB,
- KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY,
- KEYBOARDMODE_URL_WITH_SETTINGS_KEY,
- KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY,
- KEYBOARDMODE_IM_WITH_SETTINGS_KEY,
- KEYBOARDMODE_WEB_WITH_SETTINGS_KEY };
-
- private LatinIME mInputMethodService;
-
- private KeyboardId mSymbolsId;
- private KeyboardId mSymbolsShiftedId;
-
- private KeyboardId mCurrentId;
- private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboards =
- new HashMap<KeyboardId, SoftReference<LatinKeyboard>>();
-
- private int mMode = MODE_NONE; /** One of the MODE_XXX values */
- private int mImeOptions;
- private boolean mIsSymbols;
- /** mIsAutoCompletionActive indicates that auto completed word will be input instead of
- * what user actually typed. */
- private boolean mIsAutoCompletionActive;
- private boolean mHasVoice;
- private boolean mVoiceOnPrimary;
- private boolean mPreferSymbols;
-
- private static final int AUTO_MODE_SWITCH_STATE_ALPHA = 0;
- private static final int AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN = 1;
- private static final int AUTO_MODE_SWITCH_STATE_SYMBOL = 2;
- // The following states are used only on the distinct multi-touch panel devices.
- private static final int AUTO_MODE_SWITCH_STATE_MOMENTARY = 3;
- private static final int AUTO_MODE_SWITCH_STATE_CHORDING = 4;
- private int mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
-
- // Indicates whether or not we have the settings key
- private boolean mHasSettingsKey;
- private static final int SETTINGS_KEY_MODE_AUTO = R.string.settings_key_mode_auto;
- private static final int SETTINGS_KEY_MODE_ALWAYS_SHOW = R.string.settings_key_mode_always_show;
- // NOTE: No need to have SETTINGS_KEY_MODE_ALWAYS_HIDE here because it's not being referred to
- // in the source code now.
- // Default is SETTINGS_KEY_MODE_AUTO.
- private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO;
-
- private int mLastDisplayWidth;
- private LanguageSwitcher mLanguageSwitcher;
- private Locale mInputLocale;
-
- private int mLayoutId;
-
- private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();
-
- public static KeyboardSwitcher getInstance() {
- return sInstance;
- }
-
- private KeyboardSwitcher() {
- // Intentional empty constructor for singleton.
- }
-
- public static void init(LatinIME ims) {
- sInstance.mInputMethodService = ims;
-
- final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ims);
- sInstance.mLayoutId = Integer.valueOf(
- prefs.getString(PREF_KEYBOARD_LAYOUT, DEFAULT_LAYOUT_ID));
- sInstance.updateSettingsKeyState(prefs);
- prefs.registerOnSharedPreferenceChangeListener(sInstance);
-
- sInstance.mSymbolsId = sInstance.makeSymbolsId(false);
- sInstance.mSymbolsShiftedId = sInstance.makeSymbolsShiftedId(false);
- }
-
- /**
- * Sets the input locale, when there are multiple locales for input.
- * If no locale switching is required, then the locale should be set to null.
- * @param locale the current input locale, or null for default locale with no locale
- * button.
- */
- public void setLanguageSwitcher(LanguageSwitcher languageSwitcher) {
- mLanguageSwitcher = languageSwitcher;
- mInputLocale = mLanguageSwitcher.getInputLocale();
- }
-
- private KeyboardId makeSymbolsId(boolean hasVoice) {
- return new KeyboardId(KBD_SYMBOLS[getCharColorId()], mHasSettingsKey ?
- KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS,
- false, hasVoice);
- }
-
- private KeyboardId makeSymbolsShiftedId(boolean hasVoice) {
- return new KeyboardId(KBD_SYMBOLS_SHIFT[getCharColorId()], mHasSettingsKey ?
- KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS,
- false, hasVoice);
- }
-
- public void makeKeyboards(boolean forceCreate) {
- mSymbolsId = makeSymbolsId(mHasVoice && !mVoiceOnPrimary);
- mSymbolsShiftedId = makeSymbolsShiftedId(mHasVoice && !mVoiceOnPrimary);
-
- if (forceCreate) mKeyboards.clear();
- // Configuration change is coming after the keyboard gets recreated. So don't rely on that.
- // If keyboards have already been made, check if we have a screen width change and
- // create the keyboard layouts again at the correct orientation
- int displayWidth = mInputMethodService.getMaxWidth();
- if (displayWidth == mLastDisplayWidth) return;
- mLastDisplayWidth = displayWidth;
- if (!forceCreate) mKeyboards.clear();
- }
-
- /**
- * Represents the parameters necessary to construct a new LatinKeyboard,
- * which also serve as a unique identifier for each keyboard type.
- */
- private static class KeyboardId {
- // TODO: should have locale and portrait/landscape orientation?
- public final int mXml;
- public final int mKeyboardMode; /** A KEYBOARDMODE_XXX value */
- public final boolean mEnableShiftLock;
- public final boolean mHasVoice;
-
- private final int mHashCode;
-
- public KeyboardId(int xml, int mode, boolean enableShiftLock, boolean hasVoice) {
- this.mXml = xml;
- this.mKeyboardMode = mode;
- this.mEnableShiftLock = enableShiftLock;
- this.mHasVoice = hasVoice;
-
- this.mHashCode = Arrays.hashCode(new Object[] {
- xml, mode, enableShiftLock, hasVoice
- });
- }
-
- public KeyboardId(int xml, boolean hasVoice) {
- this(xml, 0, false, hasVoice);
- }
-
- @Override
- public boolean equals(Object other) {
- return other instanceof KeyboardId && equals((KeyboardId) other);
- }
-
- private boolean equals(KeyboardId other) {
- return other.mXml == this.mXml
- && other.mKeyboardMode == this.mKeyboardMode
- && other.mEnableShiftLock == this.mEnableShiftLock
- && other.mHasVoice == this.mHasVoice;
- }
-
- @Override
- public int hashCode() {
- return mHashCode;
- }
- }
-
- public void setVoiceMode(boolean enableVoice, boolean voiceOnPrimary) {
- if (enableVoice != mHasVoice || voiceOnPrimary != mVoiceOnPrimary) {
- mKeyboards.clear();
- }
- mHasVoice = enableVoice;
- mVoiceOnPrimary = voiceOnPrimary;
- setKeyboardMode(mMode, mImeOptions, mHasVoice, mIsSymbols);
- }
-
- private boolean hasVoiceButton(boolean isSymbols) {
- return mHasVoice && (isSymbols != mVoiceOnPrimary);
- }
-
- public void setKeyboardMode(int mode, int imeOptions, boolean enableVoice) {
- mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
- mPreferSymbols = mode == MODE_SYMBOLS;
- if (mode == MODE_SYMBOLS) {
- mode = MODE_TEXT;
- }
- try {
- setKeyboardMode(mode, imeOptions, enableVoice, mPreferSymbols);
- } catch (RuntimeException e) {
- LatinImeLogger.logOnException(mode + "," + imeOptions + "," + mPreferSymbols, e);
- }
- }
-
- private void setKeyboardMode(int mode, int imeOptions, boolean enableVoice, boolean isSymbols) {
- if (mInputView == null) return;
- mMode = mode;
- mImeOptions = imeOptions;
- if (enableVoice != mHasVoice) {
- // TODO clean up this unnecessary recursive call.
- setVoiceMode(enableVoice, mVoiceOnPrimary);
- }
- mIsSymbols = isSymbols;
-
- mInputView.setPreviewEnabled(mInputMethodService.getPopupOn());
- KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
- LatinKeyboard keyboard = null;
- keyboard = getKeyboard(id);
-
- if (mode == MODE_PHONE) {
- mInputView.setPhoneKeyboard(keyboard);
- }
-
- mCurrentId = id;
- mInputView.setKeyboard(keyboard);
- keyboard.setShifted(false);
- keyboard.setShiftLocked(keyboard.isShiftLocked());
- keyboard.setImeOptions(mInputMethodService.getResources(), mMode, imeOptions);
- keyboard.setColorOfSymbolIcons(mIsAutoCompletionActive, isBlackSym());
- // Update the settings key state because number of enabled IMEs could have been changed
- updateSettingsKeyState(PreferenceManager.getDefaultSharedPreferences(mInputMethodService));
- }
-
- private LatinKeyboard getKeyboard(KeyboardId id) {
- SoftReference<LatinKeyboard> ref = mKeyboards.get(id);
- LatinKeyboard keyboard = (ref == null) ? null : ref.get();
- if (keyboard == null) {
- Resources orig = mInputMethodService.getResources();
- Configuration conf = orig.getConfiguration();
- Locale saveLocale = conf.locale;
- conf.locale = mInputLocale;
- orig.updateConfiguration(conf, null);
- keyboard = new LatinKeyboard(mInputMethodService, id.mXml, id.mKeyboardMode);
- keyboard.setVoiceMode(hasVoiceButton(id.mXml == R.xml.kbd_symbols
- || id.mXml == R.xml.kbd_symbols_black), mHasVoice);
- keyboard.setLanguageSwitcher(mLanguageSwitcher, mIsAutoCompletionActive, isBlackSym());
-
- if (id.mEnableShiftLock) {
- keyboard.enableShiftLock();
- }
- mKeyboards.put(id, new SoftReference<LatinKeyboard>(keyboard));
-
- conf.locale = saveLocale;
- orig.updateConfiguration(conf, null);
- }
- return keyboard;
- }
-
- private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) {
- boolean hasVoice = hasVoiceButton(isSymbols);
- int charColorId = getCharColorId();
- // TODO: generalize for any KeyboardId
- int keyboardRowsResId = KBD_QWERTY[charColorId];
- if (isSymbols) {
- if (mode == MODE_PHONE) {
- return new KeyboardId(KBD_PHONE_SYMBOLS[charColorId], hasVoice);
- } else {
- return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ?
- KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS,
- false, hasVoice);
- }
- }
- switch (mode) {
- case MODE_NONE:
- LatinImeLogger.logOnWarning(
- "getKeyboardId:" + mode + "," + imeOptions + "," + isSymbols);
- /* fall through */
- case MODE_TEXT:
- return new KeyboardId(keyboardRowsResId, mHasSettingsKey ?
- KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY : KEYBOARDMODE_NORMAL,
- true, hasVoice);
- case MODE_SYMBOLS:
- return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ?
- KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS,
- false, hasVoice);
- case MODE_PHONE:
- return new KeyboardId(KBD_PHONE[charColorId], hasVoice);
- case MODE_URL:
- return new KeyboardId(keyboardRowsResId, mHasSettingsKey ?
- KEYBOARDMODE_URL_WITH_SETTINGS_KEY : KEYBOARDMODE_URL, true, hasVoice);
- case MODE_EMAIL:
- return new KeyboardId(keyboardRowsResId, mHasSettingsKey ?
- KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY : KEYBOARDMODE_EMAIL, true, hasVoice);
- case MODE_IM:
- return new KeyboardId(keyboardRowsResId, mHasSettingsKey ?
- KEYBOARDMODE_IM_WITH_SETTINGS_KEY : KEYBOARDMODE_IM, true, hasVoice);
- case MODE_WEB:
- return new KeyboardId(keyboardRowsResId, mHasSettingsKey ?
- KEYBOARDMODE_WEB_WITH_SETTINGS_KEY : KEYBOARDMODE_WEB, true, hasVoice);
- }
- return null;
- }
-
- public int getKeyboardMode() {
- return mMode;
- }
-
- public boolean isAlphabetMode() {
- if (mCurrentId == null) {
- return false;
- }
- int currentMode = mCurrentId.mKeyboardMode;
- for (Integer mode : ALPHABET_MODES) {
- if (currentMode == mode) {
- return true;
- }
- }
- return false;
- }
-
- public void setShifted(boolean shifted) {
- if (mInputView != null) {
- mInputView.setShifted(shifted);
- }
- }
-
- public void setShiftLocked(boolean shiftLocked) {
- if (mInputView != null) {
- mInputView.setShiftLocked(shiftLocked);
- }
- }
-
- public void toggleShift() {
- if (isAlphabetMode())
- return;
- if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) {
- LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId);
- mCurrentId = mSymbolsShiftedId;
- mInputView.setKeyboard(symbolsShiftedKeyboard);
- // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To
- // enable the indicator, we need to call enableShiftLock() and setShiftLocked(true).
- // Thus we can keep the ALT key's Key.on value true while LatinKey.onRelease() is
- // called.
- symbolsShiftedKeyboard.enableShiftLock();
- symbolsShiftedKeyboard.setShiftLocked(true);
- symbolsShiftedKeyboard.setImeOptions(mInputMethodService.getResources(),
- mMode, mImeOptions);
- } else {
- LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId);
- mCurrentId = mSymbolsId;
- mInputView.setKeyboard(symbolsKeyboard);
- // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the
- // indicator, we need to call enableShiftLock() and setShiftLocked(false).
- symbolsKeyboard.enableShiftLock();
- symbolsKeyboard.setShifted(false);
- symbolsKeyboard.setImeOptions(mInputMethodService.getResources(), mMode, mImeOptions);
- }
- }
-
- public void onCancelInput() {
- // Snap back to the previous keyboard mode if the user cancels sliding input.
- if (mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY && getPointerCount() == 1)
- mInputMethodService.changeKeyboardMode();
- }
-
- public void toggleSymbols() {
- setKeyboardMode(mMode, mImeOptions, mHasVoice, !mIsSymbols);
- if (mIsSymbols && !mPreferSymbols) {
- mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN;
- } else {
- mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
- }
- }
-
- public boolean hasDistinctMultitouch() {
- return mInputView != null && mInputView.hasDistinctMultitouch();
- }
-
- public void setAutoModeSwitchStateMomentary() {
- mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_MOMENTARY;
- }
-
- public boolean isInMomentaryAutoModeSwitchState() {
- return mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY;
- }
-
- public boolean isInChordingAutoModeSwitchState() {
- return mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_CHORDING;
- }
-
- public boolean isVibrateAndSoundFeedbackRequired() {
- return mInputView != null && !mInputView.isInSlidingKeyInput();
- }
-
- private int getPointerCount() {
- return mInputView == null ? 0 : mInputView.getPointerCount();
- }
-
- /**
- * Updates state machine to figure out when to automatically snap back to the previous mode.
- */
- public void onKey(int key) {
- // Switch back to alpha mode if user types one or more non-space/enter characters
- // followed by a space/enter
- switch (mAutoModeSwitchState) {
- case AUTO_MODE_SWITCH_STATE_MOMENTARY:
- // Only distinct multi touch devices can be in this state.
- // On non-distinct multi touch devices, mode change key is handled by {@link onKey},
- // not by {@link onPress} and {@link onRelease}. So, on such devices,
- // {@link mAutoModeSwitchState} starts from {@link AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN},
- // or {@link AUTO_MODE_SWITCH_STATE_ALPHA}, not from
- // {@link AUTO_MODE_SWITCH_STATE_MOMENTARY}.
- if (key == LatinKeyboard.KEYCODE_MODE_CHANGE) {
- // Detected only the mode change key has been pressed, and then released.
- if (mIsSymbols) {
- mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN;
- } else {
- mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
- }
- } else if (getPointerCount() == 1) {
- // Snap back to the previous keyboard mode if the user pressed the mode change key
- // and slid to other key, then released the finger.
- // If the user cancels the sliding input, snapping back to the previous keyboard
- // mode is handled by {@link #onCancelInput}.
- mInputMethodService.changeKeyboardMode();
- } else {
- // Chording input is being started. The keyboard mode will be snapped back to the
- // previous mode in {@link onReleaseSymbol} when the mode change key is released.
- mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_CHORDING;
- }
- break;
- case AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN:
- if (key != LatinIME.KEYCODE_SPACE && key != LatinIME.KEYCODE_ENTER && key >= 0) {
- mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL;
- }
- break;
- case AUTO_MODE_SWITCH_STATE_SYMBOL:
- // Snap back to alpha keyboard mode if user types one or more non-space/enter
- // characters followed by a space/enter.
- if (key == LatinIME.KEYCODE_ENTER || key == LatinIME.KEYCODE_SPACE) {
- mInputMethodService.changeKeyboardMode();
- }
- break;
- }
- }
-
- public LatinKeyboardView getInputView() {
- return mInputView;
- }
-
- public void recreateInputView() {
- changeLatinKeyboardView(mLayoutId, true);
- }
-
- private void changeLatinKeyboardView(int newLayout, boolean forceReset) {
- if (mLayoutId != newLayout || mInputView == null || forceReset) {
- if (mInputView != null) {
- mInputView.closing();
- }
- if (THEMES.length <= newLayout) {
- newLayout = Integer.valueOf(DEFAULT_LAYOUT_ID);
- }
-
- LatinIMEUtil.GCUtils.getInstance().reset();
- boolean tryGC = true;
- for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
- try {
- mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater(
- ).inflate(THEMES[newLayout], null);
- tryGC = false;
- } catch (OutOfMemoryError e) {
- tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait(
- mLayoutId + "," + newLayout, e);
- } catch (InflateException e) {
- tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait(
- mLayoutId + "," + newLayout, e);
- }
- }
- mInputView.setOnKeyboardActionListener(mInputMethodService);
- mLayoutId = newLayout;
- }
- mInputMethodService.mHandler.post(new Runnable() {
- public void run() {
- if (mInputView != null) {
- mInputMethodService.setInputView(mInputView);
- }
- mInputMethodService.updateInputViewShown();
- }});
- }
-
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if (PREF_KEYBOARD_LAYOUT.equals(key)) {
- changeLatinKeyboardView(
- Integer.valueOf(sharedPreferences.getString(key, DEFAULT_LAYOUT_ID)), false);
- } else if (LatinIMESettings.PREF_SETTINGS_KEY.equals(key)) {
- updateSettingsKeyState(sharedPreferences);
- recreateInputView();
- }
- }
-
- public boolean isBlackSym () {
- if (mInputView != null && mInputView.getSymbolColorScheme() == 1) {
- return true;
- }
- return false;
- }
-
- private int getCharColorId () {
- if (isBlackSym()) {
- return CHAR_THEME_COLOR_BLACK;
- } else {
- return CHAR_THEME_COLOR_WHITE;
- }
- }
-
- public void onAutoCompletionStateChanged(boolean isAutoCompletion) {
- if (isAutoCompletion != mIsAutoCompletionActive) {
- LatinKeyboardView keyboardView = getInputView();
- mIsAutoCompletionActive = isAutoCompletion;
- keyboardView.invalidateKey(((LatinKeyboard) keyboardView.getKeyboard())
- .onAutoCompletionStateChanged(isAutoCompletion));
- }
- }
-
- private void updateSettingsKeyState(SharedPreferences prefs) {
- Resources resources = mInputMethodService.getResources();
- final String settingsKeyMode = prefs.getString(LatinIMESettings.PREF_SETTINGS_KEY,
- resources.getString(DEFAULT_SETTINGS_KEY_MODE));
- // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or
- // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system
- if (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))
- || (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO))
- && LatinIMEUtil.hasMultipleEnabledIMEs(mInputMethodService))) {
- mHasSettingsKey = true;
- } else {
- mHasSettingsKey = false;
- }
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
index 7b5c30491..6faf7f95e 100644
--- a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
@@ -16,21 +16,21 @@
package com.android.inputmethod.latin;
-import java.util.Locale;
-
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
-import android.preference.PreferenceManager;
import android.text.TextUtils;
+import java.util.ArrayList;
+import java.util.Locale;
+
/**
* Keeps track of list of selected input languages and the current
* input language that the user has selected.
*/
public class LanguageSwitcher {
- private Locale[] mLocales;
- private LatinIME mIme;
+ private final ArrayList<Locale> mLocales = new ArrayList<Locale>();
+ private final LatinIME mIme;
private String[] mSelectedLanguageArray;
private String mSelectedLanguages;
private int mCurrentIndex = 0;
@@ -40,15 +40,10 @@ public class LanguageSwitcher {
public LanguageSwitcher(LatinIME ime) {
mIme = ime;
- mLocales = new Locale[0];
- }
-
- public Locale[] getLocales() {
- return mLocales;
}
public int getLocaleCount() {
- return mLocales.length;
+ return mLocales.size();
}
/**
@@ -57,14 +52,14 @@ public class LanguageSwitcher {
* @return whether there was any change
*/
public boolean loadLocales(SharedPreferences sp) {
- String selectedLanguages = sp.getString(LatinIME.PREF_SELECTED_LANGUAGES, null);
- String currentLanguage = sp.getString(LatinIME.PREF_INPUT_LANGUAGE, null);
+ String selectedLanguages = sp.getString(Settings.PREF_SELECTED_LANGUAGES, null);
+ String currentLanguage = sp.getString(Settings.PREF_INPUT_LANGUAGE, null);
if (selectedLanguages == null || selectedLanguages.length() < 1) {
loadDefaults();
- if (mLocales.length == 0) {
+ if (mLocales.size() == 0) {
return false;
}
- mLocales = new Locale[0];
+ mLocales.clear();
return true;
}
if (selectedLanguages.equals(mSelectedLanguages)) {
@@ -77,7 +72,7 @@ public class LanguageSwitcher {
if (currentLanguage != null) {
// Find the index
mCurrentIndex = 0;
- for (int i = 0; i < mLocales.length; i++) {
+ for (int i = 0; i < mLocales.size(); i++) {
if (mSelectedLanguageArray[i].equals(currentLanguage)) {
mCurrentIndex = i;
break;
@@ -96,11 +91,11 @@ public class LanguageSwitcher {
}
private void constructLocales() {
- mLocales = new Locale[mSelectedLanguageArray.length];
- for (int i = 0; i < mLocales.length; i++) {
- final String lang = mSelectedLanguageArray[i];
- mLocales[i] = new Locale(lang.substring(0, 2),
+ mLocales.clear();
+ for (final String lang : mSelectedLanguageArray) {
+ final Locale locale = new Locale(lang.substring(0, 2),
lang.length() > 4 ? lang.substring(3, 5) : "");
+ mLocales.add(locale);
}
}
@@ -129,7 +124,17 @@ public class LanguageSwitcher {
public Locale getInputLocale() {
if (getLocaleCount() == 0) return mDefaultInputLocale;
- return mLocales[mCurrentIndex];
+ return mLocales.get(mCurrentIndex);
+ }
+
+ private int nextLocaleIndex() {
+ final int size = mLocales.size();
+ return (mCurrentIndex + 1) % size;
+ }
+
+ private int prevLocaleIndex() {
+ final int size = mLocales.size();
+ return (mCurrentIndex - 1 + size) % size;
}
/**
@@ -139,8 +144,7 @@ public class LanguageSwitcher {
*/
public Locale getNextInputLocale() {
if (getLocaleCount() == 0) return mDefaultInputLocale;
-
- return mLocales[(mCurrentIndex + 1) % mLocales.length];
+ return mLocales.get(nextLocaleIndex());
}
/**
@@ -166,8 +170,7 @@ public class LanguageSwitcher {
*/
public Locale getPrevInputLocale() {
if (getLocaleCount() == 0) return mDefaultInputLocale;
-
- return mLocales[(mCurrentIndex - 1 + mLocales.length) % mLocales.length];
+ return mLocales.get(prevLocaleIndex());
}
public void reset() {
@@ -175,27 +178,16 @@ public class LanguageSwitcher {
}
public void next() {
- mCurrentIndex++;
- if (mCurrentIndex >= mLocales.length) mCurrentIndex = 0; // Wrap around
+ mCurrentIndex = nextLocaleIndex();
}
public void prev() {
- mCurrentIndex--;
- if (mCurrentIndex < 0) mCurrentIndex = mLocales.length - 1; // Wrap around
+ mCurrentIndex = prevLocaleIndex();
}
- public void persist() {
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mIme);
- Editor editor = sp.edit();
- editor.putString(LatinIME.PREF_INPUT_LANGUAGE, getInputLanguage());
+ public void persist(SharedPreferences prefs) {
+ Editor editor = prefs.edit();
+ editor.putString(Settings.PREF_INPUT_LANGUAGE, getInputLanguage());
SharedPreferencesCompat.apply(editor);
}
-
- static String toTitleCase(String s) {
- if (s.length() == 0) {
- return s;
- }
-
- return Character.toUpperCase(s.charAt(0)) + s.substring(1);
- }
}
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index b1689f886..8166e0b4e 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -16,12 +16,15 @@
package com.android.inputmethod.latin;
-import com.android.inputmethod.latin.LatinIMEUtil.RingCharBuffer;
-import com.android.inputmethod.voice.FieldContext;
-import com.android.inputmethod.voice.SettingsUtil;
-import com.android.inputmethod.voice.VoiceInput;
-
-import org.xmlpull.v1.XmlPullParserException;
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardActionListener;
+import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.keyboard.KeyboardView;
+import com.android.inputmethod.keyboard.LatinKeyboard;
+import com.android.inputmethod.keyboard.LatinKeyboardView;
+import com.android.inputmethod.latin.Utils.RingCharBuffer;
+import com.android.inputmethod.voice.VoiceIMEConnector;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
@@ -32,23 +35,23 @@ import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.content.res.XmlResourceParser;
import android.inputmethodservice.InputMethodService;
-import android.inputmethodservice.Keyboard;
import android.media.AudioManager;
+import android.net.ConnectivityManager;
import android.os.Debug;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
+import android.os.Vibrator;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
-import android.speech.SpeechRecognizer;
-import android.text.ClipboardManager;
+import android.text.InputType;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.PrintWriterPrinter;
import android.util.Printer;
+import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -58,206 +61,134 @@ import android.view.ViewParent;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.CompletionInfo;
+import android.view.inputmethod.CorrectionInfo;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+import android.widget.FrameLayout;
+import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import java.io.FileDescriptor;
-import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
+import java.util.Arrays;
import java.util.Locale;
-import java.util.Map;
/**
* Input method implementation for Qwerty'ish keyboard.
*/
-public class LatinIME extends InputMethodService
- implements LatinKeyboardBaseView.OnKeyboardActionListener,
- VoiceInput.UiListener,
+public class LatinIME extends InputMethodService implements KeyboardActionListener,
SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = "LatinIME";
private static final boolean PERF_DEBUG = false;
- static final boolean DEBUG = false;
- static final boolean TRACE = false;
- static final boolean VOICE_INSTALLED = true;
- static final boolean ENABLE_VOICE_BUTTON = true;
-
- private static final String PREF_VIBRATE_ON = "vibrate_on";
- private static final String PREF_SOUND_ON = "sound_on";
- private static final String PREF_POPUP_ON = "popup_on";
- private static final String PREF_AUTO_CAP = "auto_cap";
- private static final String PREF_QUICK_FIXES = "quick_fixes";
- private static final String PREF_SHOW_SUGGESTIONS = "show_suggestions";
- private static final String PREF_AUTO_COMPLETE = "auto_complete";
- //private static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion";
- private static final String PREF_VOICE_MODE = "voice_mode";
-
- // Whether or not the user has used voice input before (and thus, whether to show the
- // first-run warning dialog or not).
- private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input";
-
- // Whether or not the user has used voice input from an unsupported locale UI before.
- // For example, the user has a Chinese UI but activates voice input.
- private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE =
- "has_used_voice_input_unsupported_locale";
-
- // A list of locales which are supported by default for voice input, unless we get a
- // different list from Gservices.
- public static final String DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES =
- "en " +
- "en_US " +
- "en_GB " +
- "en_AU " +
- "en_CA " +
- "en_IE " +
- "en_IN " +
- "en_NZ " +
- "en_SG " +
- "en_ZA ";
-
- // The private IME option used to indicate that no microphone should be shown for a
- // given text field. For instance this is specified by the search dialog when the
- // dialog is already showing a voice search button.
- private static final String IME_OPTION_NO_MICROPHONE = "nm";
-
- public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
- public static final String PREF_INPUT_LANGUAGE = "input_language";
- private static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled";
-
- private static final int MSG_UPDATE_SUGGESTIONS = 0;
- private static final int MSG_START_TUTORIAL = 1;
- private static final int MSG_UPDATE_SHIFT_STATE = 2;
- private static final int MSG_VOICE_RESULTS = 3;
- private static final int MSG_UPDATE_OLD_SUGGESTIONS = 4;
+ private static final boolean TRACE = false;
+ private static boolean DEBUG = LatinImeLogger.sDBG;
+
+ private static final int DELAY_UPDATE_SUGGESTIONS = 180;
+ private static final int DELAY_UPDATE_OLD_SUGGESTIONS = 300;
+ private static final int DELAY_UPDATE_SHIFT_STATE = 300;
+ private static final int EXTENDED_TOUCHABLE_REGION_HEIGHT = 100;
// How many continuous deletes at which to start deleting at a higher speed.
private static final int DELETE_ACCELERATE_AT = 20;
// Key events coming any faster than this are long-presses.
private static final int QUICK_PRESS = 200;
- static final int KEYCODE_ENTER = '\n';
- static final int KEYCODE_SPACE = ' ';
- static final int KEYCODE_PERIOD = '.';
-
- // Contextual menu positions
- private static final int POS_METHOD = 0;
- private static final int POS_SETTINGS = 1;
+ private int mSuggestionVisibility;
+ private static final int SUGGESTION_VISIBILILTY_SHOW_VALUE
+ = R.string.prefs_suggestion_visibility_show_value;
+ private static final int SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE
+ = R.string.prefs_suggestion_visibility_show_only_portrait_value;
+ private static final int SUGGESTION_VISIBILILTY_HIDE_VALUE
+ = R.string.prefs_suggestion_visibility_hide_value;
+
+ private static final int[] SUGGESTION_VISIBILITY_VALUE_ARRAY = new int[] {
+ SUGGESTION_VISIBILILTY_SHOW_VALUE,
+ SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE,
+ SUGGESTION_VISIBILILTY_HIDE_VALUE
+ };
- //private LatinKeyboardView mInputView;
- private LinearLayout mCandidateViewContainer;
+ private View mCandidateViewContainer;
private CandidateView mCandidateView;
private Suggest mSuggest;
- private CompletionInfo[] mCompletions;
+ private CompletionInfo[] mApplicationSpecifiedCompletions;
private AlertDialog mOptionsDialog;
- private AlertDialog mVoiceWarningDialog;
- /* package */ KeyboardSwitcher mKeyboardSwitcher;
+ private InputMethodManager mImm;
+ private Resources mResources;
+ private SharedPreferences mPrefs;
+ private String mInputMethodId;
+ private KeyboardSwitcher mKeyboardSwitcher;
+ private SubtypeSwitcher mSubtypeSwitcher;
+ private VoiceIMEConnector mVoiceConnector;
private UserDictionary mUserDictionary;
private UserBigramDictionary mUserBigramDictionary;
private ContactsDictionary mContactsDictionary;
private AutoDictionary mAutoDictionary;
- private Hints mHints;
-
- private Resources mResources;
-
- private String mInputLocale;
- private String mSystemLocale;
- private LanguageSwitcher mLanguageSwitcher;
+ // These variables are initialized according to the {@link EditorInfo#inputType}.
+ private boolean mAutoSpace;
+ private boolean mInputTypeNoAutoCorrect;
+ private boolean mIsSettingsSuggestionStripOn;
+ private boolean mApplicationSpecifiedCompletionOn;
- private StringBuilder mComposing = new StringBuilder();
+ private final StringBuilder mComposing = new StringBuilder();
private WordComposer mWord = new WordComposer();
- private int mCommittedLength;
- private boolean mPredicting;
- private boolean mRecognizing;
- private boolean mAfterVoiceInput;
- private boolean mImmediatelyAfterVoiceInput;
- private boolean mShowingVoiceSuggestions;
- private boolean mVoiceInputHighlighted;
- private boolean mEnableVoiceButton;
private CharSequence mBestWord;
- private boolean mPredictionOn;
- private boolean mCompletionOn;
+ private boolean mHasValidSuggestions;
private boolean mHasDictionary;
- private boolean mAutoSpace;
private boolean mJustAddedAutoSpace;
private boolean mAutoCorrectEnabled;
private boolean mReCorrectionEnabled;
- // Bigram Suggestion is disabled in this version.
- private final boolean mBigramSuggestionEnabled = false;
+ private boolean mBigramSuggestionEnabled;
private boolean mAutoCorrectOn;
- // TODO move this state variable outside LatinIME
- private boolean mCapsLock;
- private boolean mPasswordText;
private boolean mVibrateOn;
private boolean mSoundOn;
private boolean mPopupOn;
private boolean mAutoCap;
private boolean mQuickFixes;
- private boolean mHasUsedVoiceInput;
- private boolean mHasUsedVoiceInputUnsupportedLocale;
- private boolean mLocaleSupportedForVoiceInput;
- private boolean mShowSuggestions;
- private boolean mIsShowingHint;
- private int mCorrectionMode;
- private boolean mEnableVoice = true;
- private boolean mVoiceOnPrimary;
- private int mOrientation;
- private List<CharSequence> mSuggestPuncList;
- // Keep track of the last selection range to decide if we need to show word alternatives
- private int mLastSelectionStart;
- private int mLastSelectionEnd;
+ private boolean mConfigEnableShowSubtypeSettings;
+ private boolean mConfigSwipeDownDismissKeyboardEnabled;
+ private int mConfigDelayBeforeFadeoutLanguageOnSpacebar;
+ private int mConfigDurationOfFadeoutLanguageOnSpacebar;
+ private float mConfigFinalFadeoutFactorOfLanguageOnSpacebar;
- // Input type is such that we should not auto-correct
- private boolean mInputTypeNoAutoCorrect;
+ private int mCorrectionMode;
+ private int mCommittedLength;
+ private int mOrientation;
+ // Keep track of the last selection range to decide if we need to show word alternatives
+ private int mLastSelectionStart;
+ private int mLastSelectionEnd;
+ private SuggestedWords mSuggestPuncList;
// Indicates whether the suggestion strip is to be on in landscape
private boolean mJustAccepted;
- private CharSequence mJustRevertedSeparator;
+ private boolean mJustReverted;
private int mDeleteCount;
private long mLastKeyTime;
- // Modifier keys state
- private ModifierKeyState mShiftKeyState = new ModifierKeyState();
- private ModifierKeyState mSymbolKeyState = new ModifierKeyState();
-
- private Tutorial mTutorial;
-
private AudioManager mAudioManager;
// Align sound effect volume on music volume
- private final float FX_VOLUME = -1.0f;
+ private static final float FX_VOLUME = -1.0f;
private boolean mSilentMode;
/* package */ String mWordSeparators;
private String mSentenceSeparators;
private String mSuggestPuncs;
- private VoiceInput mVoiceInput;
- private VoiceResults mVoiceResults = new VoiceResults();
+ // TODO: Move this flag to VoiceIMEConnector
private boolean mConfigurationChanging;
// Keeps track of most recently inserted text (multi-character key) for reverting
private CharSequence mEnteredText;
private boolean mRefreshKeyboardRequired;
- // For each word, a list of potential replacements, usually from voice.
- private Map<String, List<CharSequence>> mWordToSuggestions =
- new HashMap<String, List<CharSequence>>();
-
- private ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>();
-
- private class VoiceResults {
- List<String> candidates;
- Map<String, List<CharSequence>> alternatives;
- }
+ private final ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>();
public abstract static class WordAlternatives {
protected CharSequence mChosenWord;
@@ -281,7 +212,7 @@ public class LatinIME extends InputMethodService
return mChosenWord;
}
- public abstract List<CharSequence> getAlternatives();
+ public abstract SuggestedWords.Builder getAlternatives();
}
public class TypedWordAlternatives extends WordAlternatives {
@@ -302,192 +233,224 @@ public class LatinIME extends InputMethodService
}
@Override
- public List<CharSequence> getAlternatives() {
+ public SuggestedWords.Builder getAlternatives() {
return getTypedSuggestions(word);
}
}
- /* package */ Handler mHandler = new Handler() {
+ public final UIHandler mHandler = new UIHandler();
+
+ public class UIHandler extends Handler {
+ private static final int MSG_UPDATE_SUGGESTIONS = 0;
+ private static final int MSG_UPDATE_OLD_SUGGESTIONS = 1;
+ private static final int MSG_UPDATE_SHIFT_STATE = 2;
+ private static final int MSG_VOICE_RESULTS = 3;
+ private static final int MSG_FADEOUT_LANGUAGE_ON_SPACEBAR = 4;
+ private static final int MSG_DISMISS_LANGUAGE_ON_SPACEBAR = 5;
+
@Override
public void handleMessage(Message msg) {
+ final KeyboardSwitcher switcher = mKeyboardSwitcher;
+ final LatinKeyboardView inputView = switcher.getInputView();
switch (msg.what) {
- case MSG_UPDATE_SUGGESTIONS:
- updateSuggestions();
- break;
- case MSG_UPDATE_OLD_SUGGESTIONS:
- setOldSuggestions();
- break;
- case MSG_START_TUTORIAL:
- if (mTutorial == null) {
- if (mKeyboardSwitcher.getInputView().isShown()) {
- mTutorial = new Tutorial(
- LatinIME.this, mKeyboardSwitcher.getInputView());
- mTutorial.start();
- } else {
- // Try again soon if the view is not yet showing
- sendMessageDelayed(obtainMessage(MSG_START_TUTORIAL), 100);
- }
- }
- break;
- case MSG_UPDATE_SHIFT_STATE:
- updateShiftKeyState(getCurrentInputEditorInfo());
- break;
- case MSG_VOICE_RESULTS:
- handleVoiceResults();
- break;
+ case MSG_UPDATE_SUGGESTIONS:
+ updateSuggestions();
+ break;
+ case MSG_UPDATE_OLD_SUGGESTIONS:
+ setOldSuggestions();
+ break;
+ case MSG_UPDATE_SHIFT_STATE:
+ switcher.updateShiftState();
+ break;
+ case MSG_VOICE_RESULTS:
+ mVoiceConnector.handleVoiceResults(preferCapitalization()
+ || (switcher.isAlphabetMode() && switcher.isShiftedOrShiftLocked()));
+ break;
+ case MSG_FADEOUT_LANGUAGE_ON_SPACEBAR:
+ if (inputView != null)
+ inputView.setSpacebarTextFadeFactor(
+ (1.0f + mConfigFinalFadeoutFactorOfLanguageOnSpacebar) / 2,
+ (LatinKeyboard)msg.obj);
+ sendMessageDelayed(obtainMessage(MSG_DISMISS_LANGUAGE_ON_SPACEBAR, msg.obj),
+ mConfigDurationOfFadeoutLanguageOnSpacebar);
+ break;
+ case MSG_DISMISS_LANGUAGE_ON_SPACEBAR:
+ if (inputView != null)
+ inputView.setSpacebarTextFadeFactor(
+ mConfigFinalFadeoutFactorOfLanguageOnSpacebar, (LatinKeyboard)msg.obj);
+ break;
}
}
- };
+
+ public void postUpdateSuggestions() {
+ removeMessages(MSG_UPDATE_SUGGESTIONS);
+ sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTIONS), DELAY_UPDATE_SUGGESTIONS);
+ }
+
+ public void cancelUpdateSuggestions() {
+ removeMessages(MSG_UPDATE_SUGGESTIONS);
+ }
+
+ public boolean hasPendingUpdateSuggestions() {
+ return hasMessages(MSG_UPDATE_SUGGESTIONS);
+ }
+
+ public void postUpdateOldSuggestions() {
+ removeMessages(MSG_UPDATE_OLD_SUGGESTIONS);
+ sendMessageDelayed(obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS),
+ DELAY_UPDATE_OLD_SUGGESTIONS);
+ }
+
+ public void cancelUpdateOldSuggestions() {
+ removeMessages(MSG_UPDATE_OLD_SUGGESTIONS);
+ }
+
+ public void postUpdateShiftKeyState() {
+ removeMessages(MSG_UPDATE_SHIFT_STATE);
+ sendMessageDelayed(obtainMessage(MSG_UPDATE_SHIFT_STATE), DELAY_UPDATE_SHIFT_STATE);
+ }
+
+ public void cancelUpdateShiftState() {
+ removeMessages(MSG_UPDATE_SHIFT_STATE);
+ }
+
+ public void updateVoiceResults() {
+ sendMessage(obtainMessage(MSG_VOICE_RESULTS));
+ }
+
+ public void startDisplayLanguageOnSpacebar(boolean localeChanged) {
+ removeMessages(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR);
+ removeMessages(MSG_DISMISS_LANGUAGE_ON_SPACEBAR);
+ final LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+ if (inputView != null) {
+ final LatinKeyboard keyboard = inputView.getLatinKeyboard();
+ // The language is never displayed when the delay is zero.
+ if (mConfigDelayBeforeFadeoutLanguageOnSpacebar != 0)
+ inputView.setSpacebarTextFadeFactor(localeChanged ? 1.0f
+ : mConfigFinalFadeoutFactorOfLanguageOnSpacebar, keyboard);
+ // The language is always displayed when the delay is negative.
+ if (localeChanged && mConfigDelayBeforeFadeoutLanguageOnSpacebar > 0) {
+ sendMessageDelayed(obtainMessage(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR, keyboard),
+ mConfigDelayBeforeFadeoutLanguageOnSpacebar);
+ }
+ }
+ }
+ }
@Override
public void onCreate() {
- LatinImeLogger.init(this);
- KeyboardSwitcher.init(this);
- super.onCreate();
- //setStatusIcon(R.drawable.ime_qwerty);
- mResources = getResources();
- final Configuration conf = mResources.getConfiguration();
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- mLanguageSwitcher = new LanguageSwitcher(this);
- mLanguageSwitcher.loadLocales(prefs);
+ mPrefs = prefs;
+ LatinImeLogger.init(this, prefs);
+ SubtypeSwitcher.init(this, prefs);
+ KeyboardSwitcher.init(this, prefs);
+
+ super.onCreate();
+
+ mImm = ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE));
+ mInputMethodId = Utils.getInputMethodId(mImm, getApplicationInfo().packageName);
+ mSubtypeSwitcher = SubtypeSwitcher.getInstance();
mKeyboardSwitcher = KeyboardSwitcher.getInstance();
- mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher);
- mSystemLocale = conf.locale.toString();
- mLanguageSwitcher.setSystemLocale(conf.locale);
- String inputLanguage = mLanguageSwitcher.getInputLanguage();
- if (inputLanguage == null) {
- inputLanguage = conf.locale.toString();
+
+ final Resources res = getResources();
+ mResources = res;
+
+ // If the option should not be shown, do not read the recorrection preference
+ // but always use the default setting defined in the resources.
+ if (res.getBoolean(R.bool.config_enable_show_recorrection_option)) {
+ mReCorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED,
+ res.getBoolean(R.bool.default_recorrection_enabled));
+ } else {
+ mReCorrectionEnabled = res.getBoolean(R.bool.default_recorrection_enabled);
}
- mReCorrectionEnabled = prefs.getBoolean(PREF_RECORRECTION_ENABLED,
- getResources().getBoolean(R.bool.default_recorrection_enabled));
- LatinIMEUtil.GCUtils.getInstance().reset();
+ mConfigEnableShowSubtypeSettings = res.getBoolean(
+ R.bool.config_enable_show_subtype_settings);
+ mConfigSwipeDownDismissKeyboardEnabled = res.getBoolean(
+ R.bool.config_swipe_down_dismiss_keyboard_enabled);
+ mConfigDelayBeforeFadeoutLanguageOnSpacebar = res.getInteger(
+ R.integer.config_delay_before_fadeout_language_on_spacebar);
+ mConfigDurationOfFadeoutLanguageOnSpacebar = res.getInteger(
+ R.integer.config_duration_of_fadeout_language_on_spacebar);
+ mConfigFinalFadeoutFactorOfLanguageOnSpacebar = res.getInteger(
+ R.integer.config_final_fadeout_percentage_of_language_on_spacebar) / 100.0f;
+
+ Utils.GCUtils.getInstance().reset();
boolean tryGC = true;
- for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
+ for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
try {
- initSuggest(inputLanguage);
+ initSuggest();
tryGC = false;
} catch (OutOfMemoryError e) {
- tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait(inputLanguage, e);
+ tryGC = Utils.GCUtils.getInstance().tryGCOrWait("InitSuggest", e);
}
}
- mOrientation = conf.orientation;
+ mOrientation = res.getConfiguration().orientation;
initSuggestPuncList();
- // register to receive ringer mode changes for silent mode
- IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
+ // register to receive ringer mode change and network state change.
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
+ filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mReceiver, filter);
- if (VOICE_INSTALLED) {
- mVoiceInput = new VoiceInput(this, this);
- mHints = new Hints(this, new Hints.Display() {
- public void showHint(int viewResource) {
- LayoutInflater inflater = (LayoutInflater) getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- View view = inflater.inflate(viewResource, null);
- setCandidatesView(view);
- setCandidatesViewShown(true);
- mIsShowingHint = true;
- }
- });
- }
+ mVoiceConnector = VoiceIMEConnector.init(this, prefs, mHandler);
prefs.registerOnSharedPreferenceChangeListener(this);
}
/**
- * Loads a dictionary or multiple separated dictionary
- * @return returns array of dictionary resource ids
+ * Returns a main dictionary resource id
+ * @return main dictionary resource id
*/
- /* package */ static int[] getDictionary(Resources res) {
+ public static int getMainDictionaryResourceId(Resources res) {
+ final String MAIN_DIC_NAME = "main";
String packageName = LatinIME.class.getPackage().getName();
- XmlResourceParser xrp = res.getXml(R.xml.dictionary);
- ArrayList<Integer> dictionaries = new ArrayList<Integer>();
-
- try {
- int current = xrp.getEventType();
- while (current != XmlResourceParser.END_DOCUMENT) {
- if (current == XmlResourceParser.START_TAG) {
- String tag = xrp.getName();
- if (tag != null) {
- if (tag.equals("part")) {
- String dictFileName = xrp.getAttributeValue(null, "name");
- dictionaries.add(res.getIdentifier(dictFileName, "raw", packageName));
- }
- }
- }
- xrp.next();
- current = xrp.getEventType();
- }
- } catch (XmlPullParserException e) {
- Log.e(TAG, "Dictionary XML parsing failure");
- } catch (IOException e) {
- Log.e(TAG, "Dictionary XML IOException");
- }
-
- int count = dictionaries.size();
- int[] dict = new int[count];
- for (int i = 0; i < count; i++) {
- dict[i] = dictionaries.get(i);
- }
-
- return dict;
+ return res.getIdentifier(MAIN_DIC_NAME, "raw", packageName);
}
- private void initSuggest(String locale) {
- mInputLocale = locale;
+ private void initSuggest() {
+ updateAutoTextEnabled();
+ String locale = mSubtypeSwitcher.getInputLocaleStr();
- Resources orig = getResources();
- Configuration conf = orig.getConfiguration();
- Locale saveLocale = conf.locale;
- conf.locale = new Locale(locale);
- orig.updateConfiguration(conf, orig.getDisplayMetrics());
+ Locale savedLocale = mSubtypeSwitcher.changeSystemLocale(new Locale(locale));
if (mSuggest != null) {
mSuggest.close();
}
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
- mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true);
+ final SharedPreferences prefs = mPrefs;
+ mQuickFixes = isQuickFixesEnabled(prefs);
- int[] dictionaries = getDictionary(orig);
- mSuggest = new Suggest(this, dictionaries);
- updateAutoTextEnabled(saveLocale);
- if (mUserDictionary != null) mUserDictionary.close();
- mUserDictionary = new UserDictionary(this, mInputLocale);
- if (mContactsDictionary == null) {
- mContactsDictionary = new ContactsDictionary(this, Suggest.DIC_CONTACTS);
- }
- if (mAutoDictionary != null) {
- mAutoDictionary.close();
- }
- mAutoDictionary = new AutoDictionary(this, this, mInputLocale, Suggest.DIC_AUTO);
- if (mUserBigramDictionary != null) {
- mUserBigramDictionary.close();
- }
- mUserBigramDictionary = new UserBigramDictionary(this, this, mInputLocale,
- Suggest.DIC_USER);
- mSuggest.setUserBigramDictionary(mUserBigramDictionary);
+ final Resources res = mResources;
+ int mainDicResId = getMainDictionaryResourceId(res);
+ mSuggest = new Suggest(this, mainDicResId);
+ loadAndSetAutoCorrectionThreshold(prefs);
+
+ mUserDictionary = new UserDictionary(this, locale);
mSuggest.setUserDictionary(mUserDictionary);
+
+ mContactsDictionary = new ContactsDictionary(this, Suggest.DIC_CONTACTS);
mSuggest.setContactsDictionary(mContactsDictionary);
+
+ mAutoDictionary = new AutoDictionary(this, this, locale, Suggest.DIC_AUTO);
mSuggest.setAutoDictionary(mAutoDictionary);
+
+ mUserBigramDictionary = new UserBigramDictionary(this, this, locale, Suggest.DIC_USER);
+ mSuggest.setUserBigramDictionary(mUserBigramDictionary);
+
updateCorrectionMode();
- mWordSeparators = mResources.getString(R.string.word_separators);
- mSentenceSeparators = mResources.getString(R.string.sentence_separators);
+ mWordSeparators = res.getString(R.string.word_separators);
+ mSentenceSeparators = res.getString(R.string.sentence_separators);
- conf.locale = saveLocale;
- orig.updateConfiguration(conf, orig.getDisplayMetrics());
+ mSubtypeSwitcher.changeSystemLocale(savedLocale);
}
@Override
public void onDestroy() {
- if (mUserDictionary != null) {
- mUserDictionary.close();
- }
- if (mContactsDictionary != null) {
- mContactsDictionary.close();
+ if (mSuggest != null) {
+ mSuggest.close();
+ mSuggest = null;
}
unregisterReceiver(mReceiver);
- if (VOICE_INSTALLED && mVoiceInput != null) {
- mVoiceInput.destroy();
- }
+ mVoiceConnector.destroy();
LatinImeLogger.commit();
LatinImeLogger.onDestroy();
super.onDestroy();
@@ -495,203 +458,205 @@ public class LatinIME extends InputMethodService
@Override
public void onConfigurationChanged(Configuration conf) {
- // If the system locale changes and is different from the saved
- // locale (mSystemLocale), then reload the input locale list from the
- // latin ime settings (shared prefs) and reset the input locale
- // to the first one.
- final String systemLocale = conf.locale.toString();
- if (!TextUtils.equals(systemLocale, mSystemLocale)) {
- mSystemLocale = systemLocale;
- if (mLanguageSwitcher != null) {
- mLanguageSwitcher.loadLocales(
- PreferenceManager.getDefaultSharedPreferences(this));
- mLanguageSwitcher.setSystemLocale(conf.locale);
- toggleLanguage(true, true);
- } else {
- reloadKeyboards();
- }
- }
+ mSubtypeSwitcher.onConfigurationChanged(conf);
// If orientation changed while predicting, commit the change
if (conf.orientation != mOrientation) {
InputConnection ic = getCurrentInputConnection();
commitTyped(ic);
if (ic != null) ic.finishComposingText(); // For voice input
mOrientation = conf.orientation;
- reloadKeyboards();
+ if (isShowingOptionDialog())
+ mOptionsDialog.dismiss();
}
+
mConfigurationChanging = true;
super.onConfigurationChanged(conf);
- if (mRecognizing) {
- switchToRecognitionStatusView();
- }
+ mVoiceConnector.onConfigurationChanged(conf);
mConfigurationChanging = false;
}
@Override
public View onCreateInputView() {
- mKeyboardSwitcher.recreateInputView();
- mKeyboardSwitcher.makeKeyboards(true);
- mKeyboardSwitcher.setKeyboardMode(
- KeyboardSwitcher.MODE_TEXT, 0,
- shouldShowVoiceButton(makeFieldContext(), getCurrentInputEditorInfo()));
- return mKeyboardSwitcher.getInputView();
+ return mKeyboardSwitcher.onCreateInputView();
}
@Override
public View onCreateCandidatesView() {
- mKeyboardSwitcher.makeKeyboards(true);
- mCandidateViewContainer = (LinearLayout) getLayoutInflater().inflate(
- R.layout.candidates, null);
- mCandidateView = (CandidateView) mCandidateViewContainer.findViewById(R.id.candidates);
+ LayoutInflater inflater = getLayoutInflater();
+ LinearLayout container = (LinearLayout)inflater.inflate(R.layout.candidates, null);
+ mCandidateViewContainer = container;
+ if (container.getPaddingRight() != 0) {
+ HorizontalScrollView scrollView =
+ (HorizontalScrollView) container.findViewById(R.id.candidates_scroll_view);
+ scrollView.setOverScrollMode(View.OVER_SCROLL_NEVER);
+ container.setGravity(Gravity.CENTER_HORIZONTAL);
+ }
+ mCandidateView = (CandidateView) container.findViewById(R.id.candidates);
mCandidateView.setService(this);
setCandidatesViewShown(true);
- return mCandidateViewContainer;
+ return container;
+ }
+
+ private static boolean isPasswordVariation(int variation) {
+ return variation == InputType.TYPE_TEXT_VARIATION_PASSWORD
+ || variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+ || variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD;
+ }
+
+ private static boolean isEmailVariation(int variation) {
+ return variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
+ || variation == InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS;
}
@Override
public void onStartInputView(EditorInfo attribute, boolean restarting) {
- LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+ final KeyboardSwitcher switcher = mKeyboardSwitcher;
+ LatinKeyboardView inputView = switcher.getInputView();
+
+ if(DEBUG) {
+ Log.d(TAG, "onStartInputView: " + inputView);
+ }
// In landscape mode, this method gets called without the input view being created.
if (inputView == null) {
return;
}
+ mSubtypeSwitcher.updateParametersOnStartInputView();
+
if (mRefreshKeyboardRequired) {
mRefreshKeyboardRequired = false;
- toggleLanguage(true, true);
+ onRefreshKeyboard();
}
- mKeyboardSwitcher.makeKeyboards(false);
-
TextEntryState.newSession(this);
- // Most such things we decide below in the switch statement, but we need to know
- // now whether this is a password text field, because we need to know now (before
- // the switch statement) whether we want to enable the voice button.
- mPasswordText = false;
- int variation = attribute.inputType & EditorInfo.TYPE_MASK_VARIATION;
- if (variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD ||
- variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
- mPasswordText = true;
- }
+ // Most such things we decide below in initializeInputAttributesAndGetMode, but we need to
+ // know now whether this is a password text field, because we need to know now whether we
+ // want to enable the voice button.
+ mVoiceConnector.resetVoiceStates(isPasswordVariation(
+ attribute.inputType & InputType.TYPE_MASK_VARIATION));
- mEnableVoiceButton = shouldShowVoiceButton(makeFieldContext(), attribute);
- final boolean enableVoiceButton = mEnableVoiceButton && mEnableVoice;
+ final int mode = initializeInputAttributesAndGetMode(attribute.inputType);
- mAfterVoiceInput = false;
- mImmediatelyAfterVoiceInput = false;
- mShowingVoiceSuggestions = false;
- mVoiceInputHighlighted = false;
- mInputTypeNoAutoCorrect = false;
- mPredictionOn = false;
- mCompletionOn = false;
- mCompletions = null;
- mCapsLock = false;
+ inputView.closing();
mEnteredText = null;
+ mComposing.setLength(0);
+ mHasValidSuggestions = false;
+ mDeleteCount = 0;
+ mJustAddedAutoSpace = false;
+
+ loadSettings(attribute);
+ if (mSubtypeSwitcher.isKeyboardMode()) {
+ switcher.loadKeyboard(mode, attribute.imeOptions,
+ mVoiceConnector.isVoiceButtonEnabled(),
+ mVoiceConnector.isVoiceButtonOnPrimary());
+ switcher.updateShiftState();
+ }
+
+ setCandidatesViewShownInternal(isCandidateStripVisible(),
+ false /* needsInputViewShown */ );
+ // Delay updating suggestions because keyboard input view may not be shown at this point.
+ mHandler.postUpdateSuggestions();
+
+ updateCorrectionMode();
+
+ inputView.setPreviewEnabled(mPopupOn);
+ inputView.setProximityCorrectionEnabled(true);
+ // If we just entered a text field, maybe it has some old text that requires correction
+ checkReCorrectionOnStart();
+ inputView.setForeground(true);
- switch (attribute.inputType & EditorInfo.TYPE_MASK_CLASS) {
- case EditorInfo.TYPE_CLASS_NUMBER:
- case EditorInfo.TYPE_CLASS_DATETIME:
- // fall through
- // NOTE: For now, we use the phone keyboard for NUMBER and DATETIME until we get
- // a dedicated number entry keypad.
- // TODO: Use a dedicated number entry keypad here when we get one.
- case EditorInfo.TYPE_CLASS_PHONE:
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_PHONE,
- attribute.imeOptions, enableVoiceButton);
+ mVoiceConnector.onStartInputView(inputView.getWindowToken());
+
+ if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
+ }
+
+ private int initializeInputAttributesAndGetMode(int inputType) {
+ final int variation = inputType & InputType.TYPE_MASK_VARIATION;
+ mAutoSpace = false;
+ mInputTypeNoAutoCorrect = false;
+ mIsSettingsSuggestionStripOn = false;
+ mApplicationSpecifiedCompletionOn = false;
+ mApplicationSpecifiedCompletions = null;
+
+ final int mode;
+ switch (inputType & InputType.TYPE_MASK_CLASS) {
+ case InputType.TYPE_CLASS_NUMBER:
+ case InputType.TYPE_CLASS_DATETIME:
+ mode = KeyboardId.MODE_NUMBER;
+ break;
+ case InputType.TYPE_CLASS_PHONE:
+ mode = KeyboardId.MODE_PHONE;
break;
- case EditorInfo.TYPE_CLASS_TEXT:
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT,
- attribute.imeOptions, enableVoiceButton);
- //startPrediction();
- mPredictionOn = true;
+ case InputType.TYPE_CLASS_TEXT:
+ mIsSettingsSuggestionStripOn = true;
// Make sure that passwords are not displayed in candidate view
- if (variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD ||
- variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ) {
- mPredictionOn = false;
+ if (isPasswordVariation(variation)) {
+ mIsSettingsSuggestionStripOn = false;
}
- if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
- || variation == EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME) {
+ if (isEmailVariation(variation)
+ || variation == InputType.TYPE_TEXT_VARIATION_PERSON_NAME) {
mAutoSpace = false;
} else {
mAutoSpace = true;
}
- if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS) {
- mPredictionOn = false;
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_EMAIL,
- attribute.imeOptions, enableVoiceButton);
- } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_URI) {
- mPredictionOn = false;
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_URL,
- attribute.imeOptions, enableVoiceButton);
- } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE) {
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_IM,
- attribute.imeOptions, enableVoiceButton);
- } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_FILTER) {
- mPredictionOn = false;
- } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) {
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_WEB,
- attribute.imeOptions, enableVoiceButton);
+ if (isEmailVariation(variation)) {
+ mIsSettingsSuggestionStripOn = false;
+ mode = KeyboardId.MODE_EMAIL;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_URI) {
+ mIsSettingsSuggestionStripOn = false;
+ mode = KeyboardId.MODE_URL;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE) {
+ mode = KeyboardId.MODE_IM;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
+ mIsSettingsSuggestionStripOn = false;
+ mode = KeyboardId.MODE_TEXT;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) {
+ mode = KeyboardId.MODE_WEB;
// If it's a browser edit field and auto correct is not ON explicitly, then
// disable auto correction, but keep suggestions on.
- if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) {
+ if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) {
mInputTypeNoAutoCorrect = true;
}
+ } else {
+ mode = KeyboardId.MODE_TEXT;
}
// If NO_SUGGESTIONS is set, don't do prediction.
- if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) {
- mPredictionOn = false;
+ if ((inputType & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) {
+ mIsSettingsSuggestionStripOn = false;
mInputTypeNoAutoCorrect = true;
}
// If it's not multiline and the autoCorrect flag is not set, then don't correct
- if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0 &&
- (attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) == 0) {
+ if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0 &&
+ (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE) == 0) {
mInputTypeNoAutoCorrect = true;
}
- if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) {
- mPredictionOn = false;
- mCompletionOn = isFullscreenMode();
+ if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) {
+ mIsSettingsSuggestionStripOn = false;
+ mApplicationSpecifiedCompletionOn = isFullscreenMode();
}
break;
default:
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT,
- attribute.imeOptions, enableVoiceButton);
+ mode = KeyboardId.MODE_TEXT;
+ break;
}
- inputView.closing();
- mComposing.setLength(0);
- mPredicting = false;
- mDeleteCount = 0;
- mJustAddedAutoSpace = false;
- loadSettings();
- updateShiftKeyState(attribute);
-
- setCandidatesViewShownInternal(isCandidateStripVisible() || mCompletionOn,
- false /* needsInputViewShown */ );
- updateSuggestions();
-
- // If the dictionary is not big enough, don't auto correct
- mHasDictionary = mSuggest.hasMainDictionary();
-
- updateCorrectionMode();
-
- inputView.setPreviewEnabled(mPopupOn);
- inputView.setProximityCorrectionEnabled(true);
- mPredictionOn = mPredictionOn && (mCorrectionMode > 0 || mShowSuggestions);
- // If we just entered a text field, maybe it has some old text that requires correction
- checkReCorrectionOnStart();
- checkTutorial(attribute.privateImeOptions);
- if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
+ return mode;
}
private void checkReCorrectionOnStart() {
- if (mReCorrectionEnabled && isPredictionOn()) {
+ if (!mReCorrectionEnabled) return;
+
+ final InputConnection ic = getCurrentInputConnection();
+ if (ic == null) return;
+ // There could be a pending composing span. Clean it up first.
+ ic.finishComposingText();
+
+ if (isShowingSuggestionsStrip() && isSuggestionsRequested()) {
// First get the cursor position. This is required by setOldSuggestions(), so that
// it can pass the correct range to setComposingRegion(). At this point, we don't
- // have valid values for mLastSelectionStart/Stop because onUpdateSelection() has
+ // have valid values for mLastSelectionStart/End because onUpdateSelection() has
// not been called yet.
- InputConnection ic = getCurrentInputConnection();
- if (ic == null) return;
ExtractedTextRequest etr = new ExtractedTextRequest();
etr.token = 0; // anything is fine here
ExtractedText et = ic.getExtractedText(etr, 0);
@@ -702,7 +667,7 @@ public class LatinIME extends InputMethodService
// Then look for possible corrections in a delayed fashion
if (!TextUtils.isEmpty(et.text) && isCursorTouchingWord()) {
- postUpdateOldSuggestions();
+ mHandler.postUpdateOldSuggestions();
}
}
}
@@ -712,19 +677,12 @@ public class LatinIME extends InputMethodService
super.onFinishInput();
LatinImeLogger.commit();
- onAutoCompletionStateChanged(false);
+ mKeyboardSwitcher.onAutoCorrectionStateChanged(false);
- if (VOICE_INSTALLED && !mConfigurationChanging) {
- if (mAfterVoiceInput) {
- mVoiceInput.flushAllTextModificationCounters();
- mVoiceInput.logInputEnded();
- }
- mVoiceInput.flushLogs();
- mVoiceInput.cancel();
- }
- if (mKeyboardSwitcher.getInputView() != null) {
- mKeyboardSwitcher.getInputView().closing();
- }
+ mVoiceConnector.flushVoiceInputLogs(mConfigurationChanging);
+
+ KeyboardView inputView = mKeyboardSwitcher.getInputView();
+ if (inputView != null) inputView.closing();
if (mAutoDictionary != null) mAutoDictionary.flushPendingWrites();
if (mUserBigramDictionary != null) mUserBigramDictionary.flushPendingWrites();
}
@@ -732,21 +690,17 @@ public class LatinIME extends InputMethodService
@Override
public void onFinishInputView(boolean finishingInput) {
super.onFinishInputView(finishingInput);
- // Remove penging messages related to update suggestions
- mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS);
- mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS);
+ KeyboardView inputView = mKeyboardSwitcher.getInputView();
+ if (inputView != null) inputView.setForeground(false);
+ // Remove pending messages related to update suggestions
+ mHandler.cancelUpdateSuggestions();
+ mHandler.cancelUpdateOldSuggestions();
}
@Override
public void onUpdateExtractedText(int token, ExtractedText text) {
super.onUpdateExtractedText(token, text);
- InputConnection ic = getCurrentInputConnection();
- if (!mImmediatelyAfterVoiceInput && mAfterVoiceInput && ic != null) {
- if (mHints.showPunctuationHintIfNecessary(ic)) {
- mVoiceInput.logPunctuationHintDisplayed();
- }
- }
- mImmediatelyAfterVoiceInput = false;
+ mVoiceConnector.showPunctuationHintIfNecessary();
}
@Override
@@ -765,64 +719,58 @@ public class LatinIME extends InputMethodService
+ ", ce=" + candidatesEnd);
}
- if (mAfterVoiceInput) {
- mVoiceInput.setCursorPos(newSelEnd);
- mVoiceInput.setSelectionSpan(newSelEnd - newSelStart);
- }
+ mVoiceConnector.setCursorAndSelection(newSelEnd, newSelStart);
// If the current selection in the text view changes, we should
// clear whatever candidate text we have.
- if ((((mComposing.length() > 0 && mPredicting) || mVoiceInputHighlighted)
- && (newSelStart != candidatesEnd
- || newSelEnd != candidatesEnd)
- && mLastSelectionStart != newSelStart)) {
+ if ((((mComposing.length() > 0 && mHasValidSuggestions)
+ || mVoiceConnector.isVoiceInputHighlighted()) && (newSelStart != candidatesEnd
+ || newSelEnd != candidatesEnd) && mLastSelectionStart != newSelStart)) {
mComposing.setLength(0);
- mPredicting = false;
- postUpdateSuggestions();
+ mHasValidSuggestions = false;
+ mHandler.postUpdateSuggestions();
TextEntryState.reset();
InputConnection ic = getCurrentInputConnection();
if (ic != null) {
ic.finishComposingText();
}
- mVoiceInputHighlighted = false;
- } else if (!mPredicting && !mJustAccepted) {
+ mVoiceConnector.setVoiceInputHighlighted(false);
+ } else if (!mHasValidSuggestions && !mJustAccepted) {
switch (TextEntryState.getState()) {
- case ACCEPTED_DEFAULT:
- TextEntryState.reset();
- // fall through
- case SPACE_AFTER_PICKED:
- mJustAddedAutoSpace = false; // The user moved the cursor.
- break;
+ case ACCEPTED_DEFAULT:
+ TextEntryState.reset();
+ // $FALL-THROUGH$
+ case SPACE_AFTER_PICKED:
+ mJustAddedAutoSpace = false; // The user moved the cursor.
+ break;
+ default:
+ break;
}
}
mJustAccepted = false;
- postUpdateShiftKeyState();
+ mHandler.postUpdateShiftKeyState();
// Make a note of the cursor position
mLastSelectionStart = newSelStart;
mLastSelectionEnd = newSelEnd;
- if (mReCorrectionEnabled) {
+ if (mReCorrectionEnabled && isShowingSuggestionsStrip()) {
// Don't look for corrections if the keyboard is not visible
- if (mKeyboardSwitcher != null && mKeyboardSwitcher.getInputView() != null
- && mKeyboardSwitcher.getInputView().isShown()) {
+ if (mKeyboardSwitcher.isInputViewShown()) {
// Check if we should go in or out of correction mode.
- if (isPredictionOn()
- && mJustRevertedSeparator == null
+ if (isSuggestionsRequested() && !mJustReverted
&& (candidatesStart == candidatesEnd || newSelStart != oldSelStart
|| TextEntryState.isCorrecting())
- && (newSelStart < newSelEnd - 1 || (!mPredicting))
- && !mVoiceInputHighlighted) {
+ && (newSelStart < newSelEnd - 1 || !mHasValidSuggestions)) {
if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) {
- postUpdateOldSuggestions();
+ mHandler.postUpdateOldSuggestions();
} else {
abortCorrection(false);
// Show the punctuation suggestions list if the current one is not
// and if not showing "Touch again to save".
- if (mCandidateView != null
- && !mSuggestPuncList.equals(mCandidateView.getSuggestions())
- && !mCandidateView.isShowingAddToDictionaryHint()) {
- setNextSuggestions();
+ if (mCandidateView != null && !isShowingPunctuationList()
+ && !mCandidateView.isShowingAddToDictionaryHint()) {
+ setPunctuationSuggestions();
}
}
}
@@ -840,7 +788,7 @@ public class LatinIME extends InputMethodService
*/
@Override
public void onExtractedTextClicked() {
- if (mReCorrectionEnabled && isPredictionOn()) return;
+ if (mReCorrectionEnabled && isSuggestionsRequested()) return;
super.onExtractedTextClicked();
}
@@ -856,7 +804,7 @@ public class LatinIME extends InputMethodService
*/
@Override
public void onExtractedCursorMovement(int dx, int dy) {
- if (mReCorrectionEnabled && isPredictionOn()) return;
+ if (mReCorrectionEnabled && isSuggestionsRequested()) return;
super.onExtractedCursorMovement(dx, dy);
}
@@ -864,52 +812,42 @@ public class LatinIME extends InputMethodService
@Override
public void hideWindow() {
LatinImeLogger.commit();
- onAutoCompletionStateChanged(false);
+ mKeyboardSwitcher.onAutoCorrectionStateChanged(false);
if (TRACE) Debug.stopMethodTracing();
if (mOptionsDialog != null && mOptionsDialog.isShowing()) {
mOptionsDialog.dismiss();
mOptionsDialog = null;
}
- if (!mConfigurationChanging) {
- if (mAfterVoiceInput) mVoiceInput.logInputEnded();
- if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) {
- mVoiceInput.logKeyboardWarningDialogDismissed();
- mVoiceWarningDialog.dismiss();
- mVoiceWarningDialog = null;
- }
- if (VOICE_INSTALLED & mRecognizing) {
- mVoiceInput.cancel();
- }
- }
- mWordToSuggestions.clear();
+ mVoiceConnector.hideVoiceWindow(mConfigurationChanging);
mWordHistory.clear();
super.hideWindow();
TextEntryState.endSession();
}
@Override
- public void onDisplayCompletions(CompletionInfo[] completions) {
+ public void onDisplayCompletions(CompletionInfo[] applicationSpecifiedCompletions) {
if (DEBUG) {
- Log.i("foo", "Received completions:");
- for (int i=0; i<(completions != null ? completions.length : 0); i++) {
- Log.i("foo", " #" + i + ": " + completions[i]);
+ Log.i(TAG, "Received completions:");
+ final int count = (applicationSpecifiedCompletions != null)
+ ? applicationSpecifiedCompletions.length : 0;
+ for (int i = 0; i < count; i++) {
+ Log.i(TAG, " #" + i + ": " + applicationSpecifiedCompletions[i]);
}
}
- if (mCompletionOn) {
- mCompletions = completions;
- if (completions == null) {
+ if (mApplicationSpecifiedCompletionOn) {
+ mApplicationSpecifiedCompletions = applicationSpecifiedCompletions;
+ if (applicationSpecifiedCompletions == null) {
clearSuggestions();
return;
}
- List<CharSequence> stringList = new ArrayList<CharSequence>();
- for (int i=0; i<(completions != null ? completions.length : 0); i++) {
- CompletionInfo ci = completions[i];
- if (ci != null) stringList.add(ci.getText());
- }
+ SuggestedWords.Builder builder = new SuggestedWords.Builder()
+ .setApplicationSpecifiedCompletions(applicationSpecifiedCompletions)
+ .setTypedWordValid(true)
+ .setHasMinimalSuggestion(true);
// When in fullscreen mode, show completions generated by the application
- setSuggestions(stringList, true, true, true);
+ setSuggestions(builder.build());
mBestWord = null;
setCandidatesViewShown(true);
}
@@ -918,8 +856,8 @@ public class LatinIME extends InputMethodService
private void setCandidatesViewShownInternal(boolean shown, boolean needsInputViewShown) {
// TODO: Remove this if we support candidates with hard keyboard
if (onEvaluateInputViewShown()) {
- super.setCandidatesViewShown(shown && mKeyboardSwitcher.getInputView() != null
- && (needsInputViewShown ? mKeyboardSwitcher.getInputView().isShown() : true));
+ super.setCandidatesViewShown(shown
+ && (needsInputViewShown ? mKeyboardSwitcher.isInputViewShown() : true));
}
}
@@ -934,14 +872,43 @@ public class LatinIME extends InputMethodService
if (!isFullscreenMode()) {
outInsets.contentTopInsets = outInsets.visibleTopInsets;
}
+ KeyboardView inputView = mKeyboardSwitcher.getInputView();
+ // Need to set touchable region only if input view is being shown
+ if (inputView != null && mKeyboardSwitcher.isInputViewShown()) {
+ final int x = 0;
+ int y = 0;
+ final int width = inputView.getWidth();
+ int height = inputView.getHeight() + EXTENDED_TOUCHABLE_REGION_HEIGHT;
+ if (mCandidateViewContainer != null) {
+ ViewParent candidateParent = mCandidateViewContainer.getParent();
+ if (candidateParent instanceof FrameLayout) {
+ FrameLayout fl = (FrameLayout) candidateParent;
+ if (fl != null) {
+ // Check frame layout's visibility
+ if (fl.getVisibility() == View.INVISIBLE) {
+ y = fl.getHeight();
+ height += y;
+ } else if (fl.getVisibility() == View.VISIBLE) {
+ height += fl.getHeight();
+ }
+ }
+ }
+ }
+ if (DEBUG) {
+ Log.d(TAG, "Touchable region " + x + ", " + y + ", " + width + ", " + height);
+ }
+ outInsets.touchableInsets = InputMethodService.Insets.TOUCHABLE_INSETS_REGION;
+ outInsets.touchableRegion.set(x, y, width, height);
+ }
}
@Override
public boolean onEvaluateFullscreenMode() {
- DisplayMetrics dm = getResources().getDisplayMetrics();
+ final Resources res = mResources;
+ DisplayMetrics dm = res.getDisplayMetrics();
float displayHeight = dm.heightPixels;
// If the display is more than X inches high, don't go to fullscreen mode
- float dimen = getResources().getDimension(R.dimen.max_height_for_fullscreen);
+ float dimen = res.getDimension(R.dimen.max_height_for_fullscreen);
if (displayHeight > dimen) {
return false;
} else {
@@ -952,25 +919,13 @@ public class LatinIME extends InputMethodService
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
- case KeyEvent.KEYCODE_BACK:
- if (event.getRepeatCount() == 0 && mKeyboardSwitcher.getInputView() != null) {
- if (mKeyboardSwitcher.getInputView().handleBack()) {
- return true;
- } else if (mTutorial != null) {
- mTutorial.close();
- mTutorial = null;
- }
- }
- break;
- case KeyEvent.KEYCODE_DPAD_DOWN:
- case KeyEvent.KEYCODE_DPAD_UP:
- case KeyEvent.KEYCODE_DPAD_LEFT:
- case KeyEvent.KEYCODE_DPAD_RIGHT:
- // If tutorial is visible, don't allow dpad to work
- if (mTutorial != null) {
+ case KeyEvent.KEYCODE_BACK:
+ if (event.getRepeatCount() == 0 && mKeyboardSwitcher.getInputView() != null) {
+ if (mKeyboardSwitcher.getInputView().handleBack()) {
return true;
}
- break;
+ }
+ break;
}
return super.onKeyDown(keyCode, event);
}
@@ -978,57 +933,30 @@ public class LatinIME extends InputMethodService
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
- case KeyEvent.KEYCODE_DPAD_DOWN:
- case KeyEvent.KEYCODE_DPAD_UP:
- case KeyEvent.KEYCODE_DPAD_LEFT:
- case KeyEvent.KEYCODE_DPAD_RIGHT:
- // If tutorial is visible, don't allow dpad to work
- if (mTutorial != null) {
- return true;
- }
- LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
- // Enable shift key and DPAD to do selections
- if (inputView != null && inputView.isShown()
- && inputView.isShifted()) {
- event = new KeyEvent(event.getDownTime(), event.getEventTime(),
- event.getAction(), event.getKeyCode(), event.getRepeatCount(),
- event.getDeviceId(), event.getScanCode(),
- KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON);
- InputConnection ic = getCurrentInputConnection();
- if (ic != null) ic.sendKeyEvent(event);
- return true;
- }
- break;
+ case KeyEvent.KEYCODE_DPAD_DOWN:
+ case KeyEvent.KEYCODE_DPAD_UP:
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ // Enable shift key and DPAD to do selections
+ if (mKeyboardSwitcher.isInputViewShown()
+ && mKeyboardSwitcher.isShiftedOrShiftLocked()) {
+ KeyEvent newEvent = new KeyEvent(event.getDownTime(), event.getEventTime(),
+ event.getAction(), event.getKeyCode(), event.getRepeatCount(),
+ event.getDeviceId(), event.getScanCode(),
+ KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON);
+ InputConnection ic = getCurrentInputConnection();
+ if (ic != null)
+ ic.sendKeyEvent(newEvent);
+ return true;
+ }
+ break;
}
return super.onKeyUp(keyCode, event);
}
- private void revertVoiceInput() {
- InputConnection ic = getCurrentInputConnection();
- if (ic != null) ic.commitText("", 1);
- updateSuggestions();
- mVoiceInputHighlighted = false;
- }
-
- private void commitVoiceInput() {
- InputConnection ic = getCurrentInputConnection();
- if (ic != null) ic.finishComposingText();
- updateSuggestions();
- mVoiceInputHighlighted = false;
- }
-
- private void reloadKeyboards() {
- mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher);
- if (mKeyboardSwitcher.getInputView() != null
- && mKeyboardSwitcher.getKeyboardMode() != KeyboardSwitcher.MODE_NONE) {
- mKeyboardSwitcher.setVoiceMode(mEnableVoice && mEnableVoiceButton, mVoiceOnPrimary);
- }
- mKeyboardSwitcher.makeKeyboards(true);
- }
-
- private void commitTyped(InputConnection inputConnection) {
- if (mPredicting) {
- mPredicting = false;
+ public void commitTyped(InputConnection inputConnection) {
+ if (mHasValidSuggestions) {
+ mHasValidSuggestions = false;
if (mComposing.length() > 0) {
if (inputConnection != null) {
inputConnection.commitText(mComposing, 1);
@@ -1041,27 +969,13 @@ public class LatinIME extends InputMethodService
}
}
- private void postUpdateShiftKeyState() {
- mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE);
- // TODO: Should remove this 300ms delay?
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SHIFT_STATE), 300);
- }
-
- public void updateShiftKeyState(EditorInfo attr) {
+ public boolean getCurrentAutoCapsState() {
InputConnection ic = getCurrentInputConnection();
- if (ic != null && attr != null && mKeyboardSwitcher.isAlphabetMode()) {
- mKeyboardSwitcher.setShifted(mShiftKeyState.isMomentary() || mCapsLock
- || getCursorCapsMode(ic, attr) != 0);
- }
- }
-
- private int getCursorCapsMode(InputConnection ic, EditorInfo attr) {
- int caps = 0;
EditorInfo ei = getCurrentInputEditorInfo();
- if (mAutoCap && ei != null && ei.inputType != EditorInfo.TYPE_NULL) {
- caps = ic.getCursorCapsMode(attr.inputType);
+ if (mAutoCap && ic != null && ei != null && ei.inputType != InputType.TYPE_NULL) {
+ return ic.getCursorCapsMode(ei.inputType) != 0;
}
- return caps;
+ return false;
}
private void swapPunctuationAndSpace() {
@@ -1069,12 +983,13 @@ public class LatinIME extends InputMethodService
if (ic == null) return;
CharSequence lastTwo = ic.getTextBeforeCursor(2, 0);
if (lastTwo != null && lastTwo.length() == 2
- && lastTwo.charAt(0) == KEYCODE_SPACE && isSentenceSeparator(lastTwo.charAt(1))) {
+ && lastTwo.charAt(0) == Keyboard.CODE_SPACE
+ && isSentenceSeparator(lastTwo.charAt(1))) {
ic.beginBatchEdit();
ic.deleteSurroundingText(2, 0);
ic.commitText(lastTwo.charAt(1) + " ", 1);
ic.endBatchEdit();
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
mJustAddedAutoSpace = true;
}
}
@@ -1084,14 +999,14 @@ public class LatinIME extends InputMethodService
if (ic == null) return;
CharSequence lastThree = ic.getTextBeforeCursor(3, 0);
if (lastThree != null && lastThree.length() == 3
- && lastThree.charAt(0) == KEYCODE_PERIOD
- && lastThree.charAt(1) == KEYCODE_SPACE
- && lastThree.charAt(2) == KEYCODE_PERIOD) {
+ && lastThree.charAt(0) == Keyboard.CODE_PERIOD
+ && lastThree.charAt(1) == Keyboard.CODE_SPACE
+ && lastThree.charAt(2) == Keyboard.CODE_PERIOD) {
ic.beginBatchEdit();
ic.deleteSurroundingText(3, 0);
ic.commitText(" ..", 1);
ic.endBatchEdit();
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
}
}
@@ -1103,12 +1018,13 @@ public class LatinIME extends InputMethodService
CharSequence lastThree = ic.getTextBeforeCursor(3, 0);
if (lastThree != null && lastThree.length() == 3
&& Character.isLetterOrDigit(lastThree.charAt(0))
- && lastThree.charAt(1) == KEYCODE_SPACE && lastThree.charAt(2) == KEYCODE_SPACE) {
+ && lastThree.charAt(1) == Keyboard.CODE_SPACE
+ && lastThree.charAt(2) == Keyboard.CODE_SPACE) {
ic.beginBatchEdit();
ic.deleteSurroundingText(2, 0);
ic.commitText(". ", 1);
ic.endBatchEdit();
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
mJustAddedAutoSpace = true;
}
}
@@ -1121,8 +1037,8 @@ public class LatinIME extends InputMethodService
// if there is one.
CharSequence lastOne = ic.getTextBeforeCursor(1, 0);
if (lastOne != null && lastOne.length() == 1
- && lastOne.charAt(0) == KEYCODE_PERIOD
- && text.charAt(0) == KEYCODE_PERIOD) {
+ && lastOne.charAt(0) == Keyboard.CODE_PERIOD
+ && text.charAt(0) == Keyboard.CODE_PERIOD) {
ic.deleteSurroundingText(1, 0);
}
}
@@ -1133,7 +1049,7 @@ public class LatinIME extends InputMethodService
CharSequence lastOne = ic.getTextBeforeCursor(1, 0);
if (lastOne != null && lastOne.length() == 1
- && lastOne.charAt(0) == KEYCODE_SPACE) {
+ && lastOne.charAt(0) == Keyboard.CODE_SPACE) {
ic.deleteSurroundingText(1, 0);
}
}
@@ -1142,7 +1058,7 @@ public class LatinIME extends InputMethodService
mUserDictionary.addWord(word, 128);
// Suggestion strip should be updated after the operation of adding word to the
// user dictionary
- postUpdateSuggestions();
+ mHandler.postUpdateSuggestions();
return true;
}
@@ -1154,14 +1070,11 @@ public class LatinIME extends InputMethodService
}
}
- private void showInputMethodPicker() {
- ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE))
- .showInputMethodPicker();
- }
-
- private void onOptionKeyPressed() {
+ private void onSettingsKeyPressed() {
if (!isShowingOptionDialog()) {
- if (LatinIMEUtil.hasMultipleEnabledIMEs(this)) {
+ if (!mConfigEnableShowSubtypeSettings) {
+ showSubtypeSelectorAndSettings();
+ } else if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) {
showOptionsMenu();
} else {
launchSettings();
@@ -1169,10 +1082,10 @@ public class LatinIME extends InputMethodService
}
}
- private void onOptionKeyLongPressed() {
+ private void onSettingsKeyLongPressed() {
if (!isShowingOptionDialog()) {
- if (LatinIMEUtil.hasMultipleEnabledIMEs(this)) {
- showInputMethodPicker();
+ if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) {
+ mImm.showInputMethodPicker();
} else {
launchSettings();
}
@@ -1183,150 +1096,137 @@ public class LatinIME extends InputMethodService
return mOptionsDialog != null && mOptionsDialog.isShowing();
}
- // Implementation of KeyboardViewListener
-
- public void onKey(int primaryCode, int[] keyCodes, int x, int y) {
+ // Implementation of {@link KeyboardActionListener}.
+ @Override
+ public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) {
long when = SystemClock.uptimeMillis();
- if (primaryCode != Keyboard.KEYCODE_DELETE ||
- when > mLastKeyTime + QUICK_PRESS) {
+ if (primaryCode != Keyboard.CODE_DELETE || when > mLastKeyTime + QUICK_PRESS) {
mDeleteCount = 0;
}
mLastKeyTime = when;
- final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch();
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
switch (primaryCode) {
- case Keyboard.KEYCODE_DELETE:
- handleBackspace();
- mDeleteCount++;
- LatinImeLogger.logOnDelete();
- break;
- case Keyboard.KEYCODE_SHIFT:
- // Shift key is handled in onPress() when device has distinct multi-touch panel.
- if (!distinctMultiTouch)
- handleShift();
- break;
- case Keyboard.KEYCODE_MODE_CHANGE:
- // Symbol key is handled in onPress() when device has distinct multi-touch panel.
- if (!distinctMultiTouch)
- changeKeyboardMode();
- break;
- case Keyboard.KEYCODE_CANCEL:
- if (!isShowingOptionDialog()) {
- handleClose();
- }
- break;
- case LatinKeyboardView.KEYCODE_OPTIONS:
- onOptionKeyPressed();
- break;
- case LatinKeyboardView.KEYCODE_OPTIONS_LONGPRESS:
- onOptionKeyLongPressed();
- break;
- case LatinKeyboardView.KEYCODE_NEXT_LANGUAGE:
- toggleLanguage(false, true);
- break;
- case LatinKeyboardView.KEYCODE_PREV_LANGUAGE:
- toggleLanguage(false, false);
- break;
- case LatinKeyboardView.KEYCODE_VOICE:
- if (VOICE_INSTALLED) {
- startListening(false /* was a button press, was not a swipe */);
- }
- break;
- case 9 /*Tab*/:
- sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB);
- break;
- default:
- if (primaryCode != KEYCODE_ENTER) {
- mJustAddedAutoSpace = false;
- }
- RingCharBuffer.getInstance().push((char)primaryCode, x, y);
- LatinImeLogger.logOnInputChar();
- if (isWordSeparator(primaryCode)) {
- handleSeparator(primaryCode);
- } else {
- handleCharacter(primaryCode, keyCodes);
- }
- // Cancel the just reverted state
- mJustRevertedSeparator = null;
+ case Keyboard.CODE_DELETE:
+ handleBackspace();
+ mDeleteCount++;
+ LatinImeLogger.logOnDelete();
+ break;
+ case Keyboard.CODE_SHIFT:
+ // Shift key is handled in onPress() when device has distinct multi-touch panel.
+ if (!distinctMultiTouch)
+ switcher.toggleShift();
+ break;
+ case Keyboard.CODE_SWITCH_ALPHA_SYMBOL:
+ // Symbol key is handled in onPress() when device has distinct multi-touch panel.
+ if (!distinctMultiTouch)
+ switcher.changeKeyboardMode();
+ break;
+ case Keyboard.CODE_CANCEL:
+ if (!isShowingOptionDialog()) {
+ handleClose();
+ }
+ break;
+ case Keyboard.CODE_SETTINGS:
+ onSettingsKeyPressed();
+ break;
+ case Keyboard.CODE_SETTINGS_LONGPRESS:
+ onSettingsKeyLongPressed();
+ break;
+ case Keyboard.CODE_NEXT_LANGUAGE:
+ toggleLanguage(false, true);
+ break;
+ case Keyboard.CODE_PREV_LANGUAGE:
+ toggleLanguage(false, false);
+ break;
+ case Keyboard.CODE_CAPSLOCK:
+ switcher.toggleCapsLock();
+ break;
+ case Keyboard.CODE_VOICE:
+ mSubtypeSwitcher.switchToShortcutIME();
+ break;
+ case Keyboard.CODE_TAB:
+ handleTab();
+ break;
+ default:
+ if (primaryCode != Keyboard.CODE_ENTER) {
+ mJustAddedAutoSpace = false;
+ }
+ RingCharBuffer.getInstance().push((char)primaryCode, x, y);
+ LatinImeLogger.logOnInputChar();
+ if (isWordSeparator(primaryCode)) {
+ handleSeparator(primaryCode);
+ } else {
+ handleCharacter(primaryCode, keyCodes);
+ }
+ // Cancel the just reverted state
+ mJustReverted = false;
}
- mKeyboardSwitcher.onKey(primaryCode);
+ switcher.onKey(primaryCode);
// Reset after any single keystroke
mEnteredText = null;
}
- public void onText(CharSequence text) {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
- commitVoiceInput();
- }
+ @Override
+ public void onTextInput(CharSequence text) {
+ mVoiceConnector.commitVoiceInput();
InputConnection ic = getCurrentInputConnection();
if (ic == null) return;
abortCorrection(false);
ic.beginBatchEdit();
- if (mPredicting) {
- commitTyped(ic);
- }
+ commitTyped(ic);
maybeRemovePreviousPeriod(text);
ic.commitText(text, 1);
ic.endBatchEdit();
- updateShiftKeyState(getCurrentInputEditorInfo());
- mKeyboardSwitcher.onKey(0); // dummy key code.
- mJustRevertedSeparator = null;
+ mKeyboardSwitcher.updateShiftState();
+ mKeyboardSwitcher.onKey(Keyboard.CODE_DUMMY);
+ mJustReverted = false;
mJustAddedAutoSpace = false;
mEnteredText = text;
}
- public void onCancel() {
+ @Override
+ public void onCancelInput() {
// User released a finger outside any key
mKeyboardSwitcher.onCancelInput();
}
private void handleBackspace() {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
- mVoiceInput.incrementTextModificationDeleteCount(
- mVoiceResults.candidates.get(0).toString().length());
- revertVoiceInput();
- return;
- }
- boolean deleteChar = false;
- InputConnection ic = getCurrentInputConnection();
- if (ic == null) return;
+ if (mVoiceConnector.logAndRevertVoiceInput()) return;
+ final InputConnection ic = getCurrentInputConnection();
+ if (ic == null) return;
ic.beginBatchEdit();
- if (mAfterVoiceInput) {
- // Don't log delete if the user is pressing delete at
- // the beginning of the text box (hence not deleting anything)
- if (mVoiceInput.getCursorPos() > 0) {
- // If anything was selected before the delete was pressed, increment the
- // delete count by the length of the selection
- int deleteLen = mVoiceInput.getSelectionSpan() > 0 ?
- mVoiceInput.getSelectionSpan() : 1;
- mVoiceInput.incrementTextModificationDeleteCount(deleteLen);
- }
- }
+ mVoiceConnector.handleBackspace();
- if (mPredicting) {
+ boolean deleteChar = false;
+ if (mHasValidSuggestions) {
final int length = mComposing.length();
if (length > 0) {
mComposing.delete(length - 1, length);
mWord.deleteLast();
ic.setComposingText(mComposing, 1);
if (mComposing.length() == 0) {
- mPredicting = false;
+ mHasValidSuggestions = false;
}
- postUpdateSuggestions();
+ mHandler.postUpdateSuggestions();
} else {
ic.deleteSurroundingText(1, 0);
}
} else {
deleteChar = true;
}
- postUpdateShiftKeyState();
+ mHandler.postUpdateShiftKeyState();
+
TextEntryState.backspace();
if (TextEntryState.getState() == TextEntryState.State.UNDO_COMMIT) {
revertLastWord(deleteChar);
ic.endBatchEdit();
return;
- } else if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) {
+ }
+
+ if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) {
ic.deleteSurroundingText(mEnteredText.length(), 0);
} else if (deleteChar) {
if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) {
@@ -1345,153 +1245,134 @@ public class LatinIME extends InputMethodService
}
}
}
- mJustRevertedSeparator = null;
+ mJustReverted = false;
ic.endBatchEdit();
}
- private void resetShift() {
- handleShiftInternal(true);
- }
+ private void handleTab() {
+ final int imeOptions = getCurrentInputEditorInfo().imeOptions;
+ final int navigationFlags =
+ EditorInfo.IME_FLAG_NAVIGATE_NEXT | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS;
+ if ((imeOptions & navigationFlags) == 0) {
+ sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB);
+ return;
+ }
- private void handleShift() {
- handleShiftInternal(false);
- }
+ final InputConnection ic = getCurrentInputConnection();
+ if (ic == null)
+ return;
- private void handleShiftInternal(boolean forceNormal) {
- mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE);
- KeyboardSwitcher switcher = mKeyboardSwitcher;
- LatinKeyboardView inputView = switcher.getInputView();
- if (switcher.isAlphabetMode()) {
- if (mCapsLock || forceNormal) {
- mCapsLock = false;
- switcher.setShifted(false);
- } else if (inputView != null) {
- if (inputView.isShifted()) {
- mCapsLock = true;
- switcher.setShiftLocked(true);
- } else {
- switcher.setShifted(true);
- }
- }
- } else {
- switcher.toggleShift();
+ // True if keyboard is in either chording shift or manual temporary upper case mode.
+ final boolean isManualTemporaryUpperCase = mKeyboardSwitcher.isManualTemporaryUpperCase();
+ if ((imeOptions & EditorInfo.IME_FLAG_NAVIGATE_NEXT) != 0
+ && !isManualTemporaryUpperCase) {
+ ic.performEditorAction(EditorInfo.IME_ACTION_NEXT);
+ } else if ((imeOptions & EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS) != 0
+ && isManualTemporaryUpperCase) {
+ ic.performEditorAction(EditorInfo.IME_ACTION_PREVIOUS);
}
}
private void abortCorrection(boolean force) {
if (force || TextEntryState.isCorrecting()) {
+ TextEntryState.onAbortCorrection();
+ setCandidatesViewShown(isCandidateStripVisible());
getCurrentInputConnection().finishComposingText();
clearSuggestions();
}
}
private void handleCharacter(int primaryCode, int[] keyCodes) {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
- commitVoiceInput();
- }
+ mVoiceConnector.handleCharacter();
- if (mAfterVoiceInput) {
- // Assume input length is 1. This assumption fails for smiley face insertions.
- mVoiceInput.incrementTextModificationInsertCount(1);
- }
if (mLastSelectionStart == mLastSelectionEnd && TextEntryState.isCorrecting()) {
abortCorrection(false);
}
- if (isAlphabet(primaryCode) && isPredictionOn() && !isCursorTouchingWord()) {
- if (!mPredicting) {
- mPredicting = true;
+ int code = primaryCode;
+ if (isAlphabet(code) && isSuggestionsRequested() && !isCursorTouchingWord()) {
+ if (!mHasValidSuggestions) {
+ mHasValidSuggestions = true;
mComposing.setLength(0);
saveWordInHistory(mBestWord);
mWord.reset();
}
}
- if (mKeyboardSwitcher.getInputView().isShifted()) {
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ if (switcher.isShiftedOrShiftLocked()) {
if (keyCodes == null || keyCodes[0] < Character.MIN_CODE_POINT
|| keyCodes[0] > Character.MAX_CODE_POINT) {
return;
}
- primaryCode = keyCodes[0];
- if (mKeyboardSwitcher.isAlphabetMode() && Character.isLowerCase(primaryCode)) {
- int upperCaseCode = Character.toUpperCase(primaryCode);
- if (upperCaseCode != primaryCode) {
- primaryCode = upperCaseCode;
+ code = keyCodes[0];
+ if (switcher.isAlphabetMode() && Character.isLowerCase(code)) {
+ int upperCaseCode = Character.toUpperCase(code);
+ if (upperCaseCode != code) {
+ code = upperCaseCode;
} else {
// Some keys, such as [eszett], have upper case as multi-characters.
- String upperCase = new String(new int[] {primaryCode}, 0, 1).toUpperCase();
- onText(upperCase);
+ String upperCase = new String(new int[] {code}, 0, 1).toUpperCase();
+ onTextInput(upperCase);
return;
}
}
}
- if (mPredicting) {
- if (mKeyboardSwitcher.getInputView().isShifted()
- && mKeyboardSwitcher.isAlphabetMode()
- && mComposing.length() == 0) {
+ if (mHasValidSuggestions) {
+ if (mComposing.length() == 0 && switcher.isAlphabetMode()
+ && switcher.isShiftedOrShiftLocked()) {
mWord.setFirstCharCapitalized(true);
}
- mComposing.append((char) primaryCode);
- mWord.add(primaryCode, keyCodes);
+ mComposing.append((char) code);
+ mWord.add(code, keyCodes);
InputConnection ic = getCurrentInputConnection();
if (ic != null) {
// If it's the first letter, make note of auto-caps state
if (mWord.size() == 1) {
- mWord.setAutoCapitalized(
- getCursorCapsMode(ic, getCurrentInputEditorInfo()) != 0);
+ mWord.setAutoCapitalized(getCurrentAutoCapsState());
}
ic.setComposingText(mComposing, 1);
}
- postUpdateSuggestions();
+ mHandler.postUpdateSuggestions();
} else {
- sendKeyChar((char)primaryCode);
+ sendKeyChar((char)code);
}
- updateShiftKeyState(getCurrentInputEditorInfo());
+ switcher.updateShiftState();
if (LatinIME.PERF_DEBUG) measureCps();
- TextEntryState.typedCharacter((char) primaryCode, isWordSeparator(primaryCode));
+ TextEntryState.typedCharacter((char) code, isWordSeparator(code));
}
private void handleSeparator(int primaryCode) {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
- commitVoiceInput();
- }
-
- if (mAfterVoiceInput){
- // Assume input length is 1. This assumption fails for smiley face insertions.
- mVoiceInput.incrementTextModificationInsertPunctuationCount(1);
- }
+ mVoiceConnector.handleSeparator();
// Should dismiss the "Touch again to save" message when handling separator
if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) {
- postUpdateSuggestions();
+ mHandler.postUpdateSuggestions();
}
boolean pickedDefault = false;
// Handle separator
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
if (ic != null) {
ic.beginBatchEdit();
abortCorrection(false);
}
- if (mPredicting) {
+ if (mHasValidSuggestions) {
// In certain languages where single quote is a separator, it's better
// not to auto correct, but accept the typed word. For instance,
// in Italian dov' should not be expanded to dove' because the elision
// requires the last vowel to be removed.
- if (mAutoCorrectOn && primaryCode != '\'' &&
- (mJustRevertedSeparator == null
- || mJustRevertedSeparator.length() == 0
- || mJustRevertedSeparator.charAt(0) != primaryCode)) {
+ if (mAutoCorrectOn && primaryCode != '\'' && !mJustReverted) {
pickedDefault = pickDefaultSuggestion();
// Picked the suggestion by the space key. We consider this
// as "added an auto space".
- if (primaryCode == KEYCODE_SPACE) {
+ if (primaryCode == Keyboard.CODE_SPACE) {
mJustAddedAutoSpace = true;
}
} else {
commitTyped(ic);
}
}
- if (mJustAddedAutoSpace && primaryCode == KEYCODE_ENTER) {
+ if (mJustAddedAutoSpace && primaryCode == Keyboard.CODE_ENTER) {
removeTrailingSpace();
mJustAddedAutoSpace = false;
}
@@ -1500,21 +1381,32 @@ public class LatinIME extends InputMethodService
// Handle the case of ". ." -> " .." with auto-space if necessary
// before changing the TextEntryState.
if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED
- && primaryCode == KEYCODE_PERIOD) {
+ && primaryCode == Keyboard.CODE_PERIOD) {
reswapPeriodAndSpace();
}
TextEntryState.typedCharacter((char) primaryCode, true);
if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED
- && primaryCode != KEYCODE_ENTER) {
+ && primaryCode != Keyboard.CODE_ENTER) {
swapPunctuationAndSpace();
- } else if (isPredictionOn() && primaryCode == KEYCODE_SPACE) {
+ } else if (isSuggestionsRequested() && primaryCode == Keyboard.CODE_SPACE) {
doubleSpace();
}
if (pickedDefault) {
- TextEntryState.backToAcceptedDefault(mWord.getTypedWord());
+ CharSequence typedWord = mWord.getTypedWord();
+ TextEntryState.backToAcceptedDefault(typedWord);
+ if (!TextUtils.isEmpty(typedWord) && !typedWord.equals(mBestWord)) {
+ if (ic != null) {
+ CorrectionInfo correctionInfo = new CorrectionInfo(
+ mLastSelectionEnd - typedWord.length(), typedWord, mBestWord);
+ ic.commitCorrection(correctionInfo);
+ }
+ if (mCandidateView != null)
+ mCandidateView.onAutoCorrectionInverted(mBestWord);
+ }
+ setPunctuationSuggestions();
}
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
if (ic != null) {
ic.endBatchEdit();
}
@@ -1522,16 +1414,11 @@ public class LatinIME extends InputMethodService
private void handleClose() {
commitTyped(getCurrentInputConnection());
- if (VOICE_INSTALLED & mRecognizing) {
- mVoiceInput.cancel();
- }
+ mVoiceConnector.handleClose();
requestHideSelf(0);
- if (mKeyboardSwitcher != null) {
- LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
- if (inputView != null) {
- inputView.closing();
- }
- }
+ LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+ if (inputView != null)
+ inputView.closing();
TextEntryState.endSession();
}
@@ -1552,272 +1439,116 @@ public class LatinIME extends InputMethodService
mWordHistory.add(entry);
}
- private void postUpdateSuggestions() {
- mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS);
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SUGGESTIONS), 100);
+ private boolean isSuggestionsRequested() {
+ return mIsSettingsSuggestionStripOn
+ && (mCorrectionMode > 0 || isShowingSuggestionsStrip());
}
- private void postUpdateOldSuggestions() {
- mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS);
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), 300);
+ private boolean isShowingPunctuationList() {
+ return mSuggestPuncList == mCandidateView.getSuggestions();
}
- private boolean isPredictionOn() {
- return mPredictionOn;
+ private boolean isShowingSuggestionsStrip() {
+ return (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_VALUE)
+ || (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE
+ && mOrientation == Configuration.ORIENTATION_PORTRAIT);
}
private boolean isCandidateStripVisible() {
- return isPredictionOn() && mShowSuggestions;
- }
-
- public void onCancelVoice() {
- if (mRecognizing) {
- switchToKeyboardView();
- }
- }
-
- private void switchToKeyboardView() {
- mHandler.post(new Runnable() {
- public void run() {
- mRecognizing = false;
- if (mKeyboardSwitcher.getInputView() != null) {
- setInputView(mKeyboardSwitcher.getInputView());
- }
- setCandidatesViewShown(true);
- updateInputViewShown();
- postUpdateSuggestions();
- }});
+ if (mCandidateView == null)
+ return false;
+ if (mCandidateView.isShowingAddToDictionaryHint() || TextEntryState.isCorrecting())
+ return true;
+ if (!isShowingSuggestionsStrip())
+ return false;
+ if (mApplicationSpecifiedCompletionOn)
+ return true;
+ return isSuggestionsRequested();
}
- private void switchToRecognitionStatusView() {
- final boolean configChanged = mConfigurationChanging;
+ public void switchToKeyboardView() {
mHandler.post(new Runnable() {
+ @Override
public void run() {
- setCandidatesViewShown(false);
- mRecognizing = true;
- View v = mVoiceInput.getView();
- ViewParent p = v.getParent();
- if (p != null && p instanceof ViewGroup) {
- ((ViewGroup)v.getParent()).removeView(v);
+ if (DEBUG) {
+ Log.d(TAG, "Switch to keyboard view.");
}
- setInputView(v);
- updateInputViewShown();
- if (configChanged) {
- mVoiceInput.onConfigurationChanged();
+ View v = mKeyboardSwitcher.getInputView();
+ if (v != null) {
+ // Confirms that the keyboard view doesn't have parent view.
+ ViewParent p = v.getParent();
+ if (p != null && p instanceof ViewGroup) {
+ ((ViewGroup) p).removeView(v);
+ }
+ setInputView(v);
}
- }});
- }
-
- private void startListening(boolean swipe) {
- if (!mHasUsedVoiceInput ||
- (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale)) {
- // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel.
- showVoiceWarningDialog(swipe);
- } else {
- reallyStartListening(swipe);
- }
- }
-
- private void reallyStartListening(boolean swipe) {
- if (!mHasUsedVoiceInput) {
- // The user has started a voice input, so remember that in the
- // future (so we don't show the warning dialog after the first run).
- SharedPreferences.Editor editor =
- PreferenceManager.getDefaultSharedPreferences(this).edit();
- editor.putBoolean(PREF_HAS_USED_VOICE_INPUT, true);
- SharedPreferencesCompat.apply(editor);
- mHasUsedVoiceInput = true;
- }
-
- if (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale) {
- // The user has started a voice input from an unsupported locale, so remember that
- // in the future (so we don't show the warning dialog the next time they do this).
- SharedPreferences.Editor editor =
- PreferenceManager.getDefaultSharedPreferences(this).edit();
- editor.putBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, true);
- SharedPreferencesCompat.apply(editor);
- mHasUsedVoiceInputUnsupportedLocale = true;
- }
-
- // Clear N-best suggestions
- clearSuggestions();
-
- FieldContext context = new FieldContext(
- getCurrentInputConnection(),
- getCurrentInputEditorInfo(),
- mLanguageSwitcher.getInputLanguage(),
- mLanguageSwitcher.getEnabledLanguages());
- mVoiceInput.startListening(context, swipe);
- switchToRecognitionStatusView();
- }
-
- private void showVoiceWarningDialog(final boolean swipe) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setCancelable(true);
- builder.setIcon(R.drawable.ic_mic_dialog);
- builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- mVoiceInput.logKeyboardWarningDialogOk();
- reallyStartListening(swipe);
- }
- });
- builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- mVoiceInput.logKeyboardWarningDialogCancel();
+ setCandidatesViewShown(isCandidateStripVisible());
+ updateInputViewShown();
+ mHandler.postUpdateSuggestions();
}
});
-
- if (mLocaleSupportedForVoiceInput) {
- String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" +
- getString(R.string.voice_warning_how_to_turn_off);
- builder.setMessage(message);
- } else {
- String message = getString(R.string.voice_warning_locale_not_supported) + "\n\n" +
- getString(R.string.voice_warning_may_not_understand) + "\n\n" +
- getString(R.string.voice_warning_how_to_turn_off);
- builder.setMessage(message);
- }
-
- builder.setTitle(R.string.voice_warning_title);
- mVoiceWarningDialog = builder.create();
-
- Window window = mVoiceWarningDialog.getWindow();
- WindowManager.LayoutParams lp = window.getAttributes();
- lp.token = mKeyboardSwitcher.getInputView().getWindowToken();
- lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
- window.setAttributes(lp);
- window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
- mVoiceInput.logKeyboardWarningDialogShown();
- mVoiceWarningDialog.show();
}
- public void onVoiceResults(List<String> candidates,
- Map<String, List<CharSequence>> alternatives) {
- if (!mRecognizing) {
- return;
- }
- mVoiceResults.candidates = candidates;
- mVoiceResults.alternatives = alternatives;
- mHandler.sendMessage(mHandler.obtainMessage(MSG_VOICE_RESULTS));
+ public void clearSuggestions() {
+ setSuggestions(SuggestedWords.EMPTY);
}
- private void handleVoiceResults() {
- mAfterVoiceInput = true;
- mImmediatelyAfterVoiceInput = true;
-
- InputConnection ic = getCurrentInputConnection();
- if (!isFullscreenMode()) {
- // Start listening for updates to the text from typing, etc.
- if (ic != null) {
- ExtractedTextRequest req = new ExtractedTextRequest();
- ic.getExtractedText(req, InputConnection.GET_EXTRACTED_TEXT_MONITOR);
- }
- }
-
- vibrate();
- switchToKeyboardView();
-
- final List<CharSequence> nBest = new ArrayList<CharSequence>();
- boolean capitalizeFirstWord = preferCapitalization()
- || (mKeyboardSwitcher.isAlphabetMode()
- && mKeyboardSwitcher.getInputView().isShifted());
- for (String c : mVoiceResults.candidates) {
- if (capitalizeFirstWord) {
- c = Character.toUpperCase(c.charAt(0)) + c.substring(1, c.length());
- }
- nBest.add(c);
- }
-
- if (nBest.size() == 0) {
- return;
- }
-
- String bestResult = nBest.get(0).toString();
-
- mVoiceInput.logVoiceInputDelivered(bestResult.length());
-
- mHints.registerVoiceResult(bestResult);
-
- if (ic != null) ic.beginBatchEdit(); // To avoid extra updates on committing older text
-
- commitTyped(ic);
- EditingUtil.appendText(ic, bestResult);
-
- if (ic != null) ic.endBatchEdit();
-
- mVoiceInputHighlighted = true;
- mWordToSuggestions.putAll(mVoiceResults.alternatives);
- }
-
- private void clearSuggestions() {
- setSuggestions(null, false, false, false);
- }
-
- private void setSuggestions(
- List<CharSequence> suggestions,
- boolean completions,
- boolean typedWordValid,
- boolean haveMinimalSuggestion) {
-
- if (mIsShowingHint) {
+ public void setSuggestions(SuggestedWords words) {
+ if (mVoiceConnector.getAndResetIsShowingHint()) {
setCandidatesView(mCandidateViewContainer);
- mIsShowingHint = false;
}
if (mCandidateView != null) {
- mCandidateView.setSuggestions(
- suggestions, completions, typedWordValid, haveMinimalSuggestion);
+ mCandidateView.setSuggestions(words);
+ if (mCandidateView.isConfigCandidateHighlightFontColorEnabled()) {
+ mKeyboardSwitcher.onAutoCorrectionStateChanged(
+ words.hasWordAboveAutoCorrectionScoreThreshold());
+ }
}
}
- private void updateSuggestions() {
- LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
- ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null);
+ public void updateSuggestions() {
+ mKeyboardSwitcher.setPreferredLetters(null);
// Check if we have a suggestion engine attached.
- if ((mSuggest == null || !isPredictionOn()) && !mVoiceInputHighlighted) {
+ if ((mSuggest == null || !isSuggestionsRequested())
+ && !mVoiceConnector.isVoiceInputHighlighted()) {
return;
}
- if (!mPredicting) {
- setNextSuggestions();
+ if (!mHasValidSuggestions) {
+ setPunctuationSuggestions();
return;
}
showSuggestions(mWord);
}
- private List<CharSequence> getTypedSuggestions(WordComposer word) {
- List<CharSequence> stringList = mSuggest.getSuggestions(
- mKeyboardSwitcher.getInputView(), word, false, null);
- return stringList;
+ private SuggestedWords.Builder getTypedSuggestions(WordComposer word) {
+ return mSuggest.getSuggestedWordBuilder(mKeyboardSwitcher.getInputView(), word, null);
}
private void showCorrections(WordAlternatives alternatives) {
- List<CharSequence> stringList = alternatives.getAlternatives();
- ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters(null);
- showSuggestions(stringList, alternatives.getOriginalWord(), false, false);
+ mKeyboardSwitcher.setPreferredLetters(null);
+ SuggestedWords.Builder builder = alternatives.getAlternatives();
+ builder.setTypedWordValid(false).setHasMinimalSuggestion(false);
+ showSuggestions(builder.build(), alternatives.getOriginalWord());
}
private void showSuggestions(WordComposer word) {
- // long startTime = System.currentTimeMillis(); // TIME MEASUREMENT!
// TODO Maybe need better way of retrieving previous word
- CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(),
+ CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
mWordSeparators);
- List<CharSequence> stringList = mSuggest.getSuggestions(
- mKeyboardSwitcher.getInputView(), word, false, prevWord);
- // long stopTime = System.currentTimeMillis(); // TIME MEASUREMENT!
- // Log.d("LatinIME","Suggest Total Time - " + (stopTime - startTime));
+ SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
+ mKeyboardSwitcher.getInputView(), word, prevWord);
int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies();
+ mKeyboardSwitcher.setPreferredLetters(nextLettersFrequencies);
- ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters(
- nextLettersFrequencies);
-
- boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection();
- //|| mCorrectionMode == mSuggest.CORRECTION_FULL;
- CharSequence typedWord = word.getTypedWord();
+ boolean correctionAvailable = !mInputTypeNoAutoCorrect && !mJustReverted
+ && mSuggest.hasAutoCorrection();
+ final CharSequence typedWord = word.getTypedWord();
// If we're in basic correct
- boolean typedWordValid = mSuggest.isValidWord(typedWord) ||
+ final boolean typedWordValid = mSuggest.isValidWord(typedWord) ||
(preferCapitalization()
&& mSuggest.isValidWord(typedWord.toString().toLowerCase()));
if (mCorrectionMode == Suggest.CORRECTION_FULL
@@ -1828,34 +1559,50 @@ public class LatinIME extends InputMethodService
correctionAvailable &= !word.isMostlyCaps();
correctionAvailable &= !TextEntryState.isCorrecting();
- showSuggestions(stringList, typedWord, typedWordValid, correctionAvailable);
+ // Basically, we update the suggestion strip only when suggestion count > 1. However,
+ // there is an exception: We update the suggestion strip whenever typed word's length
+ // is 1 or typed word is found in dictionary, regardless of suggestion count. Actually,
+ // in most cases, suggestion count is 1 when typed word's length is 1, but we do always
+ // need to clear the previous state when the user starts typing a word (i.e. typed word's
+ // length == 1).
+ if (builder.size() > 1 || typedWord.length() == 1 || typedWordValid
+ || mCandidateView.isShowingAddToDictionaryHint()) {
+ builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion(correctionAvailable);
+ } else {
+ final SuggestedWords previousSuggestions = mCandidateView.getSuggestions();
+ if (previousSuggestions == mSuggestPuncList)
+ return;
+ builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions);
+ }
+ showSuggestions(builder.build(), typedWord);
}
- private void showSuggestions(List<CharSequence> stringList, CharSequence typedWord,
- boolean typedWordValid, boolean correctionAvailable) {
- setSuggestions(stringList, false, typedWordValid, correctionAvailable);
- if (stringList.size() > 0) {
- if (correctionAvailable && !typedWordValid && stringList.size() > 1) {
- mBestWord = stringList.get(1);
+ private void showSuggestions(SuggestedWords suggestedWords, CharSequence typedWord) {
+ setSuggestions(suggestedWords);
+ if (suggestedWords.size() > 0) {
+ if (Utils.shouldBlockedBySafetyNetForAutoCorrection(suggestedWords, mSuggest)) {
+ mBestWord = typedWord;
+ } else if (suggestedWords.hasAutoCorrectionWord()) {
+ mBestWord = suggestedWords.getWord(1);
} else {
mBestWord = typedWord;
}
} else {
mBestWord = null;
}
- setCandidatesViewShown(isCandidateStripVisible() || mCompletionOn);
+ setCandidatesViewShown(isCandidateStripVisible());
}
private boolean pickDefaultSuggestion() {
// Complete any pending candidate query first
- if (mHandler.hasMessages(MSG_UPDATE_SUGGESTIONS)) {
- mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS);
+ if (mHandler.hasPendingUpdateSuggestions()) {
+ mHandler.cancelUpdateSuggestions();
updateSuggestions();
}
if (mBestWord != null && mBestWord.length() > 0) {
TextEntryState.acceptedDefault(mWord.getTypedWord(), mBestWord);
mJustAccepted = true;
- pickSuggestion(mBestWord, false);
+ pickSuggestion(mBestWord);
// Add the word to the auto dictionary if it's not a known word
addToDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED);
return true;
@@ -1865,24 +1612,17 @@ public class LatinIME extends InputMethodService
}
public void pickSuggestionManually(int index, CharSequence suggestion) {
- List<CharSequence> suggestions = mCandidateView.getSuggestions();
-
- if (mAfterVoiceInput && mShowingVoiceSuggestions) {
- mVoiceInput.flushAllTextModificationCounters();
- // send this intent AFTER logging any prior aggregated edits.
- mVoiceInput.logTextModifiedByChooseSuggestion(suggestion.toString(), index,
- mWordSeparators,
- getCurrentInputConnection());
- }
+ SuggestedWords suggestions = mCandidateView.getSuggestions();
+ mVoiceConnector.flushAndLogAllTextModificationCounters(index, suggestion, mWordSeparators);
final boolean correcting = TextEntryState.isCorrecting();
InputConnection ic = getCurrentInputConnection();
if (ic != null) {
ic.beginBatchEdit();
}
- if (mCompletionOn && mCompletions != null && index >= 0
- && index < mCompletions.length) {
- CompletionInfo ci = mCompletions[index];
+ if (mApplicationSpecifiedCompletionOn && mApplicationSpecifiedCompletions != null
+ && index >= 0 && index < mApplicationSpecifiedCompletions.length) {
+ CompletionInfo ci = mApplicationSpecifiedCompletions[index];
if (ic != null) {
ic.commitCompletion(ci);
}
@@ -1890,7 +1630,7 @@ public class LatinIME extends InputMethodService
if (mCandidateView != null) {
mCandidateView.clear();
}
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
if (ic != null) {
ic.endBatchEdit();
}
@@ -1903,17 +1643,18 @@ public class LatinIME extends InputMethodService
// Word separators are suggested before the user inputs something.
// So, LatinImeLogger logs "" as a user's input.
LatinImeLogger.logOnManualSuggestion(
- "", suggestion.toString(), index, suggestions);
+ "", suggestion.toString(), index, suggestions.mWords);
final char primaryCode = suggestion.charAt(0);
- onKey(primaryCode, new int[]{primaryCode}, LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE,
- LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE);
+ onCodeInput(primaryCode, new int[] { primaryCode },
+ KeyboardActionListener.NOT_A_TOUCH_COORDINATE,
+ KeyboardActionListener.NOT_A_TOUCH_COORDINATE);
if (ic != null) {
ic.endBatchEdit();
}
return;
}
mJustAccepted = true;
- pickSuggestion(suggestion, correcting);
+ pickSuggestion(suggestion);
// Add the word to the auto dictionary if it's not a known word
if (index == 0) {
addToDictionaries(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED);
@@ -1921,7 +1662,7 @@ public class LatinIME extends InputMethodService
addToBigramDictionary(suggestion, 1);
}
LatinImeLogger.logOnManualSuggestion(mComposing.toString(), suggestion.toString(),
- index, suggestions);
+ index, suggestions.mWords);
TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion);
// Follow it with a space
if (mAutoSpace && !correcting) {
@@ -1937,13 +1678,13 @@ public class LatinIME extends InputMethodService
// Fool the state watcher so that a subsequent backspace will not do a revert, unless
// we just did a correction, in which case we need to stay in
// TextEntryState.State.PICKED_SUGGESTION state.
- TextEntryState.typedCharacter((char) KEYCODE_SPACE, true);
- setNextSuggestions();
+ TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true);
+ setPunctuationSuggestions();
} else if (!showingAddToDictionaryHint) {
// If we're not showing the "Touch again to save", then show corrections again.
// In case the cursor position doesn't change, make sure we show the suggestions again.
clearSuggestions();
- postUpdateOldSuggestions();
+ mHandler.postUpdateOldSuggestions();
}
if (showingAddToDictionaryHint) {
mCandidateView.showAddToDictionaryHint(suggestion);
@@ -1953,91 +1694,25 @@ public class LatinIME extends InputMethodService
}
}
- private void rememberReplacedWord(CharSequence suggestion) {
- if (mShowingVoiceSuggestions) {
- // Retain the replaced word in the alternatives array.
- EditingUtil.Range range = new EditingUtil.Range();
- String wordToBeReplaced = EditingUtil.getWordAtCursor(getCurrentInputConnection(),
- mWordSeparators, range);
- if (!mWordToSuggestions.containsKey(wordToBeReplaced)) {
- wordToBeReplaced = wordToBeReplaced.toLowerCase();
- }
- if (mWordToSuggestions.containsKey(wordToBeReplaced)) {
- List<CharSequence> suggestions = mWordToSuggestions.get(wordToBeReplaced);
- if (suggestions.contains(suggestion)) {
- suggestions.remove(suggestion);
- }
- suggestions.add(wordToBeReplaced);
- mWordToSuggestions.remove(wordToBeReplaced);
- mWordToSuggestions.put(suggestion.toString(), suggestions);
- }
- }
- }
-
/**
* Commits the chosen word to the text field and saves it for later
* retrieval.
* @param suggestion the suggestion picked by the user to be committed to
* the text field
- * @param correcting whether this is due to a correction of an existing
- * word.
*/
- private void pickSuggestion(CharSequence suggestion, boolean correcting) {
- LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
- if (mCapsLock) {
- suggestion = suggestion.toString().toUpperCase();
- } else if (preferCapitalization()
- || (mKeyboardSwitcher.isAlphabetMode()
- && inputView.isShifted())) {
- suggestion = suggestion.toString().toUpperCase().charAt(0)
- + suggestion.subSequence(1, suggestion.length()).toString();
- }
+ private void pickSuggestion(CharSequence suggestion) {
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ if (!switcher.isKeyboardAvailable())
+ return;
InputConnection ic = getCurrentInputConnection();
if (ic != null) {
- rememberReplacedWord(suggestion);
+ mVoiceConnector.rememberReplacedWord(suggestion, mWordSeparators);
ic.commitText(suggestion, 1);
}
saveWordInHistory(suggestion);
- mPredicting = false;
+ mHasValidSuggestions = false;
mCommittedLength = suggestion.length();
- ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null);
- // If we just corrected a word, then don't show punctuations
- if (!correcting) {
- setNextSuggestions();
- }
- updateShiftKeyState(getCurrentInputEditorInfo());
- }
-
- /**
- * Tries to apply any voice alternatives for the word if this was a spoken word and
- * there are voice alternatives.
- * @param touching The word that the cursor is touching, with position information
- * @return true if an alternative was found, false otherwise.
- */
- private boolean applyVoiceAlternatives(EditingUtil.SelectedWord touching) {
- // Search for result in spoken word alternatives
- String selectedWord = touching.word.toString().trim();
- if (!mWordToSuggestions.containsKey(selectedWord)) {
- selectedWord = selectedWord.toLowerCase();
- }
- if (mWordToSuggestions.containsKey(selectedWord)) {
- mShowingVoiceSuggestions = true;
- List<CharSequence> suggestions = mWordToSuggestions.get(selectedWord);
- // If the first letter of touching is capitalized, make all the suggestions
- // start with a capital letter.
- if (Character.isUpperCase(touching.word.charAt(0))) {
- for (int i = 0; i < suggestions.size(); i++) {
- String origSugg = (String) suggestions.get(i);
- String capsSugg = origSugg.toUpperCase().charAt(0)
- + origSugg.subSequence(1, origSugg.length()).toString();
- suggestions.set(i, capsSugg);
- }
- }
- setSuggestions(suggestions, false, true, true);
- setCandidatesViewShown(true);
- return true;
- }
- return false;
+ switcher.setPreferredLetters(null);
}
/**
@@ -2046,12 +1721,12 @@ public class LatinIME extends InputMethodService
* @param touching The word that the cursor is touching, with position information
* @return true if an alternative was found, false otherwise.
*/
- private boolean applyTypedAlternatives(EditingUtil.SelectedWord touching) {
+ private boolean applyTypedAlternatives(EditingUtils.SelectedWord touching) {
// If we didn't find a match, search for result in typed word history
WordComposer foundWord = null;
WordAlternatives alternatives = null;
for (WordAlternatives entry : mWordHistory) {
- if (TextUtils.equals(entry.getChosenWord(), touching.word)) {
+ if (TextUtils.equals(entry.getChosenWord(), touching.mWord)) {
if (entry instanceof TypedWordAlternatives) {
foundWord = ((TypedWordAlternatives) entry).word;
}
@@ -2059,22 +1734,22 @@ public class LatinIME extends InputMethodService
break;
}
}
- // If we didn't find a match, at least suggest completions
+ // If we didn't find a match, at least suggest corrections.
if (foundWord == null
- && (mSuggest.isValidWord(touching.word)
- || mSuggest.isValidWord(touching.word.toString().toLowerCase()))) {
+ && (mSuggest.isValidWord(touching.mWord)
+ || mSuggest.isValidWord(touching.mWord.toString().toLowerCase()))) {
foundWord = new WordComposer();
- for (int i = 0; i < touching.word.length(); i++) {
- foundWord.add(touching.word.charAt(i), new int[] {
- touching.word.charAt(i)
+ for (int i = 0; i < touching.mWord.length(); i++) {
+ foundWord.add(touching.mWord.charAt(i), new int[] {
+ touching.mWord.charAt(i)
});
}
- foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.word.charAt(0)));
+ foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.mWord.charAt(0)));
}
// Found a match, show suggestions
if (foundWord != null || alternatives != null) {
if (alternatives == null) {
- alternatives = new TypedWordAlternatives(touching.word, foundWord);
+ alternatives = new TypedWordAlternatives(touching.mWord, foundWord);
}
showCorrections(alternatives);
if (foundWord != null) {
@@ -2088,39 +1763,41 @@ public class LatinIME extends InputMethodService
}
private void setOldSuggestions() {
- mShowingVoiceSuggestions = false;
+ mVoiceConnector.setShowingVoiceSuggestions(false);
if (mCandidateView != null && mCandidateView.isShowingAddToDictionaryHint()) {
return;
}
InputConnection ic = getCurrentInputConnection();
if (ic == null) return;
- if (!mPredicting) {
+ if (!mHasValidSuggestions) {
// Extract the selected or touching text
- EditingUtil.SelectedWord touching = EditingUtil.getWordAtCursorOrSelection(ic,
+ EditingUtils.SelectedWord touching = EditingUtils.getWordAtCursorOrSelection(ic,
mLastSelectionStart, mLastSelectionEnd, mWordSeparators);
- if (touching != null && touching.word.length() > 1) {
+ if (touching != null && touching.mWord.length() > 1) {
ic.beginBatchEdit();
- if (!applyVoiceAlternatives(touching) && !applyTypedAlternatives(touching)) {
+ if (!mVoiceConnector.applyVoiceAlternatives(touching)
+ && !applyTypedAlternatives(touching)) {
abortCorrection(true);
} else {
TextEntryState.selectedForCorrection();
- EditingUtil.underlineWord(ic, touching);
+ EditingUtils.underlineWord(ic, touching);
}
ic.endBatchEdit();
} else {
abortCorrection(true);
- setNextSuggestions(); // Show the punctuation suggestions list
+ setPunctuationSuggestions(); // Show the punctuation suggestions list
}
} else {
abortCorrection(true);
}
}
- private void setNextSuggestions() {
- setSuggestions(mSuggestPuncList, false, false, false);
+ private void setPunctuationSuggestions() {
+ setSuggestions(mSuggestPuncList);
+ setCandidatesViewShown(isCandidateStripVisible());
}
private void addToDictionaries(CharSequence suggestion, int frequencyDelta) {
@@ -2145,19 +1822,17 @@ public class LatinIME extends InputMethodService
|| mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM)) {
return;
}
- if (suggestion != null) {
- if (!addToBigramDictionary && mAutoDictionary.isValidWord(suggestion)
- || (!mSuggest.isValidWord(suggestion.toString())
- && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) {
- mAutoDictionary.addWord(suggestion.toString(), frequencyDelta);
- }
+ if (!addToBigramDictionary && mAutoDictionary.isValidWord(suggestion)
+ || (!mSuggest.isValidWord(suggestion.toString())
+ && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) {
+ mAutoDictionary.addWord(suggestion.toString(), frequencyDelta);
+ }
- if (mUserBigramDictionary != null) {
- CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(),
- mSentenceSeparators);
- if (!TextUtils.isEmpty(prevWord)) {
- mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString());
- }
+ if (mUserBigramDictionary != null) {
+ CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
+ mSentenceSeparators);
+ if (!TextUtils.isEmpty(prevWord)) {
+ mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString());
}
}
}
@@ -2187,24 +1862,37 @@ public class LatinIME extends InputMethodService
public void revertLastWord(boolean deleteChar) {
final int length = mComposing.length();
- if (!mPredicting && length > 0) {
+ if (!mHasValidSuggestions && length > 0) {
final InputConnection ic = getCurrentInputConnection();
- mPredicting = true;
- mJustRevertedSeparator = ic.getTextBeforeCursor(1, 0);
+ mJustReverted = true;
+ final CharSequence punctuation = ic.getTextBeforeCursor(1, 0);
if (deleteChar) ic.deleteSurroundingText(1, 0);
int toDelete = mCommittedLength;
- CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0);
- if (toTheLeft != null && toTheLeft.length() > 0
- && isWordSeparator(toTheLeft.charAt(0))) {
+ final CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0);
+ if (!TextUtils.isEmpty(toTheLeft) && isWordSeparator(toTheLeft.charAt(0))) {
toDelete--;
}
ic.deleteSurroundingText(toDelete, 0);
- ic.setComposingText(mComposing, 1);
- TextEntryState.backspace();
- postUpdateSuggestions();
+ // Re-insert punctuation only when the deleted character was word separator and the
+ // composing text wasn't equal to the auto-corrected text.
+ if (deleteChar
+ && !TextUtils.isEmpty(punctuation) && isWordSeparator(punctuation.charAt(0))
+ && !TextUtils.equals(mComposing, toTheLeft)) {
+ ic.commitText(mComposing, 1);
+ TextEntryState.acceptedTyped(mComposing);
+ ic.commitText(punctuation, 1);
+ TextEntryState.typedCharacter(punctuation.charAt(0), true);
+ // Clear composing text
+ mComposing.setLength(0);
+ } else {
+ mHasValidSuggestions = true;
+ ic.setComposingText(mComposing, 1);
+ TextEntryState.backspace();
+ }
+ mHandler.postUpdateSuggestions();
} else {
sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL);
- mJustRevertedSeparator = null;
+ mJustReverted = false;
}
}
@@ -2222,130 +1910,97 @@ public class LatinIME extends InputMethodService
}
private void sendSpace() {
- sendKeyChar((char)KEYCODE_SPACE);
- updateShiftKeyState(getCurrentInputEditorInfo());
- //onKey(KEY_SPACE[0], KEY_SPACE);
+ sendKeyChar((char)Keyboard.CODE_SPACE);
+ mKeyboardSwitcher.updateShiftState();
}
public boolean preferCapitalization() {
return mWord.isFirstCharCapitalized();
}
+ // Notify that language or mode have been changed and toggleLanguage will update KeyboaredID
+ // according to new language or mode.
+ public void onRefreshKeyboard() {
+ toggleLanguage(true, true);
+ }
+
+ // "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER.
private void toggleLanguage(boolean reset, boolean next) {
- if (reset) {
- mLanguageSwitcher.reset();
- } else {
- if (next) {
- mLanguageSwitcher.next();
- } else {
- mLanguageSwitcher.prev();
- }
+ if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) {
+ mSubtypeSwitcher.toggleLanguage(reset, next);
}
- int currentKeyboardMode = mKeyboardSwitcher.getKeyboardMode();
- reloadKeyboards();
- mKeyboardSwitcher.makeKeyboards(true);
- mKeyboardSwitcher.setKeyboardMode(currentKeyboardMode, 0,
- mEnableVoiceButton && mEnableVoice);
- initSuggest(mLanguageSwitcher.getInputLanguage());
- mLanguageSwitcher.persist();
- updateShiftKeyState(getCurrentInputEditorInfo());
+ // Reload keyboard because the current language has been changed.
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ final EditorInfo attribute = getCurrentInputEditorInfo();
+ final int mode = initializeInputAttributesAndGetMode((attribute != null)
+ ? attribute.inputType : 0);
+ final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
+ switcher.loadKeyboard(mode, imeOptions, mVoiceConnector.isVoiceButtonEnabled(),
+ mVoiceConnector.isVoiceButtonOnPrimary());
+ initSuggest();
+ switcher.updateShiftState();
}
+ @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
- if (PREF_SELECTED_LANGUAGES.equals(key)) {
- mLanguageSwitcher.loadLocales(sharedPreferences);
+ mSubtypeSwitcher.onSharedPreferenceChanged(sharedPreferences, key);
+ if (Settings.PREF_SELECTED_LANGUAGES.equals(key)) {
mRefreshKeyboardRequired = true;
- } else if (PREF_RECORRECTION_ENABLED.equals(key)) {
- mReCorrectionEnabled = sharedPreferences.getBoolean(PREF_RECORRECTION_ENABLED,
- getResources().getBoolean(R.bool.default_recorrection_enabled));
+ } else if (Settings.PREF_RECORRECTION_ENABLED.equals(key)) {
+ mReCorrectionEnabled = sharedPreferences.getBoolean(
+ Settings.PREF_RECORRECTION_ENABLED,
+ mResources.getBoolean(R.bool.default_recorrection_enabled));
}
}
- public void swipeRight() {
- if (LatinKeyboardView.DEBUG_AUTO_PLAY) {
- ClipboardManager cm = ((ClipboardManager)getSystemService(CLIPBOARD_SERVICE));
- CharSequence text = cm.getText();
- if (!TextUtils.isEmpty(text)) {
- mKeyboardSwitcher.getInputView().startPlaying(text.toString());
- }
- }
- }
-
- public void swipeLeft() {
- }
-
- public void swipeDown() {
- handleClose();
- }
-
- public void swipeUp() {
- //launchSettings();
+ @Override
+ public void onSwipeDown() {
+ if (mConfigSwipeDownDismissKeyboardEnabled)
+ handleClose();
}
+ @Override
public void onPress(int primaryCode) {
if (mKeyboardSwitcher.isVibrateAndSoundFeedbackRequired()) {
vibrate();
playKeyClick(primaryCode);
}
- final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch();
- if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_SHIFT) {
- mShiftKeyState.onPress();
- handleShift();
- } else if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_MODE_CHANGE) {
- changeKeyboardMode();
- mSymbolKeyState.onPress();
- mKeyboardSwitcher.setAutoModeSwitchStateMomentary();
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
+ if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) {
+ switcher.onPressShift();
+ } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
+ switcher.onPressSymbol();
} else {
- mShiftKeyState.onOtherKeyPressed();
- mSymbolKeyState.onOtherKeyPressed();
+ switcher.onOtherKeyPressed();
}
}
+ @Override
public void onRelease(int primaryCode) {
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
// Reset any drag flags in the keyboard
- ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).keyReleased();
- //vibrate();
- final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch();
- if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_SHIFT) {
- if (mShiftKeyState.isMomentary())
- resetShift();
- mShiftKeyState.onRelease();
- } else if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_MODE_CHANGE) {
- // Snap back to the previous keyboard mode if the user chords the mode change key and
- // other key, then released the mode change key.
- if (mKeyboardSwitcher.isInChordingAutoModeSwitchState())
- changeKeyboardMode();
- mSymbolKeyState.onRelease();
+ switcher.keyReleased();
+ final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
+ if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) {
+ switcher.onReleaseShift();
+ } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
+ switcher.onReleaseSymbol();
}
}
- private FieldContext makeFieldContext() {
- return new FieldContext(
- getCurrentInputConnection(),
- getCurrentInputEditorInfo(),
- mLanguageSwitcher.getInputLanguage(),
- mLanguageSwitcher.getEnabledLanguages());
- }
-
- private boolean fieldCanDoVoice(FieldContext fieldContext) {
- return !mPasswordText
- && mVoiceInput != null
- && !mVoiceInput.isBlacklistedField(fieldContext);
- }
-
- private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) {
- return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext)
- && !(attribute != null
- && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions))
- && SpeechRecognizer.isRecognitionAvailable(this);
- }
- // receive ringer mode changes to detect silent mode
+ // receive ringer mode change and network state change.
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- updateRingerMode();
+ final String action = intent.getAction();
+ if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
+ updateRingerMode();
+ } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
+ mSubtypeSwitcher.onNetworkStateChanged(intent);
+ }
}
};
@@ -2372,13 +2027,13 @@ public class LatinIME extends InputMethodService
// FIXME: These should be triggered after auto-repeat logic
int sound = AudioManager.FX_KEYPRESS_STANDARD;
switch (primaryCode) {
- case Keyboard.KEYCODE_DELETE:
+ case Keyboard.CODE_DELETE:
sound = AudioManager.FX_KEYPRESS_DELETE;
break;
- case KEYCODE_ENTER:
+ case Keyboard.CODE_ENTER:
sound = AudioManager.FX_KEYPRESS_RETURN;
break;
- case KEYCODE_SPACE:
+ case Keyboard.CODE_SPACE:
sound = AudioManager.FX_KEYPRESS_SPACEBAR;
break;
}
@@ -2386,48 +2041,28 @@ public class LatinIME extends InputMethodService
}
}
- private void vibrate() {
+ public void vibrate() {
if (!mVibrateOn) {
return;
}
- if (mKeyboardSwitcher.getInputView() != null) {
- mKeyboardSwitcher.getInputView().performHapticFeedback(
+ LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+ if (inputView != null) {
+ inputView.performHapticFeedback(
HapticFeedbackConstants.KEYBOARD_TAP,
HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
}
}
- private void checkTutorial(String privateImeOptions) {
- if (privateImeOptions == null) return;
- if (privateImeOptions.equals("com.android.setupwizard:ShowTutorial")) {
- if (mTutorial == null) startTutorial();
- } else if (privateImeOptions.equals("com.android.setupwizard:HideTutorial")) {
- if (mTutorial != null) {
- if (mTutorial.close()) {
- mTutorial = null;
- }
- }
- }
- }
-
- private void startTutorial() {
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_TUTORIAL), 500);
- }
-
- /* package */ void tutorialDone() {
- mTutorial = null;
- }
-
- /* package */ void promoteToUserDictionary(String word, int frequency) {
+ public void promoteToUserDictionary(String word, int frequency) {
if (mUserDictionary.isValidWord(word)) return;
mUserDictionary.addWord(word, frequency);
}
- /* package */ WordComposer getCurrentWord() {
+ public WordComposer getCurrentWord() {
return mWord;
}
- /* package */ boolean getPopupOn() {
+ public boolean getPopupOn() {
return mPopupOn;
}
@@ -2445,22 +2080,34 @@ public class LatinIME extends InputMethodService
}
}
- private void updateAutoTextEnabled(Locale systemLocale) {
+ private void updateAutoTextEnabled() {
if (mSuggest == null) return;
- boolean different =
- !systemLocale.getLanguage().equalsIgnoreCase(mInputLocale.substring(0, 2));
- mSuggest.setAutoTextEnabled(!different && mQuickFixes);
+ mSuggest.setAutoTextEnabled(mQuickFixes
+ && SubtypeSwitcher.getInstance().isSystemLanguageSameAsInputLanguage());
+ }
+
+ private void updateSuggestionVisibility(SharedPreferences prefs) {
+ final Resources res = mResources;
+ final String suggestionVisiblityStr = prefs.getString(
+ Settings.PREF_SHOW_SUGGESTIONS_SETTING,
+ res.getString(R.string.prefs_suggestion_visibility_default_value));
+ for (int visibility : SUGGESTION_VISIBILITY_VALUE_ARRAY) {
+ if (suggestionVisiblityStr.equals(res.getString(visibility))) {
+ mSuggestionVisibility = visibility;
+ break;
+ }
+ }
}
protected void launchSettings() {
- launchSettings(LatinIMESettings.class);
+ launchSettings(Settings.class);
}
public void launchDebugSettings() {
- launchSettings(LatinIMEDebugSettings.class);
+ launchSettings(DebugSettings.class);
}
- protected void launchSettings (Class<? extends PreferenceActivity> settingsClass) {
+ protected void launchSettings(Class<? extends PreferenceActivity> settingsClass) {
handleClose();
Intent intent = new Intent();
intent.setClass(LatinIME.this, settingsClass);
@@ -2468,97 +2115,176 @@ public class LatinIME extends InputMethodService
startActivity(intent);
}
- private void loadSettings() {
+ private void loadSettings(EditorInfo attribute) {
// Get the settings preferences
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
- mVibrateOn = sp.getBoolean(PREF_VIBRATE_ON, false);
- mSoundOn = sp.getBoolean(PREF_SOUND_ON, false);
- mPopupOn = sp.getBoolean(PREF_POPUP_ON,
- mResources.getBoolean(R.bool.default_popup_preview));
- mAutoCap = sp.getBoolean(PREF_AUTO_CAP, true);
- mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true);
- mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false);
- mHasUsedVoiceInputUnsupportedLocale =
- sp.getBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, false);
-
- // Get the current list of supported locales and check the current locale against that
- // list. We cache this value so as not to check it every time the user starts a voice
- // input. Because this method is called by onStartInputView, this should mean that as
- // long as the locale doesn't change while the user is keeping the IME open, the
- // value should never be stale.
- String supportedLocalesString = SettingsUtil.getSettingsString(
- getContentResolver(),
- SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES,
- DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES);
- ArrayList<String> voiceInputSupportedLocales =
- newArrayList(supportedLocalesString.split("\\s+"));
-
- mLocaleSupportedForVoiceInput = voiceInputSupportedLocales.contains(mInputLocale);
-
- mShowSuggestions = sp.getBoolean(PREF_SHOW_SUGGESTIONS, true);
-
- if (VOICE_INSTALLED) {
- final String voiceMode = sp.getString(PREF_VOICE_MODE,
- getString(R.string.voice_mode_main));
- boolean enableVoice = !voiceMode.equals(getString(R.string.voice_mode_off))
- && mEnableVoiceButton;
- boolean voiceOnPrimary = voiceMode.equals(getString(R.string.voice_mode_main));
- if (mKeyboardSwitcher != null &&
- (enableVoice != mEnableVoice || voiceOnPrimary != mVoiceOnPrimary)) {
- mKeyboardSwitcher.setVoiceMode(enableVoice, voiceOnPrimary);
+ final SharedPreferences prefs = mPrefs;
+ Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+ mVibrateOn = vibrator != null && vibrator.hasVibrator()
+ && prefs.getBoolean(Settings.PREF_VIBRATE_ON, false);
+ mSoundOn = prefs.getBoolean(Settings.PREF_SOUND_ON, false);
+ mPopupOn = prefs.getBoolean(Settings.PREF_POPUP_ON,
+ mResources.getBoolean(R.bool.config_default_popup_preview));
+ mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true);
+ mQuickFixes = isQuickFixesEnabled(prefs);
+
+ mAutoCorrectEnabled = isAutoCorrectEnabled(prefs);
+ mBigramSuggestionEnabled = mAutoCorrectEnabled && isBigramSuggestionEnabled(prefs);
+ loadAndSetAutoCorrectionThreshold(prefs);
+
+ mVoiceConnector.loadSettings(attribute, prefs);
+
+ updateCorrectionMode();
+ updateAutoTextEnabled();
+ updateSuggestionVisibility(prefs);
+ SubtypeSwitcher.getInstance().loadSettings();
+ }
+
+ /**
+ * Load Auto correction threshold from SharedPreferences, and modify mSuggest's threshold.
+ */
+ private void loadAndSetAutoCorrectionThreshold(SharedPreferences sp) {
+ // When mSuggest is not initialized, cannnot modify mSuggest's threshold.
+ if (mSuggest == null) return;
+ // When auto correction setting is turned off, the threshold is ignored.
+ if (!isAutoCorrectEnabled(sp)) return;
+
+ final String currentAutoCorrectionSetting = sp.getString(
+ Settings.PREF_AUTO_CORRECTION_THRESHOLD,
+ mResources.getString(R.string.auto_correction_threshold_mode_index_modest));
+ final String[] autoCorrectionThresholdValues = mResources.getStringArray(
+ R.array.auto_correction_threshold_values);
+ // When autoCrrectionThreshold is greater than 1.0, auto correction is virtually turned off.
+ double autoCorrectionThreshold = Double.MAX_VALUE;
+ try {
+ final int arrayIndex = Integer.valueOf(currentAutoCorrectionSetting);
+ if (arrayIndex >= 0 && arrayIndex < autoCorrectionThresholdValues.length) {
+ autoCorrectionThreshold = Double.parseDouble(
+ autoCorrectionThresholdValues[arrayIndex]);
}
- mEnableVoice = enableVoice;
- mVoiceOnPrimary = voiceOnPrimary;
+ } catch (NumberFormatException e) {
+ // Whenever the threshold settings are correct, never come here.
+ autoCorrectionThreshold = Double.MAX_VALUE;
+ Log.w(TAG, "Cannot load auto correction threshold setting."
+ + " currentAutoCorrectionSetting: " + currentAutoCorrectionSetting
+ + ", autoCorrectionThresholdValues: "
+ + Arrays.toString(autoCorrectionThresholdValues));
}
- mAutoCorrectEnabled = sp.getBoolean(PREF_AUTO_COMPLETE,
- mResources.getBoolean(R.bool.enable_autocorrect)) & mShowSuggestions;
- //mBigramSuggestionEnabled = sp.getBoolean(
- // PREF_BIGRAM_SUGGESTIONS, true) & mShowSuggestions;
- updateCorrectionMode();
- updateAutoTextEnabled(mResources.getConfiguration().locale);
- mLanguageSwitcher.loadLocales(sp);
+ // TODO: This should be refactored :
+ // setAutoCorrectionThreshold should be called outside of this method.
+ mSuggest.setAutoCorrectionThreshold(autoCorrectionThreshold);
+ }
+
+ private boolean isQuickFixesEnabled(SharedPreferences sp) {
+ final boolean showQuickFixesOption = mResources.getBoolean(
+ R.bool.config_enable_quick_fixes_option);
+ if (!showQuickFixesOption) {
+ return isAutoCorrectEnabled(sp);
+ }
+ return sp.getBoolean(Settings.PREF_QUICK_FIXES, mResources.getBoolean(
+ R.bool.config_default_quick_fixes));
+ }
+
+ private boolean isAutoCorrectEnabled(SharedPreferences sp) {
+ final String currentAutoCorrectionSetting = sp.getString(
+ Settings.PREF_AUTO_CORRECTION_THRESHOLD,
+ mResources.getString(R.string.auto_correction_threshold_mode_index_modest));
+ final String autoCorrectionOff = mResources.getString(
+ R.string.auto_correction_threshold_mode_index_off);
+ return !currentAutoCorrectionSetting.equals(autoCorrectionOff);
+ }
+
+ private boolean isBigramSuggestionEnabled(SharedPreferences sp) {
+ final boolean showBigramSuggestionsOption = mResources.getBoolean(
+ R.bool.config_enable_bigram_suggestions_option);
+ if (!showBigramSuggestionsOption) {
+ return isAutoCorrectEnabled(sp);
+ }
+ return sp.getBoolean(Settings.PREF_BIGRAM_SUGGESTIONS, mResources.getBoolean(
+ R.bool.config_default_bigram_suggestions));
}
private void initSuggestPuncList() {
- mSuggestPuncList = new ArrayList<CharSequence>();
- mSuggestPuncs = mResources.getString(R.string.suggested_punctuations);
- if (mSuggestPuncs != null) {
- for (int i = 0; i < mSuggestPuncs.length(); i++) {
- mSuggestPuncList.add(mSuggestPuncs.subSequence(i, i + 1));
+ if (mSuggestPuncs != null || mSuggestPuncList != null)
+ return;
+ SuggestedWords.Builder builder = new SuggestedWords.Builder();
+ String puncs = mResources.getString(R.string.suggested_punctuations);
+ if (puncs != null) {
+ for (int i = 0; i < puncs.length(); i++) {
+ builder.addWord(puncs.subSequence(i, i + 1));
}
}
+ mSuggestPuncList = builder.build();
+ mSuggestPuncs = puncs;
}
private boolean isSuggestedPunctuation(int code) {
return mSuggestPuncs.contains(String.valueOf((char)code));
}
- private void showOptionsMenu() {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setCancelable(true);
- builder.setIcon(R.drawable.ic_dialog_keyboard);
- builder.setNegativeButton(android.R.string.cancel, null);
- CharSequence itemSettings = getString(R.string.english_ime_settings);
- CharSequence itemInputMethod = getString(R.string.selectInputMethod);
- builder.setItems(new CharSequence[] {
- itemInputMethod, itemSettings},
- new DialogInterface.OnClickListener() {
+ private void showSubtypeSelectorAndSettings() {
+ final CharSequence title = getString(R.string.english_ime_input_options);
+ final CharSequence[] items = new CharSequence[] {
+ // TODO: Should use new string "Select active input modes".
+ getString(R.string.language_selection_title),
+ getString(R.string.english_ime_settings),
+ };
+ final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface di, int position) {
+ di.dismiss();
+ switch (position) {
+ case 0:
+ Intent intent = new Intent(
+ android.provider.Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.putExtra(android.provider.Settings.EXTRA_INPUT_METHOD_ID,
+ mInputMethodId);
+ startActivity(intent);
+ break;
+ case 1:
+ launchSettings();
+ break;
+ }
+ }
+ };
+ showOptionsMenuInternal(title, items, listener);
+ }
+ private void showOptionsMenu() {
+ final CharSequence title = getString(R.string.english_ime_input_options);
+ final CharSequence[] items = new CharSequence[] {
+ getString(R.string.selectInputMethod),
+ getString(R.string.english_ime_settings),
+ };
+ final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface di, int position) {
di.dismiss();
switch (position) {
- case POS_SETTINGS:
- launchSettings();
- break;
- case POS_METHOD:
- ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE))
- .showInputMethodPicker();
- break;
+ case 0:
+ launchSettings();
+ break;
+ case 1:
+ mImm.showInputMethodPicker();
+ break;
}
}
- });
- builder.setTitle(mResources.getString(R.string.english_ime_input_options));
+ };
+ showOptionsMenuInternal(title, items, listener);
+ }
+
+ private void showOptionsMenuInternal(CharSequence title, CharSequence[] items,
+ DialogInterface.OnClickListener listener) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setCancelable(true);
+ builder.setIcon(R.drawable.ic_dialog_keyboard);
+ builder.setNegativeButton(android.R.string.cancel, null);
+ builder.setItems(items, listener);
+ builder.setTitle(title);
mOptionsDialog = builder.create();
+ mOptionsDialog.setCanceledOnTouchOutside(true);
Window window = mOptionsDialog.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.token = mKeyboardSwitcher.getInputView().getWindowToken();
@@ -2568,22 +2294,6 @@ public class LatinIME extends InputMethodService
mOptionsDialog.show();
}
- public void changeKeyboardMode() {
- mKeyboardSwitcher.toggleSymbols();
- if (mCapsLock && mKeyboardSwitcher.isAlphabetMode()) {
- mKeyboardSwitcher.setShiftLocked(mCapsLock);
- }
-
- updateShiftKeyState(getCurrentInputEditorInfo());
- }
-
- public static <E> ArrayList<E> newArrayList(E... elements) {
- int capacity = (elements.length * 110) / 100 + 5;
- ArrayList<E> list = new ArrayList<E>(capacity);
- Collections.addAll(list, elements);
- return list;
- }
-
@Override
protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
super.dump(fd, fout, args);
@@ -2591,14 +2301,13 @@ public class LatinIME extends InputMethodService
final Printer p = new PrintWriterPrinter(fout);
p.println("LatinIME state :");
p.println(" Keyboard mode = " + mKeyboardSwitcher.getKeyboardMode());
- p.println(" mCapsLock=" + mCapsLock);
p.println(" mComposing=" + mComposing.toString());
- p.println(" mPredictionOn=" + mPredictionOn);
+ p.println(" mIsSuggestionsRequested=" + mIsSettingsSuggestionStripOn);
p.println(" mCorrectionMode=" + mCorrectionMode);
- p.println(" mPredicting=" + mPredicting);
+ p.println(" mHasValidSuggestions=" + mHasValidSuggestions);
p.println(" mAutoCorrectOn=" + mAutoCorrectOn);
p.println(" mAutoSpace=" + mAutoSpace);
- p.println(" mCompletionOn=" + mCompletionOn);
+ p.println(" mApplicationSpecifiedCompletionOn=" + mApplicationSpecifiedCompletionOn);
p.println(" TextEntryState.state=" + TextEntryState.getState());
p.println(" mSoundOn=" + mSoundOn);
p.println(" mVibrateOn=" + mVibrateOn);
@@ -2623,7 +2332,8 @@ public class LatinIME extends InputMethodService
System.out.println("CPS = " + ((CPS_BUFFER_SIZE * 1000f) / total));
}
- public void onAutoCompletionStateChanged(boolean isAutoCompletion) {
- mKeyboardSwitcher.onAutoCompletionStateChanged(isAutoCompletion);
+ @Override
+ public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) {
+ SubtypeSwitcher.getInstance().updateSubtype(subtype);
}
}
diff --git a/java/src/com/android/inputmethod/latin/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/LatinIMESettings.java
deleted file mode 100644
index ffff33da2..000000000
--- a/java/src/com/android/inputmethod/latin/LatinIMESettings.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import java.util.ArrayList;
-import java.util.Locale;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.backup.BackupManager;
-import android.content.DialogInterface;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.preference.CheckBoxPreference;
-import android.preference.ListPreference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceGroup;
-import android.speech.SpeechRecognizer;
-import android.text.AutoText;
-import android.util.Log;
-
-import com.android.inputmethod.voice.SettingsUtil;
-import com.android.inputmethod.voice.VoiceInputLogger;
-
-public class LatinIMESettings extends PreferenceActivity
- implements SharedPreferences.OnSharedPreferenceChangeListener,
- DialogInterface.OnDismissListener {
-
- private static final String QUICK_FIXES_KEY = "quick_fixes";
- private static final String PREDICTION_SETTINGS_KEY = "prediction_settings";
- private static final String VOICE_SETTINGS_KEY = "voice_mode";
- /* package */ static final String PREF_SETTINGS_KEY = "settings_key";
-
- private static final String TAG = "LatinIMESettings";
-
- // Dialog ids
- private static final int VOICE_INPUT_CONFIRM_DIALOG = 0;
-
- private CheckBoxPreference mQuickFixes;
- private ListPreference mVoicePreference;
- private ListPreference mSettingsKeyPreference;
- private boolean mVoiceOn;
-
- private VoiceInputLogger mLogger;
-
- private boolean mOkClicked = false;
- private String mVoiceModeOff;
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- addPreferencesFromResource(R.xml.prefs);
- mQuickFixes = (CheckBoxPreference) findPreference(QUICK_FIXES_KEY);
- mVoicePreference = (ListPreference) findPreference(VOICE_SETTINGS_KEY);
- mSettingsKeyPreference = (ListPreference) findPreference(PREF_SETTINGS_KEY);
- SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
- prefs.registerOnSharedPreferenceChangeListener(this);
-
- mVoiceModeOff = getString(R.string.voice_mode_off);
- mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff));
- mLogger = VoiceInputLogger.getLogger(this);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- int autoTextSize = AutoText.getSize(getListView());
- if (autoTextSize < 1) {
- ((PreferenceGroup) findPreference(PREDICTION_SETTINGS_KEY))
- .removePreference(mQuickFixes);
- }
- if (!LatinIME.VOICE_INSTALLED
- || !SpeechRecognizer.isRecognitionAvailable(this)) {
- getPreferenceScreen().removePreference(mVoicePreference);
- } else {
- updateVoiceModeSummary();
- }
- updateSettingsKeySummary();
- }
-
- @Override
- protected void onDestroy() {
- getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
- this);
- super.onDestroy();
- }
-
- public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
- (new BackupManager(this)).dataChanged();
- // If turning on voice input, show dialog
- if (key.equals(VOICE_SETTINGS_KEY) && !mVoiceOn) {
- if (!prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff)
- .equals(mVoiceModeOff)) {
- showVoiceConfirmation();
- }
- }
- mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff));
- updateVoiceModeSummary();
- updateSettingsKeySummary();
- }
-
- private void updateSettingsKeySummary() {
- mSettingsKeyPreference.setSummary(
- getResources().getStringArray(R.array.settings_key_modes)
- [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]);
- }
-
- private void showVoiceConfirmation() {
- mOkClicked = false;
- showDialog(VOICE_INPUT_CONFIRM_DIALOG);
- }
-
- private void updateVoiceModeSummary() {
- mVoicePreference.setSummary(
- getResources().getStringArray(R.array.voice_input_modes_summary)
- [mVoicePreference.findIndexOfValue(mVoicePreference.getValue())]);
- }
-
- @Override
- protected Dialog onCreateDialog(int id) {
- switch (id) {
- case VOICE_INPUT_CONFIRM_DIALOG:
- DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- if (whichButton == DialogInterface.BUTTON_NEGATIVE) {
- mVoicePreference.setValue(mVoiceModeOff);
- mLogger.settingsWarningDialogCancel();
- } else if (whichButton == DialogInterface.BUTTON_POSITIVE) {
- mOkClicked = true;
- mLogger.settingsWarningDialogOk();
- }
- updateVoicePreference();
- }
- };
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.voice_warning_title)
- .setPositiveButton(android.R.string.ok, listener)
- .setNegativeButton(android.R.string.cancel, listener);
-
- // Get the current list of supported locales and check the current locale against
- // that list, to decide whether to put a warning that voice input will not work in
- // the current language as part of the pop-up confirmation dialog.
- String supportedLocalesString = SettingsUtil.getSettingsString(
- getContentResolver(),
- SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES,
- LatinIME.DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES);
- ArrayList<String> voiceInputSupportedLocales =
- LatinIME.newArrayList(supportedLocalesString.split("\\s+"));
- boolean localeSupported = voiceInputSupportedLocales.contains(
- Locale.getDefault().toString());
-
- if (localeSupported) {
- String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" +
- getString(R.string.voice_hint_dialog_message);
- builder.setMessage(message);
- } else {
- String message = getString(R.string.voice_warning_locale_not_supported) +
- "\n\n" + getString(R.string.voice_warning_may_not_understand) + "\n\n" +
- getString(R.string.voice_hint_dialog_message);
- builder.setMessage(message);
- }
-
- AlertDialog dialog = builder.create();
- dialog.setOnDismissListener(this);
- mLogger.settingsWarningDialogShown();
- return dialog;
- default:
- Log.e(TAG, "unknown dialog " + id);
- return null;
- }
- }
-
- public void onDismiss(DialogInterface dialog) {
- mLogger.settingsWarningDialogDismissed();
- if (!mOkClicked) {
- // This assumes that onPreferenceClick gets called first, and this if the user
- // agreed after the warning, we set the mOkClicked value to true.
- mVoicePreference.setValue(mVoiceModeOff);
- }
- }
-
- private void updateVoicePreference() {
- boolean isChecked = !mVoicePreference.getValue().equals(mVoiceModeOff);
- if (isChecked) {
- mLogger.voiceInputSettingEnabled();
- } else {
- mLogger.voiceInputSettingDisabled();
- }
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java
deleted file mode 100644
index 85ecaee50..000000000
--- a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.view.inputmethod.InputMethodManager;
-
-import android.content.Context;
-import android.os.AsyncTask;
-import android.text.format.DateUtils;
-import android.util.Log;
-
-public class LatinIMEUtil {
-
- /**
- * Cancel an {@link AsyncTask}.
- *
- * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this
- * task should be interrupted; otherwise, in-progress tasks are allowed
- * to complete.
- */
- public static void cancelTask(AsyncTask<?, ?, ?> task, boolean mayInterruptIfRunning) {
- if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) {
- task.cancel(mayInterruptIfRunning);
- }
- }
-
- public static class GCUtils {
- private static final String TAG = "GCUtils";
- public static final int GC_TRY_COUNT = 2;
- // GC_TRY_LOOP_MAX is used for the hard limit of GC wait,
- // GC_TRY_LOOP_MAX should be greater than GC_TRY_COUNT.
- public static final int GC_TRY_LOOP_MAX = 5;
- private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS;
- private static GCUtils sInstance = new GCUtils();
- private int mGCTryCount = 0;
-
- public static GCUtils getInstance() {
- return sInstance;
- }
-
- public void reset() {
- mGCTryCount = 0;
- }
-
- public boolean tryGCOrWait(String metaData, Throwable t) {
- if (mGCTryCount == 0) {
- System.gc();
- }
- if (++mGCTryCount > GC_TRY_COUNT) {
- LatinImeLogger.logOnException(metaData, t);
- return false;
- } else {
- try {
- Thread.sleep(GC_INTERVAL);
- return true;
- } catch (InterruptedException e) {
- Log.e(TAG, "Sleep was interrupted.");
- LatinImeLogger.logOnException(metaData, t);
- return false;
- }
- }
- }
- }
-
- public static boolean hasMultipleEnabledIMEs(Context context) {
- return ((InputMethodManager) context.getSystemService(
- Context.INPUT_METHOD_SERVICE)).getEnabledInputMethodList().size() > 1;
- }
-
- /* package */ static class RingCharBuffer {
- private static RingCharBuffer sRingCharBuffer = new RingCharBuffer();
- private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC';
- private static final int INVALID_COORDINATE = -2;
- /* package */ static final int BUFSIZE = 20;
- private Context mContext;
- private boolean mEnabled = false;
- private int mEnd = 0;
- /* package */ int mLength = 0;
- private char[] mCharBuf = new char[BUFSIZE];
- private int[] mXBuf = new int[BUFSIZE];
- private int[] mYBuf = new int[BUFSIZE];
-
- private RingCharBuffer() {
- }
- public static RingCharBuffer getInstance() {
- return sRingCharBuffer;
- }
- public static RingCharBuffer init(Context context, boolean enabled) {
- sRingCharBuffer.mContext = context;
- sRingCharBuffer.mEnabled = enabled;
- return sRingCharBuffer;
- }
- private int normalize(int in) {
- int ret = in % BUFSIZE;
- return ret < 0 ? ret + BUFSIZE : ret;
- }
- public void push(char c, int x, int y) {
- if (!mEnabled) return;
- mCharBuf[mEnd] = c;
- mXBuf[mEnd] = x;
- mYBuf[mEnd] = y;
- mEnd = normalize(mEnd + 1);
- if (mLength < BUFSIZE) {
- ++mLength;
- }
- }
- public char pop() {
- if (mLength < 1) {
- return PLACEHOLDER_DELIMITER_CHAR;
- } else {
- mEnd = normalize(mEnd - 1);
- --mLength;
- return mCharBuf[mEnd];
- }
- }
- public char getLastChar() {
- if (mLength < 1) {
- return PLACEHOLDER_DELIMITER_CHAR;
- } else {
- return mCharBuf[normalize(mEnd - 1)];
- }
- }
- public int getPreviousX(char c, int back) {
- int index = normalize(mEnd - 2 - back);
- if (mLength <= back
- || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) {
- return INVALID_COORDINATE;
- } else {
- return mXBuf[index];
- }
- }
- public int getPreviousY(char c, int back) {
- int index = normalize(mEnd - 2 - back);
- if (mLength <= back
- || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) {
- return INVALID_COORDINATE;
- } else {
- return mYBuf[index];
- }
- }
- public String getLastString() {
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < mLength; ++i) {
- char c = mCharBuf[normalize(mEnd - 1 - i)];
- if (!((LatinIME)mContext).isWordSeparator(c)) {
- sb.append(c);
- } else {
- break;
- }
- }
- return sb.reverse().toString();
- }
- public void reset() {
- mLength = 0;
- }
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
index a8ab9cc98..aaecfffdd 100644
--- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java
+++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
@@ -16,19 +16,23 @@
package com.android.inputmethod.latin;
+import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.Dictionary.DataType;
import android.content.Context;
import android.content.SharedPreferences;
-import android.inputmethodservice.Keyboard;
+
import java.util.List;
public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener {
+ public static boolean sDBG = false;
+
+ @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
}
- public static void init(Context context) {
+ public static void init(Context context, SharedPreferences prefs) {
}
public static void commit() {
@@ -68,4 +72,6 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang
public static void onSetKeyboard(Keyboard kb) {
}
+ public static void onPrintAllUsabilityStudyLogs() {
+ }
}
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
deleted file mode 100644
index fbba55bad..000000000
--- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ /dev/null
@@ -1,1023 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.inputmethodservice.Keyboard;
-import android.text.TextPaint;
-import android.util.Log;
-import android.view.ViewConfiguration;
-import android.view.inputmethod.EditorInfo;
-
-import java.util.List;
-import java.util.Locale;
-
-public class LatinKeyboard extends Keyboard {
-
- private static final boolean DEBUG_PREFERRED_LETTER = false;
- private static final String TAG = "LatinKeyboard";
- private static final int OPACITY_FULLY_OPAQUE = 255;
- private static final int SPACE_LED_LENGTH_PERCENT = 80;
-
- private Drawable mShiftLockIcon;
- private Drawable mShiftLockPreviewIcon;
- private Drawable mOldShiftIcon;
- private Drawable mSpaceIcon;
- private Drawable mSpaceAutoCompletionIndicator;
- private Drawable mSpacePreviewIcon;
- private Drawable mMicIcon;
- private Drawable mMicPreviewIcon;
- private Drawable m123MicIcon;
- private Drawable m123MicPreviewIcon;
- private final Drawable mButtonArrowLeftIcon;
- private final Drawable mButtonArrowRightIcon;
- private Key mShiftKey;
- private Key mEnterKey;
- private Key mF1Key;
- private final Drawable mHintIcon;
- private Key mSpaceKey;
- private Key m123Key;
- private final int NUMBER_HINT_COUNT = 10;
- private Key[] mNumberHintKeys;
- private Drawable[] mNumberHintIcons = new Drawable[NUMBER_HINT_COUNT];
- private final int[] mSpaceKeyIndexArray;
- private int mSpaceDragStartX;
- private int mSpaceDragLastDiff;
- private Locale mLocale;
- private LanguageSwitcher mLanguageSwitcher;
- private final Resources mRes;
- private final Context mContext;
- private int mMode;
- // Whether this keyboard has voice icon on it
- private boolean mHasVoiceButton;
- // Whether voice icon is enabled at all
- private boolean mVoiceEnabled;
- private final boolean mIsAlphaKeyboard;
- private CharSequence m123Label;
- private boolean mCurrentlyInSpace;
- private SlidingLocaleDrawable mSlidingLocaleIcon;
- private int[] mPrefLetterFrequencies;
- private int mPrefLetter;
- private int mPrefLetterX;
- private int mPrefLetterY;
- private int mPrefDistance;
-
- // TODO: generalize for any keyboardId
- private boolean mIsBlackSym;
-
- // TODO: remove this attribute when either Keyboard.mDefaultVerticalGap or Key.parent becomes
- // non-private.
- private final int mVerticalGap;
-
- private static final int SHIFT_OFF = 0;
- private static final int SHIFT_ON = 1;
- private static final int SHIFT_LOCKED = 2;
-
- private int mShiftState = SHIFT_OFF;
-
- private static final float SPACEBAR_DRAG_THRESHOLD = 0.8f;
- private static final float OVERLAP_PERCENTAGE_LOW_PROB = 0.70f;
- private static final float OVERLAP_PERCENTAGE_HIGH_PROB = 0.85f;
- // Minimum width of space key preview (proportional to keyboard width)
- private static final float SPACEBAR_POPUP_MIN_RATIO = 0.4f;
- // Height in space key the language name will be drawn. (proportional to space key height)
- private static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f;
- // If the full language name needs to be smaller than this value to be drawn on space key,
- // its short language name will be used instead.
- private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f;
-
- private static int sSpacebarVerticalCorrection;
-
- public LatinKeyboard(Context context, int xmlLayoutResId) {
- this(context, xmlLayoutResId, 0);
- }
-
- public LatinKeyboard(Context context, int xmlLayoutResId, int mode) {
- super(context, xmlLayoutResId, mode);
- final Resources res = context.getResources();
- mContext = context;
- mMode = mode;
- mRes = res;
- mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked);
- mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked);
- setDefaultBounds(mShiftLockPreviewIcon);
- mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space);
- mSpaceAutoCompletionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led);
- mSpacePreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_space);
- mMicIcon = res.getDrawable(R.drawable.sym_keyboard_mic);
- mMicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_mic);
- setDefaultBounds(mMicPreviewIcon);
- mButtonArrowLeftIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_left);
- mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right);
- m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic);
- m123MicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_123_mic);
- mHintIcon = res.getDrawable(R.drawable.hint_popup);
- setDefaultBounds(m123MicPreviewIcon);
- sSpacebarVerticalCorrection = res.getDimensionPixelOffset(
- R.dimen.spacebar_vertical_correction);
- mIsAlphaKeyboard = xmlLayoutResId == R.xml.kbd_qwerty
- || xmlLayoutResId == R.xml.kbd_qwerty_black;
- // The index of space key is available only after Keyboard constructor has finished.
- mSpaceKeyIndexArray = new int[] { indexOf(LatinIME.KEYCODE_SPACE) };
- initializeNumberHintResources(context);
- // TODO remove this initialization after cleanup
- mVerticalGap = super.getVerticalGap();
- }
-
- private void initializeNumberHintResources(Context context) {
- final Resources res = context.getResources();
- mNumberHintIcons[0] = res.getDrawable(R.drawable.keyboard_hint_0);
- mNumberHintIcons[1] = res.getDrawable(R.drawable.keyboard_hint_1);
- mNumberHintIcons[2] = res.getDrawable(R.drawable.keyboard_hint_2);
- mNumberHintIcons[3] = res.getDrawable(R.drawable.keyboard_hint_3);
- mNumberHintIcons[4] = res.getDrawable(R.drawable.keyboard_hint_4);
- mNumberHintIcons[5] = res.getDrawable(R.drawable.keyboard_hint_5);
- mNumberHintIcons[6] = res.getDrawable(R.drawable.keyboard_hint_6);
- mNumberHintIcons[7] = res.getDrawable(R.drawable.keyboard_hint_7);
- mNumberHintIcons[8] = res.getDrawable(R.drawable.keyboard_hint_8);
- mNumberHintIcons[9] = res.getDrawable(R.drawable.keyboard_hint_9);
- }
-
- @Override
- protected Key createKeyFromXml(Resources res, Row parent, int x, int y,
- XmlResourceParser parser) {
- Key key = new LatinKey(res, parent, x, y, parser);
- switch (key.codes[0]) {
- case LatinIME.KEYCODE_ENTER:
- mEnterKey = key;
- break;
- case LatinKeyboardView.KEYCODE_F1:
- mF1Key = key;
- break;
- case LatinIME.KEYCODE_SPACE:
- mSpaceKey = key;
- break;
- case KEYCODE_MODE_CHANGE:
- m123Key = key;
- m123Label = key.label;
- break;
- }
-
- // For number hints on the upper-right corner of key
- if (mNumberHintKeys == null) {
- // NOTE: This protected method is being called from the base class constructor before
- // mNumberHintKeys gets initialized.
- mNumberHintKeys = new Key[NUMBER_HINT_COUNT];
- }
- int hintNumber = -1;
- if (LatinKeyboardBaseView.isNumberAtLeftmostPopupChar(key)) {
- hintNumber = key.popupCharacters.charAt(0) - '0';
- } else if (LatinKeyboardBaseView.isNumberAtRightmostPopupChar(key)) {
- hintNumber = key.popupCharacters.charAt(key.popupCharacters.length() - 1) - '0';
- }
- if (hintNumber >= 0 && hintNumber <= 9) {
- mNumberHintKeys[hintNumber] = key;
- }
-
- return key;
- }
-
- void setImeOptions(Resources res, int mode, int options) {
- mMode = mode;
- // TODO should clean up this method
- if (mEnterKey != null) {
- // Reset some of the rarely used attributes.
- mEnterKey.popupCharacters = null;
- mEnterKey.popupResId = 0;
- mEnterKey.text = null;
- switch (options&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) {
- case EditorInfo.IME_ACTION_GO:
- mEnterKey.iconPreview = null;
- mEnterKey.icon = null;
- mEnterKey.label = res.getText(R.string.label_go_key);
- break;
- case EditorInfo.IME_ACTION_NEXT:
- mEnterKey.iconPreview = null;
- mEnterKey.icon = null;
- mEnterKey.label = res.getText(R.string.label_next_key);
- break;
- case EditorInfo.IME_ACTION_DONE:
- mEnterKey.iconPreview = null;
- mEnterKey.icon = null;
- mEnterKey.label = res.getText(R.string.label_done_key);
- break;
- case EditorInfo.IME_ACTION_SEARCH:
- mEnterKey.iconPreview = res.getDrawable(
- R.drawable.sym_keyboard_feedback_search);
- mEnterKey.icon = res.getDrawable(mIsBlackSym ?
- R.drawable.sym_bkeyboard_search : R.drawable.sym_keyboard_search);
- mEnterKey.label = null;
- break;
- case EditorInfo.IME_ACTION_SEND:
- mEnterKey.iconPreview = null;
- mEnterKey.icon = null;
- mEnterKey.label = res.getText(R.string.label_send_key);
- break;
- default:
- if (mode == KeyboardSwitcher.MODE_IM) {
- mEnterKey.icon = mHintIcon;
- mEnterKey.iconPreview = null;
- mEnterKey.label = ":-)";
- mEnterKey.text = ":-) ";
- mEnterKey.popupResId = R.xml.popup_smileys;
- } else {
- mEnterKey.iconPreview = res.getDrawable(
- R.drawable.sym_keyboard_feedback_return);
- mEnterKey.icon = res.getDrawable(mIsBlackSym ?
- R.drawable.sym_bkeyboard_return : R.drawable.sym_keyboard_return);
- mEnterKey.label = null;
- }
- break;
- }
- // Set the initial size of the preview icon
- if (mEnterKey.iconPreview != null) {
- setDefaultBounds(mEnterKey.iconPreview);
- }
- }
- }
-
- void enableShiftLock() {
- int index = getShiftKeyIndex();
- if (index >= 0) {
- mShiftKey = getKeys().get(index);
- if (mShiftKey instanceof LatinKey) {
- ((LatinKey)mShiftKey).enableShiftLock();
- }
- mOldShiftIcon = mShiftKey.icon;
- }
- }
-
- void setShiftLocked(boolean shiftLocked) {
- if (mShiftKey != null) {
- if (shiftLocked) {
- mShiftKey.on = true;
- mShiftKey.icon = mShiftLockIcon;
- mShiftState = SHIFT_LOCKED;
- } else {
- mShiftKey.on = false;
- mShiftKey.icon = mShiftLockIcon;
- mShiftState = SHIFT_ON;
- }
- }
- }
-
- boolean isShiftLocked() {
- return mShiftState == SHIFT_LOCKED;
- }
-
- @Override
- public boolean setShifted(boolean shiftState) {
- boolean shiftChanged = false;
- if (mShiftKey != null) {
- if (shiftState == false) {
- shiftChanged = mShiftState != SHIFT_OFF;
- mShiftState = SHIFT_OFF;
- mShiftKey.on = false;
- mShiftKey.icon = mOldShiftIcon;
- } else {
- if (mShiftState == SHIFT_OFF) {
- shiftChanged = mShiftState == SHIFT_OFF;
- mShiftState = SHIFT_ON;
- mShiftKey.icon = mShiftLockIcon;
- }
- }
- } else {
- return super.setShifted(shiftState);
- }
- return shiftChanged;
- }
-
- @Override
- public boolean isShifted() {
- if (mShiftKey != null) {
- return mShiftState != SHIFT_OFF;
- } else {
- return super.isShifted();
- }
- }
-
- /* package */ boolean isAlphaKeyboard() {
- return mIsAlphaKeyboard;
- }
-
- public void setColorOfSymbolIcons(boolean isAutoCompletion, boolean isBlack) {
- mIsBlackSym = isBlack;
- if (isBlack) {
- mShiftLockIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_shift_locked);
- mSpaceIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_space);
- mMicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic);
- m123MicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_123_mic);
- } else {
- mShiftLockIcon = mRes.getDrawable(R.drawable.sym_keyboard_shift_locked);
- mSpaceIcon = mRes.getDrawable(R.drawable.sym_keyboard_space);
- mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic);
- m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic);
- }
- updateDynamicKeys();
- if (mSpaceKey != null) {
- updateSpaceBarForLocale(isAutoCompletion, isBlack);
- }
- updateNumberHintKeys();
- }
-
- private void setDefaultBounds(Drawable drawable) {
- drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
- }
-
- public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) {
- mHasVoiceButton = hasVoiceButton;
- mVoiceEnabled = hasVoice;
- updateDynamicKeys();
- }
-
- private void updateDynamicKeys() {
- update123Key();
- updateF1Key();
- }
-
- private void update123Key() {
- // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode.
- if (m123Key != null && mIsAlphaKeyboard) {
- if (mVoiceEnabled && !mHasVoiceButton) {
- m123Key.icon = m123MicIcon;
- m123Key.iconPreview = m123MicPreviewIcon;
- m123Key.label = null;
- } else {
- m123Key.icon = null;
- m123Key.iconPreview = null;
- m123Key.label = m123Label;
- }
- }
- }
-
- private void updateF1Key() {
- // Update KEYCODE_F1 key. Please note that some keyboard layouts have no F1 key.
- if (mF1Key == null)
- return;
-
- if (mIsAlphaKeyboard) {
- if (mMode == KeyboardSwitcher.MODE_URL) {
- setNonMicF1Key(mF1Key, "/", R.xml.popup_slash);
- } else if (mMode == KeyboardSwitcher.MODE_EMAIL) {
- setNonMicF1Key(mF1Key, "@", R.xml.popup_at);
- } else {
- if (mVoiceEnabled && mHasVoiceButton) {
- setMicF1Key(mF1Key);
- } else {
- setNonMicF1Key(mF1Key, ",", R.xml.popup_comma);
- }
- }
- } else { // Symbols keyboard
- if (mVoiceEnabled && mHasVoiceButton) {
- setMicF1Key(mF1Key);
- } else {
- setNonMicF1Key(mF1Key, ",", R.xml.popup_comma);
- }
- }
- }
-
- private void setMicF1Key(Key key) {
- // HACK: draw mMicIcon and mHintIcon at the same time
- final Drawable micWithSettingsHintDrawable = new BitmapDrawable(mRes,
- drawSynthesizedSettingsHintImage(key.width, key.height, mMicIcon, mHintIcon));
-
- key.label = null;
- key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE };
- key.popupResId = R.xml.popup_mic;
- key.icon = micWithSettingsHintDrawable;
- key.iconPreview = mMicPreviewIcon;
- }
-
- private void setNonMicF1Key(Key key, String label, int popupResId) {
- key.label = label;
- key.codes = new int[] { label.charAt(0) };
- key.popupResId = popupResId;
- key.icon = mHintIcon;
- key.iconPreview = null;
- }
-
- public boolean isF1Key(Key key) {
- return key == mF1Key;
- }
-
- public static boolean hasPuncOrSmileysPopup(Key key) {
- return key.popupResId == R.xml.popup_punctuation || key.popupResId == R.xml.popup_smileys;
- }
-
- /**
- * @return a key which should be invalidated.
- */
- public Key onAutoCompletionStateChanged(boolean isAutoCompletion) {
- updateSpaceBarForLocale(isAutoCompletion, mIsBlackSym);
- return mSpaceKey;
- }
-
- private void updateNumberHintKeys() {
- for (int i = 0; i < mNumberHintKeys.length; ++i) {
- if (mNumberHintKeys[i] != null) {
- mNumberHintKeys[i].icon = mNumberHintIcons[i];
- }
- }
- }
-
- public boolean isLanguageSwitchEnabled() {
- return mLocale != null;
- }
-
- private void updateSpaceBarForLocale(boolean isAutoCompletion, boolean isBlack) {
- // If application locales are explicitly selected.
- if (mLocale != null) {
- mSpaceKey.icon = new BitmapDrawable(mRes,
- drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack));
- } else {
- // sym_keyboard_space_led can be shared with Black and White symbol themes.
- if (isAutoCompletion) {
- mSpaceKey.icon = new BitmapDrawable(mRes,
- drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack));
- } else {
- mSpaceKey.icon = isBlack ? mRes.getDrawable(R.drawable.sym_bkeyboard_space)
- : mRes.getDrawable(R.drawable.sym_keyboard_space);
- }
- }
- }
-
- // Compute width of text with specified text size using paint.
- private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) {
- paint.setTextSize(textSize);
- paint.getTextBounds(text, 0, text.length(), bounds);
- return bounds.width();
- }
-
- // Overlay two images: mainIcon and hintIcon.
- private Bitmap drawSynthesizedSettingsHintImage(
- int width, int height, Drawable mainIcon, Drawable hintIcon) {
- if (mainIcon == null || hintIcon == null)
- return null;
- Rect hintIconPadding = new Rect(0, 0, 0, 0);
- hintIcon.getPadding(hintIconPadding);
- final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(buffer);
- canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR);
-
- // Draw main icon at the center of the key visual
- // Assuming the hintIcon shares the same padding with the key's background drawable
- final int drawableX = (width + hintIconPadding.left - hintIconPadding.right
- - mainIcon.getIntrinsicWidth()) / 2;
- final int drawableY = (height + hintIconPadding.top - hintIconPadding.bottom
- - mainIcon.getIntrinsicHeight()) / 2;
- setDefaultBounds(mainIcon);
- canvas.translate(drawableX, drawableY);
- mainIcon.draw(canvas);
- canvas.translate(-drawableX, -drawableY);
-
- // Draw hint icon fully in the key
- hintIcon.setBounds(0, 0, width, height);
- hintIcon.draw(canvas);
- return buffer;
- }
-
- // Layout local language name and left and right arrow on space bar.
- private static String layoutSpaceBar(Paint paint, Locale locale, Drawable lArrow,
- Drawable rArrow, int width, int height, float origTextSize,
- boolean allowVariableTextSize) {
- final float arrowWidth = lArrow.getIntrinsicWidth();
- final float arrowHeight = lArrow.getIntrinsicHeight();
- final float maxTextWidth = width - (arrowWidth + arrowWidth);
- final Rect bounds = new Rect();
-
- // Estimate appropriate language name text size to fit in maxTextWidth.
- String language = LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale));
- int textWidth = getTextWidth(paint, language, origTextSize, bounds);
- // Assuming text width and text size are proportional to each other.
- float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f);
-
- final boolean useShortName;
- if (allowVariableTextSize) {
- textWidth = getTextWidth(paint, language, textSize, bounds);
- // If text size goes too small or text does not fit, use short name
- useShortName = textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME
- || textWidth > maxTextWidth;
- } else {
- useShortName = textWidth > maxTextWidth;
- textSize = origTextSize;
- }
- if (useShortName) {
- language = LanguageSwitcher.toTitleCase(locale.getLanguage());
- textWidth = getTextWidth(paint, language, origTextSize, bounds);
- textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f);
- }
- paint.setTextSize(textSize);
-
- // Place left and right arrow just before and after language text.
- final float baseline = height * SPACEBAR_LANGUAGE_BASELINE;
- final int top = (int)(baseline - arrowHeight);
- final float remains = (width - textWidth) / 2;
- lArrow.setBounds((int)(remains - arrowWidth), top, (int)remains, (int)baseline);
- rArrow.setBounds((int)(remains + textWidth), top, (int)(remains + textWidth + arrowWidth),
- (int)baseline);
-
- return language;
- }
-
- private Bitmap drawSpaceBar(int opacity, boolean isAutoCompletion, boolean isBlack) {
- final int width = mSpaceKey.width;
- final int height = mSpaceIcon.getIntrinsicHeight();
- final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(buffer);
- canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR);
-
- // If application locales are explicitly selected.
- if (mLocale != null) {
- final Paint paint = new Paint();
- paint.setAlpha(opacity);
- paint.setAntiAlias(true);
- paint.setTextAlign(Align.CENTER);
-
- final boolean allowVariableTextSize = true;
- final String language = layoutSpaceBar(paint, mLanguageSwitcher.getInputLocale(),
- mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height,
- getTextSizeFromTheme(android.R.style.TextAppearance_Small, 14),
- allowVariableTextSize);
-
- // Draw language text with shadow
- final int shadowColor = mRes.getColor(isBlack
- ? R.color.latinkeyboard_bar_language_shadow_black
- : R.color.latinkeyboard_bar_language_shadow_white);
- final float baseline = height * SPACEBAR_LANGUAGE_BASELINE;
- final float descent = paint.descent();
- paint.setColor(shadowColor);
- canvas.drawText(language, width / 2, baseline - descent - 1, paint);
- paint.setColor(mRes.getColor(R.color.latinkeyboard_bar_language_text));
- canvas.drawText(language, width / 2, baseline - descent, paint);
-
- // Put arrows that are already layed out on either side of the text
- if (mLanguageSwitcher.getLocaleCount() > 1) {
- mButtonArrowLeftIcon.draw(canvas);
- mButtonArrowRightIcon.draw(canvas);
- }
- }
-
- // Draw the spacebar icon at the bottom
- if (isAutoCompletion) {
- final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100;
- final int iconHeight = mSpaceAutoCompletionIndicator.getIntrinsicHeight();
- int x = (width - iconWidth) / 2;
- int y = height - iconHeight;
- mSpaceAutoCompletionIndicator.setBounds(x, y, x + iconWidth, y + iconHeight);
- mSpaceAutoCompletionIndicator.draw(canvas);
- } else {
- final int iconWidth = mSpaceIcon.getIntrinsicWidth();
- final int iconHeight = mSpaceIcon.getIntrinsicHeight();
- int x = (width - iconWidth) / 2;
- int y = height - iconHeight;
- mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight);
- mSpaceIcon.draw(canvas);
- }
- return buffer;
- }
-
- private void updateLocaleDrag(int diff) {
- if (mSlidingLocaleIcon == null) {
- final int width = Math.max(mSpaceKey.width,
- (int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO));
- final int height = mSpacePreviewIcon.getIntrinsicHeight();
- mSlidingLocaleIcon = new SlidingLocaleDrawable(mSpacePreviewIcon, width, height);
- mSlidingLocaleIcon.setBounds(0, 0, width, height);
- mSpaceKey.iconPreview = mSlidingLocaleIcon;
- }
- mSlidingLocaleIcon.setDiff(diff);
- if (Math.abs(diff) == Integer.MAX_VALUE) {
- mSpaceKey.iconPreview = mSpacePreviewIcon;
- } else {
- mSpaceKey.iconPreview = mSlidingLocaleIcon;
- }
- mSpaceKey.iconPreview.invalidateSelf();
- }
-
- public int getLanguageChangeDirection() {
- if (mSpaceKey == null || mLanguageSwitcher.getLocaleCount() < 2
- || Math.abs(mSpaceDragLastDiff) < mSpaceKey.width * SPACEBAR_DRAG_THRESHOLD ) {
- return 0; // No change
- }
- return mSpaceDragLastDiff > 0 ? 1 : -1;
- }
-
- public void setLanguageSwitcher(LanguageSwitcher switcher, boolean isAutoCompletion,
- boolean isBlackSym) {
- mLanguageSwitcher = switcher;
- Locale locale = mLanguageSwitcher.getLocaleCount() > 0
- ? mLanguageSwitcher.getInputLocale()
- : null;
- // If the language count is 1 and is the same as the system language, don't show it.
- if (locale != null
- && mLanguageSwitcher.getLocaleCount() == 1
- && mLanguageSwitcher.getSystemLocale().getLanguage()
- .equalsIgnoreCase(locale.getLanguage())) {
- locale = null;
- }
- mLocale = locale;
- setColorOfSymbolIcons(isAutoCompletion, isBlackSym);
- }
-
- boolean isCurrentlyInSpace() {
- return mCurrentlyInSpace;
- }
-
- void setPreferredLetters(int[] frequencies) {
- mPrefLetterFrequencies = frequencies;
- mPrefLetter = 0;
- }
-
- void keyReleased() {
- mCurrentlyInSpace = false;
- mSpaceDragLastDiff = 0;
- mPrefLetter = 0;
- mPrefLetterX = 0;
- mPrefLetterY = 0;
- mPrefDistance = Integer.MAX_VALUE;
- if (mSpaceKey != null) {
- updateLocaleDrag(Integer.MAX_VALUE);
- }
- }
-
- /**
- * Does the magic of locking the touch gesture into the spacebar when
- * switching input languages.
- */
- boolean isInside(LatinKey key, int x, int y) {
- final int code = key.codes[0];
- if (code == KEYCODE_SHIFT ||
- code == KEYCODE_DELETE) {
- y -= key.height / 10;
- if (code == KEYCODE_SHIFT) x += key.width / 6;
- if (code == KEYCODE_DELETE) x -= key.width / 6;
- } else if (code == LatinIME.KEYCODE_SPACE) {
- y += LatinKeyboard.sSpacebarVerticalCorrection;
- if (mLanguageSwitcher.getLocaleCount() > 1) {
- if (mCurrentlyInSpace) {
- int diff = x - mSpaceDragStartX;
- if (Math.abs(diff - mSpaceDragLastDiff) > 0) {
- updateLocaleDrag(diff);
- }
- mSpaceDragLastDiff = diff;
- return true;
- } else {
- boolean insideSpace = key.isInsideSuper(x, y);
- if (insideSpace) {
- mCurrentlyInSpace = true;
- mSpaceDragStartX = x;
- updateLocaleDrag(0);
- }
- return insideSpace;
- }
- }
- } else if (mPrefLetterFrequencies != null) {
- // New coordinate? Reset
- if (mPrefLetterX != x || mPrefLetterY != y) {
- mPrefLetter = 0;
- mPrefDistance = Integer.MAX_VALUE;
- }
- // Handle preferred next letter
- final int[] pref = mPrefLetterFrequencies;
- if (mPrefLetter > 0) {
- if (DEBUG_PREFERRED_LETTER) {
- if (mPrefLetter == code && !key.isInsideSuper(x, y)) {
- Log.d(TAG, "CORRECTED !!!!!!");
- }
- }
- return mPrefLetter == code;
- } else {
- final boolean inside = key.isInsideSuper(x, y);
- int[] nearby = getNearestKeys(x, y);
- List<Key> nearbyKeys = getKeys();
- if (inside) {
- // If it's a preferred letter
- if (inPrefList(code, pref)) {
- // Check if its frequency is much lower than a nearby key
- mPrefLetter = code;
- mPrefLetterX = x;
- mPrefLetterY = y;
- for (int i = 0; i < nearby.length; i++) {
- Key k = nearbyKeys.get(nearby[i]);
- if (k != key && inPrefList(k.codes[0], pref)) {
- final int dist = distanceFrom(k, x, y);
- if (dist < (int) (k.width * OVERLAP_PERCENTAGE_LOW_PROB) &&
- (pref[k.codes[0]] > pref[mPrefLetter] * 3)) {
- mPrefLetter = k.codes[0];
- mPrefDistance = dist;
- if (DEBUG_PREFERRED_LETTER) {
- Log.d(TAG, "CORRECTED ALTHOUGH PREFERRED !!!!!!");
- }
- break;
- }
- }
- }
-
- return mPrefLetter == code;
- }
- }
-
- // Get the surrounding keys and intersect with the preferred list
- // For all in the intersection
- // if distance from touch point is within a reasonable distance
- // make this the pref letter
- // If no pref letter
- // return inside;
- // else return thiskey == prefletter;
-
- for (int i = 0; i < nearby.length; i++) {
- Key k = nearbyKeys.get(nearby[i]);
- if (inPrefList(k.codes[0], pref)) {
- final int dist = distanceFrom(k, x, y);
- if (dist < (int) (k.width * OVERLAP_PERCENTAGE_HIGH_PROB)
- && dist < mPrefDistance) {
- mPrefLetter = k.codes[0];
- mPrefLetterX = x;
- mPrefLetterY = y;
- mPrefDistance = dist;
- }
- }
- }
- // Didn't find any
- if (mPrefLetter == 0) {
- return inside;
- } else {
- return mPrefLetter == code;
- }
- }
- }
-
- // Lock into the spacebar
- if (mCurrentlyInSpace) return false;
-
- return key.isInsideSuper(x, y);
- }
-
- private boolean inPrefList(int code, int[] pref) {
- if (code < pref.length && code >= 0) return pref[code] > 0;
- return false;
- }
-
- private int distanceFrom(Key k, int x, int y) {
- if (y > k.y && y < k.y + k.height) {
- return Math.abs(k.x + k.width / 2 - x);
- } else {
- return Integer.MAX_VALUE;
- }
- }
-
- @Override
- public int[] getNearestKeys(int x, int y) {
- if (mCurrentlyInSpace) {
- return mSpaceKeyIndexArray;
- } else {
- // Avoid dead pixels at edges of the keyboard
- return super.getNearestKeys(Math.max(0, Math.min(x, getMinWidth() - 1)),
- Math.max(0, Math.min(y, getHeight() - 1)));
- }
- }
-
- private int indexOf(int code) {
- List<Key> keys = getKeys();
- int count = keys.size();
- for (int i = 0; i < count; i++) {
- if (keys.get(i).codes[0] == code) return i;
- }
- return -1;
- }
-
- private int getTextSizeFromTheme(int style, int defValue) {
- TypedArray array = mContext.getTheme().obtainStyledAttributes(
- style, new int[] { android.R.attr.textSize });
- int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue);
- return textSize;
- }
-
- // TODO LatinKey could be static class
- class LatinKey extends Keyboard.Key {
-
- // functional normal state (with properties)
- private final int[] KEY_STATE_FUNCTIONAL_NORMAL = {
- android.R.attr.state_single
- };
-
- // functional pressed state (with properties)
- private final int[] KEY_STATE_FUNCTIONAL_PRESSED = {
- android.R.attr.state_single,
- android.R.attr.state_pressed
- };
-
- private boolean mShiftLockEnabled;
-
- public LatinKey(Resources res, Keyboard.Row parent, int x, int y,
- XmlResourceParser parser) {
- super(res, parent, x, y, parser);
- if (popupCharacters != null && popupCharacters.length() == 0) {
- // If there is a keyboard with no keys specified in popupCharacters
- popupResId = 0;
- }
- }
-
- private void enableShiftLock() {
- mShiftLockEnabled = true;
- }
-
- // sticky is used for shift key. If a key is not sticky and is modifier,
- // the key will be treated as functional.
- private boolean isFunctionalKey() {
- return !sticky && modifier;
- }
-
- @Override
- public void onReleased(boolean inside) {
- if (!mShiftLockEnabled) {
- super.onReleased(inside);
- } else {
- pressed = !pressed;
- }
- }
-
- /**
- * Overriding this method so that we can reduce the target area for certain keys.
- */
- @Override
- public boolean isInside(int x, int y) {
- // TODO This should be done by parent.isInside(this, x, y)
- // if Key.parent were protected.
- boolean result = LatinKeyboard.this.isInside(this, x, y);
- return result;
- }
-
- boolean isInsideSuper(int x, int y) {
- return super.isInside(x, y);
- }
-
- @Override
- public int[] getCurrentDrawableState() {
- if (isFunctionalKey()) {
- if (pressed) {
- return KEY_STATE_FUNCTIONAL_PRESSED;
- } else {
- return KEY_STATE_FUNCTIONAL_NORMAL;
- }
- }
- return super.getCurrentDrawableState();
- }
-
- @Override
- public int squaredDistanceFrom(int x, int y) {
- // We should count vertical gap between rows to calculate the center of this Key.
- final int verticalGap = LatinKeyboard.this.mVerticalGap;
- final int xDist = this.x + width / 2 - x;
- final int yDist = this.y + (height + verticalGap) / 2 - y;
- return xDist * xDist + yDist * yDist;
- }
- }
-
- /**
- * Animation to be displayed on the spacebar preview popup when switching
- * languages by swiping the spacebar. It draws the current, previous and
- * next languages and moves them by the delta of touch movement on the spacebar.
- */
- class SlidingLocaleDrawable extends Drawable {
-
- private final int mWidth;
- private final int mHeight;
- private final Drawable mBackground;
- private final TextPaint mTextPaint;
- private final int mMiddleX;
- private final Drawable mLeftDrawable;
- private final Drawable mRightDrawable;
- private final int mThreshold;
- private int mDiff;
- private boolean mHitThreshold;
- private String mCurrentLanguage;
- private String mNextLanguage;
- private String mPrevLanguage;
-
- public SlidingLocaleDrawable(Drawable background, int width, int height) {
- mBackground = background;
- setDefaultBounds(mBackground);
- mWidth = width;
- mHeight = height;
- mTextPaint = new TextPaint();
- mTextPaint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18));
- mTextPaint.setColor(R.color.latinkeyboard_transparent);
- mTextPaint.setTextAlign(Align.CENTER);
- mTextPaint.setAlpha(OPACITY_FULLY_OPAQUE);
- mTextPaint.setAntiAlias(true);
- mMiddleX = (mWidth - mBackground.getIntrinsicWidth()) / 2;
- mLeftDrawable =
- mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_left);
- mRightDrawable =
- mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_right);
- mThreshold = ViewConfiguration.get(mContext).getScaledTouchSlop();
- }
-
- private void setDiff(int diff) {
- if (diff == Integer.MAX_VALUE) {
- mHitThreshold = false;
- mCurrentLanguage = null;
- return;
- }
- mDiff = diff;
- if (mDiff > mWidth) mDiff = mWidth;
- if (mDiff < -mWidth) mDiff = -mWidth;
- if (Math.abs(mDiff) > mThreshold) mHitThreshold = true;
- invalidateSelf();
- }
-
- private String getLanguageName(Locale locale) {
- return LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale));
- }
-
- @Override
- public void draw(Canvas canvas) {
- canvas.save();
- if (mHitThreshold) {
- Paint paint = mTextPaint;
- final int width = mWidth;
- final int height = mHeight;
- final int diff = mDiff;
- final Drawable lArrow = mLeftDrawable;
- final Drawable rArrow = mRightDrawable;
- canvas.clipRect(0, 0, width, height);
- if (mCurrentLanguage == null) {
- final LanguageSwitcher languageSwitcher = mLanguageSwitcher;
- mCurrentLanguage = getLanguageName(languageSwitcher.getInputLocale());
- mNextLanguage = getLanguageName(languageSwitcher.getNextInputLocale());
- mPrevLanguage = getLanguageName(languageSwitcher.getPrevInputLocale());
- }
- // Draw language text with shadow
- final float baseline = mHeight * SPACEBAR_LANGUAGE_BASELINE - paint.descent();
- paint.setColor(mRes.getColor(R.color.latinkeyboard_feedback_language_text));
- canvas.drawText(mCurrentLanguage, width / 2 + diff, baseline, paint);
- canvas.drawText(mNextLanguage, diff - width / 2, baseline, paint);
- canvas.drawText(mPrevLanguage, diff + width + width / 2, baseline, paint);
-
- setDefaultBounds(lArrow);
- rArrow.setBounds(width - rArrow.getIntrinsicWidth(), 0, width,
- rArrow.getIntrinsicHeight());
- lArrow.draw(canvas);
- rArrow.draw(canvas);
- }
- if (mBackground != null) {
- canvas.translate(mMiddleX, 0);
- mBackground.draw(canvas);
- }
- canvas.restore();
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
-
- @Override
- public void setAlpha(int alpha) {
- // Ignore
- }
-
- @Override
- public void setColorFilter(ColorFilter cf) {
- // Ignore
- }
-
- @Override
- public int getIntrinsicWidth() {
- return mWidth;
- }
-
- @Override
- public int getIntrinsicHeight() {
- return mHeight;
- }
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
deleted file mode 100644
index a5476e457..000000000
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.inputmethodservice.Keyboard;
-import android.inputmethodservice.Keyboard.Key;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-
-import java.util.List;
-
-public class LatinKeyboardView extends LatinKeyboardBaseView {
-
- static final int KEYCODE_OPTIONS = -100;
- static final int KEYCODE_OPTIONS_LONGPRESS = -101;
- static final int KEYCODE_VOICE = -102;
- static final int KEYCODE_F1 = -103;
- static final int KEYCODE_NEXT_LANGUAGE = -104;
- static final int KEYCODE_PREV_LANGUAGE = -105;
-
- private Keyboard mPhoneKeyboard;
-
- /** Whether we've started dropping move events because we found a big jump */
- private boolean mDroppingEvents;
- /**
- * Whether multi-touch disambiguation needs to be disabled if a real multi-touch event has
- * occured
- */
- private boolean mDisableDisambiguation;
- /** The distance threshold at which we start treating the touch session as a multi-touch */
- private int mJumpThresholdSquare = Integer.MAX_VALUE;
- /** The y coordinate of the last row */
- private int mLastRowY;
-
- public LatinKeyboardView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- public void setPhoneKeyboard(Keyboard phoneKeyboard) {
- mPhoneKeyboard = phoneKeyboard;
- }
-
- @Override
- public void setPreviewEnabled(boolean previewEnabled) {
- if (getKeyboard() == mPhoneKeyboard) {
- // Phone keyboard never shows popup preview (except language switch).
- super.setPreviewEnabled(false);
- } else {
- super.setPreviewEnabled(previewEnabled);
- }
- }
-
- @Override
- public void setKeyboard(Keyboard newKeyboard) {
- final Keyboard oldKeyboard = getKeyboard();
- if (oldKeyboard instanceof LatinKeyboard) {
- // Reset old keyboard state before switching to new keyboard.
- ((LatinKeyboard)oldKeyboard).keyReleased();
- }
- super.setKeyboard(newKeyboard);
- // One-seventh of the keyboard width seems like a reasonable threshold
- mJumpThresholdSquare = newKeyboard.getMinWidth() / 7;
- mJumpThresholdSquare *= mJumpThresholdSquare;
- // Assuming there are 4 rows, this is the coordinate of the last row
- mLastRowY = (newKeyboard.getHeight() * 3) / 4;
- setKeyboardLocal(newKeyboard);
- }
-
- @Override
- protected boolean onLongPress(Key key) {
- int primaryCode = key.codes[0];
- if (primaryCode == KEYCODE_OPTIONS) {
- return invokeOnKey(KEYCODE_OPTIONS_LONGPRESS);
- } else if (primaryCode == '0' && getKeyboard() == mPhoneKeyboard) {
- // Long pressing on 0 in phone number keypad gives you a '+'.
- return invokeOnKey('+');
- } else {
- return super.onLongPress(key);
- }
- }
-
- private boolean invokeOnKey(int primaryCode) {
- getOnKeyboardActionListener().onKey(primaryCode, null,
- LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE,
- LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE);
- return true;
- }
-
- @Override
- protected CharSequence adjustCase(CharSequence label) {
- Keyboard keyboard = getKeyboard();
- if (keyboard.isShifted()
- && keyboard instanceof LatinKeyboard
- && ((LatinKeyboard) keyboard).isAlphaKeyboard()
- && !TextUtils.isEmpty(label) && label.length() < 3
- && Character.isLowerCase(label.charAt(0))) {
- label = label.toString().toUpperCase();
- }
- return label;
- }
-
- public boolean setShiftLocked(boolean shiftLocked) {
- Keyboard keyboard = getKeyboard();
- if (keyboard instanceof LatinKeyboard) {
- ((LatinKeyboard)keyboard).setShiftLocked(shiftLocked);
- invalidateAllKeys();
- return true;
- }
- return false;
- }
-
- /**
- * This function checks to see if we need to handle any sudden jumps in the pointer location
- * that could be due to a multi-touch being treated as a move by the firmware or hardware.
- * Once a sudden jump is detected, all subsequent move events are discarded
- * until an UP is received.<P>
- * When a sudden jump is detected, an UP event is simulated at the last position and when
- * the sudden moves subside, a DOWN event is simulated for the second key.
- * @param me the motion event
- * @return true if the event was consumed, so that it doesn't continue to be handled by
- * KeyboardView.
- */
- private boolean handleSuddenJump(MotionEvent me) {
- final int action = me.getAction();
- final int x = (int) me.getX();
- final int y = (int) me.getY();
- boolean result = false;
-
- // Real multi-touch event? Stop looking for sudden jumps
- if (me.getPointerCount() > 1) {
- mDisableDisambiguation = true;
- }
- if (mDisableDisambiguation) {
- // If UP, reset the multi-touch flag
- if (action == MotionEvent.ACTION_UP) mDisableDisambiguation = false;
- return false;
- }
-
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- // Reset the "session"
- mDroppingEvents = false;
- mDisableDisambiguation = false;
- break;
- case MotionEvent.ACTION_MOVE:
- // Is this a big jump?
- final int distanceSquare = (mLastX - x) * (mLastX - x) + (mLastY - y) * (mLastY - y);
- // Check the distance and also if the move is not entirely within the bottom row
- // If it's only in the bottom row, it might be an intentional slide gesture
- // for language switching
- if (distanceSquare > mJumpThresholdSquare
- && (mLastY < mLastRowY || y < mLastRowY)) {
- // If we're not yet dropping events, start dropping and send an UP event
- if (!mDroppingEvents) {
- mDroppingEvents = true;
- // Send an up event
- MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
- MotionEvent.ACTION_UP,
- mLastX, mLastY, me.getMetaState());
- super.onTouchEvent(translated);
- translated.recycle();
- }
- result = true;
- } else if (mDroppingEvents) {
- // If moves are small and we're already dropping events, continue dropping
- result = true;
- }
- break;
- case MotionEvent.ACTION_UP:
- if (mDroppingEvents) {
- // Send a down event first, as we dropped a bunch of sudden jumps and assume that
- // the user is releasing the touch on the second key.
- MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
- MotionEvent.ACTION_DOWN,
- x, y, me.getMetaState());
- super.onTouchEvent(translated);
- translated.recycle();
- mDroppingEvents = false;
- // Let the up event get processed as well, result = false
- }
- break;
- }
- // Track the previous coordinate
- mLastX = x;
- mLastY = y;
- return result;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent me) {
- LatinKeyboard keyboard = (LatinKeyboard) getKeyboard();
- if (DEBUG_LINE) {
- mLastX = (int) me.getX();
- mLastY = (int) me.getY();
- invalidate();
- }
-
- // If there was a sudden jump, return without processing the actual motion event.
- if (handleSuddenJump(me))
- return true;
-
- // Reset any bounding box controls in the keyboard
- if (me.getAction() == MotionEvent.ACTION_DOWN) {
- keyboard.keyReleased();
- }
-
- if (me.getAction() == MotionEvent.ACTION_UP) {
- int languageDirection = keyboard.getLanguageChangeDirection();
- if (languageDirection != 0) {
- getOnKeyboardActionListener().onKey(
- languageDirection == 1 ? KEYCODE_NEXT_LANGUAGE : KEYCODE_PREV_LANGUAGE,
- null, mLastX, mLastY);
- me.setAction(MotionEvent.ACTION_CANCEL);
- keyboard.keyReleased();
- return super.onTouchEvent(me);
- }
- }
-
- return super.onTouchEvent(me);
- }
-
- /**************************** INSTRUMENTATION *******************************/
-
- static final boolean DEBUG_AUTO_PLAY = false;
- static final boolean DEBUG_LINE = false;
- private static final int MSG_TOUCH_DOWN = 1;
- private static final int MSG_TOUCH_UP = 2;
-
- Handler mHandler2;
-
- private String mStringToPlay;
- private int mStringIndex;
- private boolean mDownDelivered;
- private Key[] mAsciiKeys = new Key[256];
- private boolean mPlaying;
- private int mLastX;
- private int mLastY;
- private Paint mPaint;
-
- private void setKeyboardLocal(Keyboard k) {
- if (DEBUG_AUTO_PLAY) {
- findKeys();
- if (mHandler2 == null) {
- mHandler2 = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- removeMessages(MSG_TOUCH_DOWN);
- removeMessages(MSG_TOUCH_UP);
- if (mPlaying == false) return;
-
- switch (msg.what) {
- case MSG_TOUCH_DOWN:
- if (mStringIndex >= mStringToPlay.length()) {
- mPlaying = false;
- return;
- }
- char c = mStringToPlay.charAt(mStringIndex);
- while (c > 255 || mAsciiKeys[c] == null) {
- mStringIndex++;
- if (mStringIndex >= mStringToPlay.length()) {
- mPlaying = false;
- return;
- }
- c = mStringToPlay.charAt(mStringIndex);
- }
- int x = mAsciiKeys[c].x + 10;
- int y = mAsciiKeys[c].y + 26;
- MotionEvent me = MotionEvent.obtain(SystemClock.uptimeMillis(),
- SystemClock.uptimeMillis(),
- MotionEvent.ACTION_DOWN, x, y, 0);
- LatinKeyboardView.this.dispatchTouchEvent(me);
- me.recycle();
- sendEmptyMessageDelayed(MSG_TOUCH_UP, 500); // Deliver up in 500ms if nothing else
- // happens
- mDownDelivered = true;
- break;
- case MSG_TOUCH_UP:
- char cUp = mStringToPlay.charAt(mStringIndex);
- int x2 = mAsciiKeys[cUp].x + 10;
- int y2 = mAsciiKeys[cUp].y + 26;
- mStringIndex++;
-
- MotionEvent me2 = MotionEvent.obtain(SystemClock.uptimeMillis(),
- SystemClock.uptimeMillis(),
- MotionEvent.ACTION_UP, x2, y2, 0);
- LatinKeyboardView.this.dispatchTouchEvent(me2);
- me2.recycle();
- sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 500); // Deliver up in 500ms if nothing else
- // happens
- mDownDelivered = false;
- break;
- }
- }
- };
-
- }
- }
- }
-
- private void findKeys() {
- List<Key> keys = getKeyboard().getKeys();
- // Get the keys on this keyboard
- for (int i = 0; i < keys.size(); i++) {
- int code = keys.get(i).codes[0];
- if (code >= 0 && code <= 255) {
- mAsciiKeys[code] = keys.get(i);
- }
- }
- }
-
- public void startPlaying(String s) {
- if (DEBUG_AUTO_PLAY) {
- if (s == null) return;
- mStringToPlay = s.toLowerCase();
- mPlaying = true;
- mDownDelivered = false;
- mStringIndex = 0;
- mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 10);
- }
- }
-
- @Override
- public void draw(Canvas c) {
- LatinIMEUtil.GCUtils.getInstance().reset();
- boolean tryGC = true;
- for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
- try {
- super.draw(c);
- tryGC = false;
- } catch (OutOfMemoryError e) {
- tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait("LatinKeyboardView", e);
- }
- }
- if (DEBUG_AUTO_PLAY) {
- if (mPlaying) {
- mHandler2.removeMessages(MSG_TOUCH_DOWN);
- mHandler2.removeMessages(MSG_TOUCH_UP);
- if (mDownDelivered) {
- mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_UP, 20);
- } else {
- mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 20);
- }
- }
- }
- if (DEBUG_LINE) {
- if (mPaint == null) {
- mPaint = new Paint();
- mPaint.setColor(0x80FFFFFF);
- mPaint.setAntiAlias(false);
- }
- c.drawLine(mLastX, 0, mLastX, getHeight(), mPaint);
- c.drawLine(0, mLastY, getWidth(), mLastY, mPaint);
- }
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java
deleted file mode 100644
index b23b4d7b8..000000000
--- a/java/src/com/android/inputmethod/latin/PointerTracker.java
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import com.android.inputmethod.latin.LatinKeyboardBaseView.OnKeyboardActionListener;
-import com.android.inputmethod.latin.LatinKeyboardBaseView.UIHandler;
-
-import android.content.res.Resources;
-import android.inputmethodservice.Keyboard;
-import android.inputmethodservice.Keyboard.Key;
-import android.util.Log;
-import android.view.MotionEvent;
-
-public class PointerTracker {
- private static final String TAG = "PointerTracker";
- private static final boolean DEBUG = false;
- private static final boolean DEBUG_MOVE = false;
-
- public interface UIProxy {
- public void invalidateKey(Key key);
- public void showPreview(int keyIndex, PointerTracker tracker);
- public boolean hasDistinctMultitouch();
- }
-
- public final int mPointerId;
-
- // Timing constants
- private final int mDelayBeforeKeyRepeatStart;
- private final int mLongPressKeyTimeout;
- private final int mMultiTapKeyTimeout;
-
- // Miscellaneous constants
- private static final int NOT_A_KEY = LatinKeyboardBaseView.NOT_A_KEY;
- private static final int[] KEY_DELETE = { Keyboard.KEYCODE_DELETE };
-
- private final UIProxy mProxy;
- private final UIHandler mHandler;
- private final KeyDetector mKeyDetector;
- private OnKeyboardActionListener mListener;
- private final KeyboardSwitcher mKeyboardSwitcher;
- private final boolean mHasDistinctMultitouch;
-
- private Key[] mKeys;
- private int mKeyHysteresisDistanceSquared = -1;
-
- private final KeyState mKeyState;
-
- // true if keyboard layout has been changed.
- private boolean mKeyboardLayoutHasBeenChanged;
-
- // true if event is already translated to a key action (long press or mini-keyboard)
- private boolean mKeyAlreadyProcessed;
-
- // true if this pointer is repeatable key
- private boolean mIsRepeatableKey;
-
- // true if this pointer is in sliding key input
- private boolean mIsInSlidingKeyInput;
-
- // For multi-tap
- private int mLastSentIndex;
- private int mTapCount;
- private long mLastTapTime;
- private boolean mInMultiTap;
- private final StringBuilder mPreviewLabel = new StringBuilder(1);
-
- // pressed key
- private int mPreviousKey = NOT_A_KEY;
-
- // This class keeps track of a key index and a position where this pointer is.
- private static class KeyState {
- private final KeyDetector mKeyDetector;
-
- // The position and time at which first down event occurred.
- private int mStartX;
- private int mStartY;
- private long mDownTime;
-
- // The current key index where this pointer is.
- private int mKeyIndex = NOT_A_KEY;
- // The position where mKeyIndex was recognized for the first time.
- private int mKeyX;
- private int mKeyY;
-
- // Last pointer position.
- private int mLastX;
- private int mLastY;
-
- public KeyState(KeyDetector keyDetecor) {
- mKeyDetector = keyDetecor;
- }
-
- public int getKeyIndex() {
- return mKeyIndex;
- }
-
- public int getKeyX() {
- return mKeyX;
- }
-
- public int getKeyY() {
- return mKeyY;
- }
-
- public int getStartX() {
- return mStartX;
- }
-
- public int getStartY() {
- return mStartY;
- }
-
- public long getDownTime() {
- return mDownTime;
- }
-
- public int getLastX() {
- return mLastX;
- }
-
- public int getLastY() {
- return mLastY;
- }
-
- public int onDownKey(int x, int y, long eventTime) {
- mStartX = x;
- mStartY = y;
- mDownTime = eventTime;
-
- return onMoveToNewKey(onMoveKeyInternal(x, y), x, y);
- }
-
- private int onMoveKeyInternal(int x, int y) {
- mLastX = x;
- mLastY = y;
- return mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null);
- }
-
- public int onMoveKey(int x, int y) {
- return onMoveKeyInternal(x, y);
- }
-
- public int onMoveToNewKey(int keyIndex, int x, int y) {
- mKeyIndex = keyIndex;
- mKeyX = x;
- mKeyY = y;
- return keyIndex;
- }
-
- public int onUpKey(int x, int y) {
- return onMoveKeyInternal(x, y);
- }
- }
-
- public PointerTracker(int id, UIHandler handler, KeyDetector keyDetector, UIProxy proxy,
- Resources res) {
- if (proxy == null || handler == null || keyDetector == null)
- throw new NullPointerException();
- mPointerId = id;
- mProxy = proxy;
- mHandler = handler;
- mKeyDetector = keyDetector;
- mKeyboardSwitcher = KeyboardSwitcher.getInstance();
- mKeyState = new KeyState(keyDetector);
- mHasDistinctMultitouch = proxy.hasDistinctMultitouch();
- mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start);
- mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout);
- mMultiTapKeyTimeout = res.getInteger(R.integer.config_multi_tap_key_timeout);
- resetMultiTap();
- }
-
- public void setOnKeyboardActionListener(OnKeyboardActionListener listener) {
- mListener = listener;
- }
-
- public void setKeyboard(Key[] keys, float keyHysteresisDistance) {
- if (keys == null || keyHysteresisDistance < 0)
- throw new IllegalArgumentException();
- mKeys = keys;
- mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance);
- // Mark that keyboard layout has been changed.
- mKeyboardLayoutHasBeenChanged = true;
- }
-
- public boolean isInSlidingKeyInput() {
- return mIsInSlidingKeyInput;
- }
-
- private boolean isValidKeyIndex(int keyIndex) {
- return keyIndex >= 0 && keyIndex < mKeys.length;
- }
-
- public Key getKey(int keyIndex) {
- return isValidKeyIndex(keyIndex) ? mKeys[keyIndex] : null;
- }
-
- private boolean isModifierInternal(int keyIndex) {
- Key key = getKey(keyIndex);
- if (key == null)
- return false;
- int primaryCode = key.codes[0];
- return primaryCode == Keyboard.KEYCODE_SHIFT
- || primaryCode == Keyboard.KEYCODE_MODE_CHANGE;
- }
-
- public boolean isModifier() {
- return isModifierInternal(mKeyState.getKeyIndex());
- }
-
- public boolean isOnModifierKey(int x, int y) {
- return isModifierInternal(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null));
- }
-
- public boolean isSpaceKey(int keyIndex) {
- Key key = getKey(keyIndex);
- return key != null && key.codes[0] == LatinIME.KEYCODE_SPACE;
- }
-
- public void updateKey(int keyIndex) {
- if (mKeyAlreadyProcessed)
- return;
- int oldKeyIndex = mPreviousKey;
- mPreviousKey = keyIndex;
- if (keyIndex != oldKeyIndex) {
- if (isValidKeyIndex(oldKeyIndex)) {
- // if new key index is not a key, old key was just released inside of the key.
- final boolean inside = (keyIndex == NOT_A_KEY);
- mKeys[oldKeyIndex].onReleased(inside);
- mProxy.invalidateKey(mKeys[oldKeyIndex]);
- }
- if (isValidKeyIndex(keyIndex)) {
- mKeys[keyIndex].onPressed();
- mProxy.invalidateKey(mKeys[keyIndex]);
- }
- }
- }
-
- public void setAlreadyProcessed() {
- mKeyAlreadyProcessed = true;
- }
-
- public void onTouchEvent(int action, int x, int y, long eventTime) {
- switch (action) {
- case MotionEvent.ACTION_MOVE:
- onMoveEvent(x, y, eventTime);
- break;
- case MotionEvent.ACTION_DOWN:
- case MotionEvent.ACTION_POINTER_DOWN:
- onDownEvent(x, y, eventTime);
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_POINTER_UP:
- onUpEvent(x, y, eventTime);
- break;
- case MotionEvent.ACTION_CANCEL:
- onCancelEvent(x, y, eventTime);
- break;
- }
- }
-
- public void onDownEvent(int x, int y, long eventTime) {
- if (DEBUG)
- debugLog("onDownEvent:", x, y);
- int keyIndex = mKeyState.onDownKey(x, y, eventTime);
- mKeyboardLayoutHasBeenChanged = false;
- mKeyAlreadyProcessed = false;
- mIsRepeatableKey = false;
- mIsInSlidingKeyInput = false;
- checkMultiTap(eventTime, keyIndex);
- if (mListener != null) {
- if (isValidKeyIndex(keyIndex)) {
- mListener.onPress(mKeys[keyIndex].codes[0]);
- // This onPress call may have changed keyboard layout. Those cases are detected at
- // {@link #setKeyboard}. In those cases, we should update keyIndex according to the
- // new keyboard layout.
- if (mKeyboardLayoutHasBeenChanged) {
- mKeyboardLayoutHasBeenChanged = false;
- keyIndex = mKeyState.onDownKey(x, y, eventTime);
- }
- }
- }
- if (isValidKeyIndex(keyIndex)) {
- if (mKeys[keyIndex].repeatable) {
- repeatKey(keyIndex);
- mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this);
- mIsRepeatableKey = true;
- }
- startLongPressTimer(keyIndex);
- }
- showKeyPreviewAndUpdateKey(keyIndex);
- }
-
- public void onMoveEvent(int x, int y, long eventTime) {
- if (DEBUG_MOVE)
- debugLog("onMoveEvent:", x, y);
- if (mKeyAlreadyProcessed)
- return;
- final KeyState keyState = mKeyState;
- int keyIndex = keyState.onMoveKey(x, y);
- final Key oldKey = getKey(keyState.getKeyIndex());
- if (isValidKeyIndex(keyIndex)) {
- if (oldKey == null) {
- // The pointer has been slid in to the new key, but the finger was not on any keys.
- // In this case, we must call onPress() to notify that the new key is being pressed.
- if (mListener != null) {
- mListener.onPress(getKey(keyIndex).codes[0]);
- // This onPress call may have changed keyboard layout. Those cases are detected
- // at {@link #setKeyboard}. In those cases, we should update keyIndex according
- // to the new keyboard layout.
- if (mKeyboardLayoutHasBeenChanged) {
- mKeyboardLayoutHasBeenChanged = false;
- keyIndex = keyState.onMoveKey(x, y);
- }
- }
- keyState.onMoveToNewKey(keyIndex, x, y);
- startLongPressTimer(keyIndex);
- } else if (!isMinorMoveBounce(x, y, keyIndex)) {
- // The pointer has been slid in to the new key from the previous key, we must call
- // onRelease() first to notify that the previous key has been released, then call
- // onPress() to notify that the new key is being pressed.
- mIsInSlidingKeyInput = true;
- if (mListener != null)
- mListener.onRelease(oldKey.codes[0]);
- resetMultiTap();
- if (mListener != null) {
- mListener.onPress(getKey(keyIndex).codes[0]);
- // This onPress call may have changed keyboard layout. Those cases are detected
- // at {@link #setKeyboard}. In those cases, we should update keyIndex according
- // to the new keyboard layout.
- if (mKeyboardLayoutHasBeenChanged) {
- mKeyboardLayoutHasBeenChanged = false;
- keyIndex = keyState.onMoveKey(x, y);
- }
- }
- keyState.onMoveToNewKey(keyIndex, x, y);
- startLongPressTimer(keyIndex);
- }
- } else {
- if (oldKey != null && !isMinorMoveBounce(x, y, keyIndex)) {
- // The pointer has been slid out from the previous key, we must call onRelease() to
- // notify that the previous key has been released.
- mIsInSlidingKeyInput = true;
- if (mListener != null)
- mListener.onRelease(oldKey.codes[0]);
- resetMultiTap();
- keyState.onMoveToNewKey(keyIndex, x ,y);
- mHandler.cancelLongPressTimer();
- }
- }
- showKeyPreviewAndUpdateKey(keyState.getKeyIndex());
- }
-
- public void onUpEvent(int x, int y, long eventTime) {
- if (DEBUG)
- debugLog("onUpEvent :", x, y);
- mHandler.cancelKeyTimers();
- mHandler.cancelPopupPreview();
- showKeyPreviewAndUpdateKey(NOT_A_KEY);
- mIsInSlidingKeyInput = false;
- if (mKeyAlreadyProcessed)
- return;
- int keyIndex = mKeyState.onUpKey(x, y);
- if (isMinorMoveBounce(x, y, keyIndex)) {
- // Use previous fixed key index and coordinates.
- keyIndex = mKeyState.getKeyIndex();
- x = mKeyState.getKeyX();
- y = mKeyState.getKeyY();
- }
- if (!mIsRepeatableKey) {
- detectAndSendKey(keyIndex, x, y, eventTime);
- }
-
- if (isValidKeyIndex(keyIndex))
- mProxy.invalidateKey(mKeys[keyIndex]);
- }
-
- public void onCancelEvent(int x, int y, long eventTime) {
- if (DEBUG)
- debugLog("onCancelEvt:", x, y);
- mHandler.cancelKeyTimers();
- mHandler.cancelPopupPreview();
- showKeyPreviewAndUpdateKey(NOT_A_KEY);
- mIsInSlidingKeyInput = false;
- int keyIndex = mKeyState.getKeyIndex();
- if (isValidKeyIndex(keyIndex))
- mProxy.invalidateKey(mKeys[keyIndex]);
- }
-
- public void repeatKey(int keyIndex) {
- Key key = getKey(keyIndex);
- if (key != null) {
- // While key is repeating, because there is no need to handle multi-tap key, we can
- // pass -1 as eventTime argument.
- detectAndSendKey(keyIndex, key.x, key.y, -1);
- }
- }
-
- public int getLastX() {
- return mKeyState.getLastX();
- }
-
- public int getLastY() {
- return mKeyState.getLastY();
- }
-
- public long getDownTime() {
- return mKeyState.getDownTime();
- }
-
- // These package scope methods are only for debugging purpose.
- /* package */ int getStartX() {
- return mKeyState.getStartX();
- }
-
- /* package */ int getStartY() {
- return mKeyState.getStartY();
- }
-
- private boolean isMinorMoveBounce(int x, int y, int newKey) {
- if (mKeys == null || mKeyHysteresisDistanceSquared < 0)
- throw new IllegalStateException("keyboard and/or hysteresis not set");
- int curKey = mKeyState.getKeyIndex();
- if (newKey == curKey) {
- return true;
- } else if (isValidKeyIndex(curKey)) {
- return getSquareDistanceToKeyEdge(x, y, mKeys[curKey]) < mKeyHysteresisDistanceSquared;
- } else {
- return false;
- }
- }
-
- private static int getSquareDistanceToKeyEdge(int x, int y, Key key) {
- final int left = key.x;
- final int right = key.x + key.width;
- final int top = key.y;
- final int bottom = key.y + key.height;
- final int edgeX = x < left ? left : (x > right ? right : x);
- final int edgeY = y < top ? top : (y > bottom ? bottom : y);
- final int dx = x - edgeX;
- final int dy = y - edgeY;
- return dx * dx + dy * dy;
- }
-
- private void showKeyPreviewAndUpdateKey(int keyIndex) {
- updateKey(keyIndex);
- // The modifier key, such as shift key, should not be shown as preview when multi-touch is
- // supported. On the other hand, if multi-touch is not supported, the modifier key should
- // be shown as preview.
- if (mHasDistinctMultitouch && isModifier()) {
- mProxy.showPreview(NOT_A_KEY, this);
- } else {
- mProxy.showPreview(keyIndex, this);
- }
- }
-
- private void startLongPressTimer(int keyIndex) {
- if (mKeyboardSwitcher.isInMomentaryAutoModeSwitchState()) {
- // We use longer timeout for sliding finger input started from the symbols mode key.
- mHandler.startLongPressTimer(mLongPressKeyTimeout * 3, keyIndex, this);
- } else {
- mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this);
- }
- }
-
- private void detectAndSendKey(int index, int x, int y, long eventTime) {
- final OnKeyboardActionListener listener = mListener;
- final Key key = getKey(index);
-
- if (key == null) {
- if (listener != null)
- listener.onCancel();
- } else {
- if (key.text != null) {
- if (listener != null) {
- listener.onText(key.text);
- listener.onRelease(0); // dummy key code
- }
- } else {
- int code = key.codes[0];
- int[] codes = mKeyDetector.newCodeArray();
- mKeyDetector.getKeyIndexAndNearbyCodes(x, y, codes);
- // Multi-tap
- if (mInMultiTap) {
- if (mTapCount != -1) {
- mListener.onKey(Keyboard.KEYCODE_DELETE, KEY_DELETE, x, y);
- } else {
- mTapCount = 0;
- }
- code = key.codes[mTapCount];
- }
- /*
- * Swap the first and second values in the codes array if the primary code is not
- * the first value but the second value in the array. This happens when key
- * debouncing is in effect.
- */
- if (codes.length >= 2 && codes[0] != code && codes[1] == code) {
- codes[1] = codes[0];
- codes[0] = code;
- }
- if (listener != null) {
- listener.onKey(code, codes, x, y);
- listener.onRelease(code);
- }
- }
- mLastSentIndex = index;
- mLastTapTime = eventTime;
- }
- }
-
- /**
- * Handle multi-tap keys by producing the key label for the current multi-tap state.
- */
- public CharSequence getPreviewText(Key key) {
- if (mInMultiTap) {
- // Multi-tap
- mPreviewLabel.setLength(0);
- mPreviewLabel.append((char) key.codes[mTapCount < 0 ? 0 : mTapCount]);
- return mPreviewLabel;
- } else {
- return key.label;
- }
- }
-
- private void resetMultiTap() {
- mLastSentIndex = NOT_A_KEY;
- mTapCount = 0;
- mLastTapTime = -1;
- mInMultiTap = false;
- }
-
- private void checkMultiTap(long eventTime, int keyIndex) {
- Key key = getKey(keyIndex);
- if (key == null)
- return;
-
- final boolean isMultiTap =
- (eventTime < mLastTapTime + mMultiTapKeyTimeout && keyIndex == mLastSentIndex);
- if (key.codes.length > 1) {
- mInMultiTap = true;
- if (isMultiTap) {
- mTapCount = (mTapCount + 1) % key.codes.length;
- return;
- } else {
- mTapCount = -1;
- return;
- }
- }
- if (!isMultiTap) {
- resetMultiTap();
- }
- }
-
- private void debugLog(String title, int x, int y) {
- int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null);
- Key key = getKey(keyIndex);
- final String code;
- if (key == null) {
- code = "----";
- } else {
- int primaryCode = key.codes[0];
- code = String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode);
- }
- Log.d(TAG, String.format("%s%s[%d] %3d,%3d %3d(%s) %s", title,
- (mKeyAlreadyProcessed ? "-" : " "), mPointerId, x, y, keyIndex, code,
- (isModifier() ? "modifier" : "")));
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java
deleted file mode 100644
index 325ce674c..000000000
--- a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.inputmethodservice.Keyboard.Key;
-
-import java.util.Arrays;
-
-class ProximityKeyDetector extends KeyDetector {
- private static final int MAX_NEARBY_KEYS = 12;
-
- // working area
- private int[] mDistances = new int[MAX_NEARBY_KEYS];
-
- @Override
- protected int getMaxNearbyKeys() {
- return MAX_NEARBY_KEYS;
- }
-
- @Override
- public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) {
- final Key[] keys = getKeys();
- final int touchX = getTouchX(x);
- final int touchY = getTouchY(y);
- int primaryIndex = LatinKeyboardBaseView.NOT_A_KEY;
- int closestKey = LatinKeyboardBaseView.NOT_A_KEY;
- int closestKeyDist = mProximityThresholdSquare + 1;
- int[] distances = mDistances;
- Arrays.fill(distances, Integer.MAX_VALUE);
- int [] nearestKeyIndices = mKeyboard.getNearestKeys(touchX, touchY);
- final int keyCount = nearestKeyIndices.length;
- for (int i = 0; i < keyCount; i++) {
- final Key key = keys[nearestKeyIndices[i]];
- int dist = 0;
- boolean isInside = key.isInside(touchX, touchY);
- if (isInside) {
- primaryIndex = nearestKeyIndices[i];
- }
-
- if (((mProximityCorrectOn
- && (dist = key.squaredDistanceFrom(touchX, touchY)) < mProximityThresholdSquare)
- || isInside)
- && key.codes[0] > 32) {
- // Find insertion point
- final int nCodes = key.codes.length;
- if (dist < closestKeyDist) {
- closestKeyDist = dist;
- closestKey = nearestKeyIndices[i];
- }
-
- if (allKeys == null) continue;
-
- for (int j = 0; j < distances.length; j++) {
- if (distances[j] > dist) {
- // Make space for nCodes codes
- System.arraycopy(distances, j, distances, j + nCodes,
- distances.length - j - nCodes);
- System.arraycopy(allKeys, j, allKeys, j + nCodes,
- allKeys.length - j - nCodes);
- System.arraycopy(key.codes, 0, allKeys, j, nCodes);
- Arrays.fill(distances, j, j + nCodes, dist);
- break;
- }
- }
- }
- }
- if (primaryIndex == LatinKeyboardBaseView.NOT_A_KEY) {
- primaryIndex = closestKey;
- }
- return primaryIndex;
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java
new file mode 100644
index 000000000..12338ce61
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.latin;
+
+import com.android.inputmethod.voice.VoiceIMEConnector;
+import com.android.inputmethod.voice.VoiceInputLogger;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.backup.BackupManager;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Vibrator;
+import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
+import android.speech.SpeechRecognizer;
+import android.text.AutoText;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.util.Log;
+import android.widget.TextView;
+
+import java.util.Locale;
+
+public class Settings extends PreferenceActivity
+ implements SharedPreferences.OnSharedPreferenceChangeListener,
+ DialogInterface.OnDismissListener, OnPreferenceClickListener {
+ private static final String TAG = "Settings";
+
+ public static final String PREF_GENERAL_SETTINGS_KEY = "general_settings";
+ public static final String PREF_VIBRATE_ON = "vibrate_on";
+ public static final String PREF_SOUND_ON = "sound_on";
+ public static final String PREF_POPUP_ON = "popup_on";
+ public static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled";
+ public static final String PREF_AUTO_CAP = "auto_cap";
+ public static final String PREF_SETTINGS_KEY = "settings_key";
+ public static final String PREF_VOICE_SETTINGS_KEY = "voice_mode";
+ public static final String PREF_INPUT_LANGUAGE = "input_language";
+ public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
+ public static final String PREF_SUBTYPES = "subtype_settings";
+
+ public static final String PREF_PREDICTION_SETTINGS_KEY = "prediction_settings";
+ public static final String PREF_QUICK_FIXES = "quick_fixes";
+ public static final String PREF_SHOW_SUGGESTIONS_SETTING = "show_suggestions_setting";
+ public static final String PREF_AUTO_CORRECTION_THRESHOLD = "auto_correction_threshold";
+ public static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion";
+
+ public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode";
+
+ // Dialog ids
+ private static final int VOICE_INPUT_CONFIRM_DIALOG = 0;
+
+ private PreferenceScreen mInputLanguageSelection;
+ private CheckBoxPreference mQuickFixes;
+ private ListPreference mVoicePreference;
+ private ListPreference mSettingsKeyPreference;
+ private ListPreference mShowCorrectionSuggestionsPreference;
+ private ListPreference mAutoCorrectionThreshold;
+ private CheckBoxPreference mBigramSuggestion;
+ private boolean mVoiceOn;
+
+ private AlertDialog mDialog;
+
+ private VoiceInputLogger mLogger;
+
+ private boolean mOkClicked = false;
+ private String mVoiceModeOff;
+
+ private void ensureConsistencyOfAutoCorrectionSettings() {
+ final String autoCorrectionOff = getResources().getString(
+ R.string.auto_correction_threshold_mode_index_off);
+ final String currentSetting = mAutoCorrectionThreshold.getValue();
+ mBigramSuggestion.setEnabled(!currentSetting.equals(autoCorrectionOff));
+ }
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ addPreferencesFromResource(R.xml.prefs);
+ mInputLanguageSelection = (PreferenceScreen) findPreference(PREF_SUBTYPES);
+ mInputLanguageSelection.setOnPreferenceClickListener(this);
+ mQuickFixes = (CheckBoxPreference) findPreference(PREF_QUICK_FIXES);
+ mVoicePreference = (ListPreference) findPreference(PREF_VOICE_SETTINGS_KEY);
+ mSettingsKeyPreference = (ListPreference) findPreference(PREF_SETTINGS_KEY);
+ mShowCorrectionSuggestionsPreference =
+ (ListPreference) findPreference(PREF_SHOW_SUGGESTIONS_SETTING);
+ SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
+ prefs.registerOnSharedPreferenceChangeListener(this);
+
+ mVoiceModeOff = getString(R.string.voice_mode_off);
+ mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
+ .equals(mVoiceModeOff));
+ mLogger = VoiceInputLogger.getLogger(this);
+
+ mAutoCorrectionThreshold = (ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD);
+ mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTIONS);
+ ensureConsistencyOfAutoCorrectionSettings();
+
+ final PreferenceGroup generalSettings =
+ (PreferenceGroup) findPreference(PREF_GENERAL_SETTINGS_KEY);
+ final PreferenceGroup textCorrectionGroup =
+ (PreferenceGroup) findPreference(PREF_PREDICTION_SETTINGS_KEY);
+
+ final boolean showSettingsKeyOption = getResources().getBoolean(
+ R.bool.config_enable_show_settings_key_option);
+ if (!showSettingsKeyOption) {
+ generalSettings.removePreference(mSettingsKeyPreference);
+ }
+
+ final boolean showVoiceKeyOption = getResources().getBoolean(
+ R.bool.config_enable_show_voice_key_option);
+ if (!showVoiceKeyOption) {
+ generalSettings.removePreference(mVoicePreference);
+ }
+
+ Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
+ if (vibrator == null || !vibrator.hasVibrator()) {
+ generalSettings.removePreference(findPreference(PREF_VIBRATE_ON));
+ }
+
+ final boolean showSubtypeSettings = getResources().getBoolean(
+ R.bool.config_enable_show_subtype_settings);
+ if (!showSubtypeSettings) {
+ generalSettings.removePreference(findPreference(PREF_SUBTYPES));
+ }
+
+ final boolean showPopupOption = getResources().getBoolean(
+ R.bool.config_enable_show_popup_on_keypress_option);
+ if (!showPopupOption) {
+ generalSettings.removePreference(findPreference(PREF_POPUP_ON));
+ }
+
+ final boolean showRecorrectionOption = getResources().getBoolean(
+ R.bool.config_enable_show_recorrection_option);
+ if (!showRecorrectionOption) {
+ generalSettings.removePreference(findPreference(PREF_RECORRECTION_ENABLED));
+ }
+
+ final boolean showQuickFixesOption = getResources().getBoolean(
+ R.bool.config_enable_quick_fixes_option);
+ if (!showQuickFixesOption) {
+ textCorrectionGroup.removePreference(findPreference(PREF_QUICK_FIXES));
+ }
+
+ final boolean showBigramSuggestionsOption = getResources().getBoolean(
+ R.bool.config_enable_bigram_suggestions_option);
+ if (!showBigramSuggestionsOption) {
+ textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_SUGGESTIONS));
+ }
+
+ final boolean showUsabilityModeStudyOption = getResources().getBoolean(
+ R.bool.config_enable_usability_study_mode_option);
+ if (!showUsabilityModeStudyOption) {
+ getPreferenceScreen().removePreference(findPreference(PREF_USABILITY_STUDY_MODE));
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ int autoTextSize = AutoText.getSize(getListView());
+ if (autoTextSize < 1) {
+ ((PreferenceGroup) findPreference(PREF_PREDICTION_SETTINGS_KEY))
+ .removePreference(mQuickFixes);
+ }
+ if (!VoiceIMEConnector.VOICE_INSTALLED
+ || !SpeechRecognizer.isRecognitionAvailable(this)) {
+ getPreferenceScreen().removePreference(mVoicePreference);
+ } else {
+ updateVoiceModeSummary();
+ }
+ updateSettingsKeySummary();
+ updateShowCorrectionSuggestionsSummary();
+ }
+
+ @Override
+ protected void onDestroy() {
+ getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
+ this);
+ super.onDestroy();
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+ (new BackupManager(this)).dataChanged();
+ // If turning on voice input, show dialog
+ if (key.equals(PREF_VOICE_SETTINGS_KEY) && !mVoiceOn) {
+ if (!prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
+ .equals(mVoiceModeOff)) {
+ showVoiceConfirmation();
+ }
+ }
+ ensureConsistencyOfAutoCorrectionSettings();
+ mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
+ .equals(mVoiceModeOff));
+ updateVoiceModeSummary();
+ updateSettingsKeySummary();
+ updateShowCorrectionSuggestionsSummary();
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference pref) {
+ if (pref == mInputLanguageSelection) {
+ final String action;
+ if (android.os.Build.VERSION.SDK_INT
+ >= /* android.os.Build.VERSION_CODES.HONEYCOMB */ 11) {
+ action = "android.settings.INPUT_METHOD_AND_SUBTYPE_ENABLER";
+ } else {
+ action = "com.android.inputmethod.latin.INPUT_LANGUAGE_SELECTION";
+ }
+ startActivity(new Intent(action));
+ return true;
+ }
+ return false;
+ }
+
+ private void updateShowCorrectionSuggestionsSummary() {
+ mShowCorrectionSuggestionsPreference.setSummary(
+ getResources().getStringArray(R.array.prefs_suggestion_visibilities)
+ [mShowCorrectionSuggestionsPreference.findIndexOfValue(
+ mShowCorrectionSuggestionsPreference.getValue())]);
+ }
+
+ private void updateSettingsKeySummary() {
+ mSettingsKeyPreference.setSummary(
+ getResources().getStringArray(R.array.settings_key_modes)
+ [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]);
+ }
+
+ private void showVoiceConfirmation() {
+ mOkClicked = false;
+ showDialog(VOICE_INPUT_CONFIRM_DIALOG);
+ // Make URL in the dialog message clickable
+ if (mDialog != null) {
+ TextView textView = (TextView) mDialog.findViewById(android.R.id.message);
+ if (textView != null) {
+ textView.setMovementMethod(LinkMovementMethod.getInstance());
+ }
+ }
+ }
+
+ private void updateVoiceModeSummary() {
+ mVoicePreference.setSummary(
+ getResources().getStringArray(R.array.voice_input_modes_summary)
+ [mVoicePreference.findIndexOfValue(mVoicePreference.getValue())]);
+ }
+
+ @Override
+ protected Dialog onCreateDialog(int id) {
+ switch (id) {
+ case VOICE_INPUT_CONFIRM_DIALOG:
+ DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ if (whichButton == DialogInterface.BUTTON_NEGATIVE) {
+ mVoicePreference.setValue(mVoiceModeOff);
+ mLogger.settingsWarningDialogCancel();
+ } else if (whichButton == DialogInterface.BUTTON_POSITIVE) {
+ mOkClicked = true;
+ mLogger.settingsWarningDialogOk();
+ }
+ updateVoicePreference();
+ }
+ };
+ AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ .setTitle(R.string.voice_warning_title)
+ .setPositiveButton(android.R.string.ok, listener)
+ .setNegativeButton(android.R.string.cancel, listener);
+
+ // Get the current list of supported locales and check the current locale against
+ // that list, to decide whether to put a warning that voice input will not work in
+ // the current language as part of the pop-up confirmation dialog.
+ boolean localeSupported = SubtypeSwitcher.getInstance().isVoiceSupported(
+ Locale.getDefault().toString());
+
+ final CharSequence message;
+ if (localeSupported) {
+ message = TextUtils.concat(
+ getText(R.string.voice_warning_may_not_understand), "\n\n",
+ getText(R.string.voice_hint_dialog_message));
+ } else {
+ message = TextUtils.concat(
+ getText(R.string.voice_warning_locale_not_supported), "\n\n",
+ getText(R.string.voice_warning_may_not_understand), "\n\n",
+ getText(R.string.voice_hint_dialog_message));
+ }
+ builder.setMessage(message);
+ AlertDialog dialog = builder.create();
+ mDialog = dialog;
+ dialog.setOnDismissListener(this);
+ mLogger.settingsWarningDialogShown();
+ return dialog;
+ default:
+ Log.e(TAG, "unknown dialog " + id);
+ return null;
+ }
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ mLogger.settingsWarningDialogDismissed();
+ if (!mOkClicked) {
+ // This assumes that onPreferenceClick gets called first, and this if the user
+ // agreed after the warning, we set the mOkClicked value to true.
+ mVoicePreference.setValue(mVoiceModeOff);
+ }
+ }
+
+ private void updateVoicePreference() {
+ boolean isChecked = !mVoicePreference.getValue().equals(mVoiceModeOff);
+ if (isChecked) {
+ mLogger.voiceInputSettingEnabled();
+ } else {
+ mLogger.voiceInputSettingDisabled();
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
new file mode 100644
index 000000000..917521c40
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.latin;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+import java.util.Locale;
+
+public class SubtypeLocale {
+ private static String[] sExceptionKeys;
+ private static String[] sExceptionValues;
+
+ private SubtypeLocale() {
+ // Intentional empty constructor for utility class.
+ }
+
+ public static void init(Context context) {
+ final Resources res = context.getResources();
+ sExceptionKeys = res.getStringArray(R.array.subtype_locale_exception_keys);
+ sExceptionValues = res.getStringArray(R.array.subtype_locale_exception_values);
+ }
+
+ public static String getFullDisplayName(Locale locale) {
+ String localeCode = locale.toString();
+ for (int index = 0; index < sExceptionKeys.length; index++) {
+ if (sExceptionKeys[index].equals(localeCode))
+ return sExceptionValues[index];
+ }
+ return locale.getDisplayName(locale);
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
new file mode 100644
index 000000000..f4262cc99
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -0,0 +1,635 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.latin;
+
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.keyboard.LatinKeyboard;
+import com.android.inputmethod.keyboard.LatinKeyboardView;
+import com.android.inputmethod.voice.SettingsUtil;
+import com.android.inputmethod.voice.VoiceIMEConnector;
+import com.android.inputmethod.voice.VoiceInput;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.IBinder;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+public class SubtypeSwitcher {
+ private static boolean DBG = LatinImeLogger.sDBG;
+ private static final String TAG = "SubtypeSwitcher";
+
+ private static final char LOCALE_SEPARATER = '_';
+ private static final String KEYBOARD_MODE = "keyboard";
+ private static final String VOICE_MODE = "voice";
+ private static final String SUBTYPE_EXTRAVALUE_REQUIRE_NETWORK_CONNECTIVITY =
+ "requireNetworkConnectivity";
+ private final TextUtils.SimpleStringSplitter mLocaleSplitter =
+ new TextUtils.SimpleStringSplitter(LOCALE_SEPARATER);
+
+ private static final SubtypeSwitcher sInstance = new SubtypeSwitcher();
+ private /* final */ LatinIME mService;
+ private /* final */ SharedPreferences mPrefs;
+ private /* final */ InputMethodManager mImm;
+ private /* final */ Resources mResources;
+ private /* final */ ConnectivityManager mConnectivityManager;
+ private /* final */ boolean mConfigUseSpacebarLanguageSwitcher;
+ private final ArrayList<InputMethodSubtype> mEnabledKeyboardSubtypesOfCurrentInputMethod =
+ new ArrayList<InputMethodSubtype>();
+ private final ArrayList<String> mEnabledLanguagesOfCurrentInputMethod = new ArrayList<String>();
+
+ /*-----------------------------------------------------------*/
+ // Variants which should be changed only by reload functions.
+ private boolean mNeedsToDisplayLanguage;
+ private boolean mIsSystemLanguageSameAsInputLanguage;
+ private InputMethodInfo mShortcutInputMethodInfo;
+ private InputMethodSubtype mShortcutSubtype;
+ private List<InputMethodSubtype> mAllEnabledSubtypesOfCurrentInputMethod;
+ private Locale mSystemLocale;
+ private Locale mInputLocale;
+ private String mInputLocaleStr;
+ private String mMode;
+ private VoiceInput mVoiceInput;
+ /*-----------------------------------------------------------*/
+
+ private boolean mIsNetworkConnected;
+
+ public static SubtypeSwitcher getInstance() {
+ return sInstance;
+ }
+
+ public static void init(LatinIME service, SharedPreferences prefs) {
+ sInstance.initialize(service, prefs);
+ sInstance.updateAllParameters();
+
+ SubtypeLocale.init(service);
+ }
+
+ private SubtypeSwitcher() {
+ // Intentional empty constructor for singleton.
+ }
+
+ private void initialize(LatinIME service, SharedPreferences prefs) {
+ mService = service;
+ mPrefs = prefs;
+ mResources = service.getResources();
+ mImm = (InputMethodManager) service.getSystemService(Context.INPUT_METHOD_SERVICE);
+ mConnectivityManager = (ConnectivityManager) service.getSystemService(
+ Context.CONNECTIVITY_SERVICE);
+ mEnabledKeyboardSubtypesOfCurrentInputMethod.clear();
+ mEnabledLanguagesOfCurrentInputMethod.clear();
+ mSystemLocale = null;
+ mInputLocale = null;
+ mInputLocaleStr = null;
+ // Mode is initialized to KEYBOARD_MODE, in case that LatinIME can't obtain currentSubtype
+ mMode = KEYBOARD_MODE;
+ mAllEnabledSubtypesOfCurrentInputMethod = null;
+ // TODO: Voice input should be created here
+ mVoiceInput = null;
+ mConfigUseSpacebarLanguageSwitcher = mResources.getBoolean(
+ R.bool.config_use_spacebar_language_switcher);
+ if (mConfigUseSpacebarLanguageSwitcher)
+ initLanguageSwitcher(service);
+
+ final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
+ mIsNetworkConnected = (info != null && info.isConnected());
+ }
+
+ // Update all parameters stored in SubtypeSwitcher.
+ // Only configuration changed event is allowed to call this because this is heavy.
+ private void updateAllParameters() {
+ mSystemLocale = mResources.getConfiguration().locale;
+ updateSubtype(mImm.getCurrentInputMethodSubtype());
+ updateParametersOnStartInputView();
+ }
+
+ // Update parameters which are changed outside LatinIME. This parameters affect UI so they
+ // should be updated every time onStartInputview.
+ public void updateParametersOnStartInputView() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ updateForSpacebarLanguageSwitch();
+ } else {
+ updateEnabledSubtypes();
+ }
+ updateShortcutIME();
+ }
+
+ // Reload enabledSubtypes from the framework.
+ private void updateEnabledSubtypes() {
+ boolean foundCurrentSubtypeBecameDisabled = true;
+ mAllEnabledSubtypesOfCurrentInputMethod = mImm.getEnabledInputMethodSubtypeList(
+ null, true);
+ mEnabledLanguagesOfCurrentInputMethod.clear();
+ mEnabledKeyboardSubtypesOfCurrentInputMethod.clear();
+ for (InputMethodSubtype ims: mAllEnabledSubtypesOfCurrentInputMethod) {
+ final String locale = ims.getLocale();
+ final String mode = ims.getMode();
+ mLocaleSplitter.setString(locale);
+ if (mLocaleSplitter.hasNext()) {
+ mEnabledLanguagesOfCurrentInputMethod.add(mLocaleSplitter.next());
+ }
+ if (locale.equals(mInputLocaleStr) && mode.equals(mMode)) {
+ foundCurrentSubtypeBecameDisabled = false;
+ }
+ if (KEYBOARD_MODE.equals(ims.getMode())) {
+ mEnabledKeyboardSubtypesOfCurrentInputMethod.add(ims);
+ }
+ }
+ mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1
+ && mIsSystemLanguageSameAsInputLanguage);
+ if (foundCurrentSubtypeBecameDisabled) {
+ if (DBG) {
+ Log.w(TAG, "Current subtype: " + mInputLocaleStr + ", " + mMode);
+ Log.w(TAG, "Last subtype was disabled. Update to the current one.");
+ }
+ updateSubtype(mImm.getCurrentInputMethodSubtype());
+ }
+ }
+
+ private void updateShortcutIME() {
+ if (DBG) {
+ Log.d(TAG, "Update shortcut IME from : "
+ + (mShortcutInputMethodInfo == null
+ ? "<null>" : mShortcutInputMethodInfo.getId()) + ", "
+ + (mShortcutSubtype == null ? "<null>" : (mShortcutSubtype.getLocale()
+ + ", " + mShortcutSubtype.getMode())));
+ }
+ // TODO: Update an icon for shortcut IME
+ Map<InputMethodInfo, List<InputMethodSubtype>> shortcuts =
+ mImm.getShortcutInputMethodsAndSubtypes();
+ for (InputMethodInfo imi: shortcuts.keySet()) {
+ List<InputMethodSubtype> subtypes = shortcuts.get(imi);
+ // TODO: Returns the first found IMI for now. Should handle all shortcuts as
+ // appropriate.
+ mShortcutInputMethodInfo = imi;
+ // TODO: Pick up the first found subtype for now. Should handle all subtypes
+ // as appropriate.
+ mShortcutSubtype = subtypes.size() > 0 ? subtypes.get(0) : null;
+ break;
+ }
+ if (DBG) {
+ Log.d(TAG, "Update shortcut IME to : "
+ + (mShortcutInputMethodInfo == null
+ ? "<null>" : mShortcutInputMethodInfo.getId()) + ", "
+ + (mShortcutSubtype == null ? "<null>" : (mShortcutSubtype.getLocale()
+ + ", " + mShortcutSubtype.getMode())));
+ }
+ }
+
+ // Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function.
+ public void updateSubtype(InputMethodSubtype newSubtype) {
+ final String newLocale;
+ final String newMode;
+ if (newSubtype == null) {
+ // Normally, newSubtype shouldn't be null. But just in case newSubtype was null,
+ // fallback to the default locale and mode.
+ Log.w(TAG, "Couldn't get the current subtype.");
+ newLocale = "en_US";
+ newMode = KEYBOARD_MODE;
+ } else {
+ newLocale = newSubtype.getLocale();
+ newMode = newSubtype.getMode();
+ }
+ if (DBG) {
+ Log.w(TAG, "Update subtype to:" + newLocale + "," + newMode
+ + ", from: " + mInputLocaleStr + ", " + mMode);
+ }
+ boolean languageChanged = false;
+ if (!newLocale.equals(mInputLocaleStr)) {
+ if (mInputLocaleStr != null) {
+ languageChanged = true;
+ }
+ updateInputLocale(newLocale);
+ }
+ boolean modeChanged = false;
+ String oldMode = mMode;
+ if (!newMode.equals(mMode)) {
+ if (mMode != null) {
+ modeChanged = true;
+ }
+ mMode = newMode;
+ }
+
+ // If the old mode is voice input, we need to reset or cancel its status.
+ // We cancel its status when we change mode, while we reset otherwise.
+ if (isKeyboardMode()) {
+ if (modeChanged) {
+ if (VOICE_MODE.equals(oldMode) && mVoiceInput != null) {
+ mVoiceInput.cancel();
+ }
+ }
+ if (modeChanged || languageChanged) {
+ updateShortcutIME();
+ mService.onRefreshKeyboard();
+ }
+ } else if (isVoiceMode() && mVoiceInput != null) {
+ if (VOICE_MODE.equals(oldMode)) {
+ mVoiceInput.reset();
+ }
+ // If needsToShowWarningDialog is true, voice input need to show warning before
+ // show recognition view.
+ if (languageChanged || modeChanged
+ || VoiceIMEConnector.getInstance().needsToShowWarningDialog()) {
+ triggerVoiceIME();
+ }
+ } else {
+ Log.w(TAG, "Unknown subtype mode: " + mMode);
+ if (VOICE_MODE.equals(oldMode) && mVoiceInput != null) {
+ // We need to reset the voice input to release the resources and to reset its status
+ // as it is not the current input mode.
+ mVoiceInput.reset();
+ }
+ }
+ }
+
+ // Update the current input locale from Locale string.
+ private void updateInputLocale(String inputLocaleStr) {
+ // example: inputLocaleStr = "en_US" "en" ""
+ // "en_US" --> language: en & country: US
+ // "en" --> language: en
+ // "" --> the system locale
+ mLocaleSplitter.setString(inputLocaleStr);
+ if (mLocaleSplitter.hasNext()) {
+ String language = mLocaleSplitter.next();
+ if (mLocaleSplitter.hasNext()) {
+ mInputLocale = new Locale(language, mLocaleSplitter.next());
+ } else {
+ mInputLocale = new Locale(language);
+ }
+ mInputLocaleStr = inputLocaleStr;
+ } else {
+ mInputLocale = mSystemLocale;
+ String country = mSystemLocale.getCountry();
+ mInputLocaleStr = mSystemLocale.getLanguage()
+ + (TextUtils.isEmpty(country) ? "" : "_" + mSystemLocale.getLanguage());
+ }
+ mIsSystemLanguageSameAsInputLanguage = getSystemLocale().getLanguage().equalsIgnoreCase(
+ getInputLocale().getLanguage());
+ mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1
+ && mIsSystemLanguageSameAsInputLanguage);
+ }
+
+ ////////////////////////////
+ // Shortcut IME functions //
+ ////////////////////////////
+
+ public void switchToShortcutIME() {
+ final IBinder token = mService.getWindow().getWindow().getAttributes().token;
+ if (token == null || mShortcutInputMethodInfo == null) {
+ return;
+ }
+ final String imiId = mShortcutInputMethodInfo.getId();
+ final InputMethodSubtype subtype = mShortcutSubtype;
+ new Thread("SwitchToShortcutIME") {
+ @Override
+ public void run() {
+ mImm.setInputMethodAndSubtype(token, imiId, subtype);
+ }
+ }.start();
+ }
+
+ public Drawable getShortcutIcon() {
+ return getSubtypeIcon(mShortcutInputMethodInfo, mShortcutSubtype);
+ }
+
+ private Drawable getSubtypeIcon(InputMethodInfo imi, InputMethodSubtype subtype) {
+ final PackageManager pm = mService.getPackageManager();
+ if (imi != null) {
+ final String imiPackageName = imi.getPackageName();
+ if (DBG) {
+ Log.d(TAG, "Update icons of IME: " + imiPackageName + ","
+ + subtype.getLocale() + "," + subtype.getMode());
+ }
+ if (subtype != null) {
+ return pm.getDrawable(imiPackageName, subtype.getIconResId(),
+ imi.getServiceInfo().applicationInfo);
+ } else if (imi.getSubtypeCount() > 0 && imi.getSubtypeAt(0) != null) {
+ return pm.getDrawable(imiPackageName,
+ imi.getSubtypeAt(0).getIconResId(),
+ imi.getServiceInfo().applicationInfo);
+ } else {
+ try {
+ return pm.getApplicationInfo(imiPackageName, 0).loadIcon(pm);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "IME can't be found: " + imiPackageName);
+ }
+ }
+ }
+ return null;
+ }
+
+ private static boolean contains(String[] hay, String needle) {
+ for (String element : hay) {
+ if (element.equals(needle))
+ return true;
+ }
+ return false;
+ }
+
+ public boolean isShortcutAvailable() {
+ if (mShortcutInputMethodInfo == null)
+ return false;
+ if (mShortcutSubtype != null && contains(mShortcutSubtype.getExtraValue().split(","),
+ SUBTYPE_EXTRAVALUE_REQUIRE_NETWORK_CONNECTIVITY)) {
+ return mIsNetworkConnected;
+ }
+ return true;
+ }
+
+ public void onNetworkStateChanged(Intent intent) {
+ final boolean noConnection = intent.getBooleanExtra(
+ ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
+ mIsNetworkConnected = !noConnection;
+
+ final LatinKeyboardView inputView = KeyboardSwitcher.getInstance().getInputView();
+ if (inputView != null) {
+ final LatinKeyboard keyboard = inputView.getLatinKeyboard();
+ if (keyboard != null) {
+ keyboard.updateShortcutKey(isShortcutAvailable(), inputView);
+ }
+ }
+ }
+
+ //////////////////////////////////
+ // Language Switching functions //
+ //////////////////////////////////
+
+ public int getEnabledKeyboardLocaleCount() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ return mLanguageSwitcher.getLocaleCount();
+ } else {
+ return mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
+ }
+ }
+
+ public boolean useSpacebarLanguageSwitcher() {
+ return mConfigUseSpacebarLanguageSwitcher;
+ }
+
+ public boolean needsToDisplayLanguage() {
+ return mNeedsToDisplayLanguage;
+ }
+
+ public Locale getInputLocale() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ return mLanguageSwitcher.getInputLocale();
+ } else {
+ return mInputLocale;
+ }
+ }
+
+ public String getInputLocaleStr() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ String inputLanguage = null;
+ inputLanguage = mLanguageSwitcher.getInputLanguage();
+ // Should return system locale if there is no Language available.
+ if (inputLanguage == null) {
+ inputLanguage = getSystemLocale().getLanguage();
+ }
+ return inputLanguage;
+ } else {
+ return mInputLocaleStr;
+ }
+ }
+
+ public String[] getEnabledLanguages() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ return mLanguageSwitcher.getEnabledLanguages();
+ } else {
+ return mEnabledLanguagesOfCurrentInputMethod.toArray(
+ new String[mEnabledLanguagesOfCurrentInputMethod.size()]);
+ }
+ }
+
+ public Locale getSystemLocale() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ return mLanguageSwitcher.getSystemLocale();
+ } else {
+ return mSystemLocale;
+ }
+ }
+
+ public boolean isSystemLanguageSameAsInputLanguage() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ return getSystemLocale().getLanguage().equalsIgnoreCase(
+ getInputLocaleStr().substring(0, 2));
+ } else {
+ return mIsSystemLanguageSameAsInputLanguage;
+ }
+ }
+
+ public void onConfigurationChanged(Configuration conf) {
+ final Locale systemLocale = conf.locale;
+ // If system configuration was changed, update all parameters.
+ if (!TextUtils.equals(systemLocale.toString(), mSystemLocale.toString())) {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ // If the system locale changes and is different from the saved
+ // locale (mSystemLocale), then reload the input locale list from the
+ // latin ime settings (shared prefs) and reset the input locale
+ // to the first one.
+ mLanguageSwitcher.loadLocales(mPrefs);
+ mLanguageSwitcher.setSystemLocale(systemLocale);
+ } else {
+ updateAllParameters();
+ }
+ }
+ }
+
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ if (Settings.PREF_SELECTED_LANGUAGES.equals(key)) {
+ mLanguageSwitcher.loadLocales(sharedPreferences);
+ }
+ }
+ }
+
+ /**
+ * Change system locale for this application
+ * @param newLocale
+ * @return oldLocale
+ */
+ public Locale changeSystemLocale(Locale newLocale) {
+ Configuration conf = mResources.getConfiguration();
+ Locale oldLocale = conf.locale;
+ conf.locale = newLocale;
+ mResources.updateConfiguration(conf, mResources.getDisplayMetrics());
+ return oldLocale;
+ }
+
+ public boolean isKeyboardMode() {
+ return KEYBOARD_MODE.equals(mMode);
+ }
+
+
+ ///////////////////////////
+ // Voice Input functions //
+ ///////////////////////////
+
+ public boolean setVoiceInput(VoiceInput vi) {
+ if (mVoiceInput == null && vi != null) {
+ mVoiceInput = vi;
+ if (isVoiceMode()) {
+ if (DBG) {
+ Log.d(TAG, "Set and call voice input.: " + getInputLocaleStr());
+ }
+ triggerVoiceIME();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isVoiceMode() {
+ return VOICE_MODE.equals(mMode);
+ }
+
+ private void triggerVoiceIME() {
+ if (!mService.isInputViewShown()) return;
+ VoiceIMEConnector.getInstance().startListening(false,
+ KeyboardSwitcher.getInstance().getInputView().getWindowToken());
+ }
+
+ //////////////////////////////////////
+ // Spacebar Language Switch support //
+ //////////////////////////////////////
+
+ private LanguageSwitcher mLanguageSwitcher;
+
+ public static String getFullDisplayName(Locale locale, boolean returnsNameInThisLocale) {
+ if (returnsNameInThisLocale) {
+ return toTitleCase(SubtypeLocale.getFullDisplayName(locale));
+ } else {
+ return toTitleCase(locale.getDisplayName());
+ }
+ }
+
+ public static String getDisplayLanguage(Locale locale) {
+ return toTitleCase(locale.getDisplayLanguage(locale));
+ }
+
+ public static String getShortDisplayLanguage(Locale locale) {
+ return toTitleCase(locale.getLanguage());
+ }
+
+ private static String toTitleCase(String s) {
+ if (s.length() == 0) {
+ return s;
+ }
+ return Character.toUpperCase(s.charAt(0)) + s.substring(1);
+ }
+
+ private void updateForSpacebarLanguageSwitch() {
+ // We need to update mNeedsToDisplayLanguage in onStartInputView because
+ // getEnabledKeyboardLocaleCount could have been changed.
+ mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1
+ && getSystemLocale().getLanguage().equalsIgnoreCase(
+ getInputLocale().getLanguage()));
+ }
+
+ public String getInputLanguageName() {
+ return getDisplayLanguage(getInputLocale());
+ }
+
+ public String getNextInputLanguageName() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ return getDisplayLanguage(mLanguageSwitcher.getNextInputLocale());
+ } else {
+ return "";
+ }
+ }
+
+ public String getPreviousInputLanguageName() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ return getDisplayLanguage(mLanguageSwitcher.getPrevInputLocale());
+ } else {
+ return "";
+ }
+ }
+
+ // A list of locales which are supported by default for voice input, unless we get a
+ // different list from Gservices.
+ private static final String DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES =
+ "en " +
+ "en_US " +
+ "en_GB " +
+ "en_AU " +
+ "en_CA " +
+ "en_IE " +
+ "en_IN " +
+ "en_NZ " +
+ "en_SG " +
+ "en_ZA ";
+
+ public boolean isVoiceSupported(String locale) {
+ // Get the current list of supported locales and check the current locale against that
+ // list. We cache this value so as not to check it every time the user starts a voice
+ // input. Because this method is called by onStartInputView, this should mean that as
+ // long as the locale doesn't change while the user is keeping the IME open, the
+ // value should never be stale.
+ String supportedLocalesString = SettingsUtil.getSettingsString(
+ mService.getContentResolver(),
+ SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES,
+ DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES);
+ List<String> voiceInputSupportedLocales = Arrays.asList(
+ supportedLocalesString.split("\\s+"));
+ return voiceInputSupportedLocales.contains(locale);
+ }
+
+ public void loadSettings() {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ mLanguageSwitcher.loadLocales(mPrefs);
+ }
+ }
+
+ public void toggleLanguage(boolean reset, boolean next) {
+ if (mConfigUseSpacebarLanguageSwitcher) {
+ if (reset) {
+ mLanguageSwitcher.reset();
+ } else {
+ if (next) {
+ mLanguageSwitcher.next();
+ } else {
+ mLanguageSwitcher.prev();
+ }
+ }
+ mLanguageSwitcher.persist(mPrefs);
+ }
+ }
+
+ private void initLanguageSwitcher(LatinIME service) {
+ final Configuration conf = service.getResources().getConfiguration();
+ mLanguageSwitcher = new LanguageSwitcher(service);
+ mLanguageSwitcher.loadLocales(mPrefs);
+ mLanguageSwitcher.setSystemLocale(conf.locale);
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 3b898941f..ced355bb2 100755..100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -1,12 +1,12 @@
/*
* Copyright (C) 2008 The Android Open Source Project
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,24 +16,23 @@
package com.android.inputmethod.latin;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
import android.content.Context;
import android.text.AutoText;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
+import java.util.ArrayList;
+import java.util.Arrays;
+
/**
- * This class loads a dictionary and provides a list of suggestions for a given sequence of
+ * This class loads a dictionary and provides a list of suggestions for a given sequence of
* characters. This includes corrections and completions.
- * @hide pending API Council Approval
*/
public class Suggest implements Dictionary.WordCallback {
+ public static final String TAG = Suggest.class.getSimpleName();
+
public static final int APPROX_MAX_WORD_LENGTH = 32;
public static final int CORRECTION_NONE = 0;
@@ -65,6 +64,8 @@ public class Suggest implements Dictionary.WordCallback {
static final int LARGE_DICTIONARY_THRESHOLD = 200 * 1000;
+ private static boolean DBG = LatinImeLogger.sDBG;
+
private BinaryDictionary mMainDict;
private Dictionary mUserDictionary;
@@ -81,6 +82,7 @@ public class Suggest implements Dictionary.WordCallback {
private boolean mAutoTextEnabled;
+ private double mAutoCorrectionThreshold;
private int[] mPriorities = new int[mPrefMaxSuggestions];
private int[] mBigramPriorities = new int[PREF_MAX_BIGRAMS];
@@ -93,8 +95,7 @@ public class Suggest implements Dictionary.WordCallback {
private ArrayList<CharSequence> mSuggestions = new ArrayList<CharSequence>();
ArrayList<CharSequence> mBigramSuggestions = new ArrayList<CharSequence>();
private ArrayList<CharSequence> mStringPool = new ArrayList<CharSequence>();
- private boolean mHaveCorrection;
- private CharSequence mOriginalWord;
+ private boolean mHasAutoCorrection;
private String mLowerOriginalWord;
// TODO: Remove these member variables by passing more context to addWord() callback method
@@ -103,13 +104,8 @@ public class Suggest implements Dictionary.WordCallback {
private int mCorrectionMode = CORRECTION_BASIC;
- public Suggest(Context context, int[] dictionaryResId) {
- mMainDict = new BinaryDictionary(context, dictionaryResId, DIC_MAIN);
- initPool();
- }
-
- public Suggest(Context context, ByteBuffer byteBuffer) {
- mMainDict = new BinaryDictionary(context, byteBuffer, DIC_MAIN);
+ public Suggest(Context context, int dictionaryResId) {
+ mMainDict = BinaryDictionary.initDictionary(context, dictionaryResId, DIC_MAIN);
initPool();
}
@@ -133,7 +129,7 @@ public class Suggest implements Dictionary.WordCallback {
}
public boolean hasMainDictionary() {
- return mMainDict.getSize() > LARGE_DICTIONARY_THRESHOLD;
+ return mMainDict != null && mMainDict.getSize() > LARGE_DICTIONARY_THRESHOLD;
}
public int getApproxMaxWordLength() {
@@ -154,7 +150,7 @@ public class Suggest implements Dictionary.WordCallback {
public void setContactsDictionary(Dictionary userDictionary) {
mContactsDictionary = userDictionary;
}
-
+
public void setAutoDictionary(Dictionary autoDictionary) {
mAutoDictionary = autoDictionary;
}
@@ -163,6 +159,14 @@ public class Suggest implements Dictionary.WordCallback {
mUserBigramDictionary = userBigramDictionary;
}
+ public void setAutoCorrectionThreshold(double threshold) {
+ mAutoCorrectionThreshold = threshold;
+ }
+
+ public boolean isAggressiveAutoCorrectionMode() {
+ return (mAutoCorrectionThreshold == 0);
+ }
+
/**
* Number of suggestions to generate from the input key sequence. This has
* to be a number between 1 and 100 (inclusive).
@@ -183,45 +187,24 @@ public class Suggest implements Dictionary.WordCallback {
}
}
- private boolean haveSufficientCommonality(String original, CharSequence suggestion) {
- final int originalLength = original.length();
- final int suggestionLength = suggestion.length();
- final int minLength = Math.min(originalLength, suggestionLength);
- if (minLength <= 2) return true;
- int matching = 0;
- int lessMatching = 0; // Count matches if we skip one character
- int i;
- for (i = 0; i < minLength; i++) {
- final char origChar = ExpandableDictionary.toLowerCase(original.charAt(i));
- if (origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i))) {
- matching++;
- lessMatching++;
- } else if (i + 1 < suggestionLength
- && origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i + 1))) {
- lessMatching++;
- }
- }
- matching = Math.max(matching, lessMatching);
-
- if (minLength <= 4) {
- return matching >= 2;
- } else {
- return matching > minLength / 2;
- }
- }
-
/**
- * Returns a list of words that match the list of character codes passed in.
- * This list will be overwritten the next time this function is called.
+ * Returns a object which represents suggested words that match the list of character codes
+ * passed in. This object contents will be overwritten the next time this function is called.
* @param view a view for retrieving the context for AutoText
* @param wordComposer contains what is currently being typed
* @param prevWordForBigram previous word (used only for bigram)
- * @return list of suggestions.
+ * @return suggested words object.
*/
- public List<CharSequence> getSuggestions(View view, WordComposer wordComposer,
- boolean includeTypedWordIfValid, CharSequence prevWordForBigram) {
+ public SuggestedWords getSuggestions(View view, WordComposer wordComposer,
+ CharSequence prevWordForBigram) {
+ return getSuggestedWordBuilder(view, wordComposer, prevWordForBigram).build();
+ }
+
+ // TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder
+ public SuggestedWords.Builder getSuggestedWordBuilder(View view, WordComposer wordComposer,
+ CharSequence prevWordForBigram) {
LatinImeLogger.onStartSuggestion(prevWordForBigram);
- mHaveCorrection = false;
+ mHasAutoCorrection = false;
mIsFirstCharCapitalized = wordComposer.isFirstCharCapitalized();
mIsAllUpperCase = wordComposer.isAllUpperCase();
collectGarbage(mSuggestions, mPrefMaxSuggestions);
@@ -229,13 +212,13 @@ public class Suggest implements Dictionary.WordCallback {
Arrays.fill(mNextLettersFrequencies, 0);
// Save a lowercase version of the original word
- mOriginalWord = wordComposer.getTypedWord();
- if (mOriginalWord != null) {
- final String mOriginalWordString = mOriginalWord.toString();
- mOriginalWord = mOriginalWordString;
- mLowerOriginalWord = mOriginalWordString.toLowerCase();
+ CharSequence typedWord = wordComposer.getTypedWord();
+ if (typedWord != null) {
+ final String typedWordString = typedWord.toString();
+ typedWord = typedWordString;
+ mLowerOriginalWord = typedWordString.toLowerCase();
// Treating USER_TYPED as UNIGRAM suggestion for logging now.
- LatinImeLogger.onAddSuggestedWord(mOriginalWordString, Suggest.DIC_USER_TYPED,
+ LatinImeLogger.onAddSuggestedWord(typedWordString, Suggest.DIC_USER_TYPED,
Dictionary.DataType.UNIGRAM);
} else {
mLowerOriginalWord = "";
@@ -249,7 +232,7 @@ public class Suggest implements Dictionary.WordCallback {
if (!TextUtils.isEmpty(prevWordForBigram)) {
CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase();
- if (mMainDict.isValidWord(lowerPrevWord)) {
+ if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) {
prevWordForBigram = lowerPrevWord;
}
if (mUserBigramDictionary != null) {
@@ -293,29 +276,37 @@ public class Suggest implements Dictionary.WordCallback {
mContactsDictionary.getWords(wordComposer, this, mNextLettersFrequencies);
}
- if (mSuggestions.size() > 0 && isValidWord(mOriginalWord)
+ if (mSuggestions.size() > 0 && isValidWord(typedWord)
&& (mCorrectionMode == CORRECTION_FULL
|| mCorrectionMode == CORRECTION_FULL_BIGRAM)) {
- mHaveCorrection = true;
+ if (DBG) {
+ Log.d(TAG, "Auto corrected by CORRECTION_FULL.");
+ }
+ mHasAutoCorrection = true;
}
}
- mMainDict.getWords(wordComposer, this, mNextLettersFrequencies);
+ if (mMainDict != null) mMainDict.getWords(wordComposer, this, mNextLettersFrequencies);
if ((mCorrectionMode == CORRECTION_FULL || mCorrectionMode == CORRECTION_FULL_BIGRAM)
- && mSuggestions.size() > 0) {
- mHaveCorrection = true;
+ && mSuggestions.size() > 0 && mPriorities.length > 0) {
+ // TODO: when the normalized score of the first suggestion is nearly equals to
+ // the normalized score of the second suggestion, behave less aggressive.
+ final double normalizedScore = Utils.calcNormalizedScore(
+ typedWord, mSuggestions.get(0), mPriorities[0]);
+ if (LatinImeLogger.sDBG) {
+ Log.d(TAG, "Normalized " + typedWord + "," + mSuggestions.get(0) + ","
+ + mPriorities[0] + ", " + normalizedScore
+ + "(" + mAutoCorrectionThreshold + ")");
+ }
+ if (normalizedScore >= mAutoCorrectionThreshold) {
+ if (DBG) {
+ Log.d(TAG, "Auto corrected by S-threthhold.");
+ }
+ mHasAutoCorrection = true;
+ }
}
}
- if (mOriginalWord != null) {
- mSuggestions.add(0, mOriginalWord.toString());
- }
-
- // Check if the first suggestion has a minimum number of characters in common
- if (wordComposer.size() > 1 && mSuggestions.size() > 1
- && (mCorrectionMode == CORRECTION_FULL
- || mCorrectionMode == CORRECTION_FULL_BIGRAM)) {
- if (!haveSufficientCommonality(mLowerOriginalWord, mSuggestions.get(1))) {
- mHaveCorrection = false;
- }
+ if (typedWord != null) {
+ mSuggestions.add(0, typedWord.toString());
}
if (mAutoTextEnabled) {
int i = 0;
@@ -326,8 +317,25 @@ public class Suggest implements Dictionary.WordCallback {
String suggestedWord = mSuggestions.get(i).toString().toLowerCase();
CharSequence autoText =
AutoText.get(suggestedWord, 0, suggestedWord.length(), view);
- // Is there an AutoText correction?
+ // Is there an AutoText (also known as Quick Fixes) correction?
boolean canAdd = autoText != null;
+ // Capitalize as needed
+ final int autoTextLength = autoText != null ? autoText.length() : 0;
+ if (autoTextLength > 0 && (mIsAllUpperCase || mIsFirstCharCapitalized)) {
+ int poolSize = mStringPool.size();
+ StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(
+ poolSize - 1) : new StringBuilder(getApproxMaxWordLength());
+ sb.setLength(0);
+ if (mIsAllUpperCase) {
+ sb.append(autoText.toString().toUpperCase());
+ } else if (mIsFirstCharCapitalized) {
+ sb.append(Character.toUpperCase(autoText.charAt(0)));
+ if (autoTextLength > 1) {
+ sb.append(autoText.subSequence(1, autoTextLength));
+ }
+ }
+ autoText = sb.toString();
+ }
// Is that correction already the current prediction (or original word)?
canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i));
// Is that correction already the next predicted word?
@@ -335,7 +343,10 @@ public class Suggest implements Dictionary.WordCallback {
canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i + 1));
}
if (canAdd) {
- mHaveCorrection = true;
+ if (DBG) {
+ Log.d(TAG, "Auto corrected by AUTOTEXT.");
+ }
+ mHasAutoCorrection = true;
mSuggestions.add(i + 1, autoText);
i++;
}
@@ -343,7 +354,7 @@ public class Suggest implements Dictionary.WordCallback {
}
}
removeDupes();
- return mSuggestions;
+ return new SuggestedWords.Builder().addWords(mSuggestions, null);
}
public int[] getNextLettersFrequencies() {
@@ -377,11 +388,11 @@ public class Suggest implements Dictionary.WordCallback {
}
}
- public boolean hasMinimalCorrection() {
- return mHaveCorrection;
+ public boolean hasAutoCorrection() {
+ return mHasAutoCorrection;
}
- private boolean compareCaseInsensitive(final String mLowerOriginalWord,
+ private boolean compareCaseInsensitive(final String mLowerOriginalWord,
final char[] word, final int offset, final int length) {
final int originalLength = mLowerOriginalWord.length();
if (originalLength == length && Character.isUpperCase(word[offset])) {
@@ -395,6 +406,7 @@ public class Suggest implements Dictionary.WordCallback {
return false;
}
+ @Override
public boolean addWord(final char[] word, final int offset, final int length, int freq,
final int dicTypeId, final Dictionary.DataType dataType) {
Dictionary.DataType dataTypeForLog = dataType;
@@ -450,11 +462,10 @@ public class Suggest implements Dictionary.WordCallback {
return true;
}
- System.arraycopy(priorities, pos, priorities, pos + 1,
- prefMaxSuggestions - pos - 1);
+ System.arraycopy(priorities, pos, priorities, pos + 1, prefMaxSuggestions - pos - 1);
priorities[pos] = freq;
int poolSize = mStringPool.size();
- StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1)
+ StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1)
: new StringBuilder(getApproxMaxWordLength());
sb.setLength(0);
if (mIsAllUpperCase) {
@@ -500,7 +511,7 @@ public class Suggest implements Dictionary.WordCallback {
}
public boolean isValidWord(final CharSequence word) {
- if (word == null || word.length() == 0) {
+ if (word == null || word.length() == 0 || mMainDict == null) {
return false;
}
return mMainDict.isValidWord(word)
@@ -508,7 +519,7 @@ public class Suggest implements Dictionary.WordCallback {
|| (mAutoDictionary != null && mAutoDictionary.isValidWord(word))
|| (mContactsDictionary != null && mContactsDictionary.isValidWord(word));
}
-
+
private void collectGarbage(ArrayList<CharSequence> suggestions, int prefMaxSuggestions) {
int poolSize = mStringPool.size();
int garbageSize = suggestions.size();
@@ -529,6 +540,23 @@ public class Suggest implements Dictionary.WordCallback {
public void close() {
if (mMainDict != null) {
mMainDict.close();
+ mMainDict = null;
+ }
+ if (mUserDictionary != null) {
+ mUserDictionary.close();
+ mUserDictionary = null;
+ }
+ if (mUserBigramDictionary != null) {
+ mUserBigramDictionary.close();
+ mUserBigramDictionary = null;
+ }
+ if (mContactsDictionary != null) {
+ mContactsDictionary.close();
+ mContactsDictionary = null;
+ }
+ if (mAutoDictionary != null) {
+ mAutoDictionary.close();
+ mAutoDictionary = null;
}
}
}
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
new file mode 100644
index 000000000..f774ce3a5
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.latin;
+
+import android.view.inputmethod.CompletionInfo;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+
+public class SuggestedWords {
+ public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, null);
+
+ public final List<CharSequence> mWords;
+ public final boolean mIsApplicationSpecifiedCompletions;
+ public final boolean mTypedWordValid;
+ public final boolean mHasMinimalSuggestion;
+ public final List<SuggestedWordInfo> mSuggestedWordInfoList;
+
+ private SuggestedWords(List<CharSequence> words, boolean isApplicationSpecifiedCompletions,
+ boolean typedWordValid, boolean hasMinamlSuggestion,
+ List<SuggestedWordInfo> suggestedWordInfoList) {
+ if (words != null) {
+ mWords = words;
+ } else {
+ mWords = Collections.emptyList();
+ }
+ mIsApplicationSpecifiedCompletions = isApplicationSpecifiedCompletions;
+ mTypedWordValid = typedWordValid;
+ mHasMinimalSuggestion = hasMinamlSuggestion;
+ mSuggestedWordInfoList = suggestedWordInfoList;
+ }
+
+ public int size() {
+ return mWords.size();
+ }
+
+ public CharSequence getWord(int pos) {
+ return mWords.get(pos);
+ }
+
+ public boolean hasAutoCorrectionWord() {
+ return mHasMinimalSuggestion && size() > 1 && !mTypedWordValid;
+ }
+
+ public boolean hasWordAboveAutoCorrectionScoreThreshold() {
+ return mHasMinimalSuggestion && ((size() > 1 && !mTypedWordValid) || mTypedWordValid);
+ }
+
+ public static class Builder {
+ private List<CharSequence> mWords = new ArrayList<CharSequence>();
+ private boolean mIsCompletions;
+ private boolean mTypedWordValid;
+ private boolean mHasMinimalSuggestion;
+ private List<SuggestedWordInfo> mSuggestedWordInfoList =
+ new ArrayList<SuggestedWordInfo>();
+
+ public Builder() {
+ // Nothing to do here.
+ }
+
+ public Builder addWords(List<CharSequence> words,
+ List<SuggestedWordInfo> suggestedWordInfoList) {
+ final int N = words.size();
+ for (int i = 0; i < N; ++i) {
+ SuggestedWordInfo suggestedWordInfo = null;
+ if (suggestedWordInfoList != null) {
+ suggestedWordInfo = suggestedWordInfoList.get(i);
+ }
+ if (suggestedWordInfo == null) {
+ suggestedWordInfo = new SuggestedWordInfo();
+ }
+ addWord(words.get(i), suggestedWordInfo);
+ }
+ return this;
+ }
+
+ public Builder addWord(CharSequence word) {
+ return addWord(word, null, false);
+ }
+
+ public Builder addWord(CharSequence word, CharSequence debugString,
+ boolean isPreviousSuggestedWord) {
+ SuggestedWordInfo info = new SuggestedWordInfo(debugString, isPreviousSuggestedWord);
+ return addWord(word, info);
+ }
+
+ private Builder addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo) {
+ mWords.add(word);
+ mSuggestedWordInfoList.add(suggestedWordInfo);
+ return this;
+ }
+
+ public Builder setApplicationSpecifiedCompletions(CompletionInfo[] infos) {
+ for (CompletionInfo info : infos)
+ addWord(info.getText());
+ mIsCompletions = true;
+ return this;
+ }
+
+ public Builder setTypedWordValid(boolean typedWordValid) {
+ mTypedWordValid = typedWordValid;
+ return this;
+ }
+
+ public Builder setHasMinimalSuggestion(boolean hasMinamlSuggestion) {
+ mHasMinimalSuggestion = hasMinamlSuggestion;
+ return this;
+ }
+
+ // Should get rid of the first one (what the user typed previously) from suggestions
+ // and replace it with what the user currently typed.
+ public Builder addTypedWordAndPreviousSuggestions(CharSequence typedWord,
+ SuggestedWords previousSuggestions) {
+ mWords.clear();
+ mSuggestedWordInfoList.clear();
+ final HashSet<String> alreadySeen = new HashSet<String>();
+ addWord(typedWord, null, false);
+ alreadySeen.add(typedWord.toString());
+ final int previousSize = previousSuggestions.size();
+ for (int pos = 1; pos < previousSize; pos++) {
+ final String prevWord = previousSuggestions.getWord(pos).toString();
+ // Filter out duplicate suggestion.
+ if (!alreadySeen.contains(prevWord)) {
+ addWord(prevWord, null, true);
+ alreadySeen.add(prevWord);
+ }
+ }
+ mIsCompletions = false;
+ mTypedWordValid = false;
+ mHasMinimalSuggestion = false;
+ return this;
+ }
+
+ public SuggestedWords build() {
+ return new SuggestedWords(mWords, mIsCompletions, mTypedWordValid,
+ mHasMinimalSuggestion, mSuggestedWordInfoList);
+ }
+
+ public int size() {
+ return mWords.size();
+ }
+
+ public CharSequence getWord(int pos) {
+ return mWords.get(pos);
+ }
+ }
+
+ public static class SuggestedWordInfo {
+ private final CharSequence mDebugString;
+ private final boolean mPreviousSuggestedWord;
+
+ public SuggestedWordInfo() {
+ mDebugString = "";
+ mPreviousSuggestedWord = false;
+ }
+
+ public SuggestedWordInfo(CharSequence debugString, boolean previousSuggestedWord) {
+ mDebugString = debugString;
+ mPreviousSuggestedWord = previousSuggestedWord;
+ }
+
+ public String getDebugString() {
+ if (mDebugString == null) {
+ return "";
+ } else {
+ return mDebugString.toString();
+ }
+ }
+
+ public boolean isPreviousSuggestedWord () {
+ return mPreviousSuggestedWord;
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java
index 9011191f1..f571f26d5 100644
--- a/java/src/com/android/inputmethod/latin/TextEntryState.java
+++ b/java/src/com/android/inputmethod/latin/TextEntryState.java
@@ -16,8 +16,9 @@
package com.android.inputmethod.latin;
+import com.android.inputmethod.keyboard.Key;
+
import android.content.Context;
-import android.inputmethodservice.Keyboard.Key;
import android.text.format.DateFormat;
import android.util.Log;
@@ -61,7 +62,7 @@ public class TextEntryState {
SPACE_AFTER_PICKED,
UNDO_COMMIT,
CORRECTING,
- PICKED_CORRECTION;
+ PICKED_CORRECTION,
}
private static State sState = State.UNKNOWN;
@@ -96,7 +97,7 @@ public class TextEntryState {
}
try {
sKeyLocationFile.close();
- // Write to log file
+ // Write to log file
// Write timestamp, settings,
String out = DateFormat.format("MM:dd hh:mm:ss", Calendar.getInstance().getTime())
.toString()
@@ -112,7 +113,7 @@ public class TextEntryState {
sKeyLocationFile = null;
sUserActionFile = null;
} catch (IOException ioe) {
-
+ // ignore
}
}
@@ -134,16 +135,18 @@ public class TextEntryState {
public static void backToAcceptedDefault(CharSequence typedWord) {
if (typedWord == null) return;
switch (sState) {
- case SPACE_AFTER_ACCEPTED:
- case PUNCTUATION_AFTER_ACCEPTED:
- case IN_WORD:
- sState = State.ACCEPTED_DEFAULT;
- break;
+ case SPACE_AFTER_ACCEPTED:
+ case PUNCTUATION_AFTER_ACCEPTED:
+ case IN_WORD:
+ sState = State.ACCEPTED_DEFAULT;
+ break;
+ default:
+ break;
}
displayState();
}
- public static void acceptedTyped(CharSequence typedWord) {
+ public static void acceptedTyped(@SuppressWarnings("unused") CharSequence typedWord) {
sWordNotInDictionaryCount++;
sState = State.PICKED_SUGGESTION;
displayState();
@@ -168,6 +171,13 @@ public class TextEntryState {
displayState();
}
+ public static void onAbortCorrection() {
+ if (isCorrecting()) {
+ sState = State.START;
+ }
+ displayState();
+ }
+
public static void typedCharacter(char c, boolean isSeparator) {
boolean isSpace = c == ' ';
switch (sState) {
@@ -253,13 +263,13 @@ public class TextEntryState {
}
public static void keyPressedAt(Key key, int x, int y) {
- if (LOGGING && sKeyLocationFile != null && key.codes[0] >= 32) {
- String out =
- "KEY: " + (char) key.codes[0]
- + " X: " + x
+ if (LOGGING && sKeyLocationFile != null && key.mCode >= 32) {
+ String out =
+ "KEY: " + (char) key.mCode
+ + " X: " + x
+ " Y: " + y
- + " MX: " + (key.x + key.width / 2)
- + " MY: " + (key.y + key.height / 2)
+ + " MX: " + (key.mX + key.mWidth / 2)
+ + " MY: " + (key.mY + key.mHeight / 2)
+ "\n";
try {
sKeyLocationFile.write(out.getBytes());
diff --git a/java/src/com/android/inputmethod/latin/Tutorial.java b/java/src/com/android/inputmethod/latin/Tutorial.java
deleted file mode 100644
index d3eaf30c6..000000000
--- a/java/src/com/android/inputmethod/latin/Tutorial.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.Message;
-import android.text.Layout;
-import android.text.SpannableStringBuilder;
-import android.text.StaticLayout;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.widget.PopupWindow;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Tutorial implements OnTouchListener {
-
- private List<Bubble> mBubbles = new ArrayList<Bubble>();
- private View mInputView;
- private LatinIME mIme;
- private int[] mLocation = new int[2];
-
- private static final int MSG_SHOW_BUBBLE = 0;
-
- private int mBubbleIndex;
-
- Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_SHOW_BUBBLE:
- Bubble bubba = (Bubble) msg.obj;
- bubba.show(mLocation[0], mLocation[1]);
- break;
- }
- }
- };
-
- class Bubble {
- Drawable bubbleBackground;
- int x;
- int y;
- int width;
- int gravity;
- CharSequence text;
- boolean dismissOnTouch;
- boolean dismissOnClose;
- PopupWindow window;
- TextView textView;
- View inputView;
-
- Bubble(Context context, View inputView,
- int backgroundResource, int bx, int by, int textResource1, int textResource2) {
- bubbleBackground = context.getResources().getDrawable(backgroundResource);
- x = bx;
- y = by;
- width = (int) (inputView.getWidth() * 0.9);
- this.gravity = Gravity.TOP | Gravity.LEFT;
- text = new SpannableStringBuilder()
- .append(context.getResources().getText(textResource1))
- .append("\n")
- .append(context.getResources().getText(textResource2));
- this.dismissOnTouch = true;
- this.dismissOnClose = false;
- this.inputView = inputView;
- window = new PopupWindow(context);
- window.setBackgroundDrawable(null);
- LayoutInflater inflate =
- (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- textView = (TextView) inflate.inflate(R.layout.bubble_text, null);
- textView.setBackgroundDrawable(bubbleBackground);
- textView.setText(text);
- //textView.setText(textResource1);
- window.setContentView(textView);
- window.setFocusable(false);
- window.setTouchable(true);
- window.setOutsideTouchable(false);
- }
-
- private int chooseSize(PopupWindow pop, View parentView, CharSequence text, TextView tv) {
- int wid = tv.getPaddingLeft() + tv.getPaddingRight();
- int ht = tv.getPaddingTop() + tv.getPaddingBottom();
-
- /*
- * Figure out how big the text would be if we laid it out to the
- * full width of this view minus the border.
- */
- int cap = width - wid;
-
- Layout l = new StaticLayout(text, tv.getPaint(), cap,
- Layout.Alignment.ALIGN_NORMAL, 1, 0, true);
- float max = 0;
- for (int i = 0; i < l.getLineCount(); i++) {
- max = Math.max(max, l.getLineWidth(i));
- }
-
- /*
- * Now set the popup size to be big enough for the text plus the border.
- */
- pop.setWidth(width);
- pop.setHeight(ht + l.getHeight());
- return l.getHeight();
- }
-
- void show(int offx, int offy) {
- int textHeight = chooseSize(window, inputView, text, textView);
- offy -= textView.getPaddingTop() + textHeight;
- if (inputView.getVisibility() == View.VISIBLE
- && inputView.getWindowVisibility() == View.VISIBLE) {
- try {
- if ((gravity & Gravity.BOTTOM) == Gravity.BOTTOM) offy -= window.getHeight();
- if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) offx -= window.getWidth();
- textView.setOnTouchListener(new View.OnTouchListener() {
- public boolean onTouch(View view, MotionEvent me) {
- Tutorial.this.next();
- return true;
- }
- });
- window.showAtLocation(inputView, Gravity.NO_GRAVITY, x + offx, y + offy);
- } catch (Exception e) {
- // Input view is not valid
- }
- }
- }
-
- void hide() {
- if (window.isShowing()) {
- textView.setOnTouchListener(null);
- window.dismiss();
- }
- }
-
- boolean isShowing() {
- return window.isShowing();
- }
- }
-
- public Tutorial(LatinIME ime, LatinKeyboardView inputView) {
- Context context = inputView.getContext();
- mIme = ime;
- int inputWidth = inputView.getWidth();
- final int x = inputWidth / 20; // Half of 1/10th
- Bubble bWelcome = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step02, x, 0,
- R.string.tip_to_open_keyboard, R.string.touch_to_continue);
- mBubbles.add(bWelcome);
- Bubble bAccents = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step02, x, 0,
- R.string.tip_to_view_accents, R.string.touch_to_continue);
- mBubbles.add(bAccents);
- Bubble b123 = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step07, x, 0,
- R.string.tip_to_open_symbols, R.string.touch_to_continue);
- mBubbles.add(b123);
- Bubble bABC = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step07, x, 0,
- R.string.tip_to_close_symbols, R.string.touch_to_continue);
- mBubbles.add(bABC);
- Bubble bSettings = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step07, x, 0,
- R.string.tip_to_launch_settings, R.string.touch_to_continue);
- mBubbles.add(bSettings);
- Bubble bDone = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step02, x, 0,
- R.string.tip_to_start_typing, R.string.touch_to_finish);
- mBubbles.add(bDone);
- mInputView = inputView;
- }
-
- void start() {
- mInputView.getLocationInWindow(mLocation);
- mBubbleIndex = -1;
- mInputView.setOnTouchListener(this);
- next();
- }
-
- boolean next() {
- if (mBubbleIndex >= 0) {
- // If the bubble is not yet showing, don't move to the next.
- if (!mBubbles.get(mBubbleIndex).isShowing()) {
- return true;
- }
- // Hide all previous bubbles as well, as they may have had a delayed show
- for (int i = 0; i <= mBubbleIndex; i++) {
- mBubbles.get(i).hide();
- }
- }
- mBubbleIndex++;
- if (mBubbleIndex >= mBubbles.size()) {
- mInputView.setOnTouchListener(null);
- mIme.sendDownUpKeyEvents(-1); // Inform the setupwizard that tutorial is in last bubble
- mIme.tutorialDone();
- return false;
- }
- if (mBubbleIndex == 3 || mBubbleIndex == 4) {
- mIme.mKeyboardSwitcher.toggleSymbols();
- }
- mHandler.sendMessageDelayed(
- mHandler.obtainMessage(MSG_SHOW_BUBBLE, mBubbles.get(mBubbleIndex)), 500);
- return true;
- }
-
- void hide() {
- for (int i = 0; i < mBubbles.size(); i++) {
- mBubbles.get(i).hide();
- }
- mInputView.setOnTouchListener(null);
- }
-
- boolean close() {
- mHandler.removeMessages(MSG_SHOW_BUBBLE);
- hide();
- return true;
- }
-
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- next();
- }
- return true;
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
index 67d9c0bcf..4750fb991 100644
--- a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
@@ -16,10 +16,6 @@
package com.android.inputmethod.latin;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
@@ -30,6 +26,10 @@ import android.os.AsyncTask;
import android.provider.BaseColumns;
import android.util.Log;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+
/**
* Stores all the pairs user types in databases. Prune the database if the size
* gets too big. Unlike AutoDictionary, it even stores the pairs that are already
@@ -108,25 +108,25 @@ public class UserBigramDictionary extends ExpandableDictionary {
private static DatabaseHelper sOpenHelper = null;
private static class Bigram {
- String word1;
- String word2;
- int frequency;
+ public final String mWord1;
+ public final String mWord2;
+ public final int frequency;
Bigram(String word1, String word2, int frequency) {
- this.word1 = word1;
- this.word2 = word2;
+ this.mWord1 = word1;
+ this.mWord2 = word2;
this.frequency = frequency;
}
@Override
public boolean equals(Object bigram) {
Bigram bigram2 = (Bigram) bigram;
- return (word1.equals(bigram2.word1) && word2.equals(bigram2.word2));
+ return (mWord1.equals(bigram2.mWord1) && mWord2.equals(bigram2.mWord2));
}
@Override
public int hashCode() {
- return (word1 + " " + word2).hashCode();
+ return (mWord1 + " " + mWord2).hashCode();
}
}
@@ -357,7 +357,7 @@ public class UserBigramDictionary extends ExpandableDictionary {
Cursor c = db.query(MAIN_TABLE_NAME, new String[] { MAIN_COLUMN_ID },
MAIN_COLUMN_WORD1 + "=? AND " + MAIN_COLUMN_WORD2 + "=? AND "
+ MAIN_COLUMN_LOCALE + "=?",
- new String[] { bi.word1, bi.word2, mLocale }, null, null, null);
+ new String[] { bi.mWord1, bi.mWord2, mLocale }, null, null, null);
int pairId;
if (c.moveToFirst()) {
@@ -368,7 +368,7 @@ public class UserBigramDictionary extends ExpandableDictionary {
} else {
// new pair
Long pairIdLong = db.insert(MAIN_TABLE_NAME, null,
- getContentValues(bi.word1, bi.word2, mLocale));
+ getContentValues(bi.mWord1, bi.mWord2, mLocale));
pairId = pairIdLong.intValue();
}
c.close();
diff --git a/java/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java
index 49b95e9aa..56ee5b9e7 100644
--- a/java/src/com/android/inputmethod/latin/UserDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserDictionary.java
@@ -21,18 +21,21 @@ import android.content.ContentValues;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
+import android.net.Uri;
import android.provider.UserDictionary.Words;
public class UserDictionary extends ExpandableDictionary {
- private static final String[] PROJECTION = {
- Words._ID,
+ private static final String[] PROJECTION_QUERY = {
Words.WORD,
- Words.FREQUENCY
+ Words.FREQUENCY,
};
- private static final int INDEX_WORD = 1;
- private static final int INDEX_FREQUENCY = 2;
+ private static final String[] PROJECTION_ADD = {
+ Words._ID,
+ Words.FREQUENCY,
+ Words.LOCALE,
+ };
private ContentObserver mObserver;
private String mLocale;
@@ -66,7 +69,7 @@ public class UserDictionary extends ExpandableDictionary {
@Override
public void loadDictionaryAsync() {
Cursor cursor = getContext().getContentResolver()
- .query(Words.CONTENT_URI, PROJECTION, "(locale IS NULL) or (locale=?)",
+ .query(Words.CONTENT_URI, PROJECTION_QUERY, "(locale IS NULL) or (locale=?)",
new String[] { mLocale }, null);
addWords(cursor);
}
@@ -80,7 +83,7 @@ public class UserDictionary extends ExpandableDictionary {
* @TODO use a higher or float range for frequency
*/
@Override
- public synchronized void addWord(String word, int frequency) {
+ public synchronized void addWord(final String word, final int frequency) {
// Force load the dictionary here synchronously
if (getRequiresReload()) loadDictionaryAsync();
// Safeguard against adding long words. Can cause stack overflow.
@@ -97,8 +100,24 @@ public class UserDictionary extends ExpandableDictionary {
final ContentResolver contentResolver = getContext().getContentResolver();
new Thread("addWord") {
+ @Override
public void run() {
- contentResolver.insert(Words.CONTENT_URI, values);
+ Cursor cursor = contentResolver.query(Words.CONTENT_URI, PROJECTION_ADD,
+ "word=? and ((locale IS NULL) or (locale=?))",
+ new String[] { word, mLocale }, null);
+ if (cursor != null && cursor.moveToFirst()) {
+ String locale = cursor.getString(cursor.getColumnIndex(Words.LOCALE));
+ // If locale is null, we will not override the entry.
+ if (locale != null && locale.equals(mLocale.toString())) {
+ long id = cursor.getLong(cursor.getColumnIndex(Words._ID));
+ Uri uri = Uri.withAppendedPath(Words.CONTENT_URI, Long.toString(id));
+ // Update the entry with new frequency value.
+ contentResolver.update(uri, values, null, null);
+ }
+ } else {
+ // Insert new entry.
+ contentResolver.insert(Words.CONTENT_URI, values);
+ }
}
}.start();
@@ -122,9 +141,11 @@ public class UserDictionary extends ExpandableDictionary {
final int maxWordLength = getMaxWordLength();
if (cursor.moveToFirst()) {
+ final int indexWord = cursor.getColumnIndex(Words.WORD);
+ final int indexFrequency = cursor.getColumnIndex(Words.FREQUENCY);
while (!cursor.isAfterLast()) {
- String word = cursor.getString(INDEX_WORD);
- int frequency = cursor.getInt(INDEX_FREQUENCY);
+ String word = cursor.getString(indexWord);
+ int frequency = cursor.getInt(indexFrequency);
// Safeguard against adding really long words. Stack may overflow due
// to recursion
if (word.length() < maxWordLength) {
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
new file mode 100644
index 000000000..e980d3a30
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -0,0 +1,442 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.latin;
+
+import android.inputmethodservice.InputMethodService;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.text.format.DateUtils;
+import android.util.Log;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class Utils {
+ private static final String TAG = Utils.class.getSimpleName();
+ private static final int MINIMUM_SAFETY_NET_CHAR_LENGTH = 4;
+ private static boolean DBG = LatinImeLogger.sDBG;
+
+ /**
+ * Cancel an {@link AsyncTask}.
+ *
+ * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this
+ * task should be interrupted; otherwise, in-progress tasks are allowed
+ * to complete.
+ */
+ public static void cancelTask(AsyncTask<?, ?, ?> task, boolean mayInterruptIfRunning) {
+ if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) {
+ task.cancel(mayInterruptIfRunning);
+ }
+ }
+
+ public static class GCUtils {
+ private static final String TAG = "GCUtils";
+ public static final int GC_TRY_COUNT = 2;
+ // GC_TRY_LOOP_MAX is used for the hard limit of GC wait,
+ // GC_TRY_LOOP_MAX should be greater than GC_TRY_COUNT.
+ public static final int GC_TRY_LOOP_MAX = 5;
+ private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS;
+ private static GCUtils sInstance = new GCUtils();
+ private int mGCTryCount = 0;
+
+ public static GCUtils getInstance() {
+ return sInstance;
+ }
+
+ public void reset() {
+ mGCTryCount = 0;
+ }
+
+ public boolean tryGCOrWait(String metaData, Throwable t) {
+ if (mGCTryCount == 0) {
+ System.gc();
+ }
+ if (++mGCTryCount > GC_TRY_COUNT) {
+ LatinImeLogger.logOnException(metaData, t);
+ return false;
+ } else {
+ try {
+ Thread.sleep(GC_INTERVAL);
+ return true;
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Sleep was interrupted.");
+ LatinImeLogger.logOnException(metaData, t);
+ return false;
+ }
+ }
+ }
+ }
+
+ public static boolean hasMultipleEnabledIMEsOrSubtypes(InputMethodManager imm) {
+ return imm.getEnabledInputMethodList().size() > 1
+ // imm.getEnabledInputMethodSubtypeList(null, false) will return the current IME's enabled
+ // input method subtype (The current IME should be LatinIME.)
+ || imm.getEnabledInputMethodSubtypeList(null, false).size() > 1;
+ }
+
+ public static String getInputMethodId(InputMethodManager imm, String packageName) {
+ for (final InputMethodInfo imi : imm.getEnabledInputMethodList()) {
+ if (imi.getPackageName().equals(packageName))
+ return imi.getId();
+ }
+ throw new RuntimeException("Can not find input method id for " + packageName);
+ }
+
+ public static boolean shouldBlockedBySafetyNetForAutoCorrection(SuggestedWords suggestions,
+ Suggest suggest) {
+ // Safety net for auto correction.
+ // Actually if we hit this safety net, it's actually a bug.
+ if (suggestions.size() <= 1 || suggestions.mTypedWordValid) return false;
+ // If user selected aggressive auto correction mode, there is no need to use the safety
+ // net.
+ if (suggest.isAggressiveAutoCorrectionMode()) return false;
+ CharSequence typedWord = suggestions.getWord(0);
+ // If the length of typed word is less than MINIMUM_SAFETY_NET_CHAR_LENGTH,
+ // we should not use net because relatively edit distance can be big.
+ if (typedWord.length() < MINIMUM_SAFETY_NET_CHAR_LENGTH) return false;
+ CharSequence candidateWord = suggestions.getWord(1);
+ final int typedWordLength = typedWord.length();
+ final int maxEditDistanceOfNativeDictionary = typedWordLength < 5 ? 2 : typedWordLength / 2;
+ final int distance = Utils.editDistance(typedWord, candidateWord);
+ if (DBG) {
+ Log.d(TAG, "Autocorrected edit distance = " + distance
+ + ", " + maxEditDistanceOfNativeDictionary);
+ }
+ if (distance > maxEditDistanceOfNativeDictionary) {
+ if (DBG) {
+ Log.d(TAG, "Safety net: before = " + typedWord + ", after = " + candidateWord);
+ Log.w(TAG, "(Error) The edit distance of this correction exceeds limit. "
+ + "Turning off auto-correction.");
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /* package */ static class RingCharBuffer {
+ private static RingCharBuffer sRingCharBuffer = new RingCharBuffer();
+ private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC';
+ private static final int INVALID_COORDINATE = -2;
+ /* package */ static final int BUFSIZE = 20;
+ private InputMethodService mContext;
+ private boolean mEnabled = false;
+ private boolean mUsabilityStudy = false;
+ private int mEnd = 0;
+ /* package */ int mLength = 0;
+ private char[] mCharBuf = new char[BUFSIZE];
+ private int[] mXBuf = new int[BUFSIZE];
+ private int[] mYBuf = new int[BUFSIZE];
+
+ private RingCharBuffer() {
+ // Intentional empty constructor for singleton.
+ }
+ public static RingCharBuffer getInstance() {
+ return sRingCharBuffer;
+ }
+ public static RingCharBuffer init(InputMethodService context, boolean enabled,
+ boolean usabilityStudy) {
+ sRingCharBuffer.mContext = context;
+ sRingCharBuffer.mEnabled = enabled || usabilityStudy;
+ sRingCharBuffer.mUsabilityStudy = usabilityStudy;
+ UsabilityStudyLogUtils.getInstance().init(context);
+ return sRingCharBuffer;
+ }
+ private int normalize(int in) {
+ int ret = in % BUFSIZE;
+ return ret < 0 ? ret + BUFSIZE : ret;
+ }
+ public void push(char c, int x, int y) {
+ if (!mEnabled) return;
+ if (mUsabilityStudy) {
+ UsabilityStudyLogUtils.getInstance().writeChar(c, x, y);
+ }
+ mCharBuf[mEnd] = c;
+ mXBuf[mEnd] = x;
+ mYBuf[mEnd] = y;
+ mEnd = normalize(mEnd + 1);
+ if (mLength < BUFSIZE) {
+ ++mLength;
+ }
+ }
+ public char pop() {
+ if (mLength < 1) {
+ return PLACEHOLDER_DELIMITER_CHAR;
+ } else {
+ mEnd = normalize(mEnd - 1);
+ --mLength;
+ return mCharBuf[mEnd];
+ }
+ }
+ public char getLastChar() {
+ if (mLength < 1) {
+ return PLACEHOLDER_DELIMITER_CHAR;
+ } else {
+ return mCharBuf[normalize(mEnd - 1)];
+ }
+ }
+ public int getPreviousX(char c, int back) {
+ int index = normalize(mEnd - 2 - back);
+ if (mLength <= back
+ || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) {
+ return INVALID_COORDINATE;
+ } else {
+ return mXBuf[index];
+ }
+ }
+ public int getPreviousY(char c, int back) {
+ int index = normalize(mEnd - 2 - back);
+ if (mLength <= back
+ || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) {
+ return INVALID_COORDINATE;
+ } else {
+ return mYBuf[index];
+ }
+ }
+ public String getLastString() {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < mLength; ++i) {
+ char c = mCharBuf[normalize(mEnd - 1 - i)];
+ if (!((LatinIME)mContext).isWordSeparator(c)) {
+ sb.append(c);
+ } else {
+ break;
+ }
+ }
+ return sb.reverse().toString();
+ }
+ public void reset() {
+ mLength = 0;
+ }
+ }
+
+ public static int editDistance(CharSequence s, CharSequence t) {
+ if (s == null || t == null) {
+ throw new IllegalArgumentException("editDistance: Arguments should not be null.");
+ }
+ final int sl = s.length();
+ final int tl = t.length();
+ int[][] dp = new int [sl + 1][tl + 1];
+ for (int i = 0; i <= sl; i++) {
+ dp[i][0] = i;
+ }
+ for (int j = 0; j <= tl; j++) {
+ dp[0][j] = j;
+ }
+ for (int i = 0; i < sl; ++i) {
+ for (int j = 0; j < tl; ++j) {
+ if (Character.toLowerCase(s.charAt(i)) == Character.toLowerCase(t.charAt(j))) {
+ dp[i + 1][j + 1] = dp[i][j];
+ } else {
+ dp[i + 1][j + 1] = 1 + Math.min(dp[i][j],
+ Math.min(dp[i + 1][j], dp[i][j + 1]));
+ }
+ }
+ }
+ return dp[sl][tl];
+ }
+
+ // In dictionary.cpp, getSuggestion() method,
+ // suggestion scores are computed using the below formula.
+ // original score (called 'frequency')
+ // := pow(mTypedLetterMultiplier (this is defined 2),
+ // (the number of matched characters between typed word and suggested word))
+ // * (individual word's score which defined in the unigram dictionary,
+ // and this score is defined in range [0, 255].)
+ // * (when before.length() == after.length(),
+ // mFullWordMultiplier (this is defined 2))
+ // So, maximum original score is pow(2, before.length()) * 255 * 2
+ // So, we can normalize original score by dividing this value.
+ private static final int MAX_INITIAL_SCORE = 255;
+ private static final int TYPED_LETTER_MULTIPLIER = 2;
+ private static final int FULL_WORD_MULTIPLYER = 2;
+ public static double calcNormalizedScore(CharSequence before, CharSequence after, int score) {
+ final int beforeLength = before.length();
+ final int afterLength = after.length();
+ if (beforeLength == 0 || afterLength == 0) return 0;
+ final int distance = editDistance(before, after);
+ // If afterLength < beforeLength, the algorithm is suggesting a word by excessive character
+ // correction.
+ final double maximumScore = MAX_INITIAL_SCORE
+ * Math.pow(TYPED_LETTER_MULTIPLIER, Math.min(beforeLength, afterLength))
+ * FULL_WORD_MULTIPLYER;
+ // add a weight based on edit distance.
+ // distance <= max(afterLength, beforeLength) == afterLength,
+ // so, 0 <= distance / afterLength <= 1
+ final double weight = 1.0 - (double) distance / afterLength;
+ return (score / maximumScore) * weight;
+ }
+
+ public static class UsabilityStudyLogUtils {
+ private static final String TAG = "UsabilityStudyLogUtils";
+ private static final String FILENAME = "log.txt";
+ private static final UsabilityStudyLogUtils sInstance =
+ new UsabilityStudyLogUtils();
+ private final Handler mLoggingHandler;
+ private File mFile;
+ private File mDirectory;
+ private InputMethodService mIms;
+ private PrintWriter mWriter;
+ private final Date mDate;
+ private final SimpleDateFormat mDateFormat;
+
+ private UsabilityStudyLogUtils() {
+ mDate = new Date();
+ mDateFormat = new SimpleDateFormat("dd MMM HH:mm:ss.SSS");
+
+ HandlerThread handlerThread = new HandlerThread("UsabilityStudyLogUtils logging task",
+ Process.THREAD_PRIORITY_BACKGROUND);
+ handlerThread.start();
+ mLoggingHandler = new Handler(handlerThread.getLooper());
+ }
+
+ public static UsabilityStudyLogUtils getInstance() {
+ return sInstance;
+ }
+
+ public void init(InputMethodService ims) {
+ mIms = ims;
+ mDirectory = ims.getFilesDir();
+ }
+
+ private void createLogFileIfNotExist() {
+ if ((mFile == null || !mFile.exists())
+ && (mDirectory != null && mDirectory.exists())) {
+ try {
+ mWriter = getPrintWriter(mDirectory, FILENAME, false);
+ } catch (IOException e) {
+ Log.e(TAG, "Can't create log file.");
+ }
+ }
+ }
+
+ public void writeBackSpace() {
+ UsabilityStudyLogUtils.getInstance().write("<backspace>\t0\t0");
+ }
+
+ public void writeChar(char c, int x, int y) {
+ String inputChar = String.valueOf(c);
+ switch (c) {
+ case '\n':
+ inputChar = "<enter>";
+ break;
+ case '\t':
+ inputChar = "<tab>";
+ break;
+ case ' ':
+ inputChar = "<space>";
+ break;
+ }
+ UsabilityStudyLogUtils.getInstance().write(inputChar + "\t" + x + "\t" + y);
+ LatinImeLogger.onPrintAllUsabilityStudyLogs();
+ }
+
+ public void write(final String log) {
+ mLoggingHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ createLogFileIfNotExist();
+ final long currentTime = System.currentTimeMillis();
+ mDate.setTime(currentTime);
+
+ final String printString = String.format("%s\t%d\t%s\n",
+ mDateFormat.format(mDate), currentTime, log);
+ if (LatinImeLogger.sDBG) {
+ Log.d(TAG, "Write: " + log);
+ }
+ mWriter.print(printString);
+ }
+ });
+ }
+
+ public void printAll() {
+ mLoggingHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mWriter.flush();
+ StringBuilder sb = new StringBuilder();
+ BufferedReader br = getBufferedReader();
+ String line;
+ try {
+ while ((line = br.readLine()) != null) {
+ sb.append('\n');
+ sb.append(line);
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Can't read log file.");
+ } finally {
+ if (LatinImeLogger.sDBG) {
+ Log.d(TAG, "output all logs\n" + sb.toString());
+ }
+ mIms.getCurrentInputConnection().commitText(sb.toString(), 0);
+ try {
+ br.close();
+ } catch (IOException e) {
+ // ignore.
+ }
+ }
+ }
+ });
+ }
+
+ public void clearAll() {
+ mLoggingHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mFile != null && mFile.exists()) {
+ if (LatinImeLogger.sDBG) {
+ Log.d(TAG, "Delete log file.");
+ }
+ mFile.delete();
+ mWriter.close();
+ }
+ }
+ });
+ }
+
+ private BufferedReader getBufferedReader() {
+ createLogFileIfNotExist();
+ try {
+ return new BufferedReader(new FileReader(mFile));
+ } catch (FileNotFoundException e) {
+ return null;
+ }
+ }
+
+ private PrintWriter getPrintWriter(
+ File dir, String filename, boolean renew) throws IOException {
+ mFile = new File(dir, filename);
+ if (mFile.exists()) {
+ if (renew) {
+ mFile.delete();
+ }
+ }
+ return new PrintWriter(new FileOutputStream(mFile), true /* autoFlush */);
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/voice/FieldContext.java b/java/src/com/android/inputmethod/voice/FieldContext.java
index 5fbacfb6c..dfdfbaa9f 100644
--- a/java/src/com/android/inputmethod/voice/FieldContext.java
+++ b/java/src/com/android/inputmethod/voice/FieldContext.java
@@ -73,6 +73,7 @@ public class FieldContext {
bundle.putInt(IME_OPTIONS, info.imeOptions);
}
+ @SuppressWarnings("static-access")
private static void addInputConnectionToBundle(
InputConnection conn, Bundle bundle) {
if (conn == null) {
@@ -96,6 +97,7 @@ public class FieldContext {
return mFieldInfo;
}
+ @Override
public String toString() {
return mFieldInfo.toString();
}
diff --git a/java/src/com/android/inputmethod/latin/Hints.java b/java/src/com/android/inputmethod/voice/Hints.java
index c467365e7..d11d3b042 100644
--- a/java/src/com/android/inputmethod/latin/Hints.java
+++ b/java/src/com/android/inputmethod/voice/Hints.java
@@ -14,14 +14,14 @@
* the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.voice;
-import com.android.inputmethod.voice.SettingsUtil;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SharedPreferencesCompat;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
import android.view.inputmethod.InputConnection;
import java.util.Calendar;
@@ -47,8 +47,9 @@ public class Hints {
private static final int DEFAULT_SWIPE_HINT_MAX_DAYS_TO_SHOW = 7;
private static final int DEFAULT_PUNCTUATION_HINT_MAX_DISPLAYS = 7;
- private Context mContext;
- private Display mDisplay;
+ private final Context mContext;
+ private final SharedPreferences mPrefs;
+ private final Display mDisplay;
private boolean mVoiceResultContainedPunctuation;
private int mSwipeHintMaxDaysToShow;
private int mPunctuationHintMaxDisplays;
@@ -62,8 +63,9 @@ public class Hints {
SPEAKABLE_PUNCTUATION.put("?", "question mark");
}
- public Hints(Context context, Display display) {
+ public Hints(Context context, SharedPreferences prefs, Display display) {
mContext = context;
+ mPrefs = prefs;
mDisplay = display;
ContentResolver cr = mContext.getContentResolver();
@@ -103,8 +105,7 @@ public class Hints {
public void registerVoiceResult(String text) {
// Update the current time as the last time voice input was used.
- SharedPreferences.Editor editor =
- PreferenceManager.getDefaultSharedPreferences(mContext).edit();
+ SharedPreferences.Editor editor = mPrefs.edit();
editor.putLong(PREF_VOICE_INPUT_LAST_TIME_USED, System.currentTimeMillis());
SharedPreferencesCompat.apply(editor);
@@ -118,14 +119,14 @@ public class Hints {
}
private boolean shouldShowSwipeHint() {
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+ final SharedPreferences prefs = mPrefs;
- int numUniqueDaysShown = sp.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
+ int numUniqueDaysShown = prefs.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
// If we've already shown the hint for enough days, we'll return false.
if (numUniqueDaysShown < mSwipeHintMaxDaysToShow) {
- long lastTimeVoiceWasUsed = sp.getLong(PREF_VOICE_INPUT_LAST_TIME_USED, 0);
+ long lastTimeVoiceWasUsed = prefs.getLong(PREF_VOICE_INPUT_LAST_TIME_USED, 0);
// If the user has used voice today, we'll return false. (We don't show the hint on
// any day that the user has already used voice.)
@@ -156,16 +157,16 @@ public class Hints {
}
private void showHint(int hintViewResource) {
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+ final SharedPreferences prefs = mPrefs;
- int numUniqueDaysShown = sp.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
- long lastTimeHintWasShown = sp.getLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, 0);
+ int numUniqueDaysShown = prefs.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
+ long lastTimeHintWasShown = prefs.getLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, 0);
// If this is the first time the hint is being shown today, increase the saved values
// to represent that. We don't need to increase the last time the hint was shown unless
// it is a different day from the current value.
if (!isFromToday(lastTimeHintWasShown)) {
- SharedPreferences.Editor editor = sp.edit();
+ SharedPreferences.Editor editor = prefs.edit();
editor.putInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, numUniqueDaysShown + 1);
editor.putLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, System.currentTimeMillis());
SharedPreferencesCompat.apply(editor);
@@ -177,9 +178,9 @@ public class Hints {
}
private int getAndIncrementPref(String pref) {
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
- int value = sp.getInt(pref, 0);
- SharedPreferences.Editor editor = sp.edit();
+ final SharedPreferences prefs = mPrefs;
+ int value = prefs.getInt(pref, 0);
+ SharedPreferences.Editor editor = prefs.edit();
editor.putInt(pref, value + 1);
SharedPreferencesCompat.apply(editor);
return value;
diff --git a/java/src/com/android/inputmethod/voice/RecognitionView.java b/java/src/com/android/inputmethod/voice/RecognitionView.java
index 7cec0b04a..95a79f463 100644
--- a/java/src/com/android/inputmethod/voice/RecognitionView.java
+++ b/java/src/com/android/inputmethod/voice/RecognitionView.java
@@ -16,14 +16,9 @@
package com.android.inputmethod.voice;
-import java.io.ByteArrayOutputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.ShortBuffer;
-import java.util.ArrayList;
-import java.util.List;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
@@ -34,16 +29,20 @@ import android.graphics.Path;
import android.graphics.PathEffect;
import android.graphics.drawable.Drawable;
import android.os.Handler;
-import android.util.TypedValue;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
-import android.view.ViewGroup.MarginLayoutParams;
+import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
-import com.android.inputmethod.latin.R;
+import java.io.ByteArrayOutputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.ShortBuffer;
+import java.util.Locale;
/**
* The user interface for the "Speak now" and "working" states.
@@ -51,86 +50,64 @@ import com.android.inputmethod.latin.R;
* plays beeps, shows errors, etc.
*/
public class RecognitionView {
+ @SuppressWarnings("unused")
private static final String TAG = "RecognitionView";
private Handler mUiHandler; // Reference to UI thread
private View mView;
private Context mContext;
- private ImageView mImage;
private TextView mText;
- private View mButton;
- private TextView mButtonText;
+ private ImageView mImage;
private View mProgress;
+ private SoundIndicator mSoundIndicator;
+ private TextView mLanguage;
+ private Button mButton;
private Drawable mInitializing;
private Drawable mError;
- private List<Drawable> mSpeakNow;
-
- private float mVolume = 0.0f;
- private int mLevel = 0;
-
- private enum State {LISTENING, WORKING, READY}
- private State mState = State.READY;
-
- private float mMinMicrophoneLevel;
- private float mMaxMicrophoneLevel;
- /** Updates the microphone icon to show user their volume.*/
- private Runnable mUpdateVolumeRunnable = new Runnable() {
- public void run() {
- if (mState != State.LISTENING) {
- return;
- }
-
- final float min = mMinMicrophoneLevel;
- final float max = mMaxMicrophoneLevel;
- final int maxLevel = mSpeakNow.size() - 1;
+ private static final int INIT = 0;
+ private static final int LISTENING = 1;
+ private static final int WORKING = 2;
+ private static final int READY = 3;
+
+ private int mState = INIT;
- int index = (int) ((mVolume - min) / (max - min) * maxLevel);
- final int level = Math.min(Math.max(0, index), maxLevel);
+ private final View mPopupLayout;
- if (level != mLevel) {
- mImage.setImageDrawable(mSpeakNow.get(level));
- mLevel = level;
- }
- mUiHandler.postDelayed(mUpdateVolumeRunnable, 50);
- }
- };
+ private final Drawable mListeningBorder;
+ private final Drawable mWorkingBorder;
+ private final Drawable mErrorBorder;
public RecognitionView(Context context, OnClickListener clickListener) {
mUiHandler = new Handler();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
+ Context.LAYOUT_INFLATER_SERVICE);
+
mView = inflater.inflate(R.layout.recognition_status, null);
- ContentResolver cr = context.getContentResolver();
- mMinMicrophoneLevel = SettingsUtil.getSettingsFloat(
- cr, SettingsUtil.LATIN_IME_MIN_MICROPHONE_LEVEL, 15.f);
- mMaxMicrophoneLevel = SettingsUtil.getSettingsFloat(
- cr, SettingsUtil.LATIN_IME_MAX_MICROPHONE_LEVEL, 30.f);
+
+ mPopupLayout= mView.findViewById(R.id.popup_layout);
// Pre-load volume level images
Resources r = context.getResources();
- mSpeakNow = new ArrayList<Drawable>();
- mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level0));
- mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level1));
- mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level2));
- mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level3));
- mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level4));
- mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level5));
- mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level6));
+ mListeningBorder = r.getDrawable(R.drawable.vs_dialog_red);
+ mWorkingBorder = r.getDrawable(R.drawable.vs_dialog_blue);
+ mErrorBorder = r.getDrawable(R.drawable.vs_dialog_yellow);
mInitializing = r.getDrawable(R.drawable.mic_slash);
mError = r.getDrawable(R.drawable.caution);
mImage = (ImageView) mView.findViewById(R.id.image);
- mButton = mView.findViewById(R.id.button);
+ mProgress = mView.findViewById(R.id.progress);
+ mSoundIndicator = (SoundIndicator) mView.findViewById(R.id.sound_indicator);
+
+ mButton = (Button) mView.findViewById(R.id.button);
mButton.setOnClickListener(clickListener);
mText = (TextView) mView.findViewById(R.id.text);
- mButtonText = (TextView) mView.findViewById(R.id.button_text);
- mProgress = mView.findViewById(R.id.progress);
+ mLanguage = (TextView) mView.findViewById(R.id.language);
mContext = context;
}
@@ -141,11 +118,12 @@ public class RecognitionView {
public void restoreState() {
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
// Restart the spinner
- if (mState == State.WORKING) {
- ((ProgressBar)mProgress).setIndeterminate(false);
- ((ProgressBar)mProgress).setIndeterminate(true);
+ if (mState == WORKING) {
+ ((ProgressBar) mProgress).setIndeterminate(false);
+ ((ProgressBar) mProgress).setIndeterminate(true);
}
}
});
@@ -153,46 +131,50 @@ public class RecognitionView {
public void showInitializing() {
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
- prepareDialog(false, mContext.getText(R.string.voice_initializing), mInitializing,
- mContext.getText(R.string.cancel));
+ mState = INIT;
+ prepareDialog(mContext.getText(R.string.voice_initializing), mInitializing,
+ mContext.getText(R.string.cancel));
}
});
}
public void showListening() {
+ Log.d(TAG, "#showListening");
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
- mState = State.LISTENING;
- prepareDialog(false, mContext.getText(R.string.voice_listening), mSpeakNow.get(0),
+ mState = LISTENING;
+ prepareDialog(mContext.getText(R.string.voice_listening), null,
mContext.getText(R.string.cancel));
}
});
- mUiHandler.postDelayed(mUpdateVolumeRunnable, 50);
}
- public void updateVoiceMeter(final float rmsdB) {
- mVolume = rmsdB;
+ public void updateVoiceMeter(float rmsdB) {
+ mSoundIndicator.setRmsdB(rmsdB);
}
public void showError(final String message) {
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
- mState = State.READY;
- prepareDialog(false, message, mError, mContext.getText(R.string.ok));
+ mState = READY;
+ prepareDialog(message, mError, mContext.getText(R.string.ok));
}
- });
+ });
}
public void showWorking(
final ByteArrayOutputStream waveBuffer,
final int speechStartPosition,
final int speechEndPosition) {
-
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
- mState = State.WORKING;
- prepareDialog(true, mContext.getText(R.string.voice_working), null, mContext
+ mState = WORKING;
+ prepareDialog(mContext.getText(R.string.voice_working), null, mContext
.getText(R.string.cancel));
final ShortBuffer buf = ByteBuffer.wrap(waveBuffer.toByteArray()).order(
ByteOrder.nativeOrder()).asShortBuffer();
@@ -200,21 +182,87 @@ public class RecognitionView {
waveBuffer.reset();
showWave(buf, speechStartPosition / 2, speechEndPosition / 2);
}
- });
+ });
}
- private void prepareDialog(boolean spinVisible, CharSequence text, Drawable image,
+ private void prepareDialog(CharSequence text, Drawable image,
CharSequence btnTxt) {
- if (spinVisible) {
- mProgress.setVisibility(View.VISIBLE);
- mImage.setVisibility(View.GONE);
- } else {
- mProgress.setVisibility(View.GONE);
- mImage.setImageDrawable(image);
- mImage.setVisibility(View.VISIBLE);
+
+ /*
+ * The mic of INIT and of LISTENING has to be displayed in the same position. To accomplish
+ * that, some text visibility are not set as GONE but as INVISIBLE.
+ */
+ switch (mState) {
+ case INIT:
+ mText.setVisibility(View.INVISIBLE);
+
+ mProgress.setVisibility(View.GONE);
+
+ mImage.setVisibility(View.VISIBLE);
+ mImage.setImageResource(R.drawable.mic_slash);
+
+ mSoundIndicator.setVisibility(View.GONE);
+ mSoundIndicator.stop();
+
+ mLanguage.setVisibility(View.INVISIBLE);
+
+ mPopupLayout.setBackgroundDrawable(mListeningBorder);
+ break;
+ case LISTENING:
+ mText.setVisibility(View.VISIBLE);
+ mText.setText(text);
+
+ mProgress.setVisibility(View.GONE);
+
+ mImage.setVisibility(View.GONE);
+
+ mSoundIndicator.setVisibility(View.VISIBLE);
+ mSoundIndicator.start();
+
+ Locale locale = SubtypeSwitcher.getInstance().getInputLocale();
+
+ mLanguage.setVisibility(View.VISIBLE);
+ mLanguage.setText(SubtypeSwitcher.getFullDisplayName(locale, true));
+
+ mPopupLayout.setBackgroundDrawable(mListeningBorder);
+ break;
+ case WORKING:
+
+ mText.setVisibility(View.VISIBLE);
+ mText.setText(text);
+
+ mProgress.setVisibility(View.VISIBLE);
+
+ mImage.setVisibility(View.VISIBLE);
+
+ mSoundIndicator.setVisibility(View.GONE);
+ mSoundIndicator.stop();
+
+ mLanguage.setVisibility(View.GONE);
+
+ mPopupLayout.setBackgroundDrawable(mWorkingBorder);
+ break;
+ case READY:
+ mText.setVisibility(View.VISIBLE);
+ mText.setText(text);
+
+ mProgress.setVisibility(View.GONE);
+
+ mImage.setVisibility(View.VISIBLE);
+ mImage.setImageResource(R.drawable.caution);
+
+ mSoundIndicator.setVisibility(View.GONE);
+ mSoundIndicator.stop();
+
+ mLanguage.setVisibility(View.GONE);
+
+ mPopupLayout.setBackgroundDrawable(mErrorBorder);
+ break;
+ default:
+ Log.w(TAG, "Unknown state " + mState);
}
- mText.setText(text);
- mButtonText.setText(btnTxt);
+ mPopupLayout.requestLayout();
+ mButton.setText(btnTxt);
}
/**
@@ -241,7 +289,7 @@ public class RecognitionView {
*/
private void showWave(ShortBuffer waveBuffer, int startPosition, int endPosition) {
final int w = ((View) mImage.getParent()).getWidth();
- final int h = mImage.getHeight();
+ final int h = ((View) mImage.getParent()).getHeight();
if (w <= 0 || h <= 0) {
// view is not visible this time. Skip drawing.
return;
@@ -252,7 +300,7 @@ public class RecognitionView {
paint.setColor(0xFFFFFFFF); // 0xAARRGGBB
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
- paint.setAlpha(0x90);
+ paint.setAlpha(80);
final PathEffect effect = new CornerPathEffect(3);
paint.setPathEffect(effect);
@@ -274,7 +322,7 @@ public class RecognitionView {
final int count = (endIndex - startIndex) / numSamplePerWave;
final float deltaX = 1.0f * w / count;
- int yMax = h / 2 - 8;
+ int yMax = h / 2;
Path path = new Path();
c.translate(0, yMax);
float x = 0;
@@ -288,36 +336,20 @@ public class RecognitionView {
path.lineTo(x, y);
}
if (deltaX > 4) {
- paint.setStrokeWidth(3);
+ paint.setStrokeWidth(2);
} else {
- paint.setStrokeWidth(Math.max(1, (int) (deltaX -.05)));
+ paint.setStrokeWidth(Math.max(0, (int) (deltaX -.05)));
}
c.drawPath(path, paint);
mImage.setImageBitmap(b);
- mImage.setVisibility(View.VISIBLE);
- MarginLayoutParams mProgressParams = (MarginLayoutParams)mProgress.getLayoutParams();
- mProgressParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,
- -h , mContext.getResources().getDisplayMetrics());
-
- // Tweak the padding manually to fill out the whole view horizontally.
- // TODO: Do this in the xml layout instead.
- ((View) mImage.getParent()).setPadding(4, ((View) mImage.getParent()).getPaddingTop(), 3,
- ((View) mImage.getParent()).getPaddingBottom());
- mProgress.setLayoutParams(mProgressParams);
}
-
public void finish() {
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
- mState = State.READY;
- exitWorking();
+ mSoundIndicator.stop();
}
- });
- }
-
- private void exitWorking() {
- mProgress.setVisibility(View.GONE);
- mImage.setVisibility(View.VISIBLE);
+ });
}
}
diff --git a/java/src/com/android/inputmethod/voice/SettingsUtil.java b/java/src/com/android/inputmethod/voice/SettingsUtil.java
index abf52047f..4d746e120 100644
--- a/java/src/com/android/inputmethod/voice/SettingsUtil.java
+++ b/java/src/com/android/inputmethod/voice/SettingsUtil.java
@@ -17,10 +17,7 @@
package com.android.inputmethod.voice;
import android.content.ContentResolver;
-import android.database.Cursor;
-import android.net.Uri;
import android.provider.Settings;
-import android.util.Log;
/**
* Utility for retrieving settings from Settings.Secure.
diff --git a/java/src/com/android/inputmethod/voice/SoundIndicator.java b/java/src/com/android/inputmethod/voice/SoundIndicator.java
new file mode 100644
index 000000000..543290b32
--- /dev/null
+++ b/java/src/com/android/inputmethod/voice/SoundIndicator.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.voice;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import com.android.inputmethod.latin.R;
+
+/**
+ * A widget which shows the volume of audio using a microphone icon
+ */
+public class SoundIndicator extends ImageView {
+ @SuppressWarnings("unused")
+ private static final String TAG = "SoundIndicator";
+
+ private static final float UP_SMOOTHING_FACTOR = 0.9f;
+ private static final float DOWN_SMOOTHING_FACTOR = 0.4f;
+
+ private static final float AUDIO_METER_MIN_DB = 7.0f;
+ private static final float AUDIO_METER_DB_RANGE = 20.0f;
+
+ private static final long FRAME_DELAY = 50;
+
+ private Bitmap mDrawingBuffer;
+ private Canvas mBufferCanvas;
+ private Bitmap mEdgeBitmap;
+ private float mLevel = 0.0f;
+ private Drawable mFrontDrawable;
+ private Paint mClearPaint;
+ private Paint mMultPaint;
+ private int mEdgeBitmapOffset;
+
+ private Handler mHandler;
+
+ private Runnable mDrawFrame = new Runnable() {
+ public void run() {
+ invalidate();
+ mHandler.postDelayed(mDrawFrame, FRAME_DELAY);
+ }
+ };
+
+ public SoundIndicator(Context context) {
+ this(context, null);
+ }
+
+ public SoundIndicator(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ mFrontDrawable = getDrawable();
+ BitmapDrawable edgeDrawable =
+ (BitmapDrawable) context.getResources().getDrawable(R.drawable.vs_popup_mic_edge);
+ mEdgeBitmap = edgeDrawable.getBitmap();
+ mEdgeBitmapOffset = mEdgeBitmap.getHeight() / 2;
+
+ mDrawingBuffer =
+ Bitmap.createBitmap(mFrontDrawable.getIntrinsicWidth(),
+ mFrontDrawable.getIntrinsicHeight(), Config.ARGB_8888);
+
+ mBufferCanvas = new Canvas(mDrawingBuffer);
+
+ // Initialize Paints.
+ mClearPaint = new Paint();
+ mClearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
+
+ mMultPaint = new Paint();
+ mMultPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
+
+ mHandler = new Handler();
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ //super.onDraw(canvas);
+
+ float w = getWidth();
+ float h = getHeight();
+
+ // Clear the buffer canvas
+ mBufferCanvas.drawRect(0, 0, w, h, mClearPaint);
+
+ // Set its clip so we don't draw the front image all the way to the top
+ Rect clip = new Rect(0,
+ (int) ((1.0 - mLevel) * (h + mEdgeBitmapOffset)) - mEdgeBitmapOffset,
+ (int) w,
+ (int) h);
+
+ mBufferCanvas.save();
+ mBufferCanvas.clipRect(clip);
+
+ // Draw the front image
+ mFrontDrawable.setBounds(new Rect(0, 0, (int) w, (int) h));
+ mFrontDrawable.draw(mBufferCanvas);
+
+ mBufferCanvas.restore();
+
+ // Draw the edge image on top of the buffer image with a multiply mode
+ mBufferCanvas.drawBitmap(mEdgeBitmap, 0, clip.top, mMultPaint);
+
+ // Draw the buffer image (on top of the background image)
+ canvas.drawBitmap(mDrawingBuffer, 0, 0, null);
+ }
+
+ /**
+ * Sets the sound level
+ *
+ * @param rmsdB The level of the sound, in dB.
+ */
+ public void setRmsdB(float rmsdB) {
+ float level = ((rmsdB - AUDIO_METER_MIN_DB) / AUDIO_METER_DB_RANGE);
+
+ level = Math.min(Math.max(0.0f, level), 1.0f);
+
+ // We smooth towards the new level
+ if (level > mLevel) {
+ mLevel = (level - mLevel) * UP_SMOOTHING_FACTOR + mLevel;
+ } else {
+ mLevel = (level - mLevel) * DOWN_SMOOTHING_FACTOR + mLevel;
+ }
+ invalidate();
+ }
+
+ public void start() {
+ mHandler.post(mDrawFrame);
+ }
+
+ public void stop() {
+ mHandler.removeCallbacks(mDrawFrame);
+ }
+}
diff --git a/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java b/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java
new file mode 100644
index 000000000..61a194a8d
--- /dev/null
+++ b/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java
@@ -0,0 +1,743 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.voice;
+
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.latin.EditingUtils;
+import com.android.inputmethod.latin.LatinIME;
+import com.android.inputmethod.latin.LatinIME.UIHandler;
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SharedPreferencesCompat;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+import com.android.inputmethod.latin.SuggestedWords;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.IBinder;
+import android.preference.PreferenceManager;
+import android.provider.Browser;
+import android.speech.SpeechRecognizer;
+import android.text.Layout;
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.text.style.URLSpan;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.ExtractedTextRequest;
+import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class VoiceIMEConnector implements VoiceInput.UiListener {
+ private static final VoiceIMEConnector sInstance = new VoiceIMEConnector();
+
+ public static final boolean VOICE_INSTALLED = true;
+ private static final boolean ENABLE_VOICE_BUTTON = true;
+ private static final String PREF_VOICE_MODE = "voice_mode";
+ // Whether or not the user has used voice input before (and thus, whether to show the
+ // first-run warning dialog or not).
+ private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input";
+ // Whether or not the user has used voice input from an unsupported locale UI before.
+ // For example, the user has a Chinese UI but activates voice input.
+ private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE =
+ "has_used_voice_input_unsupported_locale";
+ // The private IME option used to indicate that no microphone should be shown for a
+ // given text field. For instance this is specified by the search dialog when the
+ // dialog is already showing a voice search button.
+ private static final String IME_OPTION_NO_MICROPHONE = "nm";
+ private static final int RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO = 6;
+
+ @SuppressWarnings("unused")
+ private static final String TAG = "VoiceIMEConnector";
+ private static boolean DEBUG = LatinImeLogger.sDBG;
+
+ private boolean mAfterVoiceInput;
+ private boolean mHasUsedVoiceInput;
+ private boolean mHasUsedVoiceInputUnsupportedLocale;
+ private boolean mImmediatelyAfterVoiceInput;
+ private boolean mIsShowingHint;
+ private boolean mLocaleSupportedForVoiceInput;
+ private boolean mPasswordText;
+ private boolean mRecognizing;
+ private boolean mShowingVoiceSuggestions;
+ private boolean mVoiceButtonEnabled;
+ private boolean mVoiceButtonOnPrimary;
+ private boolean mVoiceInputHighlighted;
+
+ private InputMethodManager mImm;
+ private LatinIME mService;
+ private AlertDialog mVoiceWarningDialog;
+ private VoiceInput mVoiceInput;
+ private final VoiceResults mVoiceResults = new VoiceResults();
+ private Hints mHints;
+ private UIHandler mHandler;
+ private SubtypeSwitcher mSubtypeSwitcher;
+ // For each word, a list of potential replacements, usually from voice.
+ private final Map<String, List<CharSequence>> mWordToSuggestions =
+ new HashMap<String, List<CharSequence>>();
+
+ public static VoiceIMEConnector init(LatinIME context, SharedPreferences prefs, UIHandler h) {
+ sInstance.initInternal(context, prefs, h);
+ return sInstance;
+ }
+
+ public static VoiceIMEConnector getInstance() {
+ return sInstance;
+ }
+
+ private void initInternal(LatinIME service, SharedPreferences prefs, UIHandler h) {
+ mService = service;
+ mHandler = h;
+ mImm = (InputMethodManager) service.getSystemService(Context.INPUT_METHOD_SERVICE);
+ mSubtypeSwitcher = SubtypeSwitcher.getInstance();
+ if (VOICE_INSTALLED) {
+ mVoiceInput = new VoiceInput(service, this);
+ mHints = new Hints(service, prefs, new Hints.Display() {
+ @Override
+ public void showHint(int viewResource) {
+ View view = LayoutInflater.from(mService).inflate(viewResource, null);
+ mService.setCandidatesView(view);
+ mService.setCandidatesViewShown(true);
+ mIsShowingHint = true;
+ }
+ });
+ }
+ }
+
+ private VoiceIMEConnector() {
+ // Intentional empty constructor for singleton.
+ }
+
+ public void resetVoiceStates(boolean isPasswordText) {
+ mAfterVoiceInput = false;
+ mImmediatelyAfterVoiceInput = false;
+ mShowingVoiceSuggestions = false;
+ mVoiceInputHighlighted = false;
+ mPasswordText = isPasswordText;
+ }
+
+ public void flushVoiceInputLogs(boolean configurationChanged) {
+ if (VOICE_INSTALLED && !configurationChanged) {
+ if (mAfterVoiceInput) {
+ mVoiceInput.flushAllTextModificationCounters();
+ mVoiceInput.logInputEnded();
+ }
+ mVoiceInput.flushLogs();
+ mVoiceInput.cancel();
+ }
+ }
+
+ public void flushAndLogAllTextModificationCounters(int index, CharSequence suggestion,
+ String wordSeparators) {
+ if (mAfterVoiceInput && mShowingVoiceSuggestions) {
+ mVoiceInput.flushAllTextModificationCounters();
+ // send this intent AFTER logging any prior aggregated edits.
+ mVoiceInput.logTextModifiedByChooseSuggestion(suggestion.toString(), index,
+ wordSeparators, mService.getCurrentInputConnection());
+ }
+ }
+
+ private void showVoiceWarningDialog(final boolean swipe, IBinder token) {
+ if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) {
+ return;
+ }
+ AlertDialog.Builder builder = new AlertDialog.Builder(mService);
+ builder.setCancelable(true);
+ builder.setIcon(R.drawable.ic_mic_dialog);
+ builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ mVoiceInput.logKeyboardWarningDialogOk();
+ reallyStartListening(swipe);
+ }
+ });
+ builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ mVoiceInput.logKeyboardWarningDialogCancel();
+ switchToLastInputMethod();
+ }
+ });
+ // When the dialog is dismissed by user's cancellation, switch back to the last input method
+ builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface arg0) {
+ mVoiceInput.logKeyboardWarningDialogCancel();
+ switchToLastInputMethod();
+ }
+ });
+
+ final CharSequence message;
+ if (mLocaleSupportedForVoiceInput) {
+ message = TextUtils.concat(
+ mService.getText(R.string.voice_warning_may_not_understand), "\n\n",
+ mService.getText(R.string.voice_warning_how_to_turn_off));
+ } else {
+ message = TextUtils.concat(
+ mService.getText(R.string.voice_warning_locale_not_supported), "\n\n",
+ mService.getText(R.string.voice_warning_may_not_understand), "\n\n",
+ mService.getText(R.string.voice_warning_how_to_turn_off));
+ }
+ builder.setMessage(message);
+
+ builder.setTitle(R.string.voice_warning_title);
+ mVoiceWarningDialog = builder.create();
+ Window window = mVoiceWarningDialog.getWindow();
+ WindowManager.LayoutParams lp = window.getAttributes();
+ lp.token = token;
+ lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+ window.setAttributes(lp);
+ window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ mVoiceInput.logKeyboardWarningDialogShown();
+ mVoiceWarningDialog.show();
+ // Make URL in the dialog message clickable
+ TextView textView = (TextView) mVoiceWarningDialog.findViewById(android.R.id.message);
+ if (textView != null) {
+ final CustomLinkMovementMethod method = CustomLinkMovementMethod.getInstance();
+ method.setVoiceWarningDialog(mVoiceWarningDialog);
+ textView.setMovementMethod(method);
+ }
+ }
+
+ private static class CustomLinkMovementMethod extends LinkMovementMethod {
+ private static CustomLinkMovementMethod sLinkMovementMethodInstance =
+ new CustomLinkMovementMethod();
+ private AlertDialog mAlertDialog;
+
+ public void setVoiceWarningDialog(AlertDialog alertDialog) {
+ mAlertDialog = alertDialog;
+ }
+
+ public static CustomLinkMovementMethod getInstance() {
+ return sLinkMovementMethodInstance;
+ }
+
+ // Almost the same as LinkMovementMethod.onTouchEvent(), but overrides it for
+ // FLAG_ACTIVITY_NEW_TASK and mAlertDialog.cancel().
+ @Override
+ public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
+ int action = event.getAction();
+
+ if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
+ int x = (int) event.getX();
+ int y = (int) event.getY();
+
+ x -= widget.getTotalPaddingLeft();
+ y -= widget.getTotalPaddingTop();
+
+ x += widget.getScrollX();
+ y += widget.getScrollY();
+
+ Layout layout = widget.getLayout();
+ int line = layout.getLineForVertical(y);
+ int off = layout.getOffsetForHorizontal(line, x);
+
+ ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
+
+ if (link.length != 0) {
+ if (action == MotionEvent.ACTION_UP) {
+ if (link[0] instanceof URLSpan) {
+ URLSpan urlSpan = (URLSpan) link[0];
+ Uri uri = Uri.parse(urlSpan.getURL());
+ Context context = widget.getContext();
+ Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
+ if (mAlertDialog != null) {
+ // Go back to the previous IME for now.
+ // TODO: If we can find a way to bring the new activity to front
+ // while keeping the warning dialog, we don't need to cancel here.
+ mAlertDialog.cancel();
+ }
+ context.startActivity(intent);
+ } else {
+ link[0].onClick(widget);
+ }
+ } else if (action == MotionEvent.ACTION_DOWN) {
+ Selection.setSelection(buffer, buffer.getSpanStart(link[0]),
+ buffer.getSpanEnd(link[0]));
+ }
+ return true;
+ } else {
+ Selection.removeSelection(buffer);
+ }
+ }
+ return super.onTouchEvent(widget, buffer, event);
+ }
+ }
+
+ public void showPunctuationHintIfNecessary() {
+ InputConnection ic = mService.getCurrentInputConnection();
+ if (!mImmediatelyAfterVoiceInput && mAfterVoiceInput && ic != null) {
+ if (mHints.showPunctuationHintIfNecessary(ic)) {
+ mVoiceInput.logPunctuationHintDisplayed();
+ }
+ }
+ mImmediatelyAfterVoiceInput = false;
+ }
+
+ public void hideVoiceWindow(boolean configurationChanging) {
+ if (!configurationChanging) {
+ if (mAfterVoiceInput)
+ mVoiceInput.logInputEnded();
+ if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) {
+ mVoiceInput.logKeyboardWarningDialogDismissed();
+ mVoiceWarningDialog.dismiss();
+ mVoiceWarningDialog = null;
+ }
+ if (VOICE_INSTALLED & mRecognizing) {
+ mVoiceInput.cancel();
+ }
+ }
+ mWordToSuggestions.clear();
+ }
+
+ public void setCursorAndSelection(int newSelEnd, int newSelStart) {
+ if (mAfterVoiceInput) {
+ mVoiceInput.setCursorPos(newSelEnd);
+ mVoiceInput.setSelectionSpan(newSelEnd - newSelStart);
+ }
+ }
+
+ public void setVoiceInputHighlighted(boolean b) {
+ mVoiceInputHighlighted = b;
+ }
+
+ public void setShowingVoiceSuggestions(boolean b) {
+ mShowingVoiceSuggestions = b;
+ }
+
+ public boolean isVoiceButtonEnabled() {
+ return mVoiceButtonEnabled;
+ }
+
+ public boolean isVoiceButtonOnPrimary() {
+ return mVoiceButtonOnPrimary;
+ }
+
+ public boolean isVoiceInputHighlighted() {
+ return mVoiceInputHighlighted;
+ }
+
+ public boolean isRecognizing() {
+ return mRecognizing;
+ }
+
+ public boolean needsToShowWarningDialog() {
+ return !mHasUsedVoiceInput
+ || (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale);
+ }
+
+ public boolean getAndResetIsShowingHint() {
+ boolean ret = mIsShowingHint;
+ mIsShowingHint = false;
+ return ret;
+ }
+
+ private void revertVoiceInput() {
+ InputConnection ic = mService.getCurrentInputConnection();
+ if (ic != null) ic.commitText("", 1);
+ mService.updateSuggestions();
+ mVoiceInputHighlighted = false;
+ }
+
+ public void commitVoiceInput() {
+ if (VOICE_INSTALLED && mVoiceInputHighlighted) {
+ InputConnection ic = mService.getCurrentInputConnection();
+ if (ic != null) ic.finishComposingText();
+ mService.updateSuggestions();
+ mVoiceInputHighlighted = false;
+ }
+ }
+
+ public boolean logAndRevertVoiceInput() {
+ if (VOICE_INSTALLED && mVoiceInputHighlighted) {
+ mVoiceInput.incrementTextModificationDeleteCount(
+ mVoiceResults.candidates.get(0).toString().length());
+ revertVoiceInput();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void rememberReplacedWord(CharSequence suggestion,String wordSeparators) {
+ if (mShowingVoiceSuggestions) {
+ // Retain the replaced word in the alternatives array.
+ String wordToBeReplaced = EditingUtils.getWordAtCursor(
+ mService.getCurrentInputConnection(), wordSeparators);
+ if (!mWordToSuggestions.containsKey(wordToBeReplaced)) {
+ wordToBeReplaced = wordToBeReplaced.toLowerCase();
+ }
+ if (mWordToSuggestions.containsKey(wordToBeReplaced)) {
+ List<CharSequence> suggestions = mWordToSuggestions.get(wordToBeReplaced);
+ if (suggestions.contains(suggestion)) {
+ suggestions.remove(suggestion);
+ }
+ suggestions.add(wordToBeReplaced);
+ mWordToSuggestions.remove(wordToBeReplaced);
+ mWordToSuggestions.put(suggestion.toString(), suggestions);
+ }
+ }
+ }
+
+ /**
+ * Tries to apply any voice alternatives for the word if this was a spoken word and
+ * there are voice alternatives.
+ * @param touching The word that the cursor is touching, with position information
+ * @return true if an alternative was found, false otherwise.
+ */
+ public boolean applyVoiceAlternatives(EditingUtils.SelectedWord touching) {
+ // Search for result in spoken word alternatives
+ String selectedWord = touching.mWord.toString().trim();
+ if (!mWordToSuggestions.containsKey(selectedWord)) {
+ selectedWord = selectedWord.toLowerCase();
+ }
+ if (mWordToSuggestions.containsKey(selectedWord)) {
+ mShowingVoiceSuggestions = true;
+ List<CharSequence> suggestions = mWordToSuggestions.get(selectedWord);
+ SuggestedWords.Builder builder = new SuggestedWords.Builder();
+ // If the first letter of touching is capitalized, make all the suggestions
+ // start with a capital letter.
+ if (Character.isUpperCase(touching.mWord.charAt(0))) {
+ for (CharSequence word : suggestions) {
+ String str = word.toString();
+ word = Character.toUpperCase(str.charAt(0)) + str.substring(1);
+ builder.addWord(word);
+ }
+ } else {
+ builder.addWords(suggestions, null);
+ }
+ builder.setTypedWordValid(true).setHasMinimalSuggestion(true);
+ mService.setSuggestions(builder.build());
+ mService.setCandidatesViewShown(true);
+ return true;
+ }
+ return false;
+ }
+
+ public void handleBackspace() {
+ if (mAfterVoiceInput) {
+ // Don't log delete if the user is pressing delete at
+ // the beginning of the text box (hence not deleting anything)
+ if (mVoiceInput.getCursorPos() > 0) {
+ // If anything was selected before the delete was pressed, increment the
+ // delete count by the length of the selection
+ int deleteLen = mVoiceInput.getSelectionSpan() > 0 ?
+ mVoiceInput.getSelectionSpan() : 1;
+ mVoiceInput.incrementTextModificationDeleteCount(deleteLen);
+ }
+ }
+ }
+
+ public void handleCharacter() {
+ commitVoiceInput();
+ if (mAfterVoiceInput) {
+ // Assume input length is 1. This assumption fails for smiley face insertions.
+ mVoiceInput.incrementTextModificationInsertCount(1);
+ }
+ }
+
+ public void handleSeparator() {
+ commitVoiceInput();
+ if (mAfterVoiceInput){
+ // Assume input length is 1. This assumption fails for smiley face insertions.
+ mVoiceInput.incrementTextModificationInsertPunctuationCount(1);
+ }
+ }
+
+ public void handleClose() {
+ if (VOICE_INSTALLED & mRecognizing) {
+ mVoiceInput.cancel();
+ }
+ }
+
+
+ public void handleVoiceResults(boolean capitalizeFirstWord) {
+ mAfterVoiceInput = true;
+ mImmediatelyAfterVoiceInput = true;
+
+ InputConnection ic = mService.getCurrentInputConnection();
+ if (!mService.isFullscreenMode()) {
+ // Start listening for updates to the text from typing, etc.
+ if (ic != null) {
+ ExtractedTextRequest req = new ExtractedTextRequest();
+ ic.getExtractedText(req, InputConnection.GET_EXTRACTED_TEXT_MONITOR);
+ }
+ }
+ mService.vibrate();
+
+ final List<CharSequence> nBest = new ArrayList<CharSequence>();
+ for (String c : mVoiceResults.candidates) {
+ if (capitalizeFirstWord) {
+ c = Character.toUpperCase(c.charAt(0)) + c.substring(1, c.length());
+ }
+ nBest.add(c);
+ }
+ if (nBest.size() == 0) {
+ return;
+ }
+ String bestResult = nBest.get(0).toString();
+ mVoiceInput.logVoiceInputDelivered(bestResult.length());
+ mHints.registerVoiceResult(bestResult);
+
+ if (ic != null) ic.beginBatchEdit(); // To avoid extra updates on committing older text
+ mService.commitTyped(ic);
+ EditingUtils.appendText(ic, bestResult);
+ if (ic != null) ic.endBatchEdit();
+
+ mVoiceInputHighlighted = true;
+ mWordToSuggestions.putAll(mVoiceResults.alternatives);
+ onCancelVoice();
+ }
+
+ public void switchToRecognitionStatusView(final Configuration configuration) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mService.setCandidatesViewShown(false);
+ mRecognizing = true;
+ mVoiceInput.newView();
+ View v = mVoiceInput.getView();
+
+ ViewParent p = v.getParent();
+ if (p != null && p instanceof ViewGroup) {
+ ((ViewGroup) p).removeView(v);
+ }
+
+ View keyboardView = KeyboardSwitcher.getInstance().getInputView();
+
+ // The full height of the keyboard is difficult to calculate
+ // as the dimension is expressed in "mm" and not in "pixel"
+ // As we add mm, we don't know how the rounding is going to work
+ // thus we may end up with few pixels extra (or less).
+ if (keyboardView != null) {
+ View popupLayout = v.findViewById(R.id.popup_layout);
+ final int displayHeight =
+ mService.getResources().getDisplayMetrics().heightPixels;
+ final int currentHeight = popupLayout.getLayoutParams().height;
+ final int keyboardHeight = keyboardView.getHeight();
+ if (keyboardHeight > currentHeight || keyboardHeight
+ > (displayHeight / RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO)) {
+ popupLayout.getLayoutParams().height = keyboardHeight;
+ }
+ }
+ mService.setInputView(v);
+ mService.updateInputViewShown();
+
+ if (configuration != null) {
+ mVoiceInput.onConfigurationChanged(configuration);
+ }
+ }});
+ }
+
+ private void switchToLastInputMethod() {
+ final IBinder token = mService.getWindow().getWindow().getAttributes().token;
+ new AsyncTask<Void, Void, Boolean>() {
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ return mImm.switchToLastInputMethod(token);
+ }
+
+ @Override
+ protected void onPostExecute(Boolean result) {
+ if (!result) {
+ if (DEBUG) {
+ Log.d(TAG, "Couldn't switch back to last IME.");
+ }
+ // Needs to reset here because LatinIME failed to back to any IME and
+ // the same voice subtype will be triggered in the next time.
+ mVoiceInput.reset();
+ mService.requestHideSelf(0);
+ }
+ }
+ }.execute();
+ }
+
+ private void reallyStartListening(boolean swipe) {
+ if (!VOICE_INSTALLED) {
+ return;
+ }
+ if (!mHasUsedVoiceInput) {
+ // The user has started a voice input, so remember that in the
+ // future (so we don't show the warning dialog after the first run).
+ SharedPreferences.Editor editor =
+ PreferenceManager.getDefaultSharedPreferences(mService).edit();
+ editor.putBoolean(PREF_HAS_USED_VOICE_INPUT, true);
+ SharedPreferencesCompat.apply(editor);
+ mHasUsedVoiceInput = true;
+ }
+
+ if (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale) {
+ // The user has started a voice input from an unsupported locale, so remember that
+ // in the future (so we don't show the warning dialog the next time they do this).
+ SharedPreferences.Editor editor =
+ PreferenceManager.getDefaultSharedPreferences(mService).edit();
+ editor.putBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, true);
+ SharedPreferencesCompat.apply(editor);
+ mHasUsedVoiceInputUnsupportedLocale = true;
+ }
+
+ // Clear N-best suggestions
+ mService.clearSuggestions();
+
+ FieldContext context = makeFieldContext();
+ mVoiceInput.startListening(context, swipe);
+ switchToRecognitionStatusView(null);
+ }
+
+ public void startListening(final boolean swipe, IBinder token) {
+ // TODO: remove swipe which is no longer used.
+ if (VOICE_INSTALLED) {
+ if (needsToShowWarningDialog()) {
+ // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel.
+ showVoiceWarningDialog(swipe, token);
+ } else {
+ reallyStartListening(swipe);
+ }
+ }
+ }
+
+ private boolean fieldCanDoVoice(FieldContext fieldContext) {
+ return !mPasswordText
+ && mVoiceInput != null
+ && !mVoiceInput.isBlacklistedField(fieldContext);
+ }
+
+ private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) {
+ return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext)
+ && !(attribute != null
+ && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions))
+ && SpeechRecognizer.isRecognitionAvailable(mService);
+ }
+
+ public void loadSettings(EditorInfo attribute, SharedPreferences sp) {
+ mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false);
+ mHasUsedVoiceInputUnsupportedLocale =
+ sp.getBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, false);
+
+ mLocaleSupportedForVoiceInput = SubtypeSwitcher.getInstance().isVoiceSupported(
+ SubtypeSwitcher.getInstance().getInputLocaleStr());
+
+ if (VOICE_INSTALLED) {
+ final String voiceMode = sp.getString(PREF_VOICE_MODE,
+ mService.getString(R.string.voice_mode_main));
+ mVoiceButtonEnabled = !voiceMode.equals(mService.getString(R.string.voice_mode_off))
+ && shouldShowVoiceButton(makeFieldContext(), attribute);
+ mVoiceButtonOnPrimary = voiceMode.equals(mService.getString(R.string.voice_mode_main));
+ }
+ }
+
+ public void destroy() {
+ if (VOICE_INSTALLED && mVoiceInput != null) {
+ mVoiceInput.destroy();
+ }
+ }
+
+ public void onStartInputView(IBinder keyboardViewToken) {
+ // If keyboardViewToken is null, keyboardView is not attached but voiceView is attached.
+ IBinder windowToken = keyboardViewToken != null ? keyboardViewToken
+ : mVoiceInput.getView().getWindowToken();
+ // If IME is in voice mode, but still needs to show the voice warning dialog,
+ // keep showing the warning.
+ if (mSubtypeSwitcher.isVoiceMode() && windowToken != null) {
+ // Close keyboard view if it is been shown.
+ if (KeyboardSwitcher.getInstance().isInputViewShown())
+ KeyboardSwitcher.getInstance().getInputView().purgeKeyboardAndClosing();
+ startListening(false, windowToken);
+ }
+ // If we have no token, onAttachedToWindow will take care of showing dialog and start
+ // listening.
+ }
+
+ public void onAttachedToWindow() {
+ // After onAttachedToWindow, we can show the voice warning dialog. See startListening()
+ // above.
+ mSubtypeSwitcher.setVoiceInput(mVoiceInput);
+ }
+
+ public void onConfigurationChanged(Configuration configuration) {
+ if (mRecognizing) {
+ switchToRecognitionStatusView(configuration);
+ }
+ }
+
+ @Override
+ public void onCancelVoice() {
+ if (mRecognizing) {
+ if (mSubtypeSwitcher.isVoiceMode()) {
+ // If voice mode is being canceled within LatinIME (i.e. time-out or user
+ // cancellation etc.), onCancelVoice() will be called first. LatinIME thinks it's
+ // still in voice mode. LatinIME needs to call switchToLastInputMethod().
+ // Note that onCancelVoice() will be called again from SubtypeSwitcher.
+ switchToLastInputMethod();
+ } else if (mSubtypeSwitcher.isKeyboardMode()) {
+ // If voice mode is being canceled out of LatinIME (i.e. by user's IME switching or
+ // as a result of switchToLastInputMethod() etc.),
+ // onCurrentInputMethodSubtypeChanged() will be called first. LatinIME will know
+ // that it's in keyboard mode and SubtypeSwitcher will call onCancelVoice().
+ mRecognizing = false;
+ mService.switchToKeyboardView();
+ }
+ }
+ }
+
+ @Override
+ public void onVoiceResults(List<String> candidates,
+ Map<String, List<CharSequence>> alternatives) {
+ if (!mRecognizing) {
+ return;
+ }
+ mVoiceResults.candidates = candidates;
+ mVoiceResults.alternatives = alternatives;
+ mHandler.updateVoiceResults();
+ }
+
+ public FieldContext makeFieldContext() {
+ SubtypeSwitcher switcher = SubtypeSwitcher.getInstance();
+ return new FieldContext(mService.getCurrentInputConnection(),
+ mService.getCurrentInputEditorInfo(), switcher.getInputLocaleStr(),
+ switcher.getEnabledLanguages());
+ }
+
+ private class VoiceResults {
+ List<String> candidates;
+ Map<String, List<CharSequence>> alternatives;
+ }
+}
diff --git a/java/src/com/android/inputmethod/voice/VoiceInput.java b/java/src/com/android/inputmethod/voice/VoiceInput.java
index 4c54dd3c5..2df9e8588 100644
--- a/java/src/com/android/inputmethod/voice/VoiceInput.java
+++ b/java/src/com/android/inputmethod/voice/VoiceInput.java
@@ -16,24 +16,26 @@
package com.android.inputmethod.voice;
-import com.android.inputmethod.latin.EditingUtil;
+import com.android.inputmethod.latin.EditingUtils;
+import com.android.inputmethod.latin.LatinImeLogger;
import com.android.inputmethod.latin.R;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.speech.RecognitionListener;
-import android.speech.SpeechRecognizer;
import android.speech.RecognizerIntent;
+import android.speech.SpeechRecognizer;
import android.util.Log;
-import android.view.inputmethod.InputConnection;
import android.view.View;
import android.view.View.OnClickListener;
+import android.view.inputmethod.InputConnection;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -57,6 +59,7 @@ public class VoiceInput implements OnClickListener {
private static final String EXTRA_CALLING_PACKAGE = "calling_package";
private static final String EXTRA_ALTERNATES = "android.speech.extra.ALTERNATES";
private static final int MAX_ALT_LIST_LENGTH = 6;
+ private static boolean DBG = LatinImeLogger.sDBG;
private static final String DEFAULT_RECOMMENDED_PACKAGES =
"com.android.mms " +
@@ -86,6 +89,7 @@ public class VoiceInput implements OnClickListener {
private static final String ALTERNATES_BUNDLE = "alternates_bundle";
// This is copied from the VoiceSearch app.
+ @SuppressWarnings("unused")
private static final class AlternatesBundleKeys {
public static final String ALTERNATES = "alternates";
public static final String CONFIDENCE = "confidence";
@@ -126,12 +130,12 @@ public class VoiceInput implements OnClickListener {
private int mState = DEFAULT;
- private final static int MSG_CLOSE_ERROR_DIALOG = 1;
+ private final static int MSG_RESET = 1;
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
- if (msg.what == MSG_CLOSE_ERROR_DIALOG) {
+ if (msg.what == MSG_RESET) {
mState = DEFAULT;
mRecognitionView.finish();
mUiListener.onCancelVoice();
@@ -240,7 +244,7 @@ public class VoiceInput implements OnClickListener {
}
public void incrementTextModificationInsertPunctuationCount(int count){
- mAfterVoiceInputInsertPunctuationCount += 1;
+ mAfterVoiceInputInsertPunctuationCount += count;
if (mAfterVoiceInputSelectionSpan > 0) {
// If text was highlighted before inserting the char, count this as
// a delete.
@@ -276,8 +280,9 @@ public class VoiceInput implements OnClickListener {
* The configuration of the IME changed and may have caused the views to be layed out
* again. Restore the state of the recognition view.
*/
- public void onConfigurationChanged() {
+ public void onConfigurationChanged(Configuration configuration) {
mRecognitionView.restoreState();
+ mRecognitionView.getView().dispatchConfigurationChanged(configuration);
}
/**
@@ -305,8 +310,18 @@ public class VoiceInput implements OnClickListener {
* @param swipe whether this voice input was started by swipe, for logging purposes
*/
public void startListening(FieldContext context, boolean swipe) {
- mState = DEFAULT;
-
+ if (DBG) {
+ Log.d(TAG, "startListening: " + context);
+ }
+
+ if (mState != DEFAULT) {
+ Log.w(TAG, "startListening in the wrong status " + mState);
+ }
+
+ // If everything works ok, the voice input should be already in the correct state. As this
+ // class can be called by third-party, we call reset just to be on the safe side.
+ reset();
+
Locale locale = Locale.getDefault();
String localeString = locale.getLanguage() + "-" + locale.getCountry();
@@ -405,6 +420,7 @@ public class VoiceInput implements OnClickListener {
/**
* Handle the cancel button.
*/
+ @Override
public void onClick(View view) {
switch(view.getId()) {
case R.id.button:
@@ -427,8 +443,7 @@ public class VoiceInput implements OnClickListener {
public void logTextModifiedByChooseSuggestion(String suggestion, int index,
String wordSeparators, InputConnection ic) {
- EditingUtil.Range range = new EditingUtil.Range();
- String wordToBeReplaced = EditingUtil.getWordAtCursor(ic, wordSeparators, range);
+ String wordToBeReplaced = EditingUtils.getWordAtCursor(ic, wordSeparators);
// If we enable phrase-based alternatives, only send up the first word
// in suggestion and wordToBeReplaced.
mLogger.textModifiedByChooseSuggestion(suggestion.length(), wordToBeReplaced.length(),
@@ -491,6 +506,21 @@ public class VoiceInput implements OnClickListener {
}
/**
+ * Reset the current voice recognition.
+ */
+ public void reset() {
+ if (mState != DEFAULT) {
+ mState = DEFAULT;
+
+ // Remove all pending tasks (e.g., timers to cancel voice input)
+ mHandler.removeMessages(MSG_RESET);
+
+ mSpeechRecognizer.cancel();
+ mRecognitionView.finish();
+ }
+ }
+
+ /**
* Cancel in-progress speech recognition.
*/
public void cancel() {
@@ -505,14 +535,9 @@ public class VoiceInput implements OnClickListener {
mLogger.cancelDuringError();
break;
}
- mState = DEFAULT;
-
- // Remove all pending tasks (e.g., timers to cancel voice input)
- mHandler.removeMessages(MSG_CLOSE_ERROR_DIALOG);
- mSpeechRecognizer.cancel();
+ reset();
mUiListener.onCancelVoice();
- mRecognitionView.finish();
}
private int getErrorStringId(int errorType, boolean endpointed) {
@@ -547,7 +572,7 @@ public class VoiceInput implements OnClickListener {
mState = ERROR;
mRecognitionView.showError(error);
// Wait a couple seconds and then automatically dismiss message.
- mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_CLOSE_ERROR_DIALOG), 2000);
+ mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_RESET), 2000);
}
private class ImeRecognitionListener implements RecognitionListener {
@@ -556,36 +581,45 @@ public class VoiceInput implements OnClickListener {
int mSpeechStart;
private boolean mEndpointed = false;
+ @Override
public void onReadyForSpeech(Bundle noiseParams) {
mRecognitionView.showListening();
}
+ @Override
public void onBeginningOfSpeech() {
mEndpointed = false;
mSpeechStart = mWaveBuffer.size();
}
+ @Override
public void onRmsChanged(float rmsdB) {
mRecognitionView.updateVoiceMeter(rmsdB);
}
+ @Override
public void onBufferReceived(byte[] buf) {
try {
mWaveBuffer.write(buf);
- } catch (IOException e) {}
+ } catch (IOException e) {
+ // ignore.
+ }
}
+ @Override
public void onEndOfSpeech() {
mEndpointed = true;
mState = WORKING;
mRecognitionView.showWorking(mWaveBuffer, mSpeechStart, mWaveBuffer.size());
}
+ @Override
public void onError(int errorType) {
mState = ERROR;
VoiceInput.this.onError(errorType, mEndpointed);
}
+ @Override
public void onResults(Bundle resultsBundle) {
List<String> results = resultsBundle
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
@@ -638,10 +672,12 @@ public class VoiceInput implements OnClickListener {
mRecognitionView.finish();
}
+ @Override
public void onPartialResults(final Bundle partialResults) {
// currently - do nothing
}
+ @Override
public void onEvent(int eventType, Bundle params) {
// do nothing - reserved for events that might be added in the future
}
diff --git a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
index 0d21133e0..3e65434a2 100644
--- a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
+++ b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
@@ -31,6 +31,7 @@ import android.content.Intent;
* on on the VoiceSearch side.
*/
public class VoiceInputLogger {
+ @SuppressWarnings("unused")
private static final String TAG = VoiceInputLogger.class.getSimpleName();
private static VoiceInputLogger sVoiceInputLogger;
@@ -205,14 +206,16 @@ public class VoiceInputLogger {
mContext.sendBroadcast(i);
}
+
public void textModifiedByChooseSuggestion(int suggestionLength, int replacedPhraseLength,
int index, String before, String after) {
setHasLoggingInfo(true);
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
- i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
- LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_CHOOSE_SUGGESTION);
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, suggestionLength);
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_REPLACED_LENGTH, replacedPhraseLength);
+ i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
+ LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_CHOOSE_SUGGESTION);
+
i.putExtra(LoggingEvents.VoiceIme.EXTRA_N_BEST_CHOOSE_INDEX, index);
i.putExtra(LoggingEvents.VoiceIme.EXTRA_BEFORE_N_BEST_CHOOSE, before);
i.putExtra(LoggingEvents.VoiceIme.EXTRA_AFTER_N_BEST_CHOOSE, after);
diff --git a/java/src/com/android/inputmethod/voice/WaveformImage.java b/java/src/com/android/inputmethod/voice/WaveformImage.java
index 08d87c8f3..8bac669fc 100644
--- a/java/src/com/android/inputmethod/voice/WaveformImage.java
+++ b/java/src/com/android/inputmethod/voice/WaveformImage.java
@@ -33,7 +33,9 @@ import java.nio.ShortBuffer;
public class WaveformImage {
private static final int SAMPLING_RATE = 8000;
- private WaveformImage() {}
+ private WaveformImage() {
+ // Intentional empty constructor.
+ }
public static Bitmap drawWaveform(
ByteArrayOutputStream waveBuffer, int w, int h, int start, int end) {
diff --git a/java/src/com/android/inputmethod/voice/Whitelist.java b/java/src/com/android/inputmethod/voice/Whitelist.java
index 167b688ca..f4c24de0c 100644
--- a/java/src/com/android/inputmethod/voice/Whitelist.java
+++ b/java/src/com/android/inputmethod/voice/Whitelist.java
@@ -17,6 +17,7 @@
package com.android.inputmethod.voice;
import android.os.Bundle;
+
import java.util.ArrayList;
import java.util.List;