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.flags12
-rw-r--r--java/res/drawable-hdpi/btn_candidate_pressed.9.pngbin0 -> 1234 bytes
-rw-r--r--java/res/drawable-hdpi/btn_center_default.9.pngbin0 -> 182 bytes
-rw-r--r--java/res/drawable-hdpi/btn_center_pressed.9.pngbin0 -> 200 bytes
-rw-r--r--java/res/drawable-hdpi/btn_center_selected.9.pngbin0 -> 200 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_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_popup_selected_holo.9.pngbin0 -> 242 bytes
-rw-r--r--java/res/drawable-hdpi/cancel.pngbin3992 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/dialog_bubble_step02.9.pngbin1475 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/dialog_bubble_step07.9.pngbin6012 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/highlight_pressed.pngbin4110 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/hint_popup_holo.9.pngbin0 -> 333 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_at_holo.9.pngbin0 -> 973 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 -> 515 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_colon_large_holo.9.pngbin0 -> 503 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_comma_holo.9.pngbin0 -> 371 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_comma_large_holo.9.pngbin0 -> 394 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_exclamation_holo.9.pngbin0 -> 518 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 540 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num0.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_0.9.png)bin379 -> 379 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num1.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_1.9.png)bin301 -> 301 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num2.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_2.9.png)bin404 -> 404 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num3.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_3.9.png)bin413 -> 413 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num4.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_4.9.png)bin341 -> 341 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num5.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_5.9.png)bin388 -> 388 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num6.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_6.9.png)bin413 -> 413 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num7.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_7.9.png)bin367 -> 367 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num8.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_8.9.png)bin417 -> 417 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_num9.9.png (renamed from java/res/drawable-hdpi/keyboard_hint_9.9.png)bin417 -> 417 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_plus_holo.9.pngbin0 -> 501 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_plus_large_holo.9.pngbin0 -> 540 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_question_holo.9.pngbin0 -> 679 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_question_large_holo.9.pngbin0 -> 712 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_quote_holo.9.pngbin0 -> 404 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_quote_large_holo.9.pngbin0 -> 423 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_underline_holo.9.pngbin0 -> 337 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_underline_large_holo.9.pngbin0 -> 350 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_background_holo.9.pngbin0 -> 296 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_holo.9.pngbin0 -> 4047 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_base.pngbin0 -> 2957 bytes
-rw-r--r--java/res/drawable-hdpi/mic_full.pngbin0 -> 2935 bytes
-rw-r--r--java/res/drawable-hdpi/mic_slash.pngbin6995 -> 3766 bytes
-rw-r--r--java/res/drawable-hdpi/ok_cancel.pngbin774 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level0.pngbin6017 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level1.pngbin6267 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level2.pngbin6359 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level3.pngbin6506 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level4.pngbin6542 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level5.pngbin6463 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/speak_now_level6.pngbin6782 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_done.pngbin1588 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_bkeyboard_voice_off.pngbin0 -> 1587 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 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_done.pngbin1068 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.pngbin652 -> 0 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_holo.pngbin0 -> 1118 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_holo.pngbin0 -> 3749 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_holo.pngbin0 -> 3395 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_holo.pngbin0 -> 4963 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_holo.pngbin0 -> 5608 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_return_holo.pngbin0 -> 1296 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_settings_holo.pngbin0 -> 2044 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_holo.pngbin0 -> 1405 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_space_holo.pngbin0 -> 685 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 -> 900 bytes
-rw-r--r--java/res/drawable-hdpi/voice_ime_background.9.pngbin1271 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/voice_swipe_hint.pngbin5965 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/vs_dialog_blue.9.pngbin0 -> 8275 bytes
-rw-r--r--java/res/drawable-hdpi/vs_dialog_red.9.pngbin0 -> 8607 bytes
-rw-r--r--java/res/drawable-hdpi/vs_dialog_yellow.9.pngbin0 -> 8151 bytes
-rw-r--r--java/res/drawable-hdpi/vs_popup_mic_edge.pngbin0 -> 3685 bytes
-rwxr-xr-xjava/res/drawable-hdpi/working.pngbin1180 -> 0 bytes
-rw-r--r--java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.pngbin0 -> 737 bytes
-rw-r--r--java/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
-rw-r--r--java/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
-rw-r--r--java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.pngbin0 -> 733 bytes
-rw-r--r--java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.pngbin0 -> 964 bytes
-rw-r--r--java/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 -> 973 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 -> 515 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_colon_large_holo.9.pngbin0 -> 503 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_comma_holo.9.pngbin0 -> 371 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_comma_large_holo.9.pngbin0 -> 394 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_exclamation_holo.9.pngbin0 -> 518 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 540 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_plus_holo.9.pngbin0 -> 501 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_plus_large_holo.9.pngbin0 -> 540 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_question_holo.9.pngbin0 -> 679 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_question_large_holo.9.pngbin0 -> 712 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_quote_holo.9.pngbin0 -> 404 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_quote_large_holo.9.pngbin0 -> 423 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_underline_holo.9.pngbin0 -> 337 bytes
-rw-r--r--java/res/drawable-land-hdpi/key_hint_underline_large_holo.9.pngbin0 -> 350 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 -> 481 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_at_large_holo.9.pngbin0 -> 497 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_colon_holo.9.pngbin0 -> 266 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.pngbin0 -> 285 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_comma_holo.9.pngbin0 -> 246 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_comma_large_holo.9.pngbin0 -> 248 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.pngbin0 -> 305 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 312 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_plus_holo.9.pngbin0 -> 277 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.pngbin0 -> 303 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_question_holo.9.pngbin0 -> 368 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_question_large_holo.9.pngbin0 -> 383 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_quote_holo.9.pngbin0 -> 264 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.pngbin0 -> 268 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_underline_holo.9.pngbin0 -> 196 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.pngbin0 -> 199 bytes
-rw-r--r--java/res/drawable-land-xhdpi/hint_popup_holo.9.pngbin0 -> 373 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_at_holo.9.pngbin0 -> 1048 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_at_large_holo.9.pngbin0 -> 1101 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_colon_holo.9.pngbin0 -> 586 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_colon_large_holo.9.pngbin0 -> 573 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_comma_holo.9.pngbin0 -> 411 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_comma_large_holo.9.pngbin0 -> 430 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_exclamation_holo.9.pngbin0 -> 559 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 588 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_plus_holo.9.pngbin0 -> 595 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_plus_large_holo.9.pngbin0 -> 630 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_question_holo.9.pngbin0 -> 739 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_question_large_holo.9.pngbin0 -> 776 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_quote_holo.9.pngbin0 -> 438 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_quote_large_holo.9.pngbin0 -> 459 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_underline_holo.9.pngbin0 -> 368 bytes
-rw-r--r--java/res/drawable-land-xhdpi/key_hint_underline_large_holo.9.pngbin0 -> 389 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_center_default.9.pngbin0 -> 182 bytes
-rw-r--r--java/res/drawable-mdpi/btn_center_pressed.9.pngbin0 -> 200 bytes
-rw-r--r--java/res/drawable-mdpi/btn_center_selected.9.pngbin0 -> 200 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.pngbin5792 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/dialog_bubble_step02.9.pngbin1036 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/dialog_bubble_step07.9.pngbin4646 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/highlight_pressed.pngbin593 -> 0 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 -> 481 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_at_large_holo.9.pngbin0 -> 497 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_colon_holo.9.pngbin0 -> 266 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_colon_large_holo.9.pngbin0 -> 285 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_comma_holo.9.pngbin0 -> 246 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_comma_large_holo.9.pngbin0 -> 248 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_exclamation_holo.9.pngbin0 -> 305 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 312 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num0.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_0.9.png)bin307 -> 307 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num0_holo.9.pngbin0 -> 379 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num1.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_1.9.png)bin302 -> 302 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num1_holo.9.pngbin0 -> 301 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num2.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_2.9.png)bin334 -> 334 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num2_holo.9.pngbin0 -> 404 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num3.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_3.9.png)bin327 -> 327 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num3_holo.9.pngbin0 -> 413 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num4.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_4.9.png)bin329 -> 329 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num4_holo.9.pngbin0 -> 341 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num5.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_5.9.png)bin334 -> 334 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num5_holo.9.pngbin0 -> 388 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num6.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_6.9.png)bin329 -> 329 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num6_holo.9.pngbin0 -> 413 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num7.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_7.9.png)bin334 -> 334 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num7_holo.9.pngbin0 -> 367 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num8.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_8.9.png)bin332 -> 332 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num8_holo.9.pngbin0 -> 417 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num9.9.png (renamed from java/res/drawable-mdpi/keyboard_hint_9.9.png)bin339 -> 339 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_num9_holo.9.pngbin0 -> 417 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_plus_holo.9.pngbin0 -> 277 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_plus_large_holo.9.pngbin0 -> 303 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_question_holo.9.pngbin0 -> 368 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_question_large_holo.9.pngbin0 -> 383 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_quote_holo.9.pngbin0 -> 264 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_quote_large_holo.9.pngbin0 -> 268 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_underline_holo.9.pngbin0 -> 196 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_underline_large_holo.9.pngbin0 -> 199 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_background_holo.9.pngbin0 -> 1108 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 83 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_base.pngbin0 -> 2957 bytes
-rw-r--r--java/res/drawable-mdpi/mic_full.pngbin0 -> 2935 bytes
-rw-r--r--java/res/drawable-mdpi/ok_cancel.pngbin3330 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level0.pngbin6738 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level1.pngbin6804 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level2.pngbin6897 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level3.pngbin7077 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level4.pngbin7109 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level5.pngbin6933 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level6.pngbin7050 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_bkeyboard_done.pngbin775 -> 0 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_done.pngbin771 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_feedback_done.pngbin498 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.pngbin3268 -> 0 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 -> 1865 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_lock.pngbin3188 -> 0 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/voice_ime_background.9.pngbin828 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/voice_swipe_hint.pngbin3111 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/vs_dialog_blue.9.pngbin0 -> 8275 bytes
-rw-r--r--java/res/drawable-mdpi/vs_dialog_red.9.pngbin0 -> 8607 bytes
-rw-r--r--java/res/drawable-mdpi/vs_dialog_yellow.9.pngbin0 -> 8151 bytes
-rw-r--r--java/res/drawable-mdpi/vs_popup_mic_edge.pngbin0 -> 3685 bytes
-rw-r--r--java/res/drawable-mdpi/working.pngbin3367 -> 0 bytes
-rw-r--r--java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 250 bytes
-rw-r--r--java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.pngbin0 -> 333 bytes
-rw-r--r--java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 3573 bytes
-rw-r--r--java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 3691 bytes
-rw-r--r--java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.pngbin0 -> 4137 bytes
-rw-r--r--java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.pngbin0 -> 1361 bytes
-rw-r--r--java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.pngbin0 -> 333 bytes
-rw-r--r--java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.pngbin0 -> 206 bytes
-rw-r--r--java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.pngbin0 -> 379 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.pngbin0 -> 268 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.pngbin0 -> 597 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.pngbin0 -> 751 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.pngbin0 -> 295 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.pngbin0 -> 626 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.pngbin0 -> 739 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.pngbin0 -> 268 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.pngbin0 -> 233 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 151 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.pngbin0 -> 206 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_at_holo.9.pngbin0 -> 481 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_at_large_holo.9.pngbin0 -> 497 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_colon_holo.9.pngbin0 -> 266 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_colon_large_holo.9.pngbin0 -> 285 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_comma_holo.9.pngbin0 -> 246 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_comma_large_holo.9.pngbin0 -> 248 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_exclamation_holo.9.pngbin0 -> 305 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 312 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_plus_holo.9.pngbin0 -> 277 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_plus_large_holo.9.pngbin0 -> 303 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_question_holo.9.pngbin0 -> 368 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_question_large_holo.9.pngbin0 -> 383 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_quote_holo.9.pngbin0 -> 264 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_quote_large_holo.9.pngbin0 -> 268 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_underline_holo.9.pngbin0 -> 196 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/key_hint_underline_large_holo.9.pngbin0 -> 199 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.pngbin0 -> 1108 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 2014 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 2100 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.pngbin0 -> 3730 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.pngbin0 -> 1003 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.pngbin0 -> 1419 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.pngbin0 -> 1759 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.pngbin0 -> 1324 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.pngbin0 -> 2397 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.pngbin0 -> 2143 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.pngbin0 -> 2063 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.pngbin0 -> 2021 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.pngbin0 -> 2502 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.pngbin0 -> 2540 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.pngbin0 -> 2226 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.pngbin0 -> 2699 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.pngbin0 -> 1548 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.pngbin0 -> 1414 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.pngbin0 -> 830 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.pngbin0 -> 1391 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.pngbin0 -> 1865 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.pngbin0 -> 1683 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.pngbin0 -> 1480 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.pngbin0 -> 1195 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.pngbin0 -> 387 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.pngbin0 -> 1678 bytes
-rw-r--r--java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.pngbin0 -> 1587 bytes
-rw-r--r--java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 248 bytes
-rw-r--r--java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.pngbin0 -> 379 bytes
-rw-r--r--java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 3659 bytes
-rw-r--r--java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 3774 bytes
-rw-r--r--java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.pngbin0 -> 6242 bytes
-rw-r--r--java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.pngbin0 -> 1803 bytes
-rw-r--r--java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 250 bytes
-rw-r--r--java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.pngbin0 -> 333 bytes
-rw-r--r--java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 4105 bytes
-rw-r--r--java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 4190 bytes
-rw-r--r--java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.pngbin0 -> 321 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.pngbin0 -> 1180 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_at_holo.9.pngbin0 -> 1621 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_at_large_holo.9.pngbin0 -> 1651 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_colon_holo.9.pngbin0 -> 1279 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_colon_large_holo.9.pngbin0 -> 1318 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_comma_holo.9.pngbin0 -> 1216 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_comma_large_holo.9.pngbin0 -> 1226 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_holo.9.pngbin0 -> 1317 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 1338 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_plus_holo.9.pngbin0 -> 1275 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_plus_large_holo.9.pngbin0 -> 1328 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_question_holo.9.pngbin0 -> 1433 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_question_large_holo.9.pngbin0 -> 1473 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_quote_holo.9.pngbin0 -> 1238 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_quote_large_holo.9.pngbin0 -> 1249 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_underline_holo.9.pngbin0 -> 1140 bytes
-rw-r--r--java/res/drawable-sw768dp-land-mdpi/key_hint_underline_large_holo.9.pngbin0 -> 1154 bytes
-rw-r--r--java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.pngbin0 -> 373 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.pngbin0 -> 268 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.pngbin0 -> 597 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.pngbin0 -> 751 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.pngbin0 -> 295 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.pngbin0 -> 626 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.pngbin0 -> 739 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.pngbin0 -> 268 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.pngbin0 -> 233 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 151 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.pngbin0 -> 1168 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_at_holo.9.pngbin0 -> 481 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_at_large_holo.9.pngbin0 -> 497 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_colon_holo.9.pngbin0 -> 266 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_colon_large_holo.9.pngbin0 -> 285 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_comma_holo.9.pngbin0 -> 246 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_comma_large_holo.9.pngbin0 -> 248 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_exclamation_holo.9.pngbin0 -> 305 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 312 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_plus_holo.9.pngbin0 -> 277 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_plus_large_holo.9.pngbin0 -> 303 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_question_holo.9.pngbin0 -> 368 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_question_large_holo.9.pngbin0 -> 383 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_quote_holo.9.pngbin0 -> 264 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_quote_large_holo.9.pngbin0 -> 268 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_underline_holo.9.pngbin0 -> 196 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/key_hint_underline_large_holo.9.pngbin0 -> 199 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.pngbin0 -> 1108 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 3804 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 3814 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.pngbin0 -> 3730 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.pngbin0 -> 1003 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.pngbin0 -> 1419 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.pngbin0 -> 1759 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.pngbin0 -> 1324 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.pngbin0 -> 2397 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.pngbin0 -> 2143 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.pngbin0 -> 2063 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.pngbin0 -> 2021 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.pngbin0 -> 2502 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.pngbin0 -> 2540 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.pngbin0 -> 2226 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.pngbin0 -> 2699 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.pngbin0 -> 1548 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.pngbin0 -> 1414 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.pngbin0 -> 1391 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.pngbin0 -> 1865 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.pngbin0 -> 1683 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.pngbin0 -> 1480 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.pngbin0 -> 1195 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_tab_holo.pngbin0 -> 387 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.pngbin0 -> 1678 bytes
-rw-r--r--java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.pngbin0 -> 1587 bytes
-rw-r--r--java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 248 bytes
-rw-r--r--java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.pngbin0 -> 379 bytes
-rw-r--r--java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 4228 bytes
-rw-r--r--java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 4317 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.pngbin0 -> 546 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.pngbin0 -> 476 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.pngbin0 -> 735 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.pngbin0 -> 867 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.pngbin0 -> 1069 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.pngbin0 -> 1143 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.pngbin0 -> 709 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.pngbin0 -> 821 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.pngbin0 -> 924 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.pngbin0 -> 1323 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.pngbin0 -> 1244 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.pngbin0 -> 1486 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.pngbin0 -> 529 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.pngbin0 -> 589 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.pngbin0 -> 126 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.pngbin0 -> 535 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.pngbin0 -> 722 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.pngbin0 -> 794 bytes
-rw-r--r--java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 243 bytes
-rw-r--r--java/res/drawable-xhdpi/hint_popup_holo.9.pngbin0 -> 379 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_at_holo.9.pngbin0 -> 1048 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_at_large_holo.9.pngbin0 -> 1101 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_colon_holo.9.pngbin0 -> 586 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_colon_large_holo.9.pngbin0 -> 573 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_comma_holo.9.pngbin0 -> 411 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_comma_large_holo.9.pngbin0 -> 430 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_exclamation_holo.9.pngbin0 -> 559 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 588 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_plus_holo.9.pngbin0 -> 595 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_plus_large_holo.9.pngbin0 -> 630 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_question_holo.9.pngbin0 -> 739 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_question_large_holo.9.pngbin0 -> 776 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_quote_holo.9.pngbin0 -> 438 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_quote_large_holo.9.pngbin0 -> 459 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_underline_holo.9.pngbin0 -> 368 bytes
-rw-r--r--java/res/drawable-xhdpi/key_hint_underline_large_holo.9.pngbin0 -> 389 bytes
-rw-r--r--java/res/drawable-xhdpi/keyboard_key_feedback_background.9.pngbin0 -> 1028 bytes
-rw-r--r--java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 136 bytes
-rw-r--r--java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.pngbin0 -> 1161 bytes
-rw-r--r--java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 4317 bytes
-rw-r--r--java/res/drawable/background_voice.xml25
-rw-r--r--java/res/drawable/btn_candidate.xml (renamed from java/res/xml/dictionary.xml)10
-rw-r--r--java/res/drawable/btn_candidate_holo.xml (renamed from java/res/xml/popup_slash.xml)22
-rw-r--r--java/res/drawable/btn_center.xml40
-rw-r--r--java/res/drawable/btn_keyboard_key_honeycomb.xml (renamed from java/res/drawable/btn_keyboard_key2.xml)23
-rw-r--r--java/res/drawable/btn_keyboard_key_honeycomb_popup.xml (renamed from java/res/drawable/ic_suggest_scroll_background.xml)15
-rw-r--r--java/res/drawable/keyboard_key_feedback_honeycomb.xml21
-rw-r--r--java/res/layout-sw600dp/candidate.xml60
-rw-r--r--java/res/layout-sw600dp/candidate_preview.xml29
-rw-r--r--java/res/layout-sw600dp/candidates.xml45
-rw-r--r--java/res/layout-sw600dp/keyboard_popup_honeycomb.xml41
-rw-r--r--java/res/layout-sw768dp/candidate.xml60
-rw-r--r--java/res/layout-sw768dp/candidate_preview.xml (renamed from java/res/xml/popup_comma.xml)26
-rw-r--r--java/res/layout-sw768dp/candidates.xml45
-rw-r--r--java/res/layout-sw768dp/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.xml (renamed from java/res/layout/bubble_text.xml)33
-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
-rwxr-xr-xjava/res/raw/type3.oggbin4126 -> 0 bytes
-rw-r--r--java/res/values-ar/strings.xml141
-rw-r--r--java/res/values-bg/strings.xml141
-rw-r--r--java/res/values-ca/donottranslate-altchars.xml (renamed from java/res/values-es-rUS/donottranslate-altchars.xml)19
-rw-r--r--java/res/values-ca/strings.xml141
-rw-r--r--java/res/values-cs/donottranslate-altchars.xml24
-rw-r--r--java/res/values-cs/strings.xml141
-rw-r--r--java/res/values-da/donottranslate-altchars.xml29
-rw-r--r--java/res/values-da/strings.xml141
-rw-r--r--java/res/values-de/donottranslate-altchars.xml16
-rw-r--r--java/res/values-de/strings.xml143
-rw-r--r--java/res/values-el/strings.xml141
-rw-r--r--java/res/values-en-rGB/strings.xml141
-rw-r--r--java/res/values-en/donottranslate-altchars.xml14
-rw-r--r--java/res/values-es-rUS/strings.xml141
-rw-r--r--java/res/values-es/donottranslate-altchars.xml16
-rw-r--r--java/res/values-es/strings.xml141
-rw-r--r--java/res/values-fa/strings.xml141
-rw-r--r--java/res/values-fi/donottranslate-altchars.xml (renamed from java/res/values-ja/donottranslate-altchars.xml)20
-rw-r--r--java/res/values-fi/strings.xml141
-rw-r--r--java/res/values-fr/donottranslate-altchars.xml16
-rw-r--r--java/res/values-fr/donottranslate.xml2
-rw-r--r--java/res/values-fr/strings.xml141
-rw-r--r--java/res/values-hr/strings.xml141
-rw-r--r--java/res/values-hu/donottranslate-altchars.xml (renamed from java/res/values-ko/donottranslate-altchars.xml)18
-rw-r--r--java/res/values-hu/strings.xml141
-rw-r--r--java/res/values-in/strings.xml141
-rw-r--r--java/res/values-it/donottranslate-altchars.xml14
-rw-r--r--java/res/values-it/strings.xml141
-rw-r--r--java/res/values-iw/strings.xml141
-rw-r--r--java/res/values-ja/strings.xml141
-rw-r--r--java/res/values-ko/strings.xml141
-rw-r--r--java/res/values-land/dimens.xml11
-rw-r--r--java/res/values-lt/donottranslate-altchars.xml (renamed from java/res/values-el/donottranslate-altchars.xml)18
-rw-r--r--java/res/values-lt/strings.xml141
-rw-r--r--java/res/values-lv/donottranslate-altchars.xml33
-rw-r--r--java/res/values-lv/strings.xml141
-rw-r--r--java/res/values-nb/donottranslate-altchars.xml24
-rw-r--r--java/res/values-nb/strings.xml141
-rw-r--r--java/res/values-nl/donottranslate-altchars.xml17
-rw-r--r--java/res/values-nl/strings.xml141
-rw-r--r--java/res/values-pl/donottranslate-altchars.xml17
-rw-r--r--java/res/values-pl/strings.xml141
-rw-r--r--java/res/values-pt-rPT/donottranslate-altchars.xml30
-rw-r--r--java/res/values-pt-rPT/strings.xml141
-rw-r--r--java/res/values-pt/donottranslate-altchars.xml17
-rw-r--r--java/res/values-pt/strings.xml141
-rw-r--r--java/res/values-rm/donottranslate-altchars.xml10
-rw-r--r--java/res/values-rm/strings.xml205
-rw-r--r--java/res/values-ro/donottranslate-altchars.xml25
-rw-r--r--java/res/values-ro/strings.xml141
-rw-r--r--java/res/values-ru/donottranslate-altchars.xml11
-rw-r--r--java/res/values-ru/strings.xml141
-rw-r--r--java/res/values-sk/donottranslate-altchars.xml35
-rw-r--r--java/res/values-sk/strings.xml141
-rw-r--r--java/res/values-sl/strings.xml141
-rw-r--r--java/res/values-sr/strings.xml141
-rw-r--r--java/res/values-sv/donottranslate-altchars.xml25
-rw-r--r--java/res/values-sv/strings.xml141
-rw-r--r--java/res/values-sw600dp-land/dimens.xml39
-rw-r--r--java/res/values-sw600dp/config.xml45
-rw-r--r--java/res/values-sw600dp/dimens.xml51
-rw-r--r--java/res/values-sw600dp/donottranslate.xml23
-rw-r--r--java/res/values-sw768dp-land/dimens.xml39
-rw-r--r--java/res/values-sw768dp/config.xml45
-rw-r--r--java/res/values-sw768dp/dimens.xml51
-rw-r--r--java/res/values-sw768dp/donottranslate.xml (renamed from java/res/values-zh-rCN/donottranslate-altchars.xml)11
-rw-r--r--java/res/values-th/strings.xml141
-rw-r--r--java/res/values-tl/strings.xml141
-rw-r--r--java/res/values-tr/donottranslate-altchars.xml15
-rw-r--r--java/res/values-tr/strings.xml141
-rw-r--r--java/res/values-uk/strings.xml141
-rw-r--r--java/res/values-vi/strings.xml141
-rw-r--r--java/res/values-zh-rCN/strings.xml141
-rw-r--r--java/res/values-zh-rTW/strings.xml141
-rw-r--r--java/res/values/attrs.xml159
-rw-r--r--java/res/values/bools.xml9
-rw-r--r--java/res/values/colors.xml1
-rw-r--r--java/res/values/config.xml50
-rw-r--r--java/res/values/dimens.xml46
-rw-r--r--java/res/values/donottranslate-altchars.xml36
-rw-r--r--java/res/values/donottranslate.xml124
-rw-r--r--java/res/values/keycodes.xml25
-rw-r--r--java/res/values/strings.xml405
-rw-r--r--java/res/values/styles.xml8
-rw-r--r--java/res/values/whitelist.xml38
-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-sw600dp-land/kbd_popup_template.xml27
-rw-r--r--java/res/xml-sw600dp/kbd_azerty_rows.xml157
-rw-r--r--java/res/xml-sw600dp/kbd_key_styles.xml211
-rw-r--r--java/res/xml-sw600dp/kbd_number.xml192
-rw-r--r--java/res/xml-sw600dp/kbd_numkey_styles.xml150
-rw-r--r--java/res/xml-sw600dp/kbd_phone.xml130
-rw-r--r--java/res/xml-sw600dp/kbd_phone_symbols.xml140
-rw-r--r--java/res/xml-sw600dp/kbd_popup_template.xml27
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty.xml34
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_f2.xml77
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_row1.xml65
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_row2.xml59
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_row3.xml76
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_row4.xml170
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_rows.xml34
-rw-r--r--java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml114
-rw-r--r--java/res/xml-sw600dp/kbd_qwertz_rows.xml123
-rw-r--r--java/res/xml-sw600dp/kbd_row3_right.xml68
-rw-r--r--java/res/xml-sw600dp/kbd_ru_rows.xml130
-rw-r--r--java/res/xml-sw600dp/kbd_sr_rows.xml146
-rw-r--r--java/res/xml-sw600dp/kbd_symbols.xml225
-rw-r--r--java/res/xml-sw600dp/kbd_symbols_shift.xml163
-rw-r--r--java/res/xml-sw768dp-land/kbd_popup_template.xml (renamed from java/res/xml/kbd_popup_narrow_template.xml)10
-rw-r--r--java/res/xml-sw768dp/kbd_azerty_rows.xml172
-rw-r--r--java/res/xml-sw768dp/kbd_key_styles.xml183
-rw-r--r--java/res/xml-sw768dp/kbd_number.xml215
-rw-r--r--java/res/xml-sw768dp/kbd_numkey_styles.xml148
-rw-r--r--java/res/xml-sw768dp/kbd_phone.xml155
-rw-r--r--java/res/xml-sw768dp/kbd_phone_symbols.xml167
-rw-r--r--java/res/xml-sw768dp/kbd_popup_template.xml (renamed from java/res/values/durations.xml)30
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty.xml (renamed from java/res/values-zh-rTW/donottranslate-altchars.xml)25
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_row1.xml69
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_row2.xml62
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_row3.xml79
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_row4.xml268
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_rows.xml34
-rw-r--r--java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml121
-rw-r--r--java/res/xml-sw768dp/kbd_qwertz_rows.xml129
-rw-r--r--java/res/xml-sw768dp/kbd_ru_rows.xml140
-rw-r--r--java/res/xml-sw768dp/kbd_sr_rows.xml154
-rw-r--r--java/res/xml-sw768dp/kbd_symbols.xml242
-rw-r--r--java/res/xml-sw768dp/kbd_symbols_shift.xml186
-rw-r--r--java/res/xml/kbd_azerty_rows.xml140
-rw-r--r--java/res/xml/kbd_currency_key_styles.xml269
-rw-r--r--java/res/xml/kbd_key_styles.xml338
-rw-r--r--java/res/xml/kbd_number.xml147
-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_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_f1.xml63
-rw-r--r--java/res/xml/kbd_qwerty_row1.xml72
-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.xml130
-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.xml108
-rw-r--r--java/res/xml/kbd_ru_rows.xml140
-rw-r--r--java/res/xml/kbd_sr_rows.xml136
-rw-r--r--java/res/xml/kbd_symbols.xml229
-rw-r--r--java/res/xml/kbd_symbols_black.xml202
-rw-r--r--java/res/xml/kbd_symbols_f1.xml38
-rw-r--r--java/res/xml/kbd_symbols_row4.xml103
-rw-r--r--java/res/xml/kbd_symbols_shift.xml203
-rw-r--r--java/res/xml/kbd_symbols_shift_black.xml177
-rw-r--r--java/res/xml/kbd_symbols_shift_row4.xml99
-rw-r--r--java/res/xml/method.xml190
-rw-r--r--java/res/xml/popup_at.xml39
-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.xml156
-rw-r--r--java/res/xml/prefs_for_debug.xml2
-rw-r--r--java/src/com/android/inputmethod/keyboard/Key.java451
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyDetector.java (renamed from java/src/com/android/inputmethod/latin/KeyDetector.java)49
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyStyles.java259
-rw-r--r--java/src/com/android/inputmethod/keyboard/Keyboard.java427
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java78
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardId.java226
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardParser.java628
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java133
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java796
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardView.java (renamed from java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java)1199
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboard.java390
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java269
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboard.java51
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java245
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java (renamed from java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java)33
-rw-r--r--java/src/com/android/inputmethod/keyboard/ModifierKeyState.java83
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java617
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java97
-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/ProximityInfo.java80
-rw-r--r--java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java126
-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)10
-rw-r--r--java/src/com/android/inputmethod/latin/AccessibilityUtils.java211
-rw-r--r--java/src/com/android/inputmethod/latin/AutoCorrection.java143
-rw-r--r--java/src/com/android/inputmethod/latin/AutoDictionary.java18
-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.java296
-rw-r--r--[-rwxr-xr-x]java/src/com/android/inputmethod/latin/CandidateView.java619
-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)15
-rw-r--r--java/src/com/android/inputmethod/latin/Dictionary.java21
-rw-r--r--java/src/com/android/inputmethod/latin/EditingUtils.java (renamed from java/src/com/android/inputmethod/latin/EditingUtil.java)91
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableDictionary.java243
-rw-r--r--java/src/com/android/inputmethod/latin/InputLanguageSelection.java127
-rw-r--r--java/src/com/android/inputmethod/latin/KeyboardSwitcher.java606
-rw-r--r--java/src/com/android/inputmethod/latin/LanguageSwitcher.java72
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java2609
-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.java1027
-rw-r--r--java/src/com/android/inputmethod/latin/LatinKeyboardView.java380
-rw-r--r--java/src/com/android/inputmethod/latin/ModifierKeyState.java42
-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.java340
-rw-r--r--java/src/com/android/inputmethod/latin/SubtypeLocale.java46
-rw-r--r--java/src/com/android/inputmethod/latin/SubtypeSwitcher.java671
-rw-r--r--[-rwxr-xr-x]java/src/com/android/inputmethod/latin/Suggest.java371
-rw-r--r--java/src/com/android/inputmethod/latin/SuggestedWords.java184
-rw-r--r--java/src/com/android/inputmethod/latin/TextEntryState.java364
-rw-r--r--java/src/com/android/inputmethod/latin/Tutorial.java244
-rw-r--r--java/src/com/android/inputmethod/latin/UserBigramDictionary.java28
-rw-r--r--java/src/com/android/inputmethod/latin/UserDictionary.java48
-rw-r--r--java/src/com/android/inputmethod/latin/Utils.java573
-rw-r--r--java/src/com/android/inputmethod/latin/WhitelistDictionary.java99
-rw-r--r--java/src/com/android/inputmethod/latin/WordComposer.java58
-rw-r--r--java/src/com/android/inputmethod/voice/FieldContext.java4
-rw-r--r--java/src/com/android/inputmethod/voice/Hints.java (renamed from java/src/com/android/inputmethod/latin/Hints.java)39
-rw-r--r--java/src/com/android/inputmethod/voice/RecognitionView.java254
-rw-r--r--java/src/com/android/inputmethod/voice/SettingsUtil.java5
-rw-r--r--java/src/com/android/inputmethod/voice/SoundIndicator.java155
-rw-r--r--java/src/com/android/inputmethod/voice/VoiceIMEConnector.java728
-rw-r--r--java/src/com/android/inputmethod/voice/VoiceInput.java76
-rw-r--r--java/src/com/android/inputmethod/voice/VoiceInputLogger.java9
-rw-r--r--java/src/com/android/inputmethod/voice/WaveformImage.java6
-rw-r--r--java/src/com/android/inputmethod/voice/Whitelist.java3
747 files changed, 24793 insertions, 20344 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..729f4ad61 100644
--- a/java/proguard.flags
+++ b/java/proguard.flags
@@ -5,4 +5,16 @@
-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();
+}
+
+-keep class com.android.inputmethod.latin.AutoCorrection {
+ java.lang.CharSequence getAutoCorrectionWord();
}
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_center_default.9.png b/java/res/drawable-hdpi/btn_center_default.9.png
new file mode 100644
index 000000000..d5ec36ba4
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_center_default.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_center_pressed.9.png b/java/res/drawable-hdpi/btn_center_pressed.9.png
new file mode 100644
index 000000000..593a679d0
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_center_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_center_selected.9.png b/java/res/drawable-hdpi/btn_center_selected.9.png
new file mode 100644
index 000000000..f1914a886
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_center_selected.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_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_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/cancel.png b/java/res/drawable-hdpi/cancel.png
deleted file mode 100644
index 506cf99d0..000000000
--- a/java/res/drawable-hdpi/cancel.png
+++ /dev/null
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
deleted file mode 100644
index b338364c5..000000000
--- a/java/res/drawable-hdpi/dialog_bubble_step02.9.png
+++ /dev/null
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
deleted file mode 100644
index 94b915432..000000000
--- a/java/res/drawable-hdpi/dialog_bubble_step07.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/highlight_pressed.png b/java/res/drawable-hdpi/highlight_pressed.png
deleted file mode 100644
index ae04901a0..000000000
--- a/java/res/drawable-hdpi/highlight_pressed.png
+++ /dev/null
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/key_hint_at_holo.9.png b/java/res/drawable-hdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..b93c2d3cf
--- /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..2b9295158
--- /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..8fa17e583
--- /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..1271341e6
--- /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..44220ec96
--- /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_comma_large_holo.9.png b/java/res/drawable-hdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 000000000..444b4d029
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_comma_large_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..d5e688400
--- /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..5dab2f646
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_0.9.png b/java/res/drawable-hdpi/key_hint_num0.9.png
index 271264e92..271264e92 100644
--- a/java/res/drawable-hdpi/keyboard_hint_0.9.png
+++ b/java/res/drawable-hdpi/key_hint_num0.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_1.9.png b/java/res/drawable-hdpi/key_hint_num1.9.png
index eaf374262..eaf374262 100644
--- a/java/res/drawable-hdpi/keyboard_hint_1.9.png
+++ b/java/res/drawable-hdpi/key_hint_num1.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_2.9.png b/java/res/drawable-hdpi/key_hint_num2.9.png
index 8a1657117..8a1657117 100644
--- a/java/res/drawable-hdpi/keyboard_hint_2.9.png
+++ b/java/res/drawable-hdpi/key_hint_num2.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_3.9.png b/java/res/drawable-hdpi/key_hint_num3.9.png
index 34b501109..34b501109 100644
--- a/java/res/drawable-hdpi/keyboard_hint_3.9.png
+++ b/java/res/drawable-hdpi/key_hint_num3.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_4.9.png b/java/res/drawable-hdpi/key_hint_num4.9.png
index d4cc250dd..d4cc250dd 100644
--- a/java/res/drawable-hdpi/keyboard_hint_4.9.png
+++ b/java/res/drawable-hdpi/key_hint_num4.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_5.9.png b/java/res/drawable-hdpi/key_hint_num5.9.png
index 6a054b42f..6a054b42f 100644
--- a/java/res/drawable-hdpi/keyboard_hint_5.9.png
+++ b/java/res/drawable-hdpi/key_hint_num5.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_6.9.png b/java/res/drawable-hdpi/key_hint_num6.9.png
index 66e91400a..66e91400a 100644
--- a/java/res/drawable-hdpi/keyboard_hint_6.9.png
+++ b/java/res/drawable-hdpi/key_hint_num6.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_7.9.png b/java/res/drawable-hdpi/key_hint_num7.9.png
index 5eae24f4f..5eae24f4f 100644
--- a/java/res/drawable-hdpi/keyboard_hint_7.9.png
+++ b/java/res/drawable-hdpi/key_hint_num7.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_8.9.png b/java/res/drawable-hdpi/key_hint_num8.9.png
index ea7f512fd..ea7f512fd 100644
--- a/java/res/drawable-hdpi/keyboard_hint_8.9.png
+++ b/java/res/drawable-hdpi/key_hint_num8.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_9.9.png b/java/res/drawable-hdpi/key_hint_num9.9.png
index 0bf85de93..0bf85de93 100644
--- a/java/res/drawable-hdpi/keyboard_hint_9.9.png
+++ b/java/res/drawable-hdpi/key_hint_num9.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..a11b4ac07
--- /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..3c87c1f7e
--- /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..670b4b902
--- /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..692f4a68b
--- /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..9cc86156e
--- /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..664467b3e
--- /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_underline_holo.9.png b/java/res/drawable-hdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..2cb4077a7
--- /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..6b9a49170
--- /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_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_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_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_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_base.png b/java/res/drawable-hdpi/mic_base.png
new file mode 100644
index 000000000..53e29ff4b
--- /dev/null
+++ b/java/res/drawable-hdpi/mic_base.png
Binary files differ
diff --git a/java/res/drawable-hdpi/mic_full.png b/java/res/drawable-hdpi/mic_full.png
new file mode 100644
index 000000000..e3e3dfac3
--- /dev/null
+++ b/java/res/drawable-hdpi/mic_full.png
Binary files differ
diff --git a/java/res/drawable-hdpi/mic_slash.png b/java/res/drawable-hdpi/mic_slash.png
index dc8da6252..1dd05c5b4 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/ok_cancel.png b/java/res/drawable-hdpi/ok_cancel.png
deleted file mode 100644
index f11e57a38..000000000
--- a/java/res/drawable-hdpi/ok_cancel.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level0.png b/java/res/drawable-hdpi/speak_now_level0.png
deleted file mode 100644
index 342849cfe..000000000
--- a/java/res/drawable-hdpi/speak_now_level0.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level1.png b/java/res/drawable-hdpi/speak_now_level1.png
deleted file mode 100644
index 8947a4306..000000000
--- a/java/res/drawable-hdpi/speak_now_level1.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level2.png b/java/res/drawable-hdpi/speak_now_level2.png
deleted file mode 100644
index 44fc58c4e..000000000
--- a/java/res/drawable-hdpi/speak_now_level2.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level3.png b/java/res/drawable-hdpi/speak_now_level3.png
deleted file mode 100644
index cfa5c1b87..000000000
--- a/java/res/drawable-hdpi/speak_now_level3.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level4.png b/java/res/drawable-hdpi/speak_now_level4.png
deleted file mode 100644
index a050d8836..000000000
--- a/java/res/drawable-hdpi/speak_now_level4.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level5.png b/java/res/drawable-hdpi/speak_now_level5.png
deleted file mode 100644
index 8cd5ae7ad..000000000
--- a/java/res/drawable-hdpi/speak_now_level5.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level6.png b/java/res/drawable-hdpi/speak_now_level6.png
deleted file mode 100644
index 9f4481eb4..000000000
--- a/java/res/drawable-hdpi/speak_now_level6.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_done.png b/java/res/drawable-hdpi/sym_bkeyboard_done.png
deleted file mode 100644
index b77803d21..000000000
--- a/java/res/drawable-hdpi/sym_bkeyboard_done.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_voice_off.png b/java/res/drawable-hdpi/sym_bkeyboard_voice_off.png
new file mode 100644
index 000000000..081a13096
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_bkeyboard_voice_off.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
deleted file mode 100644
index 471c5021b..000000000
--- a/java/res/drawable-hdpi/sym_keyboard_done.png
+++ /dev/null
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
deleted file mode 100644
index 7015e266a..000000000
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_done.png
+++ /dev/null
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
deleted file mode 100644
index 1fd822ea6..000000000
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png
+++ /dev/null
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_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_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_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_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_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_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_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_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_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_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_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_settings_holo.png b/java/res/drawable-hdpi/sym_keyboard_settings_holo.png
new file mode 100644
index 000000000..471bd0b86
--- /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_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_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_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_tab.png b/java/res/drawable-hdpi/sym_keyboard_tab.png
index 51d17d989..3d1c5c0ea 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..6e6279a8a
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_voice_off_holo.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
deleted file mode 100644
index 42868522f..000000000
--- a/java/res/drawable-hdpi/voice_ime_background.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/voice_swipe_hint.png b/java/res/drawable-hdpi/voice_swipe_hint.png
deleted file mode 100644
index 130f83a9c..000000000
--- a/java/res/drawable-hdpi/voice_swipe_hint.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/vs_dialog_blue.9.png b/java/res/drawable-hdpi/vs_dialog_blue.9.png
new file mode 100644
index 000000000..cf27e8f43
--- /dev/null
+++ b/java/res/drawable-hdpi/vs_dialog_blue.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/vs_dialog_red.9.png b/java/res/drawable-hdpi/vs_dialog_red.9.png
new file mode 100644
index 000000000..6c08d5a30
--- /dev/null
+++ b/java/res/drawable-hdpi/vs_dialog_red.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/vs_dialog_yellow.9.png b/java/res/drawable-hdpi/vs_dialog_yellow.9.png
new file mode 100644
index 000000000..2fb06c263
--- /dev/null
+++ b/java/res/drawable-hdpi/vs_dialog_yellow.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/vs_popup_mic_edge.png b/java/res/drawable-hdpi/vs_popup_mic_edge.png
new file mode 100644
index 000000000..4ff6337a2
--- /dev/null
+++ b/java/res/drawable-hdpi/vs_popup_mic_edge.png
Binary files differ
diff --git a/java/res/drawable-hdpi/working.png b/java/res/drawable-hdpi/working.png
deleted file mode 100755
index 5ea702307..000000000
--- a/java/res/drawable-hdpi/working.png
+++ /dev/null
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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..b93c2d3cf
--- /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..2b9295158
--- /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..8fa17e583
--- /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..1271341e6
--- /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..44220ec96
--- /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_comma_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 000000000..444b4d029
--- /dev/null
+++ b/java/res/drawable-land-hdpi/key_hint_comma_large_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..d5e688400
--- /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..5dab2f646
--- /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_plus_holo.9.png b/java/res/drawable-land-hdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..a11b4ac07
--- /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..3c87c1f7e
--- /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..670b4b902
--- /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..692f4a68b
--- /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..9cc86156e
--- /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..664467b3e
--- /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_underline_holo.9.png b/java/res/drawable-land-hdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..2cb4077a7
--- /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..6b9a49170
--- /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..8c84654c9
--- /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..b9e095b99
--- /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..3cd0e3c4b
--- /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..01b47b25f
--- /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..b70f71b55
--- /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_comma_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 000000000..1ae82d404
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_comma_large_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..3409535fb
--- /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..8dd2f27c4
--- /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_plus_holo.9.png b/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..51e86ba11
--- /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..bf30f92d8
--- /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..38b5d6102
--- /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..448a02700
--- /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..92fe8eaf8
--- /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..a777d0187
--- /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_underline_holo.9.png b/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..7a452c5e2
--- /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..f738b0202
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/hint_popup_holo.9.png b/java/res/drawable-land-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..3cd20d34f
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_at_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..1d257cba2
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_at_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..53de283da
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_colon_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..73394b57b
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..a4a6acbe1
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_comma_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..d4dbdf4bf
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 000000000..aea5c8ed5
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..078d1d8f7
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..ddd6b13cb
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_plus_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..d0ce9c948
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 000000000..9cf20e8b1
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_question_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..1e886d897
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_question_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..826228796
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_quote_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..fd8bbad83
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..51d5b498c
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_underline_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..37d2fa58e
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 000000000..4249a8edf
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_underline_large_holo.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_center_default.9.png b/java/res/drawable-mdpi/btn_center_default.9.png
new file mode 100644
index 000000000..d5ec36ba4
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_center_default.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_center_pressed.9.png b/java/res/drawable-mdpi/btn_center_pressed.9.png
new file mode 100644
index 000000000..593a679d0
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_center_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_center_selected.9.png b/java/res/drawable-mdpi/btn_center_selected.9.png
new file mode 100644
index 000000000..f1914a886
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_center_selected.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.png b/java/res/drawable-mdpi/cancel.png
deleted file mode 100644
index 713a37875..000000000
--- a/java/res/drawable-mdpi/cancel.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/dialog_bubble_step02.9.png b/java/res/drawable-mdpi/dialog_bubble_step02.9.png
deleted file mode 100644
index d77f85fe2..000000000
--- a/java/res/drawable-mdpi/dialog_bubble_step02.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/dialog_bubble_step07.9.png b/java/res/drawable-mdpi/dialog_bubble_step07.9.png
deleted file mode 100644
index 80f4a0eaa..000000000
--- a/java/res/drawable-mdpi/dialog_bubble_step07.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/highlight_pressed.png b/java/res/drawable-mdpi/highlight_pressed.png
deleted file mode 100644
index d27f1061a..000000000
--- a/java/res/drawable-mdpi/highlight_pressed.png
+++ /dev/null
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..8c84654c9
--- /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..b9e095b99
--- /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..3cd0e3c4b
--- /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..01b47b25f
--- /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..b70f71b55
--- /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_comma_large_holo.9.png b/java/res/drawable-mdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 000000000..1ae82d404
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_comma_large_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..3409535fb
--- /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..8dd2f27c4
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_0.9.png b/java/res/drawable-mdpi/key_hint_num0.9.png
index 61ad1b50a..61ad1b50a 100644
--- a/java/res/drawable-mdpi/keyboard_hint_0.9.png
+++ b/java/res/drawable-mdpi/key_hint_num0.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num0_holo.9.png b/java/res/drawable-mdpi/key_hint_num0_holo.9.png
new file mode 100644
index 000000000..271264e92
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num0_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_1.9.png b/java/res/drawable-mdpi/key_hint_num1.9.png
index cd7772e71..cd7772e71 100644
--- a/java/res/drawable-mdpi/keyboard_hint_1.9.png
+++ b/java/res/drawable-mdpi/key_hint_num1.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num1_holo.9.png b/java/res/drawable-mdpi/key_hint_num1_holo.9.png
new file mode 100644
index 000000000..eaf374262
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num1_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_2.9.png b/java/res/drawable-mdpi/key_hint_num2.9.png
index fa5f8b79c..fa5f8b79c 100644
--- a/java/res/drawable-mdpi/keyboard_hint_2.9.png
+++ b/java/res/drawable-mdpi/key_hint_num2.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num2_holo.9.png b/java/res/drawable-mdpi/key_hint_num2_holo.9.png
new file mode 100644
index 000000000..8a1657117
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num2_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_3.9.png b/java/res/drawable-mdpi/key_hint_num3.9.png
index 0c7336cb7..0c7336cb7 100644
--- a/java/res/drawable-mdpi/keyboard_hint_3.9.png
+++ b/java/res/drawable-mdpi/key_hint_num3.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num3_holo.9.png b/java/res/drawable-mdpi/key_hint_num3_holo.9.png
new file mode 100644
index 000000000..34b501109
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num3_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_4.9.png b/java/res/drawable-mdpi/key_hint_num4.9.png
index 73ef06c0e..73ef06c0e 100644
--- a/java/res/drawable-mdpi/keyboard_hint_4.9.png
+++ b/java/res/drawable-mdpi/key_hint_num4.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num4_holo.9.png b/java/res/drawable-mdpi/key_hint_num4_holo.9.png
new file mode 100644
index 000000000..d4cc250dd
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num4_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_5.9.png b/java/res/drawable-mdpi/key_hint_num5.9.png
index aea460e1c..aea460e1c 100644
--- a/java/res/drawable-mdpi/keyboard_hint_5.9.png
+++ b/java/res/drawable-mdpi/key_hint_num5.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num5_holo.9.png b/java/res/drawable-mdpi/key_hint_num5_holo.9.png
new file mode 100644
index 000000000..6a054b42f
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num5_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_6.9.png b/java/res/drawable-mdpi/key_hint_num6.9.png
index 16a9237e3..16a9237e3 100644
--- a/java/res/drawable-mdpi/keyboard_hint_6.9.png
+++ b/java/res/drawable-mdpi/key_hint_num6.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num6_holo.9.png b/java/res/drawable-mdpi/key_hint_num6_holo.9.png
new file mode 100644
index 000000000..66e91400a
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num6_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_7.9.png b/java/res/drawable-mdpi/key_hint_num7.9.png
index 6747a19c0..6747a19c0 100644
--- a/java/res/drawable-mdpi/keyboard_hint_7.9.png
+++ b/java/res/drawable-mdpi/key_hint_num7.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num7_holo.9.png b/java/res/drawable-mdpi/key_hint_num7_holo.9.png
new file mode 100644
index 000000000..5eae24f4f
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num7_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_8.9.png b/java/res/drawable-mdpi/key_hint_num8.9.png
index 28be2fb86..28be2fb86 100644
--- a/java/res/drawable-mdpi/keyboard_hint_8.9.png
+++ b/java/res/drawable-mdpi/key_hint_num8.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num8_holo.9.png b/java/res/drawable-mdpi/key_hint_num8_holo.9.png
new file mode 100644
index 000000000..ea7f512fd
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num8_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_9.9.png b/java/res/drawable-mdpi/key_hint_num9.9.png
index 731d63b1b..731d63b1b 100644
--- a/java/res/drawable-mdpi/keyboard_hint_9.9.png
+++ b/java/res/drawable-mdpi/key_hint_num9.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_num9_holo.9.png b/java/res/drawable-mdpi/key_hint_num9_holo.9.png
new file mode 100644
index 000000000..0bf85de93
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_num9_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..51e86ba11
--- /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..bf30f92d8
--- /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..38b5d6102
--- /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..448a02700
--- /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..92fe8eaf8
--- /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..a777d0187
--- /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_underline_holo.9.png b/java/res/drawable-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..7a452c5e2
--- /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..f738b0202
--- /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_key_feedback_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..3d6a76f66
--- /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_base.png b/java/res/drawable-mdpi/mic_base.png
new file mode 100644
index 000000000..53e29ff4b
--- /dev/null
+++ b/java/res/drawable-mdpi/mic_base.png
Binary files differ
diff --git a/java/res/drawable-mdpi/mic_full.png b/java/res/drawable-mdpi/mic_full.png
new file mode 100644
index 000000000..e3e3dfac3
--- /dev/null
+++ b/java/res/drawable-mdpi/mic_full.png
Binary files differ
diff --git a/java/res/drawable-mdpi/ok_cancel.png b/java/res/drawable-mdpi/ok_cancel.png
deleted file mode 100644
index 20d10f986..000000000
--- a/java/res/drawable-mdpi/ok_cancel.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level0.png b/java/res/drawable-mdpi/speak_now_level0.png
deleted file mode 100644
index 5bd13603e..000000000
--- a/java/res/drawable-mdpi/speak_now_level0.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level1.png b/java/res/drawable-mdpi/speak_now_level1.png
deleted file mode 100644
index ccb76b879..000000000
--- a/java/res/drawable-mdpi/speak_now_level1.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level2.png b/java/res/drawable-mdpi/speak_now_level2.png
deleted file mode 100644
index 715f90081..000000000
--- a/java/res/drawable-mdpi/speak_now_level2.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level3.png b/java/res/drawable-mdpi/speak_now_level3.png
deleted file mode 100644
index 725248a25..000000000
--- a/java/res/drawable-mdpi/speak_now_level3.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level4.png b/java/res/drawable-mdpi/speak_now_level4.png
deleted file mode 100644
index ff6c50b40..000000000
--- a/java/res/drawable-mdpi/speak_now_level4.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level5.png b/java/res/drawable-mdpi/speak_now_level5.png
deleted file mode 100644
index a5d6b89d6..000000000
--- a/java/res/drawable-mdpi/speak_now_level5.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level6.png b/java/res/drawable-mdpi/speak_now_level6.png
deleted file mode 100644
index dcdb48d08..000000000
--- a/java/res/drawable-mdpi/speak_now_level6.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_bkeyboard_done.png b/java/res/drawable-mdpi/sym_bkeyboard_done.png
deleted file mode 100644
index 05ce7c643..000000000
--- a/java/res/drawable-mdpi/sym_bkeyboard_done.png
+++ /dev/null
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_done.png b/java/res/drawable-mdpi/sym_keyboard_done.png
deleted file mode 100644
index c0d6d1394..000000000
--- a/java/res/drawable-mdpi/sym_keyboard_done.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_feedback_done.png b/java/res/drawable-mdpi/sym_keyboard_feedback_done.png
deleted file mode 100644
index 0d7ebd4e5..000000000
--- a/java/res/drawable-mdpi/sym_keyboard_feedback_done.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png b/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png
deleted file mode 100644
index 494524a66..000000000
--- a/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png
+++ /dev/null
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..784a45054
--- /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_lock.png b/java/res/drawable-mdpi/sym_keyboard_shift_lock.png
deleted file mode 100644
index 244179c2d..000000000
--- a/java/res/drawable-mdpi/sym_keyboard_shift_lock.png
+++ /dev/null
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/voice_ime_background.9.png b/java/res/drawable-mdpi/voice_ime_background.9.png
deleted file mode 100644
index 9b15bc25f..000000000
--- a/java/res/drawable-mdpi/voice_ime_background.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/voice_swipe_hint.png b/java/res/drawable-mdpi/voice_swipe_hint.png
deleted file mode 100644
index bb8873251..000000000
--- a/java/res/drawable-mdpi/voice_swipe_hint.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/vs_dialog_blue.9.png b/java/res/drawable-mdpi/vs_dialog_blue.9.png
new file mode 100644
index 000000000..cf27e8f43
--- /dev/null
+++ b/java/res/drawable-mdpi/vs_dialog_blue.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/vs_dialog_red.9.png b/java/res/drawable-mdpi/vs_dialog_red.9.png
new file mode 100644
index 000000000..6c08d5a30
--- /dev/null
+++ b/java/res/drawable-mdpi/vs_dialog_red.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/vs_dialog_yellow.9.png b/java/res/drawable-mdpi/vs_dialog_yellow.9.png
new file mode 100644
index 000000000..2fb06c263
--- /dev/null
+++ b/java/res/drawable-mdpi/vs_dialog_yellow.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/vs_popup_mic_edge.png b/java/res/drawable-mdpi/vs_popup_mic_edge.png
new file mode 100644
index 000000000..4ff6337a2
--- /dev/null
+++ b/java/res/drawable-mdpi/vs_popup_mic_edge.png
Binary files differ
diff --git a/java/res/drawable-mdpi/working.png b/java/res/drawable-mdpi/working.png
deleted file mode 100644
index 4a930c52d..000000000
--- a/java/res/drawable-mdpi/working.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 000000000..544ed7f78
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..2ffc6ea2b
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..39219a583
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..e5cc5b7e2
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.png b/java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.png
new file mode 100644
index 000000000..398eaea12
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.png
new file mode 100644
index 000000000..1780f682b
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..2ffc6ea2b
--- /dev/null
+++ b/java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..f5d15b728
--- /dev/null
+++ b/java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..bc37fa844
--- /dev/null
+++ b/java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 000000000..2ad73041e
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
new file mode 100644
index 000000000..fc21e79c4
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
new file mode 100644
index 000000000..76cfbb221
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 000000000..73748c2fb
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
new file mode 100644
index 000000000..059d4ac2e
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
new file mode 100644
index 000000000..e5cfdec88
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.png
new file mode 100644
index 000000000..060524a53
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 000000000..f4b061e07
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 000000000..ffa7386df
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..f5d15b728
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_at_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..8c84654c9
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..b9e095b99
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..3cd0e3c4b
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..01b47b25f
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..b70f71b55
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 000000000..1ae82d404
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..3409535fb
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..8dd2f27c4
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..51e86ba11
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 000000000..bf30f92d8
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_question_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..38b5d6102
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..448a02700
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..92fe8eaf8
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..a777d0187
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..7a452c5e2
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 000000000..f738b0202
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.png
new file mode 100644
index 000000000..a93966c92
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..5f152175d
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..77a806c1e
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.png
new file mode 100644
index 000000000..7be7ab7e2
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.png
new file mode 100644
index 000000000..1f87a68e9
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.png
new file mode 100644
index 000000000..155579169
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.png
new file mode 100644
index 000000000..e1d395b45
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.png
new file mode 100644
index 000000000..225436ac2
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.png
new file mode 100644
index 000000000..e513fa4a0
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.png
new file mode 100644
index 000000000..b91e005fc
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.png
new file mode 100644
index 000000000..65f88245b
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.png
new file mode 100644
index 000000000..b89ef07eb
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.png
new file mode 100644
index 000000000..931275a9e
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.png
new file mode 100644
index 000000000..9396c4c8f
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.png
new file mode 100644
index 000000000..12e3eef45
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.png
new file mode 100644
index 000000000..6911c2b4f
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.png
new file mode 100644
index 000000000..e3a8b4900
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.png
new file mode 100644
index 000000000..e80e9345f
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.png
new file mode 100644
index 000000000..73153849c
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.png
new file mode 100644
index 000000000..d519ccecf
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.png
new file mode 100644
index 000000000..784a45054
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.png
new file mode 100644
index 000000000..91d6e32f9
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.png
new file mode 100644
index 000000000..2bd053656
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.png
new file mode 100644
index 000000000..25e655d96
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.png
new file mode 100644
index 000000000..5acd12cc4
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.png
new file mode 100644
index 000000000..c1116dc17
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.png
new file mode 100644
index 000000000..081a13096
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 000000000..8b5d1b098
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..bc37fa844
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..8d43a4bdb
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..e973c7e6a
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.png b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.png
new file mode 100644
index 000000000..c7a8b286a
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.png
new file mode 100644
index 000000000..fd9f8cce6
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 000000000..544ed7f78
--- /dev/null
+++ b/java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..2ffc6ea2b
--- /dev/null
+++ b/java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..099a50873
--- /dev/null
+++ b/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..c21240f17
--- /dev/null
+++ b/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..2b93014e1
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..c409cea00
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_at_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..5b946ff9b
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..852f899ed
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..1d9346e6f
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..17e9091b4
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..c2a913c04
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 000000000..846f213f1
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..ce8e8de43
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..035dcf85d
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..931390b45
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 000000000..e6f9f8a9c
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_question_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..6cbeb5993
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..bfd58de09
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..3b361b71c
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..2a08aa12e
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..06f3efb7e
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 000000000..50f99a191
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..3cd20d34f
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 000000000..2ad73041e
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
new file mode 100644
index 000000000..fc21e79c4
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
new file mode 100644
index 000000000..76cfbb221
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 000000000..73748c2fb
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
new file mode 100644
index 000000000..059d4ac2e
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
new file mode 100644
index 000000000..e5cfdec88
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.png
new file mode 100644
index 000000000..060524a53
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 000000000..f4b061e07
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 000000000..ffa7386df
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..01d1139d8
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_at_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..8c84654c9
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..b9e095b99
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..3cd0e3c4b
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..01b47b25f
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..b70f71b55
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 000000000..1ae82d404
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..3409535fb
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..8dd2f27c4
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..51e86ba11
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 000000000..bf30f92d8
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_question_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..38b5d6102
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..448a02700
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..92fe8eaf8
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..a777d0187
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..7a452c5e2
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 000000000..f738b0202
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.png
new file mode 100644
index 000000000..a93966c92
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..286cf84fc
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..e3f5be86d
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.png
new file mode 100644
index 000000000..7be7ab7e2
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.png
new file mode 100644
index 000000000..1f87a68e9
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.png
new file mode 100644
index 000000000..155579169
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.png
new file mode 100644
index 000000000..e1d395b45
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.png
new file mode 100644
index 000000000..225436ac2
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.png
new file mode 100644
index 000000000..e513fa4a0
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.png
new file mode 100644
index 000000000..b91e005fc
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.png
new file mode 100644
index 000000000..65f88245b
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.png
new file mode 100644
index 000000000..b89ef07eb
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.png
new file mode 100644
index 000000000..931275a9e
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.png
new file mode 100644
index 000000000..9396c4c8f
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.png
new file mode 100644
index 000000000..12e3eef45
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.png
new file mode 100644
index 000000000..6911c2b4f
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.png
new file mode 100644
index 000000000..e3a8b4900
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.png
new file mode 100644
index 000000000..e80e9345f
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.png
new file mode 100644
index 000000000..d519ccecf
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.png
new file mode 100644
index 000000000..784a45054
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.png
new file mode 100644
index 000000000..91d6e32f9
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.png
new file mode 100644
index 000000000..2bd053656
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.png
new file mode 100644
index 000000000..25e655d96
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_tab_holo.png
new file mode 100644
index 000000000..5acd12cc4
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.png
new file mode 100644
index 000000000..c1116dc17
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.png
new file mode 100644
index 000000000..081a13096
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 000000000..8b5d1b098
--- /dev/null
+++ b/java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..bc37fa844
--- /dev/null
+++ b/java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..38c84e81b
--- /dev/null
+++ b/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..f66e54538
--- /dev/null
+++ b/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png
new file mode 100644
index 000000000..eae1e3a54
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 000000000..3e4a81247
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png
new file mode 100644
index 000000000..13bad8f1a
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png
new file mode 100644
index 000000000..d61dd2b88
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png
new file mode 100644
index 000000000..853b8bc6e
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.png
new file mode 100644
index 000000000..c127e2ad0
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png
new file mode 100644
index 000000000..1edfd64fe
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 000000000..ac3f3581b
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png
new file mode 100644
index 000000000..dfdbfadd3
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
new file mode 100644
index 000000000..e5de3b0a2
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png
new file mode 100644
index 000000000..0e2733e17
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
new file mode 100644
index 000000000..c63b69a6c
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png
new file mode 100644
index 000000000..ea13a7fdf
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png
new file mode 100644
index 000000000..e1361edf2
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png
new file mode 100644
index 000000000..2ed1b3447
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png
new file mode 100644
index 000000000..057c5716e
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png
new file mode 100644
index 000000000..5d8e46de0
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 000000000..6efd3a759
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 000000000..3ed9b1e7c
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/hint_popup_holo.9.png b/java/res/drawable-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..bc37fa844
--- /dev/null
+++ b/java/res/drawable-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_at_holo.9.png b/java/res/drawable-xhdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..1d257cba2
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_at_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..53de283da
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_colon_holo.9.png b/java/res/drawable-xhdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..73394b57b
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..a4a6acbe1
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_comma_holo.9.png b/java/res/drawable-xhdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..d4dbdf4bf
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 000000000..aea5c8ed5
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-xhdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..078d1d8f7
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..ddd6b13cb
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_plus_holo.9.png b/java/res/drawable-xhdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..d0ce9c948
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 000000000..9cf20e8b1
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_question_holo.9.png b/java/res/drawable-xhdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..1e886d897
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_question_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..826228796
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_quote_holo.9.png b/java/res/drawable-xhdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..fd8bbad83
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..51d5b498c
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_underline_holo.9.png b/java/res/drawable-xhdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..37d2fa58e
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 000000000..4249a8edf
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background.9.png
new file mode 100644
index 000000000..16c76106c
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..943f9e4bc
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.png
new file mode 100644
index 000000000..e020e34b1
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..f66e54538
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.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/dictionary.xml b/java/res/drawable/btn_candidate.xml
index 7b770a8b4..efcee9f54 100644
--- a/java/res/xml/dictionary.xml
+++ b/java/res/drawable/btn_candidate.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_candidate_pressed" />
+</selector>
diff --git a/java/res/xml/popup_slash.xml b/java/res/drawable/btn_candidate_holo.xml
index a38fde0e4..66cd2460b 100644
--- a/java/res/xml/popup_slash.xml
+++ b/java/res/drawable/btn_candidate_holo.xml
@@ -18,22 +18,10 @@
*/
-->
-<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_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_keyboard_key2.xml b/java/res/drawable/btn_keyboard_key_honeycomb.xml
index bd745b76e..3dab8430f 100644
--- a/java/res/drawable/btn_keyboard_key2.xml
+++ b/java/res/drawable/btn_keyboard_key_honeycomb.xml
@@ -14,23 +14,30 @@
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_pressed_on" />
+ <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_fulltrans_pressed" />
+ 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_normal_on" />
+ android:drawable="@drawable/btn_keyboard_key_dark_normal_on_holo" />
<item android:state_checkable="true"
- android:drawable="@drawable/btn_keyboard_key_fulltrans_normal" />
+ android:drawable="@drawable/btn_keyboard_key_dark_normal_off_holo" />
<!-- Normal keys -->
<item android:state_pressed="true"
- android:drawable="@drawable/btn_keyboard_key_fulltrans_pressed" />
- <item android:drawable="@drawable/btn_keyboard_key_fulltrans_normal" />
+ 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/ic_suggest_scroll_background.xml b/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml
index 9d246e40e..6c2713650 100644
--- a/java/res/drawable/ic_suggest_scroll_background.xml
+++ b/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
@@ -15,11 +15,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
- <item android:state_pressed="false"
- android:drawable="@android:color/transparent" />
-
<item android:state_pressed="true"
- android:drawable="@drawable/highlight_pressed" />
-
-</selector> \ No newline at end of file
+ android:drawable="@drawable/btn_keyboard_key_popup_selected_holo" />
+</selector>
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..a3ea140cd
--- /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_holo" />
+ <item android:drawable="@drawable/keyboard_key_feedback_background_holo" />
+</selector>
diff --git a/java/res/layout-sw600dp/candidate.xml b/java/res/layout-sw600dp/candidate.xml
new file mode 100644
index 000000000..e672707a1
--- /dev/null
+++ b/java/res/layout-sw600dp/candidate.xml
@@ -0,0 +1,60 @@
+<?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.
+*/
+-->
+
+<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/layout-sw600dp/candidate_preview.xml b/java/res/layout-sw600dp/candidate_preview.xml
new file mode 100644
index 000000000..3ef2e6ed4
--- /dev/null
+++ b/java/res/layout-sw600dp/candidate_preview.xml
@@ -0,0 +1,29 @@
+<?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.
+*/
+-->
+
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ 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-sw600dp/candidates.xml b/java/res/layout-sw600dp/candidates.xml
new file mode 100644
index 000000000..26d6822e9
--- /dev/null
+++ b/java/res/layout-sw600dp/candidates.xml
@@ -0,0 +1,45 @@
+<?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.
+*/
+-->
+
+<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-sw600dp/keyboard_popup_honeycomb.xml b/java/res/layout-sw600dp/keyboard_popup_honeycomb.xml
new file mode 100644
index 000000000..49eb936d6
--- /dev/null
+++ b/java/res/layout-sw600dp/keyboard_popup_honeycomb.xml
@@ -0,0 +1,41 @@
+<?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.
+*/
+-->
+<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-sw768dp/candidate.xml b/java/res/layout-sw768dp/candidate.xml
new file mode 100644
index 000000000..74532a1e2
--- /dev/null
+++ b/java/res/layout-sw768dp/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_comma.xml b/java/res/layout-sw768dp/candidate_preview.xml
index 7666f4b62..61d5f8e7b 100644
--- a/java/res/xml/popup_comma.xml
+++ b/java/res/layout-sw768dp/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-sw768dp/candidates.xml b/java/res/layout-sw768dp/candidates.xml
new file mode 100644
index 000000000..e2ddb84b1
--- /dev/null
+++ b/java/res/layout-sw768dp/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-sw768dp/keyboard_popup_honeycomb.xml b/java/res/layout-sw768dp/keyboard_popup_honeycomb.xml
new file mode 100644
index 000000000..0b8229ca5
--- /dev/null
+++ b/java/res/layout-sw768dp/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/bubble_text.xml b/java/res/layout/key_preview_honeycomb.xml
index c3957b65e..a90fe5588 100644
--- a/java/res/layout/bubble_text.xml
+++ b/java/res/layout/key_preview_honeycomb.xml
@@ -1,30 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-/*
+/*
**
-** Copyright 2009, 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.
*/
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="14sp"
- android:textColor="?android:attr/textColorPrimary"
- android:minWidth="32dip"
+ 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:shadowRadius="2.75"
- android:shadowColor="#BB000000"
+ 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
deleted file mode 100755
index 20e670807..000000000
--- a/java/res/raw/type3.ogg
+++ /dev/null
Binary files differ
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index 89b5ef365..f4bc3cac9 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"عام"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"عرض اقتراحات التصحيح"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"عرض الكلمات المقترحة أثناء الكتابة"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"عرض دومًا"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"عرض في وضع رأسي"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"حذف"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"رجوع"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"الإعدادات"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"العالي"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"مسافة"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"الرموز"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"الإدخال الصوتي"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"تشغيل الرموز"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"إيقاف الرموز"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"تشغيل العالي"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"إيقاف العالي"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"يستخدم الإدخال الصوتي خاصية التعرف على الكلام من Google. تنطبق "<a href="http://m.google.com/privacy">"سياسة خصوصية الجوال"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"لإيقاف الإدخال الصوتي، انتقل إلى إعدادات طريقة الإدخال."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"لوحة مفاتيح ألمانية"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"لوحة مفاتيح إنجليزية (بريطانيا)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"لوحة مفاتيح إنجليزية (الولايات المتحدة)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"لوحة مفاتيح إسبانية"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"لوحة مفاتيح فرنسية"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"لوحة مفاتيح فرنسية (كندا)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"لوحة مفاتيح فرنسية (سويسرا)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"صوت أفريقاني"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صوت تشيكي"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صوت ألماني"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"صوت إنجليزي"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"صوت إسباني"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"صوت فرنسي"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"صوت إيطالي"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"صوت ياباني"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"صوت كوري"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"صوت هولندي"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"صوت صيني، يوي"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"صوت صيني، الماندارين"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"صوت زولوي"</string>
+ <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..939fd75c8 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Общи"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Показване на предложения за поправка"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Показване на предложения, докато пишете"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Винаги да се показва"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показване с вертикална ориентация"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"Изтриване"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Настройки"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Интервал"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Символи"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Гласово въвеждане"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Символите са включени"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Символите са изключени"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift е включен"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift е изключен"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовото въвеждане използва функцията на Google за разпознаване на говор. В сила е "<a href="http://m.google.com/privacy">"Декларацията за поверителност за мобилни устройства"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"За да изключите гласовото въвеждане, отворете настройките за метода за въвеждане."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"немска клавиатура"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"английска (Великобрит.) клавиатура"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"английска (САЩ) клавиатура"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"испанска клавиатура"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"френска клавиатура"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"френска (Канада) клавиатура"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"френска (Швейцария) клавиатура"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"африкаанс, гласово"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"чешки, гласово"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"немски, гласово"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"английски, гласово"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"испански, гласово"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"френски, гласово"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"италиански, гласово"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"японски, гласово"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"корейски, гласово"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"нидерландски, гласово"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"китайски, кантонски, гласово"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"китайски, мандарин, гласово"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"зулуски, гласово"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Режим за изследване на използваемостта"</string>
</resources>
diff --git a/java/res/values-es-rUS/donottranslate-altchars.xml b/java/res/values-ca/donottranslate-altchars.xml
index d3beafade..336057be0 100644
--- a/java/res/values-es-rUS/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 f551d7b80..8a0b84590 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -26,68 +26,53 @@
<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">"Amaga els suggeriments de paraules en visualització horitzontal"</string>
+ <string name="general_category" msgid="1859088467017573195">"General"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Correcció de text"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostra els suggeriments de correcció"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostra paraules suggerides mentre s\'escriu"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostra sempre"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostra en mode vertical"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Barra espaiadora i punt. correg. autom. paraules mal escrites"</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">"Total"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Suprimeix"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Retorn"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Configuració"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Majúscules"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Espai"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbols"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tabulador"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Entrada de veu"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Símbols activats"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Símbols desactivats"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Majúscules activades"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Majúscules desactivades"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'entrada de veu utilitza el reconeixement de veu de Google. S\'hi aplica la "<a href="http://m.google.com/privacy">"Política de privadesa de Google per a mòbils"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per desactivar l\'entada de veu, vés a la configuració del mètode d\'entrada."</string>
+ <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 +89,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">"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">"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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclat alemany"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclat anglès (Regne Unit)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclat anglès (Estats Units)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclat espanyol"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclat francès"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclat francès (Canadà)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclat francès (Suïssa)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Veu en afrikaans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Veu txeca"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Veu alemanya"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Veu anglesa"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Veu espanyola"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Veu francesa"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Veu italiana"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Veu japonesa"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Veu coreana"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Veu holandesa"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Veu xinesa (Yue)"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Veu xinesa (mandarí)"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Veu en zulu"</string>
+ <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 3bbd758d1..a8091bb57 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Obecné"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Oprava textu"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobrazit návrhy oprav"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Zobrazovat navržená slova během psaní"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vždy zobrazovat"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Zobrazit v režimu na výšku"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Stisknutím mezerníku a interpunkce se automaticky opravují chybně napsaná slova"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Smazat"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Nastavení"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"mezera"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboly"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Karta"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Hlasový vstup"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symboly jsou zapnuty"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symboly jsou vypnuty"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Režim Shift je zapnutý"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Režim Shift je vypnutý"</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>
+ <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>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Chcete-li vypnout hlasový vstup, přejděte do nastavení metod vstupu."</string>
+ <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 +89,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 +103,39 @@
<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>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykem aktivovat opravy"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Opravy napsaných slov dotykem"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Klepnutím na zadaná slova tato 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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Klávesnice – čeština"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Klávesnice – dánština"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Klávesnice – němčina"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klávesnice – angličtina (VB)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klávesnice – angličtina (USA)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klávesnice – španělština"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klávesnice – francouzština"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klávesnice – francouzština (Kanada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klávesnice – francouzština (Švýc.)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klávesnice – italština"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klávesnice – norština"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klávesnice – holandština"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klávesnice – ruština"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klávesnice – srbština"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klávesnice – švédština"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voice – afrikánština"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice – čeština"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice – němčina"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voice – angličtina"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voice – španělština"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voice – francouzština"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Hlasový vstup – italština"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voice – japonština"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voice – korejština"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Hlasový vstup – holandština"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voice – polština"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voice – portugalština"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voice – ruština"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voice – turečtina"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voice – čínština, kantonština"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voice – čínština, mandarínština"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voice – zulu"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Režim studie 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 f1fe6ecc6..5c23ccf5f 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Generelt"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Tekstkorrigering"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Vis rettelsesforslag"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vis ordforslag under indtastning"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vis altid"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Vis i portrættilstand"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Mellemrumstast og tegnsætning retter automatisk forkerte 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>
+ <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="description_delete_key" msgid="5586406298531883960">"Slet"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Tilbage"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Indstillinger"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Mellemrum"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboler"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Fane"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Stemmeinput"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symboler: Til"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symboler: Fra"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift: Til"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift: Fra"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Stemmeinput anvender Googles stemmegenkendelse. "<a href="http://m.google.com/privacy">"Fortrolighedspolitikken for mobilenheder"</a>" gælder."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Slå stemmeinput fra i indstillingerne for inputmetode."</string>
+ <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 +89,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 +103,39 @@
<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>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryk for at rette ord"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tryk på de indtastede ord for at rette dem"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tryk på de 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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tjekkisk tastatur"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dansk tastatur"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tysk tastatur"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannien)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Schweiz)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Hollandsk tastatur"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans stemme"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tjekkisk stemme"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Tysk stemme"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Engelsk stemme"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spansk stemme"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransk stemme"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italiensk stemme"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japansk stemme"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreansk stemme"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Hollandsk stemme"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polsk stemme"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugisisk stemme"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russisk stemme"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Tyrkisk stemme"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Kinesisk, Yue stemme"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Kinesisk, mandarin stemme"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu stemme"</string>
+ <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 e474bd733..86adb915c 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Allgemein"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Textkorrektur"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Änderungsvorschläge anzeigen"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vorgeschlagene Wörter während des Tippens anzeigen"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Immer anzeigen"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Im Hochformat anzeigen"</string>
+ <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">"Autokorrektur"</string>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Korrektur fehlerhafter Wörter durch Leertaste und Satzzeichen"</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">"Stark"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Löschen"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Eingabe"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Einstellungen"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Umschalt"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Leerzeichen"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbole"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Spracheingabe"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symbole an"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symbole aus"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Umschalt an"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Umschalt aus"</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>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spracheingaben werden zurzeit nicht für Ihre Sprache unterstützt, funktionieren jedoch in Englisch."</string>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Die Spracheingabe verwendet die Spracherkennung von Google. Es gelten die "<a href="http://m.google.com/privacy">"Google Mobile-Datenschutzbestimmungen"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Rufen Sie zum Deaktivieren der Spracheingabe die Einstellungen für die Eingabemethode auf."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Drücken Sie zur Verwendung der Spracheingabe die Mikrofonschaltfläche."</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 +89,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">"Spracheingabe 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 +103,39 @@
<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>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Zum Korrigieren auf eingegebene Wörter tippen"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tippen Sie zum Korrigieren auf eingegebene Wörter (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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tschechische Tastatur"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dänische Tastatur"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Deutsche Tastatur"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Englische Tastatur (GB)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Englische Tastatur (USA)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanische Tastatur"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Französische Tastatur"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Französische Tastatur (Kanada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Französische Tastatur (Schweiz)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienische Tastatur"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegische Tastatur"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Niederländische Tastatur"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russische Tastatur"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbische Tastatur"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Schwedische Tastatur"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Stimme in Afrikaans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tschechische Sprache"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Deutsche Sprache"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Englische Stimme"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanische Sprache"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Französische Sprache"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italienisch"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanische Sprache"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreanische Sprache"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Niederländisch"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polnische Sprache"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugiesische Sprache"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russische Sprache"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Türkische Sprache"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinesische Stimme (Yue)"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinesische Stimme (Mandarin)"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Stimme in isiZulu"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modus der Studie zur Benutzerfreundlichkeit"</string>
</resources>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index 5e5c583bf..355d7a3c6 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Γενικά"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Εμφάνιση προτάσεων διόρθωσης"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Να εμφανίζεται πάντα"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Εμφάνιση σε λειτουργία κατακόρυφης προβολής"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Ρυθμίσεις"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Κενό"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Σύμβολα"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Φωνητική εντολή"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Σύμβολα ενεργά"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Σύμβολα ανενεργά"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift ενεργό"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift ανενεργό"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Οι φωνητικές εντολές χρησιμοποιούν την τεχνολογία αναγνώρισης φωνής της Google. Ισχύει "<a href="http://m.google.com/privacy">"η Πολιτική Απορρήτου για κινητά"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Για να απενεργοποιήσετε τις φωνητικές εντολές, μεταβείτε στις ρυθμίσεις της μεθόδου εισαγωγής."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Γερμανικό πληκτρολόγιο"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Αγγλικό (ΗΒ) πληκτρολόγιο"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Αγγλικό (ΗΠΑ) πληκτρολόγιο"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ισπανικό πληκτρολόγιο"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Γαλλικό πληκτρολόγιο"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Γαλλικό (Καναδάς) πληκτρολόγιο"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Γαλλικό (Ελβετία) πληκτρολόγιο"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Αφρικάανς"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Τσεχικά"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Γερμανικά"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Αγγλικά"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Ισπανικά"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Γαλλικά"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Φωνητικές εντολές στα Ιταλικά"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Ιαπωνικά"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Κορεατικά"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Φωνητικές εντολές στα Ολλανδικά"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Κινεζικά, Γιούε"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Κινεζικά, Μανδαρινικά"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Ζουλού"</string>
+ <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..89a6a2e78 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"General"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Text correction"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Show correction suggestions"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Display suggested words while typing"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Always show"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Show on portrait mode"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Spacebar and punctuation correct mistyped words 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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Settings"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Space"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbols"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Voice Input"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symbols on"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symbols off"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift on"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift off"</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>
+ <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>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"To turn off voice input, go to input method settings."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German Keyboard"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"English (UK) Keyboard"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"English (US) Keyboard"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish Keyboard"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French Keyboard"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) Keyboard"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) Keyboard"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans Voice"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech Voice"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German Voice"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"English Voice"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanish Voice"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"French Voice"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italian Voice"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese Voice"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean Voice"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Dutch Voice"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinese, Yue Voice"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinese, Mandarin Voice"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu Voice"</string>
+ <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..29582c950 100644
--- a/java/res/values-en/donottranslate-altchars.xml
+++ b/java/res/values-en/donottranslate-altchars.xml
@@ -18,10 +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_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_s">ß</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 0cd8a50a5..9a45219b0 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -26,68 +26,53 @@
<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 al pulsar tecla"</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>
+ <string name="general_category" msgid="1859088467017573195">"General"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Corrección de texto"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugerencias de correcciones"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostrar palabras sugeridas al escribir"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar en modo retrato"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"La barra espaciadora y puntuación insertan automáticamente las palabras corregidas"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Eliminar"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Volver"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Configuración"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Mayús"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Espacio"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbolos"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Entrada de voz"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Símbolos activados"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Símbolos desactivados"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Mayús activado"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Mayús desactivado"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada de voz usa el reconocimiento de voz de Google. "<a href="http://m.google.com/privacy">"Se aplica la política de privacidad para"</a>" celulares."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la entrada de voz, ve a la configuración de métodos de entrada."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado en checo"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado en danés"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado en alemán"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado en inglés (Reino Unido)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado en inglés (EE.UU.)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado en español"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado en francés"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado en francés (Canadá)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado en francés (Suiza)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado en italiano"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado en noruego"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado en holandés"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado en ruso"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado en serbio"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado en sueco"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz en Afrikaans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz en checo"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz en alemán"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz en inglés"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz en español"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz en francés"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz en japonés"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz en coreano"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz en polaco"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz en portugués"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz en ruso"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz en turco"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz en Yue, chino"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz en mandarín, chino"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz en isiZulu"</string>
+ <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 6e5963fb0..1e72a0c37 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"General"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Corrección ortográfica"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugerencias de correcciones"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Muestra las palabras sugeridas mientras se escribe."</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar en modo vertical"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Espacio y punt para corregir errores"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Eliminar"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Retroceso"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Ajustes"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Mayús"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Espacio"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbolos"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tabulador"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Entrada de voz"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Símbolos activados"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Símbolos desactivados"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Mayús activadas"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Mayús desactivadas"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada 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>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la función de entrada de voz, accede a los ajustes del método de introducción de texto."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar la entrada 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 +89,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 de 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 teclado principal"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro en teclado de símbolos"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entrada de voz inhabilitada"</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 +103,39 @@
<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 palabras"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tocar palabras introducidas para corregirlas"</string>
+ <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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado checo"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado danés"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado alemán"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglés (Reino Unido)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado de inglés (EE.UU.)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado español"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francés"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francés (Canadá)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francés (Suiza)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado noruego"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandés"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado ruso"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado serbio"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz afrikáans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice en checo"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice en alemán"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz inglesa"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Google Voice en español"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Google Voice en francés"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice en japonés"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice en coreano"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Google Voice en polaco"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Google Voice en portugués"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Google Voice en ruso"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Google Voice en turco"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz china (cantonés)"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz china (mandarín)"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz zulú"</string>
+ <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..ceeee52d9 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"کلی"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"نمایش پیشنهادات تصحیح"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"نمایش واژه های پیشنهادی در حین تایپ"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"همیشه نمایش داده شود"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"نمایش در حالت عمودی"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"تنظیمات"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"فاصله"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"نمادها"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"ورودی صوتی"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"نمادها روشن"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"نمادها خاموش"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift روشن"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift خاموش"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ورودی صوتی از تشخیص صدای Google استفاده می کند. "<a href="http://m.google.com/privacy">"خط مشی رازداری Mobile "</a>" اعمال می شود."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"برای خاموش کردن ورودی صدا، به تنظیمات روش ورودی بروید."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"صفحه کلید آلمانی"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"صفحه کلید انگلیسی (بریتانیایی)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"صفحه کلید انگلیسی (آمریکایی)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"صفحه کلید اسپانیایی"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"صفحه کلید فرانسوی"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"صفحه کلید فرانسوی (کانادایی)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"صفحه کلید فرانسوی (سوئیس)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"صدای آفریکانس"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صدای چک"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صدای آلمانی"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"صدای انگلیسی"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"صدای اسپانیایی"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"صدای فرانسوی"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"صدای ایتالیایی"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"صدای ژاپنی"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"صدای کره ای"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"صدای هلندی"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"صدای چینی، یوئه"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"صدای چینی، ماندارین"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"صدای ایزی زولو"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"حالت تست قابلیت استفاده"</string>
</resources>
diff --git a/java/res/values-ja/donottranslate-altchars.xml b/java/res/values-fi/donottranslate-altchars.xml
index d3beafade..ff87a3258 100644
--- a/java/res/values-ja/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..ee49c998f 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Yleinen"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Tekstin korjaus"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Näytä korjausehdotukset"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Näytä sanaehdotukset kirjoitettaessa"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Näytä aina"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Näytä pystysuunnassa"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Välilyönnit ja välimerkit korjaavat väärinkirjoitetut sanat automaattisesti"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Poista"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Rivinvaihto"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Asetukset"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Välilyönti"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbolit"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Sarkain"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Äänisyöte"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symbolit käytössä"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symbolit pois käytöstä"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift käytössä"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift pois käytöstä"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Äänisyöte käyttää Googlen puheentunnistusta. "<a href="http://m.google.com/privacy">"Mobile-tietosuojakäytäntö"</a>" on voimassa."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Siirry syöttöasetuksiin poistaaksesi äänisyötteen käytöstä."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ota äänisyöte käyttöön painamalla mikrofonikuvaketta."</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 +89,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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Korjaa annetut sanat napauttamalla. (Vain, kun ehdotuksia on näkyvillä.)"</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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Näppäimistö: saksa"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Näppäimistö: englanti (UK)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Näppäimistö: englanti (US)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Näppäimistö: espanja"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Näppäimistö: ranska"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Näppäimistö: ranska (Kanada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Näppäimistö: ranska (Sveitsi)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Ääni: afrikaans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Ääni: tšekki"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Ääni: saksa"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Ääni: englanti"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Ääni: espanja"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Ääni: ranska"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"italia (ääni)"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Ääni: japani"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Ääni: korea"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"hollanti (ääni)"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Ääni: kiina, yue"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Ääni: mandariinikiina"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Ääni: isiZulu"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Käytettävyystutkimustila"</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/donottranslate.xml b/java/res/values-fr/donottranslate.xml
index b79df7b37..6c3536210 100644
--- a/java/res/values-fr/donottranslate.xml
+++ b/java/res/values-fr/donottranslate.xml
@@ -19,7 +19,7 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Symbols that are commonly considered word separators in this language -->
- <string name="word_separators">.\u0009\u0020,;:!?\'\n()[]*&amp;@{}/&lt;&gt;_+=|\u0022</string>
+ <string name="word_separators">.\u0009\u0020,;:!?\n()[]*&amp;@{}/&lt;&gt;_+=|\u0022</string>
<!-- Symbols that are sentence separators, for purposes of making it hug the last sentence. -->
<string name="sentence_separators">.,</string>
</resources>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index 06ba1eae9..59a1387cf 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -26,68 +26,53 @@
<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"</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>
+ <string name="general_category" msgid="1859088467017573195">"Général"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Correction du texte"</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 autom. terme surligné (pression sur barre espace/ponctuation)"</string>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Afficher les suggestions de correction"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Afficher les suggestions de terme lors de la saisie"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Toujours afficher"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afficher en mode Portrait"</string>
+ <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Toujours masquer"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Afficher touche param."</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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Corriger autom. orthographe (pression sur barre espace/signes ponctuation)"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Supprimer"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Entrée"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Paramètres"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Maj"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Espace"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboles"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tabulation"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Saisie vocale"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symboles activés"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symboles désactivés"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Maj activée"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Maj désactivée"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La saisie vocale fait appel à la reconnaissance vocale de Google. Les "<a href="http://m.google.com/privacy">"Règles de confidentialité Google Mobile"</a>" s\'appliquent."</string>
+ <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>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Pour utiliser la saisie vocale, appuyez sur la touche du 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 +89,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 +103,39 @@
<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"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Appuyer sur les mots saisis pour les corriger"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Appuyer sur les mots saisis pour les corriger, uniquement lorsque des 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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Clavier tchèque"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Clavier danois"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Clavier allemand"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Clavier anglais (Royaume-Uni)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Clavier anglais (États-Unis)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Clavier espagnol"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Clavier français"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Clavier français (Canada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Clavier français (Suisse)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Clavier italien"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Clavier norvégien"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Clavier néerlandais"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Clavier russe"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Clavier serbe"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Clavier suédois"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voix parlant afrikaans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voix tchèque"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voix allemande"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voix parlant anglais"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voix espagnole"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voix française"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voix parlant italien"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voix japonaise"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voix coréenne"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voix parlant néerlandais"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voix polonaise"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voix portugaise"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voix russe"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voix turque"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voix parlant chinois (cantonais)"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voix parlant chinois (mandarin)"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voix parlant zoulou"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mode d\'étude de l\'utilisation"</string>
</resources>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index a97c95360..1ff4ba21a 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Općenito"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Ispravak teksta"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokaži prijedloge ispravka"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Prikazivanje predloženih riječi prilikom upisivanja"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Uvijek prikaži"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Prikaži u portretnom načinu"</string>
+ <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">"Samoispravak"</string>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Razm. i intrp. aut. ispr. kr. rči."</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Postavke"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Razmaknica"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simboli"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tabulator"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Glasovni unos"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Simboli uključeni"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Simboli isključeni"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift uključen"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift isključen"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Glasovni ulaz"</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>
+ <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 uslugu Mobile"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Za isključivanje glasovnog unosa idite na postavke načina unosa."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Za upotrebu glasovnog unosa 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 +89,12 @@
<string name="cancel" msgid="6830980399865683324">"Odustani"</string>
<string name="ok" msgid="7898366843681727667">"U redu"</string>
<string name="voice_input" msgid="2466640768843347841">"Glasovni ulaz"</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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dodirnite unesene riječi da biste ih ispravili samo kada su prijedlozi vidljivi"</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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Njemačka tipkovnica"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engleska (UK) tipkovnica"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engleska (SAD) tipkovnica"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španjolska tipkovnica"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francuska tipkovnica"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francuska (Kanada) tipkovnica"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francuska (Švicarska) tipkovnica"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"afrikaans glasovno"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Češki glasovni"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Njemački glasovni"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"engleski glasovno"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Španjolski glas"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francuski glas"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Talijanski glas"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanski glas"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korejski glas"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Nizozemski glas"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"kineski, Yue glasovno"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"kineski, mandarinski glasovno"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu glasovno"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Način studije upotrebljivosti"</string>
</resources>
diff --git a/java/res/values-ko/donottranslate-altchars.xml b/java/res/values-hu/donottranslate-altchars.xml
index d3beafade..ae28cc5b8 100644
--- a/java/res/values-ko/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..923103bce 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Általános"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Szövegjavítás"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Javítási ajánlások megjelenítése"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"A javasolt szavak megjelenítése gépelés közben"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mindig látszik"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Megjelenítés álló tájolásban"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Szóköz és központozás automatikusan javítja az elgépelést"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Törlés"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Vissza"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Beállítások"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Szóköz"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Szimbólumok"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Hangbevitel"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Szimbólumok be"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Szimbólumok ki"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift be"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift ki"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A hangbevitel a Google beszédfelismerő technológiáját használja, amelyre a "<a href="http://m.google.com/privacy">"Mobil adatvédelmi irányelvek"</a>" érvényesek."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"A hangbevitelt a beviteli mód beállításai között lehet kikapcsolni."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"A hangbevitel használatához nyomja meg a mikrofon gombot."</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 +89,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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"A beírt szavakat csak akkor javíthatja ki megérintve, ha látszanak javaslatok"</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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Német billentyűzet"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angol (UK) billentyűzet"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angol (US) billentyűzet"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanyol billentyűzet"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francia billentyűzet"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francia (kanadai) billentyűzet"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francia (svájci) billentyűzet"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans hang"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Cseh hang"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Német hang"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Angol hang"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanyol hang"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francia hang"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Olasz hang"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japán hang"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreai hang"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Holland hang"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Kínai (jüe) hang"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Kínai (mandarin) hang"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu hang"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Használhatóság - tanulás mód"</string>
</resources>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 73b57c7bd..3322109c4 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Umum"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Koreksi teks"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Tampilkan saran koreksi"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Tampilkan kata yang disarankan ketika mengetik"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Selalu tampilkan"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Tampilkan pada mode potret"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Bilah spasi dan tanda baca secara otomatis dikoreksi pada kata yang salah ketik"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Hapus"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Setelan"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Spasi"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simbol"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Masukan Suara"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Simbol hidup"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Simbol mati"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift hidup"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift mati"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Masukan suara menggunakan pengenalan ucapan Google. "<a href="http://m.google.com/privacy">"Kebijakan Privasi Seluler"</a>" berlaku."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Untuk mematikan masukan suara, buka setelan metode masukan."</string>
+ <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 +89,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 +103,39 @@
<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">"Sentuh kata yang dimasukkan untuk memperbaikinya"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Sentuh kata yang dimasukkan untuk memperbaikinya, hanya saat saran dapat dilihat"</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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Keyboard Jerman"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Keyboard Inggris (Britania Raya)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Keyboard Inggris (AS)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Keyboard Spanyol"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Keyboard Prancis"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Keyboard Prancis (Kanada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Keyboard Prancis (Swiss)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Suara Bahasa Afrika"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Suara Bahasa Cheska"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Suara Bahasa Jerman"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Suara Bahasa Inggris"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Suara Bahasa Spanyol"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Suara Bahasa Prancis"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Suara Bahasa Italia"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Suara Bahasa Jepang"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Suara Bahasa Korea"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Suara Bahasa Belanda"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Suara Bahasa China, Yue"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Suara Bahasa China, Mandarin"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Suara Zulu"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mode Studi 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 3768dc230..337a04e07 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -26,68 +26,53 @@
<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 sui tasti"</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>
+ <string name="general_category" msgid="1859088467017573195">"Generali"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Correzione testo"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostra suggerimenti correzioni"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Visualizza le parole suggerite durante la digitazione"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostra sempre"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostra in modalità verticale"</string>
+ <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Nascondi sempre"</string>
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostra tasto impostaz."</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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Barra spaziatrice/punteggiatura correggono parole con errori"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Cancella"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Invio"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Impostazioni"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Maiuscolo"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Spazio"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simboli"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tabulazione"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Input vocale"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Simboli attivati"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Simboli disattivati"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Maiuscole attivate"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Maiuscole disattivate"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'input vocale utilizza il riconoscimento vocale di Google. Sono valide le "<a href="http://m.google.com/privacy">"norme sulla privacy di Google Mobile"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per disattivare l\'input vocale, vai alle impostazioni del metodo di input."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Per utilizzare l\'input vocale, premi il pulsante del 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 +89,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">"Non attivo"</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 +103,39 @@
<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>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocca per correggere"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tocca le parole inserite per correggerle"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tocca le parole inserite per correggerle, solo 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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tastiera ceca"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Tastiera danese"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tastiera tedesca"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastiera inglese (Regno Unito)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tastiera inglese (Stati Uniti)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Tastiera spagnola"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastiera francese"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastiera francese (Canada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastiera francese (Svizzera)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Tastiera italiana"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Tastiera norvegese"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Tastiera olandese"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Tastiera russa"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Tastiera serba"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Tastiera svedese"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voce afrikaans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voce ceca"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voce tedesca"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voce inglese"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voce spagnola"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voce francese"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voce italiana"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voce giapponese"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voce coreana"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voce olandese"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voce polacca"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voce portoghese"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voce russa"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voce turca"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voce cinese Yue"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voce cinese mandarino"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voce isiZulu"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modalità studio usabilità"</string>
</resources>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index abc5c397c..e71ab56c3 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"כללי"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"הצג הצעות לתיקונים"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"הצג הצעות למילים בעת הקלדה"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"הצג תמיד"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"הצג בפריסה לאורך"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"מחק"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"חזור"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"הגדרות"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"רווח"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"סמלים"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"כרטיסייה"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"קלט קולי"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"מצב סמלים פועל"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"מצב סמלים כבוי"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift פועל"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift כבוי"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"קלט קולי משתמש בזיהוי דיבור של Google.‏ "<a href="http://m.google.com/privacy">"מדיניות הפרטיות של \'Google לנייד\'"</a>" חלה במקרה זה."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"כדי לכבות את הקלט הקולי, עבור להגדרות שיטת קלט."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"מקלדת גרמנית "</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"מקלדת אנגלית (בריטניה)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"מקלדת אנגלית (ארה\"ב)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"מקלדת ספרדית"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"מקלדת צרפתית"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"מקלדת צרפתית (קנדה)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"מקלדת צרפתית (שוויץ)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Google Voice באפריקאנס"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice צ\'כי"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice גרמני"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Google Voice באנגלית"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Google Voice ספרדי"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Google Voice צרפתי"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"קול באיטלקית"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice יפני"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice קוריאני"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"קול בהולנדית"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Google Voice בסינית, יו"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Google Voice בסינית, מנדרינית"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Google Voice באיסיזולו"</string>
+ <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 f04790e88..5d82a453b 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"全般"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"修正候補を表示する"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"入力中に入力候補を表示する"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"常に表示"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"縦向きで表示"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"誤入力をスペースまたは句読点キーで修正する"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Del"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"設定"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Space"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"記号"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"音声入力"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"記号ON"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"記号OFF"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift ON"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift OFF"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"音声入力ではGoogleの音声認識技術を利用します。"<a href="http://m.google.com/privacy">"モバイルプライバシーポリシー"</a>"が適用されます。"</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"音声入力をOFFにするには、入力方法の設定を開きます。"</string>
+ <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 +89,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 +103,39 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"ユーザーフィードバックを有効にする"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。"</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"タップして語句を修正"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"入力した語句をタップして修正"</string>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"ドイツ語のキーボード"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英語(英国)のキーボード"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英語(米国)のキーボード"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"スペイン語のキーボード"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"フランス語のキーボード"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"フランス語(カナダ)のキーボード"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"フランス語(スイス)のキーボード"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"アフリカーンス語の音声"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"チェコ語の音声"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"ドイツ語の音声"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"英語の音声"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"スペイン語の音声"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"フランス語の音声"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"イタリア語の音声"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日本語の音声"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韓国語の音声"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"オランダ語の音声"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"中国語(広東語)の音声"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"中国語(標準語)の音声"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"ズールー語の音声"</string>
+ <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 1f966ceef..2cf0ec2aa 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"일반"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"수정 제안 표시"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"글자를 입력하는 동안 추천 단어 표시"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"항상 표시"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"세로 모드로 표시"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"삭제"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"리턴"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"설정"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"시프트"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"스페이스"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"기호"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"탭"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"음성 입력"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"기호 사용"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"기호 사용 안함"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"시프트 사용"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"시프트 사용 안함"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"음성 입력에서는 Google의 음성 인식 기능을 사용합니다. "<a href="http://m.google.com/privacy">"모바일 개인정보취급방침"</a>"이 적용됩니다."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"음성 입력을 사용하지 않으려면 입력 방법 설정으로 이동하세요."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"독일어 키보드"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"영어(영국) 키보드"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"영어(미국) 키보드"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"스페인어 키보드"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"프랑스어 키보드"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"프랑스어(캐나다) 키보드"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"프랑스어(스위스) 키보드"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"아프리칸스어 음성"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"체코어 음성"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"독일어 음성"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"영어 음성"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"스페인어 음성"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"프랑스어 음성"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"이탈리아어 음성"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"일본어 키보드"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"한국어 음성"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"네덜란드어 음성"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"중국어, 광둥어 음성"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"중국어, 북경어 음성"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"줄루어 음성"</string>
+ <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-el/donottranslate-altchars.xml b/java/res/values-lt/donottranslate-altchars.xml
index d3beafade..4aba93a3a 100644
--- a/java/res/values-el/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 3a8065525..3ff1543c6 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Bendra"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Teksto taisymas"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Rodyti taisymo pasiūlymus"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Įvedant tekstą pateikti siūlomų žodžių"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Visada rodyti"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Rodyti stačiuoju režimu"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Tarpo kl. ir skyr. ženkl. aut. išt. neteis. įv. ž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>
+ <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="description_delete_key" msgid="5586406298531883960">"Ištrinti"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Grįžti"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Nustatymai"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Keitimas"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Tarpas"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simboliai"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Skirtukas"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Balso įvestis"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Simboliai įjungti"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Simboliai išjungti"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Keitimas įjungtas"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Keitimas išjungtas"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balso įvesčiai naudojamas „Google“ kalbos atpažinimas. Taikoma "<a href="http://m.google.com/privacy">"privatumo politika mobiliesiems"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Jei norite išjungti balso įvestį, eikite į įvesties metodo nustatymus."</string>
+ <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 +89,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 +103,39 @@
<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štais. žodž., paliesk."</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Jei norite ištaisyti įvestus žodžius, palieskite juos"</string>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vokiška klaviatūra"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angliška (JK) klaviatūra"</string>
+ <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>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Prancūziška klaviatūra"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Prancūziška (Kanada) klaviatūra"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Prancūziška (Šveicarija) klaviatūra"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"„Voice“ afrikanų k."</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"„Voice“ čekų k."</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"„Voice“ vokiečių k."</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"„Voice“ anglų k."</string>
+ <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>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"„Voice“ italų k."</string>
+ <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>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"„Voice“ olandų k."</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"„Voice“ kinų (dziue) k."</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"„Voice“ kinų (mandarinų) k."</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"„Voice“ zulų k."</string>
+ <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..11e768fce 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Vispārīgi"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Teksta korekcija"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Rādīt labojumu ieteikumus"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Ievades laikā attēlot ieteiktos vārdus"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vienmēr rādīt"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Rādīt portreta režīmā"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Atstarpes taustiņš un interpunkcija; automātiska kļūdainu vārdu labošana"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Dzēšanas taustiņš"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Atgriešanās taustiņš"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Iestatījumu taustiņš"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Pārslēgšanas taustiņš"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Atstarpes taustiņš"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simbolu taustiņš"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tabulēšanas taustiņš"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Runas ievades taustiņš"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Simbolu režīms ir ieslēgts."</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Simbolu režīms ir izslēgts."</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Pārslēgšanas režīms ir ieslēgts."</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Pārslēgšanas režīms ir izslēgts."</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>
+ <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>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Lai izslēgtu balss ievadi, atveriet ievades metodes iestatījumus."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Lai izmantotu balss ievadi, nospiediet mikrofona taustiņu."</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 +89,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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pieskarties ievadītajiem vārdiem, lai tos labotu (tikai tad, ja tiek rādīti 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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vācu tastatūra"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angļu (Lielbritānija) tastatūra"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angļu (ASV) tastatūra"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spāņu tastatūra"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franču tastatūra"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franču (Kanāda) tastatūra"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franču (Šveices) tastatūra"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itāļu 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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Balss afrikandu valodā"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice čehu valodā"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice vācu valodā"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Balss angļu valodā"</string>
+ <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>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Itāļu balss"</string>
+ <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>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Holandiešu balss"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Balss ķīniešu val. (Kantonas dial.)"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Balss ķīniešu v. (mandarīnu dial.)"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Balss zulu valodā"</string>
+ <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 c7ccce895..db163b963 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Generelt"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Tekstkorrigering"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Vis rettingsforslag"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vis ordforslag under skriving"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vis alltid"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Vis i stående modus"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Mellomromstast og skilletegn retter automat. feilstavede ord"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Innstillinger"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Mellomrom"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboler"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Taleinndata"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symboler er slått på"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symboler er slått av"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift på"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift av"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Google Voice bruker Googles talegjenkjenning. "<a href="http://m.google.com/privacy">"Personvernreglene for mobil"</a>" gjelder."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Gå til innstillinger for inndatametode for å slå av stemmedata."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Trykk på mikrofonknappen for å aktivere stemmedata."</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 +89,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 +103,39 @@
<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>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Trykk for å endre ord"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Trykk på ord du har skrevet inn, for å endre dem"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Når forslag er synlige, kan du trykke på ord du har skrevet inn, for å endre dem"</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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjekkisk tastatur"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dansk tastatur"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tysk tastatur"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannia)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Sveits)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlandsk tastatur"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans tale"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjekkisk tale"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Tysk tale"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Engelsk tale"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spansk tale"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransk tale"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italiensk stemme"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japansk tale"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreansk tale"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Nederlandsk stemme"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polsk tale"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugisisk tale"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russisk tale"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Tyrkisk tale"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Kinesisk (yue) tale"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Kinesisk (mandarin) tale"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu tale"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Nyttighetsmodus"</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 2dc77c700..6dece4885 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Algemeen"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Tekstcorrectie"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Correctievoorstellen weergeven"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Voorgestelde woorden weergeven tijdens typen"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Altijd weergeven"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Weergeven in staande modus"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Met spatiebalk en interpunctie worden verkeerd gespelde woorden automatisch gecorrigeerd"</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">"Start"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Instellingen"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Spatie"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbolen"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Spraakinvoer"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symbolen aan"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symbolen uit"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift aan"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift uit"</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>
+ <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>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Als u spraakinvoer wilt uitschakelen, gaat u naar de instellingen voor invoermethoden."</string>
+ <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 +89,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 +103,39 @@
<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>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Raak aan om woorden te corrigeren"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Raak ingevoerde woorden aan om ze te corrigeren"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Ingevoerde woorden aanraken om ze te verbeteren, alleen mogelijk wanneer suggesties zichtbaar zijn"</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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjechisch toetsenbord"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Deens toetsenbord"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Duits toetsenbord"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engels toetsenbord (VK)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engels toetsenbord (VS)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spaans toetsenbord"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Frans toetsenbord"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Frans toetsenbord (Canada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Frans toetsenbord (Zwitserland)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiaans toetsenbord"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Noors toetsenbord"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlands toetsenbord"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisch toetsenbord"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Servisch toetsenbord"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Zweeds toetsenbord"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaanse stem"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjechische stem"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Duitse stem"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Engelse stem"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spaanse stem"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Franse stem"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italiaanse stem"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanse stem"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreaanse stem"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Nederlandse stem"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Poolse stem"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugese stem"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russische stem"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkse stem"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinese stem (Yue)"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinese stem (Mandarijn)"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu stem"</string>
+ <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 8fbb74e37..70c4b18df 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Ogólne"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Korekta tekstu"</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ą podświetlone słowo"</string>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokazuj propozycje poprawek"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Wyświetl proponowane słowa podczas wpisywania"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Zawsze pokazuj"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Pokaż w trybie pionowym"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Spacja i znaki przestankowe poprawiają błędnie wpisane słowa"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Ustawienia"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Spacja"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbole"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Wprowadzanie głosowe"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symbole włączone"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symbole wyłączone"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift włączony"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift wyłączony"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Funkcja wprowadzania głosowego wykorzystuje mechanizm rozpoznawania mowy. Obowiązuje "<a href="http://m.google.com/privacy">"Polityka prywatności Google Mobile"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Aby wyłączyć rozpoznawanie mowy, przejdź do ustawień sposobu wprowadzania tekstu."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Aby użyć 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 +89,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 sposób wprowadzania tekstu"</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 +103,39 @@
<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 wprowadzania tekstu, 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">"Dotykaj wprowadzonych słów, aby je poprawiać tylko wówczas, gdy widoczne 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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Klawiatura czeska"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Klawiatura duńska"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Klawiatura niemiecka"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klawiatura angielska (UK)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klawiatura angielska (USA)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klawiatura hiszpańska"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klawiatura francuska"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klawiatura francuska (Kanada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klawiatura francuska (Szwajcaria)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klawiatura włoska"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klawiatura norweska"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klawiatura holenderska"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klawiatura rosyjska"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klawiatura serbska"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klawiatura szwedzka"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Mowa afrikaans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Mowa czeska"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Mowa niemiecka"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Mowa angielska"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Mowa hiszpańska"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Mowa francuska"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Mowa włoska"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Mowa japońska"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Mowa koreańska"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Mowa holenderska"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Mowa polska"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Mowa portugalska"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Mowa rosyjska"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Mowa turecka"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Mowa chińska (kantoński)"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Mowa chińska (mandaryński)"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Mowa isiZulu"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Tryb badania przydatnoś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 7495b66ed..5845ebc59 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Geral"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Correcção de texto"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugestões de correcção"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Apresentar sugestões de palavras ao escrever"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar no modo de retrato"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Correcção automática de palavras mal escritas c/ barra de espaços e pontuação"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Definições"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Espaço"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbolos"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Entrada de voz"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Símbolos ativados"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Símbolos desativados"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift ativado"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift desativado"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz utiliza o reconhecimento de voz da Google. É aplicável a "<a href="http://m.google.com/privacy">"Política de privacidade do Google Mobile"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar a entrada de voz, aceda às definições do método de entrada."</string>
+ <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 +89,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 +103,39 @@
<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>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corrigir palavras"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tocar nas palavras introduzidas para as corrigir"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tocar nas palavras introduzidas para as corrigir, apenas quando as sugestões estiverem 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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado checo"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado dinamarquês"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado alemão"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglês (Reino Unido)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado inglês (EUA)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado espanhol"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francês"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francês (Canadá)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francês (Suíça)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado norueguês"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandês"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado russo"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado sérvio"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz em africânder"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz checa"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz alemã"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz em inglês"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz espanhola"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz francesa"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz japonesa"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz coreana"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz polaca"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz portuguesa"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz russa"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz turca"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz em yue, chinês"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz em mandarim, chinês"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz em isiZulu"</string>
+ <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..f1203c671 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Geral"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Correção de texto"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Exibir sugestões de correção"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Exibir sugestões de palavras durante a digitação"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar em modo retrato"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"A barra de espaço e a pontuação corrigem automaticamente palavras com erro de digitação"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Excluir"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Voltar"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Configurações"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Espaço"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbolos"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Entrada de texto por voz"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Símbolos ativados"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Símbolos desativados"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift ativado"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift desativado"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de texto por voz usa o reconhecimento de voz do Google. "<a href="http://m.google.com/privacy">"A política de privacidade para celulares"</a>" é aplicada."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desativar a entrada de texto por voz, vá para configurações do método de entrada."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para usar a entrada de texto por 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 +89,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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toque nas palavras digitadas para corrigi-las apenas quando as sugestões estiverem 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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado em tcheco"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado para dinamarquês"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado para alemão"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado para inglês (Reino Unido)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado para inglês (EUA)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado para espanhol"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado para francês"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado para francês (Canadá)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado para francês (Suíça)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado para italiano"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado para norueguês"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado para holandês"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado para russo"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado para sérvio"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado para sueco"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz em africâner"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz em tcheco"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz em alemão"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz em inglês"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz em espanhol"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz em francês"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz em japonês"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz em coreano"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz em polonês"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz em português"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz em russo"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz em turco"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz em chinês, cantonês"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz em chinês, mandarim"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz em zulu"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modo de estudo de utilização"</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..9c51cad72 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,58 @@
<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 />
+ <!-- no translation found for description_delete_key (5586406298531883960) -->
+ <skip />
+ <!-- no translation found for description_return_key (8750044000806461678) -->
+ <skip />
+ <!-- no translation found for description_settings_key (7484527796782969219) -->
+ <skip />
+ <!-- no translation found for description_shift_key (346906866277787836) -->
+ <skip />
+ <!-- no translation found for description_space_key (8512130111575878517) -->
+ <skip />
+ <!-- no translation found for description_switch_alpha_symbol_key (4537975384274405537) -->
+ <skip />
+ <!-- no translation found for description_tab_key (828186583738307137) -->
+ <skip />
+ <!-- no translation found for description_voice_key (3057731675774652754) -->
+ <skip />
+ <!-- no translation found for description_symbols_on (2994366855822840559) -->
+ <skip />
+ <!-- no translation found for description_symbols_off (3209578267079515136) -->
+ <skip />
+ <!-- no translation found for description_shift_on (6983188949895971587) -->
+ <skip />
+ <!-- no translation found for description_shift_off (8553265474523069034) -->
+ <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 +119,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 +141,73 @@
<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_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 37fdeb4cb..0a80911ce 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"General"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Corectare text"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Afişaţi sugestii de corectare"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Afişaţi sugestii de cuvinte în timpul introducerii textului"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Afişaţi întotdeauna"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afişaţi în modul Portret"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Corectare automată cuvinte prin bară spaţiu/semne punctuaţie"</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">"OK"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Ştergeţi"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Tasta Enter"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Setări"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Tasta Space"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simboluri"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tasta Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Intrare vocală"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Simbolurile sunt activate"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Simbolurile sunt dezactivate"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Tasta Shift este activată"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Tasta Shift este dezactivată"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Intrarea vocală utilizează funcţia Google de recunoaştere vocală. Se aplică "<a href="http://m.google.com/privacy">"Politica de confidenţialitate Google Mobil"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Pentru a dezactiva intrarea vocală, accesaţi setările metodei de intrare."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Pentru a utiliza intrarea vocală, 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 +89,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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Atingeţi cuvintele introduse pentru a le corecta, numai când pot fi văzute 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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tastatură germană"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastatură engleză (Marea Britanie)"</string>
+ <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>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastatură franceză"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastatură franceză (Canada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastatură franceză (Elveţia)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voce afrikaans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voce cehă"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voce germană"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voce engleză"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voce spaniolă"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voce franceză"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voce italiană"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voce japoneză"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voce coreeană"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voce olandeză"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voce chineză, yue"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voce chineză, mandarină"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voce isiZulu"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modul Studiu privind utilizarea"</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 0b70f0b34..6dab43cb9 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Общие"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Показать варианты исправлений"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Предлагать варианты слов во время ввода"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Всегда показывать"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показать вертикально"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"Клавиша удаления"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Клавиша \"Ввод\""</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Клавиша настроек"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Клавиша верхнего регистра"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Клавиша \"Пробел\""</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Клавиша символов"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Клавиша табуляции"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Клавиша голосового ввода"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Клавиши символов выключены"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Клавиши символов включены"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Верхний регистр включен"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Верхний регистр выключен"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовой ввод использует алгоритмы распознавания речи Google. Действует "<a href="http://m.google.com/privacy">"политика конфиденциальности для мобильных устройств"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Функция голосового ввода отключается в настройках способа ввода."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Клавиатура: немецкая"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Клавиатура: английская (Великобритания)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Клавиатура: английская (США)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Клавиатура: испанская"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Клавиатура: французская"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Клавиатура: французская"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Клавиатура: французская (Швейцария)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Голосовой ввод на африкаанс"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Голос: чешский"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Голос: немецкий"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Голосовой ввод на английском"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Голос: испанский"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Голос: французский"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Голосовой ввод на итальянском"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Голос: японский"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Голос: корейский"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Голосовой ввод на голландском"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Голосовой ввод на китайском (диалект юэ)"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Голосовой ввод на китайском (мандаринский диалект)"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Голосовой ввод на зулу"</string>
+ <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..e7a7cd194 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Všeobecné"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Oprava textu"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobraziť návrhy opráv"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Zobrazovať navrhované slová počas písania"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vždy zobrazovať"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Zobraziť v režime na výšku"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Stlačením medzerníka a interpunkcie sa aut. opravia chybné slová"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Nastavenia"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Medzera"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboly"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Hlasový vstup"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Symboly zapnuté"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Symboly vypnuté"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift zapnutý"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift vypnutý"</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>
+ <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>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ak chcete vypnúť hlasový vstup, prejdite na nastavenia metódy vstupu."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotykom zadaných 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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"klávesnica – nemčina"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"klávesnica – angličtina (br.)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"klávesnica – angličtina (am.)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"klávesnica – španielčina"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"klávesnica – francúzština"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"klávesnica – francúzština (Kanada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"klávesnica – francúzština (Švajč.)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Hlas – afrikánčina"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"hlas – čeština"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"hlas – nemčina"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Hlas – angličtina"</string>
+ <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>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"hlas – taliančina"</string>
+ <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>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"hlas – holandčina"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Hlas – čínština, kantónčina"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Hlas – čínština, mandarínska"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Hlas – Zulu"</string>
+ <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..6bb0b36c8 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Splošno"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Popravek besedila"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokaži predloge popravkov"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Pokaži predlagane besede med tipkanjem"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vedno pokaži"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Pokaži v pokončnem načinu"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Preslednica in ločila samodejno popravijo napačno vtipkane besede"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Izbriši"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Vračalka"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Nastavitve"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Dvigalka"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Preslednica"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Znaki"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tabulatorka"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Glasovni vnos"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Znaki vklopljeni"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Znaki izklopljeni"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Dvigalka vklopljena"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Dvigalka izklopljena"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni vnos uporablja Googlovo prepoznavanje govora. Zanj velja "<a href="http://m.google.com/privacy">"pravilnik o zasebnosti za mobilne naprave"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Glasovni vnos izklopite v nastavitvah načina vnosa."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Če želite uporabljati glasovni vnos, pritisnite gumb z mikrofonom."</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 +89,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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotaknite se vnesenih besed in 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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Nemška tipkovnica"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tipkovnica za britansko angleščino"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tipkovnica za ameriško angleščino"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španska tipkovnica"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francoska tipkovnica"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tipkovnica za kanadsko francoščino"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tipkovnica za švicarsko francoščino"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Govor v afrikanščini"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Govor v češčini"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Govor v nemščini"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Govor v angleščini"</string>
+ <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>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Govor v italijanščini"</string>
+ <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>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Govor v nizozemščini"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Govor v kitajščini, jue"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Govor v kitajščini, mandarinščini"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Govor v zulujščini"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Način za preučevanje uporabnosti"</string>
</resources>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index 7b00501a5..02e7593ca 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Опште"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Прикажи предлоге за исправку"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Приказивање предложених речи током уноса текста"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Увек прикажи"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Прикажи у усправном режиму"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Подешавања"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Размак"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Симболи"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Гласовни унос"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Симболи су укључени"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Симболи су искључени"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift је укључен"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift је искључен"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовни унос користи Google-ову функцију за препознавање гласа. Примењује се "<a href="http://m.google.com/privacy">"политика приватности за мобилне уређаје"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Да бисте искључили гласовни унос, идите на подешавања за начин уноса."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Језик тастатуре: немачки"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Језик тастатуре: енглески (УК)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Језик тастатуре: енглески (САД)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Језик тастатуре: шпански"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Језик тастатуре: француски"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Језик тастатуре: француски (Канада)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Језик тастатуре: француски (Швајц.)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Глас на африкансу"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Глас на чешком"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Глас на немачком"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Глас на енглеском"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Глас на шпанском"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Глас на француском"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Глас на италијанском"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Глас на јапанском"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Глас на корејском"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Глас на холандском"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Глас на јуе кинеском"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Глас на мандаринском кинеском"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Глас на језику исизулу"</string>
+ <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 c736418f3..eaf350583 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Allmänt"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Textkorrigering"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Visa rättningsförslag"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Visar ordförslag när du skriver"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Visa alltid"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Visa stående"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Blanksteg/skiljetecken rättar felstavning"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Ta bort"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Retur"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Inställningar"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Skift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Blanksteg"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboler"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tabb"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Röstinmatning"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Aktivera symboler"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Inaktivera symboler"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Aktivera Skift"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Inaktivera Skift"</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>
+ <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>
+ <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>
+ <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 +89,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 +103,39 @@
<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>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryck om du vill korrigera ord"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tryck på skrivna ord om du vill korrigera dem"</string>
+ <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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tjeckiskt tangentbord"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danskt tangentbord"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tyskt tangentbord"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelskt tangentbord (Storbrit.)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelskt tangentbord (USA)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanskt tangentbord"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franskt tangentbord"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franskt tangentbord (Kanada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franskt tangentbord (Schweiz)"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienskt tangentbord"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norskt tangentbord"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holländskt tangentbord"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ryskt tangentbord"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbiskt tangentbord"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svenskt tangentbord"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Röst, afrikaans"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Röst på tjeckiska"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Röst på tyska"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Röst, engelska"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Röst på spanska"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Röst på franska"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Röst på italienska"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Röst på japanska"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Röst på koreanska"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Röst på holländska"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Röst på polska"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Röst på portugisiska"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Röst på ryska"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Röst på turkiska"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Röst, kinesiska, yue"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Röst, kinesiska, mandarin"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Röst, isiZulusk"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Läge för användbarhetsstudie"</string>
</resources>
diff --git a/java/res/values-sw600dp-land/dimens.xml b/java/res/values-sw600dp-land/dimens.xml
new file mode 100644
index 000000000..618b7f44c
--- /dev/null
+++ b/java/res/values-sw600dp-land/dimens.xml
@@ -0,0 +1,39 @@
+<?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>
+ <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+ <dimen name="keyboardHeight">45.0mm</dimen>
+ <!-- key_height + key_bottom_gap = popup_key_height -->
+ <!-- <dimen name="key_height">14.5mm</dimen> -->
+ <dimen name="key_bottom_gap">1.3mm</dimen>
+ <dimen name="key_horizontal_gap">1.3mm</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">25dip</dimen>
+ <dimen name="key_label_text_size">18dip</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-sw600dp/config.xml b/java/res/values-sw600dp/config.xml
new file mode 100644
index 000000000..c3d34456e
--- /dev/null
+++ b/java/res/values-sw600dp/config.xml
@@ -0,0 +1,45 @@
+<?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>
+ <bool name="config_enable_show_settings_key_option">true</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_default_sound_enabled">true</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-sw600dp/dimens.xml b/java/res/values-sw600dp/dimens.xml
new file mode 100644
index 000000000..27d577c7d
--- /dev/null
+++ b/java/res/values-sw600dp/dimens.xml
@@ -0,0 +1,51 @@
+<?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>
+ <!-- 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">1.0mm</dimen>
+ <dimen name="key_horizontal_gap">1.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">24dip</dimen>
+ <dimen name="key_label_text_size">14dip</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-sw600dp/donottranslate.xml b/java/res/values-sw600dp/donottranslate.xml
new file mode 100644
index 000000000..6d94c2811
--- /dev/null
+++ b/java/res/values-sw600dp/donottranslate.xml
@@ -0,0 +1,23 @@
+<?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">
+ <!-- Default value of the visibility of the suggestion strip -->
+ <string name="prefs_suggestion_visibility_default_value" translatable="false">1</string>
+</resources>
diff --git a/java/res/values-sw768dp-land/dimens.xml b/java/res/values-sw768dp-land/dimens.xml
new file mode 100644
index 000000000..c40671082
--- /dev/null
+++ b/java/res/values-sw768dp-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">1.6mm</dimen>
+ <dimen name="key_horizontal_gap">1.6mm</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-sw768dp/config.xml b/java/res/values-sw768dp/config.xml
new file mode 100644
index 000000000..f075b1b50
--- /dev/null
+++ b/java/res/values-sw768dp/config.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.
+*/
+-->
+
+<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_default_sound_enabled">true</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-sw768dp/dimens.xml b/java/res/values-sw768dp/dimens.xml
new file mode 100644
index 000000000..9ea5258df
--- /dev/null
+++ b/java/res/values-sw768dp/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">1.1mm</dimen>
+ <dimen name="key_horizontal_gap">1.1mm</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-sw768dp/donottranslate.xml
index c165b11c5..672dea589 100644
--- a/java/res/values-zh-rCN/donottranslate-altchars.xml
+++ b/java/res/values-sw768dp/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-th/strings.xml b/java/res/values-th/strings.xml
index 0812a894d..6dc813b74 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"ทั่วไป"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"แสดงคำแนะนำการแก้ไข"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"แสดงคำที่แนะนำขณะพิมพ์"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"แสดงทุกครั้ง"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"แสดงในโหมดแนวตั้ง"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"ลบ"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"การตั้งค่า"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Space"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"สัญลักษณ์"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"ป้อนข้อมูลด้วยเสียง"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"สัญลักษณ์เปิดอยู่"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"สัญลักษณ์ปิดอยู่"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift เปิดอยู่"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift ปิดอยู่"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ป้อนข้อมูลด้วยเสียงใช้การจดจำคำพูดของ Google "<a href="http://m.google.com/privacy">" นโยบายส่วนบุคคลของมือถือ"</a>"มีผลบังคับใช้"</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"หากต้องการปิดการป้อนข้อมูลด้วยเสียง ไปที่การตั้งค่าวิธีการป้อนข้อมูล"</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"แป้นพิมพ์ภาษาเยอรมัน"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"แป้นพิมพ์ภาษาอังกฤษ (สหราชอาณาจักร)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"แป้นพิมพ์ภาษาอังกฤษ (สหรัฐอเมริกา)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"แปันพิมพ์ภาษาสเปน"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"แป้นพิมพ์ภาษาฝรั่งเศส"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"แป้นพิมพ์ภาษาฝรั่งเศส (แคนาดา)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"แป้นพิมพ์ภาษาฝรั่งเศส (สวิตเซอร์แลนด์)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"เสียงภาษาแอฟริกัน"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"เสียงภาษาเช็ก"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"เสียงภาษาเยอรมัน"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"เสียงภาษาอังกฤษ"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"เสียงภาษาสเปน"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"เสียงภาษาฝรั่งเศส"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"เสียงภาษาอิตาลี"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"เสียงภาษาญี่ปุ่น"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"เสียงภาษาเกาหลี"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"เสียงภาษาดัตช์"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"เสียงภาษาจีนกวางตุ้ง"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"เสียงภาษาจีนกลาง"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"เสียงภาษาซูลู"</string>
+ <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 d2c25d871..bdd700b67 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Pangkalahatan"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Pagwawasto ng teksto"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Magpakita ng mga suhestiyon ng pagwawasto"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Ipakita ang mga iminumungkahing salita habang nagta-type"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Palaging ipakita"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Ipakita sa portrait mode"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Awto tinatama ng spacebar at bantas ang maling na-type"</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">"Punta"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Tanggalin"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Bumalik"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Mga Setting"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Puwang"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Mga Simbolo"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Input ng Boses"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Naka-on ang mga simbolo"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Naka-off ang mga simbolo"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Naka-on ang shift"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Naka-off ang shift"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Gumagamit ang pag-input ng boses ng speech recognition ng Google. Nalalapat "<a href="http://m.google.com/privacy">"Ang Patakaran sa Privacy ng Mobile"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Upang i-off ang pag-input ng boses, pumunta sa mga setting ng pamamaraan ng pag-input."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Upang gamitin ang pag-input ng boses, pindutin ang pindutan na mikropono."</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 +89,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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pindutin ang mga inilagay na salita upang iwasto ang mga ito, kapag nakikita 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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German na Keyboard"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Ingles (UK) na Keyboard"</string>
+ <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>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French na Keyboard"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) na Keyboard"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) na Keyboard"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans na Boses"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech na Boses"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German na Boses"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Ingles na Boses"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanish na Boses"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"French na Boses"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italian na Boses"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese na Boses"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean na Boses"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Dutch na Boses"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinese, Yue na Boses"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinese, Mandarin na Boses"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu na Boses"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Usability Study Mode"</string>
</resources>
diff --git a/java/res/values-tr/donottranslate-altchars.xml b/java/res/values-tr/donottranslate-altchars.xml
index fb2419c1e..1b83b65c8 100644
--- a/java/res/values-tr/donottranslate-altchars.xml
+++ b/java/res/values-tr/donottranslate-altchars.xml
@@ -19,13 +19,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_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 9248ac4fd..a88b50960 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Genel"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Metin düzeltme"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Düzeltme önerilerini göster"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Yazarken, önerilen kelimeleri görüntüle"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Her zaman göster"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Dikey modda göster"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Boşluk çbğ ve nokt işr yanlış yazılan kelimeleri oto düzeltir"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Sil"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Ayarlar"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Üst Karakter"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Boşluk"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simgeler"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Sekme"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Ses Girişi"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Simgeler açık"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Simgeler kapalı"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Üst Karakter açık"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Üst Karakter kapalı"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ses girişi Google\'ın konuşma tanıma işlevini kullanır. "<a href="http://m.google.com/privacy">" Mobil Gizlilik Politikası"</a>" geçerlidir."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ses girişini kapatmak için giriş yöntemi ayarlarına gidin."</string>
+ <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 +89,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 grş devre 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 +103,39 @@
<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>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Kelimeleri düzeltmek için dokunun"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Düzeltmek için, girilen kelimelere dokunun"</string>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Yalnızca öneriler görünür olduğunda, düzeltmek için girilen kelimelere dokunun"</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>
+ <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Çekçe Klavye"</string>
+ <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danca Klavye"</string>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Almanca Klavye"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"İngilizce (İngiltere) Klavye"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"İngilizce (ABD) Klavye"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"İspanyolca Klavye"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransızca Klavye"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransızca (Kanada) Klavye"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransızca (İsviçre) Klavye"</string>
+ <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"İtalyanca Klavye"</string>
+ <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveççe Klavye"</string>
+ <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Felemenkçe Klavye"</string>
+ <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Rusça Klavye"</string>
+ <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Sırpça Klavye"</string>
+ <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"İsveççe Klavye"</string>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikanca Ses"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Çekçe Ses"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Almanca Ses"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"İngilizce Ses"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"İspanyolca Ses"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransızca Ses"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"İtalyanca Ses"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japonca Ses"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korece Ses"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Felemenkçe Ses"</string>
+ <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Lehçe Ses"</string>
+ <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portekizce Ses"</string>
+ <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Rusça Ses"</string>
+ <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Türkçe Ses"</string>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Çince, Yue Ses"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Çince, Mandarin Ses"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Zuluca Ses"</string>
+ <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Kullanılabilirlik Çalışması Modu"</string>
</resources>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 8788021be..5010ee9b5 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Загальні"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Показувати пропозиції виправлень"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Відображати пропоновані слова під час вводу"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Завжди показувати"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показувати в книжковому режимі"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"Клавіша Delete"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Клавіша Return"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Клавіша Settings"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Клавіша Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Клавіша Space"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Клавіша Symbols"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Клавіша Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Клавіша Voice Input"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Символи ввімкнено"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Символи вимкнено"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift увімкнено"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift вимкнено"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовий ввід використовує розпізнавання мовлення Google. Застосовується "<a href="http://m.google.com/privacy">"Політика конфіденційності для мобільних пристроїв"</a>"."</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Щоб вимкнути голосовий ввід, перейдіть до налаштувань методів введення."</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Німецька розкладка"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Англ. розкладка (Великобританія)"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Англійська розкладка (США)"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Іспанська розкладка"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Французька розкладка"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Французька розкладка (Канада)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Французька розкладка (Швейцарія)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voice мовою африкаанс"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Голос чеською"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Голос німецькою"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voice англійською мовою"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Голос іспанською"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Голос французькою"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voice італійською мовою"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Голос японською"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Голос корейською"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voice голландською мовою"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voice китайською, юеською мовою"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voice китайською, мандарин. мовою"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voice мовою ісізулу"</string>
+ <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..8dac2f922 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"Chung"</string>
+ <string name="prediction_category" msgid="6361242011806282176">"Sửa văn bản"</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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"Hiển thị gợi ý sửa"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Hiển thị từ được đề xuất khi nhập"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Luôn hiển thị"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Hiển thị trên chế độ khổ đứng"</string>
+ <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>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"Phím cách và dấu câu tự động sửa từ nhập sai"</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>
+ <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="description_delete_key" msgid="5586406298531883960">"Xóa"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"Quay lại"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"Cài đặt"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"Dấu cách"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Biểu tượng"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"Nhập liệu bằng giọng nói"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"Bật biểu tượng"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"Tắt biểu tượng"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Bật Shift"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Tắt Shift"</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>
+ <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. Áp dụng "<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>"."</string>
+ <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 pháp nhập liệu."</string>
+ <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Để sử dụng nhập liệu bằng giọng nói, hãy nhấn 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 +89,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 +103,39 @@
<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>
+ <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Chạm các từ đã nhập để sửa, chỉ khi các đề xuất 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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Bàn phím tiếng Đức"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Bàn phím tiếng Anh (Anh)"</string>
+ <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>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Bàn phím tiếng Pháp"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Bàn phím tiếng Pháp (Canada)"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Bàn phím tiếng Pháp (Thụy Sĩ)"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Giọng tiếng Hà Lan ở Nam Phi"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Giọng nói tiếng Séc"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Giọng nói tiếng Đức"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Giọng tiếng Anh"</string>
+ <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>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Giọng nói tiếng Ý"</string>
+ <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>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Giọng nói tiếng Hà Lan"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Giọng tiếng Trung, Yue"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Giọng tiếng Trung, tiếng Quan thoại"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Giọng isiZulu"</string>
+ <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-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 9e8df7562..9d7689153 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"常规"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"显示更正建议"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"键入时显示建议的字词"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"始终显示"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"以纵向模式显示"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"删除"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"回车"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"设置"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"空格"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"符号"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"语音输入"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"符号模式已打开"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"符号模式已关闭"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"Shift 模式已打开"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"Shift 模式已关闭"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"语音输入采用了 Google 的语音识别技术,因此请遵守"<a href="http://m.google.com/privacy">"“Google 移动”隐私权政策"</a>"。"</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"要关闭语音输入功能,请转至输入法设置。"</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"德语键盘"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英语(英国)键盘"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英语(美国)键盘"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙语键盘"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法语键盘"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法语(加拿大)键盘"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法语(瑞士)键盘"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"南非荷兰语语音"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"捷克语语音"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"德语语音"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"英语语音"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"西班牙语语音"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"法语语音"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"意大利语语音"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日语语音"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韩语语音"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"荷兰语语音"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"中文,粤语语音"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"中文,普通话语音"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"祖鲁语语音"</string>
+ <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 dd5996d25..9ba728461 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -26,68 +26,53 @@
<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>
+ <string name="general_category" msgid="1859088467017573195">"一般設定"</string>
+ <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>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"顯示修正建議"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"輸入時顯示建議字詞"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"一律顯示"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"以垂直模式顯示"</string>
+ <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>
+ <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>
+ <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="description_delete_key" msgid="5586406298531883960">"刪除"</string>
+ <string name="description_return_key" msgid="8750044000806461678">"返回"</string>
+ <string name="description_settings_key" msgid="7484527796782969219">"設定"</string>
+ <string name="description_shift_key" msgid="346906866277787836">"Shift 鍵"</string>
+ <string name="description_space_key" msgid="8512130111575878517">"空白鍵"</string>
+ <string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"符號"</string>
+ <string name="description_tab_key" msgid="828186583738307137">"Tab 鍵"</string>
+ <string name="description_voice_key" msgid="3057731675774652754">"語音輸入"</string>
+ <string name="description_symbols_on" msgid="2994366855822840559">"開啟符號"</string>
+ <string name="description_symbols_off" msgid="3209578267079515136">"關閉符號"</string>
+ <string name="description_shift_on" msgid="6983188949895971587">"開啟位移"</string>
+ <string name="description_shift_off" msgid="8553265474523069034">"關閉位移"</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>
+ <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"語音輸入使用 Google 的語音辨識功能,並遵循《"<a href="http://m.google.com/privacy">"行動服務隱私權政策"</a>"》。"</string>
+ <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"如要關閉語音輸入,請前往輸入方式設定。"</string>
+ <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 +89,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 +103,39 @@
<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>
+ <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>
+ <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"德文鍵盤"</string>
+ <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英文 (英國) 鍵盤"</string>
+ <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英文 (美國) 鍵盤"</string>
+ <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙文鍵盤"</string>
+ <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法文鍵盤"</string>
+ <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法文 (加拿大) 鍵盤"</string>
+ <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法文 (瑞士) 鍵盤"</string>
+ <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>
+ <string name="subtype_mode_af_voice" msgid="7542487489657902699">"南非荷蘭文語音"</string>
+ <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"捷克文語音"</string>
+ <string name="subtype_mode_de_voice" msgid="8378803143958089866">"德文語音"</string>
+ <string name="subtype_mode_en_voice" msgid="6643420989651848728">"英文語音"</string>
+ <string name="subtype_mode_es_voice" msgid="1323473601346507487">"西班牙文語音"</string>
+ <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"法文語音"</string>
+ <string name="subtype_mode_it_voice" msgid="5077373057157441323">"義大利文語音"</string>
+ <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日文語音"</string>
+ <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韓文語音"</string>
+ <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"荷蘭文語音"</string>
+ <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>
+ <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"中文 (粵語) 語音"</string>
+ <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"中文 (華語) 語音"</string>
+ <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"祖魯文語音"</string>
+ <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..a015d6b71 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,153 @@
<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="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.
+ If the value is zero, the actual key width will be determined to fill out the area up
+ to the right edge of the keyboard.
+ If the value is negative, the actual key width will be determined to fill out the
+ area between the nearest key on the left hand side and the right edge of the keyboard.
+ -->
+ <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" />
+ <!-- The key is enabled and responds on press. -->
+ <attr name="enabled" format="boolean" />
+ <!-- The X-coordinate of upper right corner of this key including horizontal gap.
+ If the value is negative, the origin is the right edge of the keyboard. -->
+ <attr name="keyXPos" format="dimension|fraction" />
+ </declare-styleable>
- <attr name="symbolColorScheme">
- <flag name="white" value="0" />
- <flag name="black" value="1" />
+ <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="phone" value="4" />
+ <enum name="number" value="5" />
+ </attr>
+ <attr name="webInput" format="boolean" />
+ <attr name="passwordInput" format="boolean" />
+ <attr name="hasSettingsKey" format="boolean" />
+ <!-- This should be aligned with KeyboardID.F2KEY_MODE_* -->
+ <attr name="f2KeyMode" format="enum">
+ <enum name="none" value="0" />
+ <enum name="settings" value="1" />
+ <enum name="shortcutIme" value="2" />
+ <enum name="shortcutImeOrSettings" value="3" />
+ </attr>
+ <attr name="clobberSettingsKey" format="boolean" />
+ <attr name="voiceKeyEnabled" format="boolean" />
+ <attr name="hasVoiceKey" format="boolean" />
+ <attr name="imeAction">
+ <!-- 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>
+ <attr name="languageCode" format="string" />
+ <attr name="countryCode" format="string" />
+ </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..889d8f784 100644
--- a/java/res/values/bools.xml
+++ b/java/res/values/bools.xml
@@ -18,16 +18,7 @@
*/
-->
<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/colors.xml b/java/res/values/colors.xml
index 0161589a4..741171f88 100644
--- a/java/res/values/colors.xml
+++ b/java/res/values/colors.xml
@@ -25,7 +25,6 @@
<color name="latinkeyboard_bar_language_shadow_white">#80000000</color>
<color name="latinkeyboard_bar_language_shadow_black">#80FFFFFF</color>
<color name="latinkeyboard_bar_language_text">#FFC0C0C0</color>
- <color name="latinkeyboard_extension_background">#A0000000</color>
<color name="latinkeyboard_feedback_language_text">#FFFFFFFF</color>
<color name="latinkeyboard_key_color_white">#FFFFFFFF</color>
<color name="latinkeyboard_key_color_black">#FF000000</color>
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index edb6cd845..7c100c367 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -19,14 +19,58 @@
-->
<resources>
+ <bool name="config_swipeDisambiguation">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_default_recorrection_enabled">true</bool>
+ <bool name="config_default_sound_enabled">false</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>
<integer name="config_preview_fadeout_anim_time">70</integer>
- <integer name="config_mini_keyboard_fadein_anim_time">0</integer>
- <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>
+ <integer name="config_double_spaces_turn_into_period_timeout">1100</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">5</integer>
+ <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..d28b9232b 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -19,32 +19,44 @@
-->
<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="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..e77957578 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_currency_dollar">¢,£,€,¥,₱</string>
+ <string name="alternates_for_currency_euro">¢,£,$,¥,₱</string>
+ <string name="alternates_for_currency_pound">¢,$,€,¥,₱</string>
+ <string name="alternates_for_smiley">":-)|:-) ,:-(|:-( ,;-)|;-) ,:-P|:-P ,=-O|=-O ,:-*|:-* ,:O|:O ,B-)|B-) ,:-$|:-$ ,:-!|:-! ,:-[|:-[ ,O:-)|O:-) ,:-\\\\\\\\|:-\\\\\\\\ ,:\'(|:\'( ,:-D|:-D "</string>
+ <string name="alternates_for_punctuation">"\\,,\?,!,:,-,\',\",(,),/,;,+,&amp;,\@"</string>
+ <string name="alternates_for_web_tab_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..d6f9bfc28 100644
--- a/java/res/values/keycodes.xml
+++ b/java/res/values/keycodes.xml
@@ -19,14 +19,33 @@
-->
<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>
+
+ <!-- Array used for mapping key codes to description strings. -->
+ <array name="key_descriptions">
+ <item>@integer/key_tab</item>
+ <item>@string/description_tab_key</item>
+ <item>@integer/key_return</item>
+ <item>@string/description_return_key</item>
+ <item>@integer/key_space</item>
+ <item>@string/description_space_key</item>
+ <item>@integer/key_shift</item>
+ <item>@string/description_shift_key</item>
+ <item>@integer/key_switch_alpha_symbol</item>
+ <item>@string/description_switch_alpha_symbol_key</item>
+ <item>@integer/key_delete</item>
+ <item>@string/description_delete_key</item>
+ <item>@integer/key_settings</item>
+ <item>@string/description_settings_key</item>
+ <item>@integer/key_voice</item>
+ <item>@string/description_voice_key</item>
+ </array>
</resources>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 6644d2224..ac14a2082 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,63 @@
<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>
+
+ <!-- Spoken text description for delete key. -->
+ <string name="description_delete_key">Delete</string>
+ <!-- Spoken text description for return key. -->
+ <string name="description_return_key">Return</string>
+ <!-- Spoken text description for settings key. -->
+ <string name="description_settings_key">Settings</string>
+ <!-- Spoken text description for shift key. -->
+ <string name="description_shift_key">Shift</string>
+ <!-- Spoken text description for space key. -->
+ <string name="description_space_key">Space</string>
+ <!-- Spoken text description for symbols key. -->
+ <string name="description_switch_alpha_symbol_key">Symbols</string>
+ <!-- Spoken text description for tab key. -->
+ <string name="description_tab_key">Tab</string>
+ <!-- Spoken text description for voice input key. -->
+ <string name="description_voice_key">Voice Input</string>
+ <!-- Spoken text description for symbols mode on. -->
+ <string name="description_symbols_on">Symbols on</string>
+ <!-- Spoken text description for symbols mode off. -->
+ <string name="description_symbols_off">Symbols off</string>
+ <!-- Spoken text description for shift mode on. -->
+ <string name="description_shift_on">Shift on</string>
+ <!-- Spoken text description for shift mode off. -->
+ <string name="description_shift_off">Shift off</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 +164,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 +181,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 +199,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 +232,79 @@
<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 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/values/whitelist.xml b/java/res/values/whitelist.xml
new file mode 100644
index 000000000..ced52e70e
--- /dev/null
+++ b/java/res/values/whitelist.xml
@@ -0,0 +1,38 @@
+<?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">
+ <!--
+ An entry of the whitelist word should be:
+ 1. (int)frequency
+ 2. (String)before
+ 3. (String)after
+ -->
+ <string-array name="wordlist_whitelist">
+
+ <item>255</item>
+ <item>ill</item>
+ <item>I\'ll</item>
+
+ <item>255</item>
+ <item>thisd</item>
+ <item>this\'d</item>
+
+ </string-array>
+</resources>
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..6c2504e65 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:keyWidth="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:keyWidth="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:keyWidth="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-sw600dp-land/kbd_popup_template.xml b/java/res/xml-sw600dp-land/kbd_popup_template.xml
new file mode 100644
index 000000000..2c1d1902e
--- /dev/null
+++ b/java/res/xml-sw600dp-land/kbd_popup_template.xml
@@ -0,0 +1,27 @@
+<?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:keyWidth="5%p"
+ latin:horizontalGap="0px"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
+ >
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_azerty_rows.xml b/java/res/xml-sw600dp/kbd_azerty_rows.xml
new file mode 100644
index 000000000..e3a835387
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_azerty_rows.xml
@@ -0,0 +1,157 @@
+<?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.0%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a"
+ latin:keyEdgeFlags="left" />
+ <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:keyXPos="-10.0%p"
+ latin:keyWidth="-10.0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="9.0%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" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-14.6%p"
+ latin:keyWidth="-14.6%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.9%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="10.0%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="\'" />
+ <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>
+ <include
+ latin:keyboardLayout="@xml/kbd_row3_right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml
new file mode 100644
index 000000000..082c374e8
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_key_styles.xml
@@ -0,0 +1,211 @@
+<?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"
+>
+ <!-- Base key style for the functional key -->
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle"
+ latin:isModifier="true" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle" />
+ </case>
+ </switch>
+ <!-- Base key style for the key which may have settings key as popup key -->
+ <switch>
+ <case
+ latin:clobberSettingsKey="true"
+ >
+ <key-style
+ latin:styleName="settingsPopupStyle"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <default>
+ <key-style
+ latin:styleName="settingsPopupStyle"
+ latin:keyHintIcon="@drawable/hint_popup_holo"
+ latin:popupCharacters="\@drawable/sym_keyboard_settings_holo|\@integer/key_settings"
+ latin:parentStyle="functionalKeyStyle" />
+ </default>
+ </switch>
+ <!-- Functional key styles -->
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <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="micKeyStyle"
+ latin:code="@integer/key_voice"
+ latin:keyIcon="@drawable/sym_keyboard_voice_holo"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+ latin:parentStyle="settingsPopupStyle" />
+ <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" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <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="micKeyStyle"
+ latin:code="@integer/key_voice"
+ latin:keyIcon="@drawable/sym_bkeyboard_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+ latin:parentStyle="settingsPopupStyle" />
+ <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" />
+ </case>
+ </switch>
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_keyboard_tab_holo"
+ latin:iconPreview="@drawable/sym_keyboard_tab_holo"
+ 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" />
+ <switch>
+ <case
+ latin:passwordInput="true"
+ >
+ <key-style
+ latin:styleName="nonPasswordSymbolKeyStyle"
+ latin:enabled="false" />
+ </case>
+ <!-- latin:passwordInput="false" -->
+ <default>
+ <key-style
+ latin:styleName="nonPasswordSymbolKeyStyle"
+ latin:enabled="true" />
+ </default>
+ </switch>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_number.xml b/java/res/xml-sw600dp/kbd_number.xml
new file mode 100644
index 000000000..f0972b39c
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_number.xml
@@ -0,0 +1,192 @@
+<?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="16.75%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" />
+ <switch>
+ <case
+ latin:passwordInput="true"
+ >
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyStyle="num1KeyStyle"
+ latin:keyXPos="24.875%p" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-11.0%p"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="num4KeyStyle"
+ latin:keyXPos="24.875%p" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-11.0%p"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="num7KeyStyle"
+ latin:keyXPos="24.875%p" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyWidth="11.0%p"
+ latin:keyEdgeFlags="left" />
+ <Spacer
+ latin:keyXPos="24.875%p" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Spacer
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="0dp" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f2" />
+ </Row>
+ </case>
+ <!-- latin:passwordInput="false" -->
+ <default>
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyLabel="-"
+ latin:keyXPos="11.0%p"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyLabel="+"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyLabel="."
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyLabel="1"
+ latin:keyXPos="38.75%p" />
+ <Key
+ latin:keyLabel="2" />
+ <Key
+ latin:keyLabel="3" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="-11.00%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyLabel="*"
+ latin:keyXPos="11.0%p"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyLabel="/"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyLabel=","
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyLabel="4"
+ latin:keyXPos="38.75%p" />
+ <Key
+ latin:keyLabel="5" />
+ <Key
+ latin:keyLabel="6" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="-11.00%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <!-- There is an empty area below 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. -->
+ <Key
+ latin:keyLabel="("
+ latin:keyXPos="11.0%p"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyLabel=")"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyLabel="="
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyLabel="7"
+ latin:keyXPos="38.75%p" />
+ <Key
+ latin:keyLabel="8" />
+ <Key
+ latin:keyLabel="9" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyWidth="11.00%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyWidth="27.75%p" />
+ <Key
+ latin:keyLabel="*"
+ latin:keyXPos="38.75%p" />
+ <Key
+ latin:keyLabel="0" />
+ <Key
+ latin:keyLabel="#" />
+ <Spacer
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="0dp" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f2" />
+ </Row>
+ </default>
+ </switch>
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_numkey_styles.xml b/java/res/xml-sw600dp/kbd_numkey_styles.xml
new file mode 100644
index 000000000..b10dc9333
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_numkey_styles.xml
@@ -0,0 +1,150 @@
+<?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"
+>
+ <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: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-sw600dp/kbd_phone.xml b/java/res/xml-sw600dp/kbd_phone.xml
new file mode 100644
index 000000000..220c4b882
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_phone.xml
@@ -0,0 +1,130 @@
+<?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="16.75%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:code="45"
+ latin:keyLabel=" - "
+ latin:keyXPos="15.625%p"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:code="43"
+ latin:keyLabel=" + "
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyStyle="num1KeyStyle"
+ latin:keyXPos="38.867%p" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="-11.00%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:code="44"
+ latin:keyLabel=" , "
+ latin:keyXPos="15.625%p"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:code="46"
+ latin:keyLabel=" . "
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyStyle="num4KeyStyle"
+ latin:keyXPos="38.867%p" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="-11.00%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="11.00%p"
+ latin:keyEdgeFlags="left" />
+ <!-- There is an empty area below 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. -->
+ <Key
+ latin:code="40"
+ latin:keyLabel=" ( "
+ latin:keyXPos="15.625%p"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:code="41"
+ latin:keyLabel=" ) "
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyStyle="num7KeyStyle"
+ latin:keyXPos="38.867%p" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyWidth="11.00%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyXPos="15.625%p"
+ latin:keyWidth="18.67%p" />
+ <Key
+ latin:keyStyle="numStarKeyStyle"
+ latin:keyXPos="38.867%p" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Key
+ latin:keyStyle="numPoundKeyStyle" />
+ <Spacer
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="0dp" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f2" />
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_phone_symbols.xml b/java/res/xml-sw600dp/kbd_phone_symbols.xml
new file mode 100644
index 000000000..43c4f6d7f
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_phone_symbols.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.
+*/
+-->
+
+<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="16.75%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:code="45"
+ latin:keyLabel=" - "
+ latin:keyXPos="11.0%p"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:code="43"
+ latin:keyLabel=" + "
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:code="44"
+ latin:keyLabel="@string/label_pause_key"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyStyle="num1KeyStyle"
+ latin:keyXPos="38.867%p" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="-11.00%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:code="44"
+ latin:keyLabel=" , "
+ latin:keyXPos="11.0%p"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:code="46"
+ latin:keyLabel=" . "
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:code="59"
+ latin:keyLabel="@string/label_wait_key"
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyStyle="num4KeyStyle"
+ latin:keyXPos="38.867%p" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="-11.00%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="11.00%p"
+ latin:keyEdgeFlags="left" />
+ <!-- There is an empty area below 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. -->
+ <Key
+ latin:code="40"
+ latin:keyLabel=" ( "
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:code="41"
+ latin:keyLabel=" ) "
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:code="78"
+ latin:keyLabel=" N "
+ latin:keyWidth="9.25%p" />
+ <Key
+ latin:keyStyle="num7KeyStyle"
+ latin:keyXPos="38.867%p" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyWidth="11.00%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyWidth="27.75%p" />
+ <Key
+ latin:keyStyle="numStarKeyStyle"
+ latin:keyXPos="38.867%p" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Key
+ latin:keyStyle="numPoundKeyStyle" />
+ <Spacer
+ latin:keyXPos="-11.00%p"
+ latin:keyWidth="0dp" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f2" />
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_popup_template.xml b/java/res/xml-sw600dp/kbd_popup_template.xml
new file mode 100644
index 000000000..fff2659be
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_popup_template.xml
@@ -0,0 +1,27 @@
+<?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:keyWidth="8%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
+ >
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_qwerty.xml b/java/res/xml-sw600dp/kbd_qwerty.xml
new file mode 100644
index 000000000..9541e13fd
--- /dev/null
+++ b/java/res/xml-sw600dp/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_qwerty_rows" />
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_f2.xml b/java/res/xml-sw600dp/kbd_qwerty_f2.xml
new file mode 100644
index 000000000..e6c57f8f7
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty_f2.xml
@@ -0,0 +1,77 @@
+<?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"
+>
+ <switch>
+ <case
+ latin:f2KeyMode="settings"
+ >
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <case
+ latin:f2KeyMode="shortcutIme"
+ >
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <!-- voiceKeyEnabled="false" -->
+ <default>
+ <Spacer />
+ </default>
+ </switch>
+ </case>
+ <case
+ latin:f2KeyMode="shortcutImeOrSettings"
+ >
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <!-- voiceKeyEnabled="false" -->
+ <default>
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ <!-- f2KeyMode="none" -->
+ <default>
+ <Spacer />
+ </default>
+ </switch>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row1.xml b/java/res/xml-sw600dp/kbd_qwerty_row1.xml
new file mode 100644
index 000000000..1a6ed9728
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty_row1.xml
@@ -0,0 +1,65 @@
+<?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"
+>
+ <Row
+ latin:keyWidth="9.0%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <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:keyXPos="-10.0%p"
+ latin:keyWidth="-10.0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row2.xml b/java/res/xml-sw600dp/kbd_qwerty_row2.xml
new file mode 100644
index 000000000..1e6011cde
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty_row2.xml
@@ -0,0 +1,59 @@
+<?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"
+>
+ <Row
+ latin:keyWidth="9.0%p"
+ >
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a"
+ latin:keyXPos="4.5%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:keyStyle="returnKeyStyle"
+ latin:keyXPos="-14.6%p"
+ latin:keyWidth="-14.6%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row3.xml b/java/res/xml-sw600dp/kbd_qwerty_row3.xml
new file mode 100644
index 000000000..4118ee197
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty_row3.xml
@@ -0,0 +1,76 @@
+<?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"
+>
+ <Row
+ latin:keyWidth="8.9%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="10.0%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>
+ <include
+ latin:keyboardLayout="@xml/kbd_row3_right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row4.xml b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
new file mode 100644
index 000000000..6378ea414
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
@@ -0,0 +1,170 @@
+<?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"
+>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.9%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="13.0%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="tabKeyStyle" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle" />
+ </case>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle" />
+ </case>
+ <default>
+ <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:keyXPos="30.750%p"
+ latin:keyWidth="39.750%p" />
+ <switch>
+ <case
+ latin:languageCode="ru"
+ >
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="-"
+ latin:keyWidth="9.750%p" />
+ </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=":"
+ latin:keyWidth="9.750%p" />
+ </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="_"
+ latin:keyWidth="9.750%p" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="_"
+ latin:keyWidth="9.750%p" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="!"
+ latin:manualTemporaryUpperCaseCode="39"
+ latin:keyHintIcon="@drawable/key_hint_quote_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_quote_large_holo"
+ latin:popupCharacters="\'"
+ latin:keyWidth="9.750%p" />
+ </default>
+ </switch>
+ </case>
+ <!-- not languageCode="ru" -->
+ <default>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="-"
+ latin:keyWidth="9.750%p" />
+ </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=":"
+ latin:keyWidth="9.750%p" />
+ </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;"
+ latin:keyWidth="9.750%p" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="_"
+ latin:keyWidth="9.750%p" />
+ </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="_"
+ latin:keyWidth="9.750%p" />
+ </default>
+ </switch>
+ </default>
+ </switch>
+ <Spacer
+ latin:keyXPos="-10.00%p"
+ latin:keyWidth="0dp" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f2" />
+ </Row>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_rows.xml b/java/res/xml-sw600dp/kbd_qwerty_rows.xml
new file mode 100644
index 000000000..a2d26b3de
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty_rows.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.
+*/
+-->
+
+<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-sw600dp/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml
new file mode 100644
index 000000000..59e86c5c8
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml
@@ -0,0 +1,114 @@
+<?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="8.0%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyXPos="2.15%p"
+ latin:keyEdgeFlags="left" />
+ <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:keyXPos="-10.0%p"
+ latin:keyWidth="-10.0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.0%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" />
+ <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:keyXPos="-14.6%p"
+ latin:keyWidth="-14.6%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-sw600dp/kbd_qwertz_rows.xml b/java/res/xml-sw600dp/kbd_qwertz_rows.xml
new file mode 100644
index 000000000..5c2fbf2b9
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwertz_rows.xml
@@ -0,0 +1,123 @@
+<?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.0%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <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:keyXPos="-10.0%p"
+ latin:keyWidth="-10.0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <Row
+ latin:keyWidth="8.9%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="10.0%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>
+ <include
+ latin:keyboardLayout="@xml/kbd_row3_right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_row3_right.xml b/java/res/xml-sw600dp/kbd_row3_right.xml
new file mode 100644
index 000000000..7867e175a
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_row3_right.xml
@@ -0,0 +1,68 @@
+<?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"
+>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="\@"
+ latin:keyXPos="-8.9%p"
+ latin:keyWidth="-8.9%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyLabel="-"
+ latin:manualTemporaryUpperCaseCode="95"
+ latin:keyHintIcon="@drawable/key_hint_underline_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+ latin:popupCharacters="_"
+ latin:keyXPos="-8.9%p"
+ latin:keyWidth="-8.9%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <case
+ latin:imeAction="actionSearch"
+ >
+ <Key
+ latin:keyLabel=":"
+ latin:manualTemporaryUpperCaseCode="43"
+ latin:keyHintIcon="@drawable/key_hint_plus_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
+ latin:popupCharacters="+"
+ latin:keyXPos="-8.9%p"
+ latin:keyWidth="-8.9%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyXPos="-8.9%p"
+ latin:keyWidth="-8.9%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_ru_rows.xml b/java/res/xml-sw600dp/kbd_ru_rows.xml
new file mode 100644
index 000000000..fb820ccc1
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_ru_rows.xml
@@ -0,0 +1,130 @@
+<?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="8.0%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="й"
+ latin:keyXPos="2.15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="ц" />
+ <Key
+ latin:keyLabel="у" />
+ <Key
+ latin:keyLabel="к" />
+ <Key
+ latin:keyLabel="е"
+ latin:popupCharacters="@string/alternates_for_cyrillic_e" />
+ <Key
+ latin:keyLabel="н" />
+ <Key
+ latin:keyLabel="г" />
+ <Key
+ latin:keyLabel="ш" />
+ <Key
+ latin:keyLabel="щ" />
+ <Key
+ latin:keyLabel="з" />
+ <Key
+ latin:keyLabel="х" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-10.0%p"
+ latin:keyWidth="-10.0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.0%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:keyStyle="returnKeyStyle"
+ latin:keyXPos="-14.6%p"
+ latin:keyWidth="-14.6%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.0%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="10.0%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:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="44"
+ latin:keyHintIcon="@drawable/key_hint_comma_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_comma_large_holo"
+ latin:popupCharacters="," />
+ <include
+ latin:keyboardLayout="@xml/kbd_row3_right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_sr_rows.xml b/java/res/xml-sw600dp/kbd_sr_rows.xml
new file mode 100644
index 000000000..09dc2b719
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_sr_rows.xml
@@ -0,0 +1,146 @@
+<?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="8.0%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="љ"
+ latin:keyXPos="2.15%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:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-10.0%p"
+ latin:keyWidth="-10.0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.9%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:keyStyle="returnKeyStyle"
+ latin:keyXPos="-14.6%p"
+ latin:keyWidth="-14.6%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.5%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="8.0%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="ж" />
+ <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>
+ <include
+ latin:keyboardLayout="@xml/kbd_row3_right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_symbols.xml b/java/res/xml-sw600dp/kbd_symbols.xml
new file mode 100644
index 000000000..3f555aa85
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_symbols.xml
@@ -0,0 +1,225 @@
+<?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_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_currency_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="9.0%p"
+ >
+ <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:keyXPos="-10.0%p"
+ latin:keyWidth="-10.0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="9.0%p"
+ >
+ <Key
+ latin:keyLabel="#"
+ latin:keyXPos="4.5%p" />
+ <Key
+ latin:keyStyle="currencyKeyStyle" />
+ <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:keyXPos="-14.6%p"
+ latin:keyWidth="-14.6%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.9%p"
+ >
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="10.0%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="&lt;"
+ latin:popupCharacters="≤,«,‹" />
+ <Key
+ latin:keyLabel="&gt;"
+ latin:popupCharacters="≥,»,›" />
+ <Key
+ latin:keyLabel="="
+ latin:popupCharacters="≠,≈" />
+ <switch>
+ <case
+ latin:languageCode="ru"
+ >
+ <Key
+ latin:keyLabel=":" />
+ </case>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyLabel="\'"
+ latin:popupCharacters="‘,’,‚,‛" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=":" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel=";" />
+ <switch>
+ <case
+ latin:languageCode="ru"
+ >
+ <Key
+ latin:keyLabel="\'"
+ latin:popupCharacters="‘,’,‚,‛" />
+ <!-- Note: DroidSans doesn't have double-high-reversed-quotation
+ '\u201f' glyph. -->
+ <!-- latin:popupCharacters="“,”,„,‟,«,»" -->
+ <Key
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»" />
+ <Key
+ latin:keyLabel="." />
+ <Key
+ latin:keyLabel="," />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ <Key
+ latin:keyLabel="!"
+ latin:popupCharacters="¡" />
+ <Key
+ latin:keyLabel="\?"
+ latin:popupCharacters="¿" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel="/"
+ latin:keyWidth="0%p" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.9%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="13.0%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="tabKeyStyle" />
+ <Key
+ latin:keyLabel="\@" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyXPos="30.750%p"
+ latin:keyWidth="39.750%p" />
+ <switch>
+ <case
+ latin:languageCode="ru"
+ >
+ <Key
+ latin:keyLabel="_"
+ latin:keyWidth="9.750%p" />
+ <Key
+ latin:keyLabel="-"
+ latin:keyWidth="9.750%p" />
+ </case>
+ <default>
+ <!-- Note: DroidSans doesn't have double-high-reversed-quotation
+ '\u201f' glyph. -->
+ <!-- latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" -->
+ <Key
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»,‘,’,‚,‛"
+ latin:keyWidth="9.750%p" />
+ <Key
+ latin:keyLabel="_"
+ latin:keyWidth="9.750%p" />
+ </default>
+ </switch>
+ <Spacer
+ latin:keyXPos="-10.00%p"
+ latin:keyWidth="0dp" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f2" />
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_symbols_shift.xml b/java/res/xml-sw600dp/kbd_symbols_shift.xml
new file mode 100644
index 000000000..7ad7afc17
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_symbols_shift.xml
@@ -0,0 +1,163 @@
+<?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_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="9.0%p"
+ >
+ <Key
+ latin:keyLabel="~" />
+ <Key
+ latin:keyLabel="`" />
+ <Key
+ latin:keyLabel="|" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="•"
+ latin:popupCharacters="♪,♥,♠,♦,♣" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="√" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="π"
+ latin:popupCharacters="Π" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="÷" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="×" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="§"
+ latin:popupCharacters="¶" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="Δ" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-10.0%p"
+ latin:keyWidth="-10.0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="9.0%p"
+ >
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="£"
+ latin:keyXPos="4.5%p" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¢" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="€" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¥" />
+ <Key
+ latin:keyLabel="^"
+ latin:popupCharacters="↑,↓,←,→" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="°"
+ latin:popupCharacters="′,″" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="±"
+ latin:popupCharacters="∞" />
+ <Key
+ latin:keyLabel="{" />
+ <Key
+ latin:keyLabel="}" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-14.6%p"
+ latin:keyWidth="-14.6%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.9%p"
+ >
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="10.0%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="\\" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="©" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="®" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="™" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="℅" />
+ <Key
+ latin:keyLabel="[" />
+ <Key
+ latin:keyLabel="]" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¡" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¿" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.9%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="13.0%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="tabKeyStyle" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyXPos="30.750%p"
+ latin:keyWidth="39.750%p" />
+ <Spacer
+ latin:keyXPos="-10.00%p"
+ latin:keyWidth="0dp" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f2" />
+ </Row>
+</Keyboard>
diff --git a/java/res/xml/kbd_popup_narrow_template.xml b/java/res/xml-sw768dp-land/kbd_popup_template.xml
index 23c686e8b..3caae1a60 100644
--- a/java/res/xml/kbd_popup_narrow_template.xml
+++ b/java/res/xml-sw768dp-land/kbd_popup_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="3.5%p"
+ latin:horizontalGap="0px"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
>
</Keyboard>
diff --git a/java/res/xml-sw768dp/kbd_azerty_rows.xml b/java/res/xml-sw768dp/kbd_azerty_rows.xml
new file mode 100644
index 000000000..f6ebfe612
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_azerty_rows.xml
@@ -0,0 +1,172 @@
+<?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.282%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.969%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:keyXPos="-9.219%p"
+ latin:keyWidth="-9.219%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.125%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:keyXPos="-15.704%p"
+ latin:keyWidth="-15.704%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.047%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="13.829%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:keyXPos="-13.750%p"
+ latin:keyWidth="-13.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_key_styles.xml b/java/res/xml-sw768dp/kbd_key_styles.xml
new file mode 100644
index 000000000..fc06d00fc
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_key_styles.xml
@@ -0,0 +1,183 @@
+<?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" />
+ <switch>
+ <case
+ latin:passwordInput="true"
+ >
+ <key-style
+ latin:styleName="nonPasswordSymbolKeyStyle"
+ latin:enabled="false" />
+ </case>
+ <!-- latin:passwordInput="false" -->
+ <default>
+ <key-style
+ latin:styleName="nonPasswordSymbolKeyStyle"
+ latin:enabled="true" />
+ </default>
+ </switch>
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_number.xml b/java/res/xml-sw768dp/kbd_number.xml
new file mode 100644
index 000000000..8ffee3cfd
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_number.xml
@@ -0,0 +1,215 @@
+<?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="13.250%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" />
+ <switch>
+ <case
+ latin:passwordInput="true"
+ >
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.172%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="num1KeyStyle"
+ latin:keyXPos="32.076%p" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-11.172%p"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="num4KeyStyle"
+ latin:keyXPos="32.076%p" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-11.172%p"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="num7KeyStyle"
+ latin:keyXPos="32.076%p" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ <!-- There is an empty area below 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>
+ <Spacer
+ latin:keyXPos="32.076%p" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <!-- There is an empty area below 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>
+ </case>
+ <!-- latin:passwordInput="false" -->
+ <default>
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.172%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="-"
+ latin:keyXPos="13.829%p"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyLabel="+"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyLabel="."
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyLabel="1"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyLabel="2" />
+ <Key
+ latin:keyLabel="3" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-11.172%p"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyLabel="*"
+ latin:keyXPos="13.829%p"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyLabel="/"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyLabel=","
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyLabel="4"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyLabel="5" />
+ <Key
+ latin:keyLabel="6" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-11.172%p"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <!-- There is an empty area below 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. -->
+ <Key
+ latin:keyLabel="("
+ latin:keyXPos="13.829%p"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyLabel=")"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyLabel="="
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyLabel="7"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyLabel="8" />
+ <Key
+ latin:keyLabel="9" />
+ <!-- There is an empty area below 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>
+ <switch>
+ <case latin:hasSettingsKey="true">
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </case>
+ <default>
+ <Spacer
+ latin:keyWidth="8.047%p" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyXPos="13.829%p"
+ latin:keyWidth="24.14%p" />
+ <Key
+ latin:keyLabel="*"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyLabel="0" />
+ <Key
+ latin:keyLabel="#" />
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyXPos="-8.047%p"
+ latin:keyWidth="0%p" />
+ </case>
+ </switch>
+ </Row>
+ </default>
+ </switch>
+</Keyboard>
diff --git a/java/res/xml-sw768dp/kbd_numkey_styles.xml b/java/res/xml-sw768dp/kbd_numkey_styles.xml
new file mode 100644
index 000000000..e27db94c7
--- /dev/null
+++ b/java/res/xml-sw768dp/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-sw768dp/kbd_phone.xml b/java/res/xml-sw768dp/kbd_phone.xml
new file mode 100644
index 000000000..8fc5e7d68
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_phone.xml
@@ -0,0 +1,155 @@
+<?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="13.250%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:keyWidth="11.172%p"
+ latin:keyEdgeFlags="left" />
+ <!-- To match one character label size with "Tab", I placed spaces around the char '-'
+ and '+'. -->
+ <Key
+ latin:code="45"
+ latin:keyLabel=" - "
+ latin:keyXPos="20.4%p"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:code="43"
+ latin:keyLabel=" + "
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyStyle="num1KeyStyle"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-11.172%p"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="11.172%p"
+ latin:keyEdgeFlags="left" />
+ <!-- To match one character label size with "More", I placed spaces around the char ','
+ and '.'. -->
+ <Key
+ latin:code="44"
+ latin:keyLabel=" , "
+ latin:keyXPos="20.4%p"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:code="46"
+ latin:keyLabel=" . "
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyStyle="num4KeyStyle"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-11.172%p"
+ latin:keyWidth="0%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 below 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. -->
+ <Key
+ latin:code="40"
+ latin:keyLabel=" ( "
+ latin:keyXPos="20.4%p"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:code="41"
+ latin:keyLabel=" ) "
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyStyle="num7KeyStyle"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ <!-- There is an empty area below 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>
+ <switch>
+ <case latin:hasSettingsKey="true">
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </case>
+ <default>
+ <Spacer
+ latin:keyWidth="8.047%p" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyXPos="20.4%p"
+ latin:keyWidth="16.084%p" />
+ <Key
+ latin:keyStyle="numStarKeyStyle"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Key
+ latin:keyStyle="numPoundKeyStyle" />
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyXPos="-8.047%p"
+ latin:keyWidth="0%p" />
+ </case>
+ </switch>
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-sw768dp/kbd_phone_symbols.xml b/java/res/xml-sw768dp/kbd_phone_symbols.xml
new file mode 100644
index 000000000..449be47ef
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_phone_symbols.xml
@@ -0,0 +1,167 @@
+<?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="13.250%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:keyWidth="11.172%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:code="45"
+ latin:keyLabel=" - "
+ latin:keyXPos="13.829%p"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:code="43"
+ latin:keyLabel=" + "
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:code="44"
+ latin:keyLabel="@string/label_pause_key"
+ latin:keyWidth="8.047%p" />
+ <!-- To match one character label size with "Tab" and "Pause, I placed spaces around the
+ char '-' and '+'. -->
+ <Key
+ latin:keyStyle="num1KeyStyle"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-11.172%p"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="11.172%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:code="44"
+ latin:keyLabel=" , "
+ latin:keyXPos="13.829%p"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:code="46"
+ latin:keyLabel=" . "
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:code="59"
+ latin:keyLabel="@string/label_wait_key"
+ latin:keyWidth="8.047%p" />
+ <!-- To match one character label size with "More" and "Wait", I placed spaces around the
+ char ',' and '.'. -->
+ <Key
+ latin:keyStyle="num4KeyStyle"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-11.172%p"
+ latin:keyWidth="0%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 below 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. -->
+ <Key
+ latin:code="40"
+ latin:keyLabel=" ( "
+ latin:keyXPos="13.829%p"
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:code="41"
+ latin:keyLabel=" ) "
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:code="78"
+ latin:keyLabel=" N "
+ latin:keyWidth="8.047%p" />
+ <Key
+ latin:keyStyle="num7KeyStyle"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ <!-- There is an empty area below 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>
+ <switch>
+ <case latin:hasSettingsKey="true">
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </case>
+ <default>
+ <Spacer
+ latin:keyWidth="8.047%p" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyXPos="13.829%p"
+ latin:keyWidth="24.14%p" />
+ <Key
+ latin:keyStyle="numStarKeyStyle"
+ latin:keyXPos="43.125%p" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Key
+ latin:keyStyle="numPoundKeyStyle" />
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyXPos="-8.047%p"
+ latin:keyWidth="0%p" />
+ </case>
+ </switch>
+ </Row>
+</Keyboard>
diff --git a/java/res/values/durations.xml b/java/res/xml-sw768dp/kbd_popup_template.xml
index 92af68e39..7d39d1a3a 100644
--- a/java/res/values/durations.xml
+++ b/java/res/xml-sw768dp/kbd_popup_template.xml
@@ -1,25 +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
+** 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.
*/
-->
-<resources>
- <!-- Vibration duration in milliseconds, for key presses in the IME. This can be hardware
- dependent and may require overriding with a device specific overlay. -->
- <integer name="vibrate_duration_ms">40</integer>
-</resources>
+<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-sw768dp/kbd_qwerty.xml
index c165b11c5..1c8d51ffe 100644
--- a/java/res/values-zh-rTW/donottranslate-altchars.xml
+++ b/java/res/xml-sw768dp/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-sw768dp/kbd_qwerty_row1.xml b/java/res/xml-sw768dp/kbd_qwerty_row1.xml
new file mode 100644
index 000000000..0a793028e
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_qwerty_row1.xml
@@ -0,0 +1,69 @@
+<?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.282%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.969%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:keyXPos="-9.219%p"
+ latin:keyWidth="-9.219%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row2.xml b/java/res/xml-sw768dp/kbd_qwerty_row2.xml
new file mode 100644
index 000000000..aeeab235e
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_qwerty_row2.xml
@@ -0,0 +1,62 @@
+<?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.125%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.172%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:keyXPos="-15.704%p"
+ latin:keyWidth="-15.704%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row3.xml b/java/res/xml-sw768dp/kbd_qwerty_row3.xml
new file mode 100644
index 000000000..e488cf32d
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_qwerty_row3.xml
@@ -0,0 +1,79 @@
+<?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.047%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="13.829%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:keyXPos="-13.750%p"
+ latin:keyWidth="-13.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row4.xml b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
new file mode 100644
index 000000000..44e8e10e1
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
@@ -0,0 +1,268 @@
+<?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.047%p"
+ >
+ <switch>
+ <case latin:hasSettingsKey="true">
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </case>
+ <default>
+ <Spacer
+ latin:keyWidth="8.047%p" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:languageCode="ru"
+ >
+ <switch>
+ <!-- TODO: implement logical OR for <case> attribute -->
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle"
+ latin:keyXPos="15.157%p" />
+ </case>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle"
+ latin:keyXPos="15.157%p" />
+ </case>
+ <case
+ latin:imeAction="actionSearch"
+ >
+ <Key
+ latin:keyLabel=":"
+ latin:manualTemporaryUpperCaseCode="43"
+ latin:keyHintIcon="@drawable/key_hint_plus_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
+ latin:popupCharacters="+"
+ latin:keyXPos="15.157%p" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyXPos="15.157%p" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="\@" />
+ </case>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyLabel="-"
+ latin:manualTemporaryUpperCaseCode="95"
+ latin:keyHintIcon="@drawable/key_hint_underline_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+ latin:popupCharacters="_" />
+ </case>
+ <default>
+ <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>
+ </case>
+ <!-- not languageCode="ru" -->
+ <default>
+ <switch>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle"
+ latin:keyXPos="15.157%p"
+ latin:keyWidth="16.084%p" />
+ </case>
+ <default>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle"
+ latin:keyXPos="15.157%p" />
+ </case>
+ <case
+ latin:imeAction="actionSearch"
+ >
+ <Key
+ latin:keyLabel=":"
+ latin:manualTemporaryUpperCaseCode="43"
+ latin:keyHintIcon="@drawable/key_hint_plus_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
+ latin:popupCharacters="+"
+ latin:keyXPos="15.157%p" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyXPos="15.157%p" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="\@" />
+ </case>
+ <default>
+ <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>
+ </default>
+ </switch>
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyXPos="31.250%p"
+ latin:keyWidth="37.500%p" />
+ <switch>
+ <case
+ latin:languageCode="ru"
+ >
+ <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="95"
+ latin:keyHintIcon="@drawable/key_hint_underline_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+ latin:popupCharacters="_" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="_" />
+ </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="\'" />
+ </default>
+ </switch>
+ </case>
+ <!-- not languageCode="ru" -->
+ <default>
+ <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>
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyXPos="-8.047%p"
+ latin:keyWidth="0%p" />
+ </case>
+ </switch>
+ </Row>
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_rows.xml b/java/res/xml-sw768dp/kbd_qwerty_rows.xml
new file mode 100644
index 000000000..6237712f6
--- /dev/null
+++ b/java/res/xml-sw768dp/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-sw768dp/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml
new file mode 100644
index 000000000..363de4b8c
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml
@@ -0,0 +1,121 @@
+<?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.579%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.969%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:keyXPos="-9.219%p"
+ latin:keyWidth="-9.219%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.500%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.969%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:keyXPos="-15.704%p"
+ latin:keyWidth="-15.704%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-sw768dp/kbd_qwertz_rows.xml b/java/res/xml-sw768dp/kbd_qwertz_rows.xml
new file mode 100644
index 000000000..9a8b66177
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_qwertz_rows.xml
@@ -0,0 +1,129 @@
+<?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.282%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.969%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:keyXPos="-9.219%p"
+ latin:keyWidth="-9.219%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <Row
+ latin:keyWidth="8.047%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="13.829%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:keyXPos="-13.750%p"
+ latin:keyWidth="-13.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_ru_rows.xml b/java/res/xml-sw768dp/kbd_ru_rows.xml
new file mode 100644
index 000000000..22e7d562c
--- /dev/null
+++ b/java/res/xml-sw768dp/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.579%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.969%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="й" />
+ <Key
+ latin:keyLabel="ц" />
+ <Key
+ latin:keyLabel="у" />
+ <Key
+ latin:keyLabel="к" />
+ <Key
+ latin:keyLabel="е"
+ latin:popupCharacters="@string/alternates_for_cyrillic_e" />
+ <Key
+ latin:keyLabel="н" />
+ <Key
+ latin:keyLabel="г" />
+ <Key
+ latin:keyLabel="ш" />
+ <Key
+ latin:keyLabel="щ" />
+ <Key
+ latin:keyLabel="з" />
+ <Key
+ latin:keyLabel="х" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-9.219%p"
+ latin:keyWidth="-9.219%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.500%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="9.219%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:keyXPos="-15.704%p"
+ latin:keyWidth="-15.704%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.500%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="ь"
+ latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
+ <Key
+ latin:keyLabel="б" />
+ <Key
+ latin:keyLabel="ю" />
+ <Key
+ latin:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="44"
+ latin:keyHintIcon="@drawable/key_hint_comma_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_comma_large_holo"
+ latin:popupCharacters="," />
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyXPos="-13.750%p"
+ latin:keyWidth="-13.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_sr_rows.xml b/java/res/xml-sw768dp/kbd_sr_rows.xml
new file mode 100644
index 000000000..693658d09
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_sr_rows.xml
@@ -0,0 +1,154 @@
+<?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.579%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.969%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:keyXPos="-9.219%p"
+ latin:keyWidth="-9.219%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.500%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="9.219%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:keyXPos="-15.704%p"
+ latin:keyWidth="-15.704%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.500%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="9.219%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: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:keyXPos="-13.750%p"
+ latin:keyWidth="-13.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_symbols.xml b/java/res/xml-sw768dp/kbd_symbols.xml
new file mode 100644
index 000000000..15c75cacc
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_symbols.xml
@@ -0,0 +1,242 @@
+<?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" />
+ <include
+ latin:keyboardLayout="@xml/kbd_currency_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="8.282%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.969%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:keyXPos="-9.219%p"
+ latin:keyWidth="-9.219%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.125%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.172%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="#" />
+ <Key
+ latin:keyStyle="currencyKeyStyle" />
+ <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:keyXPos="-15.704%p"
+ latin:keyWidth="-15.704%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.047%p"
+ >
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="13.829%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="&lt;"
+ latin:popupCharacters="≤,«,‹" />
+ <Key
+ latin:keyLabel="&gt;"
+ latin:popupCharacters="≥,»,›" />
+ <Key
+ latin:keyLabel="="
+ latin:popupCharacters="≠,≈" />
+ <switch>
+ <case
+ latin:languageCode="ru"
+ >
+ <Key
+ latin:keyLabel=":" />
+ </case>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyLabel="\'"
+ latin:popupCharacters="‘,’,‚,‛" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=":" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel=";" />
+ <switch>
+ <case
+ latin:languageCode="ru"
+ >
+ <Key
+ latin:keyLabel="\'"
+ latin:popupCharacters="‘,’,‚,‛" />
+ <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
+ <!-- latin:popupCharacters="“,”,„,‟,«,»" -->
+ <Key
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»" />
+ <Key
+ latin:keyLabel="." />
+ <Key
+ latin:keyLabel="," />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ <Key
+ latin:keyLabel="!"
+ latin:popupCharacters="¡" />
+ <Key
+ latin:keyLabel="\?"
+ latin:popupCharacters="¿" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyXPos="-13.750%p"
+ latin:keyWidth="-13.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.047%p"
+ >
+ <switch>
+ <case latin:hasSettingsKey="true">
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </case>
+ <default>
+ <Spacer
+ latin:keyWidth="8.047%p" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel="/"
+ latin:keyXPos="15.157%p" />
+ <Key
+ latin:keyLabel="\@" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyXPos="31.250%p"
+ latin:keyWidth="37.500%p" />
+ <switch>
+ <case
+ latin:languageCode="ru"
+ >
+ <Key
+ latin:keyLabel="_" />
+ <Key
+ latin:keyLabel="-" />
+ </case>
+ <default>
+ <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
+ <!-- latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" -->
+ <Key
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»,‘,’,‚,‛" />
+ <Key
+ latin:keyLabel="_" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyXPos="-8.047%p"
+ latin:keyWidth="0%p" />
+ </case>
+ </switch>
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-sw768dp/kbd_symbols_shift.xml b/java/res/xml-sw768dp/kbd_symbols_shift.xml
new file mode 100644
index 000000000..44340ab81
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_symbols_shift.xml
@@ -0,0 +1,186 @@
+<?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.282%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.969%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="~" />
+ <Key
+ latin:keyLabel="`" />
+ <Key
+ latin:keyLabel="|" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="•"
+ latin:popupCharacters="♪,♥,♠,♦,♣" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="√" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="π"
+ latin:popupCharacters="Π" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="÷" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="×" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="§"
+ latin:popupCharacters="¶" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="Δ" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyXPos="-9.219%p"
+ latin:keyWidth="-9.219%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.125%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.172%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="£" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¢" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="€" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¥" />
+ <Key
+ latin:keyLabel="^"
+ latin:popupCharacters="↑,↓,←,→" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="°"
+ latin:popupCharacters="′,″" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="±"
+ latin:popupCharacters="∞" />
+ <Key
+ latin:keyLabel="{" />
+ <Key
+ latin:keyLabel="}" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyXPos="-15.704%p"
+ latin:keyWidth="-15.704%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.047%p"
+ >
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="13.829%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="\\" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="©" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="®" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="™" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="℅" />
+ <Key
+ latin:keyLabel="[" />
+ <Key
+ latin:keyLabel="]" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¡" />
+ <Key
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¿" />
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyXPos="-13.750%p"
+ latin:keyWidth="-13.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.047%p"
+ >
+ <switch>
+ <case latin:hasSettingsKey="true">
+ <Key
+ latin:keyStyle="settingsKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </case>
+ <default>
+ <Spacer
+ latin:keyWidth="8.047%p" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyXPos="31.250%p"
+ latin:keyWidth="37.500%p" />
+ <switch>
+ <case
+ latin:voiceKeyEnabled="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyXPos="-8.047%p"
+ latin:keyWidth="0%p" />
+ </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..4a766987d
--- /dev/null
+++ b/java/res/xml/kbd_azerty_rows.xml
@@ -0,0 +1,140 @@
+<?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/key_hint_num1"
+ latin:popupCharacters="@string/alternates_for_a"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="z"
+ latin:keyHintIcon="@drawable/key_hint_num2"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/key_hint_num3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/key_hint_num4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/key_hint_num5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:keyHintIcon="@drawable/key_hint_num6"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/key_hint_num7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/key_hint_num8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/key_hint_num9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/key_hint_num0"
+ latin:popupCharacters="@string/alternates_for_p"
+ latin:keyWidth="0%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:keyWidth="0%p"
+ 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="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_currency_key_styles.xml b/java/res/xml/kbd_currency_key_styles.xml
new file mode 100644
index 000000000..b30dd6451
--- /dev/null
+++ b/java/res/xml/kbd_currency_key_styles.xml
@@ -0,0 +1,269 @@
+<?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"
+>
+ <switch>
+ <case
+ latin:passwordInput="true"
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="$"
+ latin:popupCharacters="@string/alternates_for_currency_dollar" />
+ </case>
+ <!-- Countries using Euro currency, 23 countries as for January 2011. -->
+ <!-- 1. Andorra (ca_AD, ca_ES) -->
+ <case
+ latin:languageCode="ca"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 2. Austria (de_AT) -->
+<!-- <case-->
+<!-- latin:countryCode="AT"-->
+<!-- >-->
+<!-- <key-style-->
+<!-- latin:styleName="currencyKeyStyle"-->
+<!-- latin:keyLabel="€"-->
+<!-- latin:popupCharacters="@string/alternates_for_currency_euro" />-->
+<!-- </case>-->
+ <!-- 3. Belgium (nl_BE, fr_BE, de_BE) -->
+<!-- <case-->
+<!-- latin:countryCode="BE"-->
+<!-- >-->
+<!-- <key-style-->
+<!-- latin:styleName="currencyKeyStyle"-->
+<!-- latin:keyLabel="€"-->
+<!-- latin:popupCharacters="@string/alternates_for_currency_euro" />-->
+<!-- </case>-->
+ <!-- 4. Cyprus (el_CY, tr_CY) -->
+ <case
+ latin:countryCode="CY"
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 5. Estonia (et_EE) -->
+<!-- <case-->
+<!-- latin:languageCode="et"-->
+<!-- latin:countryCode=""-->
+<!-- >-->
+<!-- <key-style-->
+<!-- latin:styleName="currencyKeyStyle"-->
+<!-- latin:keyLabel="€"-->
+<!-- latin:popupCharacters="@string/alternates_for_currency_euro" />-->
+<!-- </case>-->
+ <!-- 6. Finland (fi_FI, sv_FI) -->
+ <case
+ latin:languageCode="fi"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 7. France (fr_FR) -->
+ <case
+ latin:languageCode="fr"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 8. Germany (de_DE) -->
+ <case
+ latin:languageCode="de"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 9. Greece (el_GR) -->
+ <case
+ latin:languageCode="el"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 10. Ireland (ga_IE, en_IE) -->
+ <case
+ latin:countryCode="IE"
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 11. Italy (it_IT) -->
+ <case
+ latin:languageCode="it"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 12. Kosovo -->
+<!-- <case-->
+<!-- latin:countryCode="XK"-->
+<!-- >-->
+<!-- <key-style-->
+<!-- latin:styleName="currencyKeyStyle"-->
+<!-- latin:keyLabel="€"-->
+<!-- latin:popupCharacters="@string/alternates_for_currency_euro" />-->
+<!-- </case>-->
+ <!-- 13. Luxembourg (lb_LU, fr_LU, de_LU) -->
+ <case
+ latin:countryCode="LU"
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 14. Malta (mt_MT, en_MT) -->
+ <case
+ latin:countryCode="MT"
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 15. Monaco (fr_MO) -->
+<!-- <case-->
+<!-- latin:countryCode="MO"-->
+<!-- >-->
+<!-- <key-style-->
+<!-- latin:styleName="currencyKeyStyle"-->
+<!-- latin:keyLabel="€"-->
+<!-- latin:popupCharacters="@string/alternates_for_currency_euro" />-->
+<!-- </case>-->
+ <!-- 16. Montenegro (sla_ME) -->
+ <case
+ latin:countryCode="ME"
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 17. Netherlands (nl_NL) -->
+ <case
+ latin:languageCode="nl"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 18. Portugal (pt_PT) -->
+ <case
+ latin:languageCode="pt"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 19. San Marino (it_SM) -->
+<!-- <case-->
+<!-- latin:countryCode="SM"-->
+<!-- >-->
+<!-- <key-style-->
+<!-- latin:styleName="currencyKeyStyle"-->
+<!-- latin:keyLabel="€"-->
+<!-- latin:popupCharacters="@string/alternates_for_currency_euro" />-->
+<!-- </case>-->
+ <!-- 20. Slovakia (sk_SK) -->
+ <case
+ latin:languageCode="sk"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 21. Slovenia (sl_SI) -->
+ <case
+ latin:languageCode="sl"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 22. Spain (es_ES, ca_ES) -->
+ <case
+ latin:languageCode="es"
+ latin:countryCode=""
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="€"
+ latin:popupCharacters="@string/alternates_for_currency_euro" />
+ </case>
+ <!-- 23. Vatican City (it_VA) -->
+<!-- <case-->
+<!-- latin:countryCode="VA"-->
+<!-- >-->
+<!-- <key-style-->
+<!-- latin:styleName="currencyKeyStyle"-->
+<!-- latin:keyLabel="€"-->
+<!-- latin:popupCharacters="@string/alternates_for_currency_euro" />-->
+<!-- </case>-->
+ <!-- United Kingdom -->
+ <case
+ latin:countryCode="GB"
+ >
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="£"
+ latin:popupCharacters="@string/alternates_for_currency_pound" />
+ </case>
+ <default>
+ <key-style
+ latin:styleName="currencyKeyStyle"
+ latin:keyLabel="$"
+ latin:popupCharacters="@string/alternates_for_currency_dollar" />
+ </default>
+ </switch>
+</merge> \ No newline at end of file
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
new file mode 100644
index 000000000..28869a87d
--- /dev/null
+++ b/java/res/xml/kbd_key_styles.xml
@@ -0,0 +1,338 @@
+<?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"
+>
+ <!-- Base key style for the functional key -->
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle"
+ latin:isModifier="true" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle" />
+ </case>
+ </switch>
+ <!-- Base key style for the key which may have settings key as popup key -->
+ <switch>
+ <case
+ latin:clobberSettingsKey="true"
+ >
+ <key-style
+ latin:styleName="settingsPopupStyle"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <!-- latin:hasSettingsKey="false" -->
+ <default>
+ <key-style
+ latin:styleName="settingsPopupStyle"
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="\@drawable/sym_keyboard_settings_holo|\@integer/key_settings"
+ latin:parentStyle="functionalKeyStyle" />
+ </default>
+ </switch>
+ <!-- Functional key styles -->
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <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_holo"
+ latin:iconPreview="@drawable/sym_keyboard_settings_holo"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="spaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_keyboard_space_holo"
+ latin:iconPreview="@drawable/sym_keyboard_space_holo"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_keyboard_tab_holo"
+ latin:iconPreview="@drawable/sym_keyboard_tab_holo"
+ 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:parentStyle="settingsPopupStyle" />
+ <!-- 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_holo"
+ latin:iconPreview="@drawable/sym_keyboard_tab_holo" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <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_settings_holo"
+ 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:parentStyle="settingsPopupStyle" />
+ <!-- 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:imeAction="actionGo"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_go_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeAction="actionNext"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_next_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeAction="actionDone"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_done_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeAction="actionSend"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_send_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeAction="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_holo"
+ latin:iconPreview="@drawable/sym_keyboard_return_holo"
+ 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" />
+ <switch>
+ <case
+ latin:passwordInput="true"
+ >
+ <key-style
+ latin:styleName="nonPasswordSymbolKeyStyle"
+ latin:enabled="false" />
+ <key-style
+ latin:styleName="nonPasswordFunctionalKeyStyle"
+ latin:enabled="false"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <!-- latin:passwordInput="false" -->
+ <default>
+ <key-style
+ latin:styleName="nonPasswordSymbolKeyStyle"
+ latin:enabled="true" />
+ <key-style
+ latin:styleName="nonPasswordFunctionalKeyStyle"
+ latin:enabled="true"
+ latin:parentStyle="functionalKeyStyle" />
+ </default>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml
new file mode 100644
index 000000000..3c8384604
--- /dev/null
+++ b/java/res/xml/kbd_number.xml
@@ -0,0 +1,147 @@
+<?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" />
+ <include
+ latin:keyboardLayout="@xml/kbd_numkey_styles" />
+ <switch>
+ <case
+ latin:passwordInput="true"
+ >
+ <Row
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyStyle="num1KeyStyle"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="num4KeyStyle"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="num7KeyStyle"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:rowEdgeFlags="bottom"
+ >
+ <Spacer />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Spacer />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ </case>
+ <default>
+ <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="0%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="0%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="0%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="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ </default>
+ </switch>
+</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..7439d6397
--- /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_numsymbol_holo"
+ latin:iconPreview="@drawable/sym_keyboard_numsymbol_holo" />
+ <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..7af8d07b4 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="0%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="0%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="0%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="0%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..4b6319ef7 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="0%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="0%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="0%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="0%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_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_f1.xml b/java/res/xml/kbd_qwerty_f1.xml
new file mode 100644
index 000000000..e89d02d91
--- /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:keyStyle="settingsPopupStyle" />
+ </case>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="\@"
+ latin:keyStyle="settingsPopupStyle" />
+ </case>
+ <default>
+ <switch>
+ <case
+ latin:hasVoiceKey="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </case>
+ <!-- latin:hasVoiceKey="false" -->
+ <case
+ latin:webInput="true"
+ >
+ <Key
+ latin:keyLabel="."
+ latin:keyStyle="settingsPopupStyle" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:keyStyle="settingsPopupStyle" />
+ </default>
+ </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..9ee164313
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row1.xml
@@ -0,0 +1,72 @@
+<?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/key_hint_num1"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:keyHintIcon="@drawable/key_hint_num2"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/key_hint_num3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/key_hint_num4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/key_hint_num5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:keyHintIcon="@drawable/key_hint_num6"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/key_hint_num7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/key_hint_num8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/key_hint_num9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/key_hint_num0"
+ latin:popupCharacters="@string/alternates_for_p"
+ latin:keyWidth="0%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..cf9b3049b
--- /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"
+ >
+ <Key
+ latin:keyLabel="a"
+ latin:keyXPos="5%p"
+ 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:keyWidth="0%p"
+ 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..ffbf06133
--- /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="0%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..67a1a76a1
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -0,0 +1,130 @@
+<?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:webInput="true"
+ >
+ <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="0%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="0%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:webInput="true"
+ >
+ <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="0%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="0%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..be841dccd
--- /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/key_hint_num1"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:keyHintIcon="@drawable/key_hint_num2"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/key_hint_num3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/key_hint_num4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/key_hint_num5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:keyHintIcon="@drawable/key_hint_num6"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/key_hint_num7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/key_hint_num8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/key_hint_num9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/key_hint_num0"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyLabel="å"
+ latin:keyWidth="0%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="0%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..960b9f5ae
--- /dev/null
+++ b/java/res/xml/kbd_qwertz_rows.xml
@@ -0,0 +1,108 @@
+<?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/key_hint_num1"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:keyHintIcon="@drawable/key_hint_num2"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/key_hint_num3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/key_hint_num4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/key_hint_num5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="z"
+ latin:keyHintIcon="@drawable/key_hint_num6"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/key_hint_num7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/key_hint_num8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/key_hint_num9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/key_hint_num0"
+ latin:popupCharacters="@string/alternates_for_p"
+ latin:keyWidth="0%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="0%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..5d30221d9
--- /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/key_hint_num1"
+ latin:popupCharacters="1"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="ц"
+ latin:keyHintIcon="@drawable/key_hint_num2"
+ latin:popupCharacters="2" />
+ <Key
+ latin:keyLabel="у"
+ latin:keyHintIcon="@drawable/key_hint_num3"
+ latin:popupCharacters="3" />
+ <Key
+ latin:keyLabel="к"
+ latin:keyHintIcon="@drawable/key_hint_num4"
+ latin:popupCharacters="4" />
+ <Key
+ latin:keyLabel="е"
+ latin:keyHintIcon="@drawable/key_hint_num5"
+ latin:popupCharacters="@string/alternates_for_cyrillic_e" />
+ <Key
+ latin:keyLabel="н"
+ latin:keyHintIcon="@drawable/key_hint_num6"
+ latin:popupCharacters="6" />
+ <Key
+ latin:keyLabel="г"
+ latin:keyHintIcon="@drawable/key_hint_num7"
+ latin:popupCharacters="7" />
+ <Key
+ latin:keyLabel="ш"
+ latin:keyHintIcon="@drawable/key_hint_num8"
+ latin:popupCharacters="8" />
+ <Key
+ latin:keyLabel="щ"
+ latin:keyHintIcon="@drawable/key_hint_num9"
+ latin:popupCharacters="9" />
+ <Key
+ latin:keyLabel="з"
+ latin:keyHintIcon="@drawable/key_hint_num0"
+ latin:popupCharacters="0" />
+ <Key
+ latin:keyLabel="х"
+ latin:keyWidth="0%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="0%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="0%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..8239f24cb
--- /dev/null
+++ b/java/res/xml/kbd_sr_rows.xml
@@ -0,0 +1,136 @@
+<?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/key_hint_num1"
+ latin:popupCharacters="1"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="њ"
+ latin:keyHintIcon="@drawable/key_hint_num2"
+ latin:popupCharacters="2" />
+ <Key
+ latin:keyLabel="е"
+ latin:keyHintIcon="@drawable/key_hint_num3"
+ latin:popupCharacters="3" />
+ <Key
+ latin:keyLabel="р"
+ latin:keyHintIcon="@drawable/key_hint_num4"
+ latin:popupCharacters="4" />
+ <Key
+ latin:keyLabel="т"
+ latin:keyHintIcon="@drawable/key_hint_num5"
+ latin:popupCharacters="5" />
+ <Key
+ latin:keyLabel="з"
+ latin:keyHintIcon="@drawable/key_hint_num6"
+ latin:popupCharacters="6" />
+ <Key
+ latin:keyLabel="у"
+ latin:keyHintIcon="@drawable/key_hint_num7"
+ latin:popupCharacters="7" />
+ <Key
+ latin:keyLabel="и"
+ latin:keyHintIcon="@drawable/key_hint_num8"
+ latin:popupCharacters="8" />
+ <Key
+ latin:keyLabel="о"
+ latin:keyHintIcon="@drawable/key_hint_num9"
+ latin:popupCharacters="9" />
+ <Key
+ latin:keyLabel="п"
+ latin:keyHintIcon="@drawable/key_hint_num0"
+ latin:popupCharacters="0" />
+ <Key
+ latin:keyLabel="ш"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="9.09%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="ћ"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.90%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ 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="deleteKeyStyle"
+ latin:keyWidth="0%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..3c9098da7 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -19,196 +19,115 @@
-->
<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" />
+ <include
+ latin:keyboardLayout="@xml/kbd_currency_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:keyWidth="0%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="$"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¢£€¥₣₤₱" />
+ latin:keyStyle="currencyKeyStyle" />
<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:keyWidth="0%p"
+ 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="¡" />
+ <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
+ <!-- latin:popupCharacters="“,”,„,‟,«,»" -->
<Key
- android:keyLabel="&quot;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="“”«»˝" />
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»"
+ latin:maxPopupKeyboardColumn="6" />
<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="0%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..0fb7136b9
--- /dev/null
+++ b/java/res/xml/kbd_symbols_f1.xml
@@ -0,0 +1,38 @@
+<?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>
+ <!-- latin:hasVoiceKey="false" -->
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:keyStyle="settingsPopupStyle" />
+ </default>
+ </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..e92e58bcb
--- /dev/null
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -0,0 +1,103 @@
+<?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="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_holo"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="0%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_holo"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="0%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..0f9ea3b77 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -19,171 +19,114 @@
-->
<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:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="•"
+ latin:popupCharacters="♪,♥,♠,♦,♣" />
<Key
- android:keyLabel="√" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="√" />
<Key
- android:keyLabel="π"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="Π" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="π"
+ latin:popupCharacters="Π" />
<Key
- android:keyLabel="÷" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="÷" />
<Key
- android:keyLabel="×" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="×" />
<Key
- android:keyLabel="{" />
+ latin:keyLabel="{" />
<Key
- android:keyLabel="}"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="}"
+ latin:keyWidth="0%p"
+ 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:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="£" />
<Key
- android:keyLabel="¢" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="¢" />
<Key
- android:keyLabel="€" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="€" />
<Key
- android:keyLabel="°" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="°"
+ 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="="
- 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:keyWidth="0%p"
+ 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:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="™" />
<Key
- android:keyLabel="®" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="®" />
<Key
- android:keyLabel="©" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ latin:keyLabel="©" />
<Key
- android:keyLabel="¶"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="§" />
+ latin:keyStyle="nonPasswordSymbolKeyStyle"
+ 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="0%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..3ed76ea58
--- /dev/null
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -0,0 +1,99 @@
+<?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="toAlphaKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="„"
+ latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="40%p" />
+ <Key
+ latin:keyLabel="…"
+ latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="0%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="nonPasswordFunctionalKeyStyle" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="30%p" />
+ <Key
+ latin:keyLabel="…"
+ latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="0%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="0%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..8dec7abec 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -20,7 +20,191 @@
<!-- 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"
+ android:imeSubtypeExtraValue="requiresGermanUmlautProcessing"
+ />
+ <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_at.xml b/java/res/xml/popup_at.xml
deleted file mode 100644
index 197eea445..000000000
--- a/java/res/xml/popup_at.xml
+++ /dev/null
@@ -1,39 +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:keyLabel="\@"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
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..d031415d7 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,69 @@
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:defaultValue="@bool/config_default_sound_enabled"
+ 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/config_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 +94,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..98a7f98c2
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -0,0 +1,451 @@
+/*
+ * 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.keyboard;
+
+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 com.android.inputmethod.keyboard.KeyStyles.KeyStyle;
+import com.android.inputmethod.keyboard.KeyboardParser.ParseException;
+import com.android.inputmethod.latin.R;
+
+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 and responds on press */
+ 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 popup mini keyboard.
+ */
+ public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y,
+ int width, int height, int edgeFlags) {
+ mKeyboard = keyboard;
+ mHeight = height - 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
+ * @param keyStyles active key styles set
+ */
+ 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);
+ int keyWidth;
+ 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);
+ keyWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_keyWidth,
+ mKeyboard.getDisplayWidth(), row.mDefaultWidth);
+ } finally {
+ keyboardAttr.recycle();
+ }
+
+ 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 int keyboardWidth = mKeyboard.getDisplayWidth();
+ int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr,
+ R.styleable.Keyboard_Key_keyXPos, keyboardWidth, x);
+ if (keyXPos < 0) {
+ // If keyXPos is negative, the actual x-coordinate will be k + keyXPos.
+ keyXPos += keyboardWidth;
+ }
+ if (keyXPos < x) {
+ // keyXPos shouldn't be less than x because drawable area for this key starts
+ // at x. Or, this key will overlaps the adjacent key on its left hand side.
+ keyXPos = x;
+ }
+ if (keyWidth == 0) {
+ // If keyWidth is zero, the actual key width will be determined to fill out the
+ // area up to the right edge of the keyboard.
+ keyWidth = keyboardWidth - keyXPos;
+ } else if (keyWidth < 0) {
+ // If keyWidth is negative, the actual key width will be determined to fill out the
+ // area between the nearest key on the left hand side and the right edge of the
+ // keyboard.
+ keyXPos = x;
+ keyWidth = keyboardWidth - keyXPos;
+ }
+
+ // Horizontal gap is divided equally to both sides of the key.
+ mX = keyXPos + mGap / 2;
+ mY = y;
+ mWidth = keyWidth - mGap;
+
+ 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);
+ mEnabled = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_enabled, true);
+ 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 != null && 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 = mX - mGap / 2;
+ final int right = left + mWidth + mGap;
+ final int top = mY;
+ final int bottom = top + mHeight + mKeyboard.getVerticalGap();
+ // In order to mitigate rounding errors, we use (left <= x <= right) here.
+ 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 = mX;
+ final int right = left + mWidth;
+ final int top = mY;
+ final int bottom = top + 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..a8346c581 100644
--- a/java/src/com/android/inputmethod/latin/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -14,15 +14,16 @@
* 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.HashMap;
import java.util.List;
-abstract class KeyDetector {
+public abstract class KeyDetector {
+ public static final int NOT_A_KEY = -1;
+ public static final int NOT_A_CODE = -1;
+
protected Keyboard mKeyboard;
private Key[] mKeys;
@@ -80,12 +81,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_CODE} value.
*/
public int[] newCodeArray() {
int[] codes = new int[getMaxNearbyKeys()];
- Arrays.fill(codes, LatinKeyboardBaseView.NOT_A_KEY);
+ Arrays.fill(codes, NOT_A_CODE);
return codes;
}
@@ -106,8 +106,35 @@ abstract class KeyDetector {
*
* @param x The x-coordinate of a touch point
* @param y The y-coordinate of a touch point
- * @param allKeys All nearby key indices are returned in this array
+ * @param allCodes All nearby key code except functional key are returned in this array
* @return The nearest key index
*/
- abstract public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys);
+ abstract public int getKeyIndexAndNearbyCodes(int x, int y, final int[] allCodes);
+
+ /**
+ * Compute the most common key width in order to use it as proximity key detection threshold.
+ *
+ * @param keyboard The keyboard to compute the most common key width
+ * @return The most common key width in the keyboard
+ */
+ public static int getMostCommonKeyWidth(final Keyboard keyboard) {
+ if (keyboard == null) return 0;
+ final List<Key> keys = keyboard.getKeys();
+ if (keys == null || keys.size() == 0) return 0;
+ final HashMap<Integer, Integer> histogram = new HashMap<Integer, Integer>();
+ int maxCount = 0;
+ int mostCommonWidth = 0;
+ for (final 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;
+ }
+ }
+ return mostCommonWidth;
+ }
}
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..8d9b1b41e
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyStyles.java
@@ -0,0 +1,259 @@
+/*
+ * 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.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);
+ readBoolean(keyAttr, R.styleable.Keyboard_Key_enabled);
+ }
+
+ 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..0b545d9c2
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -0,0 +1,427 @@
+/*
+ * 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.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.
+
+ // TODO: Change GRID_WIDTH and GRID_HEIGHT to private.
+ 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;
+
+ private final ProximityInfo mProximityInfo;
+
+ /**
+ * 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);
+ mProximityInfo = new ProximityInfo(GRID_WIDTH, GRID_HEIGHT);
+ }
+
+ public int getProximityInfo() {
+ return mProximityInfo.getNativeProximityInfo(this);
+ }
+
+ 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();
+ }
+
+ // TODO: Move this function to ProximityInfo and make this private.
+ public 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;
+ }
+ }
+ mProximityInfo.setProximityInfo(mGridNeighbors, getMinWidth(), getHeight(), mKeys);
+ }
+
+ 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..7e67d6f6b
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
@@ -0,0 +1,78 @@
+/*
+ * 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.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.
+ * @param withSliding true if pressing has occurred because the user slid finger from other key
+ * to this key without releasing the finger.
+ */
+ public void onPress(int primaryCode, boolean withSliding);
+
+ /**
+ * 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
+ * @param withSliding true if releasing has occurred because the user slid finger from the key
+ * to other key without releasing the finger.
+ */
+ public void onRelease(int primaryCode, boolean withSliding);
+
+ /**
+ * 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..b256a89c1
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -0,0 +1,226 @@
+/*
+ * 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.keyboard;
+
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.Utils;
+
+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_PHONE = 4;
+ public static final int MODE_NUMBER = 5;
+
+ public static final int F2KEY_MODE_NONE = 0;
+ public static final int F2KEY_MODE_SETTINGS = 1;
+ public static final int F2KEY_MODE_SHORTCUT_IME = 2;
+ public static final int F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS = 3;
+
+ public final Locale mLocale;
+ public final int mOrientation;
+ public final int mMode;
+ public final int mXmlId;
+ public final int mColorScheme;
+ public final boolean mWebInput;
+ public final boolean mPasswordInput;
+ // TODO: Clean up these booleans and modes.
+ public final boolean mHasSettingsKey;
+ public final int mF2KeyMode;
+ public final boolean mClobberSettingsKey;
+ public final boolean mVoiceKeyEnabled;
+ public final boolean mHasVoiceKey;
+ public final int mImeAction;
+ public final boolean mEnableShiftLock;
+ public final String mXmlName;
+
+ private final int mHashCode;
+
+ public KeyboardId(String xmlName, int xmlId, int colorScheme, Locale locale, int orientation,
+ int mode, EditorInfo attribute, boolean hasSettingsKey, int f2KeyMode,
+ boolean clobberSettingsKey, boolean voiceKeyEnabled, boolean hasVoiceKey,
+ boolean enableShiftLock) {
+ final int inputType = (attribute != null) ? attribute.inputType : 0;
+ final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
+ this.mLocale = locale;
+ this.mOrientation = orientation;
+ this.mMode = mode;
+ this.mXmlId = xmlId;
+ this.mColorScheme = colorScheme;
+ this.mWebInput = Utils.isWebInputType(inputType);
+ this.mPasswordInput = Utils.isPasswordInputType(inputType)
+ || Utils.isVisiblePasswordInputType(inputType);
+ this.mHasSettingsKey = hasSettingsKey;
+ this.mF2KeyMode = f2KeyMode;
+ this.mClobberSettingsKey = clobberSettingsKey;
+ this.mVoiceKeyEnabled = voiceKeyEnabled;
+ this.mHasVoiceKey = hasVoiceKey;
+ // We are interested only in {@link EditorInfo#IME_MASK_ACTION} enum value and
+ // {@link EditorInfo#IME_FLAG_NO_ENTER_ACTION}.
+ this.mImeAction = 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,
+ mWebInput,
+ mPasswordInput,
+ hasSettingsKey,
+ f2KeyMode,
+ clobberSettingsKey,
+ voiceKeyEnabled,
+ hasVoiceKey,
+ mImeAction,
+ 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.mWebInput == this.mWebInput
+ && other.mPasswordInput == this.mPasswordInput
+ && other.mHasSettingsKey == this.mHasSettingsKey
+ && other.mF2KeyMode == this.mF2KeyMode
+ && other.mClobberSettingsKey == this.mClobberSettingsKey
+ && other.mVoiceKeyEnabled == this.mVoiceKeyEnabled
+ && other.mHasVoiceKey == this.mHasVoiceKey
+ && other.mImeAction == this.mImeAction
+ && other.mEnableShiftLock == this.mEnableShiftLock;
+ }
+
+ @Override
+ public int hashCode() {
+ return mHashCode;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("[%s.xml %s %s %s %s %s %s%s%s%s%s%s%s%s]",
+ mXmlName,
+ mLocale,
+ (mOrientation == 1 ? "port" : "land"),
+ modeName(mMode),
+ imeOptionsName(mImeAction),
+ colorSchemeName(mColorScheme),
+ f2KeyModeName(mF2KeyMode),
+ (mClobberSettingsKey ? " clobberSettingsKey" : ""),
+ (mWebInput ? " webInput" : ""),
+ (mPasswordInput ? " passwordInput" : ""),
+ (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_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_NEXT: action = "actionNext"; 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;
+ }
+ }
+
+ public static String f2KeyModeName(int f2KeyMode) {
+ switch (f2KeyMode) {
+ case F2KEY_MODE_NONE: return "none";
+ case F2KEY_MODE_SETTINGS: return "settings";
+ case F2KEY_MODE_SHORTCUT_IME: return "shortcutIme";
+ case F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS: return "shortcutImeOrSettings";
+ }
+ return null;
+ }
+}
+
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..b240f6d09
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
@@ -0,0 +1,628 @@
+/*
+ * 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.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.class.getSimpleName();
+ 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, row, 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%s keyLabel=%s code=%d popupCharacters=%s />",
+ TAG_KEY, (key.mEnabled ? "" : " disabled"), 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, Row row, 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 keyboardAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ if (keyboardAttr.hasValue(R.styleable.Keyboard_horizontalGap))
+ throw new IllegalAttribute(parser, "horizontalGap");
+ final int defaultWidth = (row != null) ? row.mDefaultWidth : 0;
+ final int keyWidth = getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyWidth,
+ mKeyboard.getDisplayWidth(), defaultWidth);
+ keyboardAttr.recycle();
+
+ final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Key);
+ int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr,
+ R.styleable.Keyboard_Key_keyXPos, mKeyboard.getDisplayWidth(), mCurrentX);
+ if (keyXPos < 0) {
+ // If keyXPos is negative, the actual x-coordinate will be display_width + keyXPos.
+ keyXPos += mKeyboard.getDisplayWidth();
+ }
+
+ checkEndTag(TAG_SPACER, parser);
+ setSpacer(keyXPos, keyWidth);
+ }
+ }
+
+ 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 webInputMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_webInput, id.mWebInput);
+ final boolean passwordInputMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_passwordInput, id.mPasswordInput);
+ final boolean settingsKeyMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_hasSettingsKey, id.mHasSettingsKey);
+ final boolean f2KeyModeMatched = matchInteger(a,
+ R.styleable.Keyboard_Case_f2KeyMode, id.mF2KeyMode);
+ final boolean clobberSettingsKeyMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_clobberSettingsKey, id.mClobberSettingsKey);
+ 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 {@link KeyboardId} class, we are interested only in enum value masked by
+ // {@link android.view.inputmethod.EditorInfo#IME_MASK_ACTION} and
+ // {@link android.view.inputmethod.EditorInfo#IME_FLAG_NO_ENTER_ACTION}. So matching
+ // this attribute with id.mImeOptions as integer value is enough for our purpose.
+ final boolean imeActionMatched = matchInteger(a,
+ R.styleable.Keyboard_Case_imeAction, id.mImeAction);
+ final boolean languageCodeMatched = matchString(a,
+ R.styleable.Keyboard_Case_languageCode, id.mLocale.getLanguage());
+ final boolean countryCodeMatched = matchString(a,
+ R.styleable.Keyboard_Case_countryCode, id.mLocale.getCountry());
+ final boolean selected = modeMatched && webInputMatched && passwordInputMatched
+ && settingsKeyMatched && f2KeyModeMatched && clobberSettingsKeyMatched
+ && voiceEnabledMatched && voiceKeyMatched && colorSchemeMatched
+ && imeActionMatched && languageCodeMatched && countryCodeMatched;
+
+ if (DEBUG) Log.d(TAG, String.format("<%s%s%s%s%s%s%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(
+ viewAttr.getInt(
+ R.styleable.KeyboardView_colorScheme, -1)), "colorSchemeName"),
+ booleanAttr(a, R.styleable.Keyboard_Case_webInput, "webInput"),
+ booleanAttr(a, R.styleable.Keyboard_Case_passwordInput, "passwordInput"),
+ booleanAttr(a, R.styleable.Keyboard_Case_hasSettingsKey, "hasSettingsKey"),
+ textAttr(KeyboardId.f2KeyModeName(
+ a.getInt(R.styleable.Keyboard_Case_f2KeyMode, -1)), "f2KeyMode"),
+ booleanAttr(a, R.styleable.Keyboard_Case_clobberSettingsKey,
+ "clobberSettingsKey"),
+ 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_imeAction, -1)), "imeAction"),
+ textAttr(a.getString(R.styleable.Keyboard_Case_languageCode), "languageCode"),
+ textAttr(a.getString(R.styleable.Keyboard_Case_countryCode), "countryCode"),
+ 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 static boolean matchString(TypedArray a, int index, String value) {
+ // If <case> does not have "index" attribute, that means this <case> is wild-card for the
+ // attribute.
+ return !a.hasValue(index) || a.getString(index).equals(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.mX - key.mGap / 2 + key.mWidth + key.mGap;
+ if (mCurrentX > mMaxRowWidth)
+ mMaxRowWidth = mCurrentX;
+ }
+
+ private void endKeyboard(int defaultVerticalGap) {
+ mTotalHeight = mCurrentY - defaultVerticalGap;
+ }
+
+ private void setSpacer(int keyXPos, int width) {
+ mCurrentX = keyXPos + width;
+ }
+
+ 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 IllegalAttribute extends ParseException {
+ public IllegalAttribute(XmlResourceParser parser, String attribute) {
+ super("Tag " + parser.getName() + " has illegal attribute " + attribute, 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..e015b5158
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
@@ -0,0 +1,133 @@
+/*
+ * 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.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..5d3ec526a
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -0,0 +1,796 @@
+/*
+ * 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.EditorInfo;
+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.class.getSimpleName();
+ private static final boolean DEBUG = LatinImeLogger.sDBG;
+ 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 EditorInfo mAttribute;
+ 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 in option of settings
+ private boolean mSettingsKeyEnabledInSettings;
+ 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);
+ }
+
+ public void loadKeyboard(EditorInfo attribute, boolean voiceKeyEnabled,
+ boolean voiceButtonOnPrimary) {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
+ try {
+ loadKeyboardInternal(attribute, voiceKeyEnabled, voiceButtonOnPrimary, false);
+ } catch (RuntimeException e) {
+ // Get KeyboardId to record which keyboard has been failed to load.
+ final KeyboardId id = getKeyboardId(attribute, false);
+ Log.w(TAG, "loading keyboard failed: " + id, e);
+ LatinImeLogger.logOnException(id.toString(), e);
+ }
+ }
+
+ private void loadKeyboardInternal(EditorInfo attribute, boolean voiceButtonEnabled,
+ boolean voiceButtonOnPrimary, boolean isSymbols) {
+ if (mInputView == null) return;
+
+ mAttribute = attribute;
+ mVoiceKeyEnabled = voiceButtonEnabled;
+ mVoiceButtonOnPrimary = voiceButtonOnPrimary;
+ mIsSymbols = isSymbols;
+ // Update the settings key state because number of enabled IMEs could have been changed
+ mSettingsKeyEnabledInSettings = getSettingsKeyMode(mPrefs, mInputMethodService);
+ final KeyboardId id = getKeyboardId(attribute, isSymbols);
+
+ final Keyboard oldKeyboard = mInputView.getKeyboard();
+ if (oldKeyboard != null && oldKeyboard.mId.equals(id))
+ return;
+
+ makeSymbolsKeyboardIds(id.mMode, attribute);
+ mCurrentId = id;
+ mInputView.setPreviewEnabled(mInputMethodService.getPopupOn());
+ setKeyboard(getKeyboard(id));
+ }
+
+ private void setKeyboard(final Keyboard newKeyboard) {
+ final Keyboard oldKeyboard = mInputView.getKeyboard();
+ mInputView.setKeyboard(newKeyboard);
+ final boolean localeChanged = (oldKeyboard == null)
+ || !newKeyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
+ mInputMethodService.mHandler.startDisplayLanguageOnSpacebar(localeChanged);
+ }
+
+ 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.isShortcutImeReady(), null);
+ return keyboard;
+ }
+
+ private boolean hasVoiceKey(boolean isSymbols) {
+ return mVoiceKeyEnabled && (isSymbols != mVoiceButtonOnPrimary);
+ }
+
+ private boolean hasSettingsKey(EditorInfo attribute) {
+ return mSettingsKeyEnabledInSettings
+ && !Utils.inPrivateImeOptions(mInputMethodService.getPackageName(),
+ LatinIME.IME_OPTION_NO_SETTINGS_KEY, attribute);
+ }
+
+ private KeyboardId getKeyboardId(EditorInfo attribute, boolean isSymbols) {
+ final int mode = Utils.getKeyboardMode(attribute);
+ 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 boolean hasSettingsKey = hasSettingsKey(attribute);
+ final int f2KeyMode = getF2KeyMode(mPrefs, mInputMethodService, attribute);
+ final boolean clobberSettingsKey = Utils.inPrivateImeOptions(
+ mInputMethodService.getPackageName(), LatinIME.IME_OPTION_NO_SETTINGS_KEY,
+ attribute);
+ final Resources res = mInputMethodService.getResources();
+ final int orientation = res.getConfiguration().orientation;
+ final Locale locale = mSubtypeSwitcher.getInputLocale();
+ return new KeyboardId(
+ res.getResourceEntryName(xmlId), xmlId, charColorId, locale, orientation, mode,
+ attribute, hasSettingsKey, f2KeyMode, clobberSettingsKey, mVoiceKeyEnabled,
+ hasVoiceKey, enableShiftLock);
+ }
+
+ private void makeSymbolsKeyboardIds(final int mode, EditorInfo attribute) {
+ final Locale locale = mSubtypeSwitcher.getInputLocale();
+ final Resources res = mInputMethodService.getResources();
+ final int orientation = res.getConfiguration().orientation;
+ final int colorScheme = getColorScheme();
+ final boolean hasVoiceKey = mVoiceKeyEnabled && !mVoiceButtonOnPrimary;
+ final boolean hasSettingsKey = hasSettingsKey(attribute);
+ final int f2KeyMode = getF2KeyMode(mPrefs, mInputMethodService, attribute);
+ final boolean clobberSettingsKey = Utils.inPrivateImeOptions(
+ mInputMethodService.getPackageName(), LatinIME.IME_OPTION_NO_SETTINGS_KEY,
+ attribute);
+ // 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;
+ final String xmlName = res.getResourceEntryName(xmlId);
+ mSymbolsId = new KeyboardId(xmlName, xmlId, colorScheme, locale, orientation, mode,
+ attribute, hasSettingsKey, f2KeyMode, clobberSettingsKey, mVoiceKeyEnabled,
+ hasVoiceKey, true);
+ xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone_symbols : R.xml.kbd_symbols_shift;
+ mSymbolsShiftedId = new KeyboardId(xmlName, xmlId, colorScheme, locale, orientation, mode,
+ attribute, hasSettingsKey, f2KeyMode, clobberSettingsKey, mVoiceKeyEnabled,
+ hasVoiceKey, true);
+ }
+
+ public int getKeyboardMode() {
+ return mCurrentId != null ? mCurrentId.mMode : KeyboardId.MODE_TEXT;
+ }
+
+ public boolean isAlphabetMode() {
+ return mCurrentId != null && mCurrentId.isAlphabetKeyboard();
+ }
+
+ public boolean isInputViewShown() {
+ return mInputView != null && mInputView.isShown();
+ }
+
+ public boolean isKeyboardAvailable() {
+ if (mInputView != null)
+ return mInputView.getKeyboard() != null;
+ return false;
+ }
+
+ public LatinKeyboard getLatinKeyboard() {
+ if (mInputView != null) {
+ final Keyboard keyboard = mInputView.getKeyboard();
+ if (keyboard instanceof LatinKeyboard)
+ return (LatinKeyboard)keyboard;
+ }
+ return null;
+ }
+
+ 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() || isAccessibilityEnabled())
+ && !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(boolean withSliding) {
+ if (!isKeyboardAvailable())
+ return;
+ // If accessibility is enabled, disable momentary shift lock.
+ if (isAccessibilityEnabled())
+ return;
+ ShiftKeyState shiftKeyState = mShiftKeyState;
+ if (DEBUG_STATE)
+ Log.d(TAG, "onPressShift:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + shiftKeyState + " sliding=" + withSliding);
+ 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(boolean withSliding) {
+ if (!isKeyboardAvailable())
+ return;
+ // If accessibility is enabled, disable momentary shift lock.
+ if (isAccessibilityEnabled())
+ return;
+ ShiftKeyState shiftKeyState = mShiftKeyState;
+ if (DEBUG_STATE)
+ Log.d(TAG, "onReleaseShift:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + shiftKeyState + " sliding=" + withSliding);
+ if (isAlphabetMode()) {
+ if (shiftKeyState.isMomentary()) {
+ // After chording input while normal state.
+ toggleShift();
+ } else if (isShiftLocked() && !shiftKeyState.isIgnoring() && !withSliding) {
+ // Shift has been pressed without chording while caps lock state.
+ toggleCapsLock();
+ // To be able to turn off caps lock by "double tap" on shift key, we should ignore
+ // the second tap of the "double tap" from now for a while because we just have
+ // already turned off caps lock above.
+ mInputView.startIgnoringDoubleTap();
+ } else if (isShiftedOrShiftLocked() && shiftKeyState.isPressingOnShifted()
+ && !withSliding) {
+ // Shift has been pressed without chording while shifted state.
+ toggleShift();
+ } else if (isManualTemporaryUpperCaseFromAuto() && shiftKeyState.isPressing()
+ && !withSliding) {
+ // Shift has been pressed without chording while manual temporary upper case
+ // transited from automatic temporary upper case.
+ toggleShift();
+ }
+ }
+ shiftKeyState.onRelease();
+ }
+
+ public void onPressSymbol() {
+ // If accessibility is enabled, disable momentary symbol lock.
+ if (isAccessibilityEnabled())
+ return;
+ 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 accessibility is enabled, disable momentary symbol lock.
+ if (isAccessibilityEnabled())
+ return;
+ 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 accessibility is enabled, disable momentary mode locking.
+ if (isAccessibilityEnabled())
+ return;
+ 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);
+ }
+ 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(mAttribute, mVoiceKeyEnabled, mVoiceButtonOnPrimary, !mIsSymbols);
+ if (mIsSymbols) {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN;
+ } else {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
+ }
+ }
+
+ public boolean isAccessibilityEnabled() {
+ return mInputView != null && mInputView.isAccessibilityEnabled();
+ }
+
+ 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)) {
+ mSettingsKeyEnabledInSettings = 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) {
+ final Resources res = context.getResources();
+ final boolean showSettingsKeyOption = res.getBoolean(
+ R.bool.config_enable_show_settings_key_option);
+ if (showSettingsKeyOption) {
+ final String settingsKeyMode = prefs.getString(Settings.PREF_SETTINGS_KEY,
+ res.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(res.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))
+ || (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_AUTO))
+ && Utils.hasMultipleEnabledIMEsOrSubtypes(
+ ((InputMethodManager) context.getSystemService(
+ Context.INPUT_METHOD_SERVICE))))) {
+ return true;
+ }
+ return false;
+ }
+ // If the show settings key option is disabled, we always try showing the settings key.
+ return true;
+ }
+
+ private static int getF2KeyMode(SharedPreferences prefs, Context context,
+ EditorInfo attribute) {
+ final boolean clobberSettingsKey = Utils.inPrivateImeOptions(context.getPackageName(),
+ LatinIME.IME_OPTION_NO_SETTINGS_KEY, attribute);
+ final Resources res = context.getResources();
+ final String settingsKeyMode = prefs.getString(Settings.PREF_SETTINGS_KEY,
+ res.getString(DEFAULT_SETTINGS_KEY_MODE));
+ if (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_AUTO))) {
+ return clobberSettingsKey ? KeyboardId.F2KEY_MODE_SHORTCUT_IME
+ : KeyboardId.F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS;
+ } else if (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))) {
+ return clobberSettingsKey ? KeyboardId.F2KEY_MODE_NONE : KeyboardId.F2KEY_MODE_SETTINGS;
+ } else { // SETTINGS_KEY_MODE_ALWAYS_HIDE
+ return KeyboardId.F2KEY_MODE_SHORTCUT_IME;
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index fece78689..ac094e029 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.keyboard;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -22,6 +22,7 @@ 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;
@@ -29,8 +30,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;
@@ -42,134 +41,58 @@ import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewConfiguration;
import android.view.ViewGroup.LayoutParams;
+import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.TextView;
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
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";
- private static final boolean DEBUG = 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();
- }
+public class KeyboardView extends View implements PointerTracker.UIProxy {
+ private static final String TAG = KeyboardView.class.getSimpleName();
+ private static final boolean DEBUG_SHOW_ALIGN = false;
+ private static final boolean DEBUG_KEYBOARD_GRID = false;
+
+ private static final boolean ENABLE_CAPSLOCK_BY_LONGPRESS = true;
+ 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;
@@ -183,17 +106,15 @@ 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;
private int mPopupPreviewOffsetY;
private int mWindowY;
@@ -203,7 +124,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;
@@ -212,18 +133,22 @@ 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;
+ // Accessibility
+ private boolean mIsAccessibilityEnabled;
+
protected KeyDetector mKeyDetector = new ProximityKeyDetector();
// Swipe gesture detector
@@ -235,23 +160,31 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// Drawing
/** Whether the keyboard bitmap needs to be redrawn before it's blitted. **/
private boolean mDrawPending;
+ /** Notes if the keyboard just changed, so that we could possibly reallocate the mBuffer. */
+ private boolean mKeyboardChanged;
/** The dirty region in the keyboard bitmap */
private final Rect mDirtyRect = new Rect();
+ /** The key to invalidate. */
+ private Key mInvalidatedKey;
+ /** The dirty region for single key drawing */
+ private final Rect mInvalidatedKeyRect = new Rect();
/** The keyboard bitmap for faster updates */
private Bitmap mBuffer;
- /** Notes if the keyboard just changed, so that we could possibly reallocate the mBuffer. */
- private boolean mKeyboardChanged;
- private Key mInvalidatedKey;
/** The canvas for the above mutable keyboard bitmap */
private Canvas mCanvas;
private final Paint mPaint;
private final Rect mPadding;
- 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();
@@ -260,6 +193,8 @@ 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 static final int MSG_IGNORE_DOUBLE_TAP = 6;
private boolean mInKeyRepeat;
@@ -283,6 +218,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;
+ }
}
}
@@ -326,93 +266,54 @@ 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();
- }
-
- public void cancelAllMessages() {
- cancelKeyTimers();
- cancelPopupPreview();
- cancelDismissPreview();
- }
- }
-
- 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);
- }
- }
+ cancelLongPressTimers();
+ removeMessages(MSG_IGNORE_DOUBLE_TAP);
}
- 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 startIgnoringDoubleTap() {
+ sendMessageDelayed(obtainMessage(MSG_IGNORE_DOUBLE_TAP),
+ ViewConfiguration.getDoubleTapTimeout());
}
- public void remove(PointerTracker tracker) {
- mQueue.remove(tracker);
+ public boolean isIgnoringDoubleTap() {
+ return hasMessages(MSG_IGNORE_DOUBLE_TAP);
}
- public boolean isInSlidingKeyInput() {
- for (final PointerTracker tracker : mQueue) {
- if (tracker.isInSlidingKeyInput())
- return true;
- }
- return false;
+ public void cancelAllMessages() {
+ cancelKeyTimers();
+ cancelPopupPreview();
+ cancelDismissPreview();
}
}
- 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;
@@ -422,63 +323,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;
}
}
@@ -487,7 +379,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);
@@ -498,11 +390,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);
@@ -517,43 +413,70 @@ 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())) {
+ // Detected a double tap on shift key. If we are in the ignoring double tap
+ // mode, it means we have already turned off caps lock in
+ // {@link KeyboardSwitcher#onReleaseShift} .
+ final boolean ignoringDoubleTap = mHandler.isIgnoringDoubleTap();
+ if (!ignoringDoubleTap)
+ onDoubleTapShiftKey(tracker);
return true;
}
+ // Otherwise these events should not be handled as double tap.
+ mProcessingShiftDoubleTapEvent = false;
}
- return false;
+ return mProcessingShiftDoubleTapEvent;
}
};
@@ -566,7 +489,12 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval);
}
- public void setOnKeyboardActionListener(OnKeyboardActionListener listener) {
+ public void startIgnoringDoubleTap() {
+ if (ENABLE_CAPSLOCK_BY_DOUBLETAP)
+ mHandler.startIgnoringDoubleTap();
+ }
+
+ public void setOnKeyboardActionListener(KeyboardActionListener listener) {
mKeyboardActionListener = listener;
for (PointerTracker tracker : mPointerTrackers) {
tracker.setOnKeyboardActionListener(listener);
@@ -574,10 +502,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;
}
@@ -599,15 +527,13 @@ 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);
+ mKeyDetector.setProximityThreshold(KeyDetector.getMostCommonKeyWidth(keyboard));
mMiniKeyboardCache.clear();
}
@@ -621,39 +547,34 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
/**
- * Return whether the device has distinct multi-touch panel.
+ * Returns 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
+ * Enables or disables accessibility.
+ * @param accessibilityEnabled whether or not to enable accessibility
*/
- public boolean setShifted(boolean shifted) {
- if (mKeyboard != null) {
- if (mKeyboard.setShifted(shifted)) {
- // The whole keyboard probably needs to be redrawn
- invalidateAllKeys();
- return true;
- }
+ public void setAccessibilityEnabled(boolean accessibilityEnabled) {
+ mIsAccessibilityEnabled = accessibilityEnabled;
+
+ // Propagate this change to all existing pointer trackers.
+ for (PointerTracker tracker : mPointerTrackers) {
+ tracker.setAccessibilityEnabled(accessibilityEnabled);
}
- 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.
+ * Returns whether the device has accessibility enabled.
+ * @return true if the device has accessibility enabled.
*/
- public boolean isShifted() {
- if (mKeyboard != null) {
- return mKeyboard.isShifted();
- }
- return false;
+ @Override
+ public boolean isAccessibilityEnabled() {
+ return mIsAccessibilityEnabled;
}
/**
@@ -675,12 +596,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) {
@@ -690,7 +607,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,18 +623,10 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return mKeyDetector.isProximityCorrectionEnabled();
}
- protected Locale getKeyboardLocale() {
- if (mKeyboard instanceof LatinKeyboard) {
- return ((LatinKeyboard)mKeyboard).getInputLocale();
- } else {
- return getContext().getResources().getConfiguration().locale;
- }
- }
-
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))) {
- return label.toString().toUpperCase(getKeyboardLocale());
+ return label.toString().toUpperCase();
}
return label;
}
@@ -738,33 +647,6 @@ 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.
- * @param keyboard
- */
- 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;
- }
- if (dimensionSum < 0 || length == 0) return;
- mKeyDetector.setProximityThreshold((int) (dimensionSum * 1.4f / length));
- }
-
- @Override
- public void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
- // Release the buffer, if any and it will be reallocated on the next draw
- mBuffer = null;
- }
-
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
@@ -775,17 +657,17 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
private void onBufferDraw() {
+ final int width = getWidth();
+ final int height = getHeight();
+ if (width == 0 || height == 0)
+ return;
if (mBuffer == null || mKeyboardChanged) {
- if (mBuffer == null || mKeyboardChanged &&
- (mBuffer.getWidth() != getWidth() || mBuffer.getHeight() != getHeight())) {
- // Make sure our bitmap is at least 1x1
- final int width = Math.max(1, getWidth());
- final int height = Math.max(1, getHeight());
- mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- mCanvas = new Canvas(mBuffer);
- }
- invalidateAllKeys();
mKeyboardChanged = false;
+ mDirtyRect.union(0, 0, width, height);
+ }
+ if (mBuffer == null || mBuffer.getWidth() != width || mBuffer.getHeight() != height) {
+ mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ mCanvas = new Canvas(mBuffer);
}
final Canvas canvas = mCanvas;
canvas.clipRect(mDirtyRect, Op.REPLACE);
@@ -794,159 +676,255 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
final Paint paint = mPaint;
final Drawable keyBackground = mKeyBackground;
- final Rect clipRegion = mClipRegion;
final Rect padding = mPadding;
final int kbdPaddingLeft = getPaddingLeft();
final int kbdPaddingTop = getPaddingTop();
final Key[] keys = mKeys;
- final Key invalidKey = mInvalidatedKey;
-
- 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) {
- drawSingleKey = true;
- }
- }
+ final boolean isManualTemporaryUpperCase = mKeyboard.isManualTemporaryUpperCase();
+ final boolean drawSingleKey = (mInvalidatedKey != null
+ && mInvalidatedKeyRect.contains(mDirtyRect));
+
canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR);
final int keyCount = keys.length;
for (int i = 0; i < keyCount; i++) {
final Key key = keys[i];
- if (drawSingleKey && invalidKey != key) {
+ if (drawSingleKey && key != mInvalidatedKey) {
continue;
}
int[] drawableState = key.getCurrentDrawableState();
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) {
+ if (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
- 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);
+ if (key.mEnabled) {
+ // Set a drop shadow for the text
+ paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor);
+ } else {
+ // Make label invisible
+ paint.setColor(Color.TRANSPARENT);
+ }
+ 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());
}
- canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop);
+ 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.mX - kbdPaddingLeft, -key.mY - kbdPaddingTop);
}
- mInvalidatedKey = null;
+
+ // TODO: Move this function to ProximityInfo for getting rid of public declarations for
+ // GRID_WIDTH and GRID_HEIGHT
+ 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);
+ }
+
// 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);
+ canvas.drawRect(0, 0, width, height, paint);
}
- if (DEBUG) {
- if (mShowTouchPoints) {
- for (PointerTracker tracker : mPointerTrackers) {
- int startX = tracker.getStartX();
- int startY = tracker.getStartY();
- int lastX = tracker.getLastX();
- int lastY = tracker.getLastY();
- paint.setAlpha(128);
- paint.setColor(0xFFFF0000);
- canvas.drawCircle(startX, startY, 3, paint);
- canvas.drawLine(startX, startY, lastX, lastY, paint);
- paint.setColor(0xFF0000FF);
- canvas.drawCircle(lastX, lastY, 3, paint);
- paint.setColor(0xFF00FF00);
- canvas.drawCircle((startX + lastX) / 2, (startY + lastY) / 2, 2, paint);
- }
+ mInvalidatedKey = null;
+ mDrawPending = false;
+ 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;
+ }
- mDrawPending = false;
- mDirtyRect.setEmpty();
+ 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) {
@@ -955,29 +933,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();
@@ -986,8 +970,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) {
@@ -1001,7 +985,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];
@@ -1009,21 +993,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;
@@ -1049,16 +1038,16 @@ 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());
+ mInvalidatedKeyRect.set(0, 0, key.mWidth, key.mHeight);
+ mInvalidatedKeyRect.offset(key.mX + getPaddingLeft(), key.mY + getPaddingTop());
+ mDirtyRect.union(mInvalidatedKeyRect);
onBufferDraw();
- invalidate(key.x + getPaddingLeft(), key.y + getPaddingTop(),
- key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop());
+ invalidate(mInvalidatedKeyRect);
}
private boolean openPopupIfRequired(int keyIndex, PointerTracker tracker) {
@@ -1070,7 +1059,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;
@@ -1081,61 +1070,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(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.
}
- public void onPress(int primaryCode) {
- mKeyboardActionListener.onPress(primaryCode);
+ @Override
+ public void onPress(int primaryCode, boolean withSliding) {
+ mKeyboardActionListener.onPress(primaryCode, withSliding);
}
- public void onRelease(int primaryCode) {
- mKeyboardActionListener.onRelease(primaryCode);
+ @Override
+ public void onRelease(int primaryCode, boolean withSliding) {
+ mKeyboardActionListener.onRelease(primaryCode, withSliding);
}
});
// 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, mKeyboard).build();
+ miniKeyboardView.setKeyboard(keyboard);
+ miniKeyboardView.mMiniKeyboardParent = this;
container.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
@@ -1143,18 +1138,6 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return container;
}
- private static boolean isOneRowKeys(List<Key> keys) {
- if (keys.size() == 0) return false;
- final int edgeFlags = keys.get(0).edgeFlags;
- // 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;
- }
-
/**
* Called when a key is long pressed. By default this will open any popup keyboard associated
* with this key through the attributes popupLayout and popupCharacters.
@@ -1162,11 +1145,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);
@@ -1174,120 +1154,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 keyboardLeft = pointX - miniKeyboard.getDefaultCoordX() + getPaddingLeft();
+ final int popupX = Math.max(0, Math.min(keyboardLeft,
+ mMiniKeyboardParent.getWidth() - miniKeyboard.getMinWidth()))
+ - container.getPaddingLeft() + mWindowOffset[0];
+ final int popupY = popupKey.mY - mKeyboard.getVerticalGap() + getPaddingTop()
+ - (container.getMeasuredHeight() - container.getPaddingBottom()) + mWindowOffset[1];
final int x = popupX;
- final int y = mShowPreview && isOneRowKeys(miniKeys) ? mPopupPreviewDisplayedY : popupY;
+ final int y = mShowPreview && miniKeyboard.isOneRowKeys()
+ ? 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);
@@ -1296,14 +1207,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);
@@ -1313,8 +1224,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();
}
@@ -1334,15 +1245,18 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// TODO: cleanup this code into a multi-touch to single-touch event converter class?
// If the device does not have distinct multi-touch support panel, ignore all multi-touch
// events except a transition from/to single-touch.
- if (!mHasDistinctMultitouch && pointerCount > 1 && oldPointerCount > 1) {
+ if ((!mHasDistinctMultitouch || mIsAccessibilityEnabled)
+ && pointerCount > 1 && oldPointerCount > 1) {
return true;
}
// Track the last few movements to look for spurious swipes.
mSwipeTracker.addMovement(me);
- // Gesture detector must be enabled only when mini-keyboard is not on the screen.
- if (mMiniKeyboard == null
+ // Gesture detector must be enabled only when mini-keyboard is not on the screen and
+ // accessibility is not enabled.
+ // TODO: Reconcile gesture detection and accessibility features.
+ if (mMiniKeyboardView == null && !mIsAccessibilityEnabled
&& mGestureDetector != null && mGestureDetector.onTouchEvent(me)) {
dismissKeyPreview();
mHandler.cancelKeyTimers();
@@ -1357,14 +1271,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;
@@ -1387,19 +1301,19 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// TODO: cleanup this code into a multi-touch to single-touch event converter class?
// Translate mutli-touch event to single-touch events on the device that has no distinct
// multi-touch panel.
- if (!mHasDistinctMultitouch) {
+ if (!mHasDistinctMultitouch || mIsAccessibilityEnabled) {
// Use only main (id=0) pointer tracker.
PointerTracker tracker = getPointerTracker(0);
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 + ")");
@@ -1407,24 +1321,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;
}
}
@@ -1432,53 +1347,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() {
@@ -1486,9 +1356,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
@@ -1500,7 +1375,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..5820049bb
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
@@ -0,0 +1,390 @@
+/*
+ * 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.Resources.Theme;
+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 java.util.List;
+import java.util.Locale;
+
+// TODO: We should remove this class
+public class LatinKeyboard extends Keyboard {
+ 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 static final float SPACEBAR_DRAG_THRESHOLD = 0.8f;
+ // 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) {
+ if (mSpaceKey == null)
+ return;
+ 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(mContext.getTheme(), 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 keyReleased() {
+ mCurrentlyInSpace = false;
+ mSpaceDragLastDiff = 0;
+ 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;
+ }
+ }
+ }
+
+ // Lock into the spacebar
+ if (mCurrentlyInSpace) return false;
+
+ return key.isOnKey(x, y);
+ }
+
+ @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 static int getTextSizeFromTheme(Theme theme, int style, int defValue) {
+ TypedArray array = theme.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..77e9caecc
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -0,0 +1,269 @@
+/*
+ * 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);
+ }
+ }
+
+ @Override
+ public void setKeyboard(Keyboard 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;
+ }
+
+ private 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) {
+ // If device has distinct multi touch panel, there is no need to check sudden jump.
+ if (hasDistinctMultitouch())
+ return false;
+ // If accessibiliy is enabled, stop looking for sudden jumps because it interferes
+ // with touch exploration of the keyboard.
+ if (isAccessibilityEnabled())
+ return false;
+ 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/keyboard/MiniKeyboard.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
new file mode 100644
index 000000000..8d243e0a7
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
@@ -0,0 +1,51 @@
+/*
+ * 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.keyboard;
+
+import android.content.Context;
+
+import java.util.List;
+
+public class MiniKeyboard extends Keyboard {
+ private int mDefaultKeyCoordX;
+
+ public MiniKeyboard(Context context, int xmlLayoutResId, KeyboardId id) {
+ super(context, xmlLayoutResId, id);
+ }
+
+ public void setDefaultCoordX(int pos) {
+ mDefaultKeyCoordX = pos;
+ }
+
+ public int getDefaultCoordX() {
+ return mDefaultKeyCoordX;
+ }
+
+ public boolean isOneRowKeys() {
+ final List<Key> keys = getKeys();
+ if (keys.size() == 0) return false;
+ 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;
+ }
+}
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..765750fbe
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
@@ -0,0 +1,245 @@
+/*
+ * 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.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 int mTopRowAdjustment;
+ 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);
+ mKeyWidth = keyWidth;
+ mRowHeight = rowHeight;
+
+ final int numRows = (numKeys + maxColumns - 1) / maxColumns;
+ mNumRows = numRows;
+ final int numColumns = getOptimizedColumns(numKeys, maxColumns);
+ mNumColumns = numColumns;
+
+ 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);
+ int leftKeys, rightKeys;
+ if (numLeftKeys > maxLeftKeys) {
+ leftKeys = maxLeftKeys;
+ rightKeys = numColumns - maxLeftKeys;
+ } else if (numRightKeys > maxRightKeys) {
+ leftKeys = numColumns - maxRightKeys;
+ rightKeys = maxRightKeys;
+ } else {
+ leftKeys = numLeftKeys;
+ rightKeys = numRightKeys;
+ }
+ // Shift right if the left edge of mini keyboard is on the edge of parent keyboard
+ // unless the parent key is on the left edge.
+ if (leftKeys * keyWidth >= coordXInParent && leftKeys > 0) {
+ leftKeys--;
+ rightKeys++;
+ }
+ // Shift left if the right edge of mini keyboard is on the edge of parent keyboard
+ // unless the parent key is on the right edge.
+ if (rightKeys * keyWidth + coordXInParent >= parentKeyboardWidth && rightKeys > 1) {
+ leftKeys++;
+ rightKeys--;
+ }
+ mLeftKeys = leftKeys;
+ mRightKeys = rightKeys;
+
+ // Centering of the top row.
+ final boolean onEdge = (leftKeys == 0 || rightKeys == 1);
+ if (numRows < 2 || onEdge || getTopRowEmptySlots(numKeys, numColumns) % 2 == 0) {
+ mTopRowAdjustment = 0;
+ } else if (mLeftKeys < mRightKeys - 1) {
+ mTopRowAdjustment = 1;
+ } else {
+ mTopRowAdjustment = -1;
+ }
+ }
+
+ // 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;
+ }
+
+ private static int getTopRowEmptySlots(int numKeys, int numColumns) {
+ final int remainingKeys = numKeys % numColumns;
+ if (remainingKeys == 0) {
+ return 0;
+ } else {
+ return numColumns - remainingKeys;
+ }
+ }
+
+ private int getOptimizedColumns(int numKeys, int maxColumns) {
+ int numColumns = Math.min(numKeys, maxColumns);
+ while (getTopRowEmptySlots(numKeys, numColumns) >= mNumRows) {
+ numColumns--;
+ }
+ return numColumns;
+ }
+
+ public int getDefaultKeyCoordX() {
+ return mLeftKeys * mKeyWidth;
+ }
+
+ public int getX(int n, int row) {
+ final int x = getColumnPos(n) * mKeyWidth + getDefaultKeyCoordX();
+ if (isTopRow(row)) {
+ return x + mTopRowAdjustment * (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 (isTopRow(row)) rowFlags |= Keyboard.EDGE_BOTTOM;
+ return rowFlags;
+ }
+
+ private boolean isTopRow(int rowCount) {
+ return rowCount == mNumRows - 1;
+ }
+ }
+
+ public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key parentKey,
+ Keyboard parentKeyboard) {
+ final Context context = view.getContext();
+ mRes = context.getResources();
+ final MiniKeyboard keyboard = new MiniKeyboard(context, layoutTemplateResId, null);
+ mKeyboard = keyboard;
+ mPopupCharacters = parentKey.mPopupCharacters;
+
+ final int keyWidth = getMaxKeyWidth(view, mPopupCharacters, keyboard.getKeyWidth());
+ final MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+ mPopupCharacters.length, parentKey.mMaxPopupColumn,
+ keyWidth, parentKeyboard.getRowHeight(),
+ parentKey.mX + (parentKey.mWidth + parentKey.mGap) / 2 - keyWidth / 2,
+ view.getMeasuredWidth());
+ mParams = params;
+
+ keyboard.setRowHeight(params.mRowHeight);
+ keyboard.setHeight(params.mNumRows * params.mRowHeight);
+ 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.mRowHeight, 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..1243f6f37 100644
--- a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -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;
@@ -37,23 +35,24 @@ class MiniKeyboardKeyDetector extends KeyDetector {
}
@Override
- public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) {
+ public int getKeyIndexAndNearbyCodes(int x, int y, final int[] allCodes) {
final Key[] keys = getKeys();
final int touchX = getTouchX(x);
final int touchY = getTouchY(y);
- int closestKeyIndex = LatinKeyboardBaseView.NOT_A_KEY;
- int closestKeyDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare;
+
+ int nearestIndex = NOT_A_KEY;
+ int nearestDist = (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);
- if (dist < closestKeyDist) {
- closestKeyIndex = i;
- closestKeyDist = dist;
+ for (int index = 0; index < keyCount; index++) {
+ final int dist = keys[index].squaredDistanceToEdge(touchX, touchY);
+ if (dist < nearestDist) {
+ nearestIndex = index;
+ nearestDist = dist;
}
}
- if (allKeys != null && closestKeyIndex != LatinKeyboardBaseView.NOT_A_KEY)
- allKeys[0] = keys[closestKeyIndex].codes[0];
- return closestKeyIndex;
+
+ if (allCodes != null && nearestIndex != NOT_A_KEY)
+ allCodes[0] = keys[nearestIndex].mCode;
+ return nearestIndex;
}
}
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..ebbc79a9e
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
@@ -0,0 +1,83 @@
+/*
+ * 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.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..4b3fe8b8b
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -0,0 +1,617 @@
+/*
+ * 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.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 boolean isAccessibilityEnabled();
+ }
+
+ 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 accessibility is enabled in the parent keyboard
+ private boolean mIsAccessibilityEnabled;
+
+ // 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, boolean withSliding) {}
+ @Override
+ public void onRelease(int primaryCode, boolean withSliding) {}
+ @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);
+ mIsAccessibilityEnabled = proxy.isAccessibilityEnabled();
+ 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;
+ }
+
+ public void setAccessibilityEnabled(boolean accessibilityEnabled) {
+ mIsAccessibilityEnabled = accessibilityEnabled;
+ }
+
+ // Returns true if keyboard has been changed by this callback.
+ private boolean callListenerOnPressAndCheckKeyboardLayoutChange(Key key, boolean withSliding) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onPress : " + keyCodePrintable(key.mCode) + " sliding=" + withSliding);
+ if (key.mEnabled) {
+ mListener.onPress(key.mCode, withSliding);
+ final boolean keyboardLayoutHasBeenChanged = mKeyboardLayoutHasBeenChanged;
+ mKeyboardLayoutHasBeenChanged = false;
+ return keyboardLayoutHasBeenChanged;
+ }
+ return false;
+ }
+
+ // Note that we need primaryCode argument because the keyboard may in shifted state and the
+ // primaryCode is different from {@link Key#mCode}.
+ private void callListenerOnCodeInput(Key key, 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);
+ if (key.mEnabled)
+ mListener.onCodeInput(primaryCode, keyCodes, x, y);
+ }
+
+ private void callListenerOnTextInput(Key key) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onTextInput: text=" + key.mOutputText);
+ if (key.mEnabled)
+ mListener.onTextInput(key.mOutputText);
+ }
+
+ // Note that we need primaryCode argument because the keyboard may in shifted state and the
+ // primaryCode is different from {@link Key#mCode}.
+ private void callListenerOnRelease(Key key, int primaryCode, boolean withSliding) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onRelease : " + keyCodePrintable(primaryCode) + " sliding=" + withSliding);
+ if (key.mEnabled)
+ mListener.onRelease(primaryCode, withSliding);
+ }
+
+ 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, 3) this pointer is on mini-keyboard, or 4) accessibility is enabled.
+ mIsAllowedSlidingKeyInput = mConfigSlidingKeyInputEnabled || isModifierInternal(keyIndex)
+ || mKeyDetector instanceof MiniKeyboardKeyDetector
+ || mIsAccessibilityEnabled;
+ 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], false))
+ keyIndex = mKeyState.onDownKey(x, y, eventTime);
+ }
+ if (isValidKeyIndex(keyIndex)) {
+ // Accessibility disables key repeat because users may need to pause on a key to hear
+ // its spoken description.
+ if (mKeys[keyIndex].mRepeatable && !mIsAccessibilityEnabled) {
+ 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), true))
+ 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, oldKey.mCode, true);
+ 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), true))
+ 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, oldKey.mCode, true);
+ 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();
+ }
+
+ 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 accessibility is turned on, the modifier key should be shown as
+ // preview.
+ if (mHasDistinctMultitouch && isModifier() && !mIsAccessibilityEnabled) {
+ mProxy.showPreview(NOT_A_KEY, this);
+ } else {
+ mProxy.showPreview(keyIndex, this);
+ }
+ }
+
+ private void startLongPressTimer(int keyIndex) {
+ // Accessibility disables long press because users are likely to need to pause on a key
+ // for an unspecified duration in order to hear the key's spoken description.
+ if (mIsAccessibilityEnabled) {
+ return;
+ }
+ 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);
+ callListenerOnRelease(key, key.mCode, false);
+ } 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;
+ }
+ callListenerOnCodeInput(key, code, codes, x, y);
+ callListenerOnRelease(key, code, false);
+ }
+ }
+
+ 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..64ba80a04
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
@@ -0,0 +1,97 @@
+/*
+ * 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.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 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 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) {
+ 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..01d9b5d2c
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java
@@ -0,0 +1,84 @@
+/*
+ * 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.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..ff78ee5c9
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
@@ -0,0 +1,176 @@
+/*
+ * 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.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/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
new file mode 100644
index 000000000..33acc6907
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
@@ -0,0 +1,80 @@
+/*
+ * 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.keyboard;
+
+import com.android.inputmethod.latin.Utils;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class ProximityInfo {
+ public static final int MAX_PROXIMITY_CHARS_SIZE = 16;
+
+ private final int mGridWidth;
+ private final int mGridHeight;
+ private final int mGridSize;
+
+ ProximityInfo(int gridWidth, int gridHeight) {
+ mGridWidth = gridWidth;
+ mGridHeight = gridHeight;
+ mGridSize = mGridWidth * mGridHeight;
+ }
+
+ private int mNativeProximityInfo;
+ static {
+ Utils.loadNativeLibrary();
+ }
+ private native int setProximityInfoNative(int maxProximityCharsSize, int displayWidth,
+ int displayHeight, int gridWidth, int gridHeight, int[] proximityCharsArray);
+ private native void releaseProximityInfoNative(int nativeProximityInfo);
+
+ public final void setProximityInfo(int[][] gridNeighborKeyIndexes, int keyboardWidth,
+ int keyboardHeight, List<Key> keys) {
+ int[] proximityCharsArray = new int[mGridSize * MAX_PROXIMITY_CHARS_SIZE];
+ Arrays.fill(proximityCharsArray, KeyDetector.NOT_A_CODE);
+ for (int i = 0; i < mGridSize; ++i) {
+ final int proximityCharsLength = gridNeighborKeyIndexes[i].length;
+ for (int j = 0; j < proximityCharsLength; ++j) {
+ proximityCharsArray[i * MAX_PROXIMITY_CHARS_SIZE + j] =
+ keys.get(gridNeighborKeyIndexes[i][j]).mCode;
+ }
+ }
+ mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE,
+ keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, proximityCharsArray);
+ }
+
+ // TODO: Get rid of this function's input (keyboard).
+ public int getNativeProximityInfo(Keyboard keyboard) {
+ if (mNativeProximityInfo == 0) {
+ // TODO: Move this function to ProximityInfo and make this private.
+ keyboard.computeNearestNeighbors();
+ }
+ return mNativeProximityInfo;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ if (mNativeProximityInfo != 0) {
+ releaseProximityInfoNative(mNativeProximityInfo);
+ mNativeProximityInfo = 0;
+ }
+ } finally {
+ super.finalize();
+ }
+ }
+}
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..e2ff8c48e
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java
@@ -0,0 +1,126 @@
+/*
+ * 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.keyboard;
+
+import android.util.Log;
+
+import java.util.Arrays;
+
+public class ProximityKeyDetector extends KeyDetector {
+ private static final String TAG = ProximityKeyDetector.class.getSimpleName();
+ private static final boolean DEBUG = false;
+
+ private static final int MAX_NEARBY_KEYS = 12;
+
+ // working area
+ private final int[] mDistances = new int[MAX_NEARBY_KEYS];
+ private final int[] mIndices = new int[MAX_NEARBY_KEYS];
+
+ @Override
+ protected int getMaxNearbyKeys() {
+ return MAX_NEARBY_KEYS;
+ }
+
+ private void initializeNearbyKeys() {
+ Arrays.fill(mDistances, Integer.MAX_VALUE);
+ Arrays.fill(mIndices, NOT_A_KEY);
+ }
+
+ /**
+ * Insert the key into nearby keys buffer and sort nearby keys by ascending order of distance.
+ *
+ * @param keyIndex index of the key.
+ * @param distance distance between the key's edge and user touched point.
+ * @param isOnKey true if the point is on the key.
+ * @return order of the key in the nearby buffer, 0 if it is the nearest key.
+ */
+ private int sortNearbyKeys(int keyIndex, int distance, boolean isOnKey) {
+ final int[] distances = mDistances;
+ final int[] indices = mIndices;
+ for (int insertPos = 0; insertPos < distances.length; insertPos++) {
+ final int comparingDistance = distances[insertPos];
+ if (distance < comparingDistance || (distance == comparingDistance && isOnKey)) {
+ final int nextPos = insertPos + 1;
+ if (nextPos < distances.length) {
+ System.arraycopy(distances, insertPos, distances, nextPos,
+ distances.length - nextPos);
+ System.arraycopy(indices, insertPos, indices, nextPos,
+ indices.length - nextPos);
+ }
+ distances[insertPos] = distance;
+ indices[insertPos] = keyIndex;
+ return insertPos;
+ }
+ }
+ return distances.length;
+ }
+
+ private void getNearbyKeyCodes(final int[] allCodes) {
+ final Key[] keys = getKeys();
+ final int[] indices = mIndices;
+
+ // allCodes[0] should always have the key code even if it is a non-letter key.
+ if (indices[0] == NOT_A_KEY) {
+ allCodes[0] = NOT_A_CODE;
+ return;
+ }
+
+ int numCodes = 0;
+ for (int j = 0; j < indices.length && numCodes < allCodes.length; j++) {
+ final int index = indices[j];
+ if (index == NOT_A_KEY)
+ break;
+ final int code = keys[index].mCode;
+ // filter out a non-letter key from nearby keys
+ if (code < Keyboard.CODE_SPACE)
+ continue;
+ allCodes[numCodes++] = code;
+ }
+ }
+
+ @Override
+ public int getKeyIndexAndNearbyCodes(int x, int y, final int[] allCodes) {
+ final Key[] keys = getKeys();
+ final int touchX = getTouchX(x);
+ final int touchY = getTouchY(y);
+
+ initializeNearbyKeys();
+ int primaryIndex = NOT_A_KEY;
+ for (final int index : mKeyboard.getNearestKeys(touchX, touchY)) {
+ final Key key = keys[index];
+ final boolean isInside = key.isInside(touchX, touchY);
+ final int distance = key.squaredDistanceToEdge(touchX, touchY);
+ if (isInside || (mProximityCorrectOn && distance < mProximityThresholdSquare)) {
+ final int insertedPosition = sortNearbyKeys(index, distance, isInside);
+ if (insertedPosition == 0 && isInside)
+ primaryIndex = index;
+ }
+ }
+
+ if (allCodes != null && allCodes.length > 0) {
+ getNearbyKeyCodes(allCodes);
+ if (DEBUG) {
+ Log.d(TAG, "x=" + x + " y=" + y
+ + " primary="
+ + (primaryIndex == NOT_A_KEY ? "none" : keys[primaryIndex].mCode)
+ + " codes=" + Arrays.toString(allCodes));
+ }
+ }
+
+ 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..40d7e1472
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/Row.java
@@ -0,0 +1,72 @@
+/*
+ * 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.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..ba15624f0
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
@@ -0,0 +1,69 @@
+/*
+ * 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.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..ad8b0d623
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
@@ -0,0 +1,163 @@
+/*
+ * 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.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..975b13b50 100644
--- a/java/src/com/android/inputmethod/latin/SwipeTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/SwipeTracker.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -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/AccessibilityUtils.java b/java/src/com/android/inputmethod/latin/AccessibilityUtils.java
new file mode 100644
index 000000000..cd3f9e0ad
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/AccessibilityUtils.java
@@ -0,0 +1,211 @@
+/*
+ * 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.SharedPreferences;
+import android.content.res.TypedArray;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Utility functions for accessibility support.
+ */
+public class AccessibilityUtils {
+ /** Shared singleton instance. */
+ private static final AccessibilityUtils sInstance = new AccessibilityUtils();
+ private /* final */ LatinIME mService;
+ private /* final */ AccessibilityManager mAccessibilityManager;
+ private /* final */ Map<Integer, CharSequence> mDescriptions;
+
+ /**
+ * Returns a shared instance of AccessibilityUtils.
+ *
+ * @return A shared instance of AccessibilityUtils.
+ */
+ public static AccessibilityUtils getInstance() {
+ return sInstance;
+ }
+
+ /**
+ * Initializes (or re-initializes) the shared instance of AccessibilityUtils
+ * with the specified parent service and preferences.
+ *
+ * @param service The parent input method service.
+ * @param prefs The parent preferences.
+ */
+ public static void init(LatinIME service, SharedPreferences prefs) {
+ sInstance.initialize(service, prefs);
+ }
+
+ private AccessibilityUtils() {
+ // This class is not publicly instantiable.
+ }
+
+ /**
+ * Initializes (or re-initializes) with the specified parent service and
+ * preferences.
+ *
+ * @param service The parent input method service.
+ * @param prefs The parent preferences.
+ */
+ private void initialize(LatinIME service, SharedPreferences prefs) {
+ mService = service;
+ mAccessibilityManager = (AccessibilityManager) service.getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ mDescriptions = null;
+ }
+
+ /**
+ * Returns true if accessibility is enabled.
+ *
+ * @return {@code true} if accessibility is enabled.
+ */
+ public boolean isAccessibilityEnabled() {
+ return mAccessibilityManager.isEnabled();
+ }
+
+ /**
+ * Speaks a key's action after it has been released. Does not speak letter
+ * keys since typed keys are already spoken aloud by TalkBack.
+ * <p>
+ * No-op if accessibility is not enabled.
+ * </p>
+ *
+ * @param primaryCode The primary code of the released key.
+ * @param switcher The input method's {@link KeyboardSwitcher}.
+ */
+ public void onRelease(int primaryCode, KeyboardSwitcher switcher) {
+ if (!isAccessibilityEnabled()) {
+ return;
+ }
+
+ int resId = -1;
+
+ switch (primaryCode) {
+ case Keyboard.CODE_SHIFT: {
+ if (switcher.isShiftedOrShiftLocked()) {
+ resId = R.string.description_shift_on;
+ } else {
+ resId = R.string.description_shift_off;
+ }
+ break;
+ }
+
+ case Keyboard.CODE_SWITCH_ALPHA_SYMBOL: {
+ if (switcher.isAlphabetMode()) {
+ resId = R.string.description_symbols_off;
+ } else {
+ resId = R.string.description_symbols_on;
+ }
+ break;
+ }
+ }
+
+ if (resId >= 0) {
+ speakDescription(mService.getResources().getText(resId));
+ }
+ }
+
+ /**
+ * Speaks a key's description for accessibility. If a key has an explicit
+ * description defined in keycodes.xml, that will be used. Otherwise, if the
+ * key is a Unicode character, then its character will be used.
+ * <p>
+ * No-op if accessibility is not enabled.
+ * </p>
+ *
+ * @param primaryCode The primary code of the pressed key.
+ * @param switcher The input method's {@link KeyboardSwitcher}.
+ */
+ public void onPress(int primaryCode, KeyboardSwitcher switcher) {
+ if (!isAccessibilityEnabled()) {
+ return;
+ }
+
+ // TODO Use the current keyboard state to read "Switch to symbols"
+ // instead of just "Symbols" (and similar for shift key).
+ CharSequence description = describeKey(primaryCode);
+ if (description == null && Character.isDefined((char) primaryCode)) {
+ description = Character.toString((char) primaryCode);
+ }
+
+ if (description != null) {
+ speakDescription(description);
+ }
+ }
+
+ /**
+ * Returns a text description for a given key code. If the key does not have
+ * an explicit description, returns <code>null</code>.
+ *
+ * @param keyCode An integer key code.
+ * @return A {@link CharSequence} describing the key or <code>null</code> if
+ * no description is available.
+ */
+ private CharSequence describeKey(int keyCode) {
+ // If not loaded yet, load key descriptions from XML file.
+ if (mDescriptions == null) {
+ mDescriptions = loadDescriptions();
+ }
+
+ return mDescriptions.get(keyCode);
+ }
+
+ /**
+ * Loads key descriptions from resources.
+ */
+ private Map<Integer, CharSequence> loadDescriptions() {
+ final Map<Integer, CharSequence> descriptions = new HashMap<Integer, CharSequence>();
+ final TypedArray array = mService.getResources().obtainTypedArray(R.array.key_descriptions);
+
+ // Key descriptions are stored as a key code followed by a string.
+ for (int i = 0; i < array.length() - 1; i += 2) {
+ int code = array.getInteger(i, 0);
+ CharSequence desc = array.getText(i + 1);
+
+ descriptions.put(code, desc);
+ }
+
+ array.recycle();
+
+ return descriptions;
+ }
+
+ /**
+ * Sends a character sequence to be read aloud.
+ *
+ * @param description The {@link CharSequence} to be read aloud.
+ */
+ private void speakDescription(CharSequence description) {
+ // TODO We need to add an AccessibilityEvent type for IMEs.
+ final AccessibilityEvent event = AccessibilityEvent.obtain(
+ AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
+ event.setPackageName(mService.getPackageName());
+ event.setClassName(getClass().getName());
+ event.setAddedCount(description.length());
+ event.getText().add(description);
+
+ mAccessibilityManager.sendAccessibilityEvent(event);
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/AutoCorrection.java b/java/src/com/android/inputmethod/latin/AutoCorrection.java
new file mode 100644
index 000000000..092f7ad63
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/AutoCorrection.java
@@ -0,0 +1,143 @@
+/*
+ * 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.text.TextUtils;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+public class AutoCorrection {
+ private static final boolean DBG = LatinImeLogger.sDBG;
+ private static final String TAG = AutoCorrection.class.getSimpleName();
+ private boolean mHasAutoCorrection;
+ private CharSequence mAutoCorrectionWord;
+ private double mNormalizedScore;
+
+ public void init() {
+ mHasAutoCorrection = false;
+ mAutoCorrectionWord = null;
+ mNormalizedScore = Integer.MIN_VALUE;
+ }
+
+ public boolean hasAutoCorrection() {
+ return mHasAutoCorrection;
+ }
+
+ public CharSequence getAutoCorrectionWord() {
+ return mAutoCorrectionWord;
+ }
+
+ public double getNormalizedScore() {
+ return mNormalizedScore;
+ }
+
+ public void updateAutoCorrectionStatus(Map<String, Dictionary> dictionaries,
+ WordComposer wordComposer, ArrayList<CharSequence> suggestions, int[] priorities,
+ CharSequence typedWord, double autoCorrectionThreshold, int correctionMode,
+ CharSequence quickFixedWord, CharSequence whitelistedWord) {
+ if (hasAutoCorrectionForWhitelistedWord(whitelistedWord)) {
+ mHasAutoCorrection = true;
+ mAutoCorrectionWord = whitelistedWord;
+ } else if (hasAutoCorrectionForTypedWord(
+ dictionaries, wordComposer, suggestions, typedWord, correctionMode)) {
+ mHasAutoCorrection = true;
+ mAutoCorrectionWord = typedWord;
+ } else if (hasAutoCorrectionForQuickFix(quickFixedWord)) {
+ mHasAutoCorrection = true;
+ mAutoCorrectionWord = quickFixedWord;
+ } else if (hasAutoCorrectionForBinaryDictionary(wordComposer, suggestions, correctionMode,
+ priorities, typedWord, autoCorrectionThreshold)) {
+ mHasAutoCorrection = true;
+ mAutoCorrectionWord = suggestions.get(0);
+ }
+ }
+
+ public static boolean isValidWord(
+ Map<String, Dictionary> dictionaries, CharSequence word, boolean ignoreCase) {
+ if (TextUtils.isEmpty(word)) {
+ return false;
+ }
+ final CharSequence lowerCasedWord = word.toString().toLowerCase();
+ for (final String key : dictionaries.keySet()) {
+ if (key.equals(Suggest.DICT_KEY_WHITELIST)) continue;
+ final Dictionary dictionary = dictionaries.get(key);
+ if (dictionary.isValidWord(word)
+ || (ignoreCase && dictionary.isValidWord(lowerCasedWord))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean isValidWordForAutoCorrection(
+ Map<String, Dictionary> dictionaries, CharSequence word, boolean ignoreCase) {
+ final Dictionary whiteList = dictionaries.get(Suggest.DICT_KEY_WHITELIST);
+ // If "word" is in the whitelist dictionary, it should not be auto corrected.
+ if (whiteList != null && whiteList.isValidWord(word)) {
+ return false;
+ }
+ return isValidWord(dictionaries, word, ignoreCase);
+ }
+
+ private static boolean hasAutoCorrectionForWhitelistedWord(CharSequence whiteListedWord) {
+ return whiteListedWord != null;
+ }
+
+ private boolean hasAutoCorrectionForTypedWord(Map<String, Dictionary> dictionaries,
+ WordComposer wordComposer, ArrayList<CharSequence> suggestions, CharSequence typedWord,
+ int correctionMode) {
+ if (TextUtils.isEmpty(typedWord)) return false;
+ boolean isValidWord = isValidWordForAutoCorrection(dictionaries, typedWord, false);
+ return wordComposer.size() > 1 && suggestions.size() > 0 && isValidWord
+ && (correctionMode == Suggest.CORRECTION_FULL
+ || correctionMode == Suggest.CORRECTION_FULL_BIGRAM);
+ }
+
+ private static boolean hasAutoCorrectionForQuickFix(CharSequence quickFixedWord) {
+ return quickFixedWord != null;
+ }
+
+ private boolean hasAutoCorrectionForBinaryDictionary(WordComposer wordComposer,
+ ArrayList<CharSequence> suggestions, int correctionMode, int[] priorities,
+ CharSequence typedWord, double autoCorrectionThreshold) {
+ if (wordComposer.size() > 1 && (correctionMode == Suggest.CORRECTION_FULL
+ || correctionMode == Suggest.CORRECTION_FULL_BIGRAM)
+ && typedWord != null && suggestions.size() > 0 && priorities.length > 0) {
+ final CharSequence autoCorrectionCandidate = suggestions.get(0);
+ final int autoCorrectionCandidateScore = priorities[0];
+ // TODO: when the normalized score of the first suggestion is nearly equals to
+ // the normalized score of the second suggestion, behave less aggressive.
+ mNormalizedScore = Utils.calcNormalizedScore(
+ typedWord,autoCorrectionCandidate, autoCorrectionCandidateScore);
+ if (DBG) {
+ Log.d(TAG, "Normalized " + typedWord + "," + autoCorrectionCandidate + ","
+ + autoCorrectionCandidateScore + ", " + mNormalizedScore
+ + "(" + autoCorrectionThreshold + ")");
+ }
+ if (mNormalizedScore >= autoCorrectionThreshold) {
+ if (DBG) {
+ Log.d(TAG, "Auto corrected by S-threshold.");
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/java/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/AutoDictionary.java
index 4fbb5b012..54c6f309c 100644
--- a/java/src/com/android/inputmethod/latin/AutoDictionary.java
+++ b/java/src/com/android/inputmethod/latin/AutoDictionary.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -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,11 @@ import android.os.AsyncTask;
import android.provider.BaseColumns;
import android.util.Log;
+import java.util.HashMap;
+import java.util.Map;
+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 +99,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 +139,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 +226,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..08ddd25fa 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,17 @@
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 com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.keyboard.ProximityInfo;
import android.content.Context;
+import android.content.res.AssetFileDescriptor;
import android.util.Log;
+import java.io.File;
+import java.util.Arrays;
+
/**
* Implements a static, compacted, binary dictionary of standard words.
*/
@@ -37,123 +38,133 @@ public class BinaryDictionary extends Dictionary {
* It is necessary to keep it at this value because some languages e.g. German have
* really long words.
*/
- protected static final int MAX_WORD_LENGTH = 48;
+ public static final int MAX_WORD_LENGTH = 48;
+ public static final int MAX_WORDS = 18;
private static final String TAG = "BinaryDictionary";
- private static final int MAX_ALTERNATIVES = 16;
- private static final int MAX_WORDS = 18;
+ private static final int MAX_PROXIMITY_CHARS_SIZE = ProximityInfo.MAX_PROXIMITY_CHARS_SIZE;
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_PROXIMITY_CHARS_SIZE];
+ 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");
+ private final KeyboardSwitcher mKeyboardSwitcher = KeyboardSwitcher.getInstance();
+ private final SubtypeSwitcher mSubtypeSwitcher = SubtypeSwitcher.getInstance();
+
+ private static class Flags {
+ private static class FlagEntry {
+ public final String mName;
+ public final int mValue;
+ public FlagEntry(String name, int value) {
+ mName = name;
+ mValue = value;
+ }
}
+ public static final FlagEntry[] ALL_FLAGS = {
+ // Here should reside all flags that trigger some special processing
+ // These *must* match the definition in UnigramDictionary enum in
+ // unigram_dictionary.h so please update both at the same time.
+ new FlagEntry("requiresGermanUmlautProcessing", 0x1)
+ };
+ }
+ private int mFlags = 0;
+
+ private BinaryDictionary() {
}
/**
- * Create a dictionary from a raw resource file
+ * Initialize a dictionary from a raw resource file
* @param context application context for reading resources
* @param resId the resource containing the raw binary dictionary
+ * @return initialized instance of BinaryDictionary
*/
- public BinaryDictionary(Context context, int[] resId, int dicTypeId) {
- if (resId != null && resId.length > 0 && resId[0] != 0) {
- loadDictionary(context, resId);
+ public static BinaryDictionary initDictionary(Context context, int resId, int dicTypeId) {
+ synchronized (sInstance) {
+ sInstance.closeInternal();
+ try {
+ final AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId);
+ if (afd == null) {
+ Log.e(TAG, "Found the resource but it is compressed. resId=" + resId);
+ return null;
+ }
+ final String sourceDir = context.getApplicationInfo().sourceDir;
+ final File packagePath = new File(sourceDir);
+ // TODO: Come up with a way to handle a directory.
+ if (!packagePath.isFile()) {
+ Log.e(TAG, "sourceDir is not a file: " + sourceDir);
+ return null;
+ }
+ sInstance.loadDictionary(sourceDir, afd.getStartOffset(), afd.getLength());
+ sInstance.mDicTypeId = dicTypeId;
+ } catch (android.content.res.Resources.NotFoundException e) {
+ Log.e(TAG, "Could not find the resource. resId=" + resId);
+ return null;
+ }
}
- mDicTypeId = dicTypeId;
+ sInstance.initFlags();
+ return sInstance;
}
- /**
- * Create a dictionary from a byte buffer. This is used for testing.
- * @param context application context for reading resources
- * @param byteBuffer a ByteBuffer containing the binary dictionary
- */
- public BinaryDictionary(Context context, ByteBuffer byteBuffer, int dicTypeId) {
- if (byteBuffer != null) {
- if (byteBuffer.isDirect()) {
- mNativeDictDirectBuffer = byteBuffer;
+ /* package for test */ static BinaryDictionary initDictionary(File dictionary, long startOffset,
+ long length, int dicTypeId) {
+ synchronized (sInstance) {
+ sInstance.closeInternal();
+ if (dictionary.isFile()) {
+ sInstance.loadDictionary(dictionary.getAbsolutePath(), startOffset, length);
+ sInstance.mDicTypeId = dicTypeId;
} else {
- mNativeDictDirectBuffer = ByteBuffer.allocateDirect(byteBuffer.capacity());
- byteBuffer.rewind();
- mNativeDictDirectBuffer.put(byteBuffer);
+ Log.e(TAG, "Could not find the file. path=" + dictionary.getAbsolutePath());
+ return null;
}
- mDictLength = byteBuffer.capacity();
- mNativeDict = openNative(mNativeDictDirectBuffer,
- TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER);
}
- mDicTypeId = dicTypeId;
+ return sInstance;
+ }
+
+ private void initFlags() {
+ int flags = 0;
+ for (Flags.FlagEntry entry : Flags.ALL_FLAGS) {
+ if (mSubtypeSwitcher.currentSubtypeContainsExtraValueKey(entry.mName))
+ flags |= entry.mValue;
+ }
+ mFlags = flags;
}
- private native int openNative(ByteBuffer bb, int typedLetterMultiplier,
- int fullWordMultiplier);
+ static {
+ Utils.loadNativeLibrary();
+ }
+
+ 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 proximityInfo, int[] xCoordinates,
+ int[] yCoordinates, int[] inputCodes, int codesSize, int flags, char[] outputChars,
+ int[] frequencies);
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;
- 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");
- }
- }
+ private final void loadDictionary(String path, long startOffset, long length) {
+ mNativeDict = openNative(path, startOffset, length,
+ TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER,
+ MAX_WORD_LENGTH, MAX_WORDS, MAX_PROXIMITY_CHARS_SIZE);
+ mDictLength = length;
}
-
@Override
public void getBigrams(final WordComposer codes, final CharSequence previousWord,
- final WordCallback callback, int[] nextLettersFrequencies) {
+ final WordCallback callback) {
+ if (mNativeDict == 0) return;
char[] chars = previousWord.toString().toCharArray();
Arrays.fill(mOutputChars_bigrams, (char) 0);
@@ -163,18 +174,18 @@ public class BinaryDictionary extends Dictionary {
Arrays.fill(mInputCodes, -1);
int[] alternatives = codes.getCodesAt(0);
System.arraycopy(alternatives, 0, mInputCodes, 0,
- Math.min(alternatives.length, MAX_ALTERNATIVES));
+ Math.min(alternatives.length, MAX_PROXIMITY_CHARS_SIZE));
int count = getBigramsNative(mNativeDict, chars, chars.length, mInputCodes, codesSize,
mOutputChars_bigrams, mFrequencies_bigrams, MAX_WORD_LENGTH, MAX_BIGRAMS,
- MAX_ALTERNATIVES);
+ MAX_PROXIMITY_CHARS_SIZE);
- 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],
@@ -184,48 +195,16 @@ public class BinaryDictionary extends Dictionary {
}
@Override
- public void getWords(final WordComposer codes, final WordCallback callback,
- int[] nextLettersFrequencies) {
- 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);
- System.arraycopy(alternatives, 0, mInputCodes, i * MAX_ALTERNATIVES,
- Math.min(alternatives.length, MAX_ALTERNATIVES));
- }
- 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,
- 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;
- }
- }
+ public void getWords(final WordComposer codes, final WordCallback callback) {
+ final int count = getSuggestions(codes, mKeyboardSwitcher.getLatinKeyboard(),
+ mOutputChars, mFrequencies);
- 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,
@@ -234,6 +213,33 @@ public class BinaryDictionary extends Dictionary {
}
}
+ /* package for test */ boolean isValidDictionary() {
+ return mNativeDict != 0;
+ }
+
+ /* package for test */ int getSuggestions(final WordComposer codes, final Keyboard keyboard,
+ char[] outputChars, int[] frequencies) {
+ if (!isValidDictionary()) return -1;
+
+ final int codesSize = codes.size();
+ // Won't deal with really long words.
+ if (codesSize > MAX_WORD_LENGTH - 1) return -1;
+
+ Arrays.fill(mInputCodes, WordComposer.NOT_A_CODE);
+ for (int i = 0; i < codesSize; i++) {
+ int[] alternatives = codes.getCodesAt(i);
+ System.arraycopy(alternatives, 0, mInputCodes, i * MAX_PROXIMITY_CHARS_SIZE,
+ Math.min(alternatives.length, MAX_PROXIMITY_CHARS_SIZE));
+ }
+ Arrays.fill(outputChars, (char) 0);
+ Arrays.fill(frequencies, 0);
+
+ return getSuggestionsNative(
+ mNativeDict, keyboard.getProximityInfo(),
+ codes.getXCoordinates(), codes.getYCoordinates(), mInputCodes, codesSize,
+ mFlags, outputChars, frequencies);
+ }
+
@Override
public boolean isValidWord(CharSequence word) {
if (word == null) return false;
@@ -241,21 +247,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..c52f6b2c4 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 final 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);
+ }
- private final int mMinTouchableWidth;
+ public void postUpdateSuggestions() {
+ cancelUpdateSuggestions();
+ sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTION),
+ DELAY_UPDATE_SUGGESTION);
+ }
- private int mTotalWidth;
-
- private final GestureDetector mGestureDetector;
+ public void cancelUpdateSuggestions() {
+ removeMessages(MSG_UPDATE_SUGGESTION);
+ }
+
+ 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,119 @@ 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.setVisibility(GONE);
+ } else {
+ dv.setText(debugString);
+ dv.setVisibility(VISIBLE);
+ }
+ } else {
+ dv.setVisibility(GONE);
}
- 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());
- }
- }
- 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;
+ dv.setVisibility(GONE);
}
+ addView(v);
}
- 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 +286,79 @@ 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);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent me) {
-
- if (mGestureDetector.onTouchEvent(me)) {
- return true;
- }
-
- 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;
- }
- return true;
+ mShowingAutoCorrectionInverted = false;
+ removeAllViews();
}
private void hidePreview() {
- mTouchX = OUT_OF_BOUNDS_X_COORD;
- mCurrentWordIndex = OUT_OF_BOUNDS_WORD_INDEX;
mPreviewPopup.dismiss();
}
-
- 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);
- }
+
+ 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();
}
- private void longPressFirstWord() {
- CharSequence word = mSuggestions.get(0);
- if (word.length() < 2) return;
+ private void addToDictionary(CharSequence word) {
if (mService.addWordToDictionary(word.toString())) {
- showPreview(0, getContext().getResources().getString(R.string.added_word, word));
+ showPreview(0, getContext().getString(R.string.added_word, word));
+ }
+ }
+
+ @Override
+ public boolean onLongClick(View view) {
+ final int index = (Integer) view.getTag();
+ if (index >= mSuggestions.size())
+ return true;
+ final CharSequence word = mSuggestions.getWord(index);
+ if (word.length() < 2)
+ return false;
+ addToDictionary(word);
+ return true;
+ }
+
+ @Override
+ public void onClick(View view) {
+ final int index = (Integer) view.getTag();
+ if (index >= mSuggestions.size())
+ return;
+ final CharSequence word = mSuggestions.getWord(index);
+ if (mShowingAddToDictionary && index == 0) {
+ addToDictionary(word);
+ } else {
+ mService.pickSuggestionManually(index, 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..2f1e7c2b8 100644
--- a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java
+++ b/java/src/com/android/inputmethod/latin/DebugSettings.java
@@ -20,16 +20,18 @@ import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
+import android.os.Process;
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 boolean mServiceNeedsRestart = false;
private CheckBoxPreference mDebugMode;
@Override
@@ -39,15 +41,24 @@ public class LatinIMEDebugSettings extends PreferenceActivity
SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
prefs.registerOnSharedPreferenceChangeListener(this);
+ mServiceNeedsRestart = false;
mDebugMode = (CheckBoxPreference) findPreference(DEBUG_MODE_KEY);
updateDebugMode();
}
+ @Override
+ protected void onStop() {
+ super.onStop();
+ if (mServiceNeedsRestart) Process.killProcess(Process.myPid());
+ }
+
+ @Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals(DEBUG_MODE_KEY)) {
if (mDebugMode != null) {
mDebugMode.setChecked(prefs.getBoolean(DEBUG_MODE_KEY, false));
updateDebugMode();
+ mServiceNeedsRestart = true;
}
}
}
diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java
index d04bf57a7..56f0cc503 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
@@ -61,27 +61,19 @@ abstract public class Dictionary {
* words are added through the callback object.
* @param composer the key sequence to match
* @param callback the callback object to send matched words to as possible candidates
- * @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
- * a non-zero value on returning from this method.
- * Pass in null if you don't want the dictionary to look up next letters.
* @see WordCallback#addWord(char[], int, int)
*/
- abstract public void getWords(final WordComposer composer, final WordCallback callback,
- int[] nextLettersFrequencies);
+ abstract public void getWords(final WordComposer composer, final WordCallback callback);
/**
* 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
- * a non-zero value on returning from this method.
- * Pass in null if you don't want the dictionary to look up next letters.
*/
public void getBigrams(final WordComposer composer, final CharSequence previousWord,
- final WordCallback callback, int[] nextLettersFrequencies) {
+ final WordCallback callback) {
// empty base implementation
}
@@ -116,5 +108,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..90c250dcb 100644
--- a/java/src/com/android/inputmethod/latin/EditingUtil.java
+++ b/java/src/com/android/inputmethod/latin/EditingUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
@@ -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..0318175f6 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.
@@ -37,7 +37,6 @@ public class ExpandableDictionary extends Dictionary {
private int mDicTypeId;
private int mMaxDepth;
private int mInputLength;
- private int[] mNextLettersFrequencies;
private StringBuilder sb = new StringBuilder(MAX_WORD_LENGTH);
private static final char QUOTE = '\'';
@@ -49,53 +48,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 +139,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,40 +157,40 @@ 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
- public void getWords(final WordComposer codes, final WordCallback callback,
- int[] nextLettersFrequencies) {
+ public void getWords(final WordComposer codes, final WordCallback callback) {
synchronized (mUpdatingLock) {
// If we need to update, start off a background task
if (mRequiresReload) startDictionaryLoadingTaskLocked();
@@ -187,7 +199,6 @@ public class ExpandableDictionary extends Dictionary {
}
mInputLength = codes.size();
- mNextLettersFrequencies = nextLettersFrequencies;
if (mCodes.length < mInputLength) mCodes = new int[mInputLength][];
// Cache the codes so that we don't have to lookup an array list
for (int i = 0; i < mInputLength; i++) {
@@ -214,9 +225,19 @@ public class ExpandableDictionary extends Dictionary {
/**
* Returns the word's frequency or -1 if not found
*/
- public int getWordFrequency(CharSequence word) {
+ protected int getWordFrequency(CharSequence word) {
Node node = searchNode(mRoots, word, 0, word.length());
- return (node == null) ? -1 : node.frequency;
+ return (node == null) ? -1 : node.mFrequency;
+ }
+
+ private static int computeSkippedWordFinalFreq(int freq, int snr, int inputLength) {
+ // The computation itself makes sense for >= 2, but the == 2 case returns 0
+ // anyway so we may as well test against 3 instead and return the constant
+ if (inputLength >= 3) {
+ return (freq * snr * (inputLength - 2)) / (inputLength - 1);
+ } else {
+ return 0;
+ }
}
/**
@@ -232,16 +253,17 @@ public class ExpandableDictionary extends Dictionary {
* @param completion whether the traversal is now in completion mode - meaning that we've
* exhausted the input and we're looking for all possible suffixes.
* @param snr current weight of the word being formed
- * @param inputIndex position in the input characters. This can be off from the depth in
+ * @param inputIndex position in the input characters. This can be off from the depth in
* case we skip over some punctuations such as apostrophe in the traversal. That is, if you type
* "wouldve", it could be matching "would've", so the depth will be one more than the
* inputIndex
* @param callback the callback class for adding a word
*/
- protected void getWordsRec(NodeArray roots, final WordComposer codes, final char[] word,
+ // TODO: Share this routine with the native code for BinaryDictionary
+ 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,23 +277,24 @@ 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) {
- if (!callback.addWord(word, 0, depth + 1, freq * snr, mDicTypeId,
- DataType.UNIGRAM)) {
- return;
+ final int finalFreq;
+ if (skipPos < 0) {
+ finalFreq = freq * snr;
+ } else {
+ finalFreq = computeSkippedWordFinalFreq(freq, snr, mInputLength);
}
- // Add to frequency of next letters for predictive correction
- if (mNextLettersFrequencies != null && depth >= inputIndex && skipPos < 0
- && mNextLettersFrequencies.length > word[inputIndex]) {
- mNextLettersFrequencies[word[inputIndex]]++;
+ if (!callback.addWord(word, 0, depth + 1, finalFreq, mDicTypeId,
+ DataType.UNIGRAM)) {
+ return;
}
}
if (children != null) {
@@ -282,7 +305,7 @@ public class ExpandableDictionary extends Dictionary {
// Skip the ' and continue deeper
word[depth] = c;
if (children != null) {
- getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex,
+ getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex,
skipPos, callback);
}
} else {
@@ -299,10 +322,16 @@ public class ExpandableDictionary extends Dictionary {
if (codeSize == inputIndex + 1) {
if (terminal) {
- if (INCLUDE_TYPED_WORD_IF_VALID
+ if (INCLUDE_TYPED_WORD_IF_VALID
|| !same(word, depth + 1, codes.getTypedWord())) {
- int finalFreq = freq * snr * addedAttenuation;
- if (skipPos < 0) finalFreq *= FULL_WORD_FREQ_MULTIPLIER;
+ final int finalFreq;
+ if (skipPos < 0) {
+ finalFreq = freq * snr * addedAttenuation
+ * FULL_WORD_FREQ_MULTIPLIER;
+ } else {
+ finalFreq = computeSkippedWordFinalFreq(freq,
+ snr * addedAttenuation, mInputLength);
+ }
callback.addWord(word, 0, depth + 1, finalFreq, mDicTypeId,
DataType.UNIGRAM);
}
@@ -313,7 +342,7 @@ public class ExpandableDictionary extends Dictionary {
skipPos, callback);
}
} else if (children != null) {
- getWordsRec(children, codes, word, depth + 1,
+ getWordsRec(children, codes, word, depth + 1,
false, snr * addedAttenuation, inputIndex + 1,
skipPos, callback);
}
@@ -340,24 +369,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 +396,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,14 +435,14 @@ 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);
}
}
@Override
public void getBigrams(final WordComposer codes, final CharSequence previousWord,
- final WordCallback callback, int[] nextLettersFrequencies) {
+ final WordCallback callback) {
if (!reloadDictionaryIfRequired()) {
runReverseLookUp(previousWord, callback);
}
@@ -430,6 +457,7 @@ public class ExpandableDictionary extends Dictionary {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
+ //
}
}
}
@@ -444,14 +472,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 +496,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;
}
}
@@ -503,16 +531,17 @@ public class ExpandableDictionary extends Dictionary {
}
}
- static char toLowerCase(char c) {
+ private 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;
}
/**
@@ -521,7 +550,7 @@ public class ExpandableDictionary extends Dictionary {
* if c is not a combined character, or the base character if it
* is combined.
*/
- static final char BASE_CHARS[] = {
+ private static final char BASE_CHARS[] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
diff --git a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
index 26854399b..b58a57e42 100644
--- a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
+++ b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008-2009 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
@@ -34,41 +34,36 @@ 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[] WHITELIST_LANGUAGES = {
- "cs", "da", "de", "en_GB", "en_US", "es", "es_US", "fr", "it", "nb", "nl", "pl", "pt",
- "ru", "tr",
+ private static final String[] BLACKLIST_LANGUAGES = {
+ "ko", "ja", "zh", "el", "zz"
};
- private static boolean isWhitelisted(String lang) {
- for (String s : WHITELIST_LANGUAGES) {
- if (s.equalsIgnoreCase(lang)) {
- return true;
- }
- }
- return false;
- }
-
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);
}
}
@@ -77,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 locale = mAvailableLanguages.get(i).mLocale;
+ pref.setTitle(SubtypeSwitcher.getFullDisplayName(locale, true));
boolean checked = isLocaleIn(locale, languageList);
pref.setChecked(checked);
if (hasDictionary(locale)) {
@@ -104,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 = Utils.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.
@@ -146,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>();
@@ -168,42 +162,36 @@ public class InputLanguageSelection extends PreferenceActivity {
for (int i = 0 ; i < origSize; i++ ) {
String s = locales[i];
int len = s.length();
- final Locale l;
- final String language;
if (len == 5) {
- language = s.substring(0, 2);
+ String language = s.substring(0, 2);
String country = s.substring(3, 5);
- l = new Locale(language, country);
- } else if (len == 2) {
- language = s;
- l = new Locale(language);
- } else {
- continue;
- }
- // Exclude languages that are not relevant to LatinIME
- if (!isWhitelisted(s)) continue;
-
- if (finalSize == 0) {
- preprocess[finalSize++] =
- new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(l), l), 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(
- language)) {
- preprocess[finalSize-1].label = LanguageSwitcher.toTitleCase(
- preprocess[finalSize-1].locale.getDisplayName(),
- preprocess[finalSize-1].locale);
+ Locale l = new Locale(language, country);
+
+ // Exclude languages that are not relevant to LatinIME
+ if (arrayContains(BLACKLIST_LANGUAGES, language)) continue;
+
+ if (finalSize == 0) {
preprocess[finalSize++] =
- new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(), l), l);
+ new Loc(SubtypeSwitcher.getFullDisplayName(l, true), l);
} else {
- String displayName;
- if (s.equals("zz_ZZ")) {
+ // 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].mLocale.getLanguage().equals(
+ language)) {
+ preprocess[finalSize-1].setLabel(SubtypeSwitcher.getFullDisplayName(
+ preprocess[finalSize-1].mLocale, false));
+ preprocess[finalSize++] =
+ new Loc(SubtypeSwitcher.getFullDisplayName(l, false), l);
} else {
- displayName = LanguageSwitcher.toTitleCase(l.getDisplayName(l), l);
- preprocess[finalSize++] = new Loc(displayName, l);
+ String displayName;
+ if (s.equals("zz_ZZ")) {
+ // ignore this locale
+ } else {
+ displayName = SubtypeSwitcher.getFullDisplayName(l, true);
+ preprocess[finalSize++] = new Loc(displayName, l);
+ }
}
}
}
@@ -213,4 +201,11 @@ public class InputLanguageSelection extends PreferenceActivity {
}
return uniqueLocales;
}
+
+ private boolean arrayContains(String[] array, String value) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i].equalsIgnoreCase(value)) return true;
+ }
+ return false;
+ }
}
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 226b4c690..2dd3038f9 100644
--- a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -18,9 +18,9 @@ package com.android.inputmethod.latin;
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;
/**
@@ -29,8 +29,8 @@ import java.util.Locale;
*/
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, Locale locale) {
- if (s.length() == 0) {
- return s;
- }
-
- return s.toUpperCase(locale).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 4f3d3ba9f..bf831bfbc 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -25,23 +25,24 @@ 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.IBinder;
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;
@@ -51,213 +52,165 @@ 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 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.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 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,
- SharedPreferences.OnSharedPreferenceChangeListener {
- private static final String TAG = "LatinIME";
+public class LatinIME extends InputMethodService implements KeyboardActionListener {
+ private static final String TAG = LatinIME.class.getSimpleName();
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;
+
+ /**
+ * 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.
+ *
+ * @deprecated Use {@link LatinIME#IME_OPTION_NO_MICROPHONE} with package name prefixed.
+ */
+ public static final String IME_OPTION_NO_MICROPHONE_COMPAT = "nm";
+
+ /**
+ * 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.
+ */
+ public static final String IME_OPTION_NO_MICROPHONE = "noMicrophoneKey";
+
+ /**
+ * The private IME option used to indicate that no settings key should be
+ * shown for a given text field.
+ */
+ public static final String IME_OPTION_NO_SETTINGS_KEY = "noSettingsKey";
+
+ 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;
+ // These variables are initialized according to the {@link EditorInfo#inputType}.
+ private boolean mAutoSpace;
+ private boolean mInputTypeNoAutoCorrect;
+ private boolean mIsSettingsSuggestionStripOn;
+ private boolean mApplicationSpecifiedCompletionOn;
- private String mInputLocale;
- private String mSystemLocale;
- private LanguageSwitcher mLanguageSwitcher;
+ private AccessibilityUtils mAccessibilityUtils;
- 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 mRecorrectionEnabled;
+ 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;
+ private boolean mConfigEnableShowSubtypeSettings;
+ private boolean mConfigSwipeDownDismissKeyboardEnabled;
+ private int mConfigDelayBeforeFadeoutLanguageOnSpacebar;
+ private int mConfigDurationOfFadeoutLanguageOnSpacebar;
+ private float mConfigFinalFadeoutFactorOfLanguageOnSpacebar;
+ private long mConfigDoubleSpacesTurnIntoPeriodTimeout;
+
+ 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;
-
- // Input type is such that we should not auto-correct
- private boolean mInputTypeNoAutoCorrect;
+ 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 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 +234,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 +255,233 @@ 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;
+ private static final int MSG_SPACE_TYPED = 6;
+
@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 = mKeyboardSwitcher.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);
+ }
+ }
+ }
+
+ public void startDoubleSpacesTimer() {
+ removeMessages(MSG_SPACE_TYPED);
+ sendMessageDelayed(obtainMessage(MSG_SPACE_TYPED),
+ mConfigDoubleSpacesTurnIntoPeriodTimeout);
+ }
+
+ public void cancelDoubleSpacesTimer() {
+ removeMessages(MSG_SPACE_TYPED);
+ }
+
+ public boolean isAcceptingDoubleSpaces() {
+ return hasMessages(MSG_SPACE_TYPED);
+ }
+ }
@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);
+ AccessibilityUtils.init(this, prefs);
+
+ super.onCreate();
+
+ mImm = ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE));
+ mInputMethodId = Utils.getInputMethodId(mImm, getPackageName());
+ 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();
- }
- mReCorrectionEnabled = prefs.getBoolean(PREF_RECORRECTION_ENABLED,
- getResources().getBoolean(R.bool.default_recorrection_enabled));
+ mAccessibilityUtils = AccessibilityUtils.getInstance();
+ DEBUG = LatinImeLogger.sDBG;
- LatinIMEUtil.GCUtils.getInstance().reset();
+ 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.config_default_recorrection_enabled));
+ } else {
+ mRecorrectionEnabled = res.getBoolean(R.bool.config_default_recorrection_enabled);
+ }
+
+ 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;
+ mConfigDoubleSpacesTurnIntoPeriodTimeout = res.getInteger(
+ R.integer.config_double_spaces_turn_into_period_timeout);
+
+ 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;
- }
- });
- }
- prefs.registerOnSharedPreferenceChangeListener(this);
+ mVoiceConnector = VoiceIMEConnector.init(this, prefs, mHandler);
}
- /**
- * Loads a dictionary or multiple separated dictionary
- * @return returns array of dictionary resource ids
- */
- /* package */ static int[] getDictionary(Resources res) {
- 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");
- }
+ private void initSuggest() {
+ String locale = mSubtypeSwitcher.getInputLocaleStr();
- int count = dictionaries.size();
- int[] dict = new int[count];
- for (int i = 0; i < count; i++) {
- dict[i] = dictionaries.get(i);
- }
-
- return dict;
- }
-
- private void initSuggest(String locale) {
- mInputLocale = locale;
-
- 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 = Utils.getMainDictionaryResourceId(res);
+ mSuggest = new Suggest(this, mainDicResId);
+ loadAndSetAutoCorrectionThreshold(prefs);
+ updateAutoTextEnabled();
+
+ 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 +489,176 @@ 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;
}
@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: inputType=" + ((attribute == null) ? "none"
+ : String.format("0x%08x", attribute.inputType)));
+ }
// In landscape mode, this method gets called without the input view being created.
if (inputView == null) {
return;
}
- if (mRefreshKeyboardRequired) {
- mRefreshKeyboardRequired = false;
- toggleLanguage(true, true);
- }
-
- mKeyboardSwitcher.makeKeyboards(false);
-
- TextEntryState.newSession(this);
+ mSubtypeSwitcher.updateParametersOnStartInputView();
- // 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;
- }
+ TextEntryState.reset();
- mEnableVoiceButton = shouldShowVoiceButton(makeFieldContext(), attribute);
- final boolean enableVoiceButton = mEnableVoiceButton && mEnableVoice;
+ // 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.
+ final VoiceIMEConnector voiceIme = mVoiceConnector;
+ voiceIme.resetVoiceStates(Utils.isPasswordInputType(attribute.inputType)
+ || Utils.isVisiblePasswordInputType(attribute.inputType));
- mAfterVoiceInput = false;
- mImmediatelyAfterVoiceInput = false;
- mShowingVoiceSuggestions = false;
- mVoiceInputHighlighted = false;
- mInputTypeNoAutoCorrect = false;
- mPredictionOn = false;
- mCompletionOn = false;
- mCompletions = null;
- mCapsLock = false;
- mEnteredText = null;
+ initializeInputAttributes(attribute);
- 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);
- break;
- case EditorInfo.TYPE_CLASS_TEXT:
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT,
- attribute.imeOptions, enableVoiceButton);
- //startPrediction();
- mPredictionOn = 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 (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
- || variation == EditorInfo.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 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) {
- mInputTypeNoAutoCorrect = true;
- }
- }
-
- // If NO_SUGGESTIONS is set, don't do prediction.
- if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) {
- mPredictionOn = 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) {
- mInputTypeNoAutoCorrect = true;
- }
- if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) {
- mPredictionOn = false;
- mCompletionOn = isFullscreenMode();
- }
- break;
- default:
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT,
- attribute.imeOptions, enableVoiceButton);
- }
inputView.closing();
+ mEnteredText = null;
mComposing.setLength(0);
- mPredicting = false;
+ mHasValidSuggestions = false;
mDeleteCount = 0;
mJustAddedAutoSpace = false;
- loadSettings();
- updateShiftKeyState(attribute);
- setCandidatesViewShownInternal(isCandidateStripVisible() || mCompletionOn,
- false /* needsInputViewShown */ );
- updateSuggestions();
+ loadSettings(attribute);
+ if (mSubtypeSwitcher.isKeyboardMode()) {
+ switcher.loadKeyboard(attribute,
+ mSubtypeSwitcher.isShortcutImeEnabled() && voiceIme.isVoiceButtonEnabled(),
+ voiceIme.isVoiceButtonOnPrimary());
+ switcher.updateShiftState();
+ }
- // If the dictionary is not big enough, don't auto correct
- mHasDictionary = mSuggest.hasMainDictionary();
+ setCandidatesViewShownInternal(isCandidateStripVisible(),
+ false /* needsInputViewShown */ );
+ // Delay updating suggestions because keyboard input view may not be shown at this point.
+ mHandler.postUpdateSuggestions();
updateCorrectionMode();
+ final boolean accessibilityEnabled = mAccessibilityUtils.isAccessibilityEnabled();
+
inputView.setPreviewEnabled(mPopupOn);
inputView.setProximityCorrectionEnabled(true);
- mPredictionOn = mPredictionOn && (mCorrectionMode > 0 || mShowSuggestions);
+ inputView.setAccessibilityEnabled(accessibilityEnabled);
// If we just entered a text field, maybe it has some old text that requires correction
- checkReCorrectionOnStart();
- checkTutorial(attribute.privateImeOptions);
+ checkRecorrectionOnStart();
+ inputView.setForeground(true);
+
+ voiceIme.onStartInputView(inputView.getWindowToken());
+
if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
}
- private void checkReCorrectionOnStart() {
- if (mReCorrectionEnabled && isPredictionOn()) {
+ private void initializeInputAttributes(EditorInfo attribute) {
+ if (attribute == null)
+ return;
+ final int inputType = attribute.inputType;
+ final int variation = inputType & InputType.TYPE_MASK_VARIATION;
+ mAutoSpace = false;
+ mInputTypeNoAutoCorrect = false;
+ mIsSettingsSuggestionStripOn = false;
+ mApplicationSpecifiedCompletionOn = false;
+ mApplicationSpecifiedCompletions = null;
+
+ if ((inputType & InputType.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_TEXT) {
+ mIsSettingsSuggestionStripOn = true;
+ // Make sure that passwords are not displayed in candidate view
+ if (Utils.isPasswordInputType(inputType)
+ || Utils.isVisiblePasswordInputType(inputType)) {
+ mIsSettingsSuggestionStripOn = false;
+ }
+ if (Utils.isEmailVariation(variation)
+ || variation == InputType.TYPE_TEXT_VARIATION_PERSON_NAME) {
+ mAutoSpace = false;
+ } else {
+ mAutoSpace = true;
+ }
+ if (Utils.isEmailVariation(variation)) {
+ mIsSettingsSuggestionStripOn = false;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_URI) {
+ mIsSettingsSuggestionStripOn = false;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
+ mIsSettingsSuggestionStripOn = false;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) {
+ // If it's a browser edit field and auto correct is not ON explicitly, then
+ // disable auto correction, but keep suggestions on.
+ if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) {
+ mInputTypeNoAutoCorrect = true;
+ }
+ }
+
+ // If NO_SUGGESTIONS is set, don't do prediction.
+ 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 ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0
+ && (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE) == 0) {
+ mInputTypeNoAutoCorrect = true;
+ }
+ if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) {
+ mIsSettingsSuggestionStripOn = false;
+ mApplicationSpecifiedCompletionOn = isFullscreenMode();
+ }
+ }
+ }
+
+ private void checkRecorrectionOnStart() {
+ 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 +669,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 +679,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 +692,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
@@ -759,70 +715,70 @@ public class LatinIME extends InputMethodService
if (DEBUG) {
Log.i(TAG, "onUpdateSelection: oss=" + oldSelStart
+ ", ose=" + oldSelEnd
+ + ", lss=" + mLastSelectionStart
+ + ", lse=" + mLastSelectionEnd
+ ", nss=" + newSelStart
+ ", nse=" + newSelEnd
+ ", cs=" + candidatesStart
+ ", 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)) {
+ final boolean selectionChanged = (newSelStart != candidatesEnd
+ || newSelEnd != candidatesEnd) && mLastSelectionStart != newSelStart;
+ final boolean candidatesCleared = candidatesStart == -1 && candidatesEnd == -1;
+ if (((mComposing.length() > 0 && mHasValidSuggestions)
+ || mVoiceConnector.isVoiceInputHighlighted())
+ && (selectionChanged || candidatesCleared)) {
+ if (candidatesCleared) {
+ // If the composing span has been cleared, save the typed word in the history for
+ // recorrection before we reset the candidate strip. Then, we'll be able to show
+ // suggestions for recorrection right away.
+ saveWordInHistory(mComposing);
+ }
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) {
- switch (TextEntryState.getState()) {
- case ACCEPTED_DEFAULT:
+ mVoiceConnector.setVoiceInputHighlighted(false);
+ } else if (!mHasValidSuggestions && !mJustAccepted) {
+ if (TextEntryState.isAcceptedDefault() || TextEntryState.isSpaceAfterPicked()) {
+ if (TextEntryState.isAcceptedDefault())
TextEntryState.reset();
- // fall through
- case SPACE_AFTER_PICKED:
- mJustAddedAutoSpace = false; // The user moved the cursor.
- break;
+ mJustAddedAutoSpace = false; // The user moved the cursor.
}
}
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()
&& (candidatesStart == candidatesEnd || newSelStart != oldSelStart
- || TextEntryState.isCorrecting())
- && (newSelStart < newSelEnd - 1 || (!mPredicting))
- && !mVoiceInputHighlighted) {
+ || TextEntryState.isRecorrecting())
+ && (newSelStart < newSelEnd - 1 || !mHasValidSuggestions)) {
if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) {
- postUpdateOldSuggestions();
+ mHandler.postUpdateOldSuggestions();
} else {
- abortCorrection(false);
+ abortRecorrection(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 +796,7 @@ public class LatinIME extends InputMethodService
*/
@Override
public void onExtractedTextClicked() {
- if (mReCorrectionEnabled && isPredictionOn()) return;
+ if (mRecorrectionEnabled && isSuggestionsRequested()) return;
super.onExtractedTextClicked();
}
@@ -856,7 +812,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 +820,41 @@ 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:");
+ if (applicationSpecifiedCompletions != null) {
+ for (int i = 0; i < applicationSpecifiedCompletions.length; 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 +863,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 +879,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 +926,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,90 +940,49 @@ 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);
}
mCommittedLength = mComposing.length();
TextEntryState.acceptedTyped(mComposing);
- addToDictionaries(mComposing, AutoDictionary.FREQUENCY_FOR_TYPED);
+ addToAutoAndUserBigramDictionaries(mComposing, AutoDictionary.FREQUENCY_FOR_TYPED);
}
updateSuggestions();
}
}
- 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 +990,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,32 +1006,36 @@ 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();
}
}
private void doubleSpace() {
- //if (!mAutoPunctuate) return;
if (mCorrectionMode == Suggest.CORRECTION_NONE) return;
final InputConnection ic = getCurrentInputConnection();
if (ic == null) return;
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
+ && mHandler.isAcceptingDoubleSpaces()) {
+ mHandler.cancelDoubleSpacesTimer();
ic.beginBatchEdit();
ic.deleteSurroundingText(2, 0);
ic.commitText(". ", 1);
ic.endBatchEdit();
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
mJustAddedAutoSpace = true;
+ } else {
+ mHandler.startDoubleSpacesTimer();
}
}
@@ -1121,8 +1047,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 +1059,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 +1068,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 +1080,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 +1092,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 +1106,135 @@ 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 accessibilityEnabled = switcher.isAccessibilityEnabled();
+ 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 || accessibilityEnabled)
+ switcher.toggleShift();
+ break;
+ case Keyboard.CODE_SWITCH_ALPHA_SYMBOL:
+ // Symbol key is handled in onPress() when device has distinct multi-touch panel.
+ if (!distinctMultiTouch || accessibilityEnabled)
+ 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, x, y);
+ }
}
- 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);
+ abortRecorrection(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);
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) {
+ if (TextEntryState.isUndoCommit()) {
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,155 +1253,134 @@ public class LatinIME extends InputMethodService
}
}
}
- mJustRevertedSeparator = null;
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()) {
+ private void abortRecorrection(boolean force) {
+ if (force || TextEntryState.isRecorrecting()) {
+ TextEntryState.onAbortRecorrection();
+ setCandidatesViewShown(isCandidateStripVisible());
getCurrentInputConnection().finishComposingText();
clearSuggestions();
}
}
- private void handleCharacter(int primaryCode, int[] keyCodes) {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
- commitVoiceInput();
- }
+ private void handleCharacter(int primaryCode, int[] keyCodes, int x, int y) {
+ 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 (mLastSelectionStart == mLastSelectionEnd && TextEntryState.isRecorrecting()) {
+ abortRecorrection(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();
+ clearSuggestions();
}
}
- 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)) {
- // In some locales, such as Turkish, Character.toUpperCase() may return a wrong
- // character because it doesn't take care of locale.
- final String upperCaseString = new String(new int[] {primaryCode}, 0, 1)
- .toUpperCase(mLanguageSwitcher.getInputLocale());
- if (upperCaseString.codePointCount(0, upperCaseString.length()) == 1) {
- primaryCode = upperCaseString.codePointAt(0);
+ 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.
- onText(upperCaseString);
+ 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, x, y);
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);
+ abortRecorrection(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 != '\'') {
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;
}
@@ -1501,22 +1388,31 @@ 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) {
+ if (TextEntryState.isPunctuationAfterAccepted() && primaryCode == Keyboard.CODE_PERIOD) {
reswapPeriodAndSpace();
}
TextEntryState.typedCharacter((char) primaryCode, true);
- if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED
- && primaryCode != KEYCODE_ENTER) {
+ if (TextEntryState.isPunctuationAfterAccepted() && 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();
}
@@ -1524,22 +1420,15 @@ 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();
- }
- }
- TextEntryState.endSession();
+ LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+ if (inputView != null)
+ inputView.closing();
}
private void saveWordInHistory(CharSequence result) {
if (mWord.size() <= 1) {
- mWord.reset();
return;
}
// Skip if result is null. It happens in some edge case.
@@ -1554,312 +1443,159 @@ 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();
- }});
- }
-
- private void switchToRecognitionStatusView() {
- final boolean configChanged = mConfigurationChanging;
- mHandler.post(new Runnable() {
- 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);
- }
- setInputView(v);
- updateInputViewShown();
- if (configChanged) {
- mVoiceInput.onConfigurationChanged();
- }
- }});
- }
-
- 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();
- }
- });
-
- 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));
+ if (mCandidateView == null)
+ return false;
+ if (mCandidateView.isShowingAddToDictionaryHint() || TextEntryState.isRecorrecting())
+ return true;
+ if (!isShowingSuggestionsStrip())
+ return false;
+ if (mApplicationSpecifiedCompletionOn)
+ return true;
+ return isSuggestionsRequested();
}
- 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());
+ public void switchToKeyboardView() {
+ if (DEBUG) {
+ Log.d(TAG, "Switch to keyboard view.");
+ }
+ 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);
}
- nBest.add(c);
- }
-
- if (nBest.size() == 0) {
- return;
+ setInputView(v);
}
-
- 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);
+ setCandidatesViewShown(isCandidateStripVisible());
+ updateInputViewShown();
+ mHandler.postUpdateSuggestions();
}
- private void clearSuggestions() {
- setSuggestions(null, false, false, false);
+ public void clearSuggestions() {
+ setSuggestions(SuggestedWords.EMPTY);
}
- 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() {
// 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);
+ 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(),
+ // TODO: May need a better way of retrieving previous word
+ 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));
-
- int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies();
-
- ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters(
- nextLettersFrequencies);
-
- boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection();
- //|| mCorrectionMode == mSuggest.CORRECTION_FULL;
- CharSequence typedWord = word.getTypedWord();
- // If we're in basic correct
- boolean typedWordValid = mSuggest.isValidWord(typedWord) ||
- (preferCapitalization()
- && mSuggest.isValidWord(typedWord.toString().toLowerCase()));
+ SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
+ mKeyboardSwitcher.getInputView(), word, prevWord);
+
+ boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasAutoCorrection();
+ final CharSequence typedWord = word.getTypedWord();
+ // Here, we want to promote a whitelisted word if exists.
+ final boolean typedWordValid = AutoCorrection.isValidWordForAutoCorrection(
+ mSuggest.getUnigramDictionaries(), typedWord, preferCapitalization());
if (mCorrectionMode == Suggest.CORRECTION_FULL
|| mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM) {
correctionAvailable |= typedWordValid;
}
// Don't auto-correct words with multiple capital letter
correctionAvailable &= !word.isMostlyCaps();
- correctionAvailable &= !TextEntryState.isCorrecting();
-
- showSuggestions(stringList, typedWord, typedWordValid, correctionAvailable);
+ correctionAvailable &= !TextEntryState.isRecorrecting();
+
+ // 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);
+ addToAutoAndUserBigramDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED);
return true;
}
@@ -1867,24 +1603,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();
+ final boolean recorrecting = TextEntryState.isRecorrecting();
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);
}
@@ -1892,7 +1621,7 @@ public class LatinIME extends InputMethodService
if (mCandidateView != null) {
mCandidateView.clear();
}
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
if (ic != null) {
ic.endBatchEdit();
}
@@ -1905,47 +1634,59 @@ 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);
+ addToAutoAndUserBigramDictionaries(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED);
} else {
- addToBigramDictionary(suggestion, 1);
+ addToOnlyBigramDictionary(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) {
+ if (mAutoSpace && !recorrecting) {
sendSpace();
mJustAddedAutoSpace = true;
}
- final boolean showingAddToDictionaryHint = index == 0 && mCorrectionMode > 0
- && !mSuggest.isValidWord(suggestion)
- && !mSuggest.isValidWord(suggestion.toString().toLowerCase());
-
- if (!correcting) {
+ // We should show the hint if the user pressed the first entry AND either:
+ // - There is no dictionary (we know that because we tried to load it => null != mSuggest
+ // AND mHasDictionary is false)
+ // - There is a dictionary and the word is not in it
+ // Please note that if mSuggest is null, it means that everything is off: suggestion
+ // and correction, so we shouldn't try to show the hint
+ // We used to look at mCorrectionMode here, but showing the hint should have nothing
+ // to do with the autocorrection setting.
+ final boolean showingAddToDictionaryHint = index == 0 && mSuggest != null
+ // If there is no dictionary the hint should be shown.
+ && (!mHasDictionary
+ // If "suggestion" is not in the dictionary, the hint should be shown.
+ || !AutoCorrection.isValidWord(
+ mSuggest.getUnigramDictionaries(), suggestion, true));
+
+ if (!recorrecting) {
// 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);
@@ -1955,93 +1696,24 @@ 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) {
- final LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
- final Locale inputLocale = mLanguageSwitcher.getInputLocale();
- if (mCapsLock) {
- suggestion = suggestion.toString().toUpperCase(inputLocale);
- } else if (preferCapitalization()
- || (mKeyboardSwitcher.isAlphabetMode()
- && inputView.isShifted())) {
- suggestion = suggestion.toString().toUpperCase(inputLocale).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))) {
- final Locale inputLocale = mLanguageSwitcher.getInputLocale();
- for (int i = 0; i < suggestions.size(); i++) {
- String origSugg = (String) suggestions.get(i);
- String capsSugg = origSugg.toUpperCase(inputLocale).charAt(0)
- + origSugg.subSequence(1, origSugg.length()).toString();
- suggestions.set(i, capsSugg);
- }
- }
- setSuggestions(suggestions, false, true, true);
- setCandidatesViewShown(true);
- return true;
- }
- return false;
}
/**
@@ -2050,12 +1722,13 @@ 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;
+ // Search old suggestions to suggest re-corrected suggestions.
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;
}
@@ -2063,22 +1736,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 as re-corrected suggestions.
if (foundWord == null
- && (mSuggest.isValidWord(touching.word)
- || mSuggest.isValidWord(touching.word.toString().toLowerCase()))) {
+ && (AutoCorrection.isValidWord(
+ mSuggest.getUnigramDictionaries(), touching.mWord, true))) {
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)
+ }, WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
}
- 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) {
@@ -2092,56 +1765,59 @@ 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)) {
- abortCorrection(true);
+ if (!mVoiceConnector.applyVoiceAlternatives(touching)
+ && !applyTypedAlternatives(touching)) {
+ abortRecorrection(true);
} else {
- TextEntryState.selectedForCorrection();
- EditingUtil.underlineWord(ic, touching);
+ TextEntryState.selectedForRecorrection();
+ EditingUtils.underlineWord(ic, touching);
}
ic.endBatchEdit();
} else {
- abortCorrection(true);
- setNextSuggestions(); // Show the punctuation suggestions list
+ abortRecorrection(true);
+ setPunctuationSuggestions(); // Show the punctuation suggestions list
}
} else {
- abortCorrection(true);
+ abortRecorrection(true);
}
}
- private void setNextSuggestions() {
- setSuggestions(mSuggestPuncList, false, false, false);
+ private void setPunctuationSuggestions() {
+ setSuggestions(mSuggestPuncList);
+ setCandidatesViewShown(isCandidateStripVisible());
}
- private void addToDictionaries(CharSequence suggestion, int frequencyDelta) {
+ private void addToAutoAndUserBigramDictionaries(CharSequence suggestion, int frequencyDelta) {
checkAddToDictionary(suggestion, frequencyDelta, false);
}
- private void addToBigramDictionary(CharSequence suggestion, int frequencyDelta) {
+ private void addToOnlyBigramDictionary(CharSequence suggestion, int frequencyDelta) {
checkAddToDictionary(suggestion, frequencyDelta, true);
}
/**
* Adds to the UserBigramDictionary and/or AutoDictionary
- * @param addToBigramDictionary true if it should be added to bigram dictionary if possible
+ * @param selectedANotTypedWord true if it should be added to bigram dictionary if possible
*/
private void checkAddToDictionary(CharSequence suggestion, int frequencyDelta,
- boolean addToBigramDictionary) {
+ boolean selectedANotTypedWord) {
if (suggestion == null || suggestion.length() < 1) return;
+
// Only auto-add to dictionary if auto-correct is ON. Otherwise we'll be
// adding words in situations where the user or application really didn't
// want corrections enabled or learned.
@@ -2149,19 +1825,22 @@ 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 (mUserBigramDictionary != null) {
- CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(),
- mSentenceSeparators);
- if (!TextUtils.isEmpty(prevWord)) {
- mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString());
- }
+ final boolean selectedATypedWordAndItsInAutoDic =
+ !selectedANotTypedWord && mAutoDictionary.isValidWord(suggestion);
+ final boolean isValidWord = AutoCorrection.isValidWord(
+ mSuggest.getUnigramDictionaries(), suggestion, true);
+ final boolean needsToAddToAutoDictionary = selectedATypedWordAndItsInAutoDic
+ || !isValidWord;
+ if (needsToAddToAutoDictionary) {
+ mAutoDictionary.addWord(suggestion.toString(), frequencyDelta);
+ }
+
+ if (mUserBigramDictionary != null) {
+ CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
+ mSentenceSeparators);
+ if (!TextUtils.isEmpty(prevWord)) {
+ mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString());
}
}
}
@@ -2191,24 +1870,35 @@ 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);
+ 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;
}
}
@@ -2226,130 +1916,82 @@ 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();
}
- private void toggleLanguage(boolean reset, boolean next) {
- if (reset) {
- mLanguageSwitcher.reset();
- } else {
- if (next) {
- mLanguageSwitcher.next();
- } else {
- mLanguageSwitcher.prev();
- }
- }
- int currentKeyboardMode = mKeyboardSwitcher.getKeyboardMode();
- reloadKeyboards();
- mKeyboardSwitcher.makeKeyboards(true);
- mKeyboardSwitcher.setKeyboardMode(currentKeyboardMode, 0,
- mEnableVoiceButton && mEnableVoice);
- initSuggest(mLanguageSwitcher.getInputLanguage());
- mLanguageSwitcher.persist();
- updateShiftKeyState(getCurrentInputEditorInfo());
- }
-
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
- String key) {
- if (PREF_SELECTED_LANGUAGES.equals(key)) {
- mLanguageSwitcher.loadLocales(sharedPreferences);
- mRefreshKeyboardRequired = true;
- } else if (PREF_RECORRECTION_ENABLED.equals(key)) {
- mReCorrectionEnabled = sharedPreferences.getBoolean(PREF_RECORRECTION_ENABLED,
- getResources().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());
- }
- }
+ // 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);
}
- public void swipeLeft() {
- }
-
- public void swipeDown() {
- handleClose();
+ // "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER.
+ private void toggleLanguage(boolean reset, boolean next) {
+ if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) {
+ mSubtypeSwitcher.toggleLanguage(reset, next);
+ }
+ // Reload keyboard because the current language has been changed.
+ mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(),
+ mSubtypeSwitcher.isShortcutImeEnabled() && mVoiceConnector.isVoiceButtonEnabled(),
+ mVoiceConnector.isVoiceButtonOnPrimary());
+ initSuggest();
+ mKeyboardSwitcher.updateShiftState();
}
- public void swipeUp() {
- //launchSettings();
+ @Override
+ public void onSwipeDown() {
+ if (mConfigSwipeDownDismissKeyboardEnabled)
+ handleClose();
}
- public void onPress(int primaryCode) {
+ @Override
+ public void onPress(int primaryCode, boolean withSliding) {
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(withSliding);
+ } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
+ switcher.onPressSymbol();
} else {
- mShiftKeyState.onOtherKeyPressed();
- mSymbolKeyState.onOtherKeyPressed();
+ switcher.onOtherKeyPressed();
}
+ mAccessibilityUtils.onPress(primaryCode, switcher);
}
- public void onRelease(int primaryCode) {
+ @Override
+ public void onRelease(int primaryCode, boolean withSliding) {
+ 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(withSliding);
+ } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
+ switcher.onReleaseSymbol();
}
+ mAccessibilityUtils.onRelease(primaryCode, switcher);
}
- 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);
+ }
}
};
@@ -2376,13 +2018,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;
}
@@ -2390,52 +2032,33 @@ 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;
}
private void updateCorrectionMode() {
+ // TODO: cleanup messy flags
mHasDictionary = mSuggest != null ? mSuggest.hasMainDictionary() : false;
mAutoCorrectOn = (mAutoCorrectEnabled || mQuickFixes)
&& !mInputTypeNoAutoCorrect && mHasDictionary;
@@ -2449,22 +2072,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.setQuickFixesEnabled(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);
@@ -2472,122 +2107,196 @@ 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,
+ mResources.getBoolean(R.bool.config_default_sound_enabled));
+
+ mPopupOn = isPopupEnabled(prefs);
+ 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 isPopupEnabled(SharedPreferences sp) {
+ final boolean showPopupOption = getResources().getBoolean(
+ R.bool.config_enable_show_popup_on_keypress_option);
+ if (!showPopupOption) return mResources.getBoolean(R.bool.config_default_popup_preview);
+ return sp.getBoolean(Settings.PREF_POPUP_ON,
+ mResources.getBoolean(R.bool.config_default_popup_preview));
+ }
+
+ 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:
+ mImm.showInputMethodPicker();
+ break;
+ case 1:
+ launchSettings();
+ 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) {
+ final IBinder windowToken = mKeyboardSwitcher.getInputView().getWindowToken();
+ if (windowToken == null) return;
+ 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();
+ lp.token = windowToken;
lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
window.setAttributes(lp);
window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
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);
@@ -2595,14 +2304,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);
@@ -2627,7 +2335,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 1438d7da1..000000000
--- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ /dev/null
@@ -1,1027 +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), 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(), 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 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);
- }
-
- public Locale getInputLocale() {
- return (mLocale != null) ? mLocale : mLanguageSwitcher.getSystemLocale();
- }
-
- 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), 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 efe03a51f..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))) {
- return label.toString().toUpperCase(getKeyboardLocale());
- }
- 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/ModifierKeyState.java b/java/src/com/android/inputmethod/latin/ModifierKeyState.java
deleted file mode 100644
index 097e87abe..000000000
--- a/java/src/com/android/inputmethod/latin/ModifierKeyState.java
+++ /dev/null
@@ -1,42 +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;
-
-class ModifierKeyState {
- private static final int RELEASING = 0;
- private static final int PRESSING = 1;
- private static final int MOMENTARY = 2;
-
- private int mState = RELEASING;
-
- public void onPress() {
- mState = PRESSING;
- }
-
- public void onRelease() {
- mState = RELEASING;
- }
-
- public void onOtherKeyPressed() {
- if (mState == PRESSING)
- mState = MOMENTARY;
- }
-
- public boolean isMomentary() {
- return mState == MOMENTARY;
- }
-}
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..341d5add0
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -0,0 +1,340 @@
+/*
+ * 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) {
+ // Refer to android.provider.Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS
+ // TODO: Can this be a constant instead of literal String constant?
+ action = "android.settings.INPUT_METHOD_SUBTYPE_SETTINGS";
+ } 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..dc14d770a
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -0,0 +1,671 @@
+/*
+ * 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.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.class.getSimpleName();
+
+ 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 InputMethodSubtype mCurrentSubtype;
+ private Locale mSystemLocale;
+ private Locale mInputLocale;
+ private String mInputLocaleStr;
+ 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;
+ mCurrentSubtype = null;
+ 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() {
+ final String currentMode = getCurrentSubtypeMode();
+ 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(currentMode)) {
+ 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 + ", " + currentMode);
+ 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;
+ final String oldMode = getCurrentSubtypeMode();
+ if (newSubtype == null) {
+ // Normally, newSubtype shouldn't be null. But just in case newSubtype was null,
+ // fallback to the default locale.
+ 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 + ", " + oldMode);
+ }
+ boolean languageChanged = false;
+ if (!newLocale.equals(mInputLocaleStr)) {
+ if (mInputLocaleStr != null) {
+ languageChanged = true;
+ }
+ updateInputLocale(newLocale);
+ }
+ boolean modeChanged = false;
+ if (!newMode.equals(oldMode)) {
+ if (oldMode != null) {
+ modeChanged = true;
+ }
+ }
+ mCurrentSubtype = newSubtype;
+
+ // 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: " + newMode);
+ 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 isShortcutImeEnabled() {
+ if (mShortcutInputMethodInfo == null)
+ return false;
+ if (mShortcutSubtype == null)
+ return true;
+ final boolean allowsImplicitlySelectedSubtypes = true;
+ for (final InputMethodSubtype enabledSubtype : mImm.getEnabledInputMethodSubtypeList(
+ mShortcutInputMethodInfo, allowsImplicitlySelectedSubtypes)) {
+ if (enabledSubtype.equals(mShortcutSubtype))
+ return true;
+ }
+ return false;
+ }
+
+ public boolean isShortcutImeReady() {
+ if (mShortcutInputMethodInfo == null)
+ return false;
+ if (mShortcutSubtype == null)
+ return true;
+ if (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 KeyboardSwitcher switcher = KeyboardSwitcher.getInstance();
+ final LatinKeyboard keyboard = switcher.getLatinKeyboard();
+ if (keyboard != null) {
+ keyboard.updateShortcutKey(isShortcutImeReady(), switcher.getInputView());
+ }
+ }
+
+ //////////////////////////////////
+ // 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 {
+ int enabledLanguageCount = mEnabledLanguagesOfCurrentInputMethod.size();
+ // Workaround for explicitly specifying the voice language
+ if (enabledLanguageCount == 1) {
+ mEnabledLanguagesOfCurrentInputMethod.add(
+ mEnabledLanguagesOfCurrentInputMethod.get(0));
+ ++enabledLanguageCount;
+ }
+ return mEnabledLanguagesOfCurrentInputMethod.toArray(
+ new String[enabledLanguageCount]);
+ }
+ }
+
+ 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();
+ }
+ }
+ }
+
+ /**
+ * 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(getCurrentSubtypeMode());
+ }
+
+
+ ///////////////////////////
+ // 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 null == mCurrentSubtype ? false : VOICE_MODE.equals(getCurrentSubtypeMode());
+ }
+
+ 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 "";
+ }
+ }
+
+ /////////////////////////////
+ // Other utility functions //
+ /////////////////////////////
+
+ public String getCurrentSubtypeExtraValue() {
+ // If null, return what an empty ExtraValue would return : the empty string.
+ return null != mCurrentSubtype ? mCurrentSubtype.getExtraValue() : "";
+ }
+
+ public boolean currentSubtypeContainsExtraValueKey(String key) {
+ // If null, return what an empty ExtraValue would return : false.
+ return null != mCurrentSubtype ? mCurrentSubtype.containsExtraValueKey(key) : false;
+ }
+
+ public String getCurrentSubtypeExtraValueOf(String key) {
+ // If null, return what an empty ExtraValue would return : null.
+ return null != mCurrentSubtype ? mCurrentSubtype.getExtraValueOf(key) : null;
+ }
+
+ public String getCurrentSubtypeMode() {
+ return null != mCurrentSubtype ? mCurrentSubtype.getMode() : KEYBOARD_MODE;
+ }
+
+
+ // 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 5015e9b3d..0de474e59 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
@@ -22,18 +22,22 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.View;
-import java.nio.ByteBuffer;
+import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.List;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
/**
- * 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;
@@ -63,38 +67,37 @@ public class Suggest implements Dictionary.WordCallback {
// If you add a type of dictionary, increment DIC_TYPE_LAST_ID
public static final int DIC_TYPE_LAST_ID = 4;
- static final int LARGE_DICTIONARY_THRESHOLD = 200 * 1000;
-
- private BinaryDictionary mMainDict;
+ public static final String DICT_KEY_MAIN = "main";
+ public static final String DICT_KEY_CONTACTS = "contacts";
+ public static final String DICT_KEY_AUTO = "auto";
+ public static final String DICT_KEY_USER = "user";
+ public static final String DICT_KEY_USER_BIGRAM = "user_bigram";
+ public static final String DICT_KEY_WHITELIST ="whitelist";
- private Dictionary mUserDictionary;
+ static final int LARGE_DICTIONARY_THRESHOLD = 200 * 1000;
- private Dictionary mAutoDictionary;
+ private static final boolean DBG = LatinImeLogger.sDBG;
- private Dictionary mContactsDictionary;
+ private AutoCorrection mAutoCorrection;
- private Dictionary mUserBigramDictionary;
+ private BinaryDictionary mMainDict;
+ private WhitelistDictionary mWhiteListDictionary;
+ private final Map<String, Dictionary> mUnigramDictionaries = new HashMap<String, Dictionary>();
+ private final Map<String, Dictionary> mBigramDictionaries = new HashMap<String, Dictionary>();
private int mPrefMaxSuggestions = 12;
private static final int PREF_MAX_BIGRAMS = 60;
- private boolean mAutoTextEnabled;
+ private boolean mQuickFixesEnabled;
+ private double mAutoCorrectionThreshold;
private int[] mPriorities = new int[mPrefMaxSuggestions];
private int[] mBigramPriorities = new int[PREF_MAX_BIGRAMS];
- // Handle predictive correction for only the first 1280 characters for performance reasons
- // If we support scripts that need latin characters beyond that, we should probably use some
- // kind of a sparse array or language specific list with a mapping lookup table.
- // 1280 is the size of the BASE_CHARS array in ExpandableDictionary, which is a basic set of
- // latin characters.
- private int[] mNextLettersFrequencies = new int[1280];
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 String mLowerOriginalWord;
// TODO: Remove these member variables by passing more context to addWord() callback method
@@ -103,13 +106,25 @@ 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, int dictionaryResId) {
+ init(context, BinaryDictionary.initDictionary(context, dictionaryResId, DIC_MAIN));
+ }
+
+ /* package for test */ Suggest(File dictionary, long startOffset, long length) {
+ init(null, BinaryDictionary.initDictionary(dictionary, startOffset, length, DIC_MAIN));
}
- public Suggest(Context context, ByteBuffer byteBuffer) {
- mMainDict = new BinaryDictionary(context, byteBuffer, DIC_MAIN);
+ private void init(Context context, BinaryDictionary mainDict) {
+ if (mainDict != null) {
+ mMainDict = mainDict;
+ mUnigramDictionaries.put(DICT_KEY_MAIN, mainDict);
+ mBigramDictionaries.put(DICT_KEY_MAIN, mainDict);
+ }
+ mWhiteListDictionary = WhitelistDictionary.init(context);
+ if (mWhiteListDictionary != null) {
+ mUnigramDictionaries.put(DICT_KEY_WHITELIST, mWhiteListDictionary);
+ }
+ mAutoCorrection = new AutoCorrection();
initPool();
}
@@ -120,8 +135,8 @@ public class Suggest implements Dictionary.WordCallback {
}
}
- public void setAutoTextEnabled(boolean enabled) {
- mAutoTextEnabled = enabled;
+ public void setQuickFixesEnabled(boolean enabled) {
+ mQuickFixesEnabled = enabled;
}
public int getCorrectionMode() {
@@ -133,7 +148,11 @@ public class Suggest implements Dictionary.WordCallback {
}
public boolean hasMainDictionary() {
- return mMainDict.getSize() > LARGE_DICTIONARY_THRESHOLD;
+ return mMainDict != null && mMainDict.getSize() > LARGE_DICTIONARY_THRESHOLD;
+ }
+
+ public Map<String, Dictionary> getUnigramDictionaries() {
+ return mUnigramDictionaries;
}
public int getApproxMaxWordLength() {
@@ -145,22 +164,36 @@ public class Suggest implements Dictionary.WordCallback {
* before the main dictionary, if set.
*/
public void setUserDictionary(Dictionary userDictionary) {
- mUserDictionary = userDictionary;
+ if (userDictionary != null)
+ mUnigramDictionaries.put(DICT_KEY_USER, userDictionary);
}
/**
* Sets an optional contacts dictionary resource to be loaded.
*/
- public void setContactsDictionary(Dictionary userDictionary) {
- mContactsDictionary = userDictionary;
+ public void setContactsDictionary(Dictionary contactsDictionary) {
+ if (contactsDictionary != null) {
+ mUnigramDictionaries.put(DICT_KEY_CONTACTS, contactsDictionary);
+ mBigramDictionaries.put(DICT_KEY_CONTACTS, contactsDictionary);
+ }
}
-
+
public void setAutoDictionary(Dictionary autoDictionary) {
- mAutoDictionary = autoDictionary;
+ if (autoDictionary != null)
+ mUnigramDictionaries.put(DICT_KEY_AUTO, autoDictionary);
}
public void setUserBigramDictionary(Dictionary userBigramDictionary) {
- mUserBigramDictionary = userBigramDictionary;
+ if (userBigramDictionary != null)
+ mBigramDictionaries.put(DICT_KEY_USER_BIGRAM, userBigramDictionary);
+ }
+
+ public void setAutoCorrectionThreshold(double threshold) {
+ mAutoCorrectionThreshold = threshold;
+ }
+
+ public boolean isAggressiveAutoCorrectionMode() {
+ return (mAutoCorrectionThreshold == 0);
}
/**
@@ -183,59 +216,56 @@ 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();
+ }
+
+ private CharSequence capitalizeWord(boolean all, boolean first, CharSequence word) {
+ if (TextUtils.isEmpty(word) || !(all || first)) return word;
+ final int wordLength = word.length();
+ final int poolSize = mStringPool.size();
+ final StringBuilder sb =
+ poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1)
+ : new StringBuilder(getApproxMaxWordLength());
+ sb.setLength(0);
+ if (all) {
+ sb.append(word.toString().toUpperCase());
+ } else if (first) {
+ sb.append(Character.toUpperCase(word.charAt(0)));
+ if (wordLength > 1) {
+ sb.append(word.subSequence(1, wordLength));
+ }
+ }
+ return sb;
+ }
+
+ // 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;
+ mAutoCorrection.init();
mIsFirstCharCapitalized = wordComposer.isFirstCharCapitalized();
mIsAllUpperCase = wordComposer.isAllUpperCase();
collectGarbage(mSuggestions, mPrefMaxSuggestions);
Arrays.fill(mPriorities, 0);
- 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,23 +279,13 @@ 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) {
- mUserBigramDictionary.getBigrams(wordComposer, prevWordForBigram, this,
- mNextLettersFrequencies);
- }
- if (mContactsDictionary != null) {
- mContactsDictionary.getBigrams(wordComposer, prevWordForBigram, this,
- mNextLettersFrequencies);
- }
- if (mMainDict != null) {
- mMainDict.getBigrams(wordComposer, prevWordForBigram, this,
- mNextLettersFrequencies);
+ for (final Dictionary dictionary : mBigramDictionaries.values()) {
+ dictionary.getBigrams(wordComposer, prevWordForBigram, this);
}
char currentChar = wordComposer.getTypedWord().charAt(0);
- // TODO: Must pay attention to locale when changing case.
char currentCharUpper = Character.toUpperCase(currentChar);
int count = 0;
int bigramSuggestionSize = mBigramSuggestions.size();
@@ -286,69 +306,86 @@ public class Suggest implements Dictionary.WordCallback {
} else if (wordComposer.size() > 1) {
// At second character typed, search the unigrams (scores being affected by bigrams)
- if (mUserDictionary != null || mContactsDictionary != null) {
- if (mUserDictionary != null) {
- mUserDictionary.getWords(wordComposer, this, mNextLettersFrequencies);
- }
- if (mContactsDictionary != null) {
- mContactsDictionary.getWords(wordComposer, this, mNextLettersFrequencies);
- }
-
- if (mSuggestions.size() > 0 && isValidWord(mOriginalWord)
- && (mCorrectionMode == CORRECTION_FULL
- || mCorrectionMode == CORRECTION_FULL_BIGRAM)) {
- mHaveCorrection = true;
- }
- }
- mMainDict.getWords(wordComposer, this, mNextLettersFrequencies);
- if ((mCorrectionMode == CORRECTION_FULL || mCorrectionMode == CORRECTION_FULL_BIGRAM)
- && mSuggestions.size() > 0) {
- mHaveCorrection = 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;
+ for (final String key : mUnigramDictionaries.keySet()) {
+ // Skip AutoDictionary and WhitelistDictionary to lookup
+ if (key.equals(DICT_KEY_AUTO) || key.equals(DICT_KEY_WHITELIST))
+ continue;
+ final Dictionary dictionary = mUnigramDictionaries.get(key);
+ dictionary.getWords(wordComposer, this);
}
}
- if (mAutoTextEnabled) {
- int i = 0;
- int max = 6;
- // Don't autotext the suggestions from the dictionaries
- if (mCorrectionMode == CORRECTION_BASIC) max = 1;
- while (i < mSuggestions.size() && i < max) {
- String suggestedWord = mSuggestions.get(i).toString().toLowerCase();
- CharSequence autoText =
- AutoText.get(suggestedWord, 0, suggestedWord.length(), view);
- // Is there an AutoText correction?
- boolean canAdd = autoText != null;
+ CharSequence autoText = null;
+ final String typedWordString = typedWord == null ? null : typedWord.toString();
+ if (typedWord != null) {
+ // Apply quick fix only for the typed word.
+ if (mQuickFixesEnabled) {
+ final String lowerCaseTypedWord = typedWordString.toLowerCase();
+ CharSequence tempAutoText = capitalizeWord(
+ mIsAllUpperCase, mIsFirstCharCapitalized, AutoText.get(
+ lowerCaseTypedWord, 0, lowerCaseTypedWord.length(), view));
+ // TODO: cleanup canAdd
+ // Is there an AutoText (also known as Quick Fixes) correction?
+ // Capitalize as needed
+ boolean canAdd = tempAutoText != null;
// Is that correction already the current prediction (or original word)?
- canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i));
+ canAdd &= !TextUtils.equals(tempAutoText, typedWord);
// Is that correction already the next predicted word?
- if (canAdd && i + 1 < mSuggestions.size() && mCorrectionMode != CORRECTION_BASIC) {
- canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i + 1));
+ if (canAdd && mSuggestions.size() > 0 && mCorrectionMode != CORRECTION_BASIC) {
+ canAdd &= !TextUtils.equals(tempAutoText, mSuggestions.get(0));
}
if (canAdd) {
- mHaveCorrection = true;
- mSuggestions.add(i + 1, autoText);
- i++;
+ if (DBG) {
+ Log.d(TAG, "Auto corrected by AUTOTEXT.");
+ }
+ autoText = tempAutoText;
}
- i++;
}
}
+
+ CharSequence whitelistedWord = capitalizeWord(mIsAllUpperCase, mIsFirstCharCapitalized,
+ mWhiteListDictionary.getWhiteListedWord(typedWordString));
+
+ mAutoCorrection.updateAutoCorrectionStatus(mUnigramDictionaries, wordComposer,
+ mSuggestions, mPriorities, typedWord, mAutoCorrectionThreshold, mCorrectionMode,
+ autoText, whitelistedWord);
+
+ if (autoText != null) {
+ mSuggestions.add(0, autoText);
+ }
+
+ if (whitelistedWord != null) {
+ mSuggestions.add(0, whitelistedWord);
+ }
+
+ if (typedWord != null) {
+ mSuggestions.add(0, typedWordString);
+ }
removeDupes();
- return mSuggestions;
- }
- public int[] getNextLettersFrequencies() {
- return mNextLettersFrequencies;
+ if (DBG) {
+ double normalizedScore = mAutoCorrection.getNormalizedScore();
+ ArrayList<SuggestedWords.SuggestedWordInfo> frequencyInfoList =
+ new ArrayList<SuggestedWords.SuggestedWordInfo>();
+ frequencyInfoList.add(new SuggestedWords.SuggestedWordInfo("+", false));
+ final int priorityLength = mPriorities.length;
+ for (int i = 0; i < priorityLength; ++i) {
+ if (normalizedScore > 0) {
+ final String priorityThreshold = Integer.toString(mPriorities[i]) + " (" +
+ normalizedScore + ")";
+ frequencyInfoList.add(
+ new SuggestedWords.SuggestedWordInfo(priorityThreshold, false));
+ normalizedScore = 0.0;
+ } else {
+ final String priority = Integer.toString(mPriorities[i]);
+ frequencyInfoList.add(new SuggestedWords.SuggestedWordInfo(priority, false));
+ }
+ }
+ for (int i = priorityLength; i < mSuggestions.size(); ++i) {
+ frequencyInfoList.add(new SuggestedWords.SuggestedWordInfo("--", false));
+ }
+ return new SuggestedWords.Builder().addWords(mSuggestions, frequencyInfoList);
+ }
+ return new SuggestedWords.Builder().addWords(mSuggestions, null);
}
private void removeDupes() {
@@ -378,16 +415,16 @@ public class Suggest implements Dictionary.WordCallback {
}
}
- public boolean hasMinimalCorrection() {
- return mHaveCorrection;
+ public boolean hasAutoCorrection() {
+ return mAutoCorrection.hasAutoCorrection();
}
- private boolean compareCaseInsensitive(final String mLowerOriginalWord,
+ private static boolean compareCaseInsensitive(final String lowerOriginalWord,
final char[] word, final int offset, final int length) {
- final int originalLength = mLowerOriginalWord.length();
+ final int originalLength = lowerOriginalWord.length();
if (originalLength == length && Character.isUpperCase(word[offset])) {
for (int i = 0; i < originalLength; i++) {
- if (mLowerOriginalWord.charAt(i) != Character.toLowerCase(word[offset+i])) {
+ if (lowerOriginalWord.charAt(i) != Character.toLowerCase(word[offset+i])) {
return false;
}
}
@@ -396,6 +433,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;
@@ -416,7 +454,20 @@ public class Suggest implements Dictionary.WordCallback {
// Check if it's the same word, only caps are different
if (compareCaseInsensitive(mLowerOriginalWord, word, offset, length)) {
- pos = 0;
+ // TODO: remove this surrounding if clause and move this logic to
+ // getSuggestedWordBuilder.
+ if (suggestions.size() > 0) {
+ final String currentHighestWordLowerCase =
+ suggestions.get(0).toString().toLowerCase();
+ // If the current highest word is also equal to typed word, we need to compare
+ // frequency to determine the insertion position. This does not ensure strictly
+ // correct ordering, but ensures the top score is on top which is enough for
+ // removing duplicates correctly.
+ if (compareCaseInsensitive(currentHighestWordLowerCase, word, offset, length)
+ && freq <= priorities[0]) {
+ pos = 1;
+ }
+ }
} else {
if (dataType == Dictionary.DataType.UNIGRAM) {
// Check if the word was already added before (by bigram data)
@@ -451,14 +502,12 @@ 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);
- // TODO: Must pay attention to locale when changing case.
if (mIsAllUpperCase) {
sb.append(new String(word, offset, length).toUpperCase());
} else if (mIsFirstCharCapitalized) {
@@ -501,16 +550,6 @@ public class Suggest implements Dictionary.WordCallback {
return -1;
}
- public boolean isValidWord(final CharSequence word) {
- if (word == null || word.length() == 0) {
- return false;
- }
- return mMainDict.isValidWord(word)
- || (mUserDictionary != null && mUserDictionary.isValidWord(word))
- || (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,8 +568,12 @@ public class Suggest implements Dictionary.WordCallback {
}
public void close() {
- if (mMainDict != null) {
- mMainDict.close();
+ final Set<Dictionary> dictionaries = new HashSet<Dictionary>();
+ dictionaries.addAll(mUnigramDictionaries.values());
+ dictionaries.addAll(mBigramDictionaries.values());
+ for (final Dictionary dictionary : dictionaries) {
+ dictionary.close();
}
+ mMainDict = 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..fe7aac7c2
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -0,0 +1,184 @@
+/*
+ * 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, null);
+
+ public final List<CharSequence> mWords;
+ public final boolean mTypedWordValid;
+ public final boolean mHasMinimalSuggestion;
+ public final List<SuggestedWordInfo> mSuggestedWordInfoList;
+
+ private SuggestedWords(List<CharSequence> words, boolean typedWordValid,
+ boolean hasMinamlSuggestion, List<SuggestedWordInfo> suggestedWordInfoList) {
+ if (words != null) {
+ mWords = words;
+ } else {
+ mWords = Collections.emptyList();
+ }
+ 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 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());
+ 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);
+ }
+ }
+ mTypedWordValid = false;
+ mHasMinimalSuggestion = false;
+ return this;
+ }
+
+ public SuggestedWords build() {
+ return new SuggestedWords(mWords, 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..63196430b 100644
--- a/java/src/com/android/inputmethod/latin/TextEntryState.java
+++ b/java/src/com/android/inputmethod/latin/TextEntryState.java
@@ -16,116 +16,39 @@
package com.android.inputmethod.latin;
-import android.content.Context;
-import android.inputmethodservice.Keyboard.Key;
-import android.text.format.DateFormat;
import android.util.Log;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Calendar;
-
public class TextEntryState {
-
- private static final boolean DBG = false;
-
- private static final String TAG = "TextEntryState";
-
- private static boolean LOGGING = false;
-
- private static int sBackspaceCount = 0;
-
- private static int sAutoSuggestCount = 0;
-
- private static int sAutoSuggestUndoneCount = 0;
-
- private static int sManualSuggestCount = 0;
-
- private static int sWordNotInDictionaryCount = 0;
-
- private static int sSessionCount = 0;
-
- private static int sTypedChars;
-
- private static int sActualChars;
-
- public enum State {
- UNKNOWN,
- START,
- IN_WORD,
- ACCEPTED_DEFAULT,
- PICKED_SUGGESTION,
- PUNCTUATION_AFTER_WORD,
- PUNCTUATION_AFTER_ACCEPTED,
- SPACE_AFTER_ACCEPTED,
- SPACE_AFTER_PICKED,
- UNDO_COMMIT,
- CORRECTING,
- PICKED_CORRECTION;
+ private static final String TAG = TextEntryState.class.getSimpleName();
+ private static final boolean DEBUG = false;
+
+ private static final int UNKNOWN = 0;
+ private static final int START = 1;
+ private static final int IN_WORD = 2;
+ private static final int ACCEPTED_DEFAULT = 3;
+ private static final int PICKED_SUGGESTION = 4;
+ private static final int PUNCTUATION_AFTER_WORD = 5;
+ private static final int PUNCTUATION_AFTER_ACCEPTED = 6;
+ private static final int SPACE_AFTER_ACCEPTED = 7;
+ private static final int SPACE_AFTER_PICKED = 8;
+ private static final int UNDO_COMMIT = 9;
+ private static final int RECORRECTING = 10;
+ private static final int PICKED_RECORRECTION = 11;
+
+ private static int sState = UNKNOWN;
+ private static int sPreviousState = UNKNOWN;
+
+ private static void setState(final int newState) {
+ sPreviousState = sState;
+ sState = newState;
}
- private static State sState = State.UNKNOWN;
-
- private static FileOutputStream sKeyLocationFile;
- private static FileOutputStream sUserActionFile;
-
- public static void newSession(Context context) {
- sSessionCount++;
- sAutoSuggestCount = 0;
- sBackspaceCount = 0;
- sAutoSuggestUndoneCount = 0;
- sManualSuggestCount = 0;
- sWordNotInDictionaryCount = 0;
- sTypedChars = 0;
- sActualChars = 0;
- sState = State.START;
-
- if (LOGGING) {
- try {
- sKeyLocationFile = context.openFileOutput("key.txt", Context.MODE_APPEND);
- sUserActionFile = context.openFileOutput("action.txt", Context.MODE_APPEND);
- } catch (IOException ioe) {
- Log.e("TextEntryState", "Couldn't open file for output: " + ioe);
- }
- }
- }
-
- public static void endSession() {
- if (sKeyLocationFile == null) {
- return;
- }
- try {
- sKeyLocationFile.close();
- // Write to log file
- // Write timestamp, settings,
- String out = DateFormat.format("MM:dd hh:mm:ss", Calendar.getInstance().getTime())
- .toString()
- + " BS: " + sBackspaceCount
- + " auto: " + sAutoSuggestCount
- + " manual: " + sManualSuggestCount
- + " typed: " + sWordNotInDictionaryCount
- + " undone: " + sAutoSuggestUndoneCount
- + " saved: " + ((float) (sActualChars - sTypedChars) / sActualChars)
- + "\n";
- sUserActionFile.write(out.getBytes());
- sUserActionFile.close();
- sKeyLocationFile = null;
- sUserActionFile = null;
- } catch (IOException ioe) {
-
- }
- }
-
public static void acceptedDefault(CharSequence typedWord, CharSequence actualWord) {
if (typedWord == null) return;
- if (!typedWord.equals(actualWord)) {
- sAutoSuggestCount++;
- }
- sTypedChars += typedWord.length();
- sActualChars += actualWord.length();
- sState = State.ACCEPTED_DEFAULT;
+ setState(ACCEPTED_DEFAULT);
LatinImeLogger.logOnAutoSuggestion(typedWord.toString(), actualWord.toString());
- displayState();
+ if (DEBUG)
+ displayState("acceptedDefault", "typedWord", typedWord, "actualWord", actualWord);
}
// State.ACCEPTED_DEFAULT will be changed to other sub-states
@@ -134,145 +57,170 @@ 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:
+ setState(ACCEPTED_DEFAULT);
+ break;
+ default:
+ break;
}
- displayState();
+ if (DEBUG) displayState("backToAcceptedDefault", "typedWord", typedWord);
}
public static void acceptedTyped(CharSequence typedWord) {
- sWordNotInDictionaryCount++;
- sState = State.PICKED_SUGGESTION;
- displayState();
+ setState(PICKED_SUGGESTION);
+ if (DEBUG) displayState("acceptedTyped", "typedWord", typedWord);
}
public static void acceptedSuggestion(CharSequence typedWord, CharSequence actualWord) {
- sManualSuggestCount++;
- State oldState = sState;
- if (typedWord.equals(actualWord)) {
- acceptedTyped(typedWord);
- }
- if (oldState == State.CORRECTING || oldState == State.PICKED_CORRECTION) {
- sState = State.PICKED_CORRECTION;
+ if (sState == RECORRECTING || sState == PICKED_RECORRECTION) {
+ setState(PICKED_RECORRECTION);
} else {
- sState = State.PICKED_SUGGESTION;
+ setState(PICKED_SUGGESTION);
}
- displayState();
+ if (DEBUG)
+ displayState("acceptedSuggestion", "typedWord", typedWord, "actualWord", actualWord);
}
- public static void selectedForCorrection() {
- sState = State.CORRECTING;
- displayState();
+ public static void selectedForRecorrection() {
+ setState(RECORRECTING);
+ if (DEBUG) displayState("selectedForRecorrection");
+ }
+
+ public static void onAbortRecorrection() {
+ if (sState == RECORRECTING || sState == PICKED_RECORRECTION) {
+ setState(START);
+ }
+ if (DEBUG) displayState("onAbortRecorrection");
}
public static void typedCharacter(char c, boolean isSeparator) {
- boolean isSpace = c == ' ';
+ final boolean isSpace = (c == ' ');
switch (sState) {
- case IN_WORD:
- if (isSpace || isSeparator) {
- sState = State.START;
- } else {
- // State hasn't changed.
- }
- break;
- case ACCEPTED_DEFAULT:
- case SPACE_AFTER_PICKED:
- if (isSpace) {
- sState = State.SPACE_AFTER_ACCEPTED;
- } else if (isSeparator) {
- sState = State.PUNCTUATION_AFTER_ACCEPTED;
- } else {
- sState = State.IN_WORD;
- }
- break;
- case PICKED_SUGGESTION:
- case PICKED_CORRECTION:
- if (isSpace) {
- sState = State.SPACE_AFTER_PICKED;
- } else if (isSeparator) {
- // Swap
- sState = State.PUNCTUATION_AFTER_ACCEPTED;
- } else {
- sState = State.IN_WORD;
- }
- break;
- case START:
- case UNKNOWN:
- case SPACE_AFTER_ACCEPTED:
- case PUNCTUATION_AFTER_ACCEPTED:
- case PUNCTUATION_AFTER_WORD:
- if (!isSpace && !isSeparator) {
- sState = State.IN_WORD;
- } else {
- sState = State.START;
- }
- break;
- case UNDO_COMMIT:
- if (isSpace || isSeparator) {
- sState = State.ACCEPTED_DEFAULT;
- } else {
- sState = State.IN_WORD;
- }
- break;
- case CORRECTING:
- sState = State.START;
- break;
+ case IN_WORD:
+ if (isSpace || isSeparator) {
+ setState(START);
+ } else {
+ // State hasn't changed.
+ }
+ break;
+ case ACCEPTED_DEFAULT:
+ case SPACE_AFTER_PICKED:
+ case PUNCTUATION_AFTER_ACCEPTED:
+ if (isSpace) {
+ setState(SPACE_AFTER_ACCEPTED);
+ } else if (isSeparator) {
+ // Swap
+ setState(PUNCTUATION_AFTER_ACCEPTED);
+ } else {
+ setState(IN_WORD);
+ }
+ break;
+ case PICKED_SUGGESTION:
+ case PICKED_RECORRECTION:
+ if (isSpace) {
+ setState(SPACE_AFTER_PICKED);
+ } else if (isSeparator) {
+ // Swap
+ setState(PUNCTUATION_AFTER_ACCEPTED);
+ } else {
+ setState(IN_WORD);
+ }
+ break;
+ case START:
+ case UNKNOWN:
+ case SPACE_AFTER_ACCEPTED:
+ case PUNCTUATION_AFTER_WORD:
+ if (!isSpace && !isSeparator) {
+ setState(IN_WORD);
+ } else {
+ setState(START);
+ }
+ break;
+ case UNDO_COMMIT:
+ if (isSpace || isSeparator) {
+ setState(ACCEPTED_DEFAULT);
+ } else {
+ setState(IN_WORD);
+ }
+ break;
+ case RECORRECTING:
+ setState(START);
+ break;
}
- displayState();
+ if (DEBUG) displayState("typedCharacter", "char", c, "isSeparator", isSeparator);
}
public static void backspace() {
- if (sState == State.ACCEPTED_DEFAULT) {
- sState = State.UNDO_COMMIT;
- sAutoSuggestUndoneCount++;
+ if (sState == ACCEPTED_DEFAULT) {
+ setState(UNDO_COMMIT);
LatinImeLogger.logOnAutoSuggestionCanceled();
- } else if (sState == State.UNDO_COMMIT) {
- sState = State.IN_WORD;
+ } else if (sState == UNDO_COMMIT) {
+ setState(IN_WORD);
}
- sBackspaceCount++;
- displayState();
+ if (DEBUG) displayState("backspace");
}
public static void reset() {
- sState = State.START;
- displayState();
+ setState(START);
+ if (DEBUG) displayState("reset");
}
- public static State getState() {
- if (DBG) {
- Log.d(TAG, "Returning state = " + sState);
- }
- return sState;
+ public static boolean isAcceptedDefault() {
+ return sState == ACCEPTED_DEFAULT;
}
- public static boolean isCorrecting() {
- return sState == State.CORRECTING || sState == State.PICKED_CORRECTION;
+ public static boolean isSpaceAfterPicked() {
+ return sState == SPACE_AFTER_PICKED;
}
- 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
- + " Y: " + y
- + " MX: " + (key.x + key.width / 2)
- + " MY: " + (key.y + key.height / 2)
- + "\n";
- try {
- sKeyLocationFile.write(out.getBytes());
- } catch (IOException ioe) {
- // TODO: May run out of space
- }
+ public static boolean isUndoCommit() {
+ return sState == UNDO_COMMIT;
+ }
+
+ public static boolean isPunctuationAfterAccepted() {
+ return sState == PUNCTUATION_AFTER_ACCEPTED;
+ }
+
+ public static boolean isRecorrecting() {
+ return sState == RECORRECTING || sState == PICKED_RECORRECTION;
+ }
+
+ public static String getState() {
+ return stateName(sState);
+ }
+
+ private static String stateName(int state) {
+ switch (state) {
+ case START: return "START";
+ case IN_WORD: return "IN_WORD";
+ case ACCEPTED_DEFAULT: return "ACCEPTED_DEFAULT";
+ case PICKED_SUGGESTION: return "PICKED_SUGGESTION";
+ case PUNCTUATION_AFTER_WORD: return "PUNCTUATION_AFTER_WORD";
+ case PUNCTUATION_AFTER_ACCEPTED: return "PUNCTUATION_AFTER_ACCEPTED";
+ case SPACE_AFTER_ACCEPTED: return "SPACE_AFTER_ACCEPTED";
+ case SPACE_AFTER_PICKED: return "SPACE_AFTER_PICKED";
+ case UNDO_COMMIT: return "UNDO_COMMIT";
+ case RECORRECTING: return "RECORRECTING";
+ case PICKED_RECORRECTION: return "PICKED_RECORRECTION";
+ default: return "UNKNOWN";
}
}
- private static void displayState() {
- if (DBG) {
- Log.d(TAG, "State = " + sState);
+ private static void displayState(String title, Object ... args) {
+ final StringBuilder sb = new StringBuilder(title);
+ sb.append(':');
+ for (int i = 0; i < args.length; i += 2) {
+ sb.append(' ');
+ sb.append(args[i]);
+ sb.append('=');
+ sb.append(args[i+1].toString());
}
+ sb.append(" state=");
+ sb.append(stateName(sState));
+ sb.append(" previous=");
+ sb.append(stateName(sPreviousState));
+ Log.d(TAG, sb.toString());
}
}
-
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..656e6f8e0 100644
--- a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -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..c06bd736e 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();
@@ -107,9 +126,8 @@ public class UserDictionary extends ExpandableDictionary {
}
@Override
- public synchronized void getWords(final WordComposer codes, final WordCallback callback,
- int[] nextLettersFrequencies) {
- super.getWords(codes, callback, nextLettersFrequencies);
+ public synchronized void getWords(final WordComposer codes, final WordCallback callback) {
+ super.getWords(codes, callback);
}
@Override
@@ -119,12 +137,14 @@ public class UserDictionary extends ExpandableDictionary {
private void addWords(Cursor cursor) {
clearDictionary();
-
+ if (cursor == null) return;
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..1cbc434b6
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -0,0 +1,573 @@
+/*
+ * 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.content.res.Resources;
+import android.inputmethodservice.InputMethodService;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.text.InputType;
+import android.text.format.DateUtils;
+import android.util.Log;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import com.android.inputmethod.keyboard.KeyboardId;
+
+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;
+
+ private Utils() {
+ // Intentional empty constructor for utility class.
+ }
+
+ /**
+ * 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 GC_TAG = GCUtils.class.getSimpleName();
+ 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(GC_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];
+ }
+
+ // Get the current stack trace
+ public static String getStackTrace() {
+ StringBuilder sb = new StringBuilder();
+ try {
+ throw new RuntimeException();
+ } catch (RuntimeException e) {
+ StackTraceElement[] frames = e.getStackTrace();
+ // Start at 1 because the first frame is here and we don't care about it
+ for (int j = 1; j < frames.length; ++j) sb.append(frames[j].toString() + "\n");
+ }
+ return sb.toString();
+ }
+
+ // 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].)
+ // Then, the following processing is applied.
+ // - If the dictionary word is matched up to the point of the user entry
+ // (full match up to min(before.length(), after.length())
+ // => Then multiply by FULL_MATCHED_WORDS_PROMOTION_RATE (this is defined 1.2)
+ // - If the word is a true full match except for differences in accents or
+ // capitalization, then treat it as if the frequency was 255.
+ // - If before.length() == after.length()
+ // => multiply by mFullWordMultiplier (this is defined 2))
+ // So, maximum original score is pow(2, min(before.length(), after.length())) * 255 * 2 * 1.2
+ // For historical reasons we ignore the 1.2 modifier (because the measure for a good
+ // autocorrection threshold was done at a time when it didn't exist). This doesn't change
+ // the result.
+ // So, we can normalize original score by dividing pow(2, min(b.l(),a.l())) * 255 * 2.
+ private static final int MAX_INITIAL_SCORE = 255;
+ private static final int TYPED_LETTER_MULTIPLIER = 2;
+ private static final int FULL_WORD_MULTIPLIER = 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_MULTIPLIER;
+ // 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 USABILITY_TAG = UsabilityStudyLogUtils.class.getSimpleName();
+ 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(USABILITY_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(USABILITY_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(USABILITY_TAG, "Can't read log file.");
+ } finally {
+ if (LatinImeLogger.sDBG) {
+ Log.d(USABILITY_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(USABILITY_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 */);
+ }
+ }
+
+ public static int getKeyboardMode(EditorInfo attribute) {
+ if (attribute == null)
+ return KeyboardId.MODE_TEXT;
+
+ final int inputType = attribute.inputType;
+ final int variation = inputType & InputType.TYPE_MASK_VARIATION;
+
+ switch (inputType & InputType.TYPE_MASK_CLASS) {
+ case InputType.TYPE_CLASS_NUMBER:
+ case InputType.TYPE_CLASS_DATETIME:
+ return KeyboardId.MODE_NUMBER;
+ case InputType.TYPE_CLASS_PHONE:
+ return KeyboardId.MODE_PHONE;
+ case InputType.TYPE_CLASS_TEXT:
+ if (Utils.isEmailVariation(variation)) {
+ return KeyboardId.MODE_EMAIL;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_URI) {
+ return KeyboardId.MODE_URL;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE) {
+ return KeyboardId.MODE_IM;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
+ return KeyboardId.MODE_TEXT;
+ } else {
+ return KeyboardId.MODE_TEXT;
+ }
+ default:
+ return KeyboardId.MODE_TEXT;
+ }
+ }
+
+ public static boolean isEmailVariation(int variation) {
+ return variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
+ || variation == InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS;
+ }
+
+ public static boolean isWebInputType(int inputType) {
+ final int variation =
+ inputType & (InputType.TYPE_MASK_CLASS | InputType.TYPE_MASK_VARIATION);
+ return (variation
+ == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT))
+ || (variation
+ == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD))
+ || (variation
+ == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS));
+ }
+
+ // Please refer to TextView.isPasswordInputType
+ public static boolean isPasswordInputType(int inputType) {
+ final int variation =
+ inputType & (InputType.TYPE_MASK_CLASS | InputType.TYPE_MASK_VARIATION);
+ return (variation
+ == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD))
+ || (variation
+ == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD))
+ || (variation
+ == (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
+ }
+
+ // Please refer to TextView.isVisiblePasswordInputType
+ public static boolean isVisiblePasswordInputType(int inputType) {
+ final int variation =
+ inputType & (InputType.TYPE_MASK_CLASS | InputType.TYPE_MASK_VARIATION);
+ return variation
+ == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
+ }
+
+ public static boolean containsInCsv(String key, String csv) {
+ if (csv == null)
+ return false;
+ for (String option : csv.split(",")) {
+ if (option.equals(key))
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean inPrivateImeOptions(String packageName, String key,
+ EditorInfo attribute) {
+ if (attribute == null)
+ return false;
+ return containsInCsv(packageName != null ? packageName + "." + key : key,
+ attribute.privateImeOptions);
+ }
+
+ /**
+ * Returns a main dictionary resource id
+ * @return main dictionary resource id
+ */
+ public static int getMainDictionaryResourceId(Resources res) {
+ return res.getIdentifier("main", "raw", LatinIME.class.getPackage().getName());
+ }
+
+ public static void loadNativeLibrary() {
+ try {
+ System.loadLibrary("jni_latinime");
+ } catch (UnsatisfiedLinkError ule) {
+ Log.e(TAG, "Could not load native library jni_latinime");
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/WhitelistDictionary.java b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java
new file mode 100644
index 000000000..2389d4e3c
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java
@@ -0,0 +1,99 @@
+/*
+ * 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.text.TextUtils;
+import android.util.Log;
+import android.util.Pair;
+
+import java.util.HashMap;
+
+public class WhitelistDictionary extends Dictionary {
+
+ private static final boolean DBG = LatinImeLogger.sDBG;
+ private static final String TAG = WhitelistDictionary.class.getSimpleName();
+
+ private final HashMap<String, Pair<Integer, String>> mWhitelistWords =
+ new HashMap<String, Pair<Integer, String>>();
+
+ private static final WhitelistDictionary sInstance = new WhitelistDictionary();
+
+ private WhitelistDictionary() {
+ }
+
+ public static WhitelistDictionary init(Context context) {
+ synchronized (sInstance) {
+ if (context != null) {
+ sInstance.initWordlist(
+ context.getResources().getStringArray(R.array.wordlist_whitelist));
+ } else {
+ sInstance.mWhitelistWords.clear();
+ }
+ }
+ return sInstance;
+ }
+
+ private void initWordlist(String[] wordlist) {
+ mWhitelistWords.clear();
+ final int N = wordlist.length;
+ if (N % 3 != 0) {
+ if (DBG) {
+ Log.d(TAG, "The number of the whitelist is invalid.");
+ }
+ return;
+ }
+ try {
+ for (int i = 0; i < N; i += 3) {
+ final int score = Integer.valueOf(wordlist[i]);
+ final String before = wordlist[i + 1];
+ final String after = wordlist[i + 2];
+ if (before != null && after != null) {
+ mWhitelistWords.put(
+ before.toLowerCase(), new Pair<Integer, String>(score, after));
+ }
+ }
+ } catch (NumberFormatException e) {
+ if (DBG) {
+ Log.d(TAG, "The score of the word is invalid.");
+ }
+ }
+ }
+
+ public String getWhiteListedWord(String before) {
+ if (before == null) return null;
+ final String lowerCaseBefore = before.toLowerCase();
+ if(mWhitelistWords.containsKey(lowerCaseBefore)) {
+ if (DBG) {
+ Log.d(TAG, "--- found whiteListedWord: " + lowerCaseBefore);
+ }
+ return mWhitelistWords.get(lowerCaseBefore).second;
+ }
+ return null;
+ }
+
+ // Not used for WhitelistDictionary. We use getWhitelistedWord() in Suggest.java instead
+ @Override
+ public void getWords(WordComposer composer, WordCallback callback) {
+ }
+
+ @Override
+ public boolean isValidWord(CharSequence word) {
+ if (TextUtils.isEmpty(word)) return false;
+ return !TextUtils.isEmpty(getWhiteListedWord(word.toString()));
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index 2e415b771..02583895b 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -16,22 +16,32 @@
package com.android.inputmethod.latin;
+import com.android.inputmethod.keyboard.KeyDetector;
+
import java.util.ArrayList;
/**
* A place to store the currently composing word with information such as adjacent key codes as well
*/
public class WordComposer {
+
+ public static final int NOT_A_CODE = KeyDetector.NOT_A_CODE;
+ public static final int NOT_A_COORDINATE = -1;
+
/**
* The list of unicode values for each keystroke (including surrounding keys)
*/
private final ArrayList<int[]> mCodes;
-
+
+ private int mTypedLength;
+ private final int[] mXCoordinates;
+ private final int[] mYCoordinates;
+
/**
* The word chosen from the candidate list, until it is committed.
*/
private String mPreferredWord;
-
+
private final StringBuilder mTypedWord;
private int mCapsCount;
@@ -44,17 +54,24 @@ public class WordComposer {
private boolean mIsFirstCharCapitalized;
public WordComposer() {
- mCodes = new ArrayList<int[]>(12);
- mTypedWord = new StringBuilder(20);
+ final int N = BinaryDictionary.MAX_WORD_LENGTH;
+ mCodes = new ArrayList<int[]>(N);
+ mTypedWord = new StringBuilder(N);
+ mTypedLength = 0;
+ mXCoordinates = new int[N];
+ mYCoordinates = new int[N];
}
- WordComposer(WordComposer copy) {
- mCodes = new ArrayList<int[]>(copy.mCodes);
- mPreferredWord = copy.mPreferredWord;
- mTypedWord = new StringBuilder(copy.mTypedWord);
- mCapsCount = copy.mCapsCount;
- mAutoCapitalized = copy.mAutoCapitalized;
- mIsFirstCharCapitalized = copy.mIsFirstCharCapitalized;
+ WordComposer(WordComposer source) {
+ mCodes = new ArrayList<int[]>(source.mCodes);
+ mPreferredWord = source.mPreferredWord;
+ mTypedWord = new StringBuilder(source.mTypedWord);
+ mCapsCount = source.mCapsCount;
+ mAutoCapitalized = source.mAutoCapitalized;
+ mIsFirstCharCapitalized = source.mIsFirstCharCapitalized;
+ mTypedLength = source.mTypedLength;
+ mXCoordinates = source.mXCoordinates;
+ mYCoordinates = source.mYCoordinates;
}
/**
@@ -62,6 +79,7 @@ public class WordComposer {
*/
public void reset() {
mCodes.clear();
+ mTypedLength = 0;
mIsFirstCharCapitalized = false;
mPreferredWord = null;
mTypedWord.setLength(0);
@@ -85,15 +103,28 @@ public class WordComposer {
return mCodes.get(index);
}
+ public int[] getXCoordinates() {
+ return mXCoordinates;
+ }
+
+ public int[] getYCoordinates() {
+ return mYCoordinates;
+ }
+
/**
* Add a new keystroke, with codes[0] containing the pressed key's unicode and the rest of
* the array containing unicode for adjacent keys, sorted by reducing probability/proximity.
* @param codes the array of unicode values
*/
- public void add(int primaryCode, int[] codes) {
+ public void add(int primaryCode, int[] codes, int x, int y) {
mTypedWord.append((char) primaryCode);
correctPrimaryJuxtapos(primaryCode, codes);
mCodes.add(codes);
+ if (mTypedLength < BinaryDictionary.MAX_WORD_LENGTH) {
+ mXCoordinates[mTypedLength] = x;
+ mYCoordinates[mTypedLength] = y;
+ }
+ ++mTypedLength;
if (Character.isUpperCase((char) primaryCode)) mCapsCount++;
}
@@ -124,6 +155,9 @@ public class WordComposer {
mTypedWord.deleteCharAt(lastPos);
if (Character.isUpperCase(last)) mCapsCount--;
}
+ if (mTypedLength > 0) {
+ --mTypedLength;
+ }
}
/**
diff --git a/java/src/com/android/inputmethod/voice/FieldContext.java b/java/src/com/android/inputmethod/voice/FieldContext.java
index 5fbacfb6c..95c7f5be0 100644
--- a/java/src/com/android/inputmethod/voice/FieldContext.java
+++ b/java/src/com/android/inputmethod/voice/FieldContext.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
@@ -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..f5689092f 100644
--- a/java/src/com/android/inputmethod/latin/Hints.java
+++ b/java/src/com/android/inputmethod/voice/Hints.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
@@ -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..d26a877d5 100644
--- a/java/src/com/android/inputmethod/voice/RecognitionView.java
+++ b/java/src/com/android/inputmethod/voice/RecognitionView.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
@@ -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..372e8d6da 100644
--- a/java/src/com/android/inputmethod/voice/SettingsUtil.java
+++ b/java/src/com/android/inputmethod/voice/SettingsUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
@@ -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..40b68996a
--- /dev/null
+++ b/java/src/com/android/inputmethod/voice/SoundIndicator.java
@@ -0,0 +1,155 @@
+/*
+ * 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.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..a244c9e41
--- /dev/null
+++ b/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java
@@ -0,0 +1,728 @@
+/*
+ * 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.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 com.android.inputmethod.latin.Utils;
+
+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.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.URLSpan;
+import android.util.Log;
+import android.view.LayoutInflater;
+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";
+ private static final int RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO = 6;
+
+ private static final String TAG = VoiceIMEConnector.class.getSimpleName();
+ private static final 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 UrlLinkAlertDialogBuilder(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();
+ final Window window = mVoiceWarningDialog.getWindow();
+ final 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();
+ }
+
+ private static class UrlLinkAlertDialogBuilder extends AlertDialog.Builder {
+ private AlertDialog mAlertDialog;
+
+ public UrlLinkAlertDialogBuilder(Context context) {
+ super(context);
+ }
+
+ @Override
+ public AlertDialog.Builder setMessage(CharSequence message) {
+ return super.setMessage(replaceURLSpan(message));
+ }
+
+ private Spanned replaceURLSpan(CharSequence message) {
+ // Replace all spans with the custom span
+ final SpannableStringBuilder ssb = new SpannableStringBuilder(message);
+ for (URLSpan span : ssb.getSpans(0, ssb.length(), URLSpan.class)) {
+ int spanStart = ssb.getSpanStart(span);
+ int spanEnd = ssb.getSpanEnd(span);
+ int spanFlags = ssb.getSpanFlags(span);
+ ssb.removeSpan(span);
+ ssb.setSpan(new ClickableSpan(span.getURL()), spanStart, spanEnd, spanFlags);
+ }
+ return ssb;
+ }
+
+ @Override
+ public AlertDialog create() {
+ final AlertDialog dialog = super.create();
+
+ dialog.setOnShowListener(new DialogInterface.OnShowListener() {
+ @Override
+ public void onShow(DialogInterface dialogInterface) {
+ // Make URL in the dialog message click-able.
+ TextView textView = (TextView) mAlertDialog.findViewById(android.R.id.message);
+ if (textView != null) {
+ textView.setMovementMethod(LinkMovementMethod.getInstance());
+ }
+ }
+ });
+ mAlertDialog = dialog;
+ return dialog;
+ }
+
+ class ClickableSpan extends URLSpan {
+ public ClickableSpan(String url) {
+ super(url);
+ }
+
+ @Override
+ public void onClick(View widget) {
+ Uri uri = Uri.parse(getURL());
+ Context context = widget.getContext();
+ Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ // Add this flag to start an activity from service
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
+ // Dismiss the warning dialog and go back to the previous IME.
+ // TODO: If we can find a way to bring the new activity to front while keeping
+ // the warning dialog, we don't need to dismiss it here.
+ mAlertDialog.cancel();
+ context.startActivity(intent);
+ }
+ }
+ }
+
+ 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) {
+ final boolean noMic = Utils.inPrivateImeOptions(null,
+ LatinIME.IME_OPTION_NO_MICROPHONE_COMPAT, attribute)
+ || Utils.inPrivateImeOptions(mService.getPackageName(),
+ LatinIME.IME_OPTION_NO_MICROPHONE, attribute);
+ return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext) && !noMic
+ && 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();
+ }
+
+ private 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..392eea364 100644
--- a/java/src/com/android/inputmethod/voice/VoiceInput.java
+++ b/java/src/com/android/inputmethod/voice/VoiceInput.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
@@ -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..07f2bd1c5 100644
--- a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
+++ b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Google Inc.
+ * 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
@@ -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..b0ea99b79 100644
--- a/java/src/com/android/inputmethod/voice/WaveformImage.java
+++ b/java/src/com/android/inputmethod/voice/WaveformImage.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008-2009 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
@@ -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..adbd59135 100644
--- a/java/src/com/android/inputmethod/voice/Whitelist.java
+++ b/java/src/com/android/inputmethod/voice/Whitelist.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
@@ -17,6 +17,7 @@
package com.android.inputmethod.voice;
import android.os.Bundle;
+
import java.util.ArrayList;
import java.util.List;