aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--[-rwxr-xr-x]java/AndroidManifest.xml6
-rw-r--r--java/proguard.flags8
-rw-r--r--java/res/drawable-hdpi/btn_candidate_normal.9.pngbin0 -> 215 bytes
-rw-r--r--java/res/drawable-hdpi/btn_candidate_pressed.9.png (renamed from java/res/drawable-hdpi/list_selector_background_pressed.9.png)bin4203 -> 4203 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.pngbin0 -> 520 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.pngbin0 -> 808 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.pngbin0 -> 1154 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.pngbin0 -> 718 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.pngbin0 -> 963 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.pngbin0 -> 1319 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.pngbin0 -> 689 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.pngbin0 -> 780 bytes
-rw-r--r--java/res/drawable-hdpi/btn_keyboard_key_popup_selected_holo.9.pngbin0 -> 145 bytes
-rw-r--r--java/res/drawable-hdpi/ic_subtype_keyboard.pngbin1068 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/ic_subtype_mic.pngbin681 -> 0 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_at_holo.9.pngbin0 -> 789 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_at_large_holo.9.pngbin0 -> 958 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_colon_holo.9.pngbin0 -> 1219 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_colon_large_holo.9.pngbin0 -> 360 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_comma_holo.9.pngbin0 -> 1195 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_dash_holo.9.pngbin0 -> 1185 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_doublecross_holo.9.pngbin0 -> 1449 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_equal_holo.9.pngbin0 -> 1292 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_exclamation_holo.9.pngbin0 -> 413 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 520 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_larger_holo.9.pngbin0 -> 1315 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_parenclose_holo.9.pngbin0 -> 1316 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_parenopen_holo.9.pngbin0 -> 1333 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_period_holo.9.pngbin0 -> 1164 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_plus_holo.9.pngbin0 -> 1340 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_plus_large_holo.9.pngbin0 -> 1914 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_question_holo.9.pngbin0 -> 560 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_question_large_holo.9.pngbin0 -> 683 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_quote_holo.9.pngbin0 -> 342 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_quote_large_holo.9.pngbin0 -> 398 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_semicolon_holo.9.pngbin0 -> 1248 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_simplequote_holo.9.pngbin0 -> 1205 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_slash_holo.9.pngbin0 -> 1317 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_slash_large_holo.9.pngbin0 -> 1933 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_smaller_holo.9.pngbin0 -> 1326 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_star_holo.9.pngbin0 -> 1344 bytes
-rw-r--r--java/res/drawable-hdpi/key_hint_underline_holo.9.pngbin0 -> 276 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_background_holo.9.pngbin0 -> 292 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 1004 bytes
-rw-r--r--java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.pngbin0 -> 4797 bytes
-rw-r--r--java/res/drawable-hdpi/mic_slash_holo.pngbin0 -> 4317 bytes
-rw-r--r--java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.pngbin0 -> 803 bytes
-rw-r--r--[-rwxr-xr-x]java/res/drawable-hdpi/working.pngbin1180 -> 1180 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_normal.9.pngbin0 -> 737 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.pngbin0 -> 941 bytes
-rw-r--r--java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.pngbin0 -> 2691 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.pngbin0 -> 1076 bytes
-rw-r--r--java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.pngbin0 -> 2720 bytes
-rw-r--r--java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.pngbin0 -> 2517 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.pngbin0 -> 733 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.pngbin0 -> 964 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.pngbin0 -> 1055 bytes
-rwxr-xr-xjava/res/drawable-land-hdpi/keyboard_suggest_strip_divider.pngbin0 -> 172 bytes
-rw-r--r--java/res/drawable-land-mdpi/hint_popup_holo.9.pngbin0 -> 1180 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_at_holo.9.pngbin0 -> 1592 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_at_large_holo.9.pngbin0 -> 1651 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_colon_holo.9.pngbin0 -> 1262 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.pngbin0 -> 1836 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_comma_holo.9.pngbin0 -> 1241 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_dash_holo.9.pngbin0 -> 1196 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.pngbin0 -> 1621 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_equal_holo.9.pngbin0 -> 1295 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.pngbin0 -> 1293 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 1338 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_larger_holo.9.pngbin0 -> 1453 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.pngbin0 -> 1427 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.pngbin0 -> 1461 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_period_holo.9.pngbin0 -> 1214 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_plus_holo.9.pngbin0 -> 1362 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.pngbin0 -> 1997 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_question_holo.9.pngbin0 -> 1414 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_question_large_holo.9.pngbin0 -> 1473 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_quote_holo.9.pngbin0 -> 1230 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.pngbin0 -> 1249 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.pngbin0 -> 1327 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.pngbin0 -> 1242 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_slash_holo.9.pngbin0 -> 1429 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.pngbin0 -> 770 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_smaller_holo.9.pngbin0 -> 1408 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_star_holo.9.pngbin0 -> 1480 bytes
-rw-r--r--java/res/drawable-land-mdpi/key_hint_underline_holo.9.pngbin0 -> 1140 bytes
-rw-r--r--java/res/drawable-mdpi/btn_candidate_normal.9.pngbin0 -> 205 bytes
-rw-r--r--java/res/drawable-mdpi/btn_candidate_pressed.9.png (renamed from java/res/drawable-mdpi/list_selector_background_pressed.9.png)bin11006 -> 11006 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.pngbin0 -> 1269 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.pngbin0 -> 1651 bytes
-rw-r--r--java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_holo.9.pngbin0 -> 1857 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 -> 1035 bytes
-rw-r--r--java/res/drawable-mdpi/cancel_holo.9.pngbin0 -> 2419 bytes
-rw-r--r--java/res/drawable-mdpi/hint_popup_holo.9.pngbin0 -> 1187 bytes
-rw-r--r--java/res/drawable-mdpi/ic_subtype_keyboard.pngbin498 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/ic_subtype_mic.pngbin483 -> 0 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_at_holo.9.pngbin0 -> 1592 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_at_large_holo.9.pngbin0 -> 1651 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_colon_holo.9.pngbin0 -> 1219 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_colon_large_holo.9.pngbin0 -> 360 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_comma_holo.9.pngbin0 -> 1195 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_dash_holo.9.pngbin0 -> 1185 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_doublecross_holo.9.pngbin0 -> 1449 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_equal_holo.9.pngbin0 -> 1292 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_exclamation_holo.9.pngbin0 -> 1293 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.pngbin0 -> 1338 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_larger_holo.9.pngbin0 -> 1315 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_parenclose_holo.9.pngbin0 -> 1316 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_parenopen_holo.9.pngbin0 -> 1333 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_period_holo.9.pngbin0 -> 1164 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_plus_holo.9.pngbin0 -> 1340 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_plus_large_holo.9.pngbin0 -> 1914 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_question_holo.9.pngbin0 -> 1414 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_question_large_holo.9.pngbin0 -> 1473 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_quote_holo.9.pngbin0 -> 1230 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_quote_large_holo.9.pngbin0 -> 1249 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_semicolon_holo.9.pngbin0 -> 1248 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_simplequote_holo.9.pngbin0 -> 1205 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_slash_holo.9.pngbin0 -> 1317 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_slash_large_holo.9.pngbin0 -> 1933 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_smaller_holo.9.pngbin0 -> 1326 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_star_holo.9.pngbin0 -> 1344 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_underline_holo.9.pngbin0 -> 1140 bytes
-rw-r--r--java/res/drawable-mdpi/key_hint_underline_large_holo.9.pngbin0 -> 1154 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_background_holo.9.pngbin0 -> 1108 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_at.9.pngbin0 -> 1180 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_colon.9.pngbin0 -> 1082 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_doublecross.9.pngbin0 -> 1157 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_exclamation.9.pngbin0 -> 1095 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_greater.9.pngbin0 -> 1133 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_plus.9.pngbin0 -> 1116 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_question.9.pngbin0 -> 1140 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_quote.9.pngbin0 -> 1077 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_smaller.9.pngbin0 -> 1130 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_hint_star.9.pngbin0 -> 1136 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.pngbin0 -> 1004 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.pngbin0 -> 3895 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_popup_panel_background_holo.9.pngbin0 -> 3706 bytes
-rw-r--r--java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.pngbin0 -> 1003 bytes
-rw-r--r--java/res/drawable-mdpi/mic_slash_holo.pngbin0 -> 4317 bytes
-rw-r--r--java/res/drawable-mdpi/ok_cancel_holo.9.pngbin0 -> 1457 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level0_holo.pngbin0 -> 3457 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level1_holo.pngbin0 -> 3678 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level2_holo.pngbin0 -> 3659 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level3_holo.pngbin0 -> 4028 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level4_holo.pngbin0 -> 4127 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level5_holo.pngbin0 -> 4139 bytes
-rw-r--r--java/res/drawable-mdpi/speak_now_level6_holo.pngbin0 -> 3896 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_delete_holo.pngbin0 -> 1420 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num0_holo.pngbin0 -> 1765 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num1_holo.pngbin0 -> 1325 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 -> 2150 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 -> 2030 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num6_holo.pngbin0 -> 2499 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 -> 2237 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_num9_holo.pngbin0 -> 2705 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 -> 1418 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 -> 1483 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_smiley_holo.pngbin0 -> 1262 bytes
-rw-r--r--java/res/drawable-mdpi/sym_keyboard_space_holo.pngbin0 -> 1201 bytes
-rw-r--r--java/res/drawable/btn_candidate.xml (renamed from java/res/xml/popup_slash.xml)24
-rw-r--r--java/res/drawable/btn_candidate_holo.xml (renamed from java/res/xml/popup_comma.xml)22
-rw-r--r--java/res/drawable/btn_keyboard_key_honeycomb.xml43
-rw-r--r--java/res/drawable/btn_keyboard_key_honeycomb_popup.xml20
-rw-r--r--java/res/drawable/ic_subtype_keyboard.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_cs.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_da.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_de.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_en_gb.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_en_us.pngbin0 -> 2390 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_es.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_es_us.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_fr.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_fr_ca.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_fr_ch.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_it.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_nb.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_nl.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_ru.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_sr.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_keyboard_sv.pngbin0 -> 2367 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_cs.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_de.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_en_au.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_en_gb.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_en_in.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_en_nz.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_en_us.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_es.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_fr.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_ja.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_ko.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_pl.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_pt.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_ru.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_tr.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_zh_cn.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/ic_subtype_mic_zh_tw.pngbin0 -> 2557 bytes
-rw-r--r--java/res/drawable/keyboard_key_feedback_honeycomb.xml21
-rw-r--r--java/res/layout-xlarge/candidate.xml60
-rw-r--r--java/res/layout-xlarge/candidate_preview.xml (renamed from java/res/xml/popup_at.xml)26
-rw-r--r--java/res/layout-xlarge/candidates.xml45
-rw-r--r--java/res/layout-xlarge/keyboard_popup_honeycomb.xml41
-rw-r--r--java/res/layout/candidate.xml60
-rw-r--r--java/res/layout/candidates.xml51
-rw-r--r--java/res/layout/input_basic.xml2
-rw-r--r--java/res/layout/input_basic_highcontrast.xml2
-rw-r--r--java/res/layout/input_gingerbread.xml6
-rw-r--r--java/res/layout/input_honeycomb.xml39
-rw-r--r--java/res/layout/input_stone_bold.xml7
-rw-r--r--java/res/layout/input_stone_normal.xml4
-rw-r--r--java/res/layout/input_stone_popup.xml4
-rw-r--r--java/res/layout/key_preview_honeycomb.xml29
-rw-r--r--java/res/layout/keyboard_popup.xml4
-rw-r--r--java/res/layout/keyboard_popup_honeycomb.xml41
-rw-r--r--java/res/layout/recognition_status.xml2
-rw-r--r--[-rwxr-xr-x]java/res/raw/main.dictbin34 -> 34 bytes
-rw-r--r--[-rwxr-xr-x]java/res/raw/type3.oggbin4126 -> 4126 bytes
-rw-r--r--java/res/values-ar/config.xml25
-rw-r--r--java/res/values-ar/strings.xml195
-rw-r--r--java/res/values-bg/config.xml25
-rw-r--r--java/res/values-bg/strings.xml195
-rw-r--r--java/res/values-ca/config.xml25
-rw-r--r--java/res/values-ca/strings.xml195
-rw-r--r--java/res/values-cs/config.xml25
-rw-r--r--java/res/values-cs/donottranslate-altchars.xml21
-rw-r--r--java/res/values-cs/strings.xml176
-rw-r--r--java/res/values-da/config.xml25
-rw-r--r--java/res/values-da/donottranslate-altchars.xml32
-rw-r--r--java/res/values-da/strings.xml176
-rw-r--r--java/res/values-de/config.xml25
-rw-r--r--java/res/values-de/donottranslate-altchars.xml10
-rw-r--r--java/res/values-de/strings.xml176
-rw-r--r--java/res/values-el/config.xml25
-rw-r--r--java/res/values-el/strings.xml176
-rw-r--r--java/res/values-en-rGB/config.xml25
-rw-r--r--java/res/values-en-rGB/strings.xml193
-rw-r--r--java/res/values-en/donottranslate-altchars.xml11
-rw-r--r--java/res/values-es-rUS/config.xml25
-rw-r--r--java/res/values-es-rUS/strings.xml176
-rw-r--r--java/res/values-es/config.xml25
-rw-r--r--java/res/values-es/donottranslate-altchars.xml10
-rw-r--r--java/res/values-es/strings.xml176
-rw-r--r--java/res/values-fa/config.xml25
-rw-r--r--java/res/values-fa/strings.xml195
-rw-r--r--java/res/values-fi/config.xml25
-rw-r--r--java/res/values-fi/strings.xml195
-rw-r--r--java/res/values-fr/config.xml25
-rw-r--r--java/res/values-fr/donottranslate-altchars.xml10
-rw-r--r--java/res/values-fr/strings.xml176
-rw-r--r--java/res/values-hr/config.xml25
-rw-r--r--java/res/values-hr/strings.xml195
-rw-r--r--java/res/values-hu/config.xml25
-rw-r--r--java/res/values-hu/strings.xml195
-rw-r--r--java/res/values-in/config.xml25
-rw-r--r--java/res/values-in/strings.xml195
-rw-r--r--java/res/values-it/config.xml25
-rw-r--r--java/res/values-it/donottranslate-altchars.xml11
-rw-r--r--java/res/values-it/strings.xml176
-rw-r--r--java/res/values-iw/config.xml25
-rw-r--r--java/res/values-iw/strings.xml195
-rw-r--r--java/res/values-ja/config.xml25
-rw-r--r--java/res/values-ja/strings.xml176
-rw-r--r--java/res/values-ko/config.xml25
-rw-r--r--java/res/values-ko/strings.xml176
-rw-r--r--java/res/values-land/dimens.xml11
-rw-r--r--java/res/values-lt/config.xml25
-rw-r--r--java/res/values-lt/strings.xml195
-rw-r--r--java/res/values-lv/config.xml25
-rw-r--r--java/res/values-lv/strings.xml195
-rw-r--r--java/res/values-nb/config.xml25
-rw-r--r--java/res/values-nb/donottranslate-altchars.xml30
-rw-r--r--java/res/values-nb/strings.xml176
-rw-r--r--java/res/values-nl/config.xml25
-rw-r--r--java/res/values-nl/donottranslate-altchars.xml30
-rw-r--r--java/res/values-nl/strings.xml176
-rw-r--r--java/res/values-pl/config.xml25
-rw-r--r--java/res/values-pl/donottranslate-altchars.xml9
-rw-r--r--java/res/values-pl/strings.xml176
-rw-r--r--java/res/values-pt-rPT/config.xml25
-rw-r--r--java/res/values-pt-rPT/donottranslate-altchars.xml30
-rw-r--r--java/res/values-pt-rPT/strings.xml176
-rw-r--r--java/res/values-pt/config.xml25
-rw-r--r--java/res/values-pt/donottranslate-altchars.xml30
-rw-r--r--java/res/values-pt/strings.xml176
-rw-r--r--java/res/values-rm/config.xml25
-rw-r--r--java/res/values-rm/donottranslate-altchars.xml10
-rw-r--r--java/res/values-rm/strings.xml206
-rw-r--r--java/res/values-ro/config.xml25
-rw-r--r--java/res/values-ro/strings.xml195
-rw-r--r--java/res/values-ru/config.xml25
-rw-r--r--java/res/values-ru/donottranslate-altchars.xml9
-rw-r--r--java/res/values-ru/strings.xml176
-rw-r--r--java/res/values-sk/config.xml25
-rw-r--r--java/res/values-sk/strings.xml195
-rw-r--r--java/res/values-sl/config.xml25
-rw-r--r--java/res/values-sl/strings.xml195
-rw-r--r--java/res/values-sr/config.xml25
-rw-r--r--java/res/values-sr/strings.xml457
-rw-r--r--java/res/values-sv/config.xml25
-rw-r--r--java/res/values-sv/donottranslate-altchars.xml32
-rw-r--r--java/res/values-sv/strings.xml176
-rw-r--r--java/res/values-th/config.xml25
-rw-r--r--java/res/values-th/strings.xml195
-rw-r--r--java/res/values-tl/config.xml25
-rw-r--r--java/res/values-tl/strings.xml195
-rw-r--r--java/res/values-tr/config.xml25
-rw-r--r--java/res/values-tr/donottranslate-altchars.xml14
-rw-r--r--java/res/values-tr/strings.xml176
-rw-r--r--java/res/values-uk/config.xml25
-rw-r--r--java/res/values-uk/strings.xml195
-rw-r--r--java/res/values-vi/config.xml25
-rw-r--r--java/res/values-vi/strings.xml195
-rw-r--r--java/res/values-xlarge-land/dimens.xml39
-rw-r--r--java/res/values-xlarge/config.xml31
-rw-r--r--java/res/values-xlarge/dimens.xml50
-rw-r--r--java/res/values-xlarge/donottranslate.xml (renamed from java/res/values-zh-rCN/donottranslate-altchars.xml)11
-rw-r--r--java/res/values-zh-rCN/config.xml25
-rw-r--r--java/res/values-zh-rCN/strings.xml176
-rw-r--r--java/res/values-zh-rTW/config.xml25
-rw-r--r--java/res/values-zh-rTW/strings.xml176
-rw-r--r--java/res/values/attrs.xml137
-rw-r--r--java/res/values/bools.xml7
-rw-r--r--java/res/values/config.xml28
-rw-r--r--java/res/values/dimens.xml46
-rw-r--r--java/res/values/donottranslate-altchars.xml31
-rw-r--r--java/res/values/donottranslate.xml114
-rw-r--r--java/res/values/keycodes.xml5
-rw-r--r--java/res/values/strings.xml329
-rw-r--r--java/res/values/styles.xml8
-rw-r--r--java/res/xml-da-xlarge/kbd_qwerty.xml (renamed from java/res/values-el/donottranslate-altchars.xml)31
-rw-r--r--java/res/xml-da/kbd_qwerty.xml518
-rw-r--r--java/res/xml-da/kbd_qwerty_black.xml478
-rw-r--r--java/res/xml-de-xlarge/kbd_qwerty.xml (renamed from java/res/values-ja/donottranslate-altchars.xml)28
-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-fr-rCA-xlarge/kbd_qwerty.xml (renamed from java/res/values-ko/donottranslate-altchars.xml)28
-rw-r--r--java/res/xml-fr-rCA/kbd_qwerty.xml34
-rw-r--r--java/res/xml-fr-rCH-xlarge/kbd_qwerty.xml34
-rw-r--r--java/res/xml-fr-rCH/kbd_qwerty.xml34
-rw-r--r--java/res/xml-fr-xlarge/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-iw/kbd_qwerty.xml470
-rw-r--r--java/res/xml-iw/kbd_qwerty_black.xml416
-rw-r--r--java/res/xml-nb-xlarge/kbd_qwerty.xml (renamed from java/res/values-es-rUS/donottranslate-altchars.xml)31
-rw-r--r--java/res/xml-nb/kbd_qwerty.xml518
-rw-r--r--java/res/xml-nb/kbd_qwerty_black.xml478
-rw-r--r--java/res/xml-ru-xlarge/kbd_qwerty.xml148
-rw-r--r--java/res/xml-ru/kbd_qwerty.xml531
-rw-r--r--java/res/xml-ru/kbd_qwerty_black.xml456
-rw-r--r--java/res/xml-sr-xlarge/kbd_qwerty.xml158
-rw-r--r--java/res/xml-sr/kbd_qwerty.xml522
-rw-r--r--java/res/xml-sr/kbd_qwerty_black.xml449
-rw-r--r--java/res/xml-sv-xlarge/kbd_qwerty.xml41
-rw-r--r--java/res/xml-sv/kbd_qwerty.xml517
-rw-r--r--java/res/xml-sv/kbd_qwerty_black.xml480
-rw-r--r--java/res/xml-xlarge-land/kbd_popup_template.xml27
-rw-r--r--java/res/xml-xlarge/kbd_azerty_rows.xml168
-rw-r--r--java/res/xml-xlarge/kbd_key_styles.xml160
-rw-r--r--java/res/xml-xlarge/kbd_number.xml141
-rw-r--r--java/res/xml-xlarge/kbd_numkey_styles.xml150
-rw-r--r--java/res/xml-xlarge/kbd_phone.xml149
-rw-r--r--java/res/xml-xlarge/kbd_phone_symbols.xml161
-rw-r--r--java/res/xml-xlarge/kbd_popup_template.xml27
-rw-r--r--java/res/xml-xlarge/kbd_qwerty.xml (renamed from java/res/values-zh-rTW/donottranslate-altchars.xml)25
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_row1.xml68
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_row2.xml60
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_row3.xml78
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_row4.xml120
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_rows.xml34
-rw-r--r--java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml117
-rw-r--r--java/res/xml-xlarge/kbd_qwertz_rows.xml127
-rw-r--r--java/res/xml-xlarge/kbd_symbols.xml168
-rw-r--r--java/res/xml-xlarge/kbd_symbols_shift.xml145
-rw-r--r--java/res/xml/kbd_azerty_rows.xml137
-rw-r--r--java/res/xml/kbd_key_styles.xml290
-rw-r--r--java/res/xml/kbd_number.xml112
-rw-r--r--java/res/xml/kbd_numkey_styles.xml150
-rw-r--r--java/res/xml/kbd_phone.xml102
-rw-r--r--java/res/xml/kbd_phone_black.xml101
-rw-r--r--java/res/xml/kbd_phone_symbols.xml98
-rw-r--r--java/res/xml/kbd_phone_symbols_black.xml98
-rw-r--r--java/res/xml/kbd_popup_narrow_template.xml10
-rw-r--r--java/res/xml/kbd_popup_template.xml10
-rw-r--r--java/res/xml/kbd_qwerty.xml493
-rw-r--r--java/res/xml/kbd_qwerty_black.xml447
-rw-r--r--java/res/xml/kbd_qwerty_black_symbol.xml84
-rw-r--r--java/res/xml/kbd_qwerty_f1.xml63
-rw-r--r--java/res/xml/kbd_qwerty_row1.xml71
-rw-r--r--java/res/xml/kbd_qwerty_row2.xml55
-rw-r--r--java/res/xml/kbd_qwerty_row3.xml54
-rw-r--r--java/res/xml/kbd_qwerty_row4.xml138
-rw-r--r--java/res/xml/kbd_qwerty_rows.xml34
-rw-r--r--java/res/xml/kbd_qwerty_rows_scandinavia.xml118
-rw-r--r--java/res/xml/kbd_qwertz_rows.xml107
-rw-r--r--java/res/xml/kbd_symbols.xml223
-rw-r--r--java/res/xml/kbd_symbols_black.xml202
-rw-r--r--java/res/xml/kbd_symbols_f1.xml41
-rw-r--r--java/res/xml/kbd_symbols_row4.xml102
-rw-r--r--java/res/xml/kbd_symbols_shift.xml187
-rw-r--r--java/res/xml/kbd_symbols_shift_black.xml177
-rw-r--r--java/res/xml/kbd_symbols_shift_row4.xml98
-rw-r--r--java/res/xml/method.xml177
-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.xml48
-rw-r--r--java/res/xml/prefs_for_debug.xml2
-rw-r--r--java/src/com/android/inputmethod/keyboard/Key.java382
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyDetector.java (renamed from java/src/com/android/inputmethod/latin/KeyDetector.java)11
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyStyles.java258
-rw-r--r--java/src/com/android/inputmethod/keyboard/Keyboard.java424
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java82
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardId.java184
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardParser.java580
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java105
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java697
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardView.java (renamed from java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java)896
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboard.java444
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java240
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java104
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java (renamed from java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java)21
-rw-r--r--java/src/com/android/inputmethod/keyboard/ModifierKeyState.java83
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java478
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java108
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java87
-rw-r--r--java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java176
-rw-r--r--java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java67
-rw-r--r--java/src/com/android/inputmethod/keyboard/Row.java81
-rw-r--r--java/src/com/android/inputmethod/keyboard/ShiftKeyState.java69
-rw-r--r--java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java163
-rw-r--r--java/src/com/android/inputmethod/keyboard/SwipeTracker.java (renamed from java/src/com/android/inputmethod/latin/SwipeTracker.java)8
-rw-r--r--java/src/com/android/inputmethod/latin/AutoDictionary.java15
-rw-r--r--java/src/com/android/inputmethod/latin/BackupAgent.java (renamed from java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java)2
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java70
-rw-r--r--[-rwxr-xr-x]java/src/com/android/inputmethod/latin/CandidateView.java593
-rw-r--r--java/src/com/android/inputmethod/latin/ContactsDictionary.java3
-rw-r--r--java/src/com/android/inputmethod/latin/DebugSettings.java (renamed from java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java)5
-rw-r--r--java/src/com/android/inputmethod/latin/Dictionary.java8
-rw-r--r--java/src/com/android/inputmethod/latin/EditingUtils.java (renamed from java/src/com/android/inputmethod/latin/EditingUtil.java)89
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableDictionary.java181
-rw-r--r--java/src/com/android/inputmethod/latin/InputLanguageSelection.java62
-rw-r--r--java/src/com/android/inputmethod/latin/KeyboardSwitcher.java538
-rw-r--r--java/src/com/android/inputmethod/latin/LanguageSwitcher.java74
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java1971
-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.java1022
-rw-r--r--java/src/com/android/inputmethod/latin/LatinKeyboardView.java375
-rw-r--r--java/src/com/android/inputmethod/latin/ModifierKeyState.java42
-rw-r--r--java/src/com/android/inputmethod/latin/PointerTracker.java531
-rw-r--r--java/src/com/android/inputmethod/latin/ProximityKeyDetector.java86
-rw-r--r--java/src/com/android/inputmethod/latin/Settings.java (renamed from java/src/com/android/inputmethod/latin/LatinIMESettings.java)127
-rw-r--r--java/src/com/android/inputmethod/latin/SubtypeSwitcher.java550
-rw-r--r--[-rwxr-xr-x]java/src/com/android/inputmethod/latin/Suggest.java128
-rw-r--r--java/src/com/android/inputmethod/latin/SuggestedWords.java124
-rw-r--r--java/src/com/android/inputmethod/latin/TextEntryState.java42
-rw-r--r--java/src/com/android/inputmethod/latin/Tutorial.java244
-rw-r--r--java/src/com/android/inputmethod/latin/UserBigramDictionary.java26
-rw-r--r--java/src/com/android/inputmethod/latin/UserDictionary.java41
-rw-r--r--java/src/com/android/inputmethod/latin/Utils.java395
-rw-r--r--java/src/com/android/inputmethod/voice/FieldContext.java2
-rw-r--r--java/src/com/android/inputmethod/voice/Hints.java (renamed from java/src/com/android/inputmethod/latin/Hints.java)37
-rw-r--r--java/src/com/android/inputmethod/voice/RecognitionView.java22
-rw-r--r--java/src/com/android/inputmethod/voice/SettingsUtil.java3
-rw-r--r--java/src/com/android/inputmethod/voice/VoiceIMEConnector.java692
-rw-r--r--java/src/com/android/inputmethod/voice/VoiceInput.java26
-rw-r--r--java/src/com/android/inputmethod/voice/VoiceInputLogger.java7
-rw-r--r--java/src/com/android/inputmethod/voice/WaveformImage.java4
-rw-r--r--java/src/com/android/inputmethod/voice/Whitelist.java1
486 files changed, 21695 insertions, 17549 deletions
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml
index b1e5ec6f6..de4ac610c 100755..100644
--- a/java/AndroidManifest.xml
+++ b/java/AndroidManifest.xml
@@ -8,7 +8,7 @@
<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 +20,13 @@
<meta-data android:name="android.view.im" android:resource="@xml/method" />
</service>
- <activity android:name="LatinIMESettings" android:label="@string/english_ime_settings">
+ <activity android:name="Settings" android:label="@string/english_ime_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>
- <activity android:name="LatinIMEDebugSettings" android:label="@string/english_ime_debug_settings">
+ <activity android:name="DebugSettings" android:label="@string/english_ime_debug_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
diff --git a/java/proguard.flags b/java/proguard.flags
index 829a096c0..9096855e8 100644
--- a/java/proguard.flags
+++ b/java/proguard.flags
@@ -5,4 +5,12 @@
-keep class com.android.inputmethod.latin.Suggest {
<init>(...);
+ com.android.inputmethod.latin.SuggestedWords getSuggestions(...);
+}
+
+-keep class com.android.inputmethod.latin.UserBigramDictionary {
+ void setDatabaseMax(int);
+ void setDatabaseDelete(int);
+ void waitUntilUpdateDBDone();
+ void waitForDictionaryLoading();
}
diff --git a/java/res/drawable-hdpi/btn_candidate_normal.9.png b/java/res/drawable-hdpi/btn_candidate_normal.9.png
new file mode 100644
index 000000000..0ccdb6ab2
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_candidate_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/list_selector_background_pressed.9.png b/java/res/drawable-hdpi/btn_candidate_pressed.9.png
index ba79cf7f8..ba79cf7f8 100644
--- a/java/res/drawable-hdpi/list_selector_background_pressed.9.png
+++ b/java/res/drawable-hdpi/btn_candidate_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 000000000..d13386a0c
--- /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_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png
new file mode 100644
index 000000000..95b73c07e
--- /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_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.png
new file mode 100644
index 000000000..3bd224911
--- /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_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 000000000..77a0e7d75
--- /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_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
new file mode 100644
index 000000000..1760075a8
--- /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_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
new file mode 100644
index 000000000..b6d0dbca7
--- /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_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.png
new file mode 100644
index 000000000..763c538d3
--- /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_pressed_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 000000000..328fe160a
--- /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..e0129ab10
--- /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/ic_subtype_keyboard.png b/java/res/drawable-hdpi/ic_subtype_keyboard.png
deleted file mode 100644
index 7015e266a..000000000
--- a/java/res/drawable-hdpi/ic_subtype_keyboard.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_subtype_mic.png b/java/res/drawable-hdpi/ic_subtype_mic.png
deleted file mode 100644
index cb86a5598..000000000
--- a/java/res/drawable-hdpi/ic_subtype_mic.png
+++ /dev/null
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..ebde12dd9
--- /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..29d21bc58
--- /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..14c46990d
--- /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..91e788323
--- /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..82e4a93b7
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_dash_holo.9.png b/java/res/drawable-hdpi/key_hint_dash_holo.9.png
new file mode 100644
index 000000000..2ee22ba79
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_dash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png
new file mode 100644
index 000000000..0da933239
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_equal_holo.9.png b/java/res/drawable-hdpi/key_hint_equal_holo.9.png
new file mode 100644
index 000000000..f5a9ba2f4
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_equal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..6887156a5
--- /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..e20a13715
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_larger_holo.9.png b/java/res/drawable-hdpi/key_hint_larger_holo.9.png
new file mode 100644
index 000000000..50652bb13
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_larger_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png
new file mode 100644
index 000000000..52ee86a0f
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png
new file mode 100644
index 000000000..b0ed388ad
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_period_holo.9.png b/java/res/drawable-hdpi/key_hint_period_holo.9.png
new file mode 100644
index 000000000..8d798a57f
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_period_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_plus_holo.9.png b/java/res/drawable-hdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..f1d232e99
--- /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..5f7d31563
--- /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..9055c7688
--- /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..ade394cdd
--- /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..361e3a8e4
--- /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..cc5e8d710
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png
new file mode 100644
index 000000000..7f9e8c90e
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png
new file mode 100644
index 000000000..5e1a45c0e
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_slash_holo.9.png b/java/res/drawable-hdpi/key_hint_slash_holo.9.png
new file mode 100644
index 000000000..645586a30
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_slash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png
new file mode 100644
index 000000000..75c3bb1a6
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_smaller_holo.9.png b/java/res/drawable-hdpi/key_hint_smaller_holo.9.png
new file mode 100644
index 000000000..2a0587cbd
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_smaller_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_star_holo.9.png b/java/res/drawable-hdpi/key_hint_star_holo.9.png
new file mode 100644
index 000000000..9f33b9830
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_star_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_underline_holo.9.png b/java/res/drawable-hdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..a8841d08c
--- /dev/null
+++ b/java/res/drawable-hdpi/key_hint_underline_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..87aa98e8e
--- /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_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..571f3aa37
--- /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_popup_panel_background_holo.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.png
new file mode 100644
index 000000000..2b529b887
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/mic_slash_holo.png b/java/res/drawable-hdpi/mic_slash_holo.png
new file mode 100644
index 000000000..8108b6e13
--- /dev/null
+++ b/java/res/drawable-hdpi/mic_slash_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..f99a0edcf
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/working.png b/java/res/drawable-hdpi/working.png
index 5ea702307..5ea702307 100755..100644
--- a/java/res/drawable-hdpi/working.png
+++ b/java/res/drawable-hdpi/working.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png
new file mode 100755
index 000000000..603bf0e15
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png
new file mode 100755
index 000000000..6ddd516e7
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png
new file mode 100644
index 000000000..67a204f85
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png
new file mode 100755
index 000000000..65fdeb353
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png
new file mode 100644
index 000000000..63cbe60a3
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png
new file mode 100644
index 000000000..0dd33b429
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png
new file mode 100755
index 000000000..7ec915fe8
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png
new file mode 100755
index 000000000..439271723
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png
new file mode 100755
index 000000000..c2cc32044
--- /dev/null
+++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-land-hdpi/keyboard_suggest_strip_divider.png
new file mode 100755
index 000000000..1a03c52e6
--- /dev/null
+++ b/java/res/drawable-land-hdpi/keyboard_suggest_strip_divider.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-land-mdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..c409cea00
--- /dev/null
+++ b/java/res/drawable-land-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_at_holo.9.png b/java/res/drawable-land-mdpi/key_hint_at_holo.9.png
new file mode 100644
index 000000000..d1ea313c0
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 000000000..786bbc5de
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..6470ed391
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..bdf4ed574
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..f9391623b
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png b/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png
new file mode 100644
index 000000000..1cb0bdfaa
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png
new file mode 100644
index 000000000..7e7ceb3fc
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png b/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png
new file mode 100644
index 000000000..8e570595c
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..a14623dc0
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 000000000..ce52d3a02
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png b/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png
new file mode 100644
index 000000000..37c05275e
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png
new file mode 100644
index 000000000..97e1f1449
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png
new file mode 100644
index 000000000..36add5d51
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_period_holo.9.png b/java/res/drawable-land-mdpi/key_hint_period_holo.9.png
new file mode 100644
index 000000000..4a70f07dc
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_period_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..7698a5806
--- /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..206d99073
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_question_holo.9.png b/java/res/drawable-land-mdpi/key_hint_question_holo.9.png
new file mode 100644
index 000000000..2b71d744f
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 000000000..041336832
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png
new file mode 100644
index 000000000..486e5e19d
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 000000000..49770314f
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png
new file mode 100644
index 000000000..63a3875b5
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png
new file mode 100644
index 000000000..3c217b058
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png b/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png
new file mode 100644
index 000000000..98545f0ac
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png
new file mode 100644
index 000000000..a3a02973c
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png b/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png
new file mode 100644
index 000000000..5af183644
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_star_holo.9.png b/java/res/drawable-land-mdpi/key_hint_star_holo.9.png
new file mode 100644
index 000000000..18304d738
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_star_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..06f3efb7e
--- /dev/null
+++ b/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_candidate_normal.9.png b/java/res/drawable-mdpi/btn_candidate_normal.9.png
new file mode 100644
index 000000000..fa6c0feff
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_candidate_normal.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/list_selector_background_pressed.9.png b/java/res/drawable-mdpi/btn_candidate_pressed.9.png
index 02b4e9a53..02b4e9a53 100644
--- a/java/res/drawable-mdpi/list_selector_background_pressed.9.png
+++ b/java/res/drawable-mdpi/btn_candidate_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 000000000..27a39dd34
--- /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..43229e2b4
--- /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..c11eaf38b
--- /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..85fba4424
--- /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..67c865cec
--- /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..3a4db92e3
--- /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..3724bcd88
--- /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..73fdba459 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..8af256e4c
--- /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..2ba416fcf
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/cancel_holo.9.png b/java/res/drawable-mdpi/cancel_holo.9.png
new file mode 100644
index 000000000..74f967eb9
--- /dev/null
+++ b/java/res/drawable-mdpi/cancel_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/hint_popup_holo.9.png b/java/res/drawable-mdpi/hint_popup_holo.9.png
new file mode 100644
index 000000000..cfa17fd5f
--- /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
deleted file mode 100644
index 0d7ebd4e5..000000000
--- a/java/res/drawable-mdpi/ic_subtype_keyboard.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/ic_subtype_mic.png b/java/res/drawable-mdpi/ic_subtype_mic.png
deleted file mode 100644
index 247d5b3a9..000000000
--- a/java/res/drawable-mdpi/ic_subtype_mic.png
+++ /dev/null
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..d1ea313c0
--- /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..786bbc5de
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 000000000..14c46990d
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 000000000..91e788323
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-mdpi/key_hint_comma_holo.9.png
new file mode 100644
index 000000000..82e4a93b7
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_dash_holo.9.png b/java/res/drawable-mdpi/key_hint_dash_holo.9.png
new file mode 100644
index 000000000..2ee22ba79
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_dash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png
new file mode 100644
index 000000000..0da933239
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_equal_holo.9.png b/java/res/drawable-mdpi/key_hint_equal_holo.9.png
new file mode 100644
index 000000000..f5a9ba2f4
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_equal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 000000000..a14623dc0
--- /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..ce52d3a02
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_larger_holo.9.png b/java/res/drawable-mdpi/key_hint_larger_holo.9.png
new file mode 100644
index 000000000..50652bb13
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_larger_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png
new file mode 100644
index 000000000..52ee86a0f
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png
new file mode 100644
index 000000000..b0ed388ad
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_period_holo.9.png b/java/res/drawable-mdpi/key_hint_period_holo.9.png
new file mode 100644
index 000000000..8d798a57f
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_period_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 000000000..f1d232e99
--- /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..5f7d31563
--- /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..2b71d744f
--- /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..041336832
--- /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..486e5e19d
--- /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..49770314f
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png
new file mode 100644
index 000000000..7f9e8c90e
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png
new file mode 100644
index 000000000..5e1a45c0e
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_slash_holo.9.png b/java/res/drawable-mdpi/key_hint_slash_holo.9.png
new file mode 100644
index 000000000..645586a30
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_slash_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png
new file mode 100644
index 000000000..75c3bb1a6
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_smaller_holo.9.png b/java/res/drawable-mdpi/key_hint_smaller_holo.9.png
new file mode 100644
index 000000000..2a0587cbd
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_smaller_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_star_holo.9.png b/java/res/drawable-mdpi/key_hint_star_holo.9.png
new file mode 100644
index 000000000..9f33b9830
--- /dev/null
+++ b/java/res/drawable-mdpi/key_hint_star_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 000000000..06f3efb7e
--- /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..dbe1134cd
--- /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..34149a482
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_at.9.png b/java/res/drawable-mdpi/keyboard_hint_at.9.png
new file mode 100644
index 000000000..69baedef4
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_at.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_colon.9.png b/java/res/drawable-mdpi/keyboard_hint_colon.9.png
new file mode 100644
index 000000000..9d0d7cbab
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_colon.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png
new file mode 100644
index 000000000..d24aa0f07
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png b/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png
new file mode 100644
index 000000000..f6cc7fe84
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_greater.9.png b/java/res/drawable-mdpi/keyboard_hint_greater.9.png
new file mode 100644
index 000000000..5210392bf
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_greater.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_plus.9.png b/java/res/drawable-mdpi/keyboard_hint_plus.9.png
new file mode 100644
index 000000000..d1d85ac87
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_plus.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_question.9.png b/java/res/drawable-mdpi/keyboard_hint_question.9.png
new file mode 100644
index 000000000..37f6e5f36
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_question.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_quote.9.png b/java/res/drawable-mdpi/keyboard_hint_quote.9.png
new file mode 100644
index 000000000..e7d2cb5e3
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_quote.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_smaller.9.png b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png
new file mode 100644
index 000000000..76553cf96
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_star.9.png b/java/res/drawable-mdpi/keyboard_hint_star.9.png
new file mode 100644
index 000000000..47978c46c
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_star.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 000000000..a7acb4a4d
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 000000000..1ef63eed2
--- /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..1e371b976
--- /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..bb58f00d0
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/mic_slash_holo.png b/java/res/drawable-mdpi/mic_slash_holo.png
new file mode 100644
index 000000000..fc4108fef
--- /dev/null
+++ b/java/res/drawable-mdpi/mic_slash_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/ok_cancel_holo.9.png b/java/res/drawable-mdpi/ok_cancel_holo.9.png
new file mode 100644
index 000000000..b6f121654
--- /dev/null
+++ b/java/res/drawable-mdpi/ok_cancel_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level0_holo.png b/java/res/drawable-mdpi/speak_now_level0_holo.png
new file mode 100644
index 000000000..29ec1b127
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level0_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level1_holo.png b/java/res/drawable-mdpi/speak_now_level1_holo.png
new file mode 100644
index 000000000..df5d2fae3
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level1_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level2_holo.png b/java/res/drawable-mdpi/speak_now_level2_holo.png
new file mode 100644
index 000000000..1e95ae6e9
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level2_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level3_holo.png b/java/res/drawable-mdpi/speak_now_level3_holo.png
new file mode 100644
index 000000000..3c6afd1a4
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level3_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level4_holo.png b/java/res/drawable-mdpi/speak_now_level4_holo.png
new file mode 100644
index 000000000..e3100c783
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level4_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level5_holo.png b/java/res/drawable-mdpi/speak_now_level5_holo.png
new file mode 100644
index 000000000..4bc840505
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level5_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level6_holo.png b/java/res/drawable-mdpi/speak_now_level6_holo.png
new file mode 100644
index 000000000..76bad8dbd
--- /dev/null
+++ b/java/res/drawable-mdpi/speak_now_level6_holo.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..d1d2d7660
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_delete_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-mdpi/sym_keyboard_num0_holo.png
new file mode 100644
index 000000000..aa96c1722
--- /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..ee4b7ae0d
--- /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..e84dcbc5e
--- /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..55f04c0f2
--- /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..18a744a66
--- /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..348f1a9b5
--- /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..b94baa084
--- /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..f6561415f
--- /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..21884c8a0
--- /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..3d09fc683
--- /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..d92c44935
--- /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..0792549bb
--- /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..91122a8d1
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_return_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..8678642dd
--- /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..836365bf8
--- /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_smiley_holo.png b/java/res/drawable-mdpi/sym_keyboard_smiley_holo.png
new file mode 100644
index 000000000..46b2f41c7
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_smiley_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..952c4ee0c
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_space_holo.png
Binary files differ
diff --git a/java/res/xml/popup_slash.xml b/java/res/drawable/btn_candidate.xml
index a38fde0e4..b0c1c3038 100644
--- a/java/res/xml/popup_slash.xml
+++ b/java/res/drawable/btn_candidate.xml
@@ -18,22 +18,12 @@
*/
-->
-<Keyboard
+<selector
xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
>
- <Row
- android:rowEdgeFlags="top|bottom"
- >
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="/"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
+ <item
+ android:state_pressed="true"
+ android:drawable="@drawable/btn_candidate_pressed" />
+ <item
+ android:drawable="@drawable/btn_candidate_normal" />
+</selector>
diff --git a/java/res/xml/popup_comma.xml b/java/res/drawable/btn_candidate_holo.xml
index 7666f4b62..66cd2460b 100644
--- a/java/res/xml/popup_comma.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_keyboard_key_honeycomb.xml b/java/res/drawable/btn_keyboard_key_honeycomb.xml
new file mode 100644
index 000000000..3dab8430f
--- /dev/null
+++ b/java/res/drawable/btn_keyboard_key_honeycomb.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- TODO: Remove "gingerbread" from file name and rename this to "btn_keyboard_key.xml". -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Functional keys. -->
+
+ <item android:state_single="true" android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_pressed_holo" />
+ <item android:state_single="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_normal_holo" />
+
+ <!-- Toggle keys. Use checkable/checked state. -->
+
+ <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_pressed_on_holo" />
+ <item android:state_checkable="true" android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_pressed_off_holo" />
+ <item android:state_checkable="true" android:state_checked="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_normal_on_holo" />
+ <item android:state_checkable="true"
+ android:drawable="@drawable/btn_keyboard_key_dark_normal_off_holo" />
+
+ <!-- Normal keys -->
+
+ <item android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_light_pressed_holo" />
+ <item android:drawable="@drawable/btn_keyboard_key_light_normal_holo" />
+</selector>
diff --git a/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml b/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml
new file mode 100644
index 000000000..6c2713650
--- /dev/null
+++ b/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true"
+ android:drawable="@drawable/btn_keyboard_key_popup_selected_holo" />
+</selector>
diff --git a/java/res/drawable/ic_subtype_keyboard.png b/java/res/drawable/ic_subtype_keyboard.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_cs.png b/java/res/drawable/ic_subtype_keyboard_cs.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_cs.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_da.png b/java/res/drawable/ic_subtype_keyboard_da.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_da.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_de.png b/java/res/drawable/ic_subtype_keyboard_de.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_de.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_en_gb.png b/java/res/drawable/ic_subtype_keyboard_en_gb.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_en_gb.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_en_us.png b/java/res/drawable/ic_subtype_keyboard_en_us.png
new file mode 100644
index 000000000..8ed6cc8b2
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_en_us.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_es.png b/java/res/drawable/ic_subtype_keyboard_es.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_es.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_es_us.png b/java/res/drawable/ic_subtype_keyboard_es_us.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_es_us.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_fr.png b/java/res/drawable/ic_subtype_keyboard_fr.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_fr.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_fr_ca.png b/java/res/drawable/ic_subtype_keyboard_fr_ca.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_fr_ca.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_fr_ch.png b/java/res/drawable/ic_subtype_keyboard_fr_ch.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_fr_ch.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_it.png b/java/res/drawable/ic_subtype_keyboard_it.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_it.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_nb.png b/java/res/drawable/ic_subtype_keyboard_nb.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_nb.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_nl.png b/java/res/drawable/ic_subtype_keyboard_nl.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_nl.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_ru.png b/java/res/drawable/ic_subtype_keyboard_ru.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_ru.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_sr.png b/java/res/drawable/ic_subtype_keyboard_sr.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_sr.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_keyboard_sv.png b/java/res/drawable/ic_subtype_keyboard_sv.png
new file mode 100644
index 000000000..ef5fe4b3c
--- /dev/null
+++ b/java/res/drawable/ic_subtype_keyboard_sv.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic.png b/java/res/drawable/ic_subtype_mic.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_cs.png b/java/res/drawable/ic_subtype_mic_cs.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_cs.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_de.png b/java/res/drawable/ic_subtype_mic_de.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_de.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_en_au.png b/java/res/drawable/ic_subtype_mic_en_au.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_en_au.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_en_gb.png b/java/res/drawable/ic_subtype_mic_en_gb.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_en_gb.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_en_in.png b/java/res/drawable/ic_subtype_mic_en_in.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_en_in.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_en_nz.png b/java/res/drawable/ic_subtype_mic_en_nz.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_en_nz.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_en_us.png b/java/res/drawable/ic_subtype_mic_en_us.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_en_us.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_es.png b/java/res/drawable/ic_subtype_mic_es.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_es.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_fr.png b/java/res/drawable/ic_subtype_mic_fr.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_fr.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_ja.png b/java/res/drawable/ic_subtype_mic_ja.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_ja.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_ko.png b/java/res/drawable/ic_subtype_mic_ko.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_ko.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_pl.png b/java/res/drawable/ic_subtype_mic_pl.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_pl.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_pt.png b/java/res/drawable/ic_subtype_mic_pt.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_pt.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_ru.png b/java/res/drawable/ic_subtype_mic_ru.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_ru.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_tr.png b/java/res/drawable/ic_subtype_mic_tr.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_tr.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_zh_cn.png b/java/res/drawable/ic_subtype_mic_zh_cn.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_zh_cn.png
Binary files differ
diff --git a/java/res/drawable/ic_subtype_mic_zh_tw.png b/java/res/drawable/ic_subtype_mic_zh_tw.png
new file mode 100644
index 000000000..03c0b6982
--- /dev/null
+++ b/java/res/drawable/ic_subtype_mic_zh_tw.png
Binary files differ
diff --git a/java/res/drawable/keyboard_key_feedback_honeycomb.xml b/java/res/drawable/keyboard_key_feedback_honeycomb.xml
new file mode 100644
index 000000000..dd9b53e46
--- /dev/null
+++ b/java/res/drawable/keyboard_key_feedback_honeycomb.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_long_pressable="true"
+ android:drawable="@drawable/keyboard_key_feedback_more_background" />
+ <item android:drawable="@drawable/keyboard_key_feedback_background_holo" />
+</selector>
diff --git a/java/res/layout-xlarge/candidate.xml b/java/res/layout-xlarge/candidate.xml
new file mode 100644
index 000000000..74532a1e2
--- /dev/null
+++ b/java/res/layout-xlarge/candidate.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:orientation="horizontal"
+ android:paddingRight="@dimen/candidate_padding"
+>
+ <ImageView
+ android:id="@+id/candidate_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:visibility="gone"
+ android:focusable="false"
+ android:clickable="false"
+ android:src="@drawable/keyboard_suggest_strip_divider"
+ android:gravity="center_vertical|center_horizontal" />
+ <Button
+ android:id="@+id/candidate_word"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:minWidth="@dimen/candidate_min_width"
+ android:textSize="@dimen/candidate_text_size"
+ android:textColor="@color/candidate_normal"
+ android:background="@drawable/btn_candidate_holo"
+ android:focusable="true"
+ android:clickable="true"
+ android:gravity="center_vertical|center_horizontal"
+ android:paddingLeft="@dimen/candidate_padding" />
+ <TextView
+ android:id="@+id/candidate_debug_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:textSize="10dip"
+ android:textColor="#ff808080"
+ android:focusable="false"
+ android:clickable="false"
+ android:gravity="bottom"
+ android:paddingLeft="4dip" />
+</LinearLayout>
diff --git a/java/res/xml/popup_at.xml b/java/res/layout-xlarge/candidate_preview.xml
index 197eea445..61d5f8e7b 100644
--- a/java/res/xml/popup_at.xml
+++ b/java/res/layout-xlarge/candidate_preview.xml
@@ -18,22 +18,12 @@
*/
-->
-<Keyboard
+<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top|bottom"
- >
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="\@"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:textColor="?android:attr/textColorPrimaryInverse"
+ android:minWidth="32dip"
+ android:gravity="center"
+ android:background="@drawable/keyboard_popup_panel_background_holo" />
diff --git a/java/res/layout-xlarge/candidates.xml b/java/res/layout-xlarge/candidates.xml
new file mode 100644
index 000000000..e2ddb84b1
--- /dev/null
+++ b/java/res/layout-xlarge/candidates.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:background="@drawable/keyboard_suggest_strip_holo"
+ android:paddingRight="@dimen/candidate_strip_padding"
+ android:paddingLeft="@dimen/candidate_strip_padding"
+>
+ <HorizontalScrollView
+ android:id="@+id/candidates_scroll_view"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length"
+ android:scrollbars="none"
+ >
+ <com.android.inputmethod.latin.CandidateView
+ android:id="@+id/candidates"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:background="@drawable/keyboard_suggest_strip_holo" />
+ </HorizontalScrollView>
+</LinearLayout>
diff --git a/java/res/layout-xlarge/keyboard_popup_honeycomb.xml b/java/res/layout-xlarge/keyboard_popup_honeycomb.xml
new file mode 100644
index 000000000..0b8229ca5
--- /dev/null
+++ b/java/res/layout-xlarge/keyboard_popup_honeycomb.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:background="@drawable/keyboard_popup_panel_background_holo"
+ android:paddingLeft="40dip"
+ android:paddingRight="40dip"
+ >
+ <com.android.inputmethod.keyboard.KeyboardView
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ android:id="@+id/KeyboardView"
+ android:layout_alignParentBottom="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/latinkeyboard_transparent"
+
+ latin:keyBackground="@drawable/btn_keyboard_key_honeycomb_popup"
+ latin:keyHysteresisDistance="0dip"
+ latin:verticalCorrection="@dimen/mini_keyboard_vertical_correction"
+ />
+</LinearLayout>
diff --git a/java/res/layout/candidate.xml b/java/res/layout/candidate.xml
new file mode 100644
index 000000000..f2c4126b3
--- /dev/null
+++ b/java/res/layout/candidate.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:orientation="horizontal"
+ android:paddingRight="@dimen/candidate_padding"
+>
+ <ImageView
+ android:id="@+id/candidate_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:visibility="gone"
+ android:focusable="false"
+ android:clickable="false"
+ android:src="@drawable/keyboard_suggest_strip_divider"
+ android:gravity="center_vertical|center_horizontal" />
+ <Button
+ android:id="@+id/candidate_word"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:minWidth="@dimen/candidate_min_width"
+ android:textSize="@dimen/candidate_text_size"
+ android:textColor="@color/candidate_normal"
+ android:background="@drawable/btn_candidate"
+ android:focusable="true"
+ android:clickable="true"
+ android:gravity="center_vertical|center_horizontal"
+ android:paddingLeft="@dimen/candidate_padding" />
+ <TextView
+ android:id="@+id/candidate_debug_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:textSize="10dip"
+ android:textColor="#ff808080"
+ android:focusable="false"
+ android:clickable="false"
+ android:gravity="bottom"
+ android:paddingLeft="4dip" />
+</LinearLayout>
diff --git a/java/res/layout/candidates.xml b/java/res/layout/candidates.xml
index b89d44290..1b8d04183 100644
--- a/java/res/layout/candidates.xml
+++ b/java/res/layout/candidates.xml
@@ -1,38 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-/*
+/*
**
-** Copyright 2008, The Android Open Source Project
+** Copyright 2010, The Android Open Source Project
**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
**
-** http://www.apache.org/licenses/LICENSE-2.0
+** http://www.apache.org/licenses/LICENSE-2.0
**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="@dimen/candidate_strip_height"
- android:background="@drawable/keyboard_suggest_strip"
- >
-
- <com.android.inputmethod.latin.CandidateView
- android:id="@+id/candidates"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:background="@drawable/keyboard_suggest_strip"
+ android:paddingRight="@dimen/candidate_strip_padding"
+ android:paddingLeft="@dimen/candidate_strip_padding"
+>
+ <HorizontalScrollView
+ android:id="@+id/candidates_scroll_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/candidate_strip_height"
- android:layout_weight="1"
android:fadingEdge="horizontal"
android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length"
- />
-
+ android:scrollbars="none"
+ >
+ <com.android.inputmethod.latin.CandidateView
+ android:id="@+id/candidates"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/candidate_strip_height"
+ android:background="@drawable/keyboard_suggest_strip" />
+ </HorizontalScrollView>
</LinearLayout>
diff --git a/java/res/layout/input_basic.xml b/java/res/layout/input_basic.xml
index 168eba691..7b85bae94 100644
--- a/java/res/layout/input_basic.xml
+++ b/java/res/layout/input_basic.xml
@@ -18,7 +18,7 @@
*/
-->
-<com.android.inputmethod.latin.LatinKeyboardView
+<com.android.inputmethod.keyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
android:id="@+id/LatinkeyboardBaseView"
diff --git a/java/res/layout/input_basic_highcontrast.xml b/java/res/layout/input_basic_highcontrast.xml
index 19ff1db11..d9200fd5e 100644
--- a/java/res/layout/input_basic_highcontrast.xml
+++ b/java/res/layout/input_basic_highcontrast.xml
@@ -18,7 +18,7 @@
*/
-->
-<com.android.inputmethod.latin.LatinKeyboardView
+<com.android.inputmethod.keyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
diff --git a/java/res/layout/input_gingerbread.xml b/java/res/layout/input_gingerbread.xml
index 73cf0a3fa..6233e6dc6 100644
--- a/java/res/layout/input_gingerbread.xml
+++ b/java/res/layout/input_gingerbread.xml
@@ -18,17 +18,17 @@
*/
-->
-<com.android.inputmethod.latin.LatinKeyboardView
+<com.android.inputmethod.keyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
android:id="@+id/LatinkeyboardBaseView"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:paddingTop="@dimen/keyboard_top_padding"
android:paddingBottom="@dimen/keyboard_bottom_padding"
android:background="@drawable/keyboard_dark_background"
- android:textStyle="bold"
latin:keyBackground="@drawable/btn_keyboard_key_gingerbread"
- latin:keyTextStyle="bold"
+ latin:keyLetterStyle="bold"
/>
diff --git a/java/res/layout/input_honeycomb.xml b/java/res/layout/input_honeycomb.xml
new file mode 100644
index 000000000..b39387481
--- /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="#FF353535"
+ 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..bf25e1597 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,11 @@
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: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..cf4708612 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"
@@ -30,6 +30,6 @@
latin:keyBackground="@drawable/btn_keyboard_key_stone"
latin:keyTextColor="@color/latinkeyboard_key_color_black"
latin:shadowColor="@color/latinkeyboard_key_color_white"
- latin:symbolColorScheme="black"
+ latin:colorScheme="black"
latin:popupLayout="@layout/input_stone_popup"
/>
diff --git a/java/res/layout/input_stone_popup.xml b/java/res/layout/input_stone_popup.xml
index f159625f7..b4da04536 100644
--- a/java/res/layout/input_stone_popup.xml
+++ b/java/res/layout/input_stone_popup.xml
@@ -25,9 +25,9 @@
android:orientation="horizontal"
android:background="@drawable/keyboard_popup_panel_background"
>
- <com.android.inputmethod.latin.LatinKeyboardBaseView
+ <com.android.inputmethod.keyboard.KeyboardView
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
- android:id="@+id/LatinKeyboardBaseView"
+ android:id="@+id/KeyboardView"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/java/res/layout/key_preview_honeycomb.xml b/java/res/layout/key_preview_honeycomb.xml
new file mode 100644
index 000000000..a90fe5588
--- /dev/null
+++ b/java/res/layout/key_preview_honeycomb.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="80sp"
+ android:textSize="40sp"
+ android:textColor="@color/latinkeyboard_key_color_white"
+ android:minWidth="24dip"
+ android:gravity="center"
+ android:background="@drawable/keyboard_key_feedback_honeycomb"
+ />
diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml
index 9ecbcd4e9..ac8134bfb 100644
--- a/java/res/layout/keyboard_popup.xml
+++ b/java/res/layout/keyboard_popup.xml
@@ -26,9 +26,9 @@
android:paddingLeft="16dip"
android:paddingRight="16dip"
>
- <com.android.inputmethod.latin.LatinKeyboardBaseView
+ <com.android.inputmethod.keyboard.KeyboardView
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
- android:id="@+id/LatinKeyboardBaseView"
+ android:id="@+id/KeyboardView"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/java/res/layout/keyboard_popup_honeycomb.xml b/java/res/layout/keyboard_popup_honeycomb.xml
new file mode 100644
index 000000000..e5fcbd44c
--- /dev/null
+++ b/java/res/layout/keyboard_popup_honeycomb.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:background="@drawable/keyboard_popup_panel_background_holo"
+ android:paddingLeft="24dip"
+ android:paddingRight="24dip"
+ >
+ <com.android.inputmethod.keyboard.KeyboardView
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ android:id="@+id/KeyboardView"
+ android:layout_alignParentBottom="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/latinkeyboard_transparent"
+
+ latin:keyBackground="@drawable/btn_keyboard_key_honeycomb_popup"
+ latin:keyHysteresisDistance="0dip"
+ latin:verticalCorrection="@dimen/mini_keyboard_vertical_correction"
+ />
+</LinearLayout>
diff --git a/java/res/layout/recognition_status.xml b/java/res/layout/recognition_status.xml
index 49af77360..ea2d9eefe 100644
--- a/java/res/layout/recognition_status.xml
+++ b/java/res/layout/recognition_status.xml
@@ -57,7 +57,7 @@
android:layout_width="wrap_content"
android:layout_marginTop="20dip"
android:layout_gravity="center_horizontal"
- android:src="@drawable/mic_slash"
+ android:src="@drawable/mic_slash_holo"
/>
<ProgressBar android:id="@+id/progress"
diff --git a/java/res/raw/main.dict b/java/res/raw/main.dict
index a456cf3d3..a456cf3d3 100755..100644
--- a/java/res/raw/main.dict
+++ b/java/res/raw/main.dict
Binary files differ
diff --git a/java/res/raw/type3.ogg b/java/res/raw/type3.ogg
index 20e670807..20e670807 100755..100644
--- a/java/res/raw/type3.ogg
+++ b/java/res/raw/type3.ogg
Binary files differ
diff --git a/java/res/values-ar/config.xml b/java/res/values-ar/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-ar/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
new file mode 100644
index 000000000..70bc09b2b
--- /dev/null
+++ b/java/res/values-ar/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"لوحة مفاتيح Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"إعدادات لوحة مفاتيح Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"اهتزاز عند الضغط على مفتاح"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"صوت عند الضغط على مفتاح"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"إعدادات اقتراحات الكلمات"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"استخدام الأحرف الكبيرة تلقائيًا"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"إصلاحات سريعة"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحيح الأخطاء المكتوبة الشائعة"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"اقتراحات الكلمات"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"تصحيح الكلمة السابقة تلقائيًا"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : تم الحفظ"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"الإدخال الصوتي"</string>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"الإدخال الصوتي غير معتمد حاليًا للغتك، ولكنه يعمل باللغة الإنجليزية."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"الإدخال الصوتي هو ميزة تجريبية تستخدم التعرف على الكلام المتصل في Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"لتشغيل الإدخال الصوتي، انتقل إلى إعدادات لوحة المفاتيح."</string>
+ <!-- outdated translation 6892342981545727994 --> <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>
+ <string name="voice_error" msgid="5140896300312186162">"خطأ. الرجاء المحاولة مرة أخرى."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"تعذر الاتصال"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"خطأ، كلام أكثر مما ينبغي."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"مشكلة بالإعدادات الصوتية"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"خطأ في الخادم"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"لم يتم سماع كلام"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"لم يتمّ العثور على أية تطابقات"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"لم يتم تثبيت البحث الصوتي"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"تلميح:"</b>" مرر عبر لوحة المفاتيح للتحدث"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"تلميح:"</b>" جرب في المرة التالية نطق الترقيم مثل \"نقطة\" أو \"فاصلة\" أو \"علامة استفهام\"."</string>
+ <string name="cancel" msgid="6830980399865683324">"إلغاء"</string>
+ <string name="ok" msgid="7898366843681727667">"موافق"</string>
+ <string name="voice_input" msgid="2466640768843347841">"الإدخال الصوتي"</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">"لغات الإدخال"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"مرر إصبعك على مفتاح المسافة لتغيير اللغة"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← انقر مرة أخرى للحفظ"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"القاموس متاح"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-bg/config.xml b/java/res/values-bg/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-bg/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
new file mode 100644
index 000000000..502d52207
--- /dev/null
+++ b/java/res/values-bg/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Клавиатура на Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Настройки на клавиатурата на Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Да вибрира при натискане на клавиш"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натискане на клавиш"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Настройки за предложения на думи"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Автоматично поставяне на главни букви"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"Бързи корекции"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"Коригира най-честите грешки при въвеждане"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Предложения на думи"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Автоматично коригиране на предишната дума"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Запазено"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"Гласово въвеждане"</string>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"За вашия език понастоящем не се поддържа гласово въвеждане, но можете да го използвате на английски."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовото въвеждане е експериментална функция, използваща разпознаването на реч в мрежата на Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"За да изключите гласовото въвеждане, отворете настройките на клавиатурата."</string>
+ <!-- outdated translation 6892342981545727994 --> <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>
+ <string name="voice_error" msgid="5140896300312186162">"Грешка. Моля, опитайте отново."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Не можа да се свърже"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Грешка, твърде много речева информация."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Аудиопроблем"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Грешка в сървъра"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Не се чува реч"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Нямаше съответствия"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Не е инсталирано гласово търсене"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Съвет:"</b>" Прокарайте палец през клавиатурата, за да говорите"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Съвет:"</b>" Следващия път опитайте да произнесете знаците за пунктуация, напр. „точка“, „запетая“ или „въпросителен знак“."</string>
+ <string name="cancel" msgid="6830980399865683324">"Отказ"</string>
+ <string name="ok" msgid="7898366843681727667">"OK"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Гласово въвеждане"</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">"Входни езици"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Плъзнете пръст по клавиша за интервал за промяна на езика"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Докоснете отново, за да запазите"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Има достъп до речник"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-ca/config.xml b/java/res/values-ca/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-ca/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
new file mode 100644
index 000000000..087e7b3fe
--- /dev/null
+++ b/java/res/values-ca/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Teclat Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Configuració del teclat d\'Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <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>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Configuració de suggeriment de paraules"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Suggeriments de paraules"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Corregeix automàticament la paraula anterior"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: desada"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'entrada de veu és una funció experimental que utilitza el reconeixement de la parla en xarxa de Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per desactivar l\'entada de veu, aneu a la configuració del teclat."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"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_listening" msgid="467518160751321844">"Parleu ara"</string>
+ <string name="voice_working" msgid="6666937792815731889">"S\'està treballant"</string>
+ <string name="voice_initializing" msgid="661962047129906646"></string>
+ <string name="voice_error" msgid="5140896300312186162">"Error. Torneu-ho a provar."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"No s\'ha pogut connectar"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Error; s\'ha parlat massa."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Problema d\'àudio"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Error del servidor"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"No s\'escolten paraules"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"No hi ha resultats"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Cerca per veu no instal·lada"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Consell:"</b>" Feu lliscar el dit pel teclat per parlar"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Suggeriment:"</b>" La propera vegada, proveu de dir la puntuació, com ara \"punt\", \"coma\" o \"interrogant\"."</string>
+ <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>
+ <!-- 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">"Idiomes d\'entrada"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Feu lliscar el dit a la barra espaiadora per canviar l\'idioma"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Piqueu un altre cop per desar-ho"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Diccionari disponible"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-cs/config.xml b/java/res/values-cs/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-cs/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-cs/donottranslate-altchars.xml b/java/res/values-cs/donottranslate-altchars.xml
index d91a0e449..f19ac0026 100644
--- a/java/res/values-cs/donottranslate-altchars.xml
+++ b/java/res/values-cs/donottranslate-altchars.xml
@@ -18,17 +18,16 @@
*/
-->
<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_d">ď</string>
- <string name="alternates_for_r">ř4</string>
- <string name="alternates_for_t">ť5</string>
+ <string name="alternates_for_r">ř,4</string>
+ <string name="alternates_for_t">ť,5</string>
<string name="alternates_for_z">ž</string>
</resources>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 7a4cf782f..444e14a38 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Návrhy slov"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Automaticky opravit předchozí slovo"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Další"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Čekat"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pro váš jazyk aktuálně není hlasový vstup podporován, ale funguje v angličtině."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Hlasový vstup je experimentální funkce, která využívá síťové rozpoznávání řeči společnosti Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Chcete-li vypnout hlasový vstup, přejděte do nastavení klávesnice."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Chcete-li použít hlasový vstup, stiskněte tlačítko mikrofonu nebo přejeďte prstem přes klávesnici na obrazovce."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup je experimentální funkce, která využívá síťové rozpoznávání řeči společnosti Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Chcete-li vypnout hlasový vstup, přejděte do nastavení klávesnice."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"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_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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktivovat zasílání statistik užívání a zpráv o selhání"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Automatickým zasíláním statistik o užívání editoru zadávání dat a zpráv o jeho selhání do Googlu můžete přispět k vylepšení tohoto nástroje."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykem aktivujete opravy"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotknete-li se slov, která jste napsali, můžete je opravit."</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotknete-li se slov, která jste napsali, můžete je opravit."</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-da/config.xml b/java/res/values-da/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-da/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-da/donottranslate-altchars.xml b/java/res/values-da/donottranslate-altchars.xml
index b1cc8b627..ca1df7c25 100644
--- a/java/res/values-da/donottranslate-altchars.xml
+++ b/java/res/values-da/donottranslate-altchars.xml
@@ -18,21 +18,23 @@
*/
-->
<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_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_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 c4d67fd60..26d55e66e 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Ordforslag"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Ret automatisk det forrige ord"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Mere"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Stemmeinput"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmeinput understøttes i øjeblikket ikke for dit sprog, men fungerer på engelsk."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Stemme-input er en funktion på forsøgsbasis, som bruger Googles netværksstemmegenkendelse."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Slå stemmeinput fra i indstillingerne for tastaturet."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"For at bruge stemme-input skal du trykke på knappen mikrofon eller lade glide fingeren hen over skærmtastaturet."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Stemme-input er en funktion på forsøgsbasis, som bruger Googles netværksstemmegenkendelse."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Slå stemmeinput fra i indstillingerne for tastaturet."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"For at bruge stemme-input skal du trykke på knappen mikrofon eller lade glide fingeren hen over skærmtastaturet."</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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brugerfeedback"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Vær med til at forbedre denne inputmetode ved at sende anvendelsesstatistikker og rapporter om nedbrud til Google."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryk for at rette ord igen"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Du kan rette ordene igen ved at trykke på de ord, du har indtastet"</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Du kan rette ordene igen ved at trykke på de ord, du har indtastet"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-de/config.xml b/java/res/values-de/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-de/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-de/donottranslate-altchars.xml b/java/res/values-de/donottranslate-altchars.xml
index df27bce28..6c1abc6d0 100644
--- a/java/res/values-de/donottranslate-altchars.xml
+++ b/java/res/values-de/donottranslate-altchars.xml
@@ -19,13 +19,7 @@
-->
<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_o">ö,9</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 b29bbb501..cec38b0dd 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Wortvorschläge"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Vorheriges Wort automatisch korrigieren"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Mehr"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Warten"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Spracheingabe"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spracheingaben werden derzeit nicht für Ihre Sprache unterstützt, funktionieren jedoch in Englisch."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Die Spracheingabe ist eine Funktion im Versuchsstadium, die die vernetzte Spracherkennung von Google verwendet."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Wenn Sie die Spracheingabe deaktivieren möchten, rufen Sie die Tastatureinstellungen auf."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Um die Spracheingabe zu verwenden, drücken Sie die Mikrofontaste oder ziehen Sie Ihren Finger über die Bildschirmtastatur."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Die Spracheingabe ist eine Funktion im Versuchsstadium, die die vernetzte Spracherkennung von Google verwendet."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Wenn Sie die Spracheingabe deaktivieren möchten, rufen Sie die Tastatureinstellungen auf."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Um die Spracheingabe zu verwenden, drücken Sie die Mikrofontaste oder ziehen Sie Ihren Finger über die Bildschirmtastatur."</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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Nutzer-Feedback aktivieren"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Tragen Sie zur Verbesserung dieses Eingabemethodeneditors bei, indem Sie automatisch Nutzungsstatistiken und Absturzberichte an Google senden."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Wortkorrektur"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Sie können Wörter korrigieren, indem Sie die eingegebenen Wörter berühren."</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Sie können Wörter korrigieren, indem Sie die eingegebenen Wörter berühren."</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-el/config.xml b/java/res/values-el/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-el/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index f249e9a7a..3df30fc47 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Υποδείξεις λέξεων"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Αυτόματη διόρθωση της προηγούμενης λέξης"</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">"Προτάσεις 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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Περισσότερα"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Παύση"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Αναμ."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Φωνητική είσοδος"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Η φωνητική είσοδος δεν υποστηρίζεται αυτή τη στιγμή για τη γλώσσα σας, ωστόσο λειτουργεί στα Αγγλικά."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Οι φωνητικές εντολές είναι μια πειραματική λειτουργία, η οποία χρησιμοποιεί τη δικτυακή αναγνώριση ομιλίας της Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Για να απενεργοποιήσετε τη φωνητική είσοδο, μεταβείτε στις ρυθμίσεις πληκτρολογίου."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Για να χρησιμοποιήσετε τις φωνητικές εντολές, πιέστε το κουμπί μικροφώνου ή σύρετε το δάχτυλό σας κατά μήκος του πληκτρολογίου της οθόνης."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Οι φωνητικές εντολές είναι μια πειραματική λειτουργία, η οποία χρησιμοποιεί τη δικτυακή αναγνώριση ομιλίας της Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Για να απενεργοποιήσετε τη φωνητική είσοδο, μεταβείτε στις ρυθμίσεις πληκτρολογίου."</string>
+ <!-- outdated translation 6892342981545727994 --> <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 +85,18 @@
<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>
+ <!-- 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 />
<string name="selectInputMethod" msgid="315076553378705821">"Επιλογή μεθόδου εισόδου"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα"</string>
@@ -133,8 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Ενεργοποίηση σχολίων χρηστών"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Βοηθήστε μας να βελτιώσουμε αυτό το πρόγραμμα επεξεργασίας μεθόδου εισόδου στέλνοντας αυτόματα στατιστικά στοιχεία και αναφορές σφαλμάτων στην Google."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Αγγίξτε για να διορθώσετε ξανά τις λέξεις"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Μπορείτε να διορθώσετε ξανά τις λέξεις αγγίζοντας τις λέξεις που έχετε πληκτρολογήσει"</string>
+ <!-- outdated translation 5037231665897435902 --> <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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-en-rGB/config.xml b/java/res/values-en-rGB/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-en-rGB/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
new file mode 100644
index 000000000..ff63b0c12
--- /dev/null
+++ b/java/res/values-en-rGB/strings.xml
@@ -0,0 +1,193 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Android keyboard"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Android keyboard settings"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrate on key-press"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"Sound on key-press"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Word suggestion settings"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"Quick fixes"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrects commonly typed mistakes"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Word suggestions"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Automatically correct the previous word"</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">"Bigram Suggestions"</string>
+ <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Use previous word to improve suggestion"</string>
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Saved"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Voice input is an experimental feature using Google\'s networked speech recognition."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"To turn off voice input, go to keyboard settings."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"To use voice input, press the microphone button or slide your finger across the on-screen keyboard."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Error: Please try again."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Couldn\'t connect"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Error, too much speech."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Audio problem"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Server error"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"No speech heard"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"No matches found"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Voice search not installed"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Hint:"</b>" Swipe across keyboard to speak"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Hint:"</b>" Next time, try speaking punctuation marks, like \"full stop\", \"comma\" or \"question mark\"."</string>
+ <string name="cancel" msgid="6830980399865683324">"Cancel"</string>
+ <string name="ok" msgid="7898366843681727667">"OK"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Voice input"</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">"Input languages"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Slide finger on spacebar to change language"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Tap again to save"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Dictionary available"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-en/donottranslate-altchars.xml b/java/res/values-en/donottranslate-altchars.xml
index 083befa19..baded885a 100644
--- a/java/res/values-en/donottranslate-altchars.xml
+++ b/java/res/values-en/donottranslate-altchars.xml
@@ -18,10 +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_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-es-rUS/config.xml b/java/res/values-es-rUS/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-es-rUS/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index 3abc8ded6..13d468633 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -26,68 +26,49 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar teclas"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Sonar al pulsar las teclas"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Aviso emergente sobre keypress"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Corregir errores de escritura"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Habilitar corrección de error de entrada"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Errores de entrada apaisada"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Habilitar corrección de error de entrada"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Sugerencias de palabras"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Corregir automáticamente la palabra anterior"</string>
- <string name="prediction" msgid="466220283138359837">"Sugerencias de palabras"</string>
<string name="prediction_category" msgid="7027100625580696660">"Configuración de sugerencia de palabra"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Habilitar finalización automática al escribir"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Finalización automática"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar el tamaño del campo de texto"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugerencias de palabras en vista apaisada"</string>
<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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Sugerencias de palabras"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Corregir automáticamente la palabra anterior"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Más"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada por voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La entrada por voz no está admitida en tu idioma, pero sí funciona en inglés."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La entrada por voz es una característica experimental que utiliza la red de reconocimiento de voz de Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar la entrada por voz, ve a configuración del teclado."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para realizar entrada por voz, presiona el botón del micrófono o desliza tus dedos por el teclado en pantalla."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada por voz es una característica experimental que utiliza la red de reconocimiento de voz de Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la entrada por voz, ve a configuración del teclado."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"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_listening" msgid="467518160751321844">"Habla ahora"</string>
<string name="voice_working" msgid="6666937792815731889">"Procesando"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar los comentarios del usuario"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Ayuda a mejorar este editor de método de introducción de texto al enviar las estadísticas de uso y los informes de error a Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir palabras"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toca las palabras ingresadas que desees corregir"</string>
+ <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca las palabras ingresadas que desees corregir"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-es/config.xml b/java/res/values-es/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-es/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-es/donottranslate-altchars.xml b/java/res/values-es/donottranslate-altchars.xml
index 721062d2d..35187d0de 100644
--- a/java/res/values-es/donottranslate-altchars.xml
+++ b/java/res/values-es/donottranslate-altchars.xml
@@ -19,12 +19,6 @@
-->
<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_e">3,é</string>
+ <string name="alternates_for_o">ó,9</string>
</resources>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index cd6dc8ee1..872c5414d 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -26,68 +26,49 @@
<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"</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="auto_cap" msgid="1719746674854628252">"Uso de mayúsculas auto."</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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Sugerencias de palabras"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Corregir automáticamente la palabra anterior"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Más"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Introducción de voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente la introducción de voz no está disponible en tu idioma, pero se puede utilizar en inglés."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La introducción de voz es una función en fase experimental que utiliza la tecnología de reconocimiento de voz en red de Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar la función de introducción de voz, accede a la configuración del teclado."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para utilizar la función de introducción de voz, pulsa el botón de micrófono o desliza el dedo por el teclado en pantalla."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"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>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la función de introducción de voz, accede a la configuración del teclado."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"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_listening" msgid="467518160751321844">"Habla ahora"</string>
<string name="voice_working" msgid="6666937792815731889">"En curso"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<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>
+ <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tocar palabras introducidas para corregirlas"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-fa/config.xml b/java/res/values-fa/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-fa/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
new file mode 100644
index 000000000..85f3cbab4
--- /dev/null
+++ b/java/res/values-fa/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"صفحه کلید Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"تنظیمات صفحه کلید Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"لرزش با فشار کلید"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"صدا با فشار کلید"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"تنظیمات پیشنهاد کلمه"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"نوشتن با حروف بزرگ خودکار"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"راه حل های سریع"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحیح خطاهای تایپی رایج"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"پیشنهادات کلمه"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"تصحیح خودکار کلمه قبلی"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ذخیره شد"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"ورودی صوتی"</string>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ورودی صوتی در حال حاضر برای زبان شما پشتیبانی نمی شود اما برای زبان انگلیسی فعال است."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ورودی صوتی یک ویژگی آزمایشی با استفاده از تشخیص گفتار شبکه Google است."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"برای خاموش کردن ورودی صدا، به تنظیمات صفحه کلید بروید."</string>
+ <!-- outdated translation 6892342981545727994 --> <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>
+ <string name="voice_error" msgid="5140896300312186162">"خطا: لطفاً دوباره امتحان کنید."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"متصل نشد"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"خطا، گفتار بسیار زیاد است."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"مشکل صوتی"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"خطای سرور"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"گفتاری شنیده نشد"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"مورد منطبقی یافت نشد"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"جستجوی صوتی نصب نشده است"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"نکته: "</b>" برای صحبت روی صفحه کلید ضربه بزنید"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"نکته: دفعه دیگر، از نشانه گذاری های گفتاری مانند \"نقطه\"، \"کاما\" یا \"علامت سؤال\" استفاده کنید."</b></string>
+ <string name="cancel" msgid="6830980399865683324">"لغو"</string>
+ <string name="ok" msgid="7898366843681727667">"تأیید"</string>
+ <string name="voice_input" msgid="2466640768843347841">"ورودی صوتی"</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">"زبان های ورودی"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"برای تغییر زبان انگشت را روی کلید فاصله بلغزانید"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← جهت ذخیره دوباره ضربه بزنید"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"دیکشنری موجود است"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-fi/config.xml b/java/res/values-fi/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-fi/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
new file mode 100644
index 000000000..ac6deb7fc
--- /dev/null
+++ b/java/res/values-fi/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Android-näppäimistö"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Android-näppäimistön asetukset"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <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>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Sanaehdotusasetukset"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Automaattiset isot kirjaimet"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"Pikakorjaukset"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"Korjaa yleiset kirjoitusvirheet"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Sanaehdotukset"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Korjaa edellinen sana automaattisesti"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Tallennettu"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"Ää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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Äänisyöte on kokeellinen Googlen puheentunnistusta käyttävä ominaisuus."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Siirry näppäimistön asetuksiin poistaaksesi äänisyötteen käytöstä."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Käytä äänisyötettä painamalla mikrofonipainiketta tai liu\'uttamalla sormeasi näytön näppäimistön poikki."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Virhe. Yritä uudelleen."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Ei yhteyttä"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Virhe, liikaa puhetta."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Ääniongelma"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Palvelinvirhe"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Puhetta ei kuulu"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Ei vastineita"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Äänihakua ei asennettu"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Vihje:"</b>" liu\'uta sormea näppäimistöllä ja puhu"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Vihje:"</b>" kokeile seuraavalla kerralla puhua välimerkit, kuten \"period\" (piste), \"comma\" (pilkku) tai \"question mark\" (kysymysmerkki)."</string>
+ <string name="cancel" msgid="6830980399865683324">"Peruuta"</string>
+ <string name="ok" msgid="7898366843681727667">"OK"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Äänisyöte"</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">"Syöttökielet"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Vaihda kieltä liu\'uttamalla sormea välilyöntinäppäimellä"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Tallenna napauttamalla uudelleen"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Sanakirja saatavilla"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-fr/config.xml b/java/res/values-fr/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-fr/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-fr/donottranslate-altchars.xml b/java/res/values-fr/donottranslate-altchars.xml
index 874d89dab..830119d52 100644
--- a/java/res/values-fr/donottranslate-altchars.xml
+++ b/java/res/values-fr/donottranslate-altchars.xml
@@ -18,15 +18,7 @@
*/
-->
<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_q"></string>
<string name="alternates_for_w"></string>
<string name="alternates_for_z">2</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index f8f4bac09..52b8fe260 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -26,68 +26,49 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer à chaque touche"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Son à chaque touche"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Agrandir les caractères à chaque touche"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Corriger les fautes de frappe"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Activer la correction des erreurs de saisie"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Erreurs de saisie en mode paysage"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activer la correction des erreurs de saisie"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Saisie prédictive"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Corriger automatiquement le mot précédent"</string>
- <string name="prediction" msgid="466220283138359837">"Saisie prédictive"</string>
<string name="prediction_category" msgid="7027100625580696660">"Paramètres de la saisie prédictive"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Activer la saisie semi-automatique"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Saisie semi-automatique"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Agrandir le champ de texte"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Masquer la saisie prédictive en mode paysage"</string>
<string name="auto_cap" msgid="1719746674854628252">"Majuscules auto"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Mettre en majuscule la première lettre de chaque phrase"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Ponctuation automatique"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Corrections rapides"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige les fautes de frappe courantes"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Afficher les suggestions"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Afficher les suggestions de terme lors de la saisie"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Saisie semi-automatique"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Insérer auto. le terme surligné avec barre espace/ponctuation"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<string name="prefs_settings_key" msgid="4623341240804046498">"Afficher la touche des paramètres"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatique"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Toujours afficher"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Toujours masquer"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Saisie prédictive"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Corriger automatiquement le mot précédent"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Plus"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Attente"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Saisie vocale"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La saisie vocale n\'est pas encore prise en charge pour votre langue, mais elle fonctionne en anglais."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La saisie vocale est une fonctionnalité expérimentale qui fait appel à la reconnaissance vocale en réseau de Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Pour désactiver la saisie vocale, accédez aux paramètres du clavier."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Pour utiliser la saisie vocale, appuyez sur la touche du microphone ou faites glisser votre doigt sur le clavier à l\'écran."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La saisie vocale est une fonctionnalité expérimentale qui fait appel à la reconnaissance vocale en réseau de Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Pour désactiver la saisie vocale, accédez aux paramètres du clavier."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"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_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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Autoriser les commentaires des utilisateurs"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'incident à Google."</string>
<string name="prefs_enable_recorrection" msgid="4588408906649533582">"Appuyer pour corriger les suggestions"</string>
- <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Appuyer sur les mots saisis pour les corriger"</string>
+ <!-- outdated translation 1056068922330206170 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Appuyer sur les mots saisis pour les corriger"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-hr/config.xml b/java/res/values-hr/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-hr/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
new file mode 100644
index 000000000..c96571938
--- /dev/null
+++ b/java/res/values-hr/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Android tipkovnica"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Postavke tipkovnice za Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <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>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Postavke prijedloga riječi"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Automatsko pisanje velikih slova"</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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Prijedlozi riječi"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Automatsko ispravljanje prethodne riječi"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Spremljeno"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"Glasovni unos"</string>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Vaš jezik trenutno nije podržan za glasovni unos, ali radi za engleski."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni unos je pokusna značajka koja koristi Googleovo umreženo prepoznavanje govora."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Za isključivanje glasovnog unosa idite na postavke tipkovnice."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Da biste koristili glasovni unos pritisnite gumb mikrofona ili kliznite prstom preko tipkovnice na zaslonu."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Pogreška. Pokušajte ponovo."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Spajanje nije bilo moguće"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Pogreška, predugi govor."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Problem sa zvukom"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Pogreška na poslužitelju"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Nije se čuo govor"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Nisu pronađeni rezultati"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Glasovno pretraživanje nije instalirano"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Savjet:"</b>" Prijeđite preko tipkovnice pa govorite"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Savjet:"</b>" Sljedeći put pokušajte izgovoriti znakove interpunkcije poput \"točka, \"zarez\" ili \"upitnik\"."</string>
+ <string name="cancel" msgid="6830980399865683324">"Odustani"</string>
+ <string name="ok" msgid="7898366843681727667">"U redu"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Glasovni unos"</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">"Jezici unosa"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Kliznite prstom po razmaknici za promjenu jezika"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Dotaknite ponovo za spremanje"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Rječnik je dostupan"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-hu/config.xml b/java/res/values-hu/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-hu/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
new file mode 100644
index 000000000..213aecace
--- /dev/null
+++ b/java/res/values-hu/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Android-billentyűzet"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Android billentyűzetbeállítások"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <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>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Szójavaslati beállítások"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Automatikusan nagy kezdőbetű"</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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Szójavaslatok"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Az előző szó automatikus kijavítása"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : mentve"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A hangbevitel a Google hálózati beszédfelismerését alkalmazó kísérleti funkció."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"A hangbevitelt a billentyűzet beállításai között lehet kikapcsolni."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"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_listening" msgid="467518160751321844">"Most beszéljen"</string>
+ <string name="voice_working" msgid="6666937792815731889">"Feldolgozás"</string>
+ <string name="voice_initializing" msgid="661962047129906646"></string>
+ <string name="voice_error" msgid="5140896300312186162">"Hiba történt. Kérjük, próbálja újra."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Nem sikerült kapcsolódni"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Hiba történt; túl sokat beszélt."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Hangprobléma"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Szerverhiba"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Nem hallatszott beszéd"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Nem található egyezés"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"A hangalapú keresés nincs telepítve"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Tipp:"</b>" húzza végig az ujját a billentyűzeten a beszédhez"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Tipp:"</b>" következő alkalommal próbálja ki az írásjelek kimondását is, pl. \"period\", \"comma\" vagy \"question mark\"."</string>
+ <string name="cancel" msgid="6830980399865683324">"Mégse"</string>
+ <string name="ok" msgid="7898366843681727667">"OK"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Hangbevitel"</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">"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>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← A mentéshez érintse meg újra"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Van elérhető szótár"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-in/config.xml b/java/res/values-in/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-in/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
new file mode 100644
index 000000000..fdcc62d34
--- /dev/null
+++ b/java/res/values-in/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Keyboard Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Setelan keyboard Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar jika tombol ditekan"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"Berbunyi jika tombol ditekan"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Setelan saran kata"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"Perbaikan cepat"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"Memperbaiki kesalahan ketik umum"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Saran kata"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Perbaiki kata sebelumnya secara otomatis"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Telah disimpan"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Masukan suara adalah fitur eksperimental yang menggunakan pengenal suara berjaringan Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Untuk mematikan masukan suara, buka setelan keyboard."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Untuk menggunakan masukan suara, tekan tombol mikrofon atau geser jari Anda di sepanjang keyboard pada layar."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Galat: Coba lagi."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Tidak dapat menyambung"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Galat, terlalu banyak ucapan."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Masalah audio"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Galat server"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Tidak terdengar ucapan"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Tak ditemukan yang cocok"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Penelusuran suara tidak terpasang"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Petunjuk:"</b>" Gesek keyboard untuk berbicara"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Petunjuk:"</b>" Selanjutnya, coba ucapkan tanda baca seperti \"titik\", \"koma\", atau \"tanda tanya\"."</string>
+ <string name="cancel" msgid="6830980399865683324">"Batal"</string>
+ <string name="ok" msgid="7898366843681727667">"OK"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Masukan suara"</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">"Bahasa masukan"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Geser jari pada bilah spasi untuk mengubah bahasa"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Ketuk sekali lagi untuk menyimpan"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Kamus yang tersedia"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-it/config.xml b/java/res/values-it/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-it/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-it/donottranslate-altchars.xml b/java/res/values-it/donottranslate-altchars.xml
index 23960171b..0e4a285f1 100644
--- a/java/res/values-it/donottranslate-altchars.xml
+++ b/java/res/values-it/donottranslate-altchars.xml
@@ -18,13 +18,8 @@
*/
-->
<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_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_y">ýÿ6</string>
</resources>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 94cdb967f..6ec41b253 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -26,68 +26,49 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrazione tasti"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Suono tasti"</string>
<string name="popup_on_keypress" msgid="123894815723512944">"Popup alla pressione di un tasto"</string>
- <string name="hit_correction" msgid="4855351009261318389">"Correggi errori di digitazione"</string>
- <string name="hit_correction_summary" msgid="8761701873008070796">"Attiva la correzione degli errori di inserimento"</string>
- <string name="hit_correction_land" msgid="2567691684825205448">"Errori di inserimento in visualizzazione orizzontale"</string>
- <string name="hit_correction_land_summary" msgid="4076803842198368328">"Attiva la correzione degli errori di inserimento"</string>
- <string name="auto_correction" msgid="7911639788808958255">"Suggerimenti parola"</string>
- <string name="auto_correction_summary" msgid="6881047311475758267">"Correggi automaticamente la parola precedente"</string>
- <string name="prediction" msgid="466220283138359837">"Suggerimenti parola"</string>
<string name="prediction_category" msgid="7027100625580696660">"Impostazioni suggerimento parole"</string>
- <string name="prediction_summary" msgid="459788228830873110">"Attiva il completamento automatico durante la digitazione"</string>
- <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Completamento automatico"</string>
- <string name="prediction_landscape" msgid="4874601565593216183">"Aumenta dimensioni campo di testo"</string>
- <string name="prediction_landscape_summary" msgid="6736551095997839472">"Nascondi i suggerimenti delle parole in visualizzazione orizzontale"</string>
<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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostra tasto impostazioni"</string>
<string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatico"</string>
<string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostra sempre"</string>
<string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Nascondi sempre"</string>
- <!-- no translation found for settings_key_modes:0 (8549888726962891527) -->
- <!-- no translation found for settings_key_modes:1 (881280041213210923) -->
- <!-- no translation found for settings_key_modes:2 (7317310620171067848) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Suggerimenti parola"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Correggi automaticamente la parola precedente"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Altro"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Attesa"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Comandi vocali"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"I comandi vocali non sono attualmente supportati per la tua lingua ma funzionano in inglese."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"I comandi vocali sono una funzione sperimentale che utilizza il riconoscimento vocale in rete di Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Per disattivare i comandi vocali, vai alle impostazioni della tastiera."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Per utilizzare i comandi vocali, premi il pulsante del microfono o fai scorrere il dito sulla tastiera sullo schermo."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"I comandi vocali sono una funzione sperimentale che utilizza il riconoscimento vocale in rete di Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per disattivare i comandi vocali, vai alle impostazioni della tastiera."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Per utilizzare i comandi vocali, premi il pulsante del microfono o fai scorrere il dito sulla tastiera sullo schermo."</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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Attiva commenti degli utenti"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Aiuta a migliorare l\'editor del metodo di inserimento inviando automaticamente a Google statistiche sull\'utilizzo e segnalazioni sugli arresti anomali."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocca per correggere di nuovo le parole"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Puoi correggere di nuovo le parole toccando quelle che hai digitato"</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Puoi correggere di nuovo le parole toccando quelle che hai digitato"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-iw/config.xml b/java/res/values-iw/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-iw/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
new file mode 100644
index 000000000..4bc63ec0e
--- /dev/null
+++ b/java/res/values-iw/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"מקלדת Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"הגדרות מקלדת של Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"רטט עם לחיצה על מקשים"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"צלילים עם לחיצה על מקשים"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"הגדרות של הצעות מילים"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"הפיכה אוטומטית של אותיות לרישיות"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"תיקונים מהירים"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"מתקן שגיאות הקלדה נפוצות"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"הצעות למילים"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"תקן באופן אוטומטי את המילה הקודמת"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : נשמרה"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"קלט קולי"</string>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"קלט קולי אינו נתמך בשלב זה בשפתך, אך הוא פועל באנגלית."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"קלט קולי הוא תכונה ניסיונית של זיהוי הדיבור ברשת של Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"כדי לכבות את הקלט הקולי, עבור להגדרות מקלדת."</string>
+ <!-- outdated translation 6892342981545727994 --> <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>
+ <string name="voice_error" msgid="5140896300312186162">"שגיאה. נסה שוב."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"אין אפשרות להתחבר"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"שגיאה, דיבור רב מדי."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"בעיה באודיו"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"שגיאת שרת"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"לא נשמע דיבור"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"לא נמצאו התאמות"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"חיפוש קולי לא מותקן"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"רמז:"</b>" העבר על המקלדת כדי לדבר"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"רמז:"</b>" בפעם הבאה, נסה לומר את סימני הפיסוק כגון \"נקודה\", \"פסיק\" או \"סימן שאלה\"."</string>
+ <string name="cancel" msgid="6830980399865683324">"ביטול"</string>
+ <string name="ok" msgid="7898366843681727667">"אישור"</string>
+ <string name="voice_input" msgid="2466640768843347841">"קלט קולי"</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">"שפות קלט"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"החלק את האצבע על מקש הרווח כדי לשנות שפה"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← הקש שוב כדי לשמור"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"מילון זמין"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-ja/config.xml b/java/res/values-ja/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-ja/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index 71a67a2f6..f13b691f8 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"入力候補表示"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"前の単語を自動修正する"</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">"バイグラム入力候補表示"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Shift"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"停止"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"待機"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"音声入力"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"音声入力は現在英語には対応していますが、日本語には対応していません。"</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"音声入力はGoogleのネットワーク音声認識技術を利用した試験段階の機能です。"</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"音声入力をOFFにするには、キーボードの設定を開きます。"</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"音声入力するには、マイクボタンを押すか画面キーボードをスワイプしてください。"</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"音声入力はGoogleのネットワーク音声認識技術を利用した試験段階の機能です。"</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"音声入力をOFFにするには、キーボードの設定を開きます。"</string>
+ <!-- outdated translation 6892342981545727994 --> <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 +85,18 @@
<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>
+ <!-- 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 />
<string name="selectInputMethod" msgid="315076553378705821">"入力方法の選択"</string>
<string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string>
<string name="language_selection_summary" msgid="187110938289512256">"スペースバーで指をスライドさせて言語を変更する"</string>
@@ -133,8 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"ユーザーフィードバックを有効にする"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。"</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"タップして語句を再修正"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"入力した語句をタップすると語句を再修正できます"</string>
+ <!-- outdated translation 5037231665897435902 --> <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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-ko/config.xml b/java/res/values-ko/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-ko/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index ab3aa91b0..2494cc86d 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"단어 추천"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"이전 단어를 자동으로 수정"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"더보기"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"일시 중지"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"대기"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"음성 입력"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"음성 입력은 현재 자국어로 지원되지 않으며 영어로 작동됩니다."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"음성 입력은 Google의 네트워크화된 음성 인식을 사용하는 실험적 기능입니다."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"음성 입력을 사용하지 않으려면 키보드 설정으로 이동하세요."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"음성 입력을 사용하려면 마이크 버튼을 누르거나 터치 키보드 위로 손가락을 미끄러지듯 움직이세요."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"음성 입력은 Google의 네트워크화된 음성 인식을 사용하는 실험적 기능입니다."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"음성 입력을 사용하지 않으려면 키보드 설정으로 이동하세요."</string>
+ <!-- outdated translation 6892342981545727994 --> <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 +85,18 @@
<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>
+ <!-- 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 />
<string name="selectInputMethod" msgid="315076553378705821">"입력 방법 선택"</string>
<string name="language_selection_title" msgid="1651299598555326750">"입력 언어"</string>
<string name="language_selection_summary" msgid="187110938289512256">"손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경"</string>
@@ -133,8 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"사용자 의견 사용"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"사용 통계 및 충돌 보고서를 Google에 자동으로 전송하여 입력 방법 편집기의 개선에 도움을 줍니다."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"터치하여 단어 다시 수정"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"입력한 단어를 터치하면 다시 수정할 수 있습니다."</string>
+ <!-- outdated translation 5037231665897435902 --> <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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</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-lt/config.xml b/java/res/values-lt/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-lt/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
new file mode 100644
index 000000000..d30e88c6c
--- /dev/null
+++ b/java/res/values-lt/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"„Android“ klaviatūra"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"„Android“ klaviatūros nustatymai"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <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>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Žodžių pasiūlymo nustatymai"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Automatinis didžiųjų raidžių rašymas"</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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Žodžių pasiūlymai"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Automatiškai taisyti ankstesnį žodį"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: išsaugota"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balso įvestis – tai eksperimentinė funkcija, naudojanti „Google“ tinklo kalbos atpažinimą."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Jei norite išjungti balso įvestį, eikite į klaviatūros nustatymus."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Jei norite naudoti balso įvestį, paspauskite mikrofono mygtuką arba pirštu slyskite ekranine klaviatūra."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Klaida. Bandykite dar kartą."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Nepavyko prijungti"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Klaida, per daug kalbos."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Problema su garsu"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Serverio klaida"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Negirdima jokia kalba"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Atitikmenų nerasta"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Balso paieška neįdiegta"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Užuomina:"</b>" perbraukite klaviatūra, kad galėtumėte kalbėti"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Užuomina:"</b>" kitą kartą pabandykite sakyti skyrybos ženklų pavadinimus, pvz., „taškas“, „kablelis“ arba „klaustukas“."</string>
+ <string name="cancel" msgid="6830980399865683324">"Atšaukti"</string>
+ <string name="ok" msgid="7898366843681727667">"Gerai"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Balso įvestis"</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">"Įvesties kalbos"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Pirštu slyskite tarpo klavišu, kad pakeistumėte kalbą"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Bakstelėkite dar kartą, kad išsaugotumėte"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Žodynas galimas"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-lv/config.xml b/java/res/values-lv/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-lv/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
new file mode 100644
index 000000000..6811cc639
--- /dev/null
+++ b/java/res/values-lv/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Android tastatūra"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Android tastatūras iestatījumi"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <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>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Vārdu ieteikumu iestatījumi"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Automātiska lielo burtu lietošana"</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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Vārdu ieteikumi"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Automātiski labot iepriekšējo vārdu"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: saglabāts"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balss ievade ir izmēģinājuma funkcija, kuras pamatā ir Google tīkla runas atpazīšanas līdzeklis."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Lai izslēgtu balss ievadi, atveriet tastatūras iestatījumus."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Lai izmantotu balss ievadi, nospiediet mikrofona pogu vai slidiniet pirkstus pāri ekrāna tastatūrai."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Kļūda. Lūdzu, mēģiniet vēlreiz."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Nevar izveidot savienojumu."</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Kļūda, pārāk ilga balss ievade."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Audio problēma"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Servera kļūda"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Nekas nav dzirdams."</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Nav atrasta neviena atbilstība."</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Balss meklēšana nav instalēta."</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Ieteikums:"</b>" slidiniet pirkstu pār tastatūru, lai veiktu balss ievadi."</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Ieteikums:"</b>" nākamreiz mēģiniet izrunāt pieturzīmes, piemēram, “punkts”, “komats” vai “jautājuma zīme”."</string>
+ <string name="cancel" msgid="6830980399865683324">"Atcelt"</string>
+ <string name="ok" msgid="7898366843681727667">"Labi"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Balss ievade"</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">"Ievades valodas"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Slidiniet pirkstu uz atstarpes taustiņa, lai mainītu valodu"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Vēlreiz pieskarieties, lai saglabātu"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Ir pieejama vārdnīca."</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-nb/config.xml b/java/res/values-nb/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-nb/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-nb/donottranslate-altchars.xml b/java/res/values-nb/donottranslate-altchars.xml
index 6257dfc31..c65dea9fb 100644
--- a/java/res/values-nb/donottranslate-altchars.xml
+++ b/java/res/values-nb/donottranslate-altchars.xml
@@ -18,20 +18,22 @@
*/
-->
<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_c">ç,ć,č</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="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 c98b8f4da..ab1d1be0b 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Autokorrektur"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Autokorriger forrige ord"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Mer"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Stemmedata"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmedata håndteres foreløpig ikke på ditt språk, men fungerer på engelsk."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Talekommandoer er en eksperimentell funksjon som bruker Googles nettverksbaserte talegjenkjenning."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Gå til innstillinger for tastatur for å slå av stemmedata."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Du bruker talekommandoer ved å trykke på mikrofonknappen eller skyve fingeren over tastaturet på skjermen."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Talekommandoer er en eksperimentell funksjon som bruker Googles nettverksbaserte talegjenkjenning."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Gå til innstillinger for tastatur for å slå av stemmedata."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Du bruker talekommandoer ved å trykke på mikrofonknappen eller skyve fingeren over tastaturet på skjermen."</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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brukertilbakemelding"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Ved å sende bruksstatistikk og programstopprapporter til Google automatisk, hjelper du oss med å gjøre redigeringsfunksjonen for denne inndatametoden enda bedre."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Trykk for å endre ord"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Du kan endre innskrevne ord ved å trykke på dem"</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Du kan endre innskrevne ord ved å trykke på 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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-nl/config.xml b/java/res/values-nl/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-nl/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-nl/donottranslate-altchars.xml b/java/res/values-nl/donottranslate-altchars.xml
deleted file mode 100644
index d3beafade..000000000
--- a/java/res/values-nl/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-nl/strings.xml b/java/res/values-nl/strings.xml
index c907344eb..a04cce644 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -26,68 +26,49 @@
<string name="vibrate_on_keypress" msgid="5258079494276955460">"Trillen bij druk op toets"</string>
<string name="sound_on_keypress" msgid="6093592297198243644">"Geluid bij druk op een toets"</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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Woordsuggesties"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Het vorige woord automatisch corrigeren"</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">"Digram-suggesties"</string>
<string name="bigram_suggestion_summary" msgid="4383845146070101531">"Vorig woord gebruiken om suggestie te verbeteren"</string>
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Geen"</item>
- <item msgid="1669461741568287396">"Basis"</item>
- <item msgid="4894328801530136615">"Geavanceerd"</item>
- </string-array>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: opgeslagen"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Houd een toets ingedrukt om diakritische tekens weer te geven (ø, ö, enzovoort)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Druk op elk gewenst moment op de toets Terug ↶ om het toetsenbord te sluiten"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Toegang tot cijfers en symbolen"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Blijf drukken op het meest linkse woord om het toe te voegen aan het woordenboek"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Raak deze tip aan om door te gaan »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Raak dit punt aan om deze tip te sluiten en te beginnen met typen."</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Het toetsenbord wordt geopend wanneer u een tekstveld aanraakt"</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Blijf een toets aanraken om diakritische tekens weer te geven"\n"(ø, ö, ô, ó, enzovoort)"</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Schakel over naar cijfers en symbolen door deze toets aan te raken"</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Ga terug naar letters door deze toets nogmaals aan te raken"</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Blijf deze toets aanraken om toetsenbordinstellingen te wijzigen, zoals auto-aanvullen"</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Probeer het zelf!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Beginnen"</string>
<string name="label_next_key" msgid="362972844525672568">"Volgende"</string>
<string name="label_done_key" msgid="2441578748772529288">"Gereed"</string>
<string name="label_send_key" msgid="2815056534433717444">"Verzenden"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"Alt"</string>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Meer"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Onderbr."</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Wacht"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Spraakinvoer"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spraakinvoer wordt momenteel niet ondersteund in uw taal, maar is wel beschikbaar in het Engels."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Spraakinvoer is een experimentele functie met de spraakherkenning van het Google-netwerk."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Als u spraakinvoer wilt uitschakelen, gaat u naar de toetsenbordinstellingen."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Als u spraakinvoer gebruikt, drukt u op de microfoonknop of schuift u uw vinger over het schermtoetsenbord."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Spraakinvoer is een experimentele functie met de spraakherkenning van het Google-netwerk."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Als u spraakinvoer wilt uitschakelen, gaat u naar de toetsenbordinstellingen."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Als u spraakinvoer gebruikt, drukt u op de microfoonknop of schuift u uw vinger over het schermtoetsenbord."</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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Gebruikersfeedback inschakelen."</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Help deze invoermethode te verbeteren door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Raak aan om woorden opnieuw te corrigeren"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"U kunt woorden opnieuw corrigeren door woorden aan te raken die u heeft getypt"</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"U kunt woorden opnieuw corrigeren door woorden aan te raken die u heeft getypt"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-pl/config.xml b/java/res/values-pl/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-pl/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-pl/donottranslate-altchars.xml b/java/res/values-pl/donottranslate-altchars.xml
index da6b5fd5c..df8c52b47 100644
--- a/java/res/values-pl/donottranslate-altchars.xml
+++ b/java/res/values-pl/donottranslate-altchars.xml
@@ -19,14 +19,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_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_y">ýÿ6</string>
- <string name="alternates_for_z">źż</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 a2f429e23..36c249575 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -26,68 +26,49 @@
<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">"Wyświetlaj po naciśnięciu klawisza"</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="auto_cap" msgid="1719746674854628252">"Wstawiaj wielkie litery"</string>
- <string name="auto_cap_summary" msgid="3260681697600786825">"Zamieniaj na wielką pierwszą literę zdania"</string>
- <string name="auto_punctuate" msgid="7276672334264521751">"Automatyczna interpunkcja"</string>
- <string name="auto_punctuate_summary" msgid="6589441565817502132"></string>
<string name="quick_fixes" msgid="5353213327680897927">"Szybkie poprawki"</string>
<string name="quick_fixes_summary" msgid="3405028402510332373">"Poprawia częste błędy wpisywania"</string>
- <string name="show_suggestions" msgid="507074425254289133">"Pokaż sugestie"</string>
- <string name="show_suggestions_summary" msgid="1989672863935759654">"Wyświetl sugerowane słowa podczas wpisywania"</string>
- <string name="auto_complete" msgid="1103196318775486023">"Autouzupełnianie"</string>
- <string name="auto_complete_summary" msgid="6113149638718274624">"Spacja i znaki przestankowe wstawiają wyróżnione słowo"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Sugestie słów"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Automatycznie poprawiaj poprzednie słowo"</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">"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">"Gotowe"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Więcej"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Czekaj"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Wprowadzanie głosowe"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Wprowadzanie głosowe obecnie nie jest obsługiwane w Twoim języku, ale działa w języku angielskim."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Wprowadzanie głosowe to funkcja eksperymentalna wykorzystująca funkcję firmy Google umożliwiającą rozpoznawanie mowy przy użyciu sieci."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Aby wyłączyć wprowadzanie głosowe, przejdź do ustawień klawiatury."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Aby skorzystać z wprowadzania głosowego, naciśnij przycisk mikrofonu lub przesuń palcem po klawiaturze ekranowej."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Wprowadzanie głosowe to funkcja eksperymentalna wykorzystująca funkcję firmy Google umożliwiającą rozpoznawanie mowy przy użyciu sieci."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Aby wyłączyć wprowadzanie głosowe, przejdź do ustawień klawiatury."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Aby skorzystać z wprowadzania głosowego, naciśnij przycisk mikrofonu lub przesuń palcem po klawiaturze ekranowej."</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 +85,18 @@
<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>
+ <!-- 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 />
<string name="selectInputMethod" msgid="315076553378705821">"Wybierz metodę wprowadzania"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Przesuń palcem po spacji, aby zmienić język"</string>
@@ -133,8 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Włącz przesyłanie opinii użytkownika"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Pomóż ulepszyć edytor tej metody wprowadzania, automatycznie wysyłając do Google statystyki użycia i raporty o awariach."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotknij, aby ponownie poprawić słowa"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Możesz ponownie poprawiać wprowadzone słowa, dotykając ich"</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Możesz ponownie poprawiać wprowadzone słowa, dotykając ich"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-pt-rPT/config.xml b/java/res/values-pt-rPT/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-pt-rPT/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</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 01d96edc5..f14c4722e 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Sugestões de palavras"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Corrigir automaticamente a palavra anterior"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Mais"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente, a entrada de voz não é suportada para o seu idioma, mas funciona em inglês."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A entrada de voz é uma funcionalidade experimental que utiliza o reconhecimento de voz em rede da Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar a entrada de voz, aceda às definições do teclado."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para utilizar a entrada de voz, prima o botão do microfone ou deslize o dedo no teclado do ecrã."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz é uma funcionalidade experimental que utiliza o reconhecimento de voz em rede da Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar a entrada de voz, aceda às definições do teclado."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar a entrada de voz, prima o botão do microfone ou deslize o dedo no teclado do ecrã."</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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Activar comentários do utilizador"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Envie automaticamente estatísticas de utilização e relatórios de falhas para a Google e ajude-nos a melhor este editor de método de introdução."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para voltar a corrigir palavras"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Pode voltar a corrigir palavras tocando naquelas que escreveu"</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pode voltar a corrigir palavras tocando naquelas que escreveu"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-pt/config.xml b/java/res/values-pt/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-pt/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-pt/donottranslate-altchars.xml b/java/res/values-pt/donottranslate-altchars.xml
deleted file mode 100644
index d3beafade..000000000
--- a/java/res/values-pt/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/strings.xml b/java/res/values-pt/strings.xml
index 0acaf25d6..b2e56c5b7 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -26,68 +26,49 @@
<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 tocar a tecla"</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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de configuraçõ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">"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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Sugestões de palavra"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Corrigir automaticamente a palavra anterior"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Mais"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A entrada de voz não é suportada no momento para o seu idioma, mas funciona em inglês."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A entrada de voz é um recurso experimental que usa o reconhecimento de fala de rede do Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desativar a entrada de voz, vá para as configurações do teclado."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para usar a entrada de voz, pressione o botão com o microfone ou deslize o dedo sobre o teclado na tela."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz é um recurso experimental que usa o reconhecimento de fala de rede do Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desativar a entrada de voz, vá para as configurações do teclado."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"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_listening" msgid="467518160751321844">"Fale agora"</string>
<string name="voice_working" msgid="6666937792815731889">"Trabalhando"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
@@ -104,27 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<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>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Toque para corrigir novamente as palavras"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Você pode fazer novamente a correção tocando nas palavras digitadas"</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Você pode fazer novamente a correção tocando nas palavras digitadas"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-rm/config.xml b/java/res/values-rm/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-rm/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-rm/donottranslate-altchars.xml b/java/res/values-rm/donottranslate-altchars.xml
index f17026fa9..b44c3c005 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 91dbf72ff..1c1ce879e 100644
--- a/java/res/values-rm/strings.xml
+++ b/java/res/values-rm/strings.xml
@@ -22,67 +22,61 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="english_ime_name" msgid="7252517407088836577">"Tastatura Android"</string>
<string name="english_ime_settings" msgid="6661589557206947774">"Parameters da la tastatura Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
<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>
- <!-- no translation found for popup_on_keypress (123894815723512944) -->
- <skip />
- <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="popup_on_keypress" msgid="123894815723512944">"Pop-up cun smatgar ina tasta"</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>
<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 bigram_suggestion (1323347224043514969) -->
- <skip />
- <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
- <skip />
- <string-array name="prediction_modes">
- <item msgid="4870266572388153286">"Nagin"</item>
- <item msgid="1669461741568287396">"Simpel"</item>
- <item msgid="4894328801530136615">"Avanzà"</item>
- </string-array>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Propostas da pleds"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"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 name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Memorisà"</string>
- <string name="tip_long_press" msgid="6101270866284343344">"Tegnair smatgà per mussar ils accents (à, é, etc.)"</string>
- <string name="tip_dismiss" msgid="7585579046862204381">"Smatgar ↶ per serrar la tastatura"</string>
- <string name="tip_access_symbols" msgid="6344098517525531652">"Acceder a cifras e simbols"</string>
- <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Smatgar ditg sin il pled dal tut a sanestra per l\'agiuntar al dicziunari"</string>
- <string name="touch_to_continue" msgid="7869803257948414531">"Tutgar quest commentari per cuntinuar »"</string>
- <string name="touch_to_finish" msgid="7990196086480585789">"Tutgar qua, per serrar quest commentari e cumenzar a tippar!"</string>
- <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"La tastatura vegn adina averta sche Vus tutgais in champ da text."</b></string>
- <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tegnai smatgà ina tasta per mussar ils segns spezials"\n"(ø, ö, ô, ó etc.)."</b></string>
- <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Midai a numers e simbols cun tutgar quest buttun."</b></string>
- <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Turnai a letras cun smatgar danovamain quest buttun."</b></string>
- <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tegnai smatgà quest buttun per midar ils parameters da tastatura, sco p. ex. la cumplettaziun automatica."</b></string>
- <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Empruvai!"</b></string>
<string name="label_go_key" msgid="1635148082137219148">"Dai"</string>
<string name="label_next_key" msgid="362972844525672568">"Vinavant"</string>
<string name="label_done_key" msgid="2441578748772529288">"Finì"</string>
<string name="label_send_key" msgid="2815056534433717444">"Trametter"</string>
- <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
- <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
- <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string>
- <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
<string name="voice_warning_title" msgid="4419354150908395008">"Cumonds vocals"</string>
- <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Cumonds vocals en Vossa lingua na vegnan actualmain betg sustegnids, ma la funcziun è disponibla per englais."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Per deactivar ils cumonds vocals, avri ils parameters da tastatura."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur."</string>
+ <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>
+ <!-- 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>
@@ -95,41 +89,101 @@
<string name="voice_no_match" msgid="4285117547030179174">"Betg chattà correspundenzas"</string>
<string name="voice_not_installed" msgid="5552450909753842415">"Betg installà la tschertga vocala"</string>
<string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Commentari:"</b>" Stritgai cun il det sur la tastatura per discurrer."</string>
- <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Commentari:"</b>" Empruvai la proxima giada d\'agiuntar segns d\'interpuncziun sco \"punct\", \"comma\" u \"segn da dumonda\" cun cumonds vocals."</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754">"\""<b>"Commentari:"</b>" Empruvai la proxima giada d\'agiuntar segns d\'interpuncziun sco \"\"punct\"\", \"\"comma\"\" u \"\"segn da dumonda\"\" cun cumonds vocals.\""</string>
<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>
<string name="language_selection_summary" msgid="187110938289512256">"Stritgar cun il det sur la tasta da vid per midar la lingua"</string>
- <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Tippar danovamain per memorisar"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Tippar danovamain per memorisar"</string>
<string name="has_dictionary" msgid="6071847973466625007">"Dicziunari disponibel"</string>
- <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <string name="prefs_enable_log" msgid="6620424505072963557">"Activar il feedback da l\'utilisader"</string>
+ <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 (5082041365862396329) -->
+ <skip />
+ <string name="keyboard_layout" msgid="437433231038683666">"Design da la tastatura"</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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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 prefs_description_log (5827825607258246003) -->
+ <!-- no translation found for subtype_mode_zh_CN_voice (3154514897179707124) -->
<skip />
- <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
<skip />
- <!-- no translation found for prefs_debug_mode (3889340783846594980) -->
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
<skip />
</resources>
diff --git a/java/res/values-ro/config.xml b/java/res/values-ro/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-ro/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
new file mode 100644
index 000000000..a1b793697
--- /dev/null
+++ b/java/res/values-ro/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Tastatură Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Setările tastaturii Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <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>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Setările sugestiei de cuvinte"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalizare"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"Remedieri rapide"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"Corectează greşelile introduse frecvent"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Sugestii de cuvinte"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Corecţie automată a cuvântului anterior"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: salvat"</string>
+ <string name="label_go_key" msgid="1635148082137219148">"Accesaţi"</string>
+ <string name="label_next_key" msgid="362972844525672568">"Înainte"</string>
+ <string name="label_done_key" msgid="2441578748772529288">"Terminat"</string>
+ <string name="label_send_key" msgid="2815056534433717444">"Trimiteţi"</string>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Intrarea vocală este o funcţie experimentală ce utilizează recunoaşterea vocală în reţea oferită de Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Pentru a dezactiva intrarea vocală, accesaţi setările tastaturii."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"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_listening" msgid="467518160751321844">"Vorbiţi acum"</string>
+ <string name="voice_working" msgid="6666937792815731889">"Se analizează"</string>
+ <string name="voice_initializing" msgid="661962047129906646"></string>
+ <string name="voice_error" msgid="5140896300312186162">"Eroare. Încercaţi din nou."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Conectare imposibilă"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Eroare, discurs prea lung."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Problemă audio"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Eroare de server"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Nu s-a auzit vorbirea"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Nicio potrivire"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Căutarea vocală nu este instalată"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Indiciu:"</b>" glisaţi de-a lungul tastaturii pentru a vorbi"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Indiciu:"</b>" data viitoare, încercaţi să rostiţi şi punctuaţia, cum ar fi „punct”, „virgulă”, sau „semn de întrebare”."</string>
+ <string name="cancel" msgid="6830980399865683324">"Anulaţi"</string>
+ <string name="ok" msgid="7898366843681727667">"OK"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Intrare voce"</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">"Selectaţi limba"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Glisaţi degetul pe bara de spaţiu pentru a schimba limba"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Apăsaţi din nou pentru a salva"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Dicţionar disponibil"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-ru/config.xml b/java/res/values-ru/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-ru/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-ru/donottranslate-altchars.xml b/java/res/values-ru/donottranslate-altchars.xml
index 46241a62a..c4f9d66d3 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_soft_sign">ъ</string>
</resources>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index ae5e3917b..9c070dee0 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Предложение слов"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Автоматически исправлять предыдущее слово"</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">"Биграммные подсказки"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Еще"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Приостановить"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Подождите"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Голосовой ввод"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"В настоящее время функция голосового ввода не поддерживает ваш язык, но вы можете пользоваться ей на английском."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Голосовой ввод – экспериментальная функция на основе технологии сетевого распознавания речи от Google."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Функция голосового ввода отключается в настройках клавиатуры."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Чтобы использовать голосовой ввод, нажмите кнопку микрофона или проведите пальцем по экранной клавиатуре."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовой ввод – экспериментальная функция на основе технологии сетевого распознавания речи от Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Функция голосового ввода отключается в настройках клавиатуры."</string>
+ <!-- outdated translation 6892342981545727994 --> <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 +85,18 @@
<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>
+ <!-- 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 />
<string name="selectInputMethod" msgid="315076553378705821">"Выбрать способ ввода"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string>
<string name="language_selection_summary" msgid="187110938289512256">"Для изменения языка проведите пальцем по пробелу"</string>
@@ -133,8 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Включить отправку сведений"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Помогите усовершенствовать редактор способа ввода, разрешив отправку статистики и отчетов о сбоях в Google."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Исправление нажатием"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Нажмите на слово, чтобы исправить его"</string>
+ <!-- outdated translation 5037231665897435902 --> <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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-sk/config.xml b/java/res/values-sk/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-sk/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
new file mode 100644
index 000000000..df2cc9638
--- /dev/null
+++ b/java/res/values-sk/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Klávesnica Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Nastavenia klávesnice Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <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>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Nastavenia návrhov slov"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Návrhy slov"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Automaticky opraviť predchádzajúce slovo"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Uložené"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup je experimentálna funkcia, ktorá využíva sieťové rozpoznanie reči spoločnosti Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ak chcete vypnúť hlasový vstup, prejdite na nastavenia klávesnice."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ak chcete použiť hlasový vstup, stlačte tlačidlo mikrofónu alebo prejdite prstom po klávesnici na obrazovke."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Chyba. Skúste to znova."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Pripojenie sa nepodarilo."</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Chyba, reč je príliš dlhá."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Problém so zvukom"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Chyba servera"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Nebola zistená žiadna reč."</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Nenašli sa žiadne zhody"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Hlasové vyhľadávanie nie je nainštalované"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Tip:"</b>" Ak chcete aktivovať hlasový vstup, prejdite prstom po klávesnici."</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Tip:"</b>" Nabudúce skúste vysloviť interpunkciu, napríklad „bodka“, „čiarka“ alebo „otáznik“."</string>
+ <string name="cancel" msgid="6830980399865683324">"Zrušiť"</string>
+ <string name="ok" msgid="7898366843681727667">"OK"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Hlasový vstup"</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">"Jazyky vstupu"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Jazyk môžete zmeniť posunutím prsta po medzerníku."</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Uložte slovo opätovným klepnutím"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"K dispozícii je slovník"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-sl/config.xml b/java/res/values-sl/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-sl/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
new file mode 100644
index 000000000..166d8f08f
--- /dev/null
+++ b/java/res/values-sl/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Tipkovnica Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Nastavitve tipkovnice Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibriranje ob pritisku tipke"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"Zvok ob pritisku tipke"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Nastavitve za predlaganje besede"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Samodejne velike začetnice"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"Hitri popravki"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"Popravi pogoste tipkarske napake"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Predlogi besed"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Samodejno popravi prejšnjo besedo"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: shranjeno"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni vnos je poskusna funkcija, ki uporablja Googlovo omrežno prepoznavanje govora."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Če želite izklopiti glasovni vnos, pojdite na nastavitve tipkovnice."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Če želite uporabiti glasovni vnos, pritisnite gumb z mikrofonom ali podrsajte s prstom po zaslonski tipkovnici."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Napaka. Poskusite znova."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Povezava ni mogoča"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Napaka, preveč govora."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Težave z zvokom"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Napaka strežnika"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Govora se ne sliši"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Ni rezultatov"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Glasovno iskanje ni nameščeno"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Nasvet:"</b>" za govorjenje s prstom povlecite po tipkovnici"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Nasvet:"</b>" naslednjič poskusite ločila izgovoriti, npr. »pika«, »vejica« ali »vprašaj«."</string>
+ <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>
+ <!-- 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">"Jeziki vnosa"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Podrsajte s prstom po preslednici, da zamenjate jezik"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Znova tapnite, da shranite"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Slovar je na voljo"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-sr/config.xml b/java/res/values-sr/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-sr/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index 4da1c05b0..343620ee9 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
/*
**
** Copyright 2008, The Android Open Source Project
@@ -16,281 +16,180 @@
** 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">
- <!-- Title for Latin keyboard -->
- <string name="english_ime_name">Андроидова тастатура</string>
- <!-- Title for Latin keyboard settings activity / dialog -->
- <string name="english_ime_settings">Подешавања андроидове тастатуре</string>
-
- <!-- Option to provide vibrate/haptic feedback on keypress -->
- <string name="vibrate_on_keypress">Вибрације при притиску</string>
- <!-- Option to play back sound on keypress in soft keyboard -->
- <string name="sound_on_keypress">Звук при притиску</string>
-
- <!-- Option to enable using nearby keys when correcting/predicting -->
- <string name="hit_correction">Исправљање грешака</string>
-
- <!-- Description for hit_correction -->
- <string name="hit_correction_summary">Исправљање грешака при уносу</string>
-
- <!-- Option to enable using nearby keys when correcting/predicting in landscape-->
- <string name="hit_correction_land">Грешке при водоравној оријентацији</string>
-
- <!-- Description for hit_correction in landscape -->
- <string name="hit_correction_land_summary">Исправљање грешака при уносу при
- водоравном положају</string>
-
- <!-- Option to automatically correct word on hitting space -->
- <string name="auto_correction">Предлози речи</string>
-
- <!-- Description for auto_correction -->
- <string name="auto_correction_summary">Аутоматска исправка претходно унесене речи</string>
-
- <!-- Option to enable text prediction -->
- <string name="prediction">Предлози речи</string>
- <!-- Category title for text prediction -->
- <string name="prediction_category">Подешавања за предлоге речи</string>
- <!-- Description for text prediction -->
- <string name="prediction_summary">Укључи аутоматске наставке при уносу</string>
-
- <!-- Dialog title for auto complete choices -->
- <string name="auto_complete_dialog_title">Аутоматски наставци</string>
-
- <!-- Option to enable text prediction in landscape -->
- <string name="prediction_landscape">Увећан поље за унос текста</string>
- <!-- Description for text prediction -->
- <string name="prediction_landscape_summary">Сакриј предлоге речи при водоравном положају</string>
-
- <!-- Option to enable auto capitalization of sentences -->
- <string name="auto_cap">Аутоматска величина слова</string>
- <!-- Description for auto cap -->
- <string name="auto_cap_summary">Велико слово на почетку реченице</string>
- <!-- Option to enable auto punctuate -->
- <string name="auto_punctuate">Аутоматска интерпункција</string>
- <!-- Description for auto punctuate -->
- <string name="auto_punctuate_summary">Аутоматско постављање интерпункцијских знака при уносу.</string>
-
- <!-- Option to enable quick fixes -->
- <string name="quick_fixes">Брзе исправке</string>
- <!-- Description for quick fixes -->
- <string name="quick_fixes_summary">Аутоматска исправка честих грешака</string>
-
- <!-- Option to enable showing suggestions -->
- <string name="show_suggestions">Приказ предлога</string>
- <!-- Description for show suggestions -->
- <string name="show_suggestions_summary">Приказује предлоге речи током уноса</string>
-
- <!-- Option to enable auto completion -->
- <string name="auto_complete">Аутоматска допуна</string>
- <!-- Description for auto completion -->
- <string name="auto_complete_summary">Размакница и интерпункција аутоматски убацују означену реч.</string>
-
- <!-- Array of prediction modes -->
- <string-array name="prediction_modes">
- <item>Искључено</item>
- <item>Основно</item>
- <item>Напредно</item>
- </string-array>
-
- <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">Дуги притисак на тастере открива проширене знаке (ø, ö, итд.)</string>
- <!-- Tip to dismiss keyboard -->
- <string name="tip_dismiss">Притисните тастер за назад \u21B6 како бисте затворили тастатуру</string>
- <!-- Tip to press ?123 to access numbers and symbols -->
- <string name="tip_access_symbols">Приступ бројевима и симболима</string>
- <!-- Tip to long press on typed word to add to dictionary -->
- <string name="tip_add_to_dictionary">Притисните и држите притиснуту реч са крајње леве стране
- како бисте је додали у речник</string>
-
- <!-- Instruction to touch the bubble to continue -->
- <string name="touch_to_continue">Притисните овај подсетник да наставите »</string>
-
- <!-- Instruction to touch the bubble to start typing -->
- <string name="touch_to_finish">Притисните овде да бисте затворили подсетник и наставили унос!</string>
-
- <!-- Tutorial tip 1 - The keyboard opens any time you touch a text field -->
- <string name="tip_to_open_keyboard"><b>Тастатура се отвара кад год је потребно да унесете текст</b></string>
-
- <!-- Tutorial tip 2 - Touch and hold a key to view accents (examples) -->
- <string name="tip_to_view_accents"><b>Притисните и држите тастер како бисте видели проширене
- знаке\n(„, ‟, итд.)</b>
- </string>
-
- <!-- Tutorial tip 3 - How to switch to number/symbol keyboard -->
- <string name="tip_to_open_symbols"><b>Пребаците се на бројеве и симболе притиском на овај тастер
- </b></string>
-
- <!-- Tutorial tip 4 - How to switch back to alphabet keyboard -->
- <string name="tip_to_close_symbols"><b>Вратите се назад на слова притиском на овај тастер</b></string>
-
- <!-- Tutorial tip 5 - How to launch keyboard settings -->
- <string name="tip_to_launch_settings"><b>Притисните и држите притиснут овај тастер да бисте променили
- подешавања тастатуре, попут аутоматског настављања</b></string>
-
- <!-- Tutorial tip 6 - Done with the tutorial -->
- <string name="tip_to_start_typing"><b>Пробајте сами!</b></string>
-
-
- <!-- Label for soft enter key when it performs GO action. Must be short to fit on key! -->
- <string name="label_go_key">Иди</string>
- <!-- Label for soft enter key when it performs NEXT action. Must be short to fit on key! -->
- <string name="label_next_key">Даље</string>
- <!-- Label for soft enter key when it performs DONE action. Must be short to fit on key! -->
- <string name="label_done_key">Крај</string>
- <!-- Label for soft enter key when it performs SEND action. Must be short to fit on key! -->
- <string name="label_send_key">Шаљи</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">АБВ</string>
- <!-- Label for ALT modifier key. Must be short to fit on key! -->
- <string name="label_alt_key">ALT</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">Говорни унос</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">Говорни унос није тренутно подржан на Вашем језику,
- али ради на енглеском.</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">Говорни унос је експериментална могућност која користи
- Google-ово мрежно препознавање говора.</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">Како бисте искључили говорни унос, изаберите подешавања
- тастатуре.</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">Како бисте укључили говорни унос, притисните дугме са сличицом
- микрофона или превуците прстом преко целе дужине тастатуре.</string>
-
- <!-- Short message to tell the user the system is ready for them to speak. -->
- <string name="voice_listening">Говорите сада</string>
-
- <!-- Short message shown after the user finishes speaking. -->
- <string name="voice_working">Обрада је у току</string>
-
- <!-- Short message shown before the user should speak. -->
- <string name="voice_initializing"></string>
-
- <!-- Short message shown when a generic error occurs. -->
- <string name="voice_error">Грешка. Молимо пробајте поново.</string>
-
- <!-- Short message shown for a network error. -->
- <string name="voice_network_error">Повезивање није успело</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">Грешка, говор је предугачак.</string>
-
- <!-- Short message shown for an audio error. -->
- <string name="voice_audio_error">Проблем са звуком</string>
-
- <!-- Short message shown for an error with the voice server. -->
- <string name="voice_server_error">Грешка на серверу</string>
-
- <!-- Short message shown when no speech is heard. -->
- <string name="voice_speech_timeout">Говор није снимљен</string>
-
- <!-- Short message shown when the server couldn't parse any speech. -->
- <string name="voice_no_match">Нема погодака</string>
-
- <!-- Short message shown when the user initiates voice and voice
- search is not installed. -->
- <string name="voice_not_installed">Говорна претрага није инсталирана</string>
-
- <!-- Short hint shown in candidate view to explain voice input. -->
- <string name="voice_swipe_hint"><b>Савет:</b> Превуците прстом преко тастатуре а онда говорите.</string>
-
- <!-- Short hint shown in candidate view to explain that user can speak punctuation. -->
- <string name="voice_punctuation_hint"><b>Савет:</b> Следећи пут, изговорите назив интерпункције,
- попут „тачка“, „запета“ или „знак питања“.</string>
-
- <!-- Label on button to stop recognition. Must be short to fit on button. -->
- <string name="cancel">Откажи</string>
-
- <!-- Label on button when an error occurs -->
- <string name="ok">У реду</string>
-
- <!-- Preferences item for enabling speech input -->
- <string name="voice_input">Говорни унос</string>
-
- <!-- Array of Voice Input modes -->
- <string-array name="voice_input_modes">
- <item>На главној тастатури</item>
- <item>На симболичкој тастатури</item>
- <item>Искључен</item>
- </string-array>
-
- <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>Микрофон на главној тастатури</item>
- <item>Микрофон на симболичкој тастатури</item>
- <item>Говорни унос је искључен</item>
- </string-array>
-
- <!-- Press the "enter" key after the user speaks. Option on settings.-->
- <string name="auto_submit">Аутоматско слање по говорном уносу</string>
-
- <!-- Press the "enter" key after the user speaks. Summary of option in settings.-->
- <string name="auto_submit_summary">Дугме за претрагу се аутоматски притиска при претрази или преласку
- на следеће поље за унос.</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>Отварање тастатуре\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>Затварање тастатуре\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>Притисните \u0026 и држите пристиснут тастер за опције\n</b></font><font size="3">\n</font>Приступ акцентима и интерпункцији.</string>
-
- <!-- appears above image showing how to access keyboard settings -->
- <string name="keyboard_settings"><font size="17"><b>Подешавање тастатуре\n</b></font><font size="3">\n</font>Притисните \u0026 и држите тастер <b>\?123\</b>.</string>
-
- <!-- popular web domains for the locale - most popular, displayed on the keyboard -->
- <string name="popular_domain_0">".rs"</string>
- <!-- popular web domains for the locale - item 1, displayed in the popup -->
- <string name="popular_domain_1">".com"</string>
- <!-- popular web domains for the locale - item 2, displayed in the popup -->
- <string name="popular_domain_2">".net"</string>
- <!-- popular web domains for the locale - item 3, displayed in the popup -->
- <string name="popular_domain_3">".org"</string>
- <!-- popular web domains for the locale - item 4, displayed in the popup -->
- <string name="popular_domain_4">".edu"</string>
-
- <!-- Title for input language selection screen -->
- <string name="language_selection_title">Језици за унос</string>
- <!-- Title summary for input language selection screen -->
- <string name="language_selection_summary">Превуците прстом по размакници за промену језика</string>
-
- <!-- Add to dictionary hint -->
- <string name="hint_add_to_dictionary">\u2190 Притисните опет да бисте сачували</string>
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Android тастатура"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Подешавања Android тастатуре"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вибрирај на притисак тастера"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"Звук на притисак тастера"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Подешавања за предлагање речи"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Аутоматски унос великих слова"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"Брзе исправке"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"Исправља честе грешке у куцању"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Предлагање речи"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Аутоматско исправљање претходне речи"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Сачувано"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"Гласовни унос"</string>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Гласовни унос тренутно није подржан за ваш језик, али функционише на енглеском."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовни унос је експериментална функција која користи Google-ово мрежно препознавање гласа."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Да бисте искључили гласовни унос, идите на подешавања тастатуре."</string>
+ <!-- outdated translation 6892342981545727994 --> <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>
+ <string name="voice_error" msgid="5140896300312186162">"Грешка. Покушајте поново."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Повезивање није могуће"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Грешка, говорите предуго."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Проблем са звуком"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Грешка сервера"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Не чује се говор"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Нема подударања"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Гласовна претрага није инсталирана"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Савет:"</b>" Превуците прстом преко тастатуре за гласовни унос"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Савет:"</b>" Следећи пут покушајте да изговорите знакове интерпункције као што су „тачка“, „зарез“ или „знак питања“."</string>
+ <string name="cancel" msgid="6830980399865683324">"Откажи"</string>
+ <string name="ok" msgid="7898366843681727667">"Потврди"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Гласовни унос"</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">"Језици за унос"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Превуците прст преко тастера за размак да бисте променили језик"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Додирните поново да бисте сачували"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Речник је доступан"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-sv/config.xml b/java/res/values-sv/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-sv/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-sv/donottranslate-altchars.xml b/java/res/values-sv/donottranslate-altchars.xml
index 4d26e6c47..e156de896 100644
--- a/java/res/values-sv/donottranslate-altchars.xml
+++ b/java/res/values-sv/donottranslate-altchars.xml
@@ -18,21 +18,23 @@
*/
-->
<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_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="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 755ee05db..fb8ee3670 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Ordförslag"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Rätta automatiskt föregående ord"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Mer"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Vänta"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Röstindata"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Röstindata stöds inte på ditt språk än, men tjänsten fungerar på engelska."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Röstinmatning är en funktion på experimentstadiet som använder Googles nätverks taligenkänning."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Om du vill stänga av röstindata öppnar du inställningarna för tangentbordet."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Om du vill använda röstinmatning trycker du på mikrofonknappen eller drar fingret över tangentbordet på skärmen."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Röstinmatning är en funktion på experimentstadiet som använder Googles nätverks taligenkänning."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Om du vill stänga av röstindata öppnar du inställningarna för tangentbordet."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Om du vill använda röstinmatning trycker du på mikrofonknappen eller drar fingret över tangentbordet på skärmen."</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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Aktivera synpunkter från användare"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Du kan hjälpa till att förbättra inmatningsmetoden genom att automatiskt skicka användningsstatistik och felrapporter till Google."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryck om du vill korrigera om ord"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Du kan korrigera om ord genom att trycka på ord som du har skrivit"</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Du kan korrigera om ord genom att trycka på ord som du har skrivit"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-th/config.xml b/java/res/values-th/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-th/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
new file mode 100644
index 000000000..785c532e2
--- /dev/null
+++ b/java/res/values-th/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"แป้นพิมพ์ Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"การตั้งค่าแป้นพิมพ์ Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"สั่นเมื่อกดปุ่ม"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"ส่งเสียงเมื่อกดปุ่ม"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"การตั้งค่าการแนะนำคำ"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"ปรับเป็นตัวพิมพ์ใหญ่อัตโนมัติ"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"แก้ไขด่วน"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"แก้ไขข้อผิดพลาดในการพิมพ์ที่พบบ่อย"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"การแนะนำคำ"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"แก้ไขคำก่อนหน้าอัตโนมัติ"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : บันทึกแล้ว"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"การป้อนข้อมูลด้วยเสียง"</string>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ขณะนี้การป้อนข้อมูลด้วยเสียงยังไม่ได้รับการสนับสนุนในภาษาของคุณ แต่ใช้ได้ในภาษาอังกฤษ"</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"การป้อนข้อมูลด้วยเสียงเป็นคุณลักษณะทดลองที่ใช้การจดจำเสียงที่มีการสร้างเครือข่ายไว้ของ Google"</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"หากต้องการปิดการป้อนข้อมูลด้วยเสียง ไปที่การตั้งค่าแป้นพิมพ์"</string>
+ <!-- outdated translation 6892342981545727994 --> <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>
+ <string name="voice_error" msgid="5140896300312186162">"ข้อผิดพลาด โปรดลองอีกครั้ง"</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"ไม่สามารถเชื่อมต่อได้"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"ข้อผิดพลาด คำพูดยาวเกินไป"</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"ปัญหาด้านเสียง"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"ข้อผิดพลาดของเซิร์ฟเวอร์"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"ไม่ได้ยินเสียง"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"ไม่พบรายการที่ตรงกัน"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"ไม่ได้ติดตั้ง Voice Search"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"คำแนะนำ:"</b>" กวาดผ่านแป้นพิมพ์เพื่อพูด"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"คำแนะนำ:"</b>" ครั้งต่อไป ให้ลองเอ่ยถึงเครื่องหมายวรรคตอน เช่น \"มหัพภาค\" \"จุลภาค\" หรือ \"เครื่องหมายคำถาม\""</string>
+ <string name="cancel" msgid="6830980399865683324">"ยกเลิก"</string>
+ <string name="ok" msgid="7898366843681727667">"ตกลง"</string>
+ <string name="voice_input" msgid="2466640768843347841">"การป้อนข้อมูลด้วยเสียง"</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">"ภาษาในการป้อนข้อมูล"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"เลื่อนนิ้วไปบนแป้นเคาะวรรคเพื่อเปลี่ยนภาษา"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← แตะอีกครั้งเพื่อบันทึก"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"มีพจนานุกรมให้ใช้งาน"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-tl/config.xml b/java/res/values-tl/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-tl/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
new file mode 100644
index 000000000..7fd25cab0
--- /dev/null
+++ b/java/res/values-tl/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Android keyboard"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Mga setting ng Android keyboard"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Mag-vibrate sa keypress"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"Tunog sa keypress"</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Mga setting ng suhestiyon ng salita"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalization"</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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Mga suhestiyon ng salita"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Awtomatikong itama ang nakaraang salita"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Na-save"</string>
+ <string name="label_go_key" msgid="1635148082137219148">"Pumunta"</string>
+ <string name="label_next_key" msgid="362972844525672568">"Susunod"</string>
+ <string name="label_done_key" msgid="2441578748772529288">"Tapos na"</string>
+ <string name="label_send_key" msgid="2815056534433717444">"Ipadala"</string>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ang pag-input ng boses ay isang tampok na pang-eksperimento na gumagamit ng naka-network na pagkilala sa pananalita ng Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Upang i-off ang pag-input ng boses, pumunta sa mga setting ng keyboard."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Upang gumamit ng pag-input ng boses, pindutin ang pindutang microphone o i-slide ang iyong daliri sa screen keyboard."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Error. Pakisubukang muli."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Hindi makakonekta"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Error, masyadong maraming pananalita."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Problema sa audio"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Error sa server"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Walang narinig na pananalita"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Walang nakitang mga tugma"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Hindi naka-install ang paghahanap ng boses"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Pahiwatig:"</b>" Mag-swipe sa keyboard upang magsalita"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Pahiwatig:"</b>" Sa susunod, subukang magsalita ng bantas tulad ng \"tuldok\", \"kuwit\", o \"tandang pananong\"."</string>
+ <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>
+ <!-- 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">"Mag-input ng mga wika"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"I-slide ang daliri sa spacebar upang palitan ang wika"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Tapikin muli upang i-save"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Available ang diksyunaryo"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-tr/config.xml b/java/res/values-tr/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-tr/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-tr/donottranslate-altchars.xml b/java/res/values-tr/donottranslate-altchars.xml
index 4200d949e..5e98cc30e 100644
--- a/java/res/values-tr/donottranslate-altchars.xml
+++ b/java/res/values-tr/donottranslate-altchars.xml
@@ -18,14 +18,8 @@
*/
-->
<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>
+ <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
+</resources>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index 599ddb20a..2cd1f1824 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Kelime önerileri"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Önceki kelimeyi otomatik olarak düzelt"</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">"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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"Diğer"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"Durkl"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"Bekle"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Ses girişi"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Ses girişi, şu anda sizin diliniz için desteklenmiyor ama İngilizce dilinde kullanılabilir."</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ses girişi, Google\'ın ağ bağlantılı ses tanıma işlevini kullanan deneysel bir özelliktir."</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Ses girişini kapatmak için klavye ayarlarına gidin."</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Ses girişini kullanmak için mikrofon düğmesine basın veya parmağınızı dokunmatik klavye üzerinde kaydırın."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ses girişi, Google\'ın ağ bağlantılı ses tanıma işlevini kullanan deneysel bir özelliktir."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ses girişini kapatmak için klavye ayarlarına gidin."</string>
+ <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"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_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 +85,18 @@
<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>
+ <!-- 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 />
<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 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"Kullanıcı geri bildirimini etkinleştir"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"Kullanım istatistiklerini ve kilitlenme raporlarını Google\'a otomatik olarak göndererek bu giriş yöntemi düzenleyicisinin iyileştirilmesine yardımcı olun."</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Kelimeleri düzeltmek için dokunun"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Yazdığınız kelimelere dokunarak kelimelerde düzeltme yapabilirsiniz"</string>
+ <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Yazdığınız kelimelere dokunarak kelimelerde düzeltme yapabilirsiniz"</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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-uk/config.xml b/java/res/values-uk/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-uk/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
new file mode 100644
index 000000000..755ad898c
--- /dev/null
+++ b/java/res/values-uk/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Клавіатура Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Налашт-ня клавіат. Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вібр при натиску клав."</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натиску клав."</string>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Налашт-ня пропозицій слів"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Авто викор. вел. літер"</string>
+ <string name="quick_fixes" msgid="5353213327680897927">"Шв. виправлення"</string>
+ <string name="quick_fixes_summary" msgid="3405028402510332373">"Виправляє поширені помилки"</string>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Пропозиції слів"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Автоматично виправляти попереднє слово"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : збережено"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"Голос. ввід"</string>
+ <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Голос. ввід наразі не підтрим. для вашої мови, але можна користуватися англійською."</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голос. ввід є експеремент. ф-цією, яка викор. мережеве розпізнавання голосу Google."</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Щоб вимкн. голос ввід, йдіть до налашт-нь клавіатури."</string>
+ <!-- outdated translation 6892342981545727994 --> <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>
+ <string name="voice_error" msgid="5140896300312186162">"Помилка. Спробуйте ще раз."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Неможл. під\'єднатися"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Помилка. Забагато продикт."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Проблема з аудіо"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Помилка сервера"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Не чути диктув."</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Збігів не знайдено"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Голос. пошук не встановлено"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Підк:"</b>" горт. на клавіат., щоб продикт."</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Підказка:"</b>" наступного разу продикт. знаки пункт. такі як \"крапка\", \"кома\" чи \"знак пит\"."</string>
+ <string name="cancel" msgid="6830980399865683324">"Скасувати"</string>
+ <string name="ok" msgid="7898366843681727667">"OK"</string>
+ <string name="voice_input" msgid="2466640768843347841">"Голос. ввід"</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">"Мови вводу"</string>
+ <string name="language_selection_summary" msgid="187110938289512256">"Переміст. палець на пробіл, щоб змін. мову"</string>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Натисн. ще, щоб збер."</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Словник доступний"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-vi/config.xml b/java/res/values-vi/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-vi/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
new file mode 100644
index 000000000..1c4cd85e6
--- /dev/null
+++ b/java/res/values-vi/strings.xml
@@ -0,0 +1,195 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_name" msgid="7252517407088836577">"Bàn phím Android"</string>
+ <string name="english_ime_settings" msgid="6661589557206947774">"Cài đặt bàn phím Android"</string>
+ <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+ <skip />
+ <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>
+ <!-- no translation found for popup_on_keypress (123894815723512944) -->
+ <skip />
+ <string name="prediction_category" msgid="7027100625580696660">"Cài đặt đề xuất từ"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"Tự động viết hoa"</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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+ <skip />
+ <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+ <skip />
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Đề xuất từ"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"Tự động sửa từ trước đó"</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 />
+ <!-- no translation found for bigram_suggestion (1323347224043514969) -->
+ <skip />
+ <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+ <skip />
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Đã lưu"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <!-- no translation found for label_more_key (3760239494604948502) -->
+ <skip />
+ <!-- no translation found for label_pause_key (181098308428035340) -->
+ <skip />
+ <!-- no translation found for label_wait_key (6402152600878093134) -->
+ <skip />
+ <string name="voice_warning_title" msgid="4419354150908395008">"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>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"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>
+ <!-- outdated translation 5652369578498701761 --> <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 bàn phím."</string>
+ <!-- outdated translation 6892342981545727994 --> <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ô hoặc trượt ngón tay trên bàn phím ảo."</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>
+ <string name="voice_error" msgid="5140896300312186162">"Lỗi. Vui lòng thử lại."</string>
+ <string name="voice_network_error" msgid="6649556447401862563">"Không thể kết nối"</string>
+ <string name="voice_too_much_speech" msgid="5746973620134227376">"Lỗi, quá nhiều câu thoại."</string>
+ <string name="voice_audio_error" msgid="5072707727016414454">"Sự cố âm thanh"</string>
+ <string name="voice_server_error" msgid="7807129913977261644">"Lỗi máy chủ"</string>
+ <string name="voice_speech_timeout" msgid="8461817525075498795">"Không nghe thấy tiếng nói nào"</string>
+ <string name="voice_no_match" msgid="4285117547030179174">"Không tìm thấy kết quả phù hợp"</string>
+ <string name="voice_not_installed" msgid="5552450909753842415">"Tìm kiếm bằng giọng nói chưa được cài đặt"</string>
+ <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Gợi ý:"</b>" Trượt qua bàn phím để nói"</string>
+ <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Gợi ý:"</b>" Lần tới, thử nói dấu câu như \"dấu chấm\", \"dấu phẩy\" hoặc \"dấu hỏi\"."</string>
+ <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>
+ <!-- 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">"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>
+ <!-- outdated translation 8058519710062071085 --> <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Nhấn lại để lưu"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"Có sẵn từ điển"</string>
+ <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+ <skip />
+ <!-- no translation found for prefs_description_log (5827825607258246003) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+ <skip />
+ <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+ <skip />
+ <!-- no translation found for keyboard_layout (437433231038683666) -->
+ <skip />
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
+</resources>
diff --git a/java/res/values-xlarge-land/dimens.xml b/java/res/values-xlarge-land/dimens.xml
new file mode 100644
index 000000000..625dd263c
--- /dev/null
+++ b/java/res/values-xlarge-land/dimens.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources>
+ <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+ <dimen name="keyboardHeight">58.0mm</dimen>
+ <!-- key_height + key_bottom_gap = popup_key_height -->
+ <!-- <dimen name="key_height">14.5mm</dimen> -->
+ <dimen name="key_bottom_gap">0.0mm</dimen>
+ <dimen name="key_horizontal_gap">0.0mm</dimen>
+ <dimen name="popup_key_height">13.0mm</dimen>
+ <dimen name="keyboard_top_padding">1.1mm</dimen>
+ <dimen name="keyboard_bottom_padding">0.0mm</dimen>
+ <!-- key_height x 1.0 -->
+ <dimen name="key_preview_height">13.0mm</dimen>
+
+ <dimen name="key_letter_size">28dip</dimen>
+ <dimen name="key_label_text_size">20dip</dimen>
+ <!-- left or right padding of label alignment -->
+ <dimen name="key_label_horizontal_alignment_padding">18dip</dimen>
+ <dimen name="candidate_strip_padding">40.0mm</dimen>
+</resources>
diff --git a/java/res/values-xlarge/config.xml b/java/res/values-xlarge/config.xml
new file mode 100644
index 000000000..5b9932b06
--- /dev/null
+++ b/java/res/values-xlarge/config.xml
@@ -0,0 +1,31 @@
+<?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_candidate_highlight_font_color_enabled">false</bool>
+ <bool name="config_sliding_key_input_enabled">false</bool>
+ <!-- Whether or not Popup on key press is enabled by default -->
+ <bool name="config_default_popup_preview">false</bool>
+ <string name="config_text_size_of_language_on_spacebar">medium</string>
+ <integer name="config_max_popup_keyboard_column">9</integer>
+</resources>
diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml
new file mode 100644
index 000000000..2c188bc0c
--- /dev/null
+++ b/java/res/values-xlarge/dimens.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources>
+ <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+ <dimen name="keyboardHeight">48.0mm</dimen>
+ <!-- key_height + key_bottom_gap = popup_key_height -->
+ <!-- <dimen name="key_height">14.5mm</dimen> -->
+ <dimen name="key_bottom_gap">0.0mm</dimen>
+ <dimen name="key_horizontal_gap">0.0mm</dimen>
+ <dimen name="popup_key_height">10.0mm</dimen>
+ <dimen name="keyboard_top_padding">1.1mm</dimen>
+ <dimen name="keyboard_bottom_padding">0.0mm</dimen>
+ <!-- key_height x 1.0 -->
+ <dimen name="key_preview_height">13.0mm</dimen>
+ <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
+ <!-- popup_key_height x 1.2 -->
+ <dimen name="mini_keyboard_slide_allowance">15.6mm</dimen>
+ <!-- popup_key_height x -1.0 -->
+ <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen>
+
+ <dimen name="key_letter_size">26dip</dimen>
+ <dimen name="key_label_text_size">16dip</dimen>
+ <dimen name="key_preview_text_size_large">24dip</dimen>
+ <!-- left or right padding of label alignment -->
+ <dimen name="key_label_horizontal_alignment_padding">6dip</dimen>
+
+ <dimen name="candidate_strip_height">46dip</dimen>
+ <dimen name="candidate_strip_padding">15.0mm</dimen>
+ <dimen name="candidate_min_width">0.3in</dimen>
+ <dimen name="candidate_padding">12dip</dimen>
+ <dimen name="candidate_text_size">22dip</dimen>
+</resources>
diff --git a/java/res/values-zh-rCN/donottranslate-altchars.xml b/java/res/values-xlarge/donottranslate.xml
index c165b11c5..6f4e9b1f0 100644
--- a/java/res/values-zh-rCN/donottranslate-altchars.xml
+++ b/java/res/values-xlarge/donottranslate.xml
@@ -18,13 +18,6 @@
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">èéêë</string>
- <string name="alternates_for_i">ìíîï</string>
- <string name="alternates_for_o">òóôõöœø</string>
- <string name="alternates_for_u">ùúûü</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ</string>
+ <!-- Default value of the visibility of the suggestion strip -->
+ <string name="prefs_suggestion_visibility_default_value" translatable="false">1</string>
</resources>
diff --git a/java/res/values-zh-rCN/config.xml b/java/res/values-zh-rCN/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-zh-rCN/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 7a4bcea0f..e48f63ac6 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"字词建议"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"自动纠正前面的字词"</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">"双连词建议"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"更多"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"暂停"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"等待"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"语音输入"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"语音输入功能当前还不支持您的语言,您只能输入英语语音。"</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"语音输入是一项试验性的功能,它采用了 Google 的网络语音识别功能。"</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"要关闭语音输入功能,请转至键盘设置。"</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"要使用语音输入,请按麦克风按钮或者在屏幕键盘上滑动手指。"</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"语音输入是一项试验性的功能,它采用了 Google 的网络语音识别功能。"</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"要关闭语音输入功能,请转至键盘设置。"</string>
+ <!-- outdated translation 6892342981545727994 --> <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 +85,18 @@
<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>
+ <!-- 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 />
<string name="selectInputMethod" msgid="315076553378705821">"选择输入法"</string>
<string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string>
<string name="language_selection_summary" msgid="187110938289512256">"在空格键上滑动手指可更改语言"</string>
@@ -133,8 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"启用用户反馈"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"自动向 Google 发送使用情况统计信息和崩溃报告,帮助改进该输入法编辑器。"</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"触摸即可更正字词"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"您可以触摸已键入的字词,对其进行更正"</string>
+ <!-- outdated translation 5037231665897435902 --> <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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values-zh-rTW/config.xml b/java/res/values-zh-rTW/config.xml
new file mode 100644
index 000000000..d8fed420a
--- /dev/null
+++ b/java/res/values-zh-rTW/config.xml
@@ -0,0 +1,25 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for auto_correction_threshold_values:1 (162196081188429793) -->
+ <!-- no translation found for auto_correction_threshold_values:2 (861483375701275215) -->
+</resources>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index cbd079633..e16e62ebf 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -26,68 +26,49 @@
<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="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>
+ <!-- no translation found for prefs_show_suggestions (3377105182950417159) -->
+ <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 />
<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) -->
+ <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"字詞建議"</string>
+ <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="2591572172085659910">"自動修正前一個字詞"</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">"雙連詞建議"</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>
+ <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+ <skip />
+ <string name="label_more_key" msgid="3760239494604948502">"更多"</string>
+ <string name="label_pause_key" msgid="181098308428035340">"暫停"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"等候"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"語音輸入"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"語音輸入目前不支援您的語言,但是可以辨識英文。"</string>
- <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"語音輸入這項實驗功能運用了 Google 的網路語音辨識系統。"</string>
- <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"請前往鍵盤設定來關閉語音輸入。"</string>
- <string name="voice_hint_dialog_message" msgid="6892342981545727994">"如要使用語音輸入,按下 [麥克風] 按鈕,或將手指滑過螢幕小鍵盤即可。"</string>
+ <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"語音輸入這項實驗功能運用了 Google 的網路語音辨識系統。"</string>
+ <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"請前往鍵盤設定來關閉語音輸入。"</string>
+ <!-- outdated translation 6892342981545727994 --> <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 +85,18 @@
<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>
+ <!-- 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 />
<string name="selectInputMethod" msgid="315076553378705821">"選取輸入法"</string>
<string name="language_selection_title" msgid="1651299598555326750">"輸入語言"</string>
<string name="language_selection_summary" msgid="187110938289512256">"以手指在空白鍵上滑動可變更語言"</string>
@@ -133,8 +105,74 @@
<string name="prefs_enable_log" msgid="6620424505072963557">"啟用使用者意見回饋"</string>
<string name="prefs_description_log" msgid="5827825607258246003">"自動將使用統計資料和當機報告傳送給 Google,協助改善這個輸入法編輯器。"</string>
<!-- outdated translation 5809974560359283818 --> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"輕觸即可重新修正字詞"</string>
- <!-- outdated translation 5037231665897435902 --> <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"只要輕觸您所輸入的字詞,即可重新予以修正"</string>
+ <!-- outdated translation 5037231665897435902 --> <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>
+ <!-- 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 (2468557777064426976) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_keyboard (2979257184475020604) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+ <skip />
+ <!-- no translation found for subtype_mode_es_US_keyboard (6418688989436457122) -->
+ <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_cs_voice (1136386688120958641) -->
+ <skip />
+ <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_AU_voice (1103892562629586486) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_GB_voice (4327384535900034392) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_IN_voice (4834879535045820293) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_NZ_voice (2739391364469645636) -->
+ <skip />
+ <!-- no translation found for subtype_mode_en_US_voice (1582519352222847297) -->
+ <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_ja_voice (6604859132669646367) -->
+ <skip />
+ <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+ <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_zh_CN_voice (3154514897179707124) -->
+ <skip />
+ <!-- no translation found for subtype_mode_zh_TW_voice (1524137359275360490) -->
+ <skip />
+ <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+ <skip />
</resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 995373e84..9759e0eb6 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -16,7 +16,7 @@
<resources>
- <declare-styleable name="LatinKeyboardBaseView">
+ <declare-styleable name="KeyboardView">
<!-- Default KeyboardView style. -->
<attr name="keyboardViewStyle" format="reference" />
@@ -25,8 +25,8 @@
checkable+checked+pressed. -->
<attr name="keyBackground" format="reference" />
- <!-- Size of the text for character keys. -->
- <attr name="keyTextSize" format="dimension" />
+ <!-- Size of the text for one letter character keys. -->
+ <attr name="keyLetterSize" format="dimension" />
<!-- Size of the text for custom keys with some text and no icon. -->
<attr name="labelTextSize" format="dimension" />
@@ -34,6 +34,9 @@
<!-- Color to use for the label in a key. -->
<attr name="keyTextColor" format="color" />
+ <!-- Color to use for the label in a key when in disabled state. -->
+ <attr name="keyTextColorDisabled" format="color" />
+
<!-- Layout resource for key press feedback.-->
<attr name="keyPreviewLayout" format="reference" />
@@ -56,17 +59,131 @@
<attr name="shadowRadius" format="float" />
<attr name="backgroundDimAmount" format="float" />
- <attr name="keyTextStyle">
- <flag name="normal" value="0" />
- <flag name="bold" value="1" />
- <flag name="italic" value="2" />
+ <attr name="keyLetterStyle">
+ <!-- This should be aligned with Typeface.NORMAL etc. -->
+ <enum name="normal" value="0" />
+ <enum name="bold" value="1" />
+ <enum name="italic" value="2" />
+ <enum name="boldItalic" value="3" />
</attr>
- <attr name="symbolColorScheme">
- <flag name="white" value="0" />
- <flag name="black" value="1" />
+ <attr name="colorScheme">
+ <!-- This should be aligned with KeyboardView.COLOR_SCHEME_* -->
+ <enum name="white" value="0" />
+ <enum name="black" value="1" />
</attr>
</declare-styleable>
+ <declare-styleable name="Keyboard">
+ <!-- Default keyboard height -->
+ <attr name="keyboardHeight" format="dimension" />
+ <!-- Maximum keyboard height, in pixels or percentage of display height -->
+ <attr name="maxKeyboardHeight" format="dimension|fraction" />
+ <!-- Default width of a key, in pixels or percentage of display width. -->
+ <attr name="keyWidth" format="dimension|fraction" />
+ <!-- Default height of a row (key height + vertical gap), in pixels or percentage of
+ keyboard height. -->
+ <attr name="rowHeight" format="dimension|fraction" />
+ <!-- Default horizontal gap between keys. -->
+ <attr name="horizontalGap" format="dimension|fraction" />
+ <!-- Default vertical gap between rows of keys. -->
+ <attr name="verticalGap" format="dimension|fraction" />
+ <!-- Popup keyboard layout template -->
+ <attr name="popupKeyboardTemplate" format="reference" />
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_Key">
+ <!-- The unicode value that this key outputs. -->
+ <attr name="code" format="integer" />
+ <!-- The characters to display in the popup keyboard. -->
+ <attr name="popupCharacters" format="string" />
+ <!-- Maximum column of popup keyboard -->
+ <attr name="maxPopupKeyboardColumn" format="integer" />
+ <!-- Key edge flags. -->
+ <attr name="keyEdgeFlags">
+ <!-- Key is anchored to the left of the keyboard. -->
+ <flag name="left" value="1" />
+ <!-- Key is anchored to the right of the keyboard. -->
+ <flag name="right" value="2" />
+ </attr>
+ <!-- Whether this is a modifier key such as Alt or Shift. -->
+ <attr name="isModifier" format="boolean" />
+ <!-- Whether this is a toggle key. -->
+ <attr name="isSticky" format="boolean" />
+ <!-- Whether long-pressing on this key will make it repeat. -->
+ <attr name="isRepeatable" format="boolean" />
+ <!-- The icon to show in the popup preview. -->
+ <attr name="iconPreview" format="reference" />
+ <!-- The string of characters to output when this key is pressed. -->
+ <attr name="keyOutputText" format="string" />
+ <!-- The label to display on the key. -->
+ <attr name="keyLabel" format="string" />
+ <!-- The key label option -->
+ <attr name="keyLabelOption">
+ <!-- This should be aligned with KeyboardView.KEY_LABEL_OPTION_* -->
+ <flag name="alignLeft" value="1" />
+ <flag name="alignRight" value="2" />
+ <flag name="alignBottom" value="8" />
+ <flag name="fontNormal" value="16" />
+ </attr>
+ <!-- The unicode that this key generates in manual temporary upper case mode. -->
+ <attr name="manualTemporaryUpperCaseCode" format="integer" />
+ <!-- The icon to display on the key instead of the label. -->
+ <attr name="keyIcon" format="reference" />
+ <!-- The hint icon to display on the key in conjunction with the label -->
+ <attr name="keyHintIcon" format="reference" />
+ <!-- The hint icon to display on the key when keyboard is in manual temporary upper case
+ mode. -->
+ <attr name="manualTemporaryUpperCaseHintIcon" format="reference" />
+ <!-- The key style to specify a set of key attributes defined by <key_style/> -->
+ <attr name="keyStyle" format="string" />
+ <!-- Shift key icon for shifted state -->
+ <attr name="shiftedIcon" format="reference" />
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_Row">
+ <!-- Row edge flags. -->
+ <attr name="rowEdgeFlags">
+ <!-- Row is anchored to the top of the keyboard. -->
+ <flag name="top" value="4" />
+ <!-- Row is anchored to the bottom of the keyboard. -->
+ <flag name="bottom" value="8" />
+ </attr>
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_Include">
+ <attr name="keyboardLayout" format="reference" />
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_Case">
+ <!-- This should be aligned with KeyboardId.MODE_* -->
+ <attr name="mode">
+ <enum name="text" value="0" />
+ <enum name="url" value="1" />
+ <enum name="email" value="2" />
+ <enum name="im" value="3" />
+ <enum name="web" value="4" />
+ <enum name="phone" value="5" />
+ </attr>
+ <attr name="hasSettingsKey" format="string" />
+ <attr name="voiceKeyEnabled" format="string" />
+ <attr name="hasVoiceKey" format="string" />
+ <attr name="imeOptions">
+ <!-- This should be aligned with EditorInfo.IME_ACTION_* -->
+ <flag name="actionUnspecified" value="0" />
+ <flag name="actionNone" value="1" />
+ <flag name="actionGo" value="2" />
+ <flag name="actionSearch" value="3" />
+ <flag name="actionSend" value="4" />
+ <flag name="actionNext" value="5" />
+ <flag name="actionDone" value="6" />
+ <flag name="actionPrevious" value="7" />
+ </attr>
+ </declare-styleable>
+
+ <declare-styleable name="Keyboard_KeyStyle">
+ <attr name="styleName" format="string" />
+ <attr name="parentStyle" format="string" />
+ </declare-styleable>
</resources>
diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml
index 5a24e4c60..2a181e17d 100644
--- a/java/res/values/bools.xml
+++ b/java/res/values/bools.xml
@@ -18,16 +18,9 @@
*/
-->
<resources>
- <!-- Whether or not auto-correction should be enabled by default -->
- <bool name="enable_autocorrect">true</bool>
<!-- Whether this input method should be used as the default for a locale. Override it
for latin languages. -->
<bool name="im_is_default">false</bool>
<!-- Whether or not voice input is enabled by default. -->
<bool name="voice_input_default">true</bool>
- <bool name="config_swipeDisambiguation">true</bool>
- <!-- Whether or not Popup on key press is enabled by default -->
- <bool name="default_popup_preview">true</bool>
- <bool name="default_recorrection_enabled">true</bool>
- <bool name="config_long_press_comma_for_settings_enabled">true</bool>
</resources>
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index edb6cd845..122530480 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -19,6 +19,16 @@
-->
<resources>
+ <bool name="config_swipeDisambiguation">true</bool>
+ <bool name="default_recorrection_enabled">true</bool>
+ <bool name="config_long_press_comma_for_settings_enabled">true</bool>
+ <bool name="config_enable_show_settings_key_option">true</bool>
+ <bool name="config_enable_show_subtype_settings">true</bool>
+ <bool name="config_enable_show_voice_key_option">true</bool>
+ <bool name="config_candidate_highlight_font_color_enabled">true</bool>
+ <bool name="config_sliding_key_input_enabled">true</bool>
+ <!-- Whether or not Popup on key press is enabled by default -->
+ <bool name="config_default_popup_preview">true</bool>
<integer name="config_delay_before_preview">0</integer>
<integer name="config_delay_after_preview">10</integer>
<integer name="config_preview_fadein_anim_time">0</integer>
@@ -27,6 +37,22 @@
<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>
+ <string name="config_text_size_of_language_on_spacebar">small</string>
+ <integer name="config_max_popup_keyboard_column">9</integer>
+ <!-- Whether or not auto-correction should be enabled by default -->
+ <bool name="enable_autocorrect">true</bool>
+ <string-array name="auto_correction_threshold_values">
+ <!-- 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..cf2019ff8 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>
<!-- 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">0dip</dimen>
+ <dimen name="candidate_text_size">18dip</dimen>
+ <dimen name="spacebar_vertical_correction">4dip</dimen>
+ <!-- If the screen height in landscape is larger than the below value, then the keyboard
+ will not go into extract (fullscreen) mode. -->
+ <dimen name="max_height_for_fullscreen">2.5in</dimen>
+ <dimen name="bubble_pointer_offset">22dip</dimen>
+
+ <dimen name="key_hysteresis_distance">0.05in</dimen>
</resources>
diff --git a/java/res/values/donottranslate-altchars.xml b/java/res/values/donottranslate-altchars.xml
index bba7282c9..85e06f23b 100644
--- a/java/res/values/donottranslate-altchars.xml
+++ b/java/res/values/donottranslate-altchars.xml
@@ -18,15 +18,15 @@
*/
-->
<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_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_y">ý,ÿ,6</string>
<string name="alternates_for_q">1</string>
<string name="alternates_for_w">2</string>
<string name="alternates_for_d"></string>
@@ -37,10 +37,19 @@
<string name="alternates_for_g"></string>
<string name="alternates_for_p">0</string>
<string name="alternates_for_v"></string>
- <string name="alternates_for_ae"></string>
- <string name="alternates_for_oe"></string>
+ <string name="keylabel_for_scandinavia_row2_10"></string>
+ <string name="keylabel_for_scandinavia_row2_11"></string>
+ <string name="alternates_for_scandinavia_row2_10"></string>
+ <string name="alternates_for_scandinavia_row2_11"></string>
<string name="alternates_for_cyrillic_e"></string>
<string name="alternates_for_cyrillic_soft_sign"></string>
- <string name="alternates_for_a_umlaut"></string>
- <string name="alternates_for_o_umlaut"></string>
+ <string name="alternates_for_mic">"\@drawable/sym_keyboard_settings|\@integer/key_settings,\@drawable/sym_keyboard_mic|\@integer/key_voice"</string>
+ <string name="alternates_for_smiley">":-)|:-) ,:-(|:-( ,;-)|;-) ,:-P|:-P ,=-O|=-O ,:-*|:-* ,:O|:O ,B-)|B-) ,:-$|:-$ ,:-!|:-! ,:-[|:-[ ,O:-)|O:-) ,:-\\\\\\\\|:-\\\\\\\\ ,:\'(|:\'( ,:-D|:-D "</string>
+ <string name="alternates_for_settings_slash">"\@drawable/sym_keyboard_settings|\@integer/key_settings,/"</string>
+ <string name="alternates_for_settings_at">"\@drawable/sym_keyboard_settings|\@integer/key_settings,\@"</string>
+ <string name="alternates_for_settings_comma">"\@drawable/sym_keyboard_settings|\@integer/key_settings,\\,"</string>
+ <string name="alternates_for_punctuation">":,/,&amp;,(,),-,+,;,\@,\',\",\?,!,\\,"</string>
+ <string name="keylabel_for_popular_domain">".com"</string>
+ <!-- popular web domains for the locale - most popular, displayed on the keyboard -->
+ <string name="alternates_for_popular_domain">".net,.org,.gov,.edu"</string>
</resources>
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index 936609924..8dc212279 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -23,13 +23,119 @@
<!-- 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>
</resources>
diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml
index c5d5b3cd1..6c18cb42a 100644
--- a/java/res/values/keycodes.xml
+++ b/java/res/values/keycodes.xml
@@ -19,14 +19,13 @@
-->
<resources>
+ <!-- These code should be aligned with Keyboard.CODE_*. -->
<integer name="key_tab">9</integer>
<integer name="key_return">10</integer>
<integer name="key_space">32</integer>
<integer name="key_shift">-1</integer>
- <integer name="key_symbol">-2</integer>
+ <integer name="key_switch_alpha_symbol">-2</integer>
<integer name="key_delete">-5</integer>
- <!-- Keycode for F1 (function) key. This one switches between language switch & comma/.com -->
<integer name="key_settings">-100</integer>
<integer name="key_voice">-102</integer>
- <integer name="key_f1">-103</integer>
</resources>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 6644d2224..258f7cec5 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -31,151 +31,57 @@
<!-- 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 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>
-
+
<!-- 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 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 insert highlighted word</string>
+ <!-- Option to disable auto correction. [CHAR LIMIT=20] -->
+ <string name="auto_correction_threshold_mode_off">Off</string>
+ <!-- Option to use modest auto correction. [CHAR LIMIT=20] -->
+ <string name="auto_correction_threshold_mode_modest">Modest</string>
+ <!-- Option to use aggressive auto correction. [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 +90,38 @@
<string name="label_done_key">Done</string>
<!-- Label for soft enter key when it performs SEND action. Must be short to fit on key! -->
<string name="label_send_key">Send</string>
- <!-- Label for "switch to symbols" key. Must be short to fit on key! -->
- <string name="label_symbol_key">\?123</string>
- <!-- Label for "switch to numeric" key. Must be short to fit on key! -->
- <string name="label_phone_key">123</string>
<!-- Label for "switch to alphabetic" key. Must be short to fit on key! -->
- <string name="label_alpha_key">ABC</string>
- <!-- Label for ALT modifier key. Must be short to fit on key! -->
- <string name="label_alt_key">ALT</string>
+ <string name="label_to_alpha_key">ABC</string>
+ <!-- Label for Shift modifier key of symbol keyboard. Must be short to fit on key! -->
+ <string name="label_more_key">More</string>
+ <!-- Label for "Pause" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5] -->
+ <string name="label_pause_key">Pause</string>
+ <!-- Label for "Wait" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5]-->
+ <string name="label_wait_key">Wait</string>
<!-- Voice related labels -->
<!-- Title of the warning dialog that shows when a user initiates voice input for
the first time. -->
<string name="voice_warning_title">Voice input</string>
-
+
<!-- Message that gets put at the top of the warning dialog if the user is attempting to use
voice input in a currently unsupported locale. Voice input will work for such a user,
but it will only recognize them in English. -->
<string name="voice_warning_locale_not_supported">Voice input is not currently supported for your language, but does work in English.</string>
-
+
<!-- Message of the warning dialog that shows when a user initiates voice input for
the first time, or turns it on in settings. -->
- <string name="voice_warning_may_not_understand">Voice input is an experimental feature using Google\'s networked speech recognition.</string>
-
+ <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>
-
+ <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"). -->
+ <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 +136,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 +153,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,62 +171,20 @@
<!-- 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>
+ <!-- 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>
<!-- Menu item for launching Input method picker -->
<string name="selectInputMethod">Select input method</string>
@@ -330,10 +193,10 @@
<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>
@@ -344,36 +207,46 @@
<!-- Preferences item for enabling to correct suggestions by touching words you have typed -->
<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>
+ <string name="prefs_enable_recorrection_summary">Touch entered words to correct them, only when suggestions are visible</string>
<!-- Description for keyboard theme switcher -->
<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>
+
+ <string name="subtype_mode_cs_keyboard">Czech Keyboard</string>
+ <string name="subtype_mode_da_keyboard">Danish Keyboard</string>
+ <string name="subtype_mode_de_keyboard">German Keyboard</string>
+ <string name="subtype_mode_en_GB_keyboard">English (UK) Keyboard</string>
+ <string name="subtype_mode_en_US_keyboard">English (US) Keyboard</string>
+ <string name="subtype_mode_es_keyboard">Spanish Keyboard</string>
+ <string name="subtype_mode_es_US_keyboard">Spanish (US) Keyboard</string>
+ <string name="subtype_mode_fr_keyboard">French Keyboard</string>
+ <string name="subtype_mode_fr_CA_keyboard">French (Canada) Keyboard</string>
+ <string name="subtype_mode_fr_CH_keyboard">French (Switzerland) Keyboard</string>
+ <string name="subtype_mode_it_keyboard">Italian Keyboard</string>
+ <string name="subtype_mode_nb_keyboard">Norwegian Keyboard</string>
+ <string name="subtype_mode_nl_keyboard">Dutch Keyboard</string>
+ <string name="subtype_mode_ru_keyboard">Russian Keyboard</string>
+ <string name="subtype_mode_sr_keyboard">Serbian Keyboard</string>
+ <string name="subtype_mode_sv_keyboard">Swedish Keyboard</string>
+
+ <string name="subtype_mode_cs_voice">Czech Voice</string>
+ <string name="subtype_mode_de_voice">German Voice</string>
+ <string name="subtype_mode_en_AU_voice">English (Australia) Voice</string>
+ <string name="subtype_mode_en_GB_voice">English (UK) Voice</string>
+ <string name="subtype_mode_en_IN_voice">English (India) Voice</string>
+ <string name="subtype_mode_en_NZ_voice">English (New Zealand) Voice</string>
+ <string name="subtype_mode_en_US_voice">English (US) Voice</string>
+ <string name="subtype_mode_es_voice">Spanish Voice</string>
+ <string name="subtype_mode_fr_voice">French Voice</string>
+ <string name="subtype_mode_ja_voice">Japanese Voice</string>
+ <string name="subtype_mode_ko_voice">Korean Voice</string>
+ <string name="subtype_mode_pl_voice">Polish Voice</string>
+ <string name="subtype_mode_pt_voice">Portuguese Voice</string>
+ <string name="subtype_mode_ru_voice">Russian Voice</string>
+ <string name="subtype_mode_tr_voice">Turkish Voice</string>
+ <string name="subtype_mode_zh_CN_voice">Chinese (China, Simplified) Voice</string>
+ <string name="subtype_mode_zh_TW_voice">Chinese (Taiwan, Traditional) 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-el/donottranslate-altchars.xml b/java/res/xml-da-xlarge/kbd_qwerty.xml
index d3beafade..aa868e453 100644
--- a/java/res/values-el/donottranslate-altchars.xml
+++ b/java/res/xml-da-xlarge/kbd_qwerty.xml
@@ -17,14 +17,23 @@
** 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>
+
+<!--
+ Danish Keyboard Layout
+
+ Just a copy of the Norwegian layout, with æ/ø switched.
+-->
+
+<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-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml
index b7b1b1769..dfca1cdd2 100644
--- a/java/res/xml-da/kbd_qwerty.xml
+++ b/java/res/xml-da/kbd_qwerty.xml
@@ -25,512 +25,16 @@
-->
<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:keyWidth="9.09%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/values-ja/donottranslate-altchars.xml b/java/res/xml-de-xlarge/kbd_qwerty.xml
index d3beafade..a23e4fbf0 100644
--- a/java/res/values-ja/donottranslate-altchars.xml
+++ b/java/res/xml-de-xlarge/kbd_qwerty.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -17,14 +17,18 @@
** 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>
+
+<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-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/values-ko/donottranslate-altchars.xml b/java/res/xml-fr-rCA-xlarge/kbd_qwerty.xml
index d3beafade..92d92f0e6 100644
--- a/java/res/values-ko/donottranslate-altchars.xml
+++ b/java/res/xml-fr-rCA-xlarge/kbd_qwerty.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -17,14 +17,18 @@
** 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>
+
+<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-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-xlarge/kbd_qwerty.xml b/java/res/xml-fr-rCH-xlarge/kbd_qwerty.xml
new file mode 100644
index 000000000..a23e4fbf0
--- /dev/null
+++ b/java/res/xml-fr-rCH-xlarge/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-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-xlarge/kbd_qwerty.xml b/java/res/xml-fr-xlarge/kbd_qwerty.xml
new file mode 100644
index 000000000..2d0b42baf
--- /dev/null
+++ b/java/res/xml-fr-xlarge/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_azerty_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-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml
index 5d8338ae8..98bfd7e0b 100644
--- a/java/res/xml-iw/kbd_qwerty.xml
+++ b/java/res/xml-iw/kbd_qwerty.xml
@@ -19,456 +19,94 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
+ <Spacer
+ latin:horizontalGap="5%p" />
<Key
- android:keyLabel="ק"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="ק"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="ר" />
+ latin:keyLabel="ר" />
<Key
- android:keyLabel="א" />
+ latin:keyLabel="א" />
<Key
- android:keyLabel="ט" />
+ latin:keyLabel="ט" />
<Key
- android:keyLabel="ו" />
+ latin:keyLabel="ו" />
<Key
- android:keyLabel="ן" />
+ latin:keyLabel="ן" />
<Key
- android:keyLabel="ם" />
+ latin:keyLabel="ם" />
<Key
- android:keyLabel="פ" />
+ latin:keyLabel="פ" />
+ <Spacer
+ latin:horizontalGap="1.25%p" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="13.75%p"
- android:isModifier="true"
- android:horizontalGap="1.25%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="13.75%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:keyLabel="ש"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="ש"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="ד" />
+ latin:keyLabel="ד" />
<Key
- android:keyLabel="ג" />
+ latin:keyLabel="ג" />
<Key
- android:keyLabel="כ" />
+ latin:keyLabel="כ" />
<Key
- android:keyLabel="ע" />
+ latin:keyLabel="ע" />
<Key
- android:keyLabel="י" />
+ latin:keyLabel="י" />
<Key
- android:keyLabel="ח" />
+ latin:keyLabel="ח" />
<Key
- android:keyLabel="ל" />
+ latin:keyLabel="ל" />
<Key
- android:keyLabel="ך" />
+ latin:keyLabel="ך" />
<Key
- android:keyLabel="ף"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="ף"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
+ <Spacer
+ latin:horizontalGap="5%p" />
<Key
- android:keyLabel="ז"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="ז"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="ס" />
+ latin:keyLabel="ס" />
<Key
- android:keyLabel="ב" />
+ latin:keyLabel="ב" />
<Key
- android:keyLabel="ה" />
+ latin:keyLabel="ה" />
<Key
- android:keyLabel="נ" />
+ latin:keyLabel="נ" />
<Key
- android:keyLabel="מ" />
+ latin:keyLabel="מ" />
<Key
- android:keyLabel="צ" />
+ latin:keyLabel="צ" />
<Key
- android:keyLabel="ת" />
+ latin:keyLabel="ת" />
<Key
- android:keyLabel="ץ"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="ץ"
+ latin:keyEdgeFlags="right" />
</Row>
+ <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
</Keyboard>
diff --git a/java/res/xml-iw/kbd_qwerty_black.xml b/java/res/xml-iw/kbd_qwerty_black.xml
deleted file mode 100644
index eee6dc158..000000000
--- a/java/res/xml-iw/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,416 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="ק"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ר" />
- <Key
- android:keyLabel="א" />
- <Key
- android:keyLabel="ט" />
- <Key
- android:keyLabel="ו" />
- <Key
- android:keyLabel="ן" />
- <Key
- android:keyLabel="ם" />
- <Key
- android:keyLabel="פ" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="13.75%p"
- android:horizontalGap="1.25%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="ש"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ד" />
- <Key
- android:keyLabel="ג" />
- <Key
- android:keyLabel="כ" />
- <Key
- android:keyLabel="ע" />
- <Key
- android:keyLabel="י" />
- <Key
- android:keyLabel="ח" />
- <Key
- android:keyLabel="ל" />
- <Key
- android:keyLabel="ך" />
- <Key
- android:keyLabel="ף"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="ז"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="ס" />
- <Key
- android:keyLabel="ב" />
- <Key
- android:keyLabel="ה" />
- <Key
- android:keyLabel="נ" />
- <Key
- android:keyLabel="מ" />
- <Key
- android:keyLabel="צ" />
- <Key
- android:keyLabel="ת" />
- <Key
- android:keyLabel="ץ"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/values-es-rUS/donottranslate-altchars.xml b/java/res/xml-nb-xlarge/kbd_qwerty.xml
index d3beafade..5dfdc4f56 100644
--- a/java/res/values-es-rUS/donottranslate-altchars.xml
+++ b/java/res/xml-nb-xlarge/kbd_qwerty.xml
@@ -17,14 +17,23 @@
** 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>
+
+<!--
+ Norwegian Keyboard Layout
+
+ Just a copy of the Swedish layout, with ä/æ and ö/ø switched.
+-->
+
+<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-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml
index 14071d770..06f1b947a 100644
--- a/java/res/xml-nb/kbd_qwerty.xml
+++ b/java/res/xml-nb/kbd_qwerty.xml
@@ -25,512 +25,16 @@
-->
<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:keyWidth="9.09%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-xlarge/kbd_qwerty.xml b/java/res/xml-ru-xlarge/kbd_qwerty.xml
new file mode 100644
index 000000000..b86002a31
--- /dev/null
+++ b/java/res/xml-ru-xlarge/kbd_qwerty.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.
+*/
+-->
+
+<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="9.091%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="7.520%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="й"
+ latin:popupCharacters="1" />
+ <Key
+ latin:keyLabel="ц"
+ latin:popupCharacters="2" />
+ <Key
+ latin:keyLabel="у"
+ latin:popupCharacters="3" />
+ <Key
+ latin:keyLabel="к"
+ latin:popupCharacters="4" />
+ <Key
+ latin:keyLabel="е"
+ latin:popupCharacters="@string/alternates_for_cyrillic_e" />
+ <Key
+ latin:keyLabel="н"
+ latin:popupCharacters="6" />
+ <Key
+ latin:keyLabel="г"
+ latin:popupCharacters="7" />
+ <Key
+ latin:keyLabel="ш"
+ latin:popupCharacters="8" />
+ <Key
+ latin:keyLabel="щ"
+ latin:popupCharacters="9" />
+ <Key
+ latin:keyLabel="з"
+ latin:popupCharacters="0" />
+ <Key
+ latin:keyLabel="х" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="ф" />
+ <Key
+ latin:keyLabel="ы" />
+ <Key
+ latin:keyLabel="в" />
+ <Key
+ latin:keyLabel="а" />
+ <Key
+ latin:keyLabel="п" />
+ <Key
+ latin:keyLabel="р" />
+ <Key
+ latin:keyLabel="о" />
+ <Key
+ latin:keyLabel="л" />
+ <Key
+ latin:keyLabel="д" />
+ <Key
+ latin:keyLabel="ж" />
+ <Key
+ latin:keyLabel="э" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="я" />
+ <Key
+ latin:keyLabel="ч" />
+ <Key
+ latin:keyLabel="с" />
+ <Key
+ latin:keyLabel="м" />
+ <Key
+ latin:keyLabel="и" />
+ <Key
+ latin:keyLabel="т" />
+ <Key
+ latin:keyLabel="ь"
+ latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
+ <Key
+ latin:keyLabel="б" />
+ <Key
+ latin:keyLabel="ю" />
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</Keyboard>
diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml
index c0b98bafa..08d7a4ac5 100644
--- a/java/res/xml-ru/kbd_qwerty.xml
+++ b/java/res/xml-ru/kbd_qwerty.xml
@@ -19,496 +19,127 @@
-->
<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:keyWidth="9.091%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:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="1"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="й"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="1"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="ц"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="2" />
+ latin:keyLabel="ц"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="2" />
<Key
- android:keyLabel="у"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="3" />
+ latin:keyLabel="у"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="3" />
<Key
- android:keyLabel="к"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="4" />
+ latin:keyLabel="к"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="4" />
<Key
- android:keyLabel="е"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_cyrillic_e" />
+ latin:keyLabel="е"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_cyrillic_e" />
<Key
- android:keyLabel="н"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="6" />
+ latin:keyLabel="н"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="6" />
<Key
- android:keyLabel="г"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="7" />
+ latin:keyLabel="г"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="7" />
<Key
- android:keyLabel="ш"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="8" />
+ latin:keyLabel="ш"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="8" />
<Key
- android:keyLabel="щ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="9" />
+ latin:keyLabel="щ"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="9" />
<Key
- android:keyLabel="з"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="0" />
+ latin:keyLabel="з"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="0" />
<Key
- android:keyLabel="х"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="х"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:keyLabel="ф"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="ф"
+ latin:keyWidth="8.75%p"
+ 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="ж" />
+ latin:keyLabel="ж" />
<Key
- android:keyLabel="э"
- android:keyWidth="8.75%p"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="э"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row
- android:keyWidth="8.5%p"
+ latin: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" />
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="11.75%p"
+ 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="ь"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
+ latin:keyLabel="ь"
+ latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
<Key
- android:keyLabel="б" />
+ latin:keyLabel="б" />
<Key
- android:keyLabel="ю" />
+ latin: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" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="11.75%p"
+ latin:keyEdgeFlags="right" />
</Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
</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-xlarge/kbd_qwerty.xml b/java/res/xml-sr-xlarge/kbd_qwerty.xml
new file mode 100644
index 000000000..48764e7c7
--- /dev/null
+++ b/java/res/xml-sr-xlarge/kbd_qwerty.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- Serbian keyboard layout, based on the X11 layout for Serbian -->
+<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="9.09%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="7.520%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="љ"
+ latin:popupCharacters="1" />
+ <Key
+ latin:keyLabel="њ"
+ latin:popupCharacters="2" />
+ <Key
+ latin:keyLabel="е"
+ latin:popupCharacters="3" />
+ <Key
+ latin:keyLabel="р"
+ latin:popupCharacters="4" />
+ <Key
+ latin:keyLabel="т"
+ latin:popupCharacters="5" />
+ <Key
+ latin:keyLabel="з"
+ latin:popupCharacters="6" />
+ <Key
+ latin:keyLabel="у"
+ latin:popupCharacters="7" />
+ <Key
+ latin:keyLabel="и"
+ latin:popupCharacters="8" />
+ <Key
+ latin:keyLabel="о"
+ latin:popupCharacters="9" />
+ <Key
+ latin:keyLabel="п"
+ latin:popupCharacters="0" />
+ <Key
+ latin:keyLabel="ш" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="а" />
+ <Key
+ latin:keyLabel="с" />
+ <Key
+ latin:keyLabel="д" />
+ <Key
+ latin:keyLabel="ф" />
+ <Key
+ latin:keyLabel="г" />
+ <Key
+ latin:keyLabel="х" />
+ <Key
+ latin:keyLabel="ј" />
+ <Key
+ latin:keyLabel="к" />
+ <Key
+ latin:keyLabel="л" />
+ <Key
+ latin:keyLabel="ч" />
+ <Key
+ latin:keyLabel="ћ" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.400%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="ђ" />
+ <Key
+ latin:keyLabel="ж" />
+ <Key
+ latin:keyLabel="џ" />
+ <Key
+ latin:keyLabel="ц" />
+ <Key
+ latin:keyLabel="в" />
+ <Key
+ latin:keyLabel="б" />
+ <Key
+ latin:keyLabel="н" />
+ <Key
+ latin:keyLabel="м" />
+ <Key
+ latin:keyLabel=","
+ latin:manualTemporaryUpperCaseCode="33"
+ latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+ latin:popupCharacters="!" />
+ <Key
+ latin:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="63"
+ latin:keyHintIcon="@drawable/key_hint_question_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+ latin:popupCharacters="\?" />
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.400%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</Keyboard>
diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml
index 464c74f40..0e5f5ff79 100644
--- a/java/res/xml-sr/kbd_qwerty.xml
+++ b/java/res/xml-sr/kbd_qwerty.xml
@@ -20,488 +20,122 @@
<!-- 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:keyWidth="9.09%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:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="1"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="љ"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="1"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="њ"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="2" />
+ latin:keyLabel="њ"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="2" />
<Key
- android:keyLabel="е"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="3" />
+ latin:keyLabel="е"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="3" />
<Key
- android:keyLabel="р"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="4" />
+ latin:keyLabel="р"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="4" />
<Key
- android:keyLabel="т"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="5" />
+ latin:keyLabel="т"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="5" />
<Key
- android:keyLabel="з"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="6" />
+ latin:keyLabel="з"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="6" />
<Key
- android:keyLabel="у"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="7" />
+ latin:keyLabel="у"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="7" />
<Key
- android:keyLabel="и"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="8" />
+ latin:keyLabel="и"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="8" />
<Key
- android:keyLabel="о"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="9" />
+ latin:keyLabel="о"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="9" />
<Key
- android:keyLabel="п"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="0" />
+ latin:keyLabel="п"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin: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" />
+ latin:keyLabel="ш"
+ latin:keyEdgeFlags="right" />
</Row>
<Row
- android:keyWidth="8.5%p"
+ latin:keyWidth="8.333%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" />
+ 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: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"
- >
+ latin:keyLabel="л" />
<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"
- >
+ latin:keyLabel="ч" />
<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"
- >
+ latin:keyLabel="ћ" />
<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" />
+ latin:keyLabel="ђ"
+ latin:keyEdgeFlags="right" />
</Row>
<Row
- android:keyboardMode="@+id/mode_im"
- android:keyWidth="10%p"
- android:rowEdgeFlags="bottom"
+ latin:keyWidth="8.5%p"
>
<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"
- >
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="11.75%p"
+ latin:keyEdgeFlags="left" />
<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"
- >
+ latin:keyLabel="ж" />
<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"
- >
+ latin:keyLabel="џ" />
<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"
- >
+ latin:keyLabel="ц" />
<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"
- >
+ latin:keyLabel="в" />
<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"
- >
+ latin:keyLabel="б" />
+ <Key
+ latin:keyLabel="н" />
+ <Key
+ latin:keyLabel="м" />
<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:keyStyle="deleteKeyStyle"
+ latin:keyWidth="11.75%p"
+ latin:keyEdgeFlags="right" />
</Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
</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-xlarge/kbd_qwerty.xml b/java/res/xml-sv-xlarge/kbd_qwerty.xml
new file mode 100644
index 000000000..bbb38585e
--- /dev/null
+++ b/java/res/xml-sv-xlarge/kbd_qwerty.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.
+*/
+-->
+
+<!--
+ Swedish Keyboard Layout
+
+ Key positioning: Svensk standard SS 66 22 41
+ Foreign letters: Svenska skrivregler (2:a uppl.) §302
+ Local additions: ۧ
+-->
+
+<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-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml
index 0fc80a341..60d3b45f9 100644
--- a/java/res/xml-sv/kbd_qwerty.xml
+++ b/java/res/xml-sv/kbd_qwerty.xml
@@ -27,511 +27,16 @@
-->
<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:keyWidth="9.09%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-xlarge-land/kbd_popup_template.xml b/java/res/xml-xlarge-land/kbd_popup_template.xml
new file mode 100644
index 000000000..3caae1a60
--- /dev/null
+++ b/java/res/xml-xlarge-land/kbd_popup_template.xml
@@ -0,0 +1,27 @@
+<?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:keyWidth="3.5%p"
+ latin:horizontalGap="0px"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
+ >
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_azerty_rows.xml b/java/res/xml-xlarge/kbd_azerty_rows.xml
new file mode 100644
index 000000000..616295065
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_azerty_rows.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a" />
+ <Key
+ latin:keyLabel="z"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="e"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.157%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="10.167%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyLabel="m"
+ latin:keyEdgeFlags="right" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="8.593%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="\'"
+ latin:manualTemporaryUpperCaseCode="58"
+ latin:keyHintIcon="@drawable/key_hint_colon_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
+ latin:popupCharacters=":" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:manualTemporaryUpperCaseCode="33"
+ latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+ latin:popupCharacters="!" />
+ <Key
+ latin:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="63"
+ latin:keyHintIcon="@drawable/key_hint_question_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+ latin:popupCharacters="\?" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_key_styles.xml b/java/res/xml-xlarge/kbd_key_styles.xml
new file mode 100644
index 000000000..eb3758024
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_key_styles.xml
@@ -0,0 +1,160 @@
+<?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:keyIcon="@drawable/sym_keyboard_space_holo"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ <key-style
+ latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_keyboard_space_holo"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ <key-style
+ latin:styleName="smileyKeyStyle"
+ latin:keyIcon="@drawable/sym_keyboard_smiley_holo"
+ 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_mic"
+ 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:keyIcon="@drawable/sym_bkeyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ <key-style
+ latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_bkeyboard_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="functionalKeyStyle" />
+ </case>
+ </switch>
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyLabel="@string/label_tab_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="toAlphaKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_alpha_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="moreKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyLabel="@string/label_more_key"
+ latin:keyLabelOption="fontNormal"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="comKeyStyle"
+ latin:keyLabel="@string/keylabel_for_popular_domain"
+ latin:keyLabelOption="fontNormal"
+ latin:keyOutputText="@string/keylabel_for_popular_domain"
+ latin:keyHintIcon="@drawable/hint_popup_holo"
+ latin:popupCharacters="@string/alternates_for_popular_domain" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_number.xml b/java/res/xml-xlarge/kbd_number.xml
new file mode 100644
index 000000000..93bc1363a
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_number.xml
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="11.949%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyEdgeFlags="left" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="-"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel="+"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel="."
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="1" />
+ <Key
+ latin:keyLabel="2" />
+ <Key
+ latin:keyLabel="3" />
+ <Spacer
+ latin:horizontalGap="9.360%p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.804%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Spacer
+ latin:horizontalGap="16.406%p" />
+ <Key
+ latin:keyLabel="*"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel="/"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel=","
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="4" />
+ <Key
+ latin:keyLabel="5" />
+ <Key
+ latin:keyLabel="6" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="14.706%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <!-- There is an empty area bellow the "More" key and left of the "(" key. To ignore
+ the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="16.406%p" />
+ <Key
+ latin:keyLabel="("
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel=")"
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:keyLabel="="
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="7" />
+ <Key
+ latin:keyLabel="8" />
+ <Key
+ latin:keyLabel="9" />
+ <!-- There is an empty area bellow the "Enter" key and right of the "9" key. To ignore
+ the touch event on the area, "9" is intentionally not marked as a right edge key. -->
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore
+ the touch event on the area, "space" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="16.406%p" />
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyWidth="24.127%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyLabel="*" />
+ <Key
+ latin:keyLabel="0" />
+ <Key
+ latin:keyLabel="#" />
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyWidth="8.042%p" />
+ <!-- There is an empty area bellow the "Enter" key and right of the "#" key. To ignore
+ the touch event on the area, "#" is intentionally not marked as a right edge key. -->
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_numkey_styles.xml b/java/res/xml-xlarge/kbd_numkey_styles.xml
new file mode 100644
index 000000000..3c62cb017
--- /dev/null
+++ b/java/res/xml-xlarge/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_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_holo"
+ 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-xlarge/kbd_phone.xml b/java/res/xml-xlarge/kbd_phone.xml
new file mode 100644
index 000000000..45c298362
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_phone.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="11.949%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_numkey_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyEdgeFlags="left" />
+ <!-- To match one character label size with "Tab", I placed spaces around the char '-'
+ and '+'. -->
+ <Spacer
+ latin:horizontalGap="8.470%p" />
+ <Key
+ latin:code="45"
+ latin:keyLabel=" - "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="43"
+ latin:keyLabel=" + "
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="8.479%p" />
+ <Key
+ latin:keyStyle="num1KeyStyle" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Spacer
+ latin:horizontalGap="9.360%p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.804%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyEdgeFlags="left" />
+ <!-- To match one character label size with "More", I placed spaces around the char ','
+ and '.'. -->
+ <Spacer
+ latin:horizontalGap="8.470%p" />
+ <Key
+ latin:code="44"
+ latin:keyLabel=" , "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="46"
+ latin:keyLabel=" . "
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="8.479%p" />
+ <Key
+ latin:keyStyle="num4KeyStyle" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="14.706%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <!-- To match one character label size with "More", I placed spaces around the char '('
+ and ')'. -->
+ <!-- There is an empty area bellow the "More" key and left of the "(" key. To ignore
+ the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="20.427%p" />
+ <Key
+ latin:code="40"
+ latin:keyLabel=" ( "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="41"
+ latin:keyLabel=" ) "
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="8.479%p" />
+ <Key
+ latin:keyStyle="num7KeyStyle" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ <!-- There is an empty area bellow the "Enter" key and right of the "9" key. To ignore
+ the touch event on the area, "9" is intentionally not marked as a right edge key. -->
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore
+ the touch event on the area, "space" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="20.427%p" />
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyWidth="16.085%p" />
+ <Spacer
+ latin:horizontalGap="8.479%p" />
+ <Key
+ latin:keyStyle="numStarKeyStyle" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Key
+ latin:keyStyle="numPoundKeyStyle" />
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyWidth="8.042%p" />
+ <!-- There is an empty area bellow the "Enter" key and right of the "#" key. To ignore
+ the touch event on the area, "#" is intentionally not marked as a right edge key. -->
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_phone_symbols.xml b/java/res/xml-xlarge/kbd_phone_symbols.xml
new file mode 100644
index 000000000..891ceacbe
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_phone_symbols.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="11.949%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_numkey_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row>
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyEdgeFlags="left" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:code="45"
+ latin:keyLabel=" - "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="43"
+ latin:keyLabel=" + "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="44"
+ latin:keyLabel="@string/label_pause_key"
+ latin:keyWidth="8.042%p" />
+ <!-- To match one character label size with "Tab" and "Pause, I placed spaces around the
+ char '-' and '+'. -->
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="num1KeyStyle" />
+ <Key
+ latin:keyStyle="num2KeyStyle" />
+ <Key
+ latin:keyStyle="num3KeyStyle" />
+ <Spacer
+ latin:horizontalGap="9.360%p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.804%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyEdgeFlags="left" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:code="44"
+ latin:keyLabel=" , "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="46"
+ latin:keyLabel=" . "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="59"
+ latin:keyLabel="@string/label_wait_key"
+ latin:keyWidth="8.042%p" />
+ <!-- To match one character label size with "More" and "Wait", I placed spaces around the
+ char ',' and '.'. -->
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="num4KeyStyle" />
+ <Key
+ latin:keyStyle="num5KeyStyle" />
+ <Key
+ latin:keyStyle="num6KeyStyle" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="14.706%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <!-- To match one character label size with "More" and etc., I placed spaces around the
+ char 'N', '(' and ')'. -->
+ <!-- There is an empty area bellow the "More" key and left of the "(" key. To ignore
+ the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="16.406%p" />
+ <Key
+ latin:code="40"
+ latin:keyLabel=" ( "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="41"
+ latin:keyLabel=" ) "
+ latin:keyWidth="8.042%p" />
+ <Key
+ latin:code="78"
+ latin:keyLabel=" N "
+ latin:keyWidth="8.042%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="num7KeyStyle" />
+ <Key
+ latin:keyStyle="num8KeyStyle" />
+ <Key
+ latin:keyStyle="num9KeyStyle" />
+ <!-- There is an empty area bellow the "Enter" key and right of the "9" key. To ignore
+ the touch event on the area, "9" is intentionally not marked as a right edge key. -->
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row>
+ <!-- There is an empty area bellow the "More" key and left of the "space" key. To ignore
+ the touch event on the area, "space" is intentionally not marked as a left edge key. -->
+ <Spacer
+ latin:horizontalGap="16.406%p" />
+ <Key
+ latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+ latin:keyWidth="24.127%p" />
+ <Spacer
+ latin:horizontalGap="4.458%p" />
+ <Key
+ latin:keyStyle="numStarKeyStyle" />
+ <Key
+ latin:keyStyle="num0KeyStyle" />
+ <Key
+ latin:keyStyle="numPoundKeyStyle" />
+ <Key
+ latin:keyStyle="micKeyStyle"
+ latin:keyWidth="8.042%p" />
+ <!-- There is an empty area bellow the "Enter" key and right of the "#" key. To ignore
+ the touch event on the area, "#" is intentionally not marked as a right edge key. -->
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_popup_template.xml b/java/res/xml-xlarge/kbd_popup_template.xml
new file mode 100644
index 000000000..7d39d1a3a
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_popup_template.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyWidth="5.0%p"
+ latin:horizontalGap="0px"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
+ >
+</Keyboard>
diff --git a/java/res/values-zh-rTW/donottranslate-altchars.xml b/java/res/xml-xlarge/kbd_qwerty.xml
index c165b11c5..1c8d51ffe 100644
--- a/java/res/values-zh-rTW/donottranslate-altchars.xml
+++ b/java/res/xml-xlarge/kbd_qwerty.xml
@@ -17,14 +17,17 @@
** limitations under the License.
*/
-->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="alternates_for_a">àáâãäåæ</string>
- <string name="alternates_for_e">èéêë</string>
- <string name="alternates_for_i">ìíîï</string>
- <string name="alternates_for_o">òóôõöœø</string>
- <string name="alternates_for_u">ùúûü</string>
- <string name="alternates_for_s">§ß</string>
- <string name="alternates_for_n">ñ</string>
- <string name="alternates_for_c">ç</string>
- <string name="alternates_for_y">ýÿ</string>
-</resources>
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_rows" />
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row1.xml b/java/res/xml-xlarge/kbd_qwerty_row1.xml
new file mode 100644
index 000000000..f5135591c
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_row1.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row2.xml b/java/res/xml-xlarge/kbd_qwerty_row2.xml
new file mode 100644
index 000000000..1b4393ab2
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_row2.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.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="8.157%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.167%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="15.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row3.xml b/java/res/xml-xlarge/kbd_qwerty_row3.xml
new file mode 100644
index 000000000..b7e9bcff9
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_row3.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="z"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="m" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:manualTemporaryUpperCaseCode="33"
+ latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+ latin:popupCharacters="!" />
+ <Key
+ latin:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="63"
+ latin:keyHintIcon="@drawable/key_hint_question_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+ latin:popupCharacters="\?" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row4.xml b/java/res/xml-xlarge/kbd_qwerty_row4.xml
new file mode 100644
index 000000000..e222a6bb0
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_row4.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Spacer
+ latin:horizontalGap="16.404%p" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle" />
+ <Key
+ latin:keyLabel="\@" />
+ </case>
+ <!-- TODO: implement logical OR for <case> attribute -->
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyStyle="comKeyStyle"
+ latin:keyWidth="16.084%p" />
+ </case>
+ <default>
+ <switch>
+ <case
+ latin:imeOptions="actionSearch"
+ >
+ <Key
+ latin:keyLabel=":"
+ latin:manualTemporaryUpperCaseCode="43"
+ latin:keyHintIcon="@drawable/key_hint_plus_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
+ latin:popupCharacters="+" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="smileyKeyStyle" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel="/"
+ latin:manualTemporaryUpperCaseCode="64"
+ latin:keyHintIcon="@drawable/key_hint_at_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo"
+ latin:popupCharacters="\@" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="37.454%p" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="-" />
+ </case>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyLabel="/"
+ latin:manualTemporaryUpperCaseCode="58"
+ latin:keyHintIcon="@drawable/key_hint_colon_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
+ latin:popupCharacters=":" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="\'"
+ latin:manualTemporaryUpperCaseCode="34"
+ latin:keyHintIcon="@drawable/key_hint_quote_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_quote_large_holo"
+ latin:popupCharacters="&quot;" />
+ </default>
+ </switch>
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="_" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="-"
+ latin:manualTemporaryUpperCaseCode="95"
+ latin:keyHintIcon="@drawable/key_hint_underline_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+ latin:popupCharacters="_" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </Row>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_rows.xml b/java/res/xml-xlarge/kbd_qwerty_rows.xml
new file mode 100644
index 000000000..6237712f6
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_rows.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row1" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
new file mode 100644
index 000000000..8c583ba85
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyLabel="å" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="7.520%p"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_scandinavia_row2_10"
+ latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_scandinavia_row2_11"
+ latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwertz_rows.xml b/java/res/xml-xlarge/kbd_qwertz_rows.xml
new file mode 100644
index 000000000..3e99f0511
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_qwertz_rows.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="z"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="u"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="m" />
+ <switch>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:manualTemporaryUpperCaseCode="33"
+ latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+ latin:popupCharacters="!" />
+ <Key
+ latin:keyLabel="."
+ latin:manualTemporaryUpperCaseCode="63"
+ latin:keyHintIcon="@drawable/key_hint_question_holo"
+ latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+ latin:popupCharacters="\?" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml
new file mode 100644
index 000000000..50b8e5307
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_symbols.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="1"
+ latin:popupCharacters="¹,½,⅓,¼,⅛" />
+ <Key
+ latin:keyLabel="2"
+ latin:popupCharacters="²,⅔" />
+ <Key
+ latin:keyLabel="3"
+ latin:popupCharacters="³,¾,⅜" />
+ <Key
+ latin:keyLabel="4"
+ latin:popupCharacters="⁴" />
+ <Key
+ latin:keyLabel="5"
+ latin:popupCharacters="⅝" />
+ <Key
+ latin:keyLabel="6" />
+ <Key
+ latin:keyLabel="7"
+ latin:popupCharacters="⅞" />
+ <Key
+ latin:keyLabel="8" />
+ <Key
+ latin:keyLabel="9" />
+ <Key
+ latin:keyLabel="0"
+ latin:popupCharacters="ⁿ,∅" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.157%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.167%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="#" />
+ <Key
+ latin:keyLabel="$"
+ latin:popupCharacters="¢,£,€,¥,₣,₤,₱" />
+ <Key
+ latin:keyLabel="%"
+ latin:popupCharacters="‰" />
+ <Key
+ latin:keyLabel="&amp;" />
+ <Key
+ latin:keyLabel="*"
+ latin:popupCharacters="†,‡,★" />
+ <Key
+ latin:keyLabel="-"
+ latin:popupCharacters="_,–,—" />
+ <Key
+ latin:keyLabel="+"
+ latin:popupCharacters="±" />
+ <Key
+ latin:keyLabel="("
+ latin:popupCharacters="[,{,&lt;" />
+ <Key
+ latin:keyLabel=")"
+ latin:popupCharacters="],},&gt;" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="15.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="&lt;"
+ latin:popupCharacters="≤,«,‹" />
+ <Key
+ latin:keyLabel="&gt;"
+ latin:popupCharacters="≥,»,›" />
+ <Key
+ latin:keyLabel="="
+ latin:popupCharacters="≠,≈" />
+ <Key
+ latin:keyLabel=":" />
+ <Key
+ latin:keyLabel=";" />
+ <Key
+ latin:keyLabel="," />
+ <Key
+ latin:keyLabel="." />
+ <Key
+ latin:keyLabel="!"
+ latin:popupCharacters="¡" />
+ <Key
+ latin:keyLabel="\?"
+ latin:popupCharacters="¿" />
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Spacer
+ latin:horizontalGap="16.404%p" />
+ <Key
+ latin:keyLabel="/" />
+ <Key
+ latin:keyLabel="\@" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="37.454%p" />
+ <Key
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»,˝" />
+ <Key
+ latin:keyLabel="_" />
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </Row>
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml
new file mode 100644
index 000000000..f586b1a28
--- /dev/null
+++ b/java/res/xml-xlarge/kbd_symbols_shift.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <!-- This row is intentionally not marked as a top row -->
+ <Row
+ latin:keyWidth="8.272%p"
+ >
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="7.949%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="~" />
+ <Key
+ latin:keyLabel="`" />
+ <Key
+ latin:keyLabel="|" />
+ <Key
+ latin:keyLabel="•"
+ latin:popupCharacters="♪,♥,♠,♦,♣" />
+ <Key
+ latin:keyLabel="√" />
+ <Key
+ latin:keyLabel="π"
+ latin:popupCharacters="Π" />
+ <Key
+ latin:keyLabel="÷" />
+ <Key
+ latin:keyLabel="×" />
+ <Key
+ latin:keyLabel="§"
+ latin:popupCharacters="¶" />
+ <Key
+ latin:keyLabel="Δ" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="9.331%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.157%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyLabelOption="alignLeft"
+ latin:keyWidth="11.167%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="£" />
+ <Key
+ latin:keyLabel="¢" />
+ <Key
+ latin:keyLabel="€" />
+ <Key
+ latin:keyLabel="¥" />
+ <Key
+ latin:keyLabel="^"
+ latin:popupCharacters="↑,↓,←,→" />
+ <Key
+ latin:keyLabel="°" />
+ <Key
+ latin:keyLabel="±"
+ latin:popupCharacters="∞" />
+ <Key
+ latin:keyLabel="{" />
+ <Key
+ latin:keyLabel="}" />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="15.750%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="15.192%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="\\" />
+ <Key
+ latin:keyLabel="©" />
+ <Key
+ latin:keyLabel="®" />
+ <Key
+ latin:keyLabel="™" />
+ <Key
+ latin:keyLabel="℅" />
+ <Key
+ latin:keyLabel="[" />
+ <Key
+ latin:keyLabel="]" />
+ <Key
+ latin:keyLabel="¡" />
+ <Key
+ latin:keyLabel="¿" />
+ <Key
+ latin:keyStyle="moreKeyStyle"
+ latin:keyWidth="12.530%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <!-- This row is intentionally not marked as a bottom row -->
+ <Row
+ latin:keyWidth="8.042%p"
+ >
+ <Spacer
+ latin:horizontalGap="32.488%p" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="37.454%p" />
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </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..71109ab67
--- /dev/null
+++ b/java/res/xml/kbd_azerty_rows.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="10%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="a"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="@string/alternates_for_a"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="z"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="@string/alternates_for_p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyLabel="m"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="\'" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
new file mode 100644
index 000000000..3b35f3560
--- /dev/null
+++ b/java/res/xml/kbd_key_styles.xml
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <!-- Functional key styles -->
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle"
+ latin:isModifier="true" />
+ <key-style
+ latin:styleName="shiftKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyIcon="@drawable/sym_keyboard_shift"
+ latin:shiftedIcon="@drawable/sym_keyboard_shift_locked"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="deleteKeyStyle"
+ latin:code="@integer/key_delete"
+ latin:keyIcon="@drawable/sym_keyboard_delete"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isRepeatable="true" />
+ <switch>
+ <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+ symbol keyboard will have mic key. That means we should use "?123mic" key
+ here. -->
+ <case
+ latin:voiceKeyEnabled="true"
+ latin:hasVoiceKey="false"
+ >
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_keyboard_123_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <default>
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </default>
+ </switch>
+ <key-style
+ latin:styleName="settingsKeyStyle"
+ latin:code="@integer/key_settings"
+ latin:keyIcon="@drawable/sym_keyboard_settings"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="spaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_keyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_keyboard_tab"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="micKeyStyle"
+ latin:code="@integer/key_voice"
+ latin:keyIcon="@drawable/sym_keyboard_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ <!-- Note: This key style is not for functional tab key. This is used for the tab key
+ which is laid out as normal letter key. -->
+ <key-style
+ latin:styleName="nonSpecialBackgroundTabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_keyboard_tab"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_tab" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="functionalKeyStyle" />
+ <key-style
+ latin:styleName="shiftKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyIcon="@drawable/sym_bkeyboard_shift"
+ latin:shiftedIcon="@drawable/sym_bkeyboard_shift_locked"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="deleteKeyStyle"
+ latin:code="@integer/key_delete"
+ latin:keyIcon="@drawable/sym_bkeyboard_delete"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isRepeatable="true" />
+ <switch>
+ <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+ symbol keyboard will have mic key. That means we should use "?123mic" key
+ here. -->
+ <case
+ latin:voiceKeyEnabled="true"
+ latin:hasVoiceKey="false"
+ >
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <default>
+ <key-style
+ latin:styleName="toSymbolKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </default>
+ </switch>
+ <key-style
+ latin:styleName="settingsKeyStyle"
+ latin:code="@integer/key_settings"
+ latin:keyIcon="@drawable/sym_bkeyboard_settings"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="spaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_bkeyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_bkeyboard_tab"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="micKeyStyle"
+ latin:code="@integer/key_voice"
+ latin:keyIcon="@drawable/sym_bkeyboard_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_mic"
+ latin:parentStyle="functionalKeyStyle" />
+ <!-- Note: This key style is not for functional tab key. This is used for the tab key
+ which is laid out as normal letter key. -->
+ <key-style
+ latin:styleName="nonSpecialBackgroundTabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="@drawable/sym_bkeyboard_tab"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_tab" />
+ </case>
+ </switch>
+ <!-- Return key style -->
+ <switch>
+ <case
+ latin:imeOptions="actionGo"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_go_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeOptions="actionNext"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_next_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeOptions="actionDone"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_done_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeOptions="actionSend"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyLabel="@string/label_send_key"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:imeOptions="actionSearch"
+ >
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_keyboard_search"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_search"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_bkeyboard_search"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_search"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ </switch>
+ </case>
+ <default>
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_keyboard_return"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="returnKeyStyle"
+ latin:code="@integer/key_return"
+ latin:keyIcon="@drawable/sym_bkeyboard_return"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+ latin:parentStyle="functionalKeyStyle" />
+ </case>
+ </switch>
+ </default>
+ </switch>
+ <key-style
+ latin:styleName="toAlphaKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_alpha_key"
+ latin:parentStyle="functionalKeyStyle" />
+ <key-style
+ latin:styleName="altKeyStyle"
+ latin:code="@integer/key_shift"
+ latin:keyLabel="@string/label_alt_key"
+ latin:parentStyle="functionalKeyStyle"
+ latin:isSticky="true" />
+ <key-style
+ latin:styleName="smileyKeyStyle"
+ latin:keyLabel=":-)"
+ latin:keyOutputText=":-) "
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_smiley"
+ latin:maxPopupKeyboardColumn="5"
+ latin:parentStyle="functionalKeyStyle" />
+</merge> \ No newline at end of file
diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml
new file mode 100644
index 000000000..f4fe8401a
--- /dev/null
+++ b/java/res/xml/kbd_number.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="26.67%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_keyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_bkeyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ </switch>
+ <Row
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="1"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="2" />
+ <Key
+ latin:keyLabel="3" />
+ <Key
+ latin:keyLabel="-"
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyLabel="4"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="5" />
+ <Key
+ latin:keyLabel="6" />
+ <Key
+ latin:keyLabel=","
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row>
+ <Key
+ latin:keyLabel="7"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="8" />
+ <Key
+ latin:keyLabel="9" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:rowEdgeFlags="bottom"
+ >
+ <Key
+ latin:keyStyle="numSpaceKeyStyle"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="0" />
+ <Key
+ latin:keyLabel="." />
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</Keyboard>
diff --git a/java/res/xml/kbd_numkey_styles.xml b/java/res/xml/kbd_numkey_styles.xml
new file mode 100644
index 000000000..2f9ae325a
--- /dev/null
+++ b/java/res/xml/kbd_numkey_styles.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:colorScheme="white"
+ >
+ <key-style
+ latin:styleName="num0KeyStyle"
+ latin:code="48"
+ latin:keyIcon="@drawable/sym_keyboard_num0" />
+ <key-style
+ latin:styleName="num1KeyStyle"
+ latin:code="49"
+ latin:keyIcon="@drawable/sym_keyboard_num1" />
+ <key-style
+ latin:styleName="num2KeyStyle"
+ latin:code="50"
+ latin:keyIcon="@drawable/sym_keyboard_num2" />
+ <key-style
+ latin:styleName="num3KeyStyle"
+ latin:code="51"
+ latin:keyIcon="@drawable/sym_keyboard_num3" />
+ <key-style
+ latin:styleName="num4KeyStyle"
+ latin:code="52"
+ latin:keyIcon="@drawable/sym_keyboard_num4" />
+ <key-style
+ latin:styleName="num5KeyStyle"
+ latin:code="53"
+ latin:keyIcon="@drawable/sym_keyboard_num5" />
+ <key-style
+ latin:styleName="num6KeyStyle"
+ latin:code="54"
+ latin:keyIcon="@drawable/sym_keyboard_num6" />
+ <key-style
+ latin:styleName="num7KeyStyle"
+ latin:code="55"
+ latin:keyIcon="@drawable/sym_keyboard_num7" />
+ <key-style
+ latin:styleName="num8KeyStyle"
+ latin:code="56"
+ latin:keyIcon="@drawable/sym_keyboard_num8" />
+ <key-style
+ latin:styleName="num9KeyStyle"
+ latin:code="57"
+ latin:keyIcon="@drawable/sym_keyboard_num9" />
+ <key-style
+ latin:styleName="numStarKeyStyle"
+ latin:code="42"
+ latin:keyIcon="@drawable/sym_keyboard_numstar" />
+ <key-style
+ latin:styleName="numPoundKeyStyle"
+ latin:code="35"
+ latin:keyIcon="@drawable/sym_keyboard_numpound" />
+ <key-style
+ latin:styleName="numAltKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_keyboard_numalt"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_keyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ <case
+ latin:colorScheme="black"
+ >
+ <key-style
+ latin:styleName="num0KeyStyle"
+ latin:code="48"
+ latin:keyIcon="@drawable/sym_bkeyboard_num0" />
+ <key-style
+ latin:styleName="num1KeyStyle"
+ latin:code="49"
+ latin:keyIcon="@drawable/sym_bkeyboard_num1" />
+ <key-style
+ latin:styleName="num2KeyStyle"
+ latin:code="50"
+ latin:keyIcon="@drawable/sym_bkeyboard_num2" />
+ <key-style
+ latin:styleName="num3KeyStyle"
+ latin:code="51"
+ latin:keyIcon="@drawable/sym_bkeyboard_num3" />
+ <key-style
+ latin:styleName="num4KeyStyle"
+ latin:code="52"
+ latin:keyIcon="@drawable/sym_bkeyboard_num4" />
+ <key-style
+ latin:styleName="num5KeyStyle"
+ latin:code="53"
+ latin:keyIcon="@drawable/sym_bkeyboard_num5" />
+ <key-style
+ latin:styleName="num6KeyStyle"
+ latin:code="54"
+ latin:keyIcon="@drawable/sym_bkeyboard_num6" />
+ <key-style
+ latin:styleName="num7KeyStyle"
+ latin:code="55"
+ latin:keyIcon="@drawable/sym_bkeyboard_num7" />
+ <key-style
+ latin:styleName="num8KeyStyle"
+ latin:code="56"
+ latin:keyIcon="@drawable/sym_bkeyboard_num8" />
+ <key-style
+ latin:styleName="num9KeyStyle"
+ latin:code="57"
+ latin:keyIcon="@drawable/sym_bkeyboard_num9" />
+ <key-style
+ latin:styleName="numStarKeyStyle"
+ latin:code="42"
+ latin:keyIcon="@drawable/sym_bkeyboard_numstar" />
+ <key-style
+ latin:styleName="numPoundKeyStyle"
+ latin:code="35"
+ latin:keyIcon="@drawable/sym_bkeyboard_numpound" />
+ <key-style
+ latin:styleName="numAltKeyStyle"
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_bkeyboard_numalt"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
+ <key-style
+ latin:styleName="numSpaceKeyStyle"
+ latin:code="@integer/key_space"
+ latin:keyIcon="@drawable/sym_bkeyboard_space"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ </case>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
index 10774c666..62fbdeeec 100644
--- a/java/res/xml/kbd_phone.xml
+++ b/java/res/xml/kbd_phone.xml
@@ -19,88 +19,76 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="26.67%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="26.67%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_numkey_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
<Key
- android:codes="49"
- android:keyIcon="@drawable/sym_keyboard_num1"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="num1KeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:codes="50"
- android:keyIcon="@drawable/sym_keyboard_num2" />
+ latin:keyStyle="num2KeyStyle" />
<Key
- android:codes="51"
- android:keyIcon="@drawable/sym_keyboard_num3" />
+ latin:keyStyle="num3KeyStyle" />
<Key
- android:keyLabel="-"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="-"
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="52"
- android:keyIcon="@drawable/sym_keyboard_num4"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="num4KeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:codes="53"
- android:keyIcon="@drawable/sym_keyboard_num5" />
+ latin:keyStyle="num5KeyStyle" />
<Key
- android:codes="54"
- android:keyIcon="@drawable/sym_keyboard_num6" />
+ latin:keyStyle="num6KeyStyle" />
<Key
- android:keyLabel="."
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="."
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="55"
- android:keyIcon="@drawable/sym_keyboard_num7"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="num7KeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:codes="56"
- android:keyIcon="@drawable/sym_keyboard_num8" />
+ latin:keyStyle="num8KeyStyle" />
<Key
- android:codes="57"
- android:keyIcon="@drawable/sym_keyboard_num9" />
+ latin:keyStyle="num9KeyStyle" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row
- android:rowEdgeFlags="bottom"
+ latin:rowEdgeFlags="bottom"
>
<Key
- android:codes="@integer/key_symbol"
- android:keyIcon="@drawable/sym_keyboard_numalt"
- android:iconPreview="@drawable/sym_keyboard_feedback_numalt"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="numAltKeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:codes="48"
- android:keyIcon="@drawable/sym_keyboard_num0" />
+ latin:keyStyle="num0KeyStyle" />
<Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ latin:keyStyle="numSpaceKeyStyle" />
<Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
</Keyboard>
diff --git a/java/res/xml/kbd_phone_black.xml b/java/res/xml/kbd_phone_black.xml
deleted file mode 100644
index 5afa9a194..000000000
--- a/java/res/xml/kbd_phone_black.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="26.67%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:codes="49"
- android:keyIcon="@drawable/sym_bkeyboard_num1"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="50"
- android:keyIcon="@drawable/sym_bkeyboard_num2" />
- <Key
- android:codes="51"
- android:keyIcon="@drawable/sym_bkeyboard_num3" />
- <Key
- android:keyLabel="-"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="52"
- android:keyIcon="@drawable/sym_bkeyboard_num4"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="53"
- android:keyIcon="@drawable/sym_bkeyboard_num5" />
- <Key
- android:codes="54"
- android:keyIcon="@drawable/sym_bkeyboard_num6" />
- <Key
- android:keyLabel="."
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="55"
- android:keyIcon="@drawable/sym_bkeyboard_num7"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="56"
- android:keyIcon="@drawable/sym_bkeyboard_num8" />
- <Key
- android:codes="57"
- android:keyIcon="@drawable/sym_bkeyboard_num9" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="20%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyIcon="@drawable/sym_bkeyboard_numalt"
- android:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
- <Key
- android:codes="48"
- android:keyIcon="@drawable/sym_bkeyboard_num0" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml
index 4c928a8d8..67cd330e7 100644
--- a/java/res/xml/kbd_phone_symbols.xml
+++ b/java/res/xml/kbd_phone_symbols.xml
@@ -19,84 +19,82 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="26.67%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="26.67%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_numkey_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
<Key
- android:keyLabel="("
- android:keyEdgeFlags="left" />
+ latin:keyLabel="("
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="/" />
+ latin:keyLabel="/" />
<Key
- android:keyLabel=")" />
+ latin:keyLabel=")" />
<Key
- android:keyLabel="-"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="-"
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:keyLabel="N"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="N"
+ latin:keyEdgeFlags="left" />
<!-- Pause is a comma. Check PhoneNumberUtils.java to see if this
has changed. -->
<Key
- android:codes="44"
- android:keyLabel="Pause" />
+ latin:code="44"
+ latin:keyLabel="Pause" />
<Key
- android:keyLabel="," />
+ latin:keyLabel="," />
<Key
- android:keyLabel="."
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="."
+ latin:keyStyle="functionalKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="42"
- android:keyIcon="@drawable/sym_keyboard_numstar"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="numStarKeyStyle"
+ latin:keyEdgeFlags="left" />
<!-- Wait is a semicolon. -->
<Key
- android:codes="59"
- android:keyLabel="Wait" />
+ latin:code="59"
+ latin:keyLabel="Wait" />
<Key
- android:codes="35"
- android:keyIcon="@drawable/sym_keyboard_numpound" />
+ latin:keyStyle="numPoundKeyStyle" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
<Row
- android:rowEdgeFlags="bottom"
+ latin:rowEdgeFlags="bottom"
>
<Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_phone_key"
- android:keyEdgeFlags="left" />
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_numeric_key"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="+" />
+ latin:keyLabel="+" />
<Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space" />
+ latin:keyStyle="numSpaceKeyStyle" />
<Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
</Row>
</Keyboard>
diff --git a/java/res/xml/kbd_phone_symbols_black.xml b/java/res/xml/kbd_phone_symbols_black.xml
deleted file mode 100644
index 4d686e145..000000000
--- a/java/res/xml/kbd_phone_symbols_black.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="26.67%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="("
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="/" />
- <Key
- android:keyLabel=")" />
- <Key
- android:keyLabel="-"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="N"
- android:keyEdgeFlags="left" />
- <!-- Pause is a comma. Check PhoneNumberUtils.java to see if this
- has changed. -->
- <Key
- android:codes="44"
- android:keyLabel="Pause" />
- <Key
- android:keyLabel="," />
- <Key
- android:keyLabel="."
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="42"
- android:keyIcon="@drawable/sym_bkeyboard_numstar"
- android:keyEdgeFlags="left" />
- <!-- Wait is a semicolon. -->
- <Key
- android:codes="59"
- android:keyLabel="Wait" />
- <Key
- android:codes="35"
- android:keyIcon="@drawable/sym_bkeyboard_numpound" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="20%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_phone_key"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="+" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_popup_narrow_template.xml b/java/res/xml/kbd_popup_narrow_template.xml
index 23c686e8b..36caf1c15 100644
--- a/java/res/xml/kbd_popup_narrow_template.xml
+++ b/java/res/xml/kbd_popup_narrow_template.xml
@@ -18,10 +18,10 @@
*/
-->
-<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="9.45%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
+<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyWidth="9.45%p"
+ latin:horizontalGap="0px"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
>
</Keyboard>
diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml
index a287be1fd..9ee27493d 100644
--- a/java/res/xml/kbd_popup_template.xml
+++ b/java/res/xml/kbd_popup_template.xml
@@ -18,10 +18,10 @@
*/
-->
-<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
+<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="0px"
+ latin:rowHeight="@dimen/popup_key_height"
>
</Keyboard>
diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml
index a4ab0f8fe..92d92f0e6 100644
--- a/java/res/xml/kbd_qwerty.xml
+++ b/java/res/xml/kbd_qwerty.xml
@@ -19,487 +19,16 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_narrow_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_keyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_keyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_rows" />
</Keyboard>
diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml
deleted file mode 100644
index 787e4ef7c..000000000
--- a/java/res/xml/kbd_qwerty_black.xml
+++ /dev/null
@@ -1,447 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="q"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_q"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="w"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_w" />
- <Key
- android:keyLabel="e"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_e" />
- <Key
- android:keyLabel="r"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_r" />
- <Key
- android:keyLabel="t"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_t" />
- <Key
- android:keyLabel="y"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_y" />
- <Key
- android:keyLabel="u"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_u" />
- <Key
- android:keyLabel="i"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_i" />
- <Key
- android:keyLabel="o"
- android:popupKeyboard="@xml/kbd_popup_narrow_template"
- android:popupCharacters="@string/alternates_for_o" />
- <Key
- android:keyLabel="p"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="a"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_a"
- android:horizontalGap="5%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="s"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_s" />
- <Key
- android:keyLabel="d"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_d" />
- <Key
- android:keyLabel="f" />
- <Key
- android:keyLabel="g"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_g" />
- <Key
- android:keyLabel="h" />
- <Key
- android:keyLabel="j" />
- <Key
- android:keyLabel="k" />
- <Key
- android:keyLabel="l"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_l"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyIcon="@drawable/sym_bkeyboard_shift"
- android:iconPreview="@drawable/sym_keyboard_feedback_shift"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="z"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_z" />
- <Key
- android:keyLabel="x" />
- <Key
- android:keyLabel="c"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_c" />
- <Key
- android:keyLabel="v"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_v" />
- <Key
- android:keyLabel="b" />
- <Key
- android:keyLabel="n"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="@string/alternates_for_n" />
- <Key
- android:keyLabel="m" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="20%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab"
- android:keyWidth="20%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_normal_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_url_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_email_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_im_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_smileys"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_webentry_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_symbol_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:codes="@integer/key_tab"
- android:keyIcon="@drawable/sym_bkeyboard_tab"
- android:iconPreview="@drawable/sym_keyboard_feedback_tab" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="15%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_qwerty_black_symbol.xml b/java/res/xml/kbd_qwerty_black_symbol.xml
new file mode 100644
index 000000000..6e45c12bf
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_black_symbol.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:hasSettingsKey="false"
+ >
+ <switch>
+ <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+ symbol keyboard will have mic key. That means we should use "?123mic" key here.
+ -->
+ <case
+ latin:voiceKeyEnabled="true"
+ latin:hasVoiceKey="false"
+ >
+ <Key
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+ latin:keyWidth="20%p"
+ latin:isModifier="true"
+ latin:keyEdgeFlags="left" />
+ </case>
+ <default>
+ <Key
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:keyWidth="20%p"
+ latin:isModifier="true"
+ latin:keyEdgeFlags="left" />
+ </default>
+ </switch>
+ </case>
+ <case
+ latin:hasSettingsKey="true"
+ >
+ <switch>
+ <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+ symbol keyboard will have mic key. That means we should use "?123mic" key here.
+ -->
+ <case
+ latin:voiceKeyEnabled="true"
+ latin:hasVoiceKey="false"
+ >
+ <Key
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
+ latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+ latin:keyWidth="15%p"
+ latin:isModifier="true"
+ latin:keyEdgeFlags="left" />
+ </case>
+ <default>
+ <Key
+ latin:code="@integer/key_switch_alpha_symbol"
+ latin:keyLabel="@string/label_to_symbol_key"
+ latin:keyWidth="15%p"
+ latin:isModifier="true"
+ latin:keyEdgeFlags="left" />
+ </default>
+ </switch>
+ </case>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_f1.xml b/java/res/xml/kbd_qwerty_f1.xml
new file mode 100644
index 000000000..cbdb8c09a
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_f1.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:mode="url"
+ >
+ <Key
+ latin:keyLabel="/"
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_settings_slash"
+ latin:isModifier="true" />
+ </case>
+ <case
+ latin:mode="email"
+ >
+ <Key
+ latin:keyLabel="\@"
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_settings_at"
+ latin:isModifier="true" />
+ </case>
+ <default>
+ <switch>
+ <case
+ latin:hasVoiceKey="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </case>
+ <case
+ latin:hasVoiceKey="false"
+ >
+ <Key
+ latin:keyLabel=","
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_settings_comma"
+ latin:isModifier="true" />
+ </case>
+ </switch>
+ </default>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_row1.xml b/java/res/xml/kbd_qwerty_row1.xml
new file mode 100644
index 000000000..d9249657e
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row1.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="10%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="@string/alternates_for_p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_row2.xml b/java/res/xml/kbd_qwerty_row2.xml
new file mode 100644
index 000000000..dd0035d93
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row2.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Spacer
+ latin:horizontalGap="5%p" />
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_row3.xml b/java/res/xml/kbd_qwerty_row3.xml
new file mode 100644
index 000000000..26608fd71
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row3.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="z"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="m" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml
new file mode 100644
index 000000000..0db011672
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:keyWidth="10%p"
+ latin:rowEdgeFlags="bottom"
+ >
+ <switch>
+ <case
+ latin:hasSettingsKey="false"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="left" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f1" />
+ <switch>
+ <case
+ latin:mode="web"
+ >
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="20%p" />
+ <Key
+ latin:keyStyle="tabKeyStyle"
+ latin:keyWidth="20%p" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="40%p" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel="."
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ <case
+ latin:hasSettingsKey="true"
+ >
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="settingsKeyStyle" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_f1" />
+ <switch>
+ <case
+ latin:mode="web"
+ >
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="30%p" />
+ <Key
+ latin:keyStyle="tabKeyStyle" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="30%p" />
+ </default>
+ </switch>
+ <Key
+ latin:keyLabel="."
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <case
+ latin:mode="web"
+ >
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ </switch>
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_rows.xml b/java/res/xml/kbd_qwerty_rows.xml
new file mode 100644
index 000000000..6237712f6
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_rows.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row1" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_qwerty_rows_scandinavia.xml b/java/res/xml/kbd_qwerty_rows_scandinavia.xml
new file mode 100644
index 000000000..490652663
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_rows_scandinavia.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="9.09%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="y"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="@string/alternates_for_p" />
+ <Key
+ latin:keyLabel="å"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <Row
+ latin:keyWidth="9.09%p"
+ >
+ <Key
+ latin:keyLabel="a"
+ latin:popupCharacters="@string/alternates_for_a"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="s"
+ latin:popupCharacters="@string/alternates_for_s" />
+ <Key
+ latin:keyLabel="d"
+ latin:popupCharacters="@string/alternates_for_d" />
+ <Key
+ latin:keyLabel="f" />
+ <Key
+ latin:keyLabel="g"
+ latin:popupCharacters="@string/alternates_for_g" />
+ <Key
+ latin:keyLabel="h" />
+ <Key
+ latin:keyLabel="j" />
+ <Key
+ latin:keyLabel="k" />
+ <Key
+ latin:keyLabel="l"
+ latin:popupCharacters="@string/alternates_for_l" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_scandinavia_row2_10"
+ latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_scandinavia_row2_11"
+ latin:popupCharacters="@string/alternates_for_scandinavia_row2_11"
+ latin:keyWidth="8.75%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_qwertz_rows.xml b/java/res/xml/kbd_qwertz_rows.xml
new file mode 100644
index 000000000..375f12335
--- /dev/null
+++ b/java/res/xml/kbd_qwertz_rows.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
+ <Row
+ latin:keyWidth="10%p"
+ latin:rowEdgeFlags="top"
+ >
+ <Key
+ latin:keyLabel="q"
+ latin:keyHintIcon="@drawable/keyboard_hint_1"
+ latin:popupCharacters="@string/alternates_for_q"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="w"
+ latin:keyHintIcon="@drawable/keyboard_hint_2"
+ latin:popupCharacters="@string/alternates_for_w" />
+ <Key
+ latin:keyLabel="e"
+ latin:keyHintIcon="@drawable/keyboard_hint_3"
+ latin:popupCharacters="@string/alternates_for_e" />
+ <Key
+ latin:keyLabel="r"
+ latin:keyHintIcon="@drawable/keyboard_hint_4"
+ latin:popupCharacters="@string/alternates_for_r" />
+ <Key
+ latin:keyLabel="t"
+ latin:keyHintIcon="@drawable/keyboard_hint_5"
+ latin:popupCharacters="@string/alternates_for_t" />
+ <Key
+ latin:keyLabel="z"
+ latin:keyHintIcon="@drawable/keyboard_hint_6"
+ latin:popupCharacters="@string/alternates_for_z" />
+ <Key
+ latin:keyLabel="u"
+ latin:keyHintIcon="@drawable/keyboard_hint_7"
+ latin:popupCharacters="@string/alternates_for_u" />
+ <Key
+ latin:keyLabel="i"
+ latin:keyHintIcon="@drawable/keyboard_hint_8"
+ latin:popupCharacters="@string/alternates_for_i" />
+ <Key
+ latin:keyLabel="o"
+ latin:keyHintIcon="@drawable/keyboard_hint_9"
+ latin:popupCharacters="@string/alternates_for_o" />
+ <Key
+ latin:keyLabel="p"
+ latin:keyHintIcon="@drawable/keyboard_hint_0"
+ latin:popupCharacters="@string/alternates_for_p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="y"
+ latin:popupCharacters="@string/alternates_for_y" />
+ <Key
+ latin:keyLabel="x" />
+ <Key
+ latin:keyLabel="c"
+ latin:popupCharacters="@string/alternates_for_c" />
+ <Key
+ latin:keyLabel="v"
+ latin:popupCharacters="@string/alternates_for_v" />
+ <Key
+ latin:keyLabel="b" />
+ <Key
+ latin:keyLabel="n"
+ latin:popupCharacters="@string/alternates_for_n" />
+ <Key
+ latin:keyLabel="m" />
+ <Key
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
+ </Row>
+ <include
+ latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml
index bcb6e8ae8..5d62deaa4 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -19,196 +19,109 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
<Key
- android:keyLabel="1"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¹½⅓¼⅛"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="1"
+ latin:popupCharacters="¹,½,⅓,¼,⅛"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="2"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="²⅔" />
+ latin:keyLabel="2"
+ latin:popupCharacters="²,⅔" />
<Key
- android:keyLabel="3"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="³¾⅜" />
+ latin:keyLabel="3"
+ latin:popupCharacters="³,¾,⅜" />
<Key
- android:keyLabel="4"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⁴" />
+ latin:keyLabel="4"
+ latin:popupCharacters="⁴" />
<Key
- android:keyLabel="5"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⅝" />
+ latin:keyLabel="5"
+ latin:popupCharacters="⅝" />
<Key
- android:keyLabel="6" />
+ latin:keyLabel="6" />
<Key
- android:keyLabel="7"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⅞" />
+ latin:keyLabel="7"
+ latin:popupCharacters="⅞" />
<Key
- android:keyLabel="8" />
+ latin:keyLabel="8" />
<Key
- android:keyLabel="9" />
+ latin:keyLabel="9" />
<Key
- android:keyLabel="0"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="ⁿ∅"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="0"
+ latin:popupCharacters="ⁿ,∅"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:keyLabel="\@"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="\@"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="\#" />
+ latin:keyLabel="\#" />
<Key
- android:keyLabel="$"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¢£€¥₣₤₱" />
+ latin:keyLabel="$"
+ latin:popupCharacters="¢,£,€,¥,₣,₤,₱" />
<Key
- android:keyLabel="%"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="‰" />
+ latin:keyLabel="%"
+ latin:popupCharacters="‰" />
<Key
- android:keyLabel="&amp;" />
+ latin:keyLabel="&amp;" />
<Key
- android:keyLabel="*"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="†‡★" />
+ latin:keyLabel="*"
+ latin:popupCharacters="†,‡,★" />
<Key
- android:keyLabel="-"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="_–—" />
+ latin:keyLabel="-"
+ latin:popupCharacters="_,–,—" />
<Key
- android:keyLabel="+"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="±" />
+ latin:keyLabel="+"
+ latin:popupCharacters="±" />
<Key
- android:keyLabel="("
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="[{&lt;" />
+ latin:keyLabel="("
+ latin:popupCharacters="[,{,&lt;" />
<Key
- android:keyLabel=")"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="]}&gt;"
- android:keyEdgeFlags="right" />
+ latin:keyLabel=")"
+ latin:popupCharacters="],},&gt;"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="@integer/key_shift"
- android:keyLabel="@string/label_alt_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="altKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="!"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¡" />
+ latin:keyLabel="!"
+ latin:popupCharacters="¡" />
<Key
- android:keyLabel="&quot;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="“”«»˝" />
+ latin:keyLabel="&quot;"
+ latin:popupCharacters="“,”,«,»,˝" />
<Key
- android:keyLabel="\'"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="‘’" />
+ latin:keyLabel="\'"
+ latin:popupCharacters="‘,’" />
<Key
- android:keyLabel=":" />
+ latin:keyLabel=":" />
<Key
- android:keyLabel=";" />
+ latin:keyLabel=";" />
<Key
- android:keyLabel="/" />
+ latin:keyLabel="/" />
<Key
- android:keyLabel="\?"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¿" />
+ latin:keyLabel="\?"
+ latin:popupCharacters="¿" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_f1"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
</Row>
+ <include latin:keyboardLayout="@xml/kbd_symbols_row4" />
</Keyboard>
diff --git a/java/res/xml/kbd_symbols_black.xml b/java/res/xml/kbd_symbols_black.xml
deleted file mode 100644
index add6c01c5..000000000
--- a/java/res/xml/kbd_symbols_black.xml
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="1"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¹½⅓¼⅛"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="2"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="²⅔" />
- <Key
- android:keyLabel="3"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="³¾⅜" />
- <Key
- android:keyLabel="4"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⁴" />
- <Key
- android:keyLabel="5"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⅝" />
- <Key
- android:keyLabel="6" />
- <Key
- android:keyLabel="7"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="⅞" />
- <Key
- android:keyLabel="8" />
- <Key
- android:keyLabel="9" />
- <Key
- android:keyLabel="0"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="ⁿ∅"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel="\@"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="\#" />
- <Key
- android:keyLabel="$"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¢£€¥₣₤₱" />
- <Key
- android:keyLabel="%"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="‰" />
- <Key
- android:keyLabel="&amp;" />
- <Key
- android:keyLabel="*"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="†‡★" />
- <Key
- android:keyLabel="-"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="_–—" />
- <Key
- android:keyLabel="+"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="±" />
- <Key
- android:keyLabel="("
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="[{&lt;" />
- <Key
- android:keyLabel=")"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="]}&gt;"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyLabel="@string/label_alt_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="!"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¡" />
- <Key
- android:keyLabel="&quot;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="“”«»˝" />
- <Key
- android:keyLabel="\'"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="‘’" />
- <Key
- android:keyLabel=":" />
- <Key
- android:keyLabel=";" />
- <Key
- android:keyLabel="/" />
- <Key
- android:keyLabel="\?"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="¿" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:codes="@integer/key_f1" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="."
- android:keyIcon="@drawable/hint_popup"
- android:popupKeyboard="@xml/popup_punctuation" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_symbols_f1.xml b/java/res/xml/kbd_symbols_f1.xml
new file mode 100644
index 000000000..8487b6158
--- /dev/null
+++ b/java/res/xml/kbd_symbols_f1.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <switch>
+ <case
+ latin:hasVoiceKey="true"
+ >
+ <Key
+ latin:keyStyle="micKeyStyle" />
+ </case>
+ <case
+ latin:hasVoiceKey="false"
+ >
+ <Key
+ latin:keyLabel=","
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_settings_comma"
+ latin:keyStyle="functionalKeyStyle" />
+ </case>
+ </switch>
+</merge>
diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml
new file mode 100644
index 000000000..b330095af
--- /dev/null
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:rowEdgeFlags="bottom"
+ >
+ <switch>
+ <case
+ latin:hasSettingsKey="false"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="left" />
+ <include
+ latin:keyboardLayout="@xml/kbd_symbols_f1" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="40%p" />
+ <Key
+ latin:keyLabel="."
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ <case
+ latin:hasSettingsKey="true"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="settingsKeyStyle" />
+ <include
+ latin:keyboardLayout="@xml/kbd_symbols_f1" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="30%p" />
+ <Key
+ latin:keyLabel="."
+ latin:keyHintIcon="@drawable/hint_popup"
+ latin:popupCharacters="@string/alternates_for_punctuation"
+ latin:maxPopupKeyboardColumn="7"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ </switch>
+ </Row>
+</merge>
diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
index 9bee22069..368ee805b 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -19,171 +19,98 @@
-->
<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardHeight="@dimen/keyboardHeight"
+ latin:maxKeyboardHeight="50%p"
+ latin:rowHeight="25%p"
+ latin:keyWidth="10%p"
+ latin:horizontalGap="@dimen/key_horizontal_gap"
+ latin:verticalGap="@dimen/key_bottom_gap"
+ latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+ latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
>
+ <include
+ latin:keyboardLayout="@xml/kbd_key_styles" />
<Row
- android:rowEdgeFlags="top"
+ latin:rowEdgeFlags="top"
>
<Key
- android:keyLabel="~"
- android:keyEdgeFlags="left" />
+ latin:keyLabel="~"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="`" />
+ latin:keyLabel="`" />
<Key
- android:keyLabel="|" />
+ latin:keyLabel="|" />
<Key
- android:keyLabel="•"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="♪♥♠♦♣" />
+ latin:keyLabel="•"
+ latin:popupCharacters="♪,♥,♠,♦,♣" />
<Key
- android:keyLabel="√" />
+ latin:keyLabel="√" />
<Key
- android:keyLabel="π"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="Π" />
+ latin:keyLabel="π"
+ latin:popupCharacters="Π" />
<Key
- android:keyLabel="÷" />
+ latin:keyLabel="÷" />
<Key
- android:keyLabel="×" />
+ latin:keyLabel="×" />
<Key
- android:keyLabel="{" />
+ latin:keyLabel="{" />
<Key
- android:keyLabel="}"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="}"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="@integer/key_tab"
- android:keyLabel="\u21E5"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="nonSpecialBackgroundTabKeyStyle"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="£" />
+ latin:keyLabel="£" />
<Key
- android:keyLabel="¢" />
+ latin:keyLabel="¢" />
<Key
- android:keyLabel="€" />
+ latin:keyLabel="€" />
<Key
- android:keyLabel="°" />
+ latin:keyLabel="°" />
<Key
- android:keyLabel="^"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="↑↓←→" />
+ latin:keyLabel="^"
+ latin:popupCharacters="↑,↓,←,→" />
<Key
- android:keyLabel="_" />
+ latin:keyLabel="_" />
<Key
- android:keyLabel="="
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≠≈∞" />
+ latin:keyLabel="="
+ latin:popupCharacters="≠,≈,∞" />
<Key
- android:keyLabel="[" />
+ latin:keyLabel="[" />
<Key
- android:keyLabel="]"
- android:keyEdgeFlags="right" />
+ latin:keyLabel="]"
+ latin:keyEdgeFlags="right" />
</Row>
<Row>
<Key
- android:codes="@integer/key_shift"
- android:keyLabel="@string/label_alt_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
+ latin:keyStyle="shiftKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
<Key
- android:keyLabel="™" />
+ latin:keyLabel="™" />
<Key
- android:keyLabel="®" />
+ latin:keyLabel="®" />
<Key
- android:keyLabel="©" />
+ latin:keyLabel="©" />
<Key
- android:keyLabel="¶"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="§" />
+ latin:keyLabel="¶"
+ latin:popupCharacters="§" />
<Key
- android:keyLabel="\\" />
+ latin:keyLabel="\\" />
<Key
- android:keyLabel="&lt;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≤«‹" />
+ latin:keyLabel="&lt;"
+ latin:popupCharacters="≤,«,‹" />
<Key
- android:keyLabel="&gt;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≥»›" />
+ latin:keyLabel="&gt;"
+ latin:popupCharacters="≥,»,›" />
<Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_keyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="„"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="…"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings"
- android:isModifier="true" />
- <Key
- android:keyLabel="„"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_keyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p"
- android:isModifier="true" />
- <Key
- android:keyLabel="…"
- android:isModifier="true" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_keyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:isModifier="true"
- android:keyEdgeFlags="right" />
+ latin:keyStyle="deleteKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="right" />
</Row>
+ <include latin:keyboardLayout="@xml/kbd_symbols_shift_row4" />
</Keyboard>
diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml
deleted file mode 100644
index 52b67c3de..000000000
--- a/java/res/xml/kbd_symbols_shift_black.xml
+++ /dev/null
@@ -1,177 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="@dimen/key_bottom_gap"
- android:keyHeight="@dimen/key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel="~"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="`" />
- <Key
- android:keyLabel="|" />
- <Key
- android:keyLabel="•"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="♪♥♠♦♣" />
- <Key
- android:keyLabel="√" />
- <Key
- android:keyLabel="π"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="Π" />
- <Key
- android:keyLabel="÷" />
- <Key
- android:keyLabel="×" />
- <Key
- android:keyLabel="{" />
- <Key
- android:keyLabel="}"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_tab"
- android:keyLabel="\u21E5"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="£" />
- <Key
- android:keyLabel="¢" />
- <Key
- android:keyLabel="€" />
- <Key
- android:keyLabel="°" />
- <Key
- android:keyLabel="^"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="↑↓←→" />
- <Key
- android:keyLabel="_" />
- <Key
- android:keyLabel="="
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≠≈∞" />
- <Key
- android:keyLabel="[" />
- <Key
- android:keyLabel="]"
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:codes="@integer/key_shift"
- android:keyLabel="@string/label_alt_key"
- android:keyWidth="15%p"
- android:isModifier="true"
- android:isSticky="true"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="™" />
- <Key
- android:keyLabel="®" />
- <Key
- android:keyLabel="©" />
- <Key
- android:keyLabel="¶"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="§" />
- <Key
- android:keyLabel="\\" />
- <Key
- android:keyLabel="&lt;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≤«‹" />
- <Key
- android:keyLabel="&gt;"
- android:popupKeyboard="@xml/kbd_popup_template"
- android:popupCharacters="≥»›" />
- <Key
- android:codes="@integer/key_delete"
- android:keyIcon="@drawable/sym_bkeyboard_delete"
- android:iconPreview="@drawable/sym_keyboard_feedback_delete"
- android:keyWidth="15%p"
- android:isRepeatable="true"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="20%p"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="„" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="40%p" />
- <Key
- android:keyLabel="…" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="20%p"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:keyboardMode="@+id/mode_symbols_with_settings_key"
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:codes="@integer/key_symbol"
- android:keyLabel="@string/label_alpha_key"
- android:keyWidth="15%p"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_bkeyboard_settings"
- android:iconPreview="@drawable/sym_keyboard_feedback_settings" />
- <Key
- android:keyLabel="„" />
- <Key
- android:codes="@integer/key_space"
- android:keyIcon="@drawable/sym_bkeyboard_space"
- android:iconPreview="@drawable/sym_keyboard_feedback_space"
- android:keyWidth="30%p" />
- <Key
- android:keyLabel="…" />
- <Key
- android:codes="@integer/key_return"
- android:keyIcon="@drawable/sym_bkeyboard_return"
- android:iconPreview="@drawable/sym_keyboard_feedback_return"
- android:keyWidth="25%p"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml
new file mode 100644
index 000000000..9159bab24
--- /dev/null
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+ <Row
+ latin:rowEdgeFlags="bottom"
+ >
+ <switch>
+ <case
+ latin:hasSettingsKey="false"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyLabel="„"
+ latin:keyStyle="functionalKeyStyle" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="40%p" />
+ <Key
+ latin:keyLabel="…"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="20%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ <case
+ latin:hasSettingsKey="true"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="15%p"
+ latin:keyEdgeFlags="left" />
+ <Key
+ latin:keyStyle="settingsKeyStyle" />
+ <Key
+ latin:keyLabel="„"
+ latin:keyStyle="functionalKeyStyle" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="30%p" />
+ <Key
+ latin:keyLabel="…"
+ latin:keyStyle="functionalKeyStyle" />
+ <switch>
+ <case
+ latin:mode="im"
+ >
+ <Key
+ latin:keyStyle="smileyKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </case>
+ <default>
+ <Key
+ latin:keyStyle="returnKeyStyle"
+ latin:keyWidth="25%p"
+ latin:keyEdgeFlags="right" />
+ </default>
+ </switch>
+ </case>
+ </switch>
+ </Row>
+</merge>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index e5654e96d..482b35f4c 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -20,7 +20,178 @@
<!-- The attributes in this XML file provide configuration information -->
<!-- for the Input Method Manager. -->
+<!-- Keyboard: en_US, cs, da, de, en_GB, es, es_US, fr, fr_CA, fr_CH, it, nb, nl, sr, sv -->
+<!-- Voice: cs, da, de, en_AU, en_GB, en_IN, en_NZ, en_US, es, fr, ko, ja, pl, pt, ru, tr, zh_CN, zh_TW -->
+<!-- TODO: use <lang>_keyboard icon instead of a common keyboard icon. -->
+<!-- TODO: use <lang>_mic icon instead of a common mic icon. -->
<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">
+ <!-- If IME doesn't have an applicable subtype, the first subtype will be used as a default
+ subtype.-->
+ <subtype android:icon="@drawable/ic_subtype_keyboard_en_gb"
+ android:label="@string/subtype_mode_en_US_keyboard"
+ android:imeSubtypeLocale="en_US"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_cs"
+ android:label="@string/subtype_mode_cs_keyboard"
+ android:imeSubtypeLocale="cs"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_da"
+ android:label="@string/subtype_mode_da_keyboard"
+ android:imeSubtypeLocale="da"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_de"
+ android:label="@string/subtype_mode_de_keyboard"
+ android:imeSubtypeLocale="de"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_en_gb"
+ android:label="@string/subtype_mode_en_GB_keyboard"
+ android:imeSubtypeLocale="en_GB"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_es"
+ android:label="@string/subtype_mode_es_keyboard"
+ android:imeSubtypeLocale="es"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_es_us"
+ android:label="@string/subtype_mode_es_US_keyboard"
+ android:imeSubtypeLocale="es_US"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_fr"
+ android:label="@string/subtype_mode_fr_keyboard"
+ android:imeSubtypeLocale="fr"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_fr_ca"
+ android:label="@string/subtype_mode_fr_CA_keyboard"
+ android:imeSubtypeLocale="fr_CA"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_fr_ch"
+ android:label="@string/subtype_mode_fr_CH_keyboard"
+ android:imeSubtypeLocale="fr_CH"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_it"
+ android:label="@string/subtype_mode_it_keyboard"
+ android:imeSubtypeLocale="it"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_nb"
+ android:label="@string/subtype_mode_nb_keyboard"
+ android:imeSubtypeLocale="nb"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_nl"
+ android:label="@string/subtype_mode_nl_keyboard"
+ android:imeSubtypeLocale="nl"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_ru"
+ android:label="@string/subtype_mode_ru_keyboard"
+ android:imeSubtypeLocale="ru"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_sr"
+ android:label="@string/subtype_mode_sr_keyboard"
+ android:imeSubtypeLocale="sr"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard_sv"
+ android:label="@string/subtype_mode_sv_keyboard"
+ android:imeSubtypeLocale="sv"
+ android:imeSubtypeMode="keyboard"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_cs"
+ android:label="@string/subtype_mode_cs_voice"
+ android:imeSubtypeLocale="cs"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_de"
+ android:label="@string/subtype_mode_de_voice"
+ android:imeSubtypeLocale="de"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_en_au"
+ android:label="@string/subtype_mode_en_AU_voice"
+ android:imeSubtypeLocale="en_AU"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_en_gb"
+ android:label="@string/subtype_mode_en_GB_voice"
+ android:imeSubtypeLocale="en_GB"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_en_in"
+ android:label="@string/subtype_mode_en_IN_voice"
+ android:imeSubtypeLocale="en_IN"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_en_nz"
+ android:label="@string/subtype_mode_en_NZ_voice"
+ android:imeSubtypeLocale="en_NZ"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_en_us"
+ android:label="@string/subtype_mode_en_US_voice"
+ android:imeSubtypeLocale="en_US"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_es"
+ android:label="@string/subtype_mode_es_voice"
+ android:imeSubtypeLocale="es"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_fr"
+ android:label="@string/subtype_mode_fr_voice"
+ android:imeSubtypeLocale="fr"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_ko"
+ android:label="@string/subtype_mode_ko_voice"
+ android:imeSubtypeLocale="ko"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_ja"
+ android:label="@string/subtype_mode_ja_voice"
+ android:imeSubtypeLocale="ja"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_pl"
+ android:label="@string/subtype_mode_pl_voice"
+ android:imeSubtypeLocale="pl"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_pt"
+ android:label="@string/subtype_mode_pt_voice"
+ android:imeSubtypeLocale="pt"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_ru"
+ android:label="@string/subtype_mode_ru_voice"
+ android:imeSubtypeLocale="ru"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_tr"
+ android:label="@string/subtype_mode_tr_voice"
+ android:imeSubtypeLocale="tr"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_zh_cn"
+ android:label="@string/subtype_mode_zh_CN_voice"
+ android:imeSubtypeLocale="zh_CN"
+ android:imeSubtypeMode="voice"
+ />
+ <subtype android:icon="@drawable/ic_subtype_mic_zh_tw"
+ android:label="@string/subtype_mode_zh_TW_voice"
+ android:imeSubtypeLocale="zh_TW"
+ android:imeSubtypeMode="voice"
+ />
+</input-method>
diff --git a/java/res/xml/popup_domains.xml b/java/res/xml/popup_domains.xml
deleted file mode 100644
index 4e9789ff7..000000000
--- a/java/res/xml/popup_domains.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="15%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top|bottom"
- >
- <Key
- android:keyLabel="@string/popular_domain_1"
- android:keyOutputText="@string/popular_domain_1"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="@string/popular_domain_2"
- android:keyOutputText="@string/popular_domain_2" />
- <Key
- android:keyLabel="@string/popular_domain_3"
- android:keyOutputText="@string/popular_domain_3" />
- <Key
- android:keyLabel="@string/popular_domain_4"
- android:keyOutputText="@string/popular_domain_4"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/popup_mic.xml b/java/res/xml/popup_mic.xml
deleted file mode 100644
index 5bbd7dfa5..000000000
--- a/java/res/xml/popup_mic.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top|bottom"
- >
- <Key
- android:codes="@integer/key_settings"
- android:keyIcon="@drawable/sym_keyboard_settings"
- android:keyEdgeFlags="left" />
- <Key
- android:codes="@integer/key_voice"
- android:keyIcon="@drawable/sym_keyboard_mic"
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/popup_punctuation.xml b/java/res/xml/popup_punctuation.xml
deleted file mode 100644
index c429e38bc..000000000
--- a/java/res/xml/popup_punctuation.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="10%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel=":"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="/" />
- <Key
- android:keyLabel="&amp;" />
- <Key
- android:keyLabel="(" />
- <Key
- android:keyLabel=")" />
- <Key
- android:keyLabel="-" />
- <Key
- android:keyLabel="+"
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:keyLabel=";"
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="\@" />
- <Key
- android:keyLabel="\'" />
- <Key
- android:keyLabel="&quot;" />
- <Key
- android:keyLabel="\?" />
- <Key
- android:keyLabel="!" />
- <Key
- android:keyLabel=","
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/popup_smileys.xml b/java/res/xml/popup_smileys.xml
deleted file mode 100644
index 1a14e1df1..000000000
--- a/java/res/xml/popup_smileys.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<Keyboard
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:keyWidth="15%p"
- android:horizontalGap="0px"
- android:verticalGap="0px"
- android:keyHeight="@dimen/popup_key_height"
->
- <Row
- android:rowEdgeFlags="top"
- >
- <Key
- android:keyLabel=":-)"
- android:keyOutputText=":-) "
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel=":-("
- android:keyOutputText=":-( " />
- <Key
- android:keyLabel=";-)"
- android:keyOutputText=";-) " />
- <Key
- android:keyLabel=":-P"
- android:keyOutputText=":-P " />
- <Key
- android:keyLabel="=-O"
- android:keyOutputText="=-O "
- android:keyEdgeFlags="right" />
- </Row>
- <Row>
- <Key
- android:keyLabel=":-*"
- android:keyOutputText=":-* "
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel=":O"
- android:keyOutputText=":O " />
- <Key
- android:keyLabel="B-)"
- android:keyOutputText="B-) " />
- <Key
- android:keyLabel=":-$"
- android:keyOutputText=":-$ " />
- <Key
- android:keyLabel=":-!"
- android:keyOutputText=":-! "
- android:keyEdgeFlags="right" />
- </Row>
- <Row
- android:rowEdgeFlags="bottom"
- >
- <Key
- android:keyLabel=":-["
- android:keyOutputText=":-[ "
- android:keyEdgeFlags="left" />
- <Key
- android:keyLabel="O:-)"
- android:keyOutputText="O:-) " />
- <Key
- android:keyLabel=":-\\"
- android:keyOutputText=":-\\ " />
- <Key
- android:keyLabel=":'("
- android:keyOutputText=":'( " />
- <Key
- android:keyLabel=":-D"
- android:keyOutputText=":-D "
- android:keyEdgeFlags="right" />
- </Row>
-</Keyboard>
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index 9348e954a..3b20298d2 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -34,7 +34,7 @@
android:key="popup_on"
android:title="@string/popup_on_keypress"
android:persistent="true"
- android:defaultValue="@bool/default_popup_preview"
+ android:defaultValue="@bool/config_default_popup_preview"
/>
<CheckBoxPreference
@@ -70,12 +70,14 @@
android:defaultValue="@string/voice_mode_main"
/>
-
+ <!-- TODO: Filter subtypes by IME in SubtypeEnabler -->
+ <!-- TODO: Maybe use this only for phone? -->
<PreferenceScreen
+ android:key="subtype_settings"
android:title="@string/language_selection_title"
android:summary="@string/language_selection_summary">
<intent
- android:action="com.android.inputmethod.latin.INPUT_LANGUAGE_SELECTION"/>
+ android:action="android.settings.INPUT_METHOD_AND_SUBTYPE_ENABLER"/>
</PreferenceScreen>
<PreferenceCategory
@@ -90,22 +92,40 @@
android:defaultValue="true"
/>
+ <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"
+ />
+
+ <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"
+ />
+
<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..c42fe6602 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="5"
/>
<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..26c3f3ede
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -0,0 +1,382 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.keyboard.KeyStyles.KeyStyle;
+import com.android.inputmethod.keyboard.KeyboardParser.ParseException;
+import com.android.inputmethod.latin.R;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.Xml;
+
+/**
+ * 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;
+
+ 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
+ };
+
+ /**
+ * Create an empty key with no attributes.
+ * This constructor is being used only for key in mini popup keyboard.
+ */
+ public Key(Resources res, Row row, CharSequence popupCharacter, int x, int y) {
+ mKeyboard = row.getKeyboard();
+ mHeight = row.mDefaultHeight - row.mVerticalGap;
+ mGap = row.mDefaultHorizontalGap;
+ mWidth = row.mDefaultWidth - mGap;
+ mEdgeFlags = row.mRowEdgeFlags;
+ mHintIcon = null;
+ mManualTemporaryUpperCaseHintIcon = null;
+ mManualTemporaryUpperCaseCode = 0;
+ mLabelOption = 0;
+ mModifier = false;
+ mSticky = false;
+ mRepeatable = false;
+ mPopupCharacters = null;
+ mMaxPopupColumn = 0;
+ final String popupSpecification = popupCharacter.toString();
+ mLabel = PopupCharactersParser.getLabel(popupSpecification);
+ mOutputText = PopupCharactersParser.getOutputText(popupSpecification);
+ mCode = PopupCharactersParser.getCode(res, popupSpecification);
+ mIcon = PopupCharactersParser.getIcon(res, popupSpecification);
+ // Horizontal gap is divided equally to both sides of the key.
+ mX = x + mGap / 2;
+ mY = y;
+ }
+
+ /**
+ * Create a key with the given top-left coordinate and extract its attributes from the XML
+ * parser.
+ * @param res resources associated with the caller's context
+ * @param row the row that this key belongs to. The row must already be attached to
+ * a {@link Keyboard}.
+ * @param x the x coordinate of the top-left
+ * @param y the y coordinate of the top-left
+ * @param parser the XML parser containing the attributes for this key
+ */
+ public Key(Resources res, Row row, int x, int y, XmlResourceParser parser,
+ KeyStyles keyStyles) {
+ mKeyboard = row.getKeyboard();
+
+ final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ try {
+ mHeight = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_rowHeight,
+ mKeyboard.getKeyboardHeight(), row.mDefaultHeight) - row.mVerticalGap;
+ mGap = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_horizontalGap,
+ mKeyboard.getDisplayWidth(), row.mDefaultHorizontalGap);
+ mWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_keyWidth,
+ mKeyboard.getDisplayWidth(), row.mDefaultWidth) - mGap;
+ } finally {
+ keyboardAttr.recycle();
+ }
+
+ // Horizontal gap is divided equally to both sides of the key.
+ this.mX = x + mGap / 2;
+ this.mY = y;
+
+ final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Key);
+ try {
+ final KeyStyle style;
+ if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyStyle)) {
+ String styleName = keyAttr.getString(R.styleable.Keyboard_Key_keyStyle);
+ style = keyStyles.getKeyStyle(styleName);
+ if (style == null)
+ throw new ParseException("Unknown key style: " + styleName, parser);
+ } else {
+ style = keyStyles.getEmptyKeyStyle();
+ }
+
+ mPopupCharacters = style.getTextArray(keyAttr,
+ R.styleable.Keyboard_Key_popupCharacters);
+ mMaxPopupColumn = style.getInt(keyboardAttr,
+ R.styleable.Keyboard_Key_maxPopupKeyboardColumn,
+ mKeyboard.getMaxPopupKeyboardColumn());
+
+ mRepeatable = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable, false);
+ mModifier = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isModifier, false);
+ mSticky = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky, false);
+ mEdgeFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyEdgeFlags, 0)
+ | row.mRowEdgeFlags;
+
+ mPreviewIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_iconPreview);
+ Keyboard.setDefaultBounds(mPreviewIcon);
+ mIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_keyIcon);
+ Keyboard.setDefaultBounds(mIcon);
+ mHintIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_keyHintIcon);
+ Keyboard.setDefaultBounds(mHintIcon);
+ mManualTemporaryUpperCaseHintIcon = style.getDrawable(keyAttr,
+ R.styleable.Keyboard_Key_manualTemporaryUpperCaseHintIcon);
+ Keyboard.setDefaultBounds(mManualTemporaryUpperCaseHintIcon);
+
+ mLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyLabel);
+ mLabelOption = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption, 0);
+ mManualTemporaryUpperCaseCode = style.getInt(keyAttr,
+ R.styleable.Keyboard_Key_manualTemporaryUpperCaseCode, 0);
+ 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();
+ }
+ }
+
+ public Drawable getIcon() {
+ return mIcon;
+ }
+
+ public Drawable getPreviewIcon() {
+ return mPreviewIcon;
+ }
+
+ public void setIcon(Drawable icon) {
+ mIcon = icon;
+ }
+
+ public void setPreviewIcon(Drawable icon) {
+ mPreviewIcon = icon;
+ }
+
+ /**
+ * Informs the key that it has been pressed, in case it needs to change its appearance or
+ * state.
+ * @see #onReleased(boolean)
+ */
+ public void onPressed() {
+ mPressed = !mPressed;
+ }
+
+ /**
+ * Changes the pressed state of the key. If it is a sticky key, it will also change the
+ * toggled state of the key if the finger was release inside.
+ * @param inside whether the finger was released inside the key
+ * @see #onPressed()
+ */
+ public void onReleased(boolean inside) {
+ mPressed = !mPressed;
+ if (mSticky && !mKeyboard.isShiftLockEnabled(this))
+ mOn = !mOn;
+ }
+
+ public boolean isInside(int x, int y) {
+ return mKeyboard.isInside(this, x, y);
+ }
+
+ /**
+ * Detects if a point falls on this key.
+ * @param x the x-coordinate of the point
+ * @param y the y-coordinate of the point
+ * @return whether or not the point falls on the key. If the key is attached to an edge, it will
+ * assume that all points between the key and the edge are considered to be on the key.
+ */
+ public boolean isOnKey(int x, int y) {
+ final int flags = mEdgeFlags;
+ final boolean leftEdge = (flags & Keyboard.EDGE_LEFT) != 0;
+ final boolean rightEdge = (flags & Keyboard.EDGE_RIGHT) != 0;
+ final boolean topEdge = (flags & Keyboard.EDGE_TOP) != 0;
+ final boolean bottomEdge = (flags & Keyboard.EDGE_BOTTOM) != 0;
+ final int left = this.mX;
+ final int right = left + this.mWidth;
+ final int top = this.mY;
+ final int bottom = top + this.mHeight;
+ return (x >= left || leftEdge) && (x < right || rightEdge)
+ && (y >= top || topEdge) && (y < bottom || bottomEdge);
+ }
+
+ /**
+ * Returns the square of the distance to the nearest edge of the key and the given point.
+ * @param x the x-coordinate of the point
+ * @param y the y-coordinate of the point
+ * @return the square of the distance of the point from the nearest edge of the key
+ */
+ public int squaredDistanceToEdge(int x, int y) {
+ final int left = this.mX;
+ final int right = left + this.mWidth;
+ final int top = this.mY;
+ final int bottom = top + this.mHeight;
+ final int edgeX = x < left ? left : (x > right ? right : x);
+ final int edgeY = y < top ? top : (y > bottom ? bottom : y);
+ final int dx = x - edgeX;
+ final int dy = y - edgeY;
+ return dx * dx + dy * dy;
+ }
+
+ // sticky is used for shift key. If a key is not sticky and is modifier,
+ // the key will be treated as functional.
+ private boolean isFunctionalKey() {
+ return !mSticky && mModifier;
+ }
+
+ /**
+ * Returns the drawable state for the key, based on the current state and type of the key.
+ * @return the drawable state of the key.
+ * @see android.graphics.drawable.StateListDrawable#setState(int[])
+ */
+ public int[] getCurrentDrawableState() {
+ if (isFunctionalKey()) {
+ if (mPressed) {
+ return KEY_STATE_FUNCTIONAL_PRESSED;
+ } else {
+ return KEY_STATE_FUNCTIONAL_NORMAL;
+ }
+ }
+
+ int[] states = KEY_STATE_NORMAL;
+
+ if (mOn) {
+ if (mPressed) {
+ states = KEY_STATE_PRESSED_ON;
+ } else {
+ states = KEY_STATE_NORMAL_ON;
+ }
+ } else {
+ if (mSticky) {
+ if (mPressed) {
+ states = KEY_STATE_PRESSED_OFF;
+ } else {
+ states = KEY_STATE_NORMAL_OFF;
+ }
+ } else {
+ if (mPressed) {
+ 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..777a79520 100644
--- a/java/src/com/android/inputmethod/latin/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -14,15 +14,14 @@
* the License.
*/
-package com.android.inputmethod.latin;
-
-import android.inputmethodservice.Keyboard;
-import android.inputmethodservice.Keyboard.Key;
+package com.android.inputmethod.keyboard;
import java.util.Arrays;
import java.util.List;
-abstract class KeyDetector {
+public abstract class KeyDetector {
+ public static final int NOT_A_KEY = -1;
+
protected Keyboard mKeyboard;
private Key[] mKeys;
@@ -85,7 +84,7 @@ abstract class KeyDetector {
*/
public int[] newCodeArray() {
int[] codes = new int[getMaxNearbyKeys()];
- Arrays.fill(codes, LatinKeyboardBaseView.NOT_A_KEY);
+ Arrays.fill(codes, NOT_A_KEY);
return codes;
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/KeyStyles.java
new file mode 100644
index 000000000..44ec53181
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyStyles.java
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.keyboard.KeyboardParser.ParseException;
+import com.android.inputmethod.latin.R;
+
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class KeyStyles {
+ private static final String TAG = "KeyStyles";
+ private static final boolean DEBUG = false;
+
+ private final HashMap<String, DeclaredKeyStyle> mStyles =
+ new HashMap<String, DeclaredKeyStyle>();
+ private static final KeyStyle EMPTY_KEY_STYLE = new EmptyKeyStyle();
+
+ public interface KeyStyle {
+ public CharSequence[] getTextArray(TypedArray a, int index);
+ public Drawable getDrawable(TypedArray a, int index);
+ public CharSequence getText(TypedArray a, int index);
+ public int getInt(TypedArray a, int index, int defaultValue);
+ public int getFlag(TypedArray a, int index, int defaultValue);
+ public boolean getBoolean(TypedArray a, int index, boolean defaultValue);
+ }
+
+ /* package */ static class EmptyKeyStyle implements KeyStyle {
+ private EmptyKeyStyle() {
+ // Nothing to do.
+ }
+
+ @Override
+ public CharSequence[] getTextArray(TypedArray a, int index) {
+ return parseTextArray(a, index);
+ }
+
+ @Override
+ public Drawable getDrawable(TypedArray a, int index) {
+ return a.getDrawable(index);
+ }
+
+ @Override
+ public CharSequence getText(TypedArray a, int index) {
+ return a.getText(index);
+ }
+
+ @Override
+ public int getInt(TypedArray a, int index, int defaultValue) {
+ return a.getInt(index, defaultValue);
+ }
+
+ @Override
+ public int getFlag(TypedArray a, int index, int defaultValue) {
+ return a.getInt(index, defaultValue);
+ }
+
+ @Override
+ public boolean getBoolean(TypedArray a, int index, boolean defaultValue) {
+ return a.getBoolean(index, defaultValue);
+ }
+
+ protected static CharSequence[] parseTextArray(TypedArray a, int index) {
+ if (!a.hasValue(index))
+ return null;
+ final CharSequence text = a.getText(index);
+ return parseCsvText(text);
+ }
+
+ /* package */ static CharSequence[] parseCsvText(CharSequence text) {
+ final int size = text.length();
+ if (size == 0) return null;
+ if (size == 1) return new CharSequence[] { text };
+ final StringBuilder sb = new StringBuilder();
+ ArrayList<CharSequence> list = null;
+ int start = 0;
+ for (int pos = 0; pos < size; pos++) {
+ final char c = text.charAt(pos);
+ if (c == ',') {
+ if (list == null) list = new ArrayList<CharSequence>();
+ if (sb.length() == 0) {
+ list.add(text.subSequence(start, pos));
+ } else {
+ list.add(sb.toString());
+ sb.setLength(0);
+ }
+ start = pos + 1;
+ continue;
+ } else if (c == '\\') {
+ if (start == pos) {
+ // Skip escape character at the beginning of the value.
+ start++;
+ pos++;
+ } else {
+ if (start < pos && sb.length() == 0)
+ sb.append(text.subSequence(start, pos));
+ pos++;
+ if (pos < size)
+ sb.append(text.charAt(pos));
+ }
+ } else if (sb.length() > 0) {
+ sb.append(c);
+ }
+ }
+ if (list == null) {
+ return new CharSequence[] { sb.length() > 0 ? sb : text.subSequence(start, size) };
+ } else {
+ list.add(sb.length() > 0 ? sb : text.subSequence(start, size));
+ return list.toArray(new CharSequence[list.size()]);
+ }
+ }
+ }
+
+ private static class DeclaredKeyStyle extends EmptyKeyStyle {
+ private final HashMap<Integer, Object> mAttributes = new HashMap<Integer, Object>();
+
+ @Override
+ public CharSequence[] getTextArray(TypedArray a, int index) {
+ return a.hasValue(index)
+ ? super.getTextArray(a, index) : (CharSequence[])mAttributes.get(index);
+ }
+
+ @Override
+ public Drawable getDrawable(TypedArray a, int index) {
+ return a.hasValue(index)
+ ? super.getDrawable(a, index) : (Drawable)mAttributes.get(index);
+ }
+
+ @Override
+ public CharSequence getText(TypedArray a, int index) {
+ return a.hasValue(index)
+ ? super.getText(a, index) : (CharSequence)mAttributes.get(index);
+ }
+
+ @Override
+ public int getInt(TypedArray a, int index, int defaultValue) {
+ final Integer value = (Integer)mAttributes.get(index);
+ return super.getInt(a, index, (value != null) ? value : defaultValue);
+ }
+
+ @Override
+ public int getFlag(TypedArray a, int index, int defaultValue) {
+ final Integer value = (Integer)mAttributes.get(index);
+ return super.getFlag(a, index, defaultValue) | (value != null ? value : 0);
+ }
+
+ @Override
+ public boolean getBoolean(TypedArray a, int index, boolean defaultValue) {
+ final Boolean value = (Boolean)mAttributes.get(index);
+ return super.getBoolean(a, index, (value != null) ? value : defaultValue);
+ }
+
+ private DeclaredKeyStyle() {
+ super();
+ }
+
+ private void parseKeyStyleAttributes(TypedArray keyAttr) {
+ // TODO: Currently not all Key attributes can be declared as style.
+ readInt(keyAttr, R.styleable.Keyboard_Key_code);
+ readText(keyAttr, R.styleable.Keyboard_Key_keyLabel);
+ readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption);
+ readTextArray(keyAttr, R.styleable.Keyboard_Key_popupCharacters);
+ readInt(keyAttr, R.styleable.Keyboard_Key_maxPopupKeyboardColumn);
+ readText(keyAttr, R.styleable.Keyboard_Key_keyOutputText);
+ readDrawable(keyAttr, R.styleable.Keyboard_Key_keyIcon);
+ readDrawable(keyAttr, R.styleable.Keyboard_Key_iconPreview);
+ readDrawable(keyAttr, R.styleable.Keyboard_Key_keyHintIcon);
+ readDrawable(keyAttr, R.styleable.Keyboard_Key_shiftedIcon);
+ readBoolean(keyAttr, R.styleable.Keyboard_Key_isModifier);
+ readBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky);
+ readBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable);
+ }
+
+ private void readDrawable(TypedArray a, int index) {
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getDrawable(index));
+ }
+
+ private void readText(TypedArray a, int index) {
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getText(index));
+ }
+
+ private void readInt(TypedArray a, int index) {
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getInt(index, 0));
+ }
+
+ private void readFlag(TypedArray a, int index) {
+ final Integer value = (Integer)mAttributes.get(index);
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getInt(index, 0) | (value != null ? value : 0));
+ }
+
+ private void readBoolean(TypedArray a, int index) {
+ if (a.hasValue(index))
+ mAttributes.put(index, a.getBoolean(index, false));
+ }
+
+ private void readTextArray(TypedArray a, int index) {
+ final CharSequence[] value = parseTextArray(a, index);
+ if (value != null)
+ mAttributes.put(index, value);
+ }
+
+ private void addParent(DeclaredKeyStyle parentStyle) {
+ mAttributes.putAll(parentStyle.mAttributes);
+ }
+ }
+
+ public void parseKeyStyleAttributes(TypedArray keyStyleAttr, TypedArray keyAttrs,
+ XmlResourceParser parser) {
+ String styleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_styleName);
+ if (DEBUG) Log.d(TAG, String.format("<%s styleName=%s />",
+ KeyboardParser.TAG_KEY_STYLE, styleName));
+ if (mStyles.containsKey(styleName))
+ throw new ParseException("duplicate key style declared: " + styleName, parser);
+
+ final DeclaredKeyStyle style = new DeclaredKeyStyle();
+ if (keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_parentStyle)) {
+ String parentStyle = keyStyleAttr.getString(
+ R.styleable.Keyboard_KeyStyle_parentStyle);
+ final DeclaredKeyStyle parent = mStyles.get(parentStyle);
+ if (parent == null)
+ throw new ParseException("Unknown parentStyle " + parent, parser);
+ style.addParent(parent);
+ }
+ style.parseKeyStyleAttributes(keyAttrs);
+ mStyles.put(styleName, style);
+ }
+
+ public KeyStyle getKeyStyle(String styleName) {
+ return mStyles.get(styleName);
+ }
+
+ public KeyStyle getEmptyKeyStyle() {
+ return EMPTY_KEY_STYLE;
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
new file mode 100644
index 000000000..ae1d302db
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -0,0 +1,424 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard
+ * consists of rows of keys.
+ * <p>The layout file for a keyboard contains XML that looks like the following snippet:</p>
+ * <pre>
+ * &lt;Keyboard
+ * latin:keyWidth="%10p"
+ * latin:keyHeight="50px"
+ * latin:horizontalGap="2px"
+ * latin:verticalGap="2px" &gt;
+ * &lt;Row latin:keyWidth="32px" &gt;
+ * &lt;Key latin:keyLabel="A" /&gt;
+ * ...
+ * &lt;/Row&gt;
+ * ...
+ * &lt;/Keyboard&gt;
+ * </pre>
+ */
+public class Keyboard {
+ private static final String TAG = "Keyboard";
+
+ public static final int EDGE_LEFT = 0x01;
+ public static final int EDGE_RIGHT = 0x02;
+ public static final int EDGE_TOP = 0x04;
+ public static final int EDGE_BOTTOM = 0x08;
+
+ /** Some common keys code. These should be aligned with values/keycodes.xml */
+ public static final int CODE_ENTER = '\n';
+ public static final int CODE_TAB = '\t';
+ public static final int CODE_SPACE = ' ';
+ public static final int CODE_PERIOD = '.';
+
+ /** Special keys code. These should be aligned with values/keycodes.xml */
+ public static final int CODE_DUMMY = 0;
+ public static final int CODE_SHIFT = -1;
+ public static final int CODE_SWITCH_ALPHA_SYMBOL = -2;
+ public static final int CODE_CANCEL = -3;
+ public static final int CODE_DONE = -4;
+ public static final int CODE_DELETE = -5;
+ public static final int CODE_ALT = -6;
+ // Code value representing the code is not specified.
+ public static final int CODE_UNSPECIFIED = -99;
+ public static final int CODE_SETTINGS = -100;
+ public static final int CODE_SETTINGS_LONGPRESS = -101;
+ // TODO: remove this once LatinIME stops referring to this.
+ public static final int CODE_VOICE = -102;
+ public static final int CODE_CAPSLOCK = -103;
+ public static final int CODE_NEXT_LANGUAGE = -104;
+ public static final int CODE_PREV_LANGUAGE = -105;
+
+ /** Horizontal gap default for all rows */
+ private int mDefaultHorizontalGap;
+
+ /** Default key width */
+ private int mDefaultWidth;
+
+ /** Default key height */
+ private int mDefaultHeight;
+
+ /** Default gap between rows */
+ private int mDefaultVerticalGap;
+
+ /** Popup keyboard template */
+ private int mPopupKeyboardResId;
+
+ /** Maximum column for popup keyboard */
+ private int mMaxPopupColumn;
+
+ /** List of shift keys in this keyboard and its icons and state */
+ private final List<Key> mShiftKeys = new ArrayList<Key>();
+ private final HashMap<Key, Drawable> mShiftedIcons = new HashMap<Key, Drawable>();
+ private final HashMap<Key, Drawable> mNormalShiftIcons = new HashMap<Key, Drawable>();
+ private final HashSet<Key> mShiftLockEnabled = new HashSet<Key>();
+ private final KeyboardShiftState mShiftState = new KeyboardShiftState();
+
+ /** Space key and its icons */
+ protected Key mSpaceKey;
+ protected Drawable mSpaceIcon;
+ protected Drawable mSpacePreviewIcon;
+
+ /** Total height of the keyboard, including the padding and keys */
+ private int mTotalHeight;
+
+ /**
+ * Total width (minimum width) of the keyboard, including left side gaps and keys, but not any
+ * gaps on the right side.
+ */
+ private int mMinWidth;
+
+ /** List of keys in this keyboard */
+ private final List<Key> mKeys = new ArrayList<Key>();
+
+ /** Width of the screen available to fit the keyboard */
+ private final int mDisplayWidth;
+
+ /** Height of the screen */
+ private final int mDisplayHeight;
+
+ /** Height of keyboard */
+ private int mKeyboardHeight;
+
+ public final KeyboardId mId;
+
+ // Variables for pre-computing nearest keys.
+
+ public final int GRID_WIDTH;
+ public final int GRID_HEIGHT;
+ private final int GRID_SIZE;
+ private int mCellWidth;
+ private int mCellHeight;
+ private int[][] mGridNeighbors;
+ private int mProximityThreshold;
+ private static int[] EMPTY_INT_ARRAY = new int[0];
+ /** Number of key widths from current touch point to search for nearest keys. */
+ private static float SEARCH_DISTANCE = 1.2f;
+
+ /**
+ * Creates a keyboard from the given xml key layout file.
+ * @param context the application or service context
+ * @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
+ * @param id keyboard identifier
+ */
+ public Keyboard(Context context, int xmlLayoutResId, KeyboardId id) {
+ this(context, xmlLayoutResId, id,
+ context.getResources().getDisplayMetrics().widthPixels,
+ context.getResources().getDisplayMetrics().heightPixels);
+ }
+
+ private Keyboard(Context context, int xmlLayoutResId, KeyboardId id, int width,
+ int height) {
+ Resources res = context.getResources();
+ GRID_WIDTH = res.getInteger(R.integer.config_keyboard_grid_width);
+ GRID_HEIGHT = res.getInteger(R.integer.config_keyboard_grid_height);
+ GRID_SIZE = GRID_WIDTH * GRID_HEIGHT;
+
+ mDisplayWidth = width;
+ mDisplayHeight = height;
+
+ mDefaultHorizontalGap = 0;
+ setKeyWidth(mDisplayWidth / 10);
+ mDefaultVerticalGap = 0;
+ mDefaultHeight = mDefaultWidth;
+ mId = id;
+ loadKeyboard(context, xmlLayoutResId);
+ }
+
+ public List<Key> getKeys() {
+ return mKeys;
+ }
+
+ public int getHorizontalGap() {
+ return mDefaultHorizontalGap;
+ }
+
+ public void setHorizontalGap(int gap) {
+ mDefaultHorizontalGap = gap;
+ }
+
+ public int getVerticalGap() {
+ return mDefaultVerticalGap;
+ }
+
+ public void setVerticalGap(int gap) {
+ mDefaultVerticalGap = gap;
+ }
+
+ public int getRowHeight() {
+ return mDefaultHeight;
+ }
+
+ public void setRowHeight(int height) {
+ mDefaultHeight = height;
+ }
+
+ public int getKeyWidth() {
+ return mDefaultWidth;
+ }
+
+ public void setKeyWidth(int width) {
+ mDefaultWidth = width;
+ final int threshold = (int) (width * SEARCH_DISTANCE);
+ mProximityThreshold = threshold * threshold;
+ }
+
+ /**
+ * Returns the total height of the keyboard
+ * @return the total height of the keyboard
+ */
+ public int getHeight() {
+ return mTotalHeight;
+ }
+
+ public void setHeight(int height) {
+ mTotalHeight = height;
+ }
+
+ public int getMinWidth() {
+ return mMinWidth;
+ }
+
+ public void setMinWidth(int minWidth) {
+ mMinWidth = minWidth;
+ }
+
+ public int getDisplayHeight() {
+ return mDisplayHeight;
+ }
+
+ public int getDisplayWidth() {
+ return mDisplayWidth;
+ }
+
+ public int getKeyboardHeight() {
+ return mKeyboardHeight;
+ }
+
+ public void setKeyboardHeight(int height) {
+ mKeyboardHeight = height;
+ }
+
+ public int getPopupKeyboardResId() {
+ return mPopupKeyboardResId;
+ }
+
+ public void setPopupKeyboardResId(int resId) {
+ mPopupKeyboardResId = resId;
+ }
+
+ public int getMaxPopupKeyboardColumn() {
+ return mMaxPopupColumn;
+ }
+
+ public void setMaxPopupKeyboardColumn(int column) {
+ mMaxPopupColumn = column;
+ }
+
+ public List<Key> getShiftKeys() {
+ return mShiftKeys;
+ }
+
+ public Map<Key, Drawable> getShiftedIcons() {
+ return mShiftedIcons;
+ }
+
+ public void enableShiftLock() {
+ for (final Key key : getShiftKeys()) {
+ mShiftLockEnabled.add(key);
+ mNormalShiftIcons.put(key, key.getIcon());
+ }
+ }
+
+ public boolean isShiftLockEnabled(Key key) {
+ return mShiftLockEnabled.contains(key);
+ }
+
+ public boolean setShiftLocked(boolean newShiftLockState) {
+ final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
+ for (final Key key : getShiftKeys()) {
+ key.mOn = newShiftLockState;
+ key.setIcon(newShiftLockState ? shiftedIcons.get(key) : mNormalShiftIcons.get(key));
+ }
+ mShiftState.setShiftLocked(newShiftLockState);
+ return true;
+ }
+
+ public boolean isShiftLocked() {
+ return mShiftState.isShiftLocked();
+ }
+
+ public boolean setShifted(boolean newShiftState) {
+ final Map<Key, Drawable> shiftedIcons = getShiftedIcons();
+ for (final Key key : getShiftKeys()) {
+ if (!newShiftState && !mShiftState.isShiftLocked()) {
+ key.setIcon(mNormalShiftIcons.get(key));
+ } else if (newShiftState && !mShiftState.isShiftedOrShiftLocked()) {
+ key.setIcon(shiftedIcons.get(key));
+ }
+ }
+ return mShiftState.setShifted(newShiftState);
+ }
+
+ public boolean isShiftedOrShiftLocked() {
+ return mShiftState.isShiftedOrShiftLocked();
+ }
+
+ public void setAutomaticTemporaryUpperCase() {
+ setShifted(true);
+ mShiftState.setAutomaticTemporaryUpperCase();
+ }
+
+ public boolean isAutomaticTemporaryUpperCase() {
+ return isAlphaKeyboard() && mShiftState.isAutomaticTemporaryUpperCase();
+ }
+
+ public boolean isManualTemporaryUpperCase() {
+ return isAlphaKeyboard() && mShiftState.isManualTemporaryUpperCase();
+ }
+
+ public 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();
+ }
+
+ public void setSpaceKey(Key space) {
+ mSpaceKey = space;
+ mSpaceIcon = space.getIcon();
+ mSpacePreviewIcon = space.getPreviewIcon();
+ }
+
+ private void computeNearestNeighbors() {
+ // Round-up so we don't have any pixels outside the grid
+ mCellWidth = (getMinWidth() + GRID_WIDTH - 1) / GRID_WIDTH;
+ mCellHeight = (getHeight() + GRID_HEIGHT - 1) / GRID_HEIGHT;
+ mGridNeighbors = new int[GRID_SIZE][];
+ final int[] indices = new int[mKeys.size()];
+ final int gridWidth = GRID_WIDTH * mCellWidth;
+ final int gridHeight = GRID_HEIGHT * mCellHeight;
+ final int threshold = mProximityThreshold;
+ for (int x = 0; x < gridWidth; x += mCellWidth) {
+ for (int y = 0; y < gridHeight; y += mCellHeight) {
+ final int centerX = x + mCellWidth / 2;
+ final int centerY = y + mCellHeight / 2;
+ int count = 0;
+ for (int i = 0; i < mKeys.size(); i++) {
+ final Key key = mKeys.get(i);
+ if (key.squaredDistanceToEdge(centerX, centerY) < threshold)
+ indices[count++] = i;
+ }
+ final int[] cell = new int[count];
+ System.arraycopy(indices, 0, cell, 0, count);
+ mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell;
+ }
+ }
+ }
+
+ public boolean isInside(Key key, int x, int y) {
+ return key.isOnKey(x, y);
+ }
+
+ /**
+ * Returns the indices of the keys that are closest to the given point.
+ * @param x the x-coordinate of the point
+ * @param y the y-coordinate of the point
+ * @return the array of integer indices for the nearest keys to the given point. If the given
+ * point is out of range, then an array of size zero is returned.
+ */
+ public int[] getNearestKeys(int x, int y) {
+ if (mGridNeighbors == null) computeNearestNeighbors();
+ if (x >= 0 && x < getMinWidth() && y >= 0 && y < getHeight()) {
+ int index = (y / mCellHeight) * GRID_WIDTH + (x / mCellWidth);
+ if (index < GRID_SIZE) {
+ return mGridNeighbors[index];
+ }
+ }
+ return EMPTY_INT_ARRAY;
+ }
+
+ private void loadKeyboard(Context context, int xmlLayoutResId) {
+ try {
+ KeyboardParser parser = new KeyboardParser(this, context.getResources());
+ parser.parseKeyboard(xmlLayoutResId);
+ // mMinWidth is the width of this keyboard which is maximum width of row.
+ mMinWidth = parser.getMaxRowWidth();
+ mTotalHeight = parser.getTotalHeight();
+ } catch (XmlPullParserException e) {
+ Log.w(TAG, "keyboard XML parse error: " + e);
+ throw new IllegalArgumentException(e);
+ } catch (IOException e) {
+ Log.w(TAG, "keyboard XML parse error: " + e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected static void setDefaultBounds(Drawable drawable) {
+ if (drawable != null)
+ drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
+ drawable.getIntrinsicHeight());
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
new file mode 100644
index 000000000..848cc9693
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+public interface KeyboardActionListener {
+
+ /**
+ * Called when the user presses a key. This is sent before the
+ * {@link #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 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 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 onCodeInput(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 onTextInput(CharSequence text);
+
+ /**
+ * Called when user released a finger outside any key.
+ */
+ void onCancelInput();
+
+ /**
+ * Called when the user quickly moves the finger from up to down.
+ */
+ void onSwipeDown();
+}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
new file mode 100644
index 000000000..db86740c3
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import android.view.inputmethod.EditorInfo;
+
+import java.util.Arrays;
+import java.util.Locale;
+
+/**
+ * Represents the parameters necessary to construct a new LatinKeyboard,
+ * which also serve as a unique identifier for each keyboard type.
+ */
+public class KeyboardId {
+ public static final int MODE_TEXT = 0;
+ public static final int MODE_URL = 1;
+ public static final int MODE_EMAIL = 2;
+ public static final int MODE_IM = 3;
+ public static final int MODE_WEB = 4;
+ public static final int MODE_PHONE = 5;
+ public static final int MODE_NUMBER = 6;
+
+ public final Locale mLocale;
+ public final int mOrientation;
+ public final int mMode;
+ public final int mXmlId;
+ public final int mColorScheme;
+ public final boolean mHasSettingsKey;
+ public final boolean mVoiceKeyEnabled;
+ public final boolean mHasVoiceKey;
+ public final int mImeOptions;
+ public final boolean mEnableShiftLock;
+ public final String mXmlName;
+
+ private final int mHashCode;
+
+ public KeyboardId(String xmlName, int xmlId, Locale locale, int orientation, int mode,
+ int colorScheme, boolean hasSettingsKey, boolean voiceKeyEnabled, boolean hasVoiceKey,
+ int imeOptions, boolean enableShiftLock) {
+ this.mLocale = locale;
+ this.mOrientation = orientation;
+ this.mMode = mode;
+ this.mXmlId = xmlId;
+ this.mColorScheme = colorScheme;
+ this.mHasSettingsKey = hasSettingsKey;
+ this.mVoiceKeyEnabled = voiceKeyEnabled;
+ this.mHasVoiceKey = hasVoiceKey;
+ // We are interested only in IME_MASK_ACTION enum value and IME_FLAG_NO_ENTER_ACTION.
+ this.mImeOptions = imeOptions
+ & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION);
+ this.mEnableShiftLock = enableShiftLock;
+ this.mXmlName = xmlName;
+
+ this.mHashCode = Arrays.hashCode(new Object[] {
+ locale,
+ orientation,
+ mode,
+ xmlId,
+ colorScheme,
+ hasSettingsKey,
+ voiceKeyEnabled,
+ hasVoiceKey,
+ imeOptions,
+ enableShiftLock,
+ });
+ }
+
+ public int getXmlId() {
+ return mXmlId;
+ }
+
+ public boolean isAlphabetKeyboard() {
+ return mXmlId == R.xml.kbd_qwerty;
+ }
+
+ public boolean isSymbolsKeyboard() {
+ return mXmlId == R.xml.kbd_symbols;
+ }
+
+ public boolean isPhoneKeyboard() {
+ return mMode == MODE_PHONE;
+ }
+
+ public boolean isNumberKeyboard() {
+ return mMode == MODE_NUMBER;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other instanceof KeyboardId && equals((KeyboardId) other);
+ }
+
+ boolean equals(KeyboardId other) {
+ return other.mLocale.equals(this.mLocale)
+ && other.mOrientation == this.mOrientation
+ && other.mMode == this.mMode
+ && other.mXmlId == this.mXmlId
+ && other.mColorScheme == this.mColorScheme
+ && other.mHasSettingsKey == this.mHasSettingsKey
+ && other.mVoiceKeyEnabled == this.mVoiceKeyEnabled
+ && other.mHasVoiceKey == this.mHasVoiceKey
+ && other.mImeOptions == this.mImeOptions
+ && other.mEnableShiftLock == this.mEnableShiftLock;
+ }
+
+ @Override
+ public int hashCode() {
+ return mHashCode;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("[%s.xml %s %s %s imeOptions=%s %s%s%s%s%s]",
+ mXmlName,
+ mLocale,
+ (mOrientation == 1 ? "port" : "land"),
+ modeName(mMode),
+ imeOptionsName(mImeOptions),
+ colorSchemeName(mColorScheme),
+ (mHasSettingsKey ? " hasSettingsKey" : ""),
+ (mVoiceKeyEnabled ? " voiceKeyEnabled" : ""),
+ (mHasVoiceKey ? " hasVoiceKey" : ""),
+ (mEnableShiftLock ? " enableShiftLock" : ""));
+ }
+
+ public static String modeName(int mode) {
+ switch (mode) {
+ case MODE_TEXT: return "text";
+ case MODE_URL: return "url";
+ case MODE_EMAIL: return "email";
+ case MODE_IM: return "im";
+ case MODE_WEB: return "web";
+ case MODE_PHONE: return "phone";
+ case MODE_NUMBER: return "number";
+ }
+ return null;
+ }
+
+ public static String colorSchemeName(int colorScheme) {
+ switch (colorScheme) {
+ case KeyboardView.COLOR_SCHEME_WHITE: return "white";
+ case KeyboardView.COLOR_SCHEME_BLACK: return "black";
+ }
+ return null;
+ }
+
+ public static String imeOptionsName(int imeOptions) {
+ if (imeOptions == -1) return null;
+ final int actionNo = imeOptions & EditorInfo.IME_MASK_ACTION;
+ final String action;
+ switch (actionNo) {
+ case EditorInfo.IME_ACTION_UNSPECIFIED: action = "actionUnspecified"; break;
+ case EditorInfo.IME_ACTION_NONE: action = "actionNone"; break;
+ case EditorInfo.IME_ACTION_GO: action = "actionGo"; break;
+ case EditorInfo.IME_ACTION_SEARCH: action = "actionSearch"; break;
+ case EditorInfo.IME_ACTION_SEND: action = "actionSend"; break;
+ case EditorInfo.IME_ACTION_DONE: action = "actionDone"; break;
+ case EditorInfo.IME_ACTION_PREVIOUS: action = "actionPrevious"; break;
+ default: action = "actionUnknown(" + actionNo + ")"; break;
+ }
+ if ((imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
+ return "flagNoEnterAction|" + action;
+ } else {
+ return action;
+ }
+ }
+}
+
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
new file mode 100644
index 000000000..c41d57075
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
@@ -0,0 +1,580 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.util.Log;
+import android.util.TypedValue;
+import android.util.Xml;
+import android.view.InflateException;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Parser for BaseKeyboard.
+ *
+ * This class parses Keyboard XML file and fill out keys in Keyboard.
+ * The Keyboard XML file looks like:
+ * <pre>
+ * &gt;!-- xml/keyboard.xml --&lt;
+ * &gt;Keyboard keyboard_attributes*&lt;
+ * &gt;!-- Keyboard Content --&lt;
+ * &gt;Row row_attributes*&lt;
+ * &gt;!-- Row Content --&lt;
+ * &gt;Key key_attributes* /&lt;
+ * &gt;Spacer horizontalGap="0.2in" /&lt;
+ * &gt;include keyboardLayout="@xml/other_keys"&lt;
+ * ...
+ * &gt;/Row&lt;
+ * &gt;include keyboardLayout="@xml/other_rows"&lt;
+ * ...
+ * &gt;/Keyboard&lt;
+ * </pre>
+ * The XML file which is included in other file must have &gt;merge&lt; as root element, such as:
+ * <pre>
+ * &gt;!-- xml/other_keys.xml --&lt;
+ * &gt;merge&lt;
+ * &gt;Key key_attributes* /&lt;
+ * ...
+ * &gt;/merge&lt;
+ * </pre>
+ * and
+ * <pre>
+ * &gt;!-- xml/other_rows.xml --&lt;
+ * &gt;merge&lt;
+ * &gt;Row row_attributes*&lt;
+ * &gt;Key key_attributes* /&lt;
+ * &gt;/Row&lt;
+ * ...
+ * &gt;/merge&lt;
+ * </pre>
+ * You can also use switch-case-default tags to select Rows and Keys.
+ * <pre>
+ * &gt;switch&lt;
+ * &gt;case case_attribute*&lt;
+ * &gt;!-- Any valid tags at switch position --&lt;
+ * &gt;/case&lt;
+ * ...
+ * &gt;default&lt;
+ * &gt;!-- Any valid tags at switch position --&lt;
+ * &gt;/default&lt;
+ * &gt;/switch&lt;
+ * </pre>
+ * You can declare Key style and specify styles within Key tags.
+ * <pre>
+ * &gt;switch&lt;
+ * &gt;case colorScheme="white"&lt;
+ * &gt;key-style styleName="shift-key" parentStyle="modifier-key"
+ * keyIcon="@drawable/sym_keyboard_shift"
+ * /&lt;
+ * &gt;/case&lt;
+ * &gt;case colorScheme="black"&lt;
+ * &gt;key-style styleName="shift-key" parentStyle="modifier-key"
+ * keyIcon="@drawable/sym_bkeyboard_shift"
+ * /&lt;
+ * &gt;/case&lt;
+ * &gt;/switch&lt;
+ * ...
+ * &gt;Key keyStyle="shift-key" ... /&lt;
+ * </pre>
+ */
+
+public class KeyboardParser {
+ private static final String TAG = "KeyboardParser";
+ private static final boolean DEBUG = false;
+
+ // Keyboard XML Tags
+ private static final String TAG_KEYBOARD = "Keyboard";
+ private static final String TAG_ROW = "Row";
+ private static final String TAG_KEY = "Key";
+ private static final String TAG_SPACER = "Spacer";
+ private static final String TAG_INCLUDE = "include";
+ private static final String TAG_MERGE = "merge";
+ private static final String TAG_SWITCH = "switch";
+ private static final String TAG_CASE = "case";
+ private static final String TAG_DEFAULT = "default";
+ public static final String TAG_KEY_STYLE = "key-style";
+
+ private final Keyboard mKeyboard;
+ private final Resources mResources;
+
+ private int mCurrentX = 0;
+ private int mCurrentY = 0;
+ private int mMaxRowWidth = 0;
+ private int mTotalHeight = 0;
+ private Row mCurrentRow = null;
+ private final KeyStyles mKeyStyles = new KeyStyles();
+
+ public KeyboardParser(Keyboard keyboard, Resources res) {
+ mKeyboard = keyboard;
+ mResources = res;
+ }
+
+ public int getMaxRowWidth() {
+ return mMaxRowWidth;
+ }
+
+ public int getTotalHeight() {
+ return mTotalHeight;
+ }
+
+ public void parseKeyboard(int resId) throws XmlPullParserException, IOException {
+ if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_KEYBOARD, mKeyboard.mId));
+ final XmlResourceParser parser = mResources.getXml(resId);
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_KEYBOARD.equals(tag)) {
+ parseKeyboardAttributes(parser);
+ parseKeyboardContent(parser, mKeyboard.getKeys());
+ break;
+ } else {
+ throw new IllegalStartTag(parser, TAG_KEYBOARD);
+ }
+ }
+ }
+ }
+
+ private void parseKeyboardAttributes(XmlResourceParser parser) {
+ final Keyboard keyboard = mKeyboard;
+ final TypedArray keyboardAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Key);
+ try {
+ final int displayHeight = keyboard.getDisplayHeight();
+ final int keyboardHeight = (int)keyboardAttr.getDimension(
+ R.styleable.Keyboard_keyboardHeight, displayHeight / 2);
+ final int maxKeyboardHeight = getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_maxKeyboardHeight, displayHeight, displayHeight / 2);
+ // Keyboard height will not exceed maxKeyboardHeight.
+ final int height = Math.min(keyboardHeight, maxKeyboardHeight);
+ final int width = keyboard.getDisplayWidth();
+
+ keyboard.setKeyboardHeight(height);
+ keyboard.setKeyWidth(getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_keyWidth, width, width / 10));
+ keyboard.setRowHeight(getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_rowHeight, height, 50));
+ keyboard.setHorizontalGap(getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_horizontalGap, width, 0));
+ keyboard.setVerticalGap(getDimensionOrFraction(keyboardAttr,
+ R.styleable.Keyboard_verticalGap, height, 0));
+ keyboard.setPopupKeyboardResId(keyboardAttr.getResourceId(
+ R.styleable.Keyboard_popupKeyboardTemplate, 0));
+
+ keyboard.setMaxPopupKeyboardColumn(keyAttr.getInt(
+ R.styleable.Keyboard_Key_maxPopupKeyboardColumn, 5));
+ } finally {
+ keyAttr.recycle();
+ keyboardAttr.recycle();
+ }
+ }
+
+ private void parseKeyboardContent(XmlResourceParser parser, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_ROW.equals(tag)) {
+ Row row = new Row(mResources, mKeyboard, parser);
+ if (DEBUG) Log.d(TAG, String.format("<%s>", TAG_ROW));
+ if (keys != null)
+ startRow(row);
+ parseRowContent(parser, row, keys);
+ } else if (TAG_INCLUDE.equals(tag)) {
+ parseIncludeKeyboardContent(parser, keys);
+ } else if (TAG_SWITCH.equals(tag)) {
+ parseSwitchKeyboardContent(parser, keys);
+ } else if (TAG_KEY_STYLE.equals(tag)) {
+ parseKeyStyle(parser, keys);
+ } else {
+ throw new IllegalStartTag(parser, TAG_ROW);
+ }
+ } else if (event == XmlPullParser.END_TAG) {
+ final String tag = parser.getName();
+ if (TAG_KEYBOARD.equals(tag)) {
+ endKeyboard(mKeyboard.getVerticalGap());
+ break;
+ } else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag)
+ || TAG_MERGE.equals(tag)) {
+ if (DEBUG) Log.d(TAG, String.format("</%s>", tag));
+ break;
+ } else if (TAG_KEY_STYLE.equals(tag)) {
+ continue;
+ } else {
+ throw new IllegalEndTag(parser, TAG_ROW);
+ }
+ }
+ }
+ }
+
+ private void parseRowContent(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_KEY.equals(tag)) {
+ parseKey(parser, row, keys);
+ } else if (TAG_SPACER.equals(tag)) {
+ parseSpacer(parser, keys);
+ } else if (TAG_INCLUDE.equals(tag)) {
+ parseIncludeRowContent(parser, row, keys);
+ } else if (TAG_SWITCH.equals(tag)) {
+ parseSwitchRowContent(parser, row, keys);
+ } else if (TAG_KEY_STYLE.equals(tag)) {
+ parseKeyStyle(parser, keys);
+ } else {
+ throw new IllegalStartTag(parser, TAG_KEY);
+ }
+ } else if (event == XmlPullParser.END_TAG) {
+ final String tag = parser.getName();
+ if (TAG_ROW.equals(tag)) {
+ if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_ROW));
+ if (keys != null)
+ endRow();
+ break;
+ } else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag)
+ || TAG_MERGE.equals(tag)) {
+ if (DEBUG) Log.d(TAG, String.format("</%s>", tag));
+ break;
+ } else if (TAG_KEY_STYLE.equals(tag)) {
+ continue;
+ } else {
+ throw new IllegalEndTag(parser, TAG_KEY);
+ }
+ }
+ }
+ }
+
+ private void parseKey(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (keys == null) {
+ checkEndTag(TAG_KEY, parser);
+ } else {
+ Key key = new Key(mResources, row, mCurrentX, mCurrentY, parser, mKeyStyles);
+ if (DEBUG) Log.d(TAG, String.format("<%s keyLabel=%s code=%d popupCharacters=%s />",
+ TAG_KEY, key.mLabel, key.mCode,
+ Arrays.toString(key.mPopupCharacters)));
+ checkEndTag(TAG_KEY, parser);
+ keys.add(key);
+ if (key.mCode == Keyboard.CODE_SHIFT)
+ mKeyboard.getShiftKeys().add(key);
+ if (key.mCode == Keyboard.CODE_SPACE)
+ mKeyboard.setSpaceKey(key);
+ endKey(key);
+ }
+ }
+
+ private void parseSpacer(XmlResourceParser parser, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (keys == null) {
+ checkEndTag(TAG_SPACER, parser);
+ } else {
+ if (DEBUG) Log.d(TAG, String.format("<%s />", TAG_SPACER));
+ final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ final int gap = getDimensionOrFraction(a, R.styleable.Keyboard_horizontalGap,
+ mKeyboard.getDisplayWidth(), 0);
+ a.recycle();
+ checkEndTag(TAG_SPACER, parser);
+ setSpacer(gap);
+ }
+ }
+
+ private void parseIncludeKeyboardContent(XmlResourceParser parser, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ parseIncludeInternal(parser, null, keys);
+ }
+
+ private void parseIncludeRowContent(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ parseIncludeInternal(parser, row, keys);
+ }
+
+ private void parseIncludeInternal(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (keys == null) {
+ checkEndTag(TAG_INCLUDE, parser);
+ } else {
+ final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Include);
+ final int keyboardLayout = a.getResourceId(
+ R.styleable.Keyboard_Include_keyboardLayout, 0);
+ a.recycle();
+
+ checkEndTag(TAG_INCLUDE, parser);
+ if (keyboardLayout == 0)
+ throw new ParseException("No keyboardLayout attribute in <include/>", parser);
+ if (DEBUG) Log.d(TAG, String.format("<%s keyboardLayout=%s />",
+ TAG_INCLUDE, mResources.getResourceEntryName(keyboardLayout)));
+ parseMerge(mResources.getLayout(keyboardLayout), row, keys);
+ }
+ }
+
+ private void parseMerge(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_MERGE.equals(tag)) {
+ if (row == null) {
+ parseKeyboardContent(parser, keys);
+ } else {
+ parseRowContent(parser, row, keys);
+ }
+ break;
+ } else {
+ throw new ParseException(
+ "Included keyboard layout must have <merge> root element", parser);
+ }
+ }
+ }
+ }
+
+ private void parseSwitchKeyboardContent(XmlResourceParser parser, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ parseSwitchInternal(parser, null, keys);
+ }
+
+ private void parseSwitchRowContent(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ parseSwitchInternal(parser, row, keys);
+ }
+
+ private void parseSwitchInternal(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_SWITCH, mKeyboard.mId));
+ boolean selected = false;
+ int event;
+ while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (event == XmlPullParser.START_TAG) {
+ final String tag = parser.getName();
+ if (TAG_CASE.equals(tag)) {
+ selected |= parseCase(parser, row, selected ? null : keys);
+ } else if (TAG_DEFAULT.equals(tag)) {
+ selected |= parseDefault(parser, row, selected ? null : keys);
+ } else {
+ throw new IllegalStartTag(parser, TAG_KEY);
+ }
+ } else if (event == XmlPullParser.END_TAG) {
+ final String tag = parser.getName();
+ if (TAG_SWITCH.equals(tag)) {
+ if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_SWITCH));
+ break;
+ } else {
+ throw new IllegalEndTag(parser, TAG_KEY);
+ }
+ }
+ }
+ }
+
+ private boolean parseCase(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ final boolean selected = parseCaseCondition(parser);
+ if (row == null) {
+ // Processing Rows.
+ parseKeyboardContent(parser, selected ? keys : null);
+ } else {
+ // Processing Keys.
+ parseRowContent(parser, row, selected ? keys : null);
+ }
+ return selected;
+ }
+
+ private boolean parseCaseCondition(XmlResourceParser parser) {
+ final KeyboardId id = mKeyboard.mId;
+ if (id == null)
+ return true;
+
+ final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Case);
+ final TypedArray viewAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.KeyboardView);
+ try {
+ final boolean modeMatched = matchInteger(a,
+ R.styleable.Keyboard_Case_mode, id.mMode);
+ final boolean settingsKeyMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_hasSettingsKey, id.mHasSettingsKey);
+ final boolean voiceEnabledMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_voiceKeyEnabled, id.mVoiceKeyEnabled);
+ final boolean voiceKeyMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_hasVoiceKey, id.mHasVoiceKey);
+ final boolean colorSchemeMatched = matchInteger(viewAttr,
+ R.styleable.KeyboardView_colorScheme, id.mColorScheme);
+ // As noted at KeyboardSwitcher.KeyboardId class, we are interested only in
+ // enum value masked by IME_MASK_ACTION and IME_FLAG_NO_ENTER_ACTION. So matching
+ // this attribute with id.mImeOptions as integer value is enough for our purpose.
+ final boolean imeOptionsMatched = matchInteger(a,
+ R.styleable.Keyboard_Case_imeOptions, id.mImeOptions);
+ final boolean selected = modeMatched && settingsKeyMatched && voiceEnabledMatched
+ && voiceKeyMatched && colorSchemeMatched && imeOptionsMatched;
+
+ if (DEBUG) Log.d(TAG, String.format("<%s%s%s%s%s%s%s> %s", TAG_CASE,
+ textAttr(KeyboardId.modeName(
+ a.getInt(R.styleable.Keyboard_Case_mode, -1)), "mode"),
+ textAttr(KeyboardId.colorSchemeName(
+ a.getInt(R.styleable.KeyboardView_colorScheme, -1)), "colorSchemeName"),
+ booleanAttr(a, R.styleable.Keyboard_Case_hasSettingsKey, "hasSettingsKey"),
+ booleanAttr(a, R.styleable.Keyboard_Case_voiceKeyEnabled, "voiceKeyEnabled"),
+ booleanAttr(a, R.styleable.Keyboard_Case_hasVoiceKey, "hasVoiceKey"),
+ textAttr(KeyboardId.imeOptionsName(
+ a.getInt(R.styleable.Keyboard_Case_imeOptions, -1)), "imeOptions"),
+ Boolean.toString(selected)));
+
+ return selected;
+ } finally {
+ a.recycle();
+ viewAttr.recycle();
+ }
+ }
+
+ private static boolean matchInteger(TypedArray a, int index, int value) {
+ // If <case> does not have "index" attribute, that means this <case> is wild-card for the
+ // attribute.
+ return !a.hasValue(index) || a.getInt(index, 0) == value;
+ }
+
+ private static boolean matchBoolean(TypedArray a, int index, boolean value) {
+ // If <case> does not have "index" attribute, that means this <case> is wild-card for the
+ // attribute.
+ return !a.hasValue(index) || a.getBoolean(index, false) == value;
+ }
+
+ private boolean parseDefault(XmlResourceParser parser, Row row, List<Key> keys)
+ throws XmlPullParserException, IOException {
+ if (DEBUG) Log.d(TAG, String.format("<%s>", TAG_DEFAULT));
+ if (row == null) {
+ parseKeyboardContent(parser, keys);
+ } else {
+ parseRowContent(parser, row, keys);
+ }
+ return true;
+ }
+
+ private void parseKeyStyle(XmlResourceParser parser, List<Key> keys) {
+ TypedArray keyStyleAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_KeyStyle);
+ TypedArray keyAttrs = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Key);
+ try {
+ if (!keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_styleName))
+ throw new ParseException("<" + TAG_KEY_STYLE
+ + "/> needs styleName attribute", parser);
+ if (keys != null)
+ mKeyStyles.parseKeyStyleAttributes(keyStyleAttr, keyAttrs, parser);
+ } finally {
+ keyStyleAttr.recycle();
+ keyAttrs.recycle();
+ }
+ }
+
+ private static void checkEndTag(String tag, XmlResourceParser parser)
+ throws XmlPullParserException, IOException {
+ if (parser.next() == XmlPullParser.END_TAG && tag.equals(parser.getName()))
+ return;
+ throw new NonEmptyTag(tag, parser);
+ }
+
+ private void startRow(Row row) {
+ mCurrentX = 0;
+ mCurrentRow = row;
+ }
+
+ private void endRow() {
+ if (mCurrentRow == null)
+ throw new InflateException("orphant end row tag");
+ mCurrentY += mCurrentRow.mDefaultHeight;
+ mCurrentRow = null;
+ }
+
+ private void endKey(Key key) {
+ mCurrentX += key.mGap + key.mWidth;
+ if (mCurrentX > mMaxRowWidth)
+ mMaxRowWidth = mCurrentX;
+ }
+
+ private void endKeyboard(int defaultVerticalGap) {
+ mTotalHeight = mCurrentY - defaultVerticalGap;
+ }
+
+ private void setSpacer(int gap) {
+ mCurrentX += gap;
+ }
+
+ public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) {
+ final TypedValue value = a.peekValue(index);
+ if (value == null)
+ return defValue;
+ if (value.type == TypedValue.TYPE_DIMENSION) {
+ return a.getDimensionPixelOffset(index, defValue);
+ } else if (value.type == TypedValue.TYPE_FRACTION) {
+ // Round it to avoid values like 47.9999 from getting truncated
+ return Math.round(a.getFraction(index, base, base, defValue));
+ }
+ return defValue;
+ }
+
+ @SuppressWarnings("serial")
+ public static class ParseException extends InflateException {
+ public ParseException(String msg, XmlResourceParser parser) {
+ super(msg + " at line " + parser.getLineNumber());
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private static class IllegalStartTag extends ParseException {
+ public IllegalStartTag(XmlResourceParser parser, String parent) {
+ super("Illegal start tag " + parser.getName() + " in " + parent, parser);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private static class IllegalEndTag extends ParseException {
+ public IllegalEndTag(XmlResourceParser parser, String parent) {
+ super("Illegal end tag " + parser.getName() + " in " + parent, parser);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private static class NonEmptyTag extends ParseException {
+ public NonEmptyTag(String tag, XmlResourceParser parser) {
+ super(tag + " must be empty tag", parser);
+ }
+ }
+
+ private static String textAttr(String value, String name) {
+ return value != null ? String.format(" %s=%s", name, value) : "";
+ }
+
+ private static String booleanAttr(TypedArray a, int index, String name) {
+ return a.hasValue(index) ? String.format(" %s=%s", name, a.getBoolean(index, false)) : "";
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java b/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
new file mode 100644
index 000000000..3e1eaf44e
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import android.util.Log;
+
+public class KeyboardShiftState {
+ private static final String TAG = "KeyboardShiftState";
+ private static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE;
+
+ private static final int NORMAL = 0;
+ private static final int MANUAL_SHIFTED = 1;
+ private static final int SHIFT_LOCKED = 2;
+ private static final int AUTO_SHIFTED = 3;
+ private static final int SHIFT_LOCK_SHIFTED = 4;
+
+ private int mState = NORMAL;
+
+ public boolean setShifted(boolean newShiftState) {
+ final int oldState = mState;
+ if (newShiftState) {
+ if (oldState == NORMAL || oldState == AUTO_SHIFTED) {
+ mState = MANUAL_SHIFTED;
+ } else if (oldState == SHIFT_LOCKED) {
+ mState = SHIFT_LOCK_SHIFTED;
+ }
+ } else {
+ if (oldState == MANUAL_SHIFTED || oldState == AUTO_SHIFTED) {
+ mState = NORMAL;
+ } else if (oldState == SHIFT_LOCK_SHIFTED) {
+ mState = SHIFT_LOCKED;
+ }
+ }
+ if (DEBUG)
+ Log.d(TAG, "setShifted(" + newShiftState + "): " + toString(oldState) + " > " + this);
+ return mState != oldState;
+ }
+
+ public void setShiftLocked(boolean newShiftLockState) {
+ final int oldState = mState;
+ if (newShiftLockState) {
+ if (oldState == NORMAL || oldState == MANUAL_SHIFTED || oldState == AUTO_SHIFTED)
+ mState = SHIFT_LOCKED;
+ } else {
+ if (oldState == SHIFT_LOCKED || oldState == SHIFT_LOCK_SHIFTED)
+ mState = NORMAL;
+ }
+ 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 == SHIFT_LOCK_SHIFTED;
+ }
+
+ @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 SHIFT_LOCKED: return "SHIFT_LOCKED";
+ case AUTO_SHIFTED: return "AUTO_SHIFTED";
+ 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..76cb8ff29
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -0,0 +1,697 @@
+/*
+ * 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.Settings;
+import com.android.inputmethod.latin.Utils;
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.util.Log;
+import android.view.InflateException;
+import android.view.inputmethod.InputMethodManager;
+
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.Locale;
+
+public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener {
+ private static final String TAG = "KeyboardSwitcher";
+ private static final boolean DEBUG = false;
+ public static final boolean DEBUG_STATE = false;
+
+ // Changing DEFAULT_LAYOUT_ID also requires prefs_for_debug.xml to be matched with.
+ public static final String DEFAULT_LAYOUT_ID = "5";
+ 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,
+ R.layout.input_honeycomb, // DEFAULT_LAYOUT_ID
+ };
+
+ private SubtypeSwitcher mSubtypeSwitcher;
+ private SharedPreferences mPrefs;
+
+ private LatinKeyboardView mInputView;
+ private LatinIME mInputMethodService;
+
+ private ShiftKeyState mShiftKeyState = new ShiftKeyState("Shift");
+ private ModifierKeyState mSymbolKeyState = new ModifierKeyState("Symbol");
+
+ private KeyboardId mSymbolsId;
+ private KeyboardId mSymbolsShiftedId;
+
+ private KeyboardId mCurrentId;
+ private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboardCache =
+ new HashMap<KeyboardId, SoftReference<LatinKeyboard>>();
+
+ private int mMode = KeyboardId.MODE_TEXT; /* default value */
+ private int mImeOptions;
+ private boolean mIsSymbols;
+ /** mIsAutoCorrectionActive indicates that auto corrected word will be input instead of
+ * what user actually typed. */
+ private boolean mIsAutoCorrectionActive;
+ private boolean mVoiceKeyEnabled;
+ private boolean mVoiceButtonOnPrimary;
+
+ private static final int AUTO_MODE_SWITCH_STATE_ALPHA = 0;
+ private static final int AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN = 1;
+ private static final int AUTO_MODE_SWITCH_STATE_SYMBOL = 2;
+ // The following states are used only on the distinct multi-touch panel devices.
+ private static final int AUTO_MODE_SWITCH_STATE_MOMENTARY = 3;
+ private static final int AUTO_MODE_SWITCH_STATE_CHORDING = 4;
+ private int mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
+
+ // Indicates whether or not we have the settings key
+ private boolean mHasSettingsKey;
+ private static final int SETTINGS_KEY_MODE_AUTO = R.string.settings_key_mode_auto;
+ private static final int SETTINGS_KEY_MODE_ALWAYS_SHOW =
+ R.string.settings_key_mode_always_show;
+ // NOTE: No need to have SETTINGS_KEY_MODE_ALWAYS_HIDE here because it's not being referred to
+ // in the source code now.
+ // Default is SETTINGS_KEY_MODE_AUTO.
+ private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO;
+
+ private int mLayoutId;
+
+ private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();
+
+ public static KeyboardSwitcher getInstance() {
+ return sInstance;
+ }
+
+ private KeyboardSwitcher() {
+ // Intentional empty constructor for singleton.
+ }
+
+ public static void init(LatinIME ims, SharedPreferences prefs) {
+ sInstance.mInputMethodService = ims;
+ sInstance.mPrefs = prefs;
+ sInstance.mSubtypeSwitcher = SubtypeSwitcher.getInstance();
+
+ sInstance.mLayoutId = Integer.valueOf(
+ prefs.getString(PREF_KEYBOARD_LAYOUT, DEFAULT_LAYOUT_ID));
+ prefs.registerOnSharedPreferenceChangeListener(sInstance);
+ }
+
+ private void makeSymbolsKeyboardIds() {
+ final Locale locale = mSubtypeSwitcher.getInputLocale();
+ final Resources res = mInputMethodService.getResources();
+ final int orientation = res.getConfiguration().orientation;
+ final int mode = mMode;
+ final int colorScheme = getColorScheme();
+ final boolean hasSettingsKey = mHasSettingsKey;
+ final boolean voiceKeyEnabled = mVoiceKeyEnabled;
+ final boolean hasVoiceKey = voiceKeyEnabled && !mVoiceButtonOnPrimary;
+ final int imeOptions = mImeOptions;
+ // Note: This comment is only applied for phone number keyboard layout.
+ // On non-xlarge device, "@integer/key_switch_alpha_symbol" key code is used to switch
+ // between "phone keyboard" and "phone symbols keyboard". But on xlarge device,
+ // "@integer/key_shift" key code is used for that purpose in order to properly display
+ // "more" and "locked more" key labels. To achieve these behavior, we should initialize
+ // mSymbolsId and mSymbolsShiftedId to "phone keyboard" and "phone symbols keyboard"
+ // respectively here for xlarge device's layout switching.
+ int xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone : R.xml.kbd_symbols;
+ mSymbolsId = new KeyboardId(
+ res.getResourceEntryName(xmlId), xmlId, locale, orientation, mode, colorScheme,
+ hasSettingsKey, voiceKeyEnabled, hasVoiceKey, imeOptions, true);
+ xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone_symbols : R.xml.kbd_symbols_shift;
+ mSymbolsShiftedId = new KeyboardId(
+ res.getResourceEntryName(xmlId), xmlId, locale, orientation, mode, colorScheme,
+ hasSettingsKey, voiceKeyEnabled, hasVoiceKey, imeOptions, true);
+ }
+
+ private boolean hasVoiceKey(boolean isSymbols) {
+ return mVoiceKeyEnabled && (isSymbols != mVoiceButtonOnPrimary);
+ }
+
+ public void loadKeyboard(int mode, int imeOptions, boolean voiceKeyEnabled,
+ boolean voiceButtonOnPrimary) {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
+ try {
+ loadKeyboardInternal(mode, imeOptions, voiceKeyEnabled, voiceButtonOnPrimary, false);
+ } catch (RuntimeException e) {
+ Log.w(TAG, e);
+ LatinImeLogger.logOnException(mode + "," + imeOptions, e);
+ }
+ }
+
+ private void loadKeyboardInternal(int mode, int imeOptions, boolean voiceButtonEnabled,
+ boolean voiceButtonOnPrimary, boolean isSymbols) {
+ if (mInputView == null) return;
+ mInputView.setPreviewEnabled(mInputMethodService.getPopupOn());
+
+ mMode = mode;
+ mImeOptions = imeOptions;
+ mVoiceKeyEnabled = voiceButtonEnabled;
+ mVoiceButtonOnPrimary = voiceButtonOnPrimary;
+ mIsSymbols = isSymbols;
+ // Update the settings key state because number of enabled IMEs could have been changed
+ mHasSettingsKey = getSettingsKeyMode(mPrefs, mInputMethodService);
+ makeSymbolsKeyboardIds();
+
+ KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
+ LatinKeyboard keyboard = getKeyboard(id);
+
+ mCurrentId = id;
+ mInputView.setKeyboard(keyboard);
+ }
+
+ 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);
+ return keyboard;
+ }
+
+ private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) {
+ final boolean hasVoiceKey = hasVoiceKey(isSymbols);
+ final int charColorId = getColorScheme();
+ final int xmlId;
+ final boolean enableShiftLock;
+
+ if (isSymbols) {
+ if (mode == KeyboardId.MODE_PHONE) {
+ xmlId = R.xml.kbd_phone_symbols;
+ } else if (mode == KeyboardId.MODE_NUMBER) {
+ // Note: MODE_NUMBER keyboard layout has no "switch alpha symbol" key.
+ xmlId = R.xml.kbd_number;
+ } else {
+ xmlId = R.xml.kbd_symbols;
+ }
+ enableShiftLock = false;
+ } else {
+ if (mode == KeyboardId.MODE_PHONE) {
+ xmlId = R.xml.kbd_phone;
+ enableShiftLock = false;
+ } else if (mode == KeyboardId.MODE_NUMBER) {
+ xmlId = R.xml.kbd_number;
+ enableShiftLock = false;
+ } else {
+ xmlId = R.xml.kbd_qwerty;
+ enableShiftLock = true;
+ }
+ }
+ final Resources res = mInputMethodService.getResources();
+ final int orientation = res.getConfiguration().orientation;
+ final Locale locale = mSubtypeSwitcher.getInputLocale();
+ return new KeyboardId(
+ res.getResourceEntryName(xmlId), xmlId, locale, orientation, mode, charColorId,
+ mHasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, imeOptions, enableShiftLock);
+ }
+
+ public int getKeyboardMode() {
+ return mMode;
+ }
+
+ public boolean isAlphabetMode() {
+ return mCurrentId != null && mCurrentId.isAlphabetKeyboard();
+ }
+
+ public boolean isInputViewShown() {
+ return mInputView != null && mInputView.isShown();
+ }
+
+ public boolean isKeyboardAvailable() {
+ if (mInputView != null)
+ return mInputView.getLatinKeyboard() != null;
+ return false;
+ }
+
+ private LatinKeyboard getLatinKeyboard() {
+ if (mInputView != null)
+ return mInputView.getLatinKeyboard();
+ return null;
+ }
+
+ public void setPreferredLetters(int[] frequencies) {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ latinKeyboard.setPreferredLetters(frequencies);
+ }
+
+ public void keyReleased() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ latinKeyboard.keyReleased();
+ }
+
+ public boolean isShiftedOrShiftLocked() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ return latinKeyboard.isShiftedOrShiftLocked();
+ return false;
+ }
+
+ public boolean isShiftLocked() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ return latinKeyboard.isShiftLocked();
+ return false;
+ }
+
+ public boolean isAutomaticTemporaryUpperCase() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ return latinKeyboard.isAutomaticTemporaryUpperCase();
+ return false;
+ }
+
+ public boolean isManualTemporaryUpperCase() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null)
+ return latinKeyboard.isManualTemporaryUpperCase();
+ return false;
+ }
+
+ private void setManualTemporaryUpperCase(boolean shifted) {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null) {
+ // On non-distinct multi touch panel device, we should also turn off the shift locked
+ // state when shift key is pressed to go to normal mode.
+ // On the other hand, on distinct multi touch panel device, turning off the shift locked
+ // state with shift key pressing is handled by onReleaseShift().
+ if (!hasDistinctMultitouch() && !shifted && latinKeyboard.isShiftLocked()) {
+ latinKeyboard.setShiftLocked(false);
+ }
+ if (latinKeyboard.setShifted(shifted)) {
+ mInputView.invalidateAllKeys();
+ }
+ }
+ }
+
+ private void setShiftLocked(boolean shiftLocked) {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null && latinKeyboard.setShiftLocked(shiftLocked)) {
+ mInputView.invalidateAllKeys();
+ }
+ }
+
+ /**
+ * Toggle keyboard shift state triggered by user touch event.
+ */
+ public void toggleShift() {
+ mInputMethodService.mHandler.cancelUpdateShiftState();
+ if (DEBUG_STATE)
+ Log.d(TAG, "toggleShift:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + mShiftKeyState);
+ if (isAlphabetMode()) {
+ setManualTemporaryUpperCase(!isShiftedOrShiftLocked());
+ } else {
+ toggleShiftInSymbol();
+ }
+ }
+
+ public void toggleCapsLock() {
+ mInputMethodService.mHandler.cancelUpdateShiftState();
+ if (DEBUG_STATE)
+ Log.d(TAG, "toggleCapsLock:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + mShiftKeyState);
+ if (isAlphabetMode()) {
+ if (isShiftLocked()) {
+ // Shift key is long pressed while caps lock state, we will toggle back to normal
+ // state. And mark as if shift key is released.
+ setShiftLocked(false);
+ mShiftKeyState.onRelease();
+ } else {
+ setShiftLocked(true);
+ }
+ }
+ }
+
+ private void setAutomaticTemporaryUpperCase() {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null) {
+ latinKeyboard.setAutomaticTemporaryUpperCase();
+ mInputView.invalidateAllKeys();
+ }
+ }
+
+ /**
+ * Update keyboard shift state triggered by connected EditText status change.
+ */
+ public void updateShiftState() {
+ final ShiftKeyState shiftKeyState = mShiftKeyState;
+ if (DEBUG_STATE)
+ Log.d(TAG, "updateShiftState:"
+ + " autoCaps=" + mInputMethodService.getCurrentAutoCapsState()
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + shiftKeyState);
+ if (isAlphabetMode()) {
+ if (!isShiftLocked() && !shiftKeyState.isIgnoring()) {
+ if (shiftKeyState.isReleasing() && mInputMethodService.getCurrentAutoCapsState()) {
+ // Only when shift key is releasing, automatic temporary upper case will be set.
+ setAutomaticTemporaryUpperCase();
+ } else {
+ setManualTemporaryUpperCase(shiftKeyState.isMomentary());
+ }
+ }
+ } else {
+ // In symbol keyboard mode, we should clear shift key state because only alphabet
+ // keyboard has shift key.
+ shiftKeyState.onRelease();
+ }
+ }
+
+ public void changeKeyboardMode() {
+ if (DEBUG_STATE)
+ Log.d(TAG, "changeKeyboardMode:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + mShiftKeyState);
+ toggleKeyboardMode();
+ if (isShiftLocked() && isAlphabetMode())
+ setShiftLocked(true);
+ updateShiftState();
+ }
+
+ public void onPressShift() {
+ if (!isKeyboardAvailable())
+ return;
+ ShiftKeyState shiftKeyState = mShiftKeyState;
+ if (DEBUG_STATE)
+ Log.d(TAG, "onPressShift:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + shiftKeyState);
+ if (isAlphabetMode()) {
+ if (isShiftLocked()) {
+ // Shift key is pressed while caps lock state, we will treat this state as shifted
+ // caps lock state and mark as if shift key pressed while normal state.
+ shiftKeyState.onPress();
+ setManualTemporaryUpperCase(true);
+ } else if (isAutomaticTemporaryUpperCase()) {
+ // Shift key is pressed while automatic temporary upper case, we have to move to
+ // manual temporary upper case.
+ shiftKeyState.onPress();
+ setManualTemporaryUpperCase(true);
+ } else if (isShiftedOrShiftLocked()) {
+ // In manual upper case state, we just record shift key has been pressing while
+ // shifted state.
+ shiftKeyState.onPressOnShifted();
+ } else {
+ // In base layout, chording or manual temporary upper case mode is started.
+ shiftKeyState.onPress();
+ toggleShift();
+ }
+ } else {
+ // In symbol mode, just toggle symbol and symbol more keyboard.
+ shiftKeyState.onPress();
+ toggleShift();
+ }
+ }
+
+ public void onReleaseShift() {
+ if (!isKeyboardAvailable())
+ return;
+ ShiftKeyState shiftKeyState = mShiftKeyState;
+ if (DEBUG_STATE)
+ Log.d(TAG, "onReleaseShift:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + shiftKeyState);
+ if (isAlphabetMode()) {
+ if (shiftKeyState.isMomentary()) {
+ // After chording input while normal state.
+ toggleShift();
+ } else if (isShiftLocked() && !shiftKeyState.isIgnoring()) {
+ // Shift has been pressed without chording while caps lock state.
+ toggleCapsLock();
+ } else if (isShiftedOrShiftLocked() && shiftKeyState.isPressingOnShifted()) {
+ // Shift has been pressed without chording while shifted state.
+ toggleShift();
+ }
+ }
+ shiftKeyState.onRelease();
+ }
+
+ public void onPressSymbol() {
+ if (DEBUG_STATE)
+ Log.d(TAG, "onPressSymbol:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " symbolKeyState=" + mSymbolKeyState);
+ changeKeyboardMode();
+ mSymbolKeyState.onPress();
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_MOMENTARY;
+ }
+
+ public void onReleaseSymbol() {
+ if (DEBUG_STATE)
+ Log.d(TAG, "onReleaseSymbol:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " symbolKeyState=" + mSymbolKeyState);
+ // Snap back to the previous keyboard mode if the user chords the mode change key and
+ // other key, then released the mode change key.
+ if (mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_CHORDING)
+ changeKeyboardMode();
+ mSymbolKeyState.onRelease();
+ }
+
+ public void onOtherKeyPressed() {
+ if (DEBUG_STATE)
+ Log.d(TAG, "onOtherKeyPressed:"
+ + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
+ + " shiftKeyState=" + mShiftKeyState
+ + " symbolKeyState=" + mSymbolKeyState);
+ mShiftKeyState.onOtherKeyPressed();
+ mSymbolKeyState.onOtherKeyPressed();
+ }
+
+ private void toggleShiftInSymbol() {
+ if (isAlphabetMode())
+ return;
+ final LatinKeyboard keyboard;
+ if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) {
+ mCurrentId = mSymbolsShiftedId;
+ keyboard = getKeyboard(mCurrentId);
+ // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To
+ // enable the indicator, we need to call enableShiftLock() and setShiftLocked(true).
+ // Thus we can keep the ALT key's Key.on value true while LatinKey.onRelease() is
+ // called.
+ keyboard.setShiftLocked(true);
+ } else {
+ mCurrentId = mSymbolsId;
+ keyboard = getKeyboard(mCurrentId);
+ // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the
+ // indicator, we need to call enableShiftLock() and setShiftLocked(false).
+ keyboard.setShifted(false);
+ }
+ mInputView.setKeyboard(keyboard);
+ }
+
+ public boolean isInMomentaryAutoModeSwitchState() {
+ return mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY;
+ }
+
+ public boolean isVibrateAndSoundFeedbackRequired() {
+ return mInputView == null || !mInputView.isInSlidingKeyInput();
+ }
+
+ private int getPointerCount() {
+ return mInputView == null ? 0 : mInputView.getPointerCount();
+ }
+
+ private void toggleKeyboardMode() {
+ loadKeyboardInternal(mMode, mImeOptions, mVoiceKeyEnabled, mVoiceButtonOnPrimary,
+ !mIsSymbols);
+ if (mIsSymbols) {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN;
+ } else {
+ mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
+ }
+ }
+
+ public boolean hasDistinctMultitouch() {
+ return mInputView != null && mInputView.hasDistinctMultitouch();
+ }
+
+ /**
+ * Updates state machine to figure out when to automatically snap back to the previous mode.
+ */
+ public void onKey(int key) {
+ if (DEBUG_STATE)
+ Log.d(TAG, "onKey: code=" + key + " autoModeSwitchState=" + mAutoModeSwitchState
+ + " pointers=" + getPointerCount());
+ switch (mAutoModeSwitchState) {
+ case AUTO_MODE_SWITCH_STATE_MOMENTARY:
+ // Only distinct multi touch devices can be in this state.
+ // On non-distinct multi touch devices, mode change key is handled by {@link 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 == 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.
+ 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 (THEMES.length <= layoutId) {
+ layoutId = Integer.valueOf(DEFAULT_LAYOUT_ID);
+ }
+
+ 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(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, DEFAULT_LAYOUT_ID));
+ createInputViewInternal(layoutId, false);
+ postSetInputView();
+ } else if (Settings.PREF_SETTINGS_KEY.equals(key)) {
+ mHasSettingsKey = getSettingsKeyMode(sharedPreferences, mInputMethodService);
+ createInputViewInternal(mLayoutId, true);
+ postSetInputView();
+ }
+ }
+
+ private int getColorScheme() {
+ return (mInputView != null)
+ ? mInputView.getColorScheme() : KeyboardView.COLOR_SCHEME_WHITE;
+ }
+
+ public void onAutoCorrectionStateChanged(boolean isAutoCorrection) {
+ if (isAutoCorrection != mIsAutoCorrectionActive) {
+ LatinKeyboardView keyboardView = getInputView();
+ mIsAutoCorrectionActive = isAutoCorrection;
+ keyboardView.invalidateKey(((LatinKeyboard) keyboardView.getKeyboard())
+ .onAutoCorrectionStateChanged(isAutoCorrection));
+ }
+ }
+
+ private static boolean getSettingsKeyMode(SharedPreferences prefs, Context context) {
+ Resources resources = context.getResources();
+ final boolean showSettingsKeyOption = resources.getBoolean(
+ R.bool.config_enable_show_settings_key_option);
+ if (showSettingsKeyOption) {
+ final String settingsKeyMode = prefs.getString(Settings.PREF_SETTINGS_KEY,
+ resources.getString(DEFAULT_SETTINGS_KEY_MODE));
+ // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or
+ // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system
+ if (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))
+ || (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO))
+ && Utils.hasMultipleEnabledIMEsOrSubtypes(
+ ((InputMethodManager) context.getSystemService(
+ Context.INPUT_METHOD_SERVICE))))) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index b1ef08573..7c6e4dc4e 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -14,7 +14,11 @@
* limitations under the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -29,8 +33,6 @@ import android.graphics.Rect;
import android.graphics.Region.Op;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
-import android.inputmethodservice.Keyboard;
-import android.inputmethodservice.Keyboard.Key;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
@@ -43,132 +45,56 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
+import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.LinkedList;
import java.util.List;
import java.util.WeakHashMap;
/**
- * A view that renders a virtual {@link LatinKeyboard}. It handles rendering of keys and
- * detecting key presses and touch movements.
- *
- * TODO: References to LatinKeyboard in this class should be replaced with ones to its base class.
+ * A view that renders a virtual {@link Keyboard}. It handles rendering of keys and detecting key
+ * presses and touch movements.
*
- * @attr ref R.styleable#LatinKeyboardBaseView_keyBackground
- * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewLayout
- * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewOffset
- * @attr ref R.styleable#LatinKeyboardBaseView_labelTextSize
- * @attr ref R.styleable#LatinKeyboardBaseView_keyTextSize
- * @attr ref R.styleable#LatinKeyboardBaseView_keyTextColor
- * @attr ref R.styleable#LatinKeyboardBaseView_verticalCorrection
- * @attr ref R.styleable#LatinKeyboardBaseView_popupLayout
+ * @attr ref R.styleable#KeyboardView_keyBackground
+ * @attr ref R.styleable#KeyboardView_keyPreviewLayout
+ * @attr ref R.styleable#KeyboardView_keyPreviewOffset
+ * @attr ref R.styleable#KeyboardView_labelTextSize
+ * @attr ref R.styleable#KeyboardView_keyTextSize
+ * @attr ref R.styleable#KeyboardView_keyTextColor
+ * @attr ref R.styleable#KeyboardView_verticalCorrection
+ * @attr ref R.styleable#KeyboardView_popupLayout
*/
-public class LatinKeyboardBaseView extends View implements PointerTracker.UIProxy {
- private static final String TAG = "LatinKeyboardBaseView";
+public class KeyboardView extends View implements PointerTracker.UIProxy {
+ private static final String TAG = "KeyboardView";
private static final boolean DEBUG = false;
+ private static final boolean DEBUG_SHOW_ALIGN = false;
+ private static final boolean DEBUG_KEYBOARD_GRID = false;
- public static final int NOT_A_TOUCH_COORDINATE = -1;
+ private static final boolean ENABLE_CAPSLOCK_BY_LONGPRESS = false;
+ private static final boolean ENABLE_CAPSLOCK_BY_DOUBLETAP = true;
- 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 static final int COLOR_SCHEME_WHITE = 0;
+ public static final int COLOR_SCHEME_BLACK = 1;
+
+ public static final int NOT_A_TOUCH_COORDINATE = -1;
// Timing constants
private final int mKeyRepeatInterval;
// Miscellaneous constants
- /* package */ static final int NOT_A_KEY = -1;
private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable };
- private static final int NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL = -1;
+ private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1;
// XML attribute
- private int mKeyTextSize;
+ private int mKeyLetterSize;
private int mKeyTextColor;
- private Typeface mKeyTextStyle = Typeface.DEFAULT;
+ private int mKeyTextColorDisabled;
+ private Typeface mKeyLetterStyle = Typeface.DEFAULT;
private int mLabelTextSize;
- private int mSymbolColorScheme = 0;
+ private int mColorScheme = COLOR_SCHEME_WHITE;
private int mShadowColor;
private float mShadowRadius;
private Drawable mKeyBackground;
@@ -182,15 +108,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// Main keyboard
private Keyboard mKeyboard;
private Key[] mKeys;
- // TODO this attribute should be gotten from Keyboard.
- private int mKeyboardVerticalGap;
// Key preview popup
+ private boolean mInForeground;
private TextView mPreviewText;
private PopupWindow mPreviewPopup;
private int mPreviewTextSizeLarge;
private int[] mOffsetInWindow;
- private int mOldPreviewKeyIndex = NOT_A_KEY;
+ private int mOldPreviewKeyIndex = KeyDetector.NOT_A_KEY;
private boolean mShowPreview = true;
private boolean mShowTouchPoints = true;
private int mPopupPreviewOffsetX;
@@ -202,7 +127,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// Popup mini keyboard
private PopupWindow mMiniKeyboardPopup;
- private LatinKeyboardBaseView mMiniKeyboard;
+ private KeyboardView mMiniKeyboard;
private View mMiniKeyboardParent;
private final WeakHashMap<Key, View> mMiniKeyboardCache = new WeakHashMap<Key, View>();
private int mMiniKeyboardOriginX;
@@ -212,13 +137,13 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private final float mMiniKeyboardSlideAllowance;
private int mMiniKeyboardTrackerId;
- /** Listener for {@link OnKeyboardActionListener}. */
- private OnKeyboardActionListener mKeyboardActionListener;
+ /** Listener for {@link KeyboardActionListener}. */
+ private KeyboardActionListener mKeyboardActionListener;
private final ArrayList<PointerTracker> mPointerTrackers = new ArrayList<PointerTracker>();
// TODO: Let the PointerTracker class manage this pointer queue
- private final PointerQueue mPointerQueue = new PointerQueue();
+ private final PointerTrackerQueue mPointerQueue = new PointerTrackerQueue();
private final boolean mHasDistinctMultitouch;
private int mOldPointerCount = 1;
@@ -248,9 +173,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private final Rect mClipRegion = new Rect(0, 0, 0, 0);
// This map caches key label text height in pixel as value and key label text size as map key.
private final HashMap<Integer, Integer> mTextHeightCache = new HashMap<Integer, Integer>();
- // Distance from horizontal center of the key, proportional to key label text height.
- private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR = 0.55f;
- private final String KEY_LABEL_HEIGHT_REFERENCE_CHAR = "H";
+ // Distance from horizontal center of the key, proportional to key label text height and width.
+ private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER = 0.45f;
+ private final float KEY_LABEL_VERTICAL_PADDING_FACTOR = 1.60f;
+ private final String KEY_LABEL_REFERENCE_CHAR = "H";
+ private final int KEY_LABEL_OPTION_ALIGN_LEFT = 1;
+ private final int KEY_LABEL_OPTION_ALIGN_RIGHT = 2;
+ private final int KEY_LABEL_OPTION_ALIGN_BOTTOM = 8;
+ private final int KEY_LABEL_OPTION_FONT_NORMAL = 16;
+ private final int mKeyLabelHorizontalPadding;
private final UIHandler mHandler = new UIHandler();
@@ -259,6 +190,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private static final int MSG_DISMISS_PREVIEW = 2;
private static final int MSG_REPEAT_KEY = 3;
private static final int MSG_LONGPRESS_KEY = 4;
+ private static final int MSG_LONGPRESS_SHIFT_KEY = 5;
private boolean mInKeyRepeat;
@@ -282,6 +214,11 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
openPopupIfRequired(msg.arg1, tracker);
break;
}
+ case MSG_LONGPRESS_SHIFT_KEY: {
+ final PointerTracker tracker = (PointerTracker)msg.obj;
+ onLongPressShiftKey(tracker);
+ break;
+ }
}
}
@@ -325,17 +262,26 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
public void startLongPressTimer(long delay, int keyIndex, PointerTracker tracker) {
- removeMessages(MSG_LONGPRESS_KEY);
+ cancelLongPressTimers();
sendMessageDelayed(obtainMessage(MSG_LONGPRESS_KEY, keyIndex, 0, tracker), delay);
}
- public void cancelLongPressTimer() {
+ public void startLongPressShiftTimer(long delay, int keyIndex, PointerTracker tracker) {
+ cancelLongPressTimers();
+ if (ENABLE_CAPSLOCK_BY_LONGPRESS) {
+ sendMessageDelayed(
+ obtainMessage(MSG_LONGPRESS_SHIFT_KEY, keyIndex, 0, tracker), delay);
+ }
+ }
+
+ public void cancelLongPressTimers() {
removeMessages(MSG_LONGPRESS_KEY);
+ removeMessages(MSG_LONGPRESS_SHIFT_KEY);
}
public void cancelKeyTimers() {
cancelKeyRepeatTimer();
- cancelLongPressTimer();
+ cancelLongPressTimers();
}
public void cancelAllMessages() {
@@ -343,65 +289,17 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
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);
- }
- }
- }
-
- public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
- for (PointerTracker t : mQueue) {
- if (t == tracker)
- continue;
- t.onUpEvent(t.getLastX(), t.getLastY(), eventTime);
- t.setAlreadyProcessed();
- }
- mQueue.clear();
- if (tracker != null)
- mQueue.add(tracker);
- }
-
- public void remove(PointerTracker tracker) {
- mQueue.remove(tracker);
- }
}
- public 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);
+ attrs, R.styleable.KeyboardView, defStyle, R.style.KeyboardView);
LayoutInflater inflate =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int previewLayout = 0;
@@ -413,63 +311,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;
}
}
@@ -489,6 +378,8 @@ 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);
@@ -511,41 +402,47 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
GestureDetector.SimpleOnGestureListener listener =
new GestureDetector.SimpleOnGestureListener() {
+ private boolean mProcessingDoubleTapEvent = 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();
- return true;
- }
- } else if (velocityY < -mSwipeThreshold && absX < absY && deltaY < -travelY) {
- if (mDisambiguateSwipe && endingVelocityY <= velocityY / 4) {
- swipeUp();
+ if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) {
+ if (mDisambiguateSwipe && endingVelocityY >= velocityY / 4) {
+ onSwipeDown();
return true;
}
- } else if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) {
- if (mDisambiguateSwipe && endingVelocityY >= velocityY / 4) {
- swipeDown();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onDoubleTap(MotionEvent e) {
+ if (ENABLE_CAPSLOCK_BY_DOUBLETAP && mKeyboard instanceof LatinKeyboard
+ && ((LatinKeyboard) mKeyboard).isAlphaKeyboard()) {
+ final int pointerIndex = e.getActionIndex();
+ final int id = e.getPointerId(pointerIndex);
+ final PointerTracker tracker = getPointerTracker(id);
+ if (tracker.isOnShiftKey((int)e.getX(), (int)e.getY())) {
+ onDoubleTapShiftKey(tracker);
+ mProcessingDoubleTapEvent = true;
return true;
}
}
+ mProcessingDoubleTapEvent = false;
return false;
}
+
+ @Override
+ public boolean onDoubleTapEvent(MotionEvent e) {
+ return mProcessingDoubleTapEvent;
+ }
};
final boolean ignoreMultitouch = true;
@@ -557,7 +454,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval);
}
- public void setOnKeyboardActionListener(OnKeyboardActionListener listener) {
+ public void setOnKeyboardActionListener(KeyboardActionListener listener) {
mKeyboardActionListener = listener;
for (PointerTracker tracker : mPointerTrackers) {
tracker.setOnKeyboardActionListener(listener);
@@ -565,10 +462,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;
}
@@ -590,15 +487,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
LatinImeLogger.onSetKeyboard(keyboard);
mKeys = mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(),
-getPaddingTop() + mVerticalCorrection);
- mKeyboardVerticalGap = (int)getResources().getDimension(R.dimen.key_bottom_gap);
for (PointerTracker tracker : mPointerTrackers) {
- tracker.setKeyboard(mKeys, mKeyHysteresisDistance);
+ tracker.setKeyboard(keyboard, mKeys, mKeyHysteresisDistance);
}
requestLayout();
// Hint to reallocate the buffer if the size changed
mKeyboardChanged = true;
invalidateAllKeys();
- computeProximityThreshold(keyboard);
+ computeProximityThreshold(keyboard, mKeys);
mMiniKeyboardCache.clear();
}
@@ -615,39 +511,12 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
* Return whether the device has distinct multi-touch panel.
* @return true if the device has distinct multi-touch panel.
*/
+ @Override
public boolean hasDistinctMultitouch() {
return mHasDistinctMultitouch;
}
/**
- * Sets the state of the shift key of the keyboard, if any.
- * @param shifted whether or not to enable the state of the shift key
- * @return true if the shift key state changed, false if there was no change
- */
- public boolean setShifted(boolean shifted) {
- if (mKeyboard != null) {
- if (mKeyboard.setShifted(shifted)) {
- // The whole keyboard probably needs to be redrawn
- invalidateAllKeys();
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns the state of the shift key of the keyboard, if any.
- * @return true if the shift is in a pressed state, false otherwise. If there is
- * no shift key on the keyboard or there is no keyboard attached, it returns false.
- */
- public boolean isShifted() {
- if (mKeyboard != null) {
- return mKeyboard.isShifted();
- }
- return false;
- }
-
- /**
* Enables or disables the key feedback popup. This is a popup that shows a magnified
* version of the depressed key. By default the preview is enabled.
* @param previewEnabled whether or not to enable the key feedback popup
@@ -666,8 +535,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return mShowPreview;
}
- public int getSymbolColorScheme() {
- return mSymbolColorScheme;
+ public int getColorScheme() {
+ return mColorScheme;
}
public void setPopupParent(View v) {
@@ -681,7 +550,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#onKey} 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
@@ -698,9 +567,9 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
protected CharSequence adjustCase(CharSequence label) {
- if (mKeyboard.isShifted() && label != null && label.length() < 3
+ if (mKeyboard.isShiftedOrShiftLocked() && label != null && label.length() < 3
&& Character.isLowerCase(label.charAt(0))) {
- label = label.toString().toUpperCase();
+ return label.toString().toUpperCase();
}
return label;
}
@@ -722,23 +591,27 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
/**
- * Compute the average distance between adjacent keys (horizontally and vertically)
- * and square it to get the proximity threshold. We use a square here and in computing
- * the touch distance from a key's center to avoid taking a square root.
+ * Compute the most common key width and use it as proximity key detection threshold.
* @param keyboard
+ * @param keys
*/
- private void computeProximityThreshold(Keyboard keyboard) {
- if (keyboard == null) return;
- final Key[] keys = mKeys;
- if (keys == null) return;
- int length = keys.length;
- int dimensionSum = 0;
- for (int i = 0; i < length; i++) {
- Key key = keys[i];
- dimensionSum += Math.min(key.width, key.height + mKeyboardVerticalGap) + key.gap;
+ private void computeProximityThreshold(Keyboard keyboard, Key[] keys) {
+ if (keyboard == null || keys == null || keys.length == 0) return;
+ final HashMap<Integer, Integer> histogram = new HashMap<Integer, Integer>();
+ int maxCount = 0;
+ int mostCommonWidth = 0;
+ for (Key key : keys) {
+ final Integer width = key.mWidth + key.mGap;
+ Integer count = histogram.get(width);
+ if (count == null)
+ count = 0;
+ histogram.put(width, ++count);
+ if (count > maxCount) {
+ maxCount = count;
+ mostCommonWidth = width;
+ }
}
- if (dimensionSum < 0 || length == 0) return;
- mKeyDetector.setProximityThreshold((int) (dimensionSum * 1.4f / length));
+ mKeyDetector.setProximityThreshold(mostCommonWidth);
}
@Override
@@ -757,6 +630,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
canvas.drawBitmap(mBuffer, 0, 0, null);
}
+ @SuppressWarnings("unused")
private void onBufferDraw() {
if (mBuffer == null || mKeyboardChanged) {
if (mBuffer == null || mKeyboardChanged &&
@@ -783,16 +657,16 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
final int kbdPaddingTop = getPaddingTop();
final Key[] keys = mKeys;
final Key invalidKey = mInvalidatedKey;
+ final boolean isManualTemporaryUpperCase = mKeyboard.isManualTemporaryUpperCase();
- paint.setColor(mKeyTextColor);
boolean drawSingleKey = false;
if (invalidKey != null && canvas.getClipBounds(clipRegion)) {
// TODO we should use Rect.inset and Rect.contains here.
// Is clipRegion completely contained within the invalidated key?
- if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left &&
- invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top &&
- invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right &&
- invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) {
+ if (invalidKey.mX + kbdPaddingLeft - 1 <= clipRegion.left &&
+ invalidKey.mY + kbdPaddingTop - 1 <= clipRegion.top &&
+ invalidKey.mX + invalidKey.mWidth + kbdPaddingLeft + 1 >= clipRegion.right &&
+ invalidKey.mY + invalidKey.mHeight + kbdPaddingTop + 1 >= clipRegion.bottom) {
drawSingleKey = true;
}
}
@@ -807,77 +681,125 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
keyBackground.setState(drawableState);
// Switch the character to uppercase if shift is pressed
- String label = key.label == null? null : adjustCase(key.label).toString();
+ String label = key.mLabel == null? null : adjustCase(key.mLabel).toString();
final Rect bounds = keyBackground.getBounds();
- if (key.width != bounds.right || key.height != bounds.bottom) {
- keyBackground.setBounds(0, 0, key.width, key.height);
+ if (key.mWidth != bounds.right || key.mHeight != bounds.bottom) {
+ keyBackground.setBounds(0, 0, key.mWidth, key.mHeight);
}
- canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop);
+ canvas.translate(key.mX + kbdPaddingLeft, key.mY + kbdPaddingTop);
keyBackground.draw(canvas);
- boolean shouldDrawIcon = true;
+ final int rowHeight = padding.top + key.mHeight;
+ // Draw key label
if (label != null) {
// For characters, use large font. For labels like "Done", use small font.
- final int labelSize;
- if (label.length() > 1 && key.codes.length < 2) {
- labelSize = mLabelTextSize;
- paint.setTypeface(Typeface.DEFAULT_BOLD);
+ final int labelSize = getLabelSizeAndSetPaint(label, key, paint);
+ final int labelCharHeight = getLabelCharHeight(labelSize, paint);
+
+ // Vertical label text alignment.
+ final float baseline;
+ if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_BOTTOM) != 0) {
+ baseline = key.mHeight -
+ + labelCharHeight * KEY_LABEL_VERTICAL_PADDING_FACTOR;
+ if (DEBUG_SHOW_ALIGN)
+ drawHorizontalLine(canvas, (int)baseline, key.mWidth, 0xc0008000,
+ new Paint());
+ } else { // Align center
+ final float centerY = (key.mHeight + padding.top - padding.bottom) / 2;
+ baseline = centerY
+ + labelCharHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER;
+ if (DEBUG_SHOW_ALIGN)
+ drawHorizontalLine(canvas, (int)baseline, key.mWidth, 0xc0008000,
+ new Paint());
+ }
+ // Horizontal label text alignment
+ final int positionX;
+ if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_LEFT) != 0) {
+ positionX = mKeyLabelHorizontalPadding + padding.left;
+ paint.setTextAlign(Align.LEFT);
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, positionX, rowHeight, 0xc0800080, new Paint());
+ } else if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_RIGHT) != 0) {
+ positionX = key.mWidth - mKeyLabelHorizontalPadding - padding.right;
+ paint.setTextAlign(Align.RIGHT);
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, positionX, rowHeight, 0xc0808000, new Paint());
} else {
- labelSize = mKeyTextSize;
- paint.setTypeface(mKeyTextStyle);
+ positionX = (key.mWidth + padding.left - padding.right) / 2;
+ paint.setTextAlign(Align.CENTER);
+ if (DEBUG_SHOW_ALIGN && label.length() > 1)
+ drawVerticalLine(canvas, positionX, rowHeight, 0xc0008080, new Paint());
}
- paint.setTextSize(labelSize);
-
- Integer labelHeightValue = mTextHeightCache.get(labelSize);
- final int labelHeight;
- if (labelHeightValue != null) {
- labelHeight = labelHeightValue;
+ if (key.mManualTemporaryUpperCaseHintIcon != null && isManualTemporaryUpperCase) {
+ paint.setColor(mKeyTextColorDisabled);
} else {
- Rect textBounds = new Rect();
- paint.getTextBounds(KEY_LABEL_HEIGHT_REFERENCE_CHAR, 0, 1, textBounds);
- labelHeight = textBounds.height();
- mTextHeightCache.put(labelSize, labelHeight);
+ paint.setColor(mKeyTextColor);
}
-
- // Draw a drop shadow for the text
+ // Set a drop shadow for the text
paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor);
- final int centerX = (key.width + padding.left - padding.right) / 2;
- final int centerY = (key.height + padding.top - padding.bottom) / 2;
- final float baseline = centerY
- + labelHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR;
- canvas.drawText(label, centerX, baseline, paint);
+ canvas.drawText(label, positionX, baseline, paint);
// Turn off drop shadow
paint.setShadowLayer(0, 0, 0, 0);
-
- // Usually don't draw icon if label is not null, but we draw icon for the number
- // hint and popup hint.
- shouldDrawIcon = shouldDrawLabelAndIcon(key);
}
- if (key.icon != null && shouldDrawIcon) {
- // Special handing for the upper-right number hint icons
- final int drawableWidth;
- final int drawableHeight;
+ // Draw key icon
+ final Drawable icon = key.getIcon();
+ if (key.mLabel == null && icon != null) {
+ final int drawableWidth = icon.getIntrinsicWidth();
+ final int drawableHeight = icon.getIntrinsicHeight();
final int drawableX;
- final int drawableY;
- if (shouldDrawIconFully(key)) {
- drawableWidth = key.width;
- drawableHeight = key.height;
- drawableX = 0;
- drawableY = NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL;
- } else {
- drawableWidth = key.icon.getIntrinsicWidth();
- drawableHeight = key.icon.getIntrinsicHeight();
- drawableX = (key.width + padding.left - padding.right - drawableWidth) / 2;
- drawableY = (key.height + padding.top - padding.bottom - drawableHeight) / 2;
+ final int drawableY = (
+ key.mHeight + padding.top - padding.bottom - drawableHeight) / 2;
+ if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_LEFT) != 0) {
+ drawableX = padding.left + mKeyLabelHorizontalPadding;
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, drawableX, rowHeight, 0xc0800080, new Paint());
+ } else if ((key.mLabelOption & KEY_LABEL_OPTION_ALIGN_RIGHT) != 0) {
+ drawableX = key.mWidth - padding.right - mKeyLabelHorizontalPadding
+ - drawableWidth;
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, drawableX + drawableWidth, rowHeight,
+ 0xc0808000, new Paint());
+ } else { // Align center
+ drawableX = (key.mWidth + padding.left - padding.right - drawableWidth) / 2;
+ if (DEBUG_SHOW_ALIGN)
+ drawVerticalLine(canvas, drawableX + drawableWidth / 2, rowHeight,
+ 0xc0008080, new Paint());
}
- canvas.translate(drawableX, drawableY);
- key.icon.setBounds(0, 0, drawableWidth, drawableHeight);
- key.icon.draw(canvas);
- canvas.translate(-drawableX, -drawableY);
+ drawIcon(canvas, icon, drawableX, drawableY, drawableWidth, drawableHeight);
+ if (DEBUG_SHOW_ALIGN)
+ drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight,
+ 0x80c00000, new Paint());
+ }
+ if (key.mHintIcon != null) {
+ final int drawableWidth = key.mWidth;
+ final int drawableHeight = key.mHeight;
+ final int drawableX = 0;
+ final int drawableY = HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL;
+ Drawable hintIcon = (isManualTemporaryUpperCase
+ && key.mManualTemporaryUpperCaseHintIcon != null)
+ ? key.mManualTemporaryUpperCaseHintIcon : key.mHintIcon;
+ drawIcon(canvas, hintIcon, drawableX, drawableY, drawableWidth, drawableHeight);
+ if (DEBUG_SHOW_ALIGN)
+ drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight,
+ 0x80c0c000, new Paint());
}
- canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop);
+ canvas.translate(-key.mX - kbdPaddingLeft, -key.mY - kbdPaddingTop);
}
+
+ if (DEBUG_KEYBOARD_GRID) {
+ Paint p = new Paint();
+ p.setStyle(Paint.Style.STROKE);
+ p.setStrokeWidth(1.0f);
+ p.setColor(0x800000c0);
+ int cw = (mKeyboard.getMinWidth() + mKeyboard.GRID_WIDTH - 1) / mKeyboard.GRID_WIDTH;
+ int ch = (mKeyboard.getHeight() + mKeyboard.GRID_HEIGHT - 1) / mKeyboard.GRID_HEIGHT;
+ for (int i = 0; i <= mKeyboard.GRID_WIDTH; i++)
+ canvas.drawLine(i * cw, 0, i * cw, ch * mKeyboard.GRID_HEIGHT, p);
+ for (int i = 0; i <= mKeyboard.GRID_HEIGHT; i++)
+ canvas.drawLine(0, i * ch, cw * mKeyboard.GRID_WIDTH, i * ch, p);
+ }
+
mInvalidatedKey = null;
// Overlay a dark rectangle to dim the keyboard
if (mMiniKeyboard != null) {
@@ -908,28 +830,98 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mDirtyRect.setEmpty();
}
+ private int getLabelSizeAndSetPaint(CharSequence label, Key key, 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 ((key.mLabelOption & KEY_LABEL_OPTION_FONT_NORMAL) != 0) {
+ labelStyle = Typeface.DEFAULT;
+ } else {
+ labelStyle = Typeface.DEFAULT_BOLD;
+ }
+ } else {
+ labelSize = mKeyLetterSize;
+ labelStyle = mKeyLetterStyle;
+ }
+ paint.setTextSize(labelSize);
+ paint.setTypeface(labelStyle);
+ return labelSize;
+ }
+
+ private int getLabelCharHeight(int labelSize, Paint paint) {
+ Integer labelHeightValue = mTextHeightCache.get(labelSize);
+ final int labelCharHeight;
+ if (labelHeightValue != null) {
+ labelCharHeight = labelHeightValue;
+ } else {
+ Rect textBounds = new Rect();
+ paint.getTextBounds(KEY_LABEL_REFERENCE_CHAR, 0, 1, textBounds);
+ labelCharHeight = textBounds.height();
+ mTextHeightCache.put(labelSize, labelCharHeight);
+ }
+ return labelCharHeight;
+ }
+
+ private static void drawIcon(Canvas canvas, Drawable icon, int x, int y, int width,
+ int height) {
+ canvas.translate(x, y);
+ icon.setBounds(0, 0, width, height);
+ icon.draw(canvas);
+ canvas.translate(-x, -y);
+ }
+
+ private static void drawHorizontalLine(Canvas canvas, int y, int w, int color, Paint paint) {
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(1.0f);
+ paint.setColor(color);
+ canvas.drawLine(0, y, w, y, paint);
+ }
+
+ private static void drawVerticalLine(Canvas canvas, int x, int h, int color, Paint paint) {
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(1.0f);
+ paint.setColor(color);
+ canvas.drawLine(x, 0, x, h, paint);
+ }
+
+ private static void drawRectangle(Canvas canvas, int x, int y, int w, int h, int color,
+ Paint paint) {
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(1.0f);
+ paint.setColor(color);
+ canvas.translate(x, y);
+ canvas.drawRect(0, 0, w, h, paint);
+ canvas.translate(-x, -y);
+ }
+
+ public void setForeground(boolean foreground) {
+ mInForeground = foreground;
+ }
+
// TODO: clean up this method.
private void dismissKeyPreview() {
for (PointerTracker tracker : mPointerTrackers)
- tracker.updateKey(NOT_A_KEY);
- showPreview(NOT_A_KEY, null);
+ tracker.releaseKey();
+ showPreview(KeyDetector.NOT_A_KEY, null);
}
+ @Override
public void showPreview(int keyIndex, PointerTracker tracker) {
int oldKeyIndex = mOldPreviewKeyIndex;
mOldPreviewKeyIndex = keyIndex;
- final boolean isLanguageSwitchEnabled = (mKeyboard instanceof LatinKeyboard)
- && ((LatinKeyboard)mKeyboard).isLanguageSwitchEnabled();
// We should re-draw popup preview when 1) we need to hide the preview, 2) we will show
// the space key preview and 3) pointer moves off the space key to other letter key, we
// should hide the preview of the previous key.
+ @SuppressWarnings("unused")
final boolean hidePreviewOrShowSpaceKeyPreview = (tracker == null)
- || tracker.isSpaceKey(keyIndex) || tracker.isSpaceKey(oldKeyIndex);
+ || (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER
+ && 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) {
@@ -938,29 +930,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();
@@ -969,8 +967,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) {
@@ -984,7 +982,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];
@@ -992,21 +990,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;
@@ -1032,16 +1035,17 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
* @param key key in the attached {@link Keyboard}.
* @see #invalidateAllKeys
*/
+ @Override
public void invalidateKey(Key key) {
if (key == null)
return;
mInvalidatedKey = key;
// TODO we should clean up this and record key's region to use in onBufferDraw.
- mDirtyRect.union(key.x + getPaddingLeft(), key.y + getPaddingTop(),
- key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop());
+ mDirtyRect.union(key.mX + getPaddingLeft(), key.mY + getPaddingTop(),
+ key.mX + key.mWidth + getPaddingLeft(), key.mY + key.mHeight + getPaddingTop());
onBufferDraw();
- invalidate(key.x + getPaddingLeft(), key.y + getPaddingTop(),
- key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop());
+ invalidate(key.mX + getPaddingLeft(), key.mY + getPaddingTop(),
+ key.mX + key.mWidth + getPaddingLeft(), key.mY + key.mHeight + getPaddingTop());
}
private boolean openPopupIfRequired(int keyIndex, PointerTracker tracker) {
@@ -1064,42 +1068,56 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return result;
}
+ private void onLongPressShiftKey(PointerTracker tracker) {
+ tracker.setAlreadyProcessed();
+ mPointerQueue.remove(tracker);
+ mKeyboardActionListener.onCodeInput(Keyboard.CODE_CAPSLOCK, null, 0, 0);
+ }
+
+ private void onDoubleTapShiftKey(@SuppressWarnings("unused") PointerTracker tracker) {
+ // When shift key is double tapped, the first tap is correctly processed as usual tap. And
+ // the second tap is treated as this double tap event, so that we need not mark tracker
+ // calling setAlreadyProcessed() nor remove the tracker from mPointerQueueueue.
+ mKeyboardActionListener.onCodeInput(Keyboard.CODE_CAPSLOCK, null, 0, 0);
+ }
+
private View inflateMiniKeyboardContainer(Key popupKey) {
- int popupKeyboardId = popupKey.popupResId;
+ int popupKeyboardResId = mKeyboard.getPopupKeyboardResId();
LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
View container = inflater.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);
+ KeyboardView miniKeyboard =
+ (KeyboardView)container.findViewById(R.id.KeyboardView);
+ miniKeyboard.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() {
+ @Override
+ public void onCancelInput() {
dismissPopupKeyboard();
}
- public void swipeLeft() {
- }
- public void swipeRight() {
- }
- public void swipeUp() {
- }
- public void swipeDown() {
+ @Override
+ public void onSwipeDown() {
+ // Nothing to do.
}
+ @Override
public void onPress(int primaryCode) {
mKeyboardActionListener.onPress(primaryCode);
}
+ @Override
public void onRelease(int primaryCode) {
mKeyboardActionListener.onRelease(primaryCode);
}
@@ -1109,13 +1127,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// Remove gesture detector on mini-keyboard
miniKeyboard.mGestureDetector = null;
- Keyboard keyboard;
- if (popupKey.popupCharacters != null) {
- keyboard = new Keyboard(getContext(), popupKeyboardId, popupKey.popupCharacters,
- -1, getPaddingLeft() + getPaddingRight());
- } else {
- keyboard = new Keyboard(getContext(), popupKeyboardId);
- }
+ Keyboard keyboard = new MiniKeyboardBuilder(getContext(), popupKeyboardResId, popupKey)
+ .build();
miniKeyboard.setKeyboard(keyboard);
miniKeyboard.setPopupParent(this);
@@ -1127,14 +1140,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
private static boolean isOneRowKeys(List<Key> keys) {
if (keys.size() == 0) return false;
- final int edgeFlags = keys.get(0).edgeFlags;
+ final int edgeFlags = keys.get(0).mEdgeFlags;
// HACK: The first key of mini keyboard which was inflated from xml and has multiple rows,
// does not have both top and bottom edge flags on at the same time. On the other hand,
// the first key of mini keyboard that was created with popupCharacters must have both top
// and bottom edge flags on.
// When you want to use one row mini-keyboard from xml file, make sure that the row has
// both top and bottom edge flags set.
- return (edgeFlags & Keyboard.EDGE_TOP) != 0 && (edgeFlags & Keyboard.EDGE_BOTTOM) != 0;
+ return (edgeFlags & Keyboard.EDGE_TOP) != 0
+ && (edgeFlags & Keyboard.EDGE_BOTTOM) != 0;
}
/**
@@ -1145,10 +1159,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
* 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)
+ if (popupKey.mPopupCharacters == null)
return false;
View container = mMiniKeyboardCache.get(popupKey);
@@ -1156,7 +1167,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
container = inflateMiniKeyboardContainer(popupKey);
mMiniKeyboardCache.put(popupKey, container);
}
- mMiniKeyboard = (LatinKeyboardBaseView)container.findViewById(R.id.LatinKeyboardBaseView);
+ mMiniKeyboard = (KeyboardView)container.findViewById(R.id.KeyboardView);
if (mWindowOffset == null) {
mWindowOffset = new int[2];
getLocationInWindow(mWindowOffset);
@@ -1170,22 +1181,22 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// 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;
+ final int miniKeyWidth = miniKeys.size() > 0 ? miniKeys.get(0).mWidth : 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];
+ int popupX = popupKey.mX + mWindowOffset[0];
popupX += getPaddingLeft();
if (isNumberAtLeftmost) {
- popupX += popupKey.width - miniKeyWidth; // adjustment for a) described above
+ popupX += popupKey.mWidth - 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];
+ int popupY = popupKey.mY + mWindowOffset[1];
popupY += getPaddingTop();
popupY -= container.getMeasuredHeight();
popupY += container.getPaddingBottom();
@@ -1201,7 +1212,11 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
mMiniKeyboardOriginX = adjustedX + container.getPaddingLeft() - mWindowOffset[0];
mMiniKeyboardOriginY = y + container.getPaddingTop() - mWindowOffset[1];
mMiniKeyboard.setPopupOffset(adjustedX, y);
- mMiniKeyboard.setShifted(isShifted());
+ Keyboard baseMiniKeyboard = mMiniKeyboard.getKeyboard();
+ if (baseMiniKeyboard != null && baseMiniKeyboard.setShifted(mKeyboard == null
+ ? false : mKeyboard.isShiftedOrShiftLocked())) {
+ mMiniKeyboard.invalidateAllKeys();
+ }
// Mini keyboard needs no pop-up key preview displayed.
mMiniKeyboard.setPreviewEnabled(false);
mMiniKeyboardPopup.setContentView(container);
@@ -1212,8 +1227,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
// Inject down event on the key to mini keyboard.
long eventTime = SystemClock.uptimeMillis();
mMiniKeyboardPopupTime = eventTime;
- MotionEvent downEvent = generateMiniKeyboardMotionEvent(MotionEvent.ACTION_DOWN, popupKey.x
- + popupKey.width / 2, popupKey.y + popupKey.height / 2, eventTime);
+ MotionEvent downEvent = generateMiniKeyboardMotionEvent(MotionEvent.ACTION_DOWN, popupKey.mX
+ + popupKey.mWidth / 2, popupKey.mY + popupKey.mHeight / 2, eventTime);
mMiniKeyboard.onTouchEvent(downEvent);
downEvent.recycle();
@@ -1222,45 +1237,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
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))) {
+ if (key.mPopupCharacters != null && key.mPopupCharacters.length > 1) {
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))) {
+ private static boolean isNumberAtLeftmostPopupChar(Key key) {
+ if (key.mPopupCharacters != null && isAsciiDigit(key.mPopupCharacters[0].charAt(0))) {
return true;
}
return false;
@@ -1278,14 +1262,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);
@@ -1294,15 +1278,29 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return pointers.get(id);
}
+ public boolean isInSlidingKeyInput() {
+ if (mMiniKeyboard != null) {
+ return mMiniKeyboard.isInSlidingKeyInput();
+ } else {
+ return mPointerQueue.isInSlidingKeyInput();
+ }
+ }
+
+ public int getPointerCount() {
+ return mOldPointerCount;
+ }
+
@Override
public boolean onTouchEvent(MotionEvent me) {
- final int pointerCount = me.getPointerCount();
final int action = me.getActionMasked();
+ final int pointerCount = me.getPointerCount();
+ final int oldPointerCount = mOldPointerCount;
+ mOldPointerCount = pointerCount;
// 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 && mOldPointerCount > 1) {
+ if (!mHasDistinctMultitouch && pointerCount > 1 && oldPointerCount > 1) {
return true;
}
@@ -1358,7 +1356,6 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
if (!mHasDistinctMultitouch) {
// Use only main (id=0) pointer tracker.
PointerTracker tracker = getPointerTracker(0);
- int oldPointerCount = mOldPointerCount;
if (pointerCount == 1 && oldPointerCount == 2) {
// Multi-touch to single touch transition.
// Send a down event for the latest pointer.
@@ -1373,7 +1370,6 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
Log.w(TAG, "Unknown touch panel behavior: pointer count is " + pointerCount
+ " (old " + oldPointerCount + ")");
}
- mOldPointerCount = pointerCount;
return true;
}
@@ -1435,20 +1431,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
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() {
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..7b079e38e
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
@@ -0,0 +1,444 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import java.util.List;
+import java.util.Locale;
+
+// TODO: We should remove this class
+public class LatinKeyboard extends Keyboard {
+
+ private static final boolean DEBUG_PREFERRED_LETTER = false;
+ private static final String TAG = "LatinKeyboard";
+
+ public static final int OPACITY_FULLY_OPAQUE = 255;
+ private static final int SPACE_LED_LENGTH_PERCENT = 80;
+
+ private final Drawable mSpaceAutoCorrectionIndicator;
+ private final Drawable mButtonArrowLeftIcon;
+ private final Drawable mButtonArrowRightIcon;
+ private final int mSpaceBarTextShadowColor;
+ private int mSpaceKeyIndex = -1;
+ private int mSpaceDragStartX;
+ private int mSpaceDragLastDiff;
+ private final Context mContext;
+ private boolean mCurrentlyInSpace;
+ private SlidingLocaleDrawable mSlidingLocaleIcon;
+ private int[] mPrefLetterFrequencies;
+ private int mPrefLetter;
+ private int mPrefLetterX;
+ private int mPrefLetterY;
+ private int mPrefDistance;
+
+ private static final float SPACEBAR_DRAG_THRESHOLD = 0.8f;
+ private static final float OVERLAP_PERCENTAGE_LOW_PROB = 0.70f;
+ private static final float OVERLAP_PERCENTAGE_HIGH_PROB = 0.85f;
+ // Minimum width of space key preview (proportional to keyboard width)
+ private static final float SPACEBAR_POPUP_MIN_RATIO = 0.4f;
+ // Height in space key the language name will be drawn. (proportional to space key height)
+ public static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f;
+ // If the full language name needs to be smaller than this value to be drawn on space key,
+ // its short language name will be used instead.
+ private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f;
+
+ private static int sSpacebarVerticalCorrection;
+
+ 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;
+ if (id.mColorScheme == KeyboardView.COLOR_SCHEME_BLACK) {
+ mSpaceBarTextShadowColor = res.getColor(
+ R.color.latinkeyboard_bar_language_shadow_black);
+ } else { // default color scheme is KeyboardView.COLOR_SCHEME_WHITE
+ mSpaceBarTextShadowColor = res.getColor(
+ R.color.latinkeyboard_bar_language_shadow_white);
+ }
+ 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);
+ sSpacebarVerticalCorrection = res.getDimensionPixelOffset(
+ R.dimen.spacebar_vertical_correction);
+ mSpaceKeyIndex = indexOf(CODE_SPACE);
+ }
+
+ /**
+ * @return a key which should be invalidated.
+ */
+ public Key onAutoCorrectionStateChanged(boolean isAutoCorrection) {
+ updateSpaceBarForLocale(isAutoCorrection);
+ return mSpaceKey;
+ }
+
+ private void updateSpaceBarForLocale(boolean isAutoCorrection) {
+ final Resources res = mContext.getResources();
+ // If application locales are explicitly selected.
+ if (SubtypeSwitcher.getInstance().needsToDisplayLanguage()) {
+ mSpaceKey.setIcon(new BitmapDrawable(res,
+ drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCorrection)));
+ } else {
+ // sym_keyboard_space_led can be shared with Black and White symbol themes.
+ if (isAutoCorrection) {
+ mSpaceKey.setIcon(new BitmapDrawable(res,
+ drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCorrection)));
+ } else {
+ mSpaceKey.setIcon(mSpaceIcon);
+ }
+ }
+ }
+
+ // Compute width of text with specified text size using paint.
+ private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) {
+ paint.setTextSize(textSize);
+ paint.getTextBounds(text, 0, text.length(), bounds);
+ return bounds.width();
+ }
+
+ // Layout local language name and left and right arrow on 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 = SubtypeSwitcher.getDisplayLanguage(locale);
+ int textWidth = getTextWidth(paint, language, origTextSize, bounds);
+ // Assuming text width and text size are proportional to each other.
+ float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f);
+
+ final boolean useShortName;
+ if (allowVariableTextSize) {
+ textWidth = getTextWidth(paint, language, textSize, bounds);
+ // If text size goes too small or text does not fit, use short name
+ useShortName = textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME
+ || textWidth > maxTextWidth;
+ } else {
+ useShortName = textWidth > maxTextWidth;
+ textSize = origTextSize;
+ }
+ if (useShortName) {
+ language = 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;
+ }
+
+ @SuppressWarnings("unused")
+ private Bitmap drawSpaceBar(int opacity, boolean isAutoCorrection) {
+ final int width = mSpaceKey.mWidth;
+ final int height = mSpaceIcon.getIntrinsicHeight();
+ final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ final Canvas canvas = new Canvas(buffer);
+ final Resources res = mContext.getResources();
+ canvas.drawColor(res.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR);
+
+ SubtypeSwitcher subtypeSwitcher = SubtypeSwitcher.getInstance();
+ // If application locales are explicitly selected.
+ if (subtypeSwitcher.needsToDisplayLanguage()) {
+ final Paint paint = new Paint();
+ paint.setAlpha(opacity);
+ paint.setAntiAlias(true);
+ paint.setTextAlign(Align.CENTER);
+
+ final String textSizeOfLanguageOnSpacebar = res.getString(
+ R.string.config_text_size_of_language_on_spacebar,
+ SMALL_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR);
+ final int textStyle;
+ final int defaultTextSize;
+ if (MEDIUM_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR.equals(textSizeOfLanguageOnSpacebar)) {
+ textStyle = android.R.style.TextAppearance_Medium;
+ defaultTextSize = 18;
+ } else {
+ textStyle = android.R.style.TextAppearance_Small;
+ defaultTextSize = 14;
+ }
+
+ final boolean allowVariableTextSize = true;
+ final String language = layoutSpaceBar(paint, subtypeSwitcher.getInputLocale(),
+ mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height,
+ getTextSizeFromTheme(textStyle, defaultTextSize),
+ allowVariableTextSize);
+
+ // Draw language text with shadow
+ final float baseline = height * SPACEBAR_LANGUAGE_BASELINE;
+ final float descent = paint.descent();
+ paint.setColor(mSpaceBarTextShadowColor);
+ canvas.drawText(language, width / 2, baseline - descent - 1, paint);
+ paint.setColor(res.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 (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER
+ && 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 {
+ final int iconWidth = mSpaceIcon.getIntrinsicWidth();
+ final int iconHeight = mSpaceIcon.getIntrinsicHeight();
+ int x = (width - iconWidth) / 2;
+ int y = height - iconHeight;
+ mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight);
+ mSpaceIcon.draw(canvas);
+ }
+ return buffer;
+ }
+
+ private void updateLocaleDrag(int diff) {
+ if (mSlidingLocaleIcon == null) {
+ final int width = Math.max(mSpaceKey.mWidth,
+ (int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO));
+ final int height = mSpacePreviewIcon.getIntrinsicHeight();
+ mSlidingLocaleIcon =
+ new SlidingLocaleDrawable(mContext, mSpacePreviewIcon, width, height);
+ mSlidingLocaleIcon.setBounds(0, 0, width, height);
+ mSpaceKey.setPreviewIcon(mSlidingLocaleIcon);
+ }
+ mSlidingLocaleIcon.setDiff(diff);
+ if (Math.abs(diff) == Integer.MAX_VALUE) {
+ mSpaceKey.setPreviewIcon(mSpacePreviewIcon);
+ } else {
+ mSpaceKey.setPreviewIcon(mSlidingLocaleIcon);
+ }
+ mSpaceKey.getPreviewIcon().invalidateSelf();
+ }
+
+ public int getLanguageChangeDirection() {
+ if (mSpaceKey == null || SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() <= 1
+ || Math.abs(mSpaceDragLastDiff) < mSpaceKey.mWidth * SPACEBAR_DRAG_THRESHOLD) {
+ return 0; // No change
+ }
+ return mSpaceDragLastDiff > 0 ? 1 : -1;
+ }
+
+ public void setPreferredLetters(int[] frequencies) {
+ mPrefLetterFrequencies = frequencies;
+ mPrefLetter = 0;
+ }
+
+ public void keyReleased() {
+ mCurrentlyInSpace = false;
+ mSpaceDragLastDiff = 0;
+ mPrefLetter = 0;
+ mPrefLetterX = 0;
+ mPrefLetterY = 0;
+ mPrefDistance = Integer.MAX_VALUE;
+ if (mSpaceKey != null) {
+ updateLocaleDrag(Integer.MAX_VALUE);
+ }
+ }
+
+ /**
+ * Does the magic of locking the touch gesture into the spacebar when
+ * switching input languages.
+ */
+ @Override
+ @SuppressWarnings("unused") // SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER is constant
+ public boolean isInside(Key key, int pointX, int pointY) {
+ int x = pointX;
+ int y = pointY;
+ final int code = key.mCode;
+ if (code == CODE_SHIFT || code == CODE_DELETE) {
+ y -= key.mHeight / 10;
+ if (code == CODE_SHIFT) x += key.mWidth / 6;
+ if (code == CODE_DELETE) x -= key.mWidth / 6;
+ } else if (code == CODE_SPACE) {
+ y += LatinKeyboard.sSpacebarVerticalCorrection;
+ if (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER
+ && SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() > 1) {
+ if (mCurrentlyInSpace) {
+ int diff = x - mSpaceDragStartX;
+ if (Math.abs(diff - mSpaceDragLastDiff) > 0) {
+ updateLocaleDrag(diff);
+ }
+ mSpaceDragLastDiff = diff;
+ return true;
+ } else {
+ boolean isOnSpace = key.isOnKey(x, y);
+ if (isOnSpace) {
+ mCurrentlyInSpace = true;
+ mSpaceDragStartX = x;
+ updateLocaleDrag(0);
+ }
+ return isOnSpace;
+ }
+ }
+ } else if (mPrefLetterFrequencies != null) {
+ // New coordinate? Reset
+ if (mPrefLetterX != x || mPrefLetterY != y) {
+ mPrefLetter = 0;
+ mPrefDistance = Integer.MAX_VALUE;
+ }
+ // Handle preferred next letter
+ final int[] pref = mPrefLetterFrequencies;
+ if (mPrefLetter > 0) {
+ if (DEBUG_PREFERRED_LETTER) {
+ if (mPrefLetter == code && !key.isOnKey(x, y)) {
+ Log.d(TAG, "CORRECTED !!!!!!");
+ }
+ }
+ return mPrefLetter == code;
+ } else {
+ final boolean isOnKey = key.isOnKey(x, y);
+ int[] nearby = getNearestKeys(x, y);
+ List<Key> nearbyKeys = getKeys();
+ if (isOnKey) {
+ // If it's a preferred letter
+ if (inPrefList(code, pref)) {
+ // Check if its frequency is much lower than a nearby key
+ mPrefLetter = code;
+ mPrefLetterX = x;
+ mPrefLetterY = y;
+ for (int i = 0; i < nearby.length; i++) {
+ Key k = nearbyKeys.get(nearby[i]);
+ if (k != key && inPrefList(k.mCode, pref)) {
+ final int dist = distanceFrom(k, x, y);
+ if (dist < (int) (k.mWidth * OVERLAP_PERCENTAGE_LOW_PROB) &&
+ (pref[k.mCode] > pref[mPrefLetter] * 3)) {
+ mPrefLetter = k.mCode;
+ mPrefDistance = dist;
+ if (DEBUG_PREFERRED_LETTER) {
+ Log.d(TAG, "CORRECTED ALTHOUGH PREFERRED !!!!!!");
+ }
+ break;
+ }
+ }
+ }
+
+ return mPrefLetter == code;
+ }
+ }
+
+ // Get the surrounding keys and intersect with the preferred list
+ // For all in the intersection
+ // if distance from touch point is within a reasonable distance
+ // make this the pref letter
+ // If no pref letter
+ // return inside;
+ // else return thiskey == prefletter;
+
+ for (int i = 0; i < nearby.length; i++) {
+ Key k = nearbyKeys.get(nearby[i]);
+ if (inPrefList(k.mCode, pref)) {
+ final int dist = distanceFrom(k, x, y);
+ if (dist < (int) (k.mWidth * OVERLAP_PERCENTAGE_HIGH_PROB)
+ && dist < mPrefDistance) {
+ mPrefLetter = k.mCode;
+ mPrefLetterX = x;
+ mPrefLetterY = y;
+ mPrefDistance = dist;
+ }
+ }
+ }
+ // Didn't find any
+ if (mPrefLetter == 0) {
+ return isOnKey;
+ } else {
+ return mPrefLetter == code;
+ }
+ }
+ }
+
+ // Lock into the spacebar
+ if (mCurrentlyInSpace) return false;
+
+ return key.isOnKey(x, y);
+ }
+
+ private boolean inPrefList(int code, int[] pref) {
+ if (code < pref.length && code >= 0) return pref[code] > 0;
+ return false;
+ }
+
+ private int distanceFrom(Key k, int x, int y) {
+ if (y > k.mY && y < k.mY + k.mHeight) {
+ return Math.abs(k.mX + k.mWidth / 2 - x);
+ } else {
+ return Integer.MAX_VALUE;
+ }
+ }
+
+ @Override
+ public int[] getNearestKeys(int x, int y) {
+ if (mCurrentlyInSpace) {
+ return new int[] { mSpaceKeyIndex };
+ } 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).mCode == 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;
+ }
+}
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..cb3b430d5
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -0,0 +1,240 @@
+/*
+ * 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.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.view.MotionEvent;
+
+// TODO: We should remove this class
+public class LatinKeyboardView extends KeyboardView {
+
+ /** Whether we've started dropping move events because we found a big jump */
+ private boolean mDroppingEvents;
+ /**
+ * Whether multi-touch disambiguation needs to be disabled if a real multi-touch event has
+ * occured
+ */
+ private boolean mDisableDisambiguation;
+ /** The distance threshold at which we start treating the touch session as a multi-touch */
+ private int mJumpThresholdSquare = Integer.MAX_VALUE;
+ /** The y coordinate of the last row */
+ private int mLastRowY;
+ private int mLastX;
+ private int mLastY;
+
+ public LatinKeyboardView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ public void setPreviewEnabled(boolean previewEnabled) {
+ LatinKeyboard latinKeyboard = getLatinKeyboard();
+ if (latinKeyboard != null
+ && (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard())) {
+ // Phone and number keyboard never shows popup preview (except language switch).
+ super.setPreviewEnabled(false);
+ } else {
+ super.setPreviewEnabled(previewEnabled);
+ }
+ }
+
+ public void setLatinKeyboard(LatinKeyboard k) {
+ super.setKeyboard(k);
+ // One-seventh of the keyboard width seems like a reasonable threshold
+ mJumpThresholdSquare = k.getMinWidth() / 7;
+ mJumpThresholdSquare *= mJumpThresholdSquare;
+ // Assuming there are 4 rows, this is the coordinate of the last row
+ mLastRowY = (k.getHeight() * 3) / 4;
+ }
+
+ public LatinKeyboard getLatinKeyboard() {
+ Keyboard keyboard = getKeyboard();
+ if (keyboard instanceof LatinKeyboard) {
+ return (LatinKeyboard)keyboard;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ protected boolean onLongPress(Key key) {
+ 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);
+ }
+ }
+
+ private boolean invokeOnKey(int primaryCode) {
+ getOnKeyboardActionListener().onCodeInput(primaryCode, null,
+ KeyboardView.NOT_A_TOUCH_COORDINATE,
+ KeyboardView.NOT_A_TOUCH_COORDINATE);
+ return true;
+ }
+
+ @Override
+ protected CharSequence adjustCase(CharSequence label) {
+ LatinKeyboard keyboard = getLatinKeyboard();
+ if (keyboard.isAlphaKeyboard()
+ && keyboard.isShiftedOrShiftLocked()
+ && !TextUtils.isEmpty(label) && label.length() < 3
+ && Character.isLowerCase(label.charAt(0))) {
+ return label.toString().toUpperCase();
+ }
+ return label;
+ }
+
+ /**
+ * This function checks to see if we need to handle any sudden jumps in the pointer location
+ * that could be due to a multi-touch being treated as a move by the firmware or hardware.
+ * Once a sudden jump is detected, all subsequent move events are discarded
+ * until an UP is received.<P>
+ * When a sudden jump is detected, an UP event is simulated at the last position and when
+ * the sudden moves subside, a DOWN event is simulated for the second key.
+ * @param me the motion event
+ * @return true if the event was consumed, so that it doesn't continue to be handled by
+ * KeyboardView.
+ */
+ private boolean handleSuddenJump(MotionEvent me) {
+ final int action = me.getAction();
+ final int x = (int) me.getX();
+ final int y = (int) me.getY();
+ boolean result = false;
+
+ // Real multi-touch event? Stop looking for sudden jumps
+ if (me.getPointerCount() > 1) {
+ mDisableDisambiguation = true;
+ }
+ if (mDisableDisambiguation) {
+ // If UP, reset the multi-touch flag
+ if (action == MotionEvent.ACTION_UP) mDisableDisambiguation = false;
+ return false;
+ }
+
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ // Reset the "session"
+ mDroppingEvents = false;
+ mDisableDisambiguation = false;
+ break;
+ case MotionEvent.ACTION_MOVE:
+ // Is this a big jump?
+ final int distanceSquare = (mLastX - x) * (mLastX - x) + (mLastY - y) * (mLastY - y);
+ // Check the distance and also if the move is not entirely within the bottom row
+ // If it's only in the bottom row, it might be an intentional slide gesture
+ // for language switching
+ if (distanceSquare > mJumpThresholdSquare
+ && (mLastY < mLastRowY || y < mLastRowY)) {
+ // If we're not yet dropping events, start dropping and send an UP event
+ if (!mDroppingEvents) {
+ mDroppingEvents = true;
+ // Send an up event
+ MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
+ MotionEvent.ACTION_UP,
+ mLastX, mLastY, me.getMetaState());
+ super.onTouchEvent(translated);
+ translated.recycle();
+ }
+ result = true;
+ } else if (mDroppingEvents) {
+ // If moves are small and we're already dropping events, continue dropping
+ result = true;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mDroppingEvents) {
+ // Send a down event first, as we dropped a bunch of sudden jumps and assume that
+ // the user is releasing the touch on the second key.
+ MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
+ MotionEvent.ACTION_DOWN,
+ x, y, me.getMetaState());
+ super.onTouchEvent(translated);
+ translated.recycle();
+ mDroppingEvents = false;
+ // Let the up event get processed as well, result = false
+ }
+ break;
+ }
+ // Track the previous coordinate
+ mLastX = x;
+ mLastY = y;
+ return result;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent me) {
+ LatinKeyboard keyboard = getLatinKeyboard();
+
+ // If 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().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/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
new file mode 100644
index 000000000..1eb0c3f37
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+import java.util.List;
+
+public class MiniKeyboardBuilder {
+ private final Resources mRes;
+ private final Keyboard mKeyboard;
+ private final CharSequence[] mPopupCharacters;
+ private final int mMaxColumns;
+ private final int mNumRows;
+ private int mColPos;
+ private int mRowPos;
+ private Row mRow;
+ private int mX;
+ private int mY;
+
+ public MiniKeyboardBuilder(Context context, int layoutTemplateResId, Key popupKey) {
+ mRes = context.getResources();
+ mKeyboard = new Keyboard(context, layoutTemplateResId, null);
+ mPopupCharacters = popupKey.mPopupCharacters;
+ final int numKeys = mPopupCharacters.length;
+ final int maxColumns = popupKey.mMaxPopupColumn;
+ int numRows = numKeys / maxColumns;
+ if (numKeys % maxColumns != 0) numRows++;
+ mMaxColumns = maxColumns;
+ mNumRows = numRows;
+ // TODO: To determine key width we should pay attention to key label length.
+ mRow = new Row(mKeyboard, getRowFlags());
+ if (numRows > 1) {
+ mColPos = numKeys % maxColumns;
+ if (mColPos > 0) mColPos = maxColumns - mColPos;
+ // Centering top-row keys.
+ mX = mColPos * (mRow.mDefaultWidth + mRow.mDefaultHorizontalGap) / 2;
+ }
+ mKeyboard.setMinWidth(0);
+ }
+
+ public Keyboard build() {
+ List<Key> keys = mKeyboard.getKeys();
+ for (CharSequence label : mPopupCharacters) {
+ refresh();
+ final Key key = new Key(mRes, mRow, label, mX, mY);
+ keys.add(key);
+ advance();
+ }
+ finish();
+ return mKeyboard;
+ }
+
+ private int getRowFlags() {
+ final int rowPos = mRowPos;
+ int rowFlags = 0;
+ if (rowPos == 0) rowFlags |= Keyboard.EDGE_TOP;
+ if (rowPos == mNumRows - 1) rowFlags |= Keyboard.EDGE_BOTTOM;
+ return rowFlags;
+ }
+
+ private void refresh() {
+ if (mColPos >= mMaxColumns) {
+ final Row row = mRow;
+ // TODO: Allocate key position depending the precedence of popup characters.
+ mX = 0;
+ mY += row.mDefaultHeight + row.mVerticalGap;
+ mColPos = 0;
+ // TODO: To determine key width we should pay attention to key label length from
+ // bottom to up for rows.
+ mRow = new Row(mKeyboard, getRowFlags());
+ mRowPos++;
+ }
+ }
+
+ private void advance() {
+ final Row row = mRow;
+ final Keyboard keyboard = mKeyboard;
+ // TODO: Allocate key position depending the precedence of popup characters.
+ mX += row.mDefaultWidth + row.mDefaultHorizontalGap;
+ if (mX > keyboard.getMinWidth())
+ keyboard.setMinWidth(mX);
+ mColPos++;
+ }
+
+ private void finish() {
+ mKeyboard.setHeight(mY + mRow.mDefaultHeight);
+ }
+} \ No newline at end of file
diff --git a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
index 356e62d48..f04991eb7 100644
--- a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
@@ -14,11 +14,9 @@
* the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.keyboard;
-import android.inputmethodservice.Keyboard.Key;
-
-class MiniKeyboardKeyDetector extends KeyDetector {
+public class MiniKeyboardKeyDetector extends KeyDetector {
private static final int MAX_NEARBY_KEYS = 1;
private final int mSlideAllowanceSquare;
@@ -41,19 +39,20 @@ class MiniKeyboardKeyDetector extends KeyDetector {
final Key[] keys = getKeys();
final int touchX = getTouchX(x);
final int touchY = getTouchY(y);
- int closestKeyIndex = LatinKeyboardBaseView.NOT_A_KEY;
+
+ int closestKeyIndex = NOT_A_KEY;
int closestKeyDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare;
final int keyCount = keys.length;
- for (int i = 0; i < keyCount; i++) {
- final Key key = keys[i];
- int dist = key.squaredDistanceFrom(touchX, touchY);
+ for (int index = 0; index < keyCount; index++) {
+ final int dist = keys[index].squaredDistanceToEdge(touchX, touchY);
if (dist < closestKeyDist) {
- closestKeyIndex = i;
+ closestKeyIndex = index;
closestKeyDist = dist;
}
}
- if (allKeys != null && closestKeyIndex != LatinKeyboardBaseView.NOT_A_KEY)
- allKeys[0] = keys[closestKeyIndex].codes[0];
+
+ if (allKeys != null && closestKeyIndex != NOT_A_KEY)
+ allKeys[0] = keys[closestKeyIndex].mCode;
return closestKeyIndex;
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java b/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
new file mode 100644
index 000000000..f215db876
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import android.util.Log;
+
+public class ModifierKeyState {
+ protected static final String TAG = "ModifierKeyState";
+ protected static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE;
+
+ protected static final int RELEASING = 0;
+ protected static final int PRESSING = 1;
+ protected static final int MOMENTARY = 2;
+
+ protected final String mName;
+ protected int mState = RELEASING;
+
+ public ModifierKeyState(String name) {
+ mName = name;
+ }
+
+ public void onPress() {
+ final int oldState = mState;
+ mState = PRESSING;
+ if (DEBUG)
+ Log.d(TAG, mName + ".onPress: " + toString(oldState) + " > " + this);
+ }
+
+ public void onRelease() {
+ final int oldState = mState;
+ mState = RELEASING;
+ if (DEBUG)
+ Log.d(TAG, mName + ".onRelease: " + toString(oldState) + " > " + this);
+ }
+
+ public void onOtherKeyPressed() {
+ final int oldState = mState;
+ if (oldState == PRESSING)
+ mState = MOMENTARY;
+ if (DEBUG)
+ Log.d(TAG, mName + ".onOtherKeyPressed: " + toString(oldState) + " > " + this);
+ }
+
+ public boolean isPressing() {
+ return mState == PRESSING;
+ }
+
+ public boolean isReleasing() {
+ return mState == RELEASING;
+ }
+
+ public boolean isMomentary() {
+ return mState == MOMENTARY;
+ }
+
+ @Override
+ public String toString() {
+ return toString(mState);
+ }
+
+ protected String toString(int state) {
+ switch (state) {
+ case RELEASING: return "RELEASING";
+ case PRESSING: return "PRESSING";
+ case MOMENTARY: return "MOMENTARY";
+ default: return "UNKNOWN";
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
new file mode 100644
index 000000000..7928c4f8e
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -0,0 +1,478 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.keyboard.KeyboardView.UIHandler;
+import com.android.inputmethod.latin.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 DEBUG_EVENT = false;
+ private static final boolean DEBUG_MOVE_EVENT = false;
+ private static final boolean DEBUG_LISTENER = 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 mLongPressShiftKeyTimeout;
+
+ // Miscellaneous constants
+ private static final int NOT_A_KEY = KeyDetector.NOT_A_KEY;
+ private static final int[] KEY_DELETE = { Keyboard.CODE_DELETE };
+
+ 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 Keyboard mKeyboard;
+ private Key[] mKeys;
+ private int mKeyHysteresisDistanceSquared = -1;
+
+ private final PointerTrackerKeyState mKeyState;
+
+ // true if event is already translated to a key action (long press or mini-keyboard)
+ private boolean mKeyAlreadyProcessed;
+
+ // true if this pointer is repeatable key
+ private boolean mIsRepeatableKey;
+
+ // true if this pointer is in sliding key input
+ private boolean mIsInSlidingKeyInput;
+
+ // true if sliding key is allowed.
+ private boolean mIsAllowedSlidingKeyInput;
+
+ // pressed key
+ private int mPreviousKey = NOT_A_KEY;
+
+ // Empty {@link KeyboardActionListener}
+ private static final KeyboardActionListener EMPTY_LISTENER = new KeyboardActionListener() {
+ @Override
+ public void onPress(int primaryCode) {}
+ @Override
+ public void onRelease(int primaryCode) {}
+ @Override
+ public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) {}
+ @Override
+ public void onTextInput(CharSequence text) {}
+ @Override
+ public void onCancelInput() {}
+ @Override
+ public void onSwipeDown() {}
+ };
+
+ public PointerTracker(int id, UIHandler handler, KeyDetector keyDetector, UIProxy proxy,
+ Resources res) {
+ if (proxy == null || handler == null || keyDetector == null)
+ throw new NullPointerException();
+ mPointerId = id;
+ mProxy = proxy;
+ mHandler = handler;
+ mKeyDetector = keyDetector;
+ mKeyboardSwitcher = KeyboardSwitcher.getInstance();
+ mKeyState = new PointerTrackerKeyState(keyDetector);
+ mHasDistinctMultitouch = proxy.hasDistinctMultitouch();
+ mConfigSlidingKeyInputEnabled = res.getBoolean(R.bool.config_sliding_key_input_enabled);
+ mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start);
+ mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout);
+ mLongPressShiftKeyTimeout = res.getInteger(R.integer.config_long_press_shift_key_timeout);
+ }
+
+ public void setOnKeyboardActionListener(KeyboardActionListener listener) {
+ mListener = listener;
+ }
+
+ private void callListenerOnPress(int primaryCode) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onPress : " + keyCodePrintable(primaryCode));
+ mListener.onPress(primaryCode);
+ }
+
+ private void callListenerOnCodeInput(int primaryCode, int[] keyCodes, int x, int y) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onCodeInput: " + keyCodePrintable(primaryCode)
+ + " codes="+ Arrays.toString(keyCodes) + " x=" + x + " y=" + y);
+ mListener.onCodeInput(primaryCode, keyCodes, x, y);
+ }
+
+ private void callListenerOnTextInput(CharSequence text) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onTextInput: text=" + text);
+ mListener.onTextInput(text);
+ }
+
+ private void callListenerOnRelease(int primaryCode) {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onRelease : " + keyCodePrintable(primaryCode));
+ mListener.onRelease(primaryCode);
+ }
+
+ private void callListenerOnCancelInput() {
+ if (DEBUG_LISTENER)
+ Log.d(TAG, "onCancelInput");
+ mListener.onCancelInput();
+ }
+
+ public void setKeyboard(Keyboard keyboard, Key[] keys, float keyHysteresisDistance) {
+ if (keyboard == null || keys == null || keyHysteresisDistance < 0)
+ throw new IllegalArgumentException();
+ mKeyboard = keyboard;
+ mKeys = keys;
+ mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance);
+ // Update current key index because keyboard layout has been changed.
+ mKeyState.onSetKeyboard();
+ }
+
+ 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());
+ }
+
+ public 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;
+ }
+
+ 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_EVENT)
+ printTouchEvent("onDownEvent:", x, y, eventTime);
+ int keyIndex = mKeyState.onDownKey(x, y, eventTime);
+ // Sliding key is allowed when 1) enabled by configuration, 2) this pointer starts sliding
+ // from modifier key, or 3) this pointer is on mini-keyboard.
+ mIsAllowedSlidingKeyInput = mConfigSlidingKeyInputEnabled || isModifierInternal(keyIndex)
+ || mKeyDetector instanceof MiniKeyboardKeyDetector;
+ mKeyAlreadyProcessed = false;
+ mIsRepeatableKey = false;
+ mIsInSlidingKeyInput = false;
+ if (isValidKeyIndex(keyIndex)) {
+ callListenerOnPress(mKeys[keyIndex].mCode);
+ // This onPress call may have changed keyboard layout and have updated mKeyIndex.
+ // If that's the case, mKeyIndex has been updated in setKeyboard().
+ keyIndex = mKeyState.getKeyIndex();
+ }
+ if (isValidKeyIndex(keyIndex)) {
+ if (mKeys[keyIndex].mRepeatable) {
+ repeatKey(keyIndex);
+ mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this);
+ mIsRepeatableKey = true;
+ }
+ startLongPressTimer(keyIndex);
+ }
+ showKeyPreviewAndUpdateKeyGraphics(keyIndex);
+ }
+
+ public void onMoveEvent(int x, int y, long eventTime) {
+ if (DEBUG_MOVE_EVENT)
+ printTouchEvent("onMoveEvent:", x, y, eventTime);
+ if (mKeyAlreadyProcessed)
+ return;
+ final PointerTrackerKeyState keyState = mKeyState;
+ final 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.
+ callListenerOnPress(getKey(keyIndex).mCode);
+ keyState.onMoveToNewKey(keyIndex, x, y);
+ startLongPressTimer(keyIndex);
+ } else if (!isMinorMoveBounce(x, y, keyIndex)) {
+ // The pointer has been slid in to the new key from the previous key, we must call
+ // onRelease() first to notify that the previous key has been released, then call
+ // onPress() to notify that the new key is being pressed.
+ mIsInSlidingKeyInput = true;
+ callListenerOnRelease(oldKey.mCode);
+ mHandler.cancelLongPressTimers();
+ if (mIsAllowedSlidingKeyInput) {
+ callListenerOnPress(getKey(keyIndex).mCode);
+ keyState.onMoveToNewKey(keyIndex, x, y);
+ startLongPressTimer(keyIndex);
+ } else {
+ setAlreadyProcessed();
+ showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY);
+ return;
+ }
+ }
+ } else {
+ if (oldKey != null && !isMinorMoveBounce(x, y, keyIndex)) {
+ // The pointer has been slid out from the previous key, we must call onRelease() to
+ // notify that the previous key has been released.
+ mIsInSlidingKeyInput = true;
+ callListenerOnRelease(oldKey.mCode);
+ mHandler.cancelLongPressTimers();
+ if (mIsAllowedSlidingKeyInput) {
+ keyState.onMoveToNewKey(keyIndex, x ,y);
+ } else {
+ setAlreadyProcessed();
+ showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY);
+ return;
+ }
+ }
+ }
+ showKeyPreviewAndUpdateKeyGraphics(mKeyState.getKeyIndex());
+ }
+
+ public void onUpEvent(int pointX, int pointY, long eventTime) {
+ int x = pointX;
+ int y = pointY;
+ if (DEBUG_EVENT)
+ printTouchEvent("onUpEvent :", x, y, eventTime);
+ mHandler.cancelKeyTimers();
+ mHandler.cancelPopupPreview();
+ showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY);
+ mIsInSlidingKeyInput = false;
+ if (mKeyAlreadyProcessed)
+ return;
+ final PointerTrackerKeyState keyState = mKeyState;
+ int keyIndex = keyState.onUpKey(x, y);
+ 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) {
+ if (DEBUG_EVENT)
+ printTouchEvent("onCancelEvt:", x, y, eventTime);
+ mHandler.cancelKeyTimers();
+ mHandler.cancelPopupPreview();
+ showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY);
+ mIsInSlidingKeyInput = false;
+ int keyIndex = mKeyState.getKeyIndex();
+ if (isValidKeyIndex(keyIndex))
+ mProxy.invalidateKey(mKeys[keyIndex]);
+ }
+
+ public void repeatKey(int keyIndex) {
+ Key key = getKey(keyIndex);
+ if (key != null) {
+ detectAndSendKey(keyIndex, key.mX, key.mY);
+ }
+ }
+
+ public int getLastX() {
+ return mKeyState.getLastX();
+ }
+
+ public int getLastY() {
+ return mKeyState.getLastY();
+ }
+
+ public long getDownTime() {
+ return mKeyState.getDownTime();
+ }
+
+ // These package scope methods are only for debugging purpose.
+ /* package */ int getStartX() {
+ return mKeyState.getStartX();
+ }
+
+ /* package */ int getStartY() {
+ return mKeyState.getStartY();
+ }
+
+ private boolean isMinorMoveBounce(int x, int y, int newKey) {
+ if (mKeys == null || mKeyHysteresisDistanceSquared < 0)
+ throw new IllegalStateException("keyboard and/or hysteresis not set");
+ int curKey = mKeyState.getKeyIndex();
+ if (newKey == curKey) {
+ return true;
+ } else if (isValidKeyIndex(curKey)) {
+ return mKeys[curKey].squaredDistanceToEdge(x, y) < mKeyHysteresisDistanceSquared;
+ } else {
+ return false;
+ }
+ }
+
+ private void showKeyPreviewAndUpdateKeyGraphics(int keyIndex) {
+ updateKeyGraphics(keyIndex);
+ // The modifier key, such as shift key, should not be shown as preview when multi-touch is
+ // supported. On the other hand, if multi-touch is not supported, the modifier key should
+ // be shown as preview.
+ if (mHasDistinctMultitouch && isModifier()) {
+ mProxy.showPreview(NOT_A_KEY, this);
+ } else {
+ mProxy.showPreview(keyIndex, this);
+ }
+ }
+
+ private void startLongPressTimer(int keyIndex) {
+ Key key = getKey(keyIndex);
+ if (key.mCode == Keyboard.CODE_SHIFT) {
+ mHandler.startLongPressShiftTimer(mLongPressShiftKeyTimeout, keyIndex, this);
+ } else if (mKeyboardSwitcher.isInMomentaryAutoModeSwitchState()) {
+ // We use longer timeout for sliding finger input started from the symbols mode key.
+ mHandler.startLongPressTimer(mLongPressKeyTimeout * 2, keyIndex, this);
+ } else {
+ mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this);
+ }
+ }
+
+ private void detectAndSendKey(int index, int x, int y) {
+ final Key key = getKey(index);
+ if (key == null) {
+ callListenerOnCancelInput();
+ return;
+ }
+ if (key.mOutputText != null) {
+ callListenerOnTextInput(key.mOutputText);
+ callListenerOnRelease(key.mCode);
+ } else {
+ int code = key.mCode;
+ final int[] codes = mKeyDetector.newCodeArray();
+ mKeyDetector.getKeyIndexAndNearbyCodes(x, y, codes);
+
+ // If keyboard is in manual temporary upper case state and key has manual temporary
+ // shift code, alternate character code should be sent.
+ if (mKeyboard.isManualTemporaryUpperCase() && key.mManualTemporaryUpperCaseCode != 0) {
+ 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(code, codes, x, y);
+ callListenerOnRelease(code);
+ }
+ }
+
+ public CharSequence getPreviewText(Key key) {
+ return key.mLabel;
+ }
+
+ private long mPreviousEventTime;
+
+ private void printTouchEvent(String title, int x, int y, long eventTime) {
+ final int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null);
+ final Key key = getKey(keyIndex);
+ final String code = (key == null) ? "----" : keyCodePrintable(key.mCode);
+ final long delta = eventTime - mPreviousEventTime;
+ Log.d(TAG, String.format("%s%s[%d] %4d %4d %5d %3d(%s)", title,
+ (mKeyAlreadyProcessed ? "-" : " "), mPointerId, x, y, delta, keyIndex, code));
+ mPreviousEventTime = eventTime;
+ }
+
+ private static String keyCodePrintable(int primaryCode) {
+ final String modifier = isModifierCode(primaryCode) ? " modifier" : "";
+ return String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode) + modifier;
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java b/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
new file mode 100644
index 000000000..b9ae03a59
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+/**
+ * This class keeps track of a key index and a position where {@link PointerTracker} is.
+ */
+/* package */ class PointerTrackerKeyState {
+ private final KeyDetector mKeyDetector;
+
+ // The position and time at which first down event occurred.
+ private int mStartX;
+ private int mStartY;
+ private long mDownTime;
+
+ // The current key index where this pointer is.
+ private int mKeyIndex = KeyDetector.NOT_A_KEY;
+ // The position where mKeyIndex was recognized for the first time.
+ private int mKeyX;
+ private int mKeyY;
+
+ // Last pointer position.
+ private int mLastX;
+ private int mLastY;
+
+ public PointerTrackerKeyState(KeyDetector keyDetecor) {
+ mKeyDetector = keyDetecor;
+ }
+
+ public int getKeyIndex() {
+ return mKeyIndex;
+ }
+
+ public int getKeyX() {
+ return mKeyX;
+ }
+
+ public int getKeyY() {
+ return mKeyY;
+ }
+
+ public int getStartX() {
+ return mStartX;
+ }
+
+ public int getStartY() {
+ return mStartY;
+ }
+
+ public long getDownTime() {
+ return mDownTime;
+ }
+
+ public 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 void onSetKeyboard() {
+ mKeyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(mKeyX, mKeyY, null);
+ }
+}
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..236c9d550
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import java.util.LinkedList;
+
+public class PointerTrackerQueue {
+ private LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>();
+
+ public void add(PointerTracker tracker) {
+ mQueue.add(tracker);
+ }
+
+ public int lastIndexOf(PointerTracker tracker) {
+ LinkedList<PointerTracker> queue = mQueue;
+ for (int index = queue.size() - 1; index >= 0; index--) {
+ PointerTracker t = queue.get(index);
+ if (t == tracker)
+ return index;
+ }
+ return -1;
+ }
+
+ public void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) {
+ LinkedList<PointerTracker> queue = mQueue;
+ int oldestPos = 0;
+ for (PointerTracker t = queue.get(oldestPos); t != tracker; t = queue.get(oldestPos)) {
+ if (t.isModifier()) {
+ oldestPos++;
+ } else {
+ t.onUpEvent(t.getLastX(), t.getLastY(), eventTime);
+ t.setAlreadyProcessed();
+ queue.remove(oldestPos);
+ }
+ }
+ }
+
+ public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
+ for (PointerTracker t : mQueue) {
+ if (t == tracker)
+ continue;
+ t.onUpEvent(t.getLastX(), t.getLastY(), eventTime);
+ t.setAlreadyProcessed();
+ }
+ mQueue.clear();
+ if (tracker != null)
+ mQueue.add(tracker);
+ }
+
+ public void remove(PointerTracker tracker) {
+ mQueue.remove(tracker);
+ }
+
+ public boolean isInSlidingKeyInput() {
+ for (final PointerTracker tracker : mQueue) {
+ if (tracker.isInSlidingKeyInput())
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("[");
+ for (PointerTracker tracker : mQueue) {
+ if (sb.length() > 1)
+ sb.append(" ");
+ sb.append(String.format("%d", tracker.mPointerId));
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java b/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
new file mode 100644
index 000000000..32c25801d
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+
+/**
+ * String parser of popupCharacters attribute of Key.
+ * The string is comma separated texts each of which represents one popup key.
+ * Each popup key text is one of the following:
+ * - A single letter (Letter)
+ * - Label optionally followed by keyOutputText or code (keyLabel|keyOutputText).
+ * - Icon followed by keyOutputText or code (@drawable/icon|@integer/key_code)
+ * Special character, comma ',' backslash '\', and bar '|' can be escaped by '\'
+ * character.
+ * Note that the character '@' and '\' are also parsed by XML parser and CSV parser as well.
+ */
+public class PopupCharactersParser {
+ private static final char ESCAPE = '\\';
+ private static final String LABEL_END = "|";
+ private static final String PREFIX_AT = "@";
+ private static final String PREFIX_ICON = PREFIX_AT + "drawable/";
+ private static final String PREFIX_CODE = PREFIX_AT + "integer/";
+
+ private PopupCharactersParser() {
+ // Intentional empty constructor for utility class.
+ }
+
+ private static boolean hasIcon(String popupSpec) {
+ if (popupSpec.startsWith(PREFIX_ICON)) {
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ if (end > 0)
+ return true;
+ throw new PopupCharactersParserError("outputText or code not specified: " + popupSpec);
+ }
+ return false;
+ }
+
+ private static boolean hasCode(String popupSpec) {
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ if (end > 0 && end + 1 < popupSpec.length()
+ && popupSpec.substring(end + 1).startsWith(PREFIX_CODE)) {
+ return true;
+ }
+ return false;
+ }
+
+ private static String parseEscape(String text) {
+ if (text.indexOf(ESCAPE) < 0)
+ return text;
+ final int length = text.length();
+ final StringBuilder sb = new StringBuilder();
+ for (int pos = 0; pos < length; pos++) {
+ final char c = text.charAt(pos);
+ if (c == ESCAPE && pos + 1 < length) {
+ sb.append(text.charAt(++pos));
+ } else {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+ private static int indexOfLabelEnd(String popupSpec, int start) {
+ if (popupSpec.indexOf(ESCAPE, start) < 0) {
+ final int end = popupSpec.indexOf(LABEL_END, start);
+ if (end == 0)
+ throw new PopupCharactersParserError(LABEL_END + " at " + start + ": " + popupSpec);
+ return end;
+ }
+ final int length = popupSpec.length();
+ for (int pos = start; pos < length; pos++) {
+ final char c = popupSpec.charAt(pos);
+ if (c == ESCAPE && pos + 1 < length) {
+ pos++;
+ } else if (popupSpec.startsWith(LABEL_END, pos)) {
+ return pos;
+ }
+ }
+ return -1;
+ }
+
+ public static String getLabel(String popupSpec) {
+ if (hasIcon(popupSpec))
+ return null;
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ final String label = (end > 0) ? parseEscape(popupSpec.substring(0, end))
+ : parseEscape(popupSpec);
+ if (TextUtils.isEmpty(label))
+ throw new PopupCharactersParserError("Empty label: " + popupSpec);
+ return label;
+ }
+
+ public static String getOutputText(String popupSpec) {
+ if (hasCode(popupSpec))
+ return null;
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ if (end > 0) {
+ if (indexOfLabelEnd(popupSpec, end + 1) >= 0)
+ throw new PopupCharactersParserError("Multiple " + LABEL_END + ": "
+ + popupSpec);
+ final String outputText = parseEscape(popupSpec.substring(end + LABEL_END.length()));
+ if (!TextUtils.isEmpty(outputText))
+ return outputText;
+ throw new PopupCharactersParserError("Empty outputText: " + popupSpec);
+ }
+ final String label = getLabel(popupSpec);
+ if (label == null)
+ throw new PopupCharactersParserError("Empty label: " + popupSpec);
+ // Code is automatically generated for one letter label. See {@link getCode()}.
+ if (label.length() == 1)
+ return null;
+ return label;
+ }
+
+ public static int getCode(Resources res, String popupSpec) {
+ if (hasCode(popupSpec)) {
+ final int end = indexOfLabelEnd(popupSpec, 0);
+ if (indexOfLabelEnd(popupSpec, end + 1) >= 0)
+ throw new PopupCharactersParserError("Multiple " + LABEL_END + ": " + popupSpec);
+ final int resId = getResourceId(res,
+ popupSpec.substring(end + LABEL_END.length() + PREFIX_AT.length()));
+ final int code = res.getInteger(resId);
+ return code;
+ }
+ if (indexOfLabelEnd(popupSpec, 0) > 0)
+ return Keyboard.CODE_DUMMY;
+ final String label = getLabel(popupSpec);
+ // Code is automatically generated for one letter label.
+ if (label != null && label.length() == 1)
+ return label.charAt(0);
+ return Keyboard.CODE_DUMMY;
+ }
+
+ public static Drawable getIcon(Resources res, String popupSpec) {
+ if (hasIcon(popupSpec)) {
+ int end = popupSpec.indexOf(LABEL_END, PREFIX_ICON.length() + 1);
+ int resId = getResourceId(res, popupSpec.substring(PREFIX_AT.length(), end));
+ return res.getDrawable(resId);
+ }
+ return null;
+ }
+
+ private static int getResourceId(Resources res, String name) {
+ String packageName = res.getResourcePackageName(R.string.english_ime_name);
+ int resId = res.getIdentifier(name, null, packageName);
+ if (resId == 0)
+ throw new PopupCharactersParserError("Unknown resource: " + name);
+ return resId;
+ }
+
+ @SuppressWarnings("serial")
+ public static class PopupCharactersParserError extends RuntimeException {
+ public PopupCharactersParserError(String message) {
+ super(message);
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java
new file mode 100644
index 000000000..0920da2cb
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import java.util.Arrays;
+
+public class ProximityKeyDetector extends KeyDetector {
+ private static final int MAX_NEARBY_KEYS = 12;
+
+ // working area
+ private int[] mDistances = new int[MAX_NEARBY_KEYS];
+
+ @Override
+ protected int getMaxNearbyKeys() {
+ return MAX_NEARBY_KEYS;
+ }
+
+ @Override
+ public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) {
+ final Key[] keys = getKeys();
+ final int touchX = getTouchX(x);
+ final int touchY = getTouchY(y);
+
+ int primaryIndex = NOT_A_KEY;
+ final int[] distances = mDistances;
+ Arrays.fill(distances, Integer.MAX_VALUE);
+ for (final int index : mKeyboard.getNearestKeys(touchX, touchY)) {
+ final Key key = keys[index];
+ final boolean isInside = key.isInside(touchX, touchY);
+ if (isInside)
+ primaryIndex = index;
+ final int dist = key.squaredDistanceToEdge(touchX, touchY);
+ if (isInside || (mProximityCorrectOn && dist < mProximityThresholdSquare)) {
+ if (allKeys == null) continue;
+ // Find insertion point
+ for (int j = 0; j < distances.length; j++) {
+ if (distances[j] > dist) {
+ final int nextPos = j + 1;
+ System.arraycopy(distances, j, distances, nextPos,
+ distances.length - nextPos);
+ System.arraycopy(allKeys, j, allKeys, nextPos,
+ allKeys.length - nextPos);
+ distances[j] = dist;
+ allKeys[j] = key.mCode;
+ break;
+ }
+ }
+ }
+ }
+
+ return primaryIndex;
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/Row.java b/java/src/com/android/inputmethod/keyboard/Row.java
new file mode 100644
index 000000000..198f02ca8
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/Row.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.util.Xml;
+
+/**
+ * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate.
+ * Some of the key size defaults can be overridden per row from what the {@link Keyboard}
+ * defines.
+ */
+public class Row {
+ /** Default width of a key in this row. */
+ public final int mDefaultWidth;
+ /** Default height of a key in this row. */
+ public final int mDefaultHeight;
+ /** Default horizontal gap between keys in this row. */
+ public final int mDefaultHorizontalGap;
+ /** Vertical gap following this row. */
+ public final int mVerticalGap;
+ /**
+ * Edge flags for this row of keys. Possible values that can be assigned are
+ * {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM}
+ */
+ public final int mRowEdgeFlags;
+
+ private final Keyboard mKeyboard;
+
+ public Row(Keyboard keyboard, int rowFlags) {
+ this.mKeyboard = keyboard;
+ mDefaultHeight = keyboard.getRowHeight();
+ mDefaultWidth = keyboard.getKeyWidth();
+ mDefaultHorizontalGap = keyboard.getHorizontalGap();
+ mVerticalGap = keyboard.getVerticalGap();
+ mRowEdgeFlags = rowFlags;
+ }
+
+ public Row(Resources res, Keyboard keyboard, XmlResourceParser parser) {
+ this.mKeyboard = keyboard;
+ final int keyboardWidth = keyboard.getDisplayWidth();
+ final int keyboardHeight = keyboard.getKeyboardHeight();
+ TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard);
+ mDefaultWidth = KeyboardParser.getDimensionOrFraction(a,
+ R.styleable.Keyboard_keyWidth, keyboardWidth, keyboard.getKeyWidth());
+ mDefaultHeight = KeyboardParser.getDimensionOrFraction(a,
+ R.styleable.Keyboard_rowHeight, keyboardHeight, keyboard.getRowHeight());
+ mDefaultHorizontalGap = KeyboardParser.getDimensionOrFraction(a,
+ R.styleable.Keyboard_horizontalGap, keyboardWidth, keyboard.getHorizontalGap());
+ mVerticalGap = KeyboardParser.getDimensionOrFraction(a,
+ R.styleable.Keyboard_verticalGap, keyboardHeight, keyboard.getVerticalGap());
+ a.recycle();
+ a = res.obtainAttributes(Xml.asAttributeSet(parser),
+ R.styleable.Keyboard_Row);
+ mRowEdgeFlags = a.getInt(R.styleable.Keyboard_Row_rowEdgeFlags, 0);
+ a.recycle();
+ }
+
+ public Keyboard getKeyboard() {
+ return mKeyboard;
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java b/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
new file mode 100644
index 000000000..9229208a9
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import android.util.Log;
+
+public class ShiftKeyState extends ModifierKeyState {
+ private static final int PRESSING_ON_SHIFTED = 3; // both temporary shifted & shift locked
+ private static final int IGNORING = 4;
+
+ public ShiftKeyState(String name) {
+ super(name);
+ }
+
+ @Override
+ public void onOtherKeyPressed() {
+ int oldState = mState;
+ if (oldState == PRESSING) {
+ mState = MOMENTARY;
+ } else if (oldState == PRESSING_ON_SHIFTED) {
+ mState = IGNORING;
+ }
+ if (DEBUG)
+ Log.d(TAG, mName + ".onOtherKeyPressed: " + toString(oldState) + " > " + this);
+ }
+
+ public void onPressOnShifted() {
+ int oldState = mState;
+ mState = PRESSING_ON_SHIFTED;
+ if (DEBUG)
+ Log.d(TAG, mName + ".onPressOnShifted: " + toString(oldState) + " > " + this);
+ }
+
+ public boolean isPressingOnShifted() {
+ return mState == PRESSING_ON_SHIFTED;
+ }
+
+ public boolean isIgnoring() {
+ return mState == IGNORING;
+ }
+
+ @Override
+ public String toString() {
+ return toString(mState);
+ }
+
+ @Override
+ protected String toString(int state) {
+ switch (state) {
+ case PRESSING_ON_SHIFTED: return "PRESSING_ON_SHIFTED";
+ case IGNORING: return "IGNORING";
+ default: return super.toString(state);
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java b/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
new file mode 100644
index 000000000..41f8c2a7c
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Paint.Align;
+import android.graphics.drawable.Drawable;
+import android.text.TextPaint;
+import android.view.ViewConfiguration;
+
+/**
+ * Animation to be displayed on the spacebar preview popup when switching languages by swiping the
+ * spacebar. It draws the current, previous and next languages and moves them by the delta of touch
+ * movement on the spacebar.
+ */
+public class SlidingLocaleDrawable extends Drawable {
+
+ private final Context mContext;
+ private final Resources mRes;
+ private final int mWidth;
+ private final int mHeight;
+ private final Drawable mBackground;
+ private final TextPaint mTextPaint;
+ private final int mMiddleX;
+ private final Drawable mLeftDrawable;
+ private final Drawable mRightDrawable;
+ private final int mThreshold;
+ private int mDiff;
+ private boolean mHitThreshold;
+ private String mCurrentLanguage;
+ private String mNextLanguage;
+ private String mPrevLanguage;
+
+ public SlidingLocaleDrawable(Context context, Drawable background, int width, int height) {
+ mContext = context;
+ mRes = context.getResources();
+ mBackground = background;
+ Keyboard.setDefaultBounds(mBackground);
+ mWidth = width;
+ mHeight = height;
+ final TextPaint textPaint = new TextPaint();
+ textPaint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18));
+ textPaint.setColor(R.color.latinkeyboard_transparent);
+ textPaint.setTextAlign(Align.CENTER);
+ textPaint.setAlpha(LatinKeyboard.OPACITY_FULLY_OPAQUE);
+ textPaint.setAntiAlias(true);
+ mTextPaint = textPaint;
+ mMiddleX = (mWidth - mBackground.getIntrinsicWidth()) / 2;
+ final Resources res = mRes;
+ mLeftDrawable = res.getDrawable(
+ R.drawable.sym_keyboard_feedback_language_arrows_left);
+ mRightDrawable = res.getDrawable(
+ R.drawable.sym_keyboard_feedback_language_arrows_right);
+ mThreshold = ViewConfiguration.get(mContext).getScaledTouchSlop();
+ }
+
+ private int getTextSizeFromTheme(int style, int defValue) {
+ TypedArray array = mContext.getTheme().obtainStyledAttributes(
+ style, new int[] { android.R.attr.textSize });
+ int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue);
+ return textSize;
+ }
+
+ void setDiff(int diff) {
+ if (diff == Integer.MAX_VALUE) {
+ mHitThreshold = false;
+ mCurrentLanguage = null;
+ return;
+ }
+ mDiff = diff;
+ if (mDiff > mWidth) mDiff = mWidth;
+ if (mDiff < -mWidth) mDiff = -mWidth;
+ if (Math.abs(mDiff) > mThreshold) mHitThreshold = true;
+ invalidateSelf();
+ }
+
+
+ @Override
+ public void draw(Canvas canvas) {
+ canvas.save();
+ if (mHitThreshold) {
+ Paint paint = mTextPaint;
+ final int width = mWidth;
+ final int height = mHeight;
+ final int diff = mDiff;
+ final Drawable lArrow = mLeftDrawable;
+ final Drawable rArrow = mRightDrawable;
+ canvas.clipRect(0, 0, width, height);
+ if (mCurrentLanguage == null) {
+ SubtypeSwitcher subtypeSwitcher = SubtypeSwitcher.getInstance();
+ mCurrentLanguage = subtypeSwitcher.getInputLanguageName();
+ mNextLanguage = subtypeSwitcher.getNextInputLanguageName();
+ mPrevLanguage = subtypeSwitcher.getPreviousInputLanguageName();
+ }
+ // Draw language text with shadow
+ final float baseline = mHeight * LatinKeyboard.SPACEBAR_LANGUAGE_BASELINE
+ - paint.descent();
+ paint.setColor(mRes.getColor(R.color.latinkeyboard_feedback_language_text));
+ canvas.drawText(mCurrentLanguage, width / 2 + diff, baseline, paint);
+ canvas.drawText(mNextLanguage, diff - width / 2, baseline, paint);
+ canvas.drawText(mPrevLanguage, diff + width + width / 2, baseline, paint);
+
+ Keyboard.setDefaultBounds(lArrow);
+ rArrow.setBounds(width - rArrow.getIntrinsicWidth(), 0, width,
+ rArrow.getIntrinsicHeight());
+ lArrow.draw(canvas);
+ rArrow.draw(canvas);
+ }
+ if (mBackground != null) {
+ canvas.translate(mMiddleX, 0);
+ mBackground.draw(canvas);
+ }
+ canvas.restore();
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.TRANSLUCENT;
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ // Ignore
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ // Ignore
+ }
+
+ @Override
+ public int getIntrinsicWidth() {
+ return mWidth;
+ }
+
+ @Override
+ public int getIntrinsicHeight() {
+ return mHeight;
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/SwipeTracker.java b/java/src/com/android/inputmethod/keyboard/SwipeTracker.java
index 970e91965..730cdc390 100644
--- a/java/src/com/android/inputmethod/latin/SwipeTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/SwipeTracker.java
@@ -14,11 +14,11 @@
* the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.keyboard;
import android.view.MotionEvent;
-class SwipeTracker {
+public class SwipeTracker {
private static final int NUM_PAST = 4;
private static final int LONGEST_PAST_TIME = 200;
@@ -91,7 +91,7 @@ class SwipeTracker {
return mYVelocity;
}
- static class EventRingBuffer {
+ public static class EventRingBuffer {
private final int bufSize;
private final float xBuf[];
private final float yBuf[];
@@ -154,4 +154,4 @@ class SwipeTracker {
end = advance(end);
}
}
-} \ No newline at end of file
+}
diff --git a/java/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/AutoDictionary.java
index 4fbb5b012..307b81d43 100644
--- a/java/src/com/android/inputmethod/latin/AutoDictionary.java
+++ b/java/src/com/android/inputmethod/latin/AutoDictionary.java
@@ -16,10 +16,6 @@
package com.android.inputmethod.latin;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.Map.Entry;
-
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
@@ -30,6 +26,10 @@ import android.os.AsyncTask;
import android.provider.BaseColumns;
import android.util.Log;
+import java.util.HashMap;
+import java.util.Map.Entry;
+import java.util.Set;
+
/**
* Stores new words temporarily until they are promoted to the user dictionary
* for longevity. Words in the auto dictionary are used to determine if it's ok
@@ -98,7 +98,7 @@ public class AutoDictionary extends ExpandableDictionary {
}
@Override
- public boolean isValidWord(CharSequence word) {
+ public synchronized boolean isValidWord(CharSequence word) {
final int frequency = getWordFrequency(word);
return frequency >= VALIDITY_THRESHOLD;
}
@@ -138,7 +138,8 @@ public class AutoDictionary extends ExpandableDictionary {
}
@Override
- public void addWord(String word, int addFrequency) {
+ public void addWord(String newWord, int addFrequency) {
+ String word = newWord;
final int length = word.length();
// Don't add very short or very long words.
if (length < 2 || length > getMaxWordLength()) return;
@@ -224,7 +225,7 @@ public class AutoDictionary extends ExpandableDictionary {
private final DatabaseHelper mDbHelper;
private final String mLocale;
- public UpdateDbTask(Context context, DatabaseHelper openHelper,
+ public UpdateDbTask(@SuppressWarnings("unused") Context context, DatabaseHelper openHelper,
HashMap<String, Integer> pendingWrites, String locale) {
mMap = pendingWrites;
mLocale = locale;
diff --git a/java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java b/java/src/com/android/inputmethod/latin/BackupAgent.java
index a14a4751f..ee070af75 100644
--- a/java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java
+++ b/java/src/com/android/inputmethod/latin/BackupAgent.java
@@ -22,7 +22,7 @@ import android.app.backup.SharedPreferencesBackupHelper;
/**
* Backs up the Latin IME shared preferences.
*/
-public class LatinIMEBackupAgent extends BackupAgentHelper {
+public class BackupAgent extends BackupAgentHelper {
@Override
public void onCreate() {
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index d0e143dd0..961b49f02 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -16,16 +16,16 @@
package com.android.inputmethod.latin;
-import java.io.InputStream;
+import android.content.Context;
+import android.util.Log;
+
import java.io.IOException;
+import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.Channels;
import java.util.Arrays;
-import android.content.Context;
-import android.util.Log;
-
/**
* Implements a static, compacted, binary dictionary of standard words.
*/
@@ -45,16 +45,15 @@ public class BinaryDictionary extends Dictionary {
private static final int MAX_BIGRAMS = 60;
private static final int TYPED_LETTER_MULTIPLIER = 2;
- private static final boolean ENABLE_MISSED_CHARACTERS = true;
private 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];
+ private final int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES];
+ private final char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS];
+ private final char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS];
+ private final int[] mFrequencies = new int[MAX_WORDS];
+ private final int[] mFrequencies_bigrams = new int[MAX_BIGRAMS];
// Keep a reference to the native dict direct buffer in Java to avoid
// unexpected deallocation of the direct buffer.
private ByteBuffer mNativeDictDirectBuffer;
@@ -95,18 +94,19 @@ public class BinaryDictionary extends Dictionary {
}
mDictLength = byteBuffer.capacity();
mNativeDict = openNative(mNativeDictDirectBuffer,
- TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER);
+ TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER,
+ MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES);
}
mDicTypeId = dicTypeId;
}
private native int openNative(ByteBuffer bb, int typedLetterMultiplier,
- int fullWordMultiplier);
+ 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);
+ char[] outputChars, int[] frequencies,
+ int[] nextLettersFrequencies, int nextLettersSize);
private native int getBigramsNative(int dict, char[] prevWord, int prevWordLength,
int[] inputCodes, int inputCodesLength, char[] outputChars, int[] frequencies,
int maxWordLength, int maxBigrams, int maxAlternatives);
@@ -132,7 +132,8 @@ public class BinaryDictionary extends Dictionary {
Log.e(TAG, "Read " + got + " bytes, expected " + total);
} else {
mNativeDict = openNative(mNativeDictDirectBuffer,
- TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER);
+ TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER,
+ MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES);
mDictLength = total;
}
} catch (IOException e) {
@@ -169,12 +170,12 @@ public class BinaryDictionary extends Dictionary {
mOutputChars_bigrams, mFrequencies_bigrams, MAX_WORD_LENGTH, MAX_BIGRAMS,
MAX_ALTERNATIVES);
- for (int j = 0; j < count; j++) {
+ for (int j = 0; j < count; ++j) {
if (mFrequencies_bigrams[j] < 1) break;
- int start = j * MAX_WORD_LENGTH;
+ final int start = j * MAX_WORD_LENGTH;
int len = 0;
- while (mOutputChars_bigrams[start + len] != 0) {
- len++;
+ while (len < MAX_WORD_LENGTH && mOutputChars_bigrams[start + len] != 0) {
+ ++len;
}
if (len > 0) {
callback.addWord(mOutputChars_bigrams, start, len, mFrequencies_bigrams[j],
@@ -189,7 +190,7 @@ public class BinaryDictionary extends Dictionary {
final int codesSize = codes.size();
// Won't deal with really long words.
if (codesSize > MAX_WORD_LENGTH - 1) return;
-
+
Arrays.fill(mInputCodes, -1);
for (int i = 0; i < codesSize; i++) {
int[] alternatives = codes.getCodesAt(i);
@@ -199,33 +200,16 @@ public class BinaryDictionary extends Dictionary {
Arrays.fill(mOutputChars, (char) 0);
Arrays.fill(mFrequencies, 0);
- int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize,
- mOutputChars, mFrequencies,
- MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, -1,
- nextLettersFrequencies,
+ int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, mOutputChars,
+ mFrequencies, nextLettersFrequencies,
nextLettersFrequencies != null ? nextLettersFrequencies.length : 0);
- // If there aren't sufficient suggestions, search for words by allowing wild cards at
- // the different character positions. This feature is not ready for prime-time as we need
- // to figure out the best ranking for such words compared to proximity corrections and
- // completions.
- if (ENABLE_MISSED_CHARACTERS && count < 5) {
- for (int skip = 0; skip < codesSize; skip++) {
- int tempCount = getSuggestionsNative(mNativeDict, mInputCodes, codesSize,
- mOutputChars, mFrequencies,
- MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, skip,
- null, 0);
- count = Math.max(count, tempCount);
- if (tempCount > 0) break;
- }
- }
-
- for (int j = 0; j < count; j++) {
+ for (int j = 0; j < count; ++j) {
if (mFrequencies[j] < 1) break;
- int start = j * MAX_WORD_LENGTH;
+ final int start = j * MAX_WORD_LENGTH;
int len = 0;
- while (mOutputChars[start + len] != 0) {
- len++;
+ while (len < MAX_WORD_LENGTH && mOutputChars[start + len] != 0) {
+ ++len;
}
if (len > 0) {
callback.addWord(mOutputChars, start, len, mFrequencies[j], mDicTypeId,
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index 68f288925..3f47ea370 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
@@ -18,75 +18,99 @@ package com.android.inputmethod.latin;
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.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 {
-
- private static final int OUT_OF_BOUNDS_WORD_INDEX = -1;
- private static final int OUT_OF_BOUNDS_X_COORD = -1;
+public class CandidateView extends LinearLayout implements OnClickListener, OnLongClickListener {
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 final ArrayList<View> mWords = new ArrayList<View>();
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 MAX_SUGGESTIONS = 16;
- private static final int X_GAP = 10;
-
+ private final boolean mConfigCandidateHighlightFontColorEnabled;
private final int mColorNormal;
private final int mColorRecommended;
private final int mColorOther;
- private final Paint mPaint;
- private final int mDescent;
- private boolean mScrolled;
+ private static final CharacterStyle BOLD_SPAN = new StyleSpan(Typeface.BOLD);
+ private static final CharacterStyle UNDERLINE_SPAN = new UnderlineSpan();
+ private final CharacterStyle mInvertedForegroundColorSpan;
+ private final CharacterStyle mInvertedBackgroundColorSpan;
+
+ private SuggestedWords mSuggestions = SuggestedWords.EMPTY;
+ private boolean mShowingAutoCorrectionInverted;
private boolean mShowingAddToDictionary;
- private CharSequence mAddToDictionaryHint;
- private int mTargetScrollX;
+ private final UiHandler mHandler = new UiHandler();
- private final int mMinTouchableWidth;
+ private class UiHandler extends Handler {
+ private static final int MSG_HIDE_PREVIEW = 0;
+ private static final int MSG_UPDATE_SUGGESTION = 1;
- private int mTotalWidth;
-
- private final GestureDetector mGestureDetector;
+ 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((SuggestedWords)msg.obj);
+ break;
+ }
+ }
+
+ public void postHidePreview() {
+ cancelHidePreview();
+ sendMessageDelayed(obtainMessage(MSG_HIDE_PREVIEW), DELAY_HIDE_PREVIEW);
+ }
+
+ public void cancelHidePreview() {
+ removeMessages(MSG_HIDE_PREVIEW);
+ }
+
+ public void postUpdateSuggestions(SuggestedWords suggestions) {
+ cancelUpdateSuggestions();
+ sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTION, suggestions),
+ DELAY_UPDATE_SUGGESTION);
+ }
+
+ public void cancelUpdateSuggestions() {
+ removeMessages(MSG_UPDATE_SUGGESTION);
+ }
+
+ public void cancelAllMessages() {
+ cancelHidePreview();
+ cancelUpdateSuggestions();
+ }
+ }
/**
* Construct a CandidateView for showing suggested words for completion.
@@ -95,95 +119,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;
- }
-
- @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;
+ 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 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 +160,101 @@ 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) {
+ // Don't update suggestions when there is only one suggestion found.
+ // Empty (size zero) suggestions will be passed in order to clear candidate view.
+ if (suggestions == null || suggestions.size() == 1)
+ return;
+ if (mShowingAutoCorrectionInverted) {
+ mHandler.postUpdateSuggestions(suggestions);
+ } else {
+ updateSuggestions(suggestions);
}
+ }
- 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(SuggestedWords suggestions) {
+ clear();
+ mSuggestions = suggestions;
+ final int count = suggestions.size();
+ final Object[] debugInfo = suggestions.mDebugInfo;
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;
- } 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;
- }
-
- 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);
- }
- 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);
+ CharSequence word = suggestions.getWord(i);
+ if (word == null) continue;
+ final int wordLength = word.length();
+
+ 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);
+ 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;
}
- 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());
+ 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.
+ if (mConfigCandidateHighlightFontColorEnabled)
+ tv.setTextColor(mColorOther);
}
- } else {
- scrollX -= SCROLL_PIXELS;
- if (scrollX <= mTargetScrollX) {
- scrollX = mTargetScrollX;
- scrollTo(scrollX, getScrollY());
- requestLayout();
+ tv.setText(word);
+ tv.setClickable(true);
+ if (debugInfo != null && i < debugInfo.length && debugInfo[i] != null
+ && !TextUtils.isEmpty(debugInfo[i].toString())) {
+ dv.setText(debugInfo[i].toString());
+ dv.setVisibility(VISIBLE);
} 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 +263,78 @@ public class CandidateView extends View {
return true;
}
- /* package */ List<CharSequence> getSuggestions() {
+ public SuggestedWords getSuggestions() {
return mSuggestions;
}
public void clear() {
- // Don't call mSuggestions.clear() because it's being used for logging
- // in LatinIME.pickSuggestionManually().
- mSuggestions.clear();
- mTouchX = OUT_OF_BOUNDS_X_COORD;
- mSelectedString = null;
- mSelectedIndex = -1;
mShowingAddToDictionary = false;
- invalidate();
- Arrays.fill(mWordWidth, 0);
- Arrays.fill(mWordX, 0);
- }
-
- @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) {
+ int index = (Integer) view.getTag();
+ CharSequence word = mSuggestions.getWord(index);
+ if (word.length() < 2)
+ return false;
+ addToDictionary(word);
+ return true;
+ }
+
+ @Override
+ public void onClick(View view) {
+ int index = (Integer) view.getTag();
+ CharSequence word = mSuggestions.getWord(index);
+ if (mShowingAddToDictionary && index == 0) {
+ addToDictionary(word);
+ } else {
+ if (!mSuggestions.mIsApplicationSpecifiedCompletions) {
+ TextEntryState.acceptedSuggestion(mSuggestions.getWord(0), word);
+ }
+ mService.pickSuggestionManually(index, word);
}
}
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
+ mHandler.cancelAllMessages();
hidePreview();
}
}
diff --git a/java/src/com/android/inputmethod/latin/ContactsDictionary.java b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
index 95a3b5c7d..048f72dc5 100644
--- a/java/src/com/android/inputmethod/latin/ContactsDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.SystemClock;
+import android.provider.BaseColumns;
import android.provider.ContactsContract.Contacts;
import android.text.TextUtils;
import android.util.Log;
@@ -28,7 +29,7 @@ import android.util.Log;
public class ContactsDictionary extends ExpandableDictionary {
private static final String[] PROJECTION = {
- Contacts._ID,
+ BaseColumns._ID,
Contacts.DISPLAY_NAME,
};
diff --git a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java b/java/src/com/android/inputmethod/latin/DebugSettings.java
index cba1a0af9..03211f36b 100644
--- a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java
+++ b/java/src/com/android/inputmethod/latin/DebugSettings.java
@@ -24,10 +24,10 @@ import android.preference.CheckBoxPreference;
import android.preference.PreferenceActivity;
import android.util.Log;
-public class LatinIMEDebugSettings extends PreferenceActivity
+public class DebugSettings extends PreferenceActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {
- private static final String TAG = "LatinIMEDebugSettings";
+ private static final String TAG = "DebugSettings";
private static final String DEBUG_MODE_KEY = "debug_mode";
private CheckBoxPreference mDebugMode;
@@ -43,6 +43,7 @@ public class LatinIMEDebugSettings extends PreferenceActivity
updateDebugMode();
}
+ @Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals(DEBUG_MODE_KEY)) {
if (mDebugMode != null) {
diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java
index d04bf57a7..74933595c 100644
--- a/java/src/com/android/inputmethod/latin/Dictionary.java
+++ b/java/src/com/android/inputmethod/latin/Dictionary.java
@@ -20,7 +20,7 @@ package com.android.inputmethod.latin;
* Abstract base class for a dictionary that can do a fuzzy search for words based on a set of key
* strokes.
*/
-abstract public class Dictionary {
+public abstract class Dictionary {
/**
* Whether or not to replicate the typed word in the suggested list, even if it's valid.
*/
@@ -42,11 +42,11 @@ abstract public class Dictionary {
public interface WordCallback {
/**
* Adds a word to a list of suggestions. The word is expected to be ordered based on
- * the provided frequency.
+ * the provided frequency.
* @param word the character array containing the word
* @param wordOffset starting offset of the word in the character array
* @param wordLength length of valid characters in the character array
- * @param frequency the frequency of occurence. This is normalized between 1 and 255, but
+ * @param frequency the frequency of occurrence. This is normalized between 1 and 255, but
* can exceed those limits
* @param dicTypeId of the dictionary where word was from
* @param dataType tells type of this data
@@ -74,6 +74,7 @@ abstract public class Dictionary {
* Searches for pairs in the bigram dictionary that matches the previous word and all the
* possible words following are added through the callback object.
* @param composer the key sequence to match
+ * @param previousWord the word before
* @param callback the callback object to send possible word following previous word
* @param nextLettersFrequencies array of frequencies of next letters that could follow the
* word so far. For instance, "bracke" can be followed by "t", so array['t'] will have
@@ -116,5 +117,6 @@ abstract public class Dictionary {
* Override to clean up any resources.
*/
public void close() {
+ // empty base implementation
}
}
diff --git a/java/src/com/android/inputmethod/latin/EditingUtil.java b/java/src/com/android/inputmethod/latin/EditingUtils.java
index 781d7fd4a..0ca06ddfc 100644
--- a/java/src/com/android/inputmethod/latin/EditingUtil.java
+++ b/java/src/com/android/inputmethod/latin/EditingUtils.java
@@ -28,7 +28,7 @@ import java.util.regex.Pattern;
/**
* Utility methods to deal with editing text through an InputConnection.
*/
-public class EditingUtil {
+public class EditingUtils {
/**
* Number of characters we want to look back in order to identify the previous word
*/
@@ -39,7 +39,9 @@ public class EditingUtil {
private static Method sMethodGetSelectedText;
private static Method sMethodSetComposingRegion;
- private EditingUtil() {};
+ private EditingUtils() {
+ // Unintentional empty constructor for singleton.
+ }
/**
* Append newText to the text field represented by connection.
@@ -54,14 +56,15 @@ public class EditingUtil {
connection.finishComposingText();
// Add a space if the field already has text.
+ String text = newText;
CharSequence charBeforeCursor = connection.getTextBeforeCursor(1, 0);
if (charBeforeCursor != null
&& !charBeforeCursor.equals(" ")
&& (charBeforeCursor.length() > 0)) {
- newText = " " + newText;
+ text = " " + text;
}
- connection.setComposingText(newText, 1);
+ connection.setComposingText(text, 1);
}
private static int getCursorPosition(InputConnection connection) {
@@ -76,33 +79,29 @@ public class EditingUtil {
/**
* @param connection connection to the current text field.
* @param sep characters which may separate words
- * @param range the range object to store the result into
* @return the word that surrounds the cursor, including up to one trailing
* separator. For example, if the field contains "he|llo world", where |
* represents the cursor, then "hello " will be returned.
*/
- public static String getWordAtCursor(
- InputConnection connection, String separators, Range range) {
- Range r = getWordRangeAtCursor(connection, separators, range);
- return (r == null) ? null : r.word;
+ public static String getWordAtCursor(InputConnection connection, String separators) {
+ Range r = getWordRangeAtCursor(connection, separators);
+ return (r == null) ? null : r.mWord;
}
/**
* Removes the word surrounding the cursor. Parameters are identical to
* getWordAtCursor.
*/
- public static void deleteWordAtCursor(
- InputConnection connection, String separators) {
-
- Range range = getWordRangeAtCursor(connection, separators, null);
+ public static void deleteWordAtCursor(InputConnection connection, String separators) {
+ Range range = getWordRangeAtCursor(connection, separators);
if (range == null) return;
connection.finishComposingText();
// Move cursor to beginning of word, to avoid crash when cursor is outside
// of valid range after deleting text.
- int newCursor = getCursorPosition(connection) - range.charsBefore;
+ int newCursor = getCursorPosition(connection) - range.mCharsBefore;
connection.setSelection(newCursor, newCursor);
- connection.deleteSurroundingText(0, range.charsBefore + range.charsAfter);
+ connection.deleteSurroundingText(0, range.mCharsBefore + range.mCharsAfter);
}
/**
@@ -110,31 +109,28 @@ public class EditingUtil {
*/
public static class Range {
/** Characters before selection start */
- public int charsBefore;
+ public final int mCharsBefore;
/**
* Characters after selection start, including one trailing word
* separator.
*/
- public int charsAfter;
+ public final int mCharsAfter;
/** The actual characters that make up a word */
- public String word;
-
- public Range() {}
+ public final String mWord;
public Range(int charsBefore, int charsAfter, String word) {
if (charsBefore < 0 || charsAfter < 0) {
throw new IndexOutOfBoundsException();
}
- this.charsBefore = charsBefore;
- this.charsAfter = charsAfter;
- this.word = word;
+ this.mCharsBefore = charsBefore;
+ this.mCharsAfter = charsAfter;
+ this.mWord = word;
}
}
- private static Range getWordRangeAtCursor(
- InputConnection connection, String sep, Range range) {
+ private static Range getWordRangeAtCursor(InputConnection connection, String sep) {
if (connection == null || sep == null) {
return null;
}
@@ -150,18 +146,15 @@ public class EditingUtil {
// Find last word separator after the cursor
int end = -1;
- while (++end < after.length() && !isWhitespace(after.charAt(end), sep));
+ while (++end < after.length() && !isWhitespace(after.charAt(end), sep)) {
+ // Nothing to do here.
+ }
int cursor = getCursorPosition(connection);
if (start >= 0 && cursor + end <= after.length() + before.length()) {
String word = before.toString().substring(start, before.length())
+ after.toString().substring(0, end);
-
- Range returnRange = range != null? range : new Range();
- returnRange.charsBefore = before.length() - start;
- returnRange.charsAfter = end;
- returnRange.word = word;
- return returnRange;
+ return new Range(before.length() - start, end, word);
}
return null;
@@ -193,9 +186,15 @@ public class EditingUtil {
}
public static class SelectedWord {
- public int start;
- public int end;
- public CharSequence word;
+ public final int mStart;
+ public final int mEnd;
+ public final CharSequence mWord;
+
+ public SelectedWord(int start, int end, CharSequence word) {
+ mStart = start;
+ mEnd = end;
+ mWord = word;
+ }
}
/**
@@ -223,14 +222,10 @@ public class EditingUtil {
int selStart, int selEnd, String wordSeparators) {
if (selStart == selEnd) {
// There is just a cursor, so get the word at the cursor
- EditingUtil.Range range = new EditingUtil.Range();
- CharSequence touching = getWordAtCursor(ic, wordSeparators, range);
- if (!TextUtils.isEmpty(touching)) {
- SelectedWord selWord = new SelectedWord();
- selWord.word = touching;
- selWord.start = selStart - range.charsBefore;
- selWord.end = selEnd + range.charsAfter;
- return selWord;
+ EditingUtils.Range range = getWordRangeAtCursor(ic, wordSeparators);
+ if (range != null && !TextUtils.isEmpty(range.mWord)) {
+ return new SelectedWord(selStart - range.mCharsBefore, selEnd + range.mCharsAfter,
+ range.mWord);
}
} else {
// Is the previous character empty or a word separator? If not, return null.
@@ -256,11 +251,7 @@ public class EditingUtil {
}
}
// Prepare the selected word
- SelectedWord selWord = new SelectedWord();
- selWord.start = selStart;
- selWord.end = selEnd;
- selWord.word = touching;
- return selWord;
+ return new SelectedWord(selStart, selEnd, touching);
}
return null;
}
@@ -324,7 +315,7 @@ public class EditingUtil {
}
if (sMethodSetComposingRegion != null) {
try {
- sMethodSetComposingRegion.invoke(ic, word.start, word.end);
+ sMethodSetComposingRegion.invoke(ic, word.mStart, word.mEnd);
} catch (InvocationTargetException exc) {
// Ignore
} catch (IllegalArgumentException e) {
diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
index e954c0818..bc08df042 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
@@ -16,11 +16,11 @@
package com.android.inputmethod.latin;
-import java.util.LinkedList;
-
import android.content.Context;
import android.os.AsyncTask;
+import java.util.LinkedList;
+
/**
* Base class for an in-memory dictionary that can grow dynamically and can
* be searched for suggestions and valid words.
@@ -49,53 +49,65 @@ public class ExpandableDictionary extends Dictionary {
// Use this lock before touching mUpdatingDictionary & mRequiresDownload
private Object mUpdatingLock = new Object();
- static class Node {
- char code;
- int frequency;
- boolean terminal;
- Node parent;
- NodeArray children;
- LinkedList<NextWord> ngrams; // Supports ngram
+ private static class Node {
+ char mCode;
+ int mFrequency;
+ boolean mTerminal;
+ Node mParent;
+ NodeArray mChildren;
+ LinkedList<NextWord> mNGrams; // Supports ngram
}
- static class NodeArray {
- Node[] data;
- int length = 0;
+ private static class NodeArray {
+ Node[] mData;
+ int mLength = 0;
private static final int INCREMENT = 2;
NodeArray() {
- data = new Node[INCREMENT];
+ mData = new Node[INCREMENT];
}
void add(Node n) {
- if (length + 1 > data.length) {
- Node[] tempData = new Node[length + INCREMENT];
- if (length > 0) {
- System.arraycopy(data, 0, tempData, 0, length);
+ if (mLength + 1 > mData.length) {
+ Node[] tempData = new Node[mLength + INCREMENT];
+ if (mLength > 0) {
+ System.arraycopy(mData, 0, tempData, 0, mLength);
}
- data = tempData;
+ mData = tempData;
}
- data[length++] = n;
+ mData[mLength++] = n;
}
}
- static class NextWord {
- Node word;
- NextWord nextWord;
- int frequency;
+ private static class NextWord {
+ public final Node mWord;
+ private int mFrequency;
- NextWord(Node word, int frequency) {
- this.word = word;
- this.frequency = frequency;
+ public NextWord(Node word, int frequency) {
+ mWord = word;
+ mFrequency = frequency;
}
- }
+ public int getFrequency() {
+ return mFrequency;
+ }
+
+ public int setFrequency(int freq) {
+ mFrequency = freq;
+ return mFrequency;
+ }
+
+ public int addFrequency(int add) {
+ mFrequency += add;
+ return mFrequency;
+ }
+ }
private NodeArray mRoots;
private int[][] mCodes;
- ExpandableDictionary(Context context, int dicTypeId) {
+ public ExpandableDictionary(Context context, int dicTypeId) {
mContext = context;
clearDictionary();
mCodes = new int[MAX_WORD_LENGTH][];
@@ -128,13 +140,14 @@ public class ExpandableDictionary extends Dictionary {
/** Override to load your dictionary here, on a background thread. */
public void loadDictionaryAsync() {
+ // empty base implementation
}
- Context getContext() {
+ public Context getContext() {
return mContext;
}
- int getMaxWordLength() {
+ public int getMaxWordLength() {
return MAX_WORD_LENGTH;
}
@@ -147,33 +160,33 @@ 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.frequency = Math.max(frequency, childNode.frequency);
- if (childNode.frequency > 255) childNode.frequency = 255;
+ childNode.mTerminal = true;
+ childNode.mFrequency = Math.max(frequency, childNode.mFrequency);
+ if (childNode.mFrequency > 255) childNode.mFrequency = 255;
return;
}
- if (childNode.children == null) {
- childNode.children = new NodeArray();
+ if (childNode.mChildren == null) {
+ childNode.mChildren = new NodeArray();
}
- addWordRec(childNode.children, word, depth + 1, frequency, childNode);
+ addWordRec(childNode.mChildren, word, depth + 1, frequency, childNode);
}
@Override
@@ -216,7 +229,7 @@ public class ExpandableDictionary extends Dictionary {
*/
public int getWordFrequency(CharSequence word) {
Node node = searchNode(mRoots, word, 0, word.length());
- return (node == null) ? -1 : node.frequency;
+ return (node == null) ? -1 : node.mFrequency;
}
/**
@@ -241,7 +254,7 @@ public class ExpandableDictionary extends Dictionary {
protected void getWordsRec(NodeArray roots, final WordComposer codes, final char[] word,
final int depth, boolean completion, int snr, int inputIndex, int skipPos,
WordCallback callback) {
- final int count = roots.length;
+ final int count = roots.mLength;
final int codeSize = mInputLength;
// Optimization: Prune out words that are too long compared to how much was typed.
if (depth > mMaxDepth) {
@@ -255,12 +268,12 @@ public class ExpandableDictionary extends Dictionary {
}
for (int i = 0; i < count; i++) {
- final Node node = roots.data[i];
- final char c = node.code;
+ final Node node = roots.mData[i];
+ final char c = node.mCode;
final char lowerC = toLowerCase(c);
- final boolean terminal = node.terminal;
- final NodeArray children = node.children;
- final int freq = node.frequency;
+ final boolean terminal = node.mTerminal;
+ final NodeArray children = node.mChildren;
+ final int freq = node.mFrequency;
if (completion) {
word[depth] = c;
if (terminal) {
@@ -340,24 +353,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 +380,31 @@ public class ExpandableDictionary extends Dictionary {
final int wordLength = word.length();
final char c = word.charAt(depth);
// Does children have the current character?
- final int childrenLength = children.length;
+ final int childrenLength = children.mLength;
Node childNode = null;
boolean found = false;
for (int i = 0; i < childrenLength; i++) {
- childNode = children.data[i];
- if (childNode.code == c) {
+ childNode = children.mData[i];
+ if (childNode.mCode == c) {
found = true;
break;
}
}
if (!found) {
childNode = new Node();
- childNode.code = c;
- childNode.parent = parentNode;
+ childNode.mCode = c;
+ childNode.mParent = parentNode;
children.add(childNode);
}
if (wordLength == depth + 1) {
// Terminate this word
- childNode.terminal = true;
+ childNode.mTerminal = true;
return childNode;
}
- if (childNode.children == null) {
- childNode.children = new NodeArray();
+ if (childNode.mChildren == null) {
+ childNode.mChildren = new NodeArray();
}
- return searchWord(childNode.children, word, depth + 1, childNode);
+ return searchWord(childNode.mChildren, word, depth + 1, childNode);
}
// @VisibleForTesting
@@ -408,8 +419,8 @@ public class ExpandableDictionary extends Dictionary {
private void runReverseLookUp(final CharSequence previousWord, final WordCallback callback) {
Node prevWord = searchNode(mRoots, previousWord, 0, previousWord.length());
- if (prevWord != null && prevWord.ngrams != null) {
- reverseLookUp(prevWord.ngrams, callback);
+ if (prevWord != null && prevWord.mNGrams != null) {
+ reverseLookUp(prevWord.mNGrams, callback);
}
}
@@ -430,6 +441,7 @@ public class ExpandableDictionary extends Dictionary {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
+ //
}
}
}
@@ -444,14 +456,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 +480,18 @@ public class ExpandableDictionary extends Dictionary {
private Node searchNode(final NodeArray children, final CharSequence word, final int offset,
final int length) {
// TODO Consider combining with addWordRec
- final int count = children.length;
+ final int count = children.mLength;
char currentChar = word.charAt(offset);
for (int j = 0; j < count; j++) {
- final Node node = children.data[j];
- if (node.code == currentChar) {
+ final Node node = children.mData[j];
+ if (node.mCode == currentChar) {
if (offset == length - 1) {
- if (node.terminal) {
+ if (node.mTerminal) {
return node;
}
} else {
- if (node.children != null) {
- Node returnNode = searchNode(node.children, word, offset + 1, length);
+ if (node.mChildren != null) {
+ Node returnNode = searchNode(node.mChildren, word, offset + 1, length);
if (returnNode != null) return returnNode;
}
}
@@ -504,15 +516,16 @@ public class ExpandableDictionary extends Dictionary {
}
static char toLowerCase(char c) {
+ char baseChar = c;
if (c < BASE_CHARS.length) {
- c = BASE_CHARS[c];
+ baseChar = BASE_CHARS[c];
}
- if (c >= 'A' && c <= 'Z') {
- c = (char) (c | 32);
- } else if (c > 127) {
- c = Character.toLowerCase(c);
+ if (baseChar >= 'A' && baseChar <= 'Z') {
+ return (char)(baseChar | 32);
+ } else if (baseChar > 127) {
+ return Character.toLowerCase(baseChar);
}
- return c;
+ return baseChar;
}
/**
diff --git a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
index e811a2cdd..27e0fbe4a 100644
--- a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
+++ b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
@@ -16,11 +16,6 @@
package com.android.inputmethod.latin;
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Locale;
-
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Configuration;
@@ -32,32 +27,43 @@ import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.text.TextUtils;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Locale;
+
public class InputLanguageSelection extends PreferenceActivity {
+ private SharedPreferences mPrefs;
private String mSelectedLanguages;
private ArrayList<Loc> mAvailableLanguages = new ArrayList<Loc>();
private static final String[] BLACKLIST_LANGUAGES = {
- "ko", "ja", "zh", "el"
+ "ko", "ja", "zh", "el", "zz"
};
private static class Loc implements Comparable<Object> {
- static Collator sCollator = Collator.getInstance();
+ private static Collator sCollator = Collator.getInstance();
- String label;
- Locale locale;
+ private String mLabel;
+ public final Locale mLocale;
public Loc(String label, Locale locale) {
- this.label = label;
- this.locale = locale;
+ this.mLabel = label;
+ this.mLocale = locale;
+ }
+
+ public void setLabel(String label) {
+ this.mLabel = label;
}
@Override
public String toString() {
- return this.label;
+ return this.mLabel;
}
+ @Override
public int compareTo(Object o) {
- return sCollator.compare(this.label, ((Loc) o).label);
+ return sCollator.compare(this.mLabel, ((Loc) o).mLabel);
}
}
@@ -66,15 +72,15 @@ public class InputLanguageSelection extends PreferenceActivity {
super.onCreate(icicle);
addPreferencesFromResource(R.xml.language_prefs);
// Get the settings preferences
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
- mSelectedLanguages = sp.getString(LatinIME.PREF_SELECTED_LANGUAGES, "");
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ mSelectedLanguages = mPrefs.getString(Settings.PREF_SELECTED_LANGUAGES, "");
String[] languageList = mSelectedLanguages.split(",");
mAvailableLanguages = getUniqueLocales();
PreferenceGroup parent = getPreferenceScreen();
for (int i = 0; i < mAvailableLanguages.size(); i++) {
CheckBoxPreference pref = new CheckBoxPreference(this);
- Locale locale = mAvailableLanguages.get(i).locale;
- pref.setTitle(LanguageSwitcher.toTitleCase(locale.getDisplayName(locale)));
+ Locale locale = mAvailableLanguages.get(i).mLocale;
+ pref.setTitle(SubtypeSwitcher.getFullDisplayName(locale, true));
boolean checked = isLocaleIn(locale, languageList);
pref.setChecked(checked);
if (hasDictionary(locale)) {
@@ -135,18 +141,17 @@ public class InputLanguageSelection extends PreferenceActivity {
for (int i = 0; i < count; i++) {
CheckBoxPreference pref = (CheckBoxPreference) parent.getPreference(i);
if (pref.isChecked()) {
- Locale locale = mAvailableLanguages.get(i).locale;
+ Locale locale = mAvailableLanguages.get(i).mLocale;
checkedLanguages += get5Code(locale) + ",";
}
}
if (checkedLanguages.length() < 1) checkedLanguages = null; // Save null
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
- Editor editor = sp.edit();
- editor.putString(LatinIME.PREF_SELECTED_LANGUAGES, checkedLanguages);
+ Editor editor = mPrefs.edit();
+ editor.putString(Settings.PREF_SELECTED_LANGUAGES, checkedLanguages);
SharedPreferencesCompat.apply(editor);
}
- ArrayList<Loc> getUniqueLocales() {
+ public ArrayList<Loc> getUniqueLocales() {
String[] locales = getAssets().getLocales();
Arrays.sort(locales);
ArrayList<Loc> uniqueLocales = new ArrayList<Loc>();
@@ -167,23 +172,24 @@ public class InputLanguageSelection extends PreferenceActivity {
if (finalSize == 0) {
preprocess[finalSize++] =
- new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(l)), l);
+ new Loc(SubtypeSwitcher.getFullDisplayName(l, true), l);
} else {
// check previous entry:
// same lang and a country -> upgrade to full name and
// insert ours with full name
// diff lang -> insert ours with lang-only name
- if (preprocess[finalSize-1].locale.getLanguage().equals(
+ if (preprocess[finalSize-1].mLocale.getLanguage().equals(
language)) {
- preprocess[finalSize-1].label = LanguageSwitcher.toTitleCase(
- preprocess[finalSize-1].locale.getDisplayName());
+ preprocess[finalSize-1].setLabel(SubtypeSwitcher.getFullDisplayName(
+ preprocess[finalSize-1].mLocale, false));
preprocess[finalSize++] =
- new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName()), l);
+ new Loc(SubtypeSwitcher.getFullDisplayName(l, false), l);
} else {
String displayName;
if (s.equals("zz_ZZ")) {
+ // ignore this locale
} else {
- displayName = LanguageSwitcher.toTitleCase(l.getDisplayName(l));
+ displayName = SubtypeSwitcher.getFullDisplayName(l, true);
preprocess[finalSize++] = new Loc(displayName, l);
}
}
diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
deleted file mode 100644
index a7b695eb3..000000000
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ /dev/null
@@ -1,538 +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 static final int SYMBOLS_MODE_STATE_NONE = 0;
- private static final int SYMBOLS_MODE_STATE_BEGIN = 1;
- private static final int SYMBOLS_MODE_STATE_SYMBOL = 2;
-
- 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 final LatinIME mInputMethodService;
-
- private KeyboardId mSymbolsId;
- private KeyboardId mSymbolsShiftedId;
-
- private KeyboardId mCurrentId;
- private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboards;
-
- 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 int mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
-
- // 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;
-
- public KeyboardSwitcher(LatinIME ims) {
- mInputMethodService = ims;
-
- final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ims);
- mLayoutId = Integer.valueOf(prefs.getString(PREF_KEYBOARD_LAYOUT, DEFAULT_LAYOUT_ID));
- updateSettingsKeyState(prefs);
- prefs.registerOnSharedPreferenceChangeListener(this);
-
- mKeyboards = new HashMap<KeyboardId, SoftReference<LatinKeyboard>>();
- mSymbolsId = makeSymbolsId(false);
- mSymbolsShiftedId = 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) {
- mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
- 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 toggleSymbols() {
- setKeyboardMode(mMode, mImeOptions, mHasVoice, !mIsSymbols);
- if (mIsSymbols && !mPreferSymbols) {
- mSymbolsModeState = SYMBOLS_MODE_STATE_BEGIN;
- } else {
- mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
- }
- }
-
- public boolean hasDistinctMultitouch() {
- return mInputView != null && mInputView.hasDistinctMultitouch();
- }
-
- /**
- * Updates state machine to figure out when to automatically switch back to alpha mode.
- * Returns true if the keyboard needs to switch back
- */
- public boolean onKey(int key) {
- // Switch back to alpha mode if user types one or more non-space/enter characters
- // followed by a space/enter
- switch (mSymbolsModeState) {
- case SYMBOLS_MODE_STATE_BEGIN:
- if (key != LatinIME.KEYCODE_SPACE && key != LatinIME.KEYCODE_ENTER && key > 0) {
- mSymbolsModeState = SYMBOLS_MODE_STATE_SYMBOL;
- }
- break;
- case SYMBOLS_MODE_STATE_SYMBOL:
- if (key == LatinIME.KEYCODE_ENTER || key == LatinIME.KEYCODE_SPACE) return true;
- break;
- }
- return false;
- }
-
- public LatinKeyboardView getInputView() {
- return mInputView;
- }
-
- public void recreateInputView() {
- changeLatinKeyboardView(mLayoutId, true);
- }
-
- private void changeLatinKeyboardView(int newLayout, boolean forceReset) {
- if (mLayoutId != newLayout || mInputView == null || forceReset) {
- if (mInputView != null) {
- mInputView.closing();
- }
- if (THEMES.length <= newLayout) {
- newLayout = Integer.valueOf(DEFAULT_LAYOUT_ID);
- }
-
- LatinIMEUtil.GCUtils.getInstance().reset();
- boolean tryGC = true;
- for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
- try {
- mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater(
- ).inflate(THEMES[newLayout], null);
- tryGC = false;
- } catch (OutOfMemoryError e) {
- tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait(
- mLayoutId + "," + newLayout, e);
- } catch (InflateException e) {
- tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait(
- mLayoutId + "," + newLayout, e);
- }
- }
- mInputView.setOnKeyboardActionListener(mInputMethodService);
- mLayoutId = newLayout;
- }
- mInputMethodService.mHandler.post(new Runnable() {
- public void run() {
- if (mInputView != null) {
- mInputMethodService.setInputView(mInputView);
- }
- mInputMethodService.updateInputViewShown();
- }});
- }
-
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if (PREF_KEYBOARD_LAYOUT.equals(key)) {
- changeLatinKeyboardView(
- Integer.valueOf(sharedPreferences.getString(key, DEFAULT_LAYOUT_ID)), false);
- } else if (LatinIMESettings.PREF_SETTINGS_KEY.equals(key)) {
- updateSettingsKeyState(sharedPreferences);
- recreateInputView();
- }
- }
-
- public boolean isBlackSym () {
- if (mInputView != null && mInputView.getSymbolColorScheme() == 1) {
- return true;
- }
- return false;
- }
-
- private int getCharColorId () {
- if (isBlackSym()) {
- return CHAR_THEME_COLOR_BLACK;
- } else {
- return CHAR_THEME_COLOR_WHITE;
- }
- }
-
- public void onAutoCompletionStateChanged(boolean isAutoCompletion) {
- if (isAutoCompletion != mIsAutoCompletionActive) {
- LatinKeyboardView keyboardView = getInputView();
- mIsAutoCompletionActive = isAutoCompletion;
- keyboardView.invalidateKey(((LatinKeyboard) keyboardView.getKeyboard())
- .onAutoCompletionStateChanged(isAutoCompletion));
- }
- }
-
- private void updateSettingsKeyState(SharedPreferences prefs) {
- Resources resources = mInputMethodService.getResources();
- final String settingsKeyMode = prefs.getString(LatinIMESettings.PREF_SETTINGS_KEY,
- resources.getString(DEFAULT_SETTINGS_KEY_MODE));
- // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or
- // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system
- if (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))
- || (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO))
- && LatinIMEUtil.hasMultipleEnabledIMEs(mInputMethodService))) {
- mHasSettingsKey = true;
- } else {
- mHasSettingsKey = false;
- }
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
index 7b5c30491..6faf7f95e 100644
--- a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
@@ -16,21 +16,21 @@
package com.android.inputmethod.latin;
-import java.util.Locale;
-
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
-import android.preference.PreferenceManager;
import android.text.TextUtils;
+import java.util.ArrayList;
+import java.util.Locale;
+
/**
* Keeps track of list of selected input languages and the current
* input language that the user has selected.
*/
public class LanguageSwitcher {
- private Locale[] mLocales;
- private LatinIME mIme;
+ private final ArrayList<Locale> mLocales = new ArrayList<Locale>();
+ private final LatinIME mIme;
private String[] mSelectedLanguageArray;
private String mSelectedLanguages;
private int mCurrentIndex = 0;
@@ -40,15 +40,10 @@ public class LanguageSwitcher {
public LanguageSwitcher(LatinIME ime) {
mIme = ime;
- mLocales = new Locale[0];
- }
-
- public Locale[] getLocales() {
- return mLocales;
}
public int getLocaleCount() {
- return mLocales.length;
+ return mLocales.size();
}
/**
@@ -57,14 +52,14 @@ public class LanguageSwitcher {
* @return whether there was any change
*/
public boolean loadLocales(SharedPreferences sp) {
- String selectedLanguages = sp.getString(LatinIME.PREF_SELECTED_LANGUAGES, null);
- String currentLanguage = sp.getString(LatinIME.PREF_INPUT_LANGUAGE, null);
+ String selectedLanguages = sp.getString(Settings.PREF_SELECTED_LANGUAGES, null);
+ String currentLanguage = sp.getString(Settings.PREF_INPUT_LANGUAGE, null);
if (selectedLanguages == null || selectedLanguages.length() < 1) {
loadDefaults();
- if (mLocales.length == 0) {
+ if (mLocales.size() == 0) {
return false;
}
- mLocales = new Locale[0];
+ mLocales.clear();
return true;
}
if (selectedLanguages.equals(mSelectedLanguages)) {
@@ -77,7 +72,7 @@ public class LanguageSwitcher {
if (currentLanguage != null) {
// Find the index
mCurrentIndex = 0;
- for (int i = 0; i < mLocales.length; i++) {
+ for (int i = 0; i < mLocales.size(); i++) {
if (mSelectedLanguageArray[i].equals(currentLanguage)) {
mCurrentIndex = i;
break;
@@ -96,11 +91,11 @@ public class LanguageSwitcher {
}
private void constructLocales() {
- mLocales = new Locale[mSelectedLanguageArray.length];
- for (int i = 0; i < mLocales.length; i++) {
- final String lang = mSelectedLanguageArray[i];
- mLocales[i] = new Locale(lang.substring(0, 2),
+ mLocales.clear();
+ for (final String lang : mSelectedLanguageArray) {
+ final Locale locale = new Locale(lang.substring(0, 2),
lang.length() > 4 ? lang.substring(3, 5) : "");
+ mLocales.add(locale);
}
}
@@ -129,7 +124,17 @@ public class LanguageSwitcher {
public Locale getInputLocale() {
if (getLocaleCount() == 0) return mDefaultInputLocale;
- return mLocales[mCurrentIndex];
+ return mLocales.get(mCurrentIndex);
+ }
+
+ private int nextLocaleIndex() {
+ final int size = mLocales.size();
+ return (mCurrentIndex + 1) % size;
+ }
+
+ private int prevLocaleIndex() {
+ final int size = mLocales.size();
+ return (mCurrentIndex - 1 + size) % size;
}
/**
@@ -139,8 +144,7 @@ public class LanguageSwitcher {
*/
public Locale getNextInputLocale() {
if (getLocaleCount() == 0) return mDefaultInputLocale;
-
- return mLocales[(mCurrentIndex + 1) % mLocales.length];
+ return mLocales.get(nextLocaleIndex());
}
/**
@@ -166,8 +170,7 @@ public class LanguageSwitcher {
*/
public Locale getPrevInputLocale() {
if (getLocaleCount() == 0) return mDefaultInputLocale;
-
- return mLocales[(mCurrentIndex - 1 + mLocales.length) % mLocales.length];
+ return mLocales.get(prevLocaleIndex());
}
public void reset() {
@@ -175,27 +178,16 @@ public class LanguageSwitcher {
}
public void next() {
- mCurrentIndex++;
- if (mCurrentIndex >= mLocales.length) mCurrentIndex = 0; // Wrap around
+ mCurrentIndex = nextLocaleIndex();
}
public void prev() {
- mCurrentIndex--;
- if (mCurrentIndex < 0) mCurrentIndex = mLocales.length - 1; // Wrap around
+ mCurrentIndex = prevLocaleIndex();
}
- public void persist() {
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mIme);
- Editor editor = sp.edit();
- editor.putString(LatinIME.PREF_INPUT_LANGUAGE, getInputLanguage());
+ public void persist(SharedPreferences prefs) {
+ Editor editor = prefs.edit();
+ editor.putString(Settings.PREF_INPUT_LANGUAGE, getInputLanguage());
SharedPreferencesCompat.apply(editor);
}
-
- static String toTitleCase(String s) {
- if (s.length() == 0) {
- return s;
- }
-
- return Character.toUpperCase(s.charAt(0)) + s.substring(1);
- }
}
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index ffca22e45..9a240cb41 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -16,11 +16,16 @@
package com.android.inputmethod.latin;
-import com.android.inputmethod.latin.LatinIMEUtil.RingCharBuffer;
-import com.android.inputmethod.voice.FieldContext;
-import com.android.inputmethod.voice.SettingsUtil;
-import com.android.inputmethod.voice.VoiceInput;
-
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardActionListener;
+import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.keyboard.KeyboardView;
+import com.android.inputmethod.keyboard.LatinKeyboardView;
+import com.android.inputmethod.latin.Utils.RingCharBuffer;
+import com.android.inputmethod.voice.VoiceIMEConnector;
+
+import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.AlertDialog;
@@ -34,21 +39,21 @@ 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.os.Debug;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
+import android.os.Vibrator;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
-import android.speech.SpeechRecognizer;
-import android.text.ClipboardManager;
+import android.text.InputType;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.PrintWriterPrinter;
import android.util.Printer;
+import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -58,206 +63,132 @@ 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.HorizontalScrollView;
import android.widget.LinearLayout;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
+import java.util.Arrays;
import java.util.Locale;
-import java.util.Map;
/**
* Input method implementation for Qwerty'ish keyboard.
*/
-public class LatinIME extends InputMethodService
- implements LatinKeyboardBaseView.OnKeyboardActionListener,
- VoiceInput.UiListener,
+public class LatinIME extends InputMethodService implements KeyboardActionListener,
SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = "LatinIME";
private static final boolean PERF_DEBUG = false;
- static final boolean DEBUG = false;
- static final boolean TRACE = false;
- static final boolean VOICE_INSTALLED = true;
- static final boolean ENABLE_VOICE_BUTTON = true;
-
- private static final String PREF_VIBRATE_ON = "vibrate_on";
- private static final String PREF_SOUND_ON = "sound_on";
- private static final String PREF_POPUP_ON = "popup_on";
- private static final String PREF_AUTO_CAP = "auto_cap";
- private static final String PREF_QUICK_FIXES = "quick_fixes";
- private static final String PREF_SHOW_SUGGESTIONS = "show_suggestions";
- private static final String PREF_AUTO_COMPLETE = "auto_complete";
- //private static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion";
- private static final String PREF_VOICE_MODE = "voice_mode";
-
- // Whether or not the user has used voice input before (and thus, whether to show the
- // first-run warning dialog or not).
- private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input";
-
- // Whether or not the user has used voice input from an unsupported locale UI before.
- // For example, the user has a Chinese UI but activates voice input.
- private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE =
- "has_used_voice_input_unsupported_locale";
-
- // A list of locales which are supported by default for voice input, unless we get a
- // different list from Gservices.
- public static final String DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES =
- "en " +
- "en_US " +
- "en_GB " +
- "en_AU " +
- "en_CA " +
- "en_IE " +
- "en_IN " +
- "en_NZ " +
- "en_SG " +
- "en_ZA ";
-
- // The private IME option used to indicate that no microphone should be shown for a
- // given text field. For instance this is specified by the search dialog when the
- // dialog is already showing a voice search button.
- private static final String IME_OPTION_NO_MICROPHONE = "nm";
-
- public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
- public static final String PREF_INPUT_LANGUAGE = "input_language";
- private static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled";
-
- private static final int MSG_UPDATE_SUGGESTIONS = 0;
- private static final int MSG_START_TUTORIAL = 1;
- private static final int MSG_UPDATE_SHIFT_STATE = 2;
- private static final int MSG_VOICE_RESULTS = 3;
- private static final int MSG_UPDATE_OLD_SUGGESTIONS = 4;
+ private static final boolean DEBUG = false;
+ private static final boolean TRACE = false;
+
+ 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;
// 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 LatinKeyboardView mInputView;
- private LinearLayout mCandidateViewContainer;
+ 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 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 KeyboardSwitcher mKeyboardSwitcher;
+ private SubtypeSwitcher mSubtypeSwitcher;
+ private VoiceIMEConnector mVoiceConnector;
private UserDictionary mUserDictionary;
private UserBigramDictionary mUserBigramDictionary;
private ContactsDictionary mContactsDictionary;
private AutoDictionary mAutoDictionary;
- private Hints mHints;
-
private Resources mResources;
+ private SharedPreferences mPrefs;
- private String mInputLocale;
- private String mSystemLocale;
- private LanguageSwitcher mLanguageSwitcher;
-
- 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 mPredicting;
private boolean mPredictionOn;
- private boolean mCompletionOn;
+ private boolean mApplicationSpecifiedCompletionOn;
private boolean mHasDictionary;
private boolean mAutoSpace;
private boolean mJustAddedAutoSpace;
private boolean mAutoCorrectEnabled;
private boolean mReCorrectionEnabled;
- // Bigram Suggestion is disabled in this version.
- private final boolean mBigramSuggestionEnabled = false;
+ private boolean mBigramSuggestionEnabled;
private boolean mAutoCorrectOn;
- // TODO move this state variable outside LatinIME
- private boolean mCapsLock;
- private boolean mPasswordText;
private boolean mVibrateOn;
private boolean mSoundOn;
private boolean mPopupOn;
private boolean mAutoCap;
private boolean mQuickFixes;
- private boolean mHasUsedVoiceInput;
- private boolean mHasUsedVoiceInputUnsupportedLocale;
- private boolean mLocaleSupportedForVoiceInput;
- private boolean mShowSuggestions;
- private boolean mIsShowingHint;
- private int mCorrectionMode;
- private boolean mEnableVoice = true;
- private boolean mVoiceOnPrimary;
- private int mOrientation;
- private List<CharSequence> mSuggestPuncList;
+
+ private int mCorrectionMode;
+ private int mCommittedLength;
+ private int mOrientation;
// Keep track of the last selection range to decide if we need to show word alternatives
- private int mLastSelectionStart;
- private int mLastSelectionEnd;
+ private int mLastSelectionStart;
+ private int mLastSelectionEnd;
+ private SuggestedWords mSuggestPuncList;
// Input type is such that we should not auto-correct
private boolean mInputTypeNoAutoCorrect;
// Indicates whether the suggestion strip is to be on in landscape
private boolean mJustAccepted;
- private CharSequence mJustRevertedSeparator;
+ private boolean mJustReverted;
private int mDeleteCount;
private long mLastKeyTime;
- // Modifier keys state
- private ModifierKeyState mShiftKeyState = new ModifierKeyState();
- private ModifierKeyState mSymbolKeyState = new ModifierKeyState();
-
- private Tutorial mTutorial;
-
private AudioManager mAudioManager;
// Align sound effect volume on music volume
- private final float FX_VOLUME = -1.0f;
+ private static final float FX_VOLUME = -1.0f;
private boolean mSilentMode;
/* package */ String mWordSeparators;
private String mSentenceSeparators;
private String mSuggestPuncs;
- private VoiceInput mVoiceInput;
- private VoiceResults mVoiceResults = new VoiceResults();
+ // TODO: Move this flag to VoiceIMEConnector
private boolean mConfigurationChanging;
// Keeps track of most recently inserted text (multi-character key) for reverting
private CharSequence mEnteredText;
private boolean mRefreshKeyboardRequired;
- // For each word, a list of potential replacements, usually from voice.
- private Map<String, List<CharSequence>> mWordToSuggestions =
- new HashMap<String, List<CharSequence>>();
-
- private ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>();
-
- private class VoiceResults {
- List<String> candidates;
- Map<String, List<CharSequence>> alternatives;
- }
+ private final ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>();
public abstract static class WordAlternatives {
protected CharSequence mChosenWord;
@@ -281,7 +212,7 @@ public class LatinIME extends InputMethodService
return mChosenWord;
}
- public abstract List<CharSequence> getAlternatives();
+ public abstract SuggestedWords.Builder getAlternatives();
}
public class TypedWordAlternatives extends WordAlternatives {
@@ -302,72 +233,101 @@ 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;
+
@Override
public void handleMessage(Message msg) {
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:
+ mKeyboardSwitcher.updateShiftState();
+ break;
+ case MSG_VOICE_RESULTS:
+ mVoiceConnector.handleVoiceResults(preferCapitalization()
+ || (mKeyboardSwitcher.isAlphabetMode()
+ && mKeyboardSwitcher.isShiftedOrShiftLocked()));
+ 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));
+ }
+ }
@Override
public void onCreate() {
- LatinImeLogger.init(this);
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ mPrefs = prefs;
+ LatinImeLogger.init(this, prefs);
+ SubtypeSwitcher.init(this, prefs);
+ KeyboardSwitcher.init(this, prefs);
super.onCreate();
//setStatusIcon(R.drawable.ime_qwerty);
mResources = getResources();
+ mImm = ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE));
final Configuration conf = mResources.getConfiguration();
- final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- mLanguageSwitcher = new LanguageSwitcher(this);
- mLanguageSwitcher.loadLocales(prefs);
- mKeyboardSwitcher = new KeyboardSwitcher(this);
- 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,
+ mSubtypeSwitcher = SubtypeSwitcher.getInstance();
+ mKeyboardSwitcher = KeyboardSwitcher.getInstance();
+ mReCorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED,
getResources().getBoolean(R.bool.default_recorrection_enabled));
- LatinIMEUtil.GCUtils.getInstance().reset();
+ 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);
}
}
@@ -377,19 +337,7 @@ public class LatinIME extends InputMethodService
// register to receive ringer mode changes for silent mode
IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);
- if (VOICE_INSTALLED) {
- mVoiceInput = new VoiceInput(this, this);
- mHints = new Hints(this, new Hints.Display() {
- public void showHint(int viewResource) {
- LayoutInflater inflater = (LayoutInflater) getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- View view = inflater.inflate(viewResource, null);
- setCandidatesView(view);
- setCandidatesViewShown(true);
- mIsShowingHint = true;
- }
- });
- }
+ mVoiceConnector = VoiceIMEConnector.init(this, prefs, mHandler);
prefs.registerOnSharedPreferenceChangeListener(this);
}
@@ -397,15 +345,15 @@ public class LatinIME extends InputMethodService
* Loads a dictionary or multiple separated dictionary
* @return returns array of dictionary resource ids
*/
- /* package */ static int[] getDictionary(Resources res) {
+ public 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) {
+ while (current != XmlPullParser.END_DOCUMENT) {
+ if (current == XmlPullParser.START_TAG) {
String tag = xrp.getName();
if (tag != null) {
if (tag.equals("part")) {
@@ -432,37 +380,34 @@ public class LatinIME extends InputMethodService
return dict;
}
- private void initSuggest(String locale) {
- mInputLocale = locale;
+ private void initSuggest() {
+ updateAutoTextEnabled();
+ String locale = mSubtypeSwitcher.getInputLocaleStr();
Resources orig = getResources();
- Configuration conf = orig.getConfiguration();
- Locale saveLocale = conf.locale;
- conf.locale = new Locale(locale);
- orig.updateConfiguration(conf, orig.getDisplayMetrics());
+ Locale savedLocale = mSubtypeSwitcher.changeSystemLocale(new Locale(locale));
if (mSuggest != null) {
mSuggest.close();
}
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
- mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true);
+ final SharedPreferences prefs = mPrefs;
+ mQuickFixes = prefs.getBoolean(Settings.PREF_QUICK_FIXES, true);
int[] dictionaries = getDictionary(orig);
mSuggest = new Suggest(this, dictionaries);
- updateAutoTextEnabled(saveLocale);
+ loadAndSetAutoCorrectionThreshold(prefs);
if (mUserDictionary != null) mUserDictionary.close();
- mUserDictionary = new UserDictionary(this, mInputLocale);
+ mUserDictionary = new UserDictionary(this, locale);
if (mContactsDictionary == null) {
mContactsDictionary = new ContactsDictionary(this, Suggest.DIC_CONTACTS);
}
if (mAutoDictionary != null) {
mAutoDictionary.close();
}
- mAutoDictionary = new AutoDictionary(this, this, mInputLocale, Suggest.DIC_AUTO);
+ mAutoDictionary = new AutoDictionary(this, this, locale, Suggest.DIC_AUTO);
if (mUserBigramDictionary != null) {
mUserBigramDictionary.close();
}
- mUserBigramDictionary = new UserBigramDictionary(this, this, mInputLocale,
- Suggest.DIC_USER);
+ mUserBigramDictionary = new UserBigramDictionary(this, this, locale, Suggest.DIC_USER);
mSuggest.setUserBigramDictionary(mUserBigramDictionary);
mSuggest.setUserDictionary(mUserDictionary);
mSuggest.setContactsDictionary(mContactsDictionary);
@@ -471,8 +416,7 @@ public class LatinIME extends InputMethodService
mWordSeparators = mResources.getString(R.string.word_separators);
mSentenceSeparators = mResources.getString(R.string.sentence_separators);
- conf.locale = saveLocale;
- orig.updateConfiguration(conf, orig.getDisplayMetrics());
+ mSubtypeSwitcher.changeSystemLocale(savedLocale);
}
@Override
@@ -484,9 +428,7 @@ public class LatinIME extends InputMethodService
mContactsDictionary.close();
}
unregisterReceiver(mReceiver);
- if (VOICE_INSTALLED && mVoiceInput != null) {
- mVoiceInput.destroy();
- }
+ mVoiceConnector.destroy();
LatinImeLogger.commit();
LatinImeLogger.onDestroy();
super.onDestroy();
@@ -494,180 +436,175 @@ 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 (mSubtypeSwitcher.isKeyboardMode())
+ onKeyboardLanguageChanged();
+ updateAutoTextEnabled();
+
// 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();
+ final int mode = mKeyboardSwitcher.getKeyboardMode();
+ final EditorInfo attribute = getCurrentInputEditorInfo();
+ final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
+ mKeyboardSwitcher.loadKeyboard(mode, imeOptions,
+ mVoiceConnector.isVoiceButtonEnabled(),
+ mVoiceConnector.isVoiceButtonOnPrimary());
}
+
mConfigurationChanging = true;
super.onConfigurationChanged(conf);
- if (mRecognizing) {
- switchToRecognitionStatusView();
- }
+ mVoiceConnector.onConfigurationChanged(mConfigurationChanging);
mConfigurationChanging = false;
}
@Override
public View onCreateInputView() {
- mKeyboardSwitcher.recreateInputView();
- mKeyboardSwitcher.makeKeyboards(true);
- mKeyboardSwitcher.setKeyboardMode(
- KeyboardSwitcher.MODE_TEXT, 0,
- shouldShowVoiceButton(makeFieldContext(), getCurrentInputEditorInfo()));
- return mKeyboardSwitcher.getInputView();
+ return mKeyboardSwitcher.onCreateInputView();
}
@Override
public View onCreateCandidatesView() {
- mKeyboardSwitcher.makeKeyboards(true);
- mCandidateViewContainer = (LinearLayout) getLayoutInflater().inflate(
- R.layout.candidates, null);
- mCandidateView = (CandidateView) mCandidateViewContainer.findViewById(R.id.candidates);
+ LayoutInflater inflater = getLayoutInflater();
+ LinearLayout container = (LinearLayout)inflater.inflate(R.layout.candidates, null);
+ mCandidateViewContainer = container;
+ if (container.getPaddingRight() != 0) {
+ HorizontalScrollView scrollView =
+ (HorizontalScrollView) container.findViewById(R.id.candidates_scroll_view);
+ scrollView.setOverScrollMode(View.OVER_SCROLL_NEVER);
+ container.setGravity(Gravity.CENTER_HORIZONTAL);
+ }
+ mCandidateView = (CandidateView) container.findViewById(R.id.candidates);
mCandidateView.setService(this);
setCandidatesViewShown(true);
- return mCandidateViewContainer;
+ return container;
+ }
+
+ private static boolean isPasswordVariation(int variation) {
+ return variation == InputType.TYPE_TEXT_VARIATION_PASSWORD
+ || variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+ || variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD;
+ }
+
+ private static boolean isEmailVariation(int variation) {
+ return variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
+ || variation == InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS;
}
@Override
public void onStartInputView(EditorInfo attribute, boolean restarting) {
- LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+ final KeyboardSwitcher switcher = mKeyboardSwitcher;
+ LatinKeyboardView inputView = switcher.getInputView();
+
// In landscape mode, this method gets called without the input view being created.
if (inputView == null) {
return;
}
+ mSubtypeSwitcher.updateParametersOnStartInputView();
+
if (mRefreshKeyboardRequired) {
mRefreshKeyboardRequired = false;
- toggleLanguage(true, true);
+ onKeyboardLanguageChanged();
}
- mKeyboardSwitcher.makeKeyboards(false);
-
TextEntryState.newSession(this);
// Most such things we decide below in the switch statement, but we need to know
// now whether this is a password text field, because we need to know now (before
// the switch statement) whether we want to enable the voice button.
- mPasswordText = false;
- int variation = attribute.inputType & EditorInfo.TYPE_MASK_VARIATION;
- if (variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD ||
- variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
- mPasswordText = true;
- }
-
- mEnableVoiceButton = shouldShowVoiceButton(makeFieldContext(), attribute);
- final boolean enableVoiceButton = mEnableVoiceButton && mEnableVoice;
-
- mAfterVoiceInput = false;
- mImmediatelyAfterVoiceInput = false;
- mShowingVoiceSuggestions = false;
- mVoiceInputHighlighted = false;
+ int variation = attribute.inputType & InputType.TYPE_MASK_VARIATION;
+ mVoiceConnector.resetVoiceStates(isPasswordVariation(variation));
mInputTypeNoAutoCorrect = false;
mPredictionOn = false;
- mCompletionOn = false;
- mCompletions = null;
- mCapsLock = false;
+ mApplicationSpecifiedCompletionOn = false;
+ mApplicationSpecifiedCompletions = null;
mEnteredText = null;
- 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);
+ final int mode;
+ switch (attribute.inputType & InputType.TYPE_MASK_CLASS) {
+ case InputType.TYPE_CLASS_NUMBER:
+ case InputType.TYPE_CLASS_DATETIME:
+ mode = KeyboardId.MODE_NUMBER;
+ break;
+ case InputType.TYPE_CLASS_PHONE:
+ mode = KeyboardId.MODE_PHONE;
break;
- case EditorInfo.TYPE_CLASS_TEXT:
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT,
- attribute.imeOptions, enableVoiceButton);
+ case InputType.TYPE_CLASS_TEXT:
//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 ) {
+ if (isPasswordVariation(variation)) {
mPredictionOn = false;
}
- if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
- || variation == EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME) {
+ if (isEmailVariation(variation)
+ || variation == InputType.TYPE_TEXT_VARIATION_PERSON_NAME) {
mAutoSpace = false;
} else {
mAutoSpace = true;
}
- if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS) {
+ if (isEmailVariation(variation)) {
mPredictionOn = false;
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_EMAIL,
- attribute.imeOptions, enableVoiceButton);
- } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_URI) {
+ mode = KeyboardId.MODE_EMAIL;
+ } else if (variation == InputType.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) {
+ mode = KeyboardId.MODE_URL;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE) {
+ mode = KeyboardId.MODE_IM;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
mPredictionOn = false;
- } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) {
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_WEB,
- attribute.imeOptions, enableVoiceButton);
+ mode = KeyboardId.MODE_TEXT;
+ } else if (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) {
+ mode = KeyboardId.MODE_WEB;
// If it's a browser edit field and auto correct is not ON explicitly, then
// disable auto correction, but keep suggestions on.
- if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) {
+ if ((attribute.inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) {
mInputTypeNoAutoCorrect = true;
}
+ } else {
+ mode = KeyboardId.MODE_TEXT;
}
// If NO_SUGGESTIONS is set, don't do prediction.
- if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) {
+ if ((attribute.inputType & InputType.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) {
+ if ((attribute.inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0 &&
+ (attribute.inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE) == 0) {
mInputTypeNoAutoCorrect = true;
}
- if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) {
+ if ((attribute.inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) {
mPredictionOn = false;
- mCompletionOn = isFullscreenMode();
+ mApplicationSpecifiedCompletionOn = isFullscreenMode();
}
break;
default:
- mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT,
- attribute.imeOptions, enableVoiceButton);
+ mode = KeyboardId.MODE_TEXT;
+ break;
}
inputView.closing();
mComposing.setLength(0);
mPredicting = false;
mDeleteCount = 0;
mJustAddedAutoSpace = false;
- loadSettings();
- updateShiftKeyState(attribute);
- setCandidatesViewShownInternal(isCandidateStripVisible() || mCompletionOn,
+ loadSettings(attribute);
+ if (mSubtypeSwitcher.isKeyboardMode()) {
+ switcher.loadKeyboard(mode, attribute.imeOptions,
+ mVoiceConnector.isVoiceButtonEnabled(),
+ mVoiceConnector.isVoiceButtonOnPrimary());
+ switcher.updateShiftState();
+ }
+
+ setCandidatesViewShownInternal(isCandidateStripVisible(),
false /* needsInputViewShown */ );
- updateSuggestions();
+ // Delay updating suggestions because keyboard input view may not be shown at this point.
+ mHandler.postUpdateSuggestions();
// If the dictionary is not big enough, don't auto correct
mHasDictionary = mSuggest.hasMainDictionary();
@@ -676,21 +613,29 @@ public class LatinIME extends InputMethodService
inputView.setPreviewEnabled(mPopupOn);
inputView.setProximityCorrectionEnabled(true);
- mPredictionOn = mPredictionOn && (mCorrectionMode > 0 || mShowSuggestions);
+ mPredictionOn = mPredictionOn && (mCorrectionMode > 0 || isSuggestionShown());
// If we just entered a text field, maybe it has some old text that requires correction
checkReCorrectionOnStart();
- checkTutorial(attribute.privateImeOptions);
+ inputView.setForeground(true);
+
+ mVoiceConnector.onStartInputView(mKeyboardSwitcher.getInputView().getWindowToken());
+
if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
}
private void checkReCorrectionOnStart() {
- if (mReCorrectionEnabled && isPredictionOn()) {
+ if (!mReCorrectionEnabled) return;
+
+ final InputConnection ic = getCurrentInputConnection();
+ if (ic == null) return;
+ // There could be a pending composing span. Clean it up first.
+ ic.finishComposingText();
+
+ if (isSuggestionShown() && isPredictionOn()) {
// 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);
@@ -701,7 +646,7 @@ public class LatinIME extends InputMethodService
// Then look for possible corrections in a delayed fashion
if (!TextUtils.isEmpty(et.text) && isCursorTouchingWord()) {
- postUpdateOldSuggestions();
+ mHandler.postUpdateOldSuggestions();
}
}
}
@@ -711,19 +656,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();
}
@@ -731,21 +669,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
@@ -764,64 +698,58 @@ public class LatinIME extends InputMethodService
+ ", ce=" + candidatesEnd);
}
- if (mAfterVoiceInput) {
- mVoiceInput.setCursorPos(newSelEnd);
- mVoiceInput.setSelectionSpan(newSelEnd - newSelStart);
- }
+ mVoiceConnector.setCursorAndSelection(newSelEnd, newSelStart);
// If the current selection in the text view changes, we should
// clear whatever candidate text we have.
- if ((((mComposing.length() > 0 && mPredicting) || mVoiceInputHighlighted)
- && (newSelStart != candidatesEnd
- || newSelEnd != candidatesEnd)
- && mLastSelectionStart != newSelStart)) {
+ if ((((mComposing.length() > 0 && mPredicting)
+ || mVoiceConnector.isVoiceInputHighlighted()) && (newSelStart != candidatesEnd
+ || newSelEnd != candidatesEnd) && mLastSelectionStart != newSelStart)) {
mComposing.setLength(0);
mPredicting = false;
- postUpdateSuggestions();
+ mHandler.postUpdateSuggestions();
TextEntryState.reset();
InputConnection ic = getCurrentInputConnection();
if (ic != null) {
ic.finishComposingText();
}
- mVoiceInputHighlighted = false;
+ mVoiceConnector.setVoiceInputHighlighted(false);
} else if (!mPredicting && !mJustAccepted) {
switch (TextEntryState.getState()) {
- case ACCEPTED_DEFAULT:
- TextEntryState.reset();
- // fall through
- case SPACE_AFTER_PICKED:
- mJustAddedAutoSpace = false; // The user moved the cursor.
- break;
+ case ACCEPTED_DEFAULT:
+ TextEntryState.reset();
+ // $FALL-THROUGH$
+ case SPACE_AFTER_PICKED:
+ mJustAddedAutoSpace = false; // The user moved the cursor.
+ break;
+ default:
+ break;
}
}
mJustAccepted = false;
- postUpdateShiftKeyState();
+ mHandler.postUpdateShiftKeyState();
// Make a note of the cursor position
mLastSelectionStart = newSelStart;
mLastSelectionEnd = newSelEnd;
- if (mReCorrectionEnabled) {
+ if (mReCorrectionEnabled && isSuggestionShown()) {
// 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 (isPredictionOn() && !mJustReverted
&& (candidatesStart == candidatesEnd || newSelStart != oldSelStart
|| TextEntryState.isCorrecting())
- && (newSelStart < newSelEnd - 1 || (!mPredicting))
- && !mVoiceInputHighlighted) {
+ && (newSelStart < newSelEnd - 1 || (!mPredicting))) {
if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) {
- postUpdateOldSuggestions();
+ mHandler.postUpdateOldSuggestions();
} else {
abortCorrection(false);
// Show the punctuation suggestions list if the current one is not
// and if not showing "Touch again to save".
- if (mCandidateView != null
- && !mSuggestPuncList.equals(mCandidateView.getSuggestions())
- && !mCandidateView.isShowingAddToDictionaryHint()) {
- setNextSuggestions();
+ if (mCandidateView != null && !isShowingPunctuationList()
+ && !mCandidateView.isShowingAddToDictionaryHint()) {
+ setPunctuationSuggestions();
}
}
}
@@ -863,52 +791,42 @@ public class LatinIME extends InputMethodService
@Override
public void hideWindow() {
LatinImeLogger.commit();
- onAutoCompletionStateChanged(false);
+ mKeyboardSwitcher.onAutoCorrectionStateChanged(false);
if (TRACE) Debug.stopMethodTracing();
if (mOptionsDialog != null && mOptionsDialog.isShowing()) {
mOptionsDialog.dismiss();
mOptionsDialog = null;
}
- if (!mConfigurationChanging) {
- if (mAfterVoiceInput) mVoiceInput.logInputEnded();
- if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) {
- mVoiceInput.logKeyboardWarningDialogDismissed();
- mVoiceWarningDialog.dismiss();
- mVoiceWarningDialog = null;
- }
- if (VOICE_INSTALLED & mRecognizing) {
- mVoiceInput.cancel();
- }
- }
- mWordToSuggestions.clear();
+ mVoiceConnector.hideVoiceWindow(mConfigurationChanging);
mWordHistory.clear();
super.hideWindow();
TextEntryState.endSession();
}
@Override
- public void onDisplayCompletions(CompletionInfo[] completions) {
+ public void onDisplayCompletions(CompletionInfo[] applicationSpecifiedCompletions) {
if (DEBUG) {
Log.i("foo", "Received completions:");
- for (int i=0; i<(completions != null ? completions.length : 0); i++) {
- Log.i("foo", " #" + i + ": " + completions[i]);
+ final int count = (applicationSpecifiedCompletions != null)
+ ? applicationSpecifiedCompletions.length : 0;
+ for (int i = 0; i < count; i++) {
+ Log.i("foo", " #" + 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);
}
@@ -917,8 +835,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));
}
}
@@ -951,25 +869,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);
}
@@ -977,55 +883,28 @@ 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) {
+ public void commitTyped(InputConnection inputConnection) {
if (mPredicting) {
mPredicting = false;
if (mComposing.length() > 0) {
@@ -1040,27 +919,13 @@ public class LatinIME extends InputMethodService
}
}
- private void postUpdateShiftKeyState() {
- mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE);
- // TODO: Should remove this 300ms delay?
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SHIFT_STATE), 300);
- }
-
- public void updateShiftKeyState(EditorInfo attr) {
+ public boolean getCurrentAutoCapsState() {
InputConnection ic = getCurrentInputConnection();
- if (ic != null && attr != null && mKeyboardSwitcher.isAlphabetMode()) {
- mKeyboardSwitcher.setShifted(mShiftKeyState.isMomentary() || mCapsLock
- || getCursorCapsMode(ic, attr) != 0);
- }
- }
-
- private int getCursorCapsMode(InputConnection ic, EditorInfo attr) {
- int caps = 0;
EditorInfo ei = getCurrentInputEditorInfo();
- if (mAutoCap && ei != null && ei.inputType != EditorInfo.TYPE_NULL) {
- caps = ic.getCursorCapsMode(attr.inputType);
+ if (mAutoCap && ic != null && ei != null && ei.inputType != InputType.TYPE_NULL) {
+ return ic.getCursorCapsMode(ei.inputType) != 0;
}
- return caps;
+ return false;
}
private void swapPunctuationAndSpace() {
@@ -1068,12 +933,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;
}
}
@@ -1083,14 +949,14 @@ public class LatinIME extends InputMethodService
if (ic == null) return;
CharSequence lastThree = ic.getTextBeforeCursor(3, 0);
if (lastThree != null && lastThree.length() == 3
- && lastThree.charAt(0) == KEYCODE_PERIOD
- && lastThree.charAt(1) == KEYCODE_SPACE
- && lastThree.charAt(2) == KEYCODE_PERIOD) {
+ && lastThree.charAt(0) == Keyboard.CODE_PERIOD
+ && lastThree.charAt(1) == Keyboard.CODE_SPACE
+ && lastThree.charAt(2) == Keyboard.CODE_PERIOD) {
ic.beginBatchEdit();
ic.deleteSurroundingText(3, 0);
ic.commitText(" ..", 1);
ic.endBatchEdit();
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
}
}
@@ -1102,12 +968,13 @@ public class LatinIME extends InputMethodService
CharSequence lastThree = ic.getTextBeforeCursor(3, 0);
if (lastThree != null && lastThree.length() == 3
&& Character.isLetterOrDigit(lastThree.charAt(0))
- && lastThree.charAt(1) == KEYCODE_SPACE && lastThree.charAt(2) == KEYCODE_SPACE) {
+ && lastThree.charAt(1) == Keyboard.CODE_SPACE
+ && lastThree.charAt(2) == Keyboard.CODE_SPACE) {
ic.beginBatchEdit();
ic.deleteSurroundingText(2, 0);
ic.commitText(". ", 1);
ic.endBatchEdit();
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
mJustAddedAutoSpace = true;
}
}
@@ -1120,8 +987,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);
}
}
@@ -1132,7 +999,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);
}
}
@@ -1141,7 +1008,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;
}
@@ -1153,14 +1020,9 @@ 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 (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) {
showOptionsMenu();
} else {
launchSettings();
@@ -1168,10 +1030,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();
}
@@ -1184,124 +1046,108 @@ public class LatinIME extends InputMethodService
// Implementation of KeyboardViewListener
- public void onKey(int primaryCode, int[] keyCodes, int x, int y) {
+ @Override
+ public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) {
long when = SystemClock.uptimeMillis();
- if (primaryCode != Keyboard.KEYCODE_DELETE ||
- when > mLastKeyTime + QUICK_PRESS) {
+ if (primaryCode != Keyboard.CODE_DELETE || when > mLastKeyTime + QUICK_PRESS) {
mDeleteCount = 0;
}
mLastKeyTime = when;
- final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch();
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
switch (primaryCode) {
- case Keyboard.KEYCODE_DELETE:
- handleBackspace();
- mDeleteCount++;
- LatinImeLogger.logOnDelete();
- break;
- case Keyboard.KEYCODE_SHIFT:
- // Shift key is handled in onPress() when device has distinct multi-touch panel.
- if (!distinctMultiTouch)
- handleShift();
- break;
- case Keyboard.KEYCODE_MODE_CHANGE:
- // Symbol key is handled in onPress() when device has distinct multi-touch panel.
- if (!distinctMultiTouch)
- changeKeyboardMode();
- break;
- case Keyboard.KEYCODE_CANCEL:
- if (!isShowingOptionDialog()) {
- handleClose();
- }
- break;
- case LatinKeyboardView.KEYCODE_OPTIONS:
- onOptionKeyPressed();
- break;
- case LatinKeyboardView.KEYCODE_OPTIONS_LONGPRESS:
- onOptionKeyLongPressed();
- break;
- case LatinKeyboardView.KEYCODE_NEXT_LANGUAGE:
- toggleLanguage(false, true);
- break;
- case LatinKeyboardView.KEYCODE_PREV_LANGUAGE:
- toggleLanguage(false, false);
- break;
- case LatinKeyboardView.KEYCODE_VOICE:
- if (VOICE_INSTALLED) {
- startListening(false /* was a button press, was not a swipe */);
- }
- break;
- case 9 /*Tab*/:
- sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB);
- break;
- default:
- if (primaryCode != KEYCODE_ENTER) {
- mJustAddedAutoSpace = false;
- }
- RingCharBuffer.getInstance().push((char)primaryCode, x, y);
- LatinImeLogger.logOnInputChar();
- if (isWordSeparator(primaryCode)) {
- handleSeparator(primaryCode);
- } else {
- handleCharacter(primaryCode, keyCodes);
- }
- // Cancel the just reverted state
- mJustRevertedSeparator = null;
- }
- if (mKeyboardSwitcher.onKey(primaryCode)) {
- changeKeyboardMode();
+ case Keyboard.CODE_DELETE:
+ handleBackspace();
+ mDeleteCount++;
+ LatinImeLogger.logOnDelete();
+ break;
+ case Keyboard.CODE_SHIFT:
+ // Shift key is handled in onPress() when device has distinct multi-touch panel.
+ if (!distinctMultiTouch)
+ switcher.toggleShift();
+ break;
+ case Keyboard.CODE_SWITCH_ALPHA_SYMBOL:
+ // Symbol key is handled in onPress() when device has distinct multi-touch panel.
+ if (!distinctMultiTouch)
+ switcher.changeKeyboardMode();
+ break;
+ case Keyboard.CODE_CANCEL:
+ if (!isShowingOptionDialog()) {
+ handleClose();
+ }
+ break;
+ case Keyboard.CODE_SETTINGS:
+ onSettingsKeyPressed();
+ break;
+ case Keyboard.CODE_SETTINGS_LONGPRESS:
+ onSettingsKeyLongPressed();
+ break;
+ case Keyboard.CODE_NEXT_LANGUAGE:
+ toggleLanguage(false, true);
+ break;
+ case Keyboard.CODE_PREV_LANGUAGE:
+ toggleLanguage(false, false);
+ break;
+ case Keyboard.CODE_CAPSLOCK:
+ switcher.toggleCapsLock();
+ break;
+ case Keyboard.CODE_VOICE:
+ mSubtypeSwitcher.switchToShortcutIME();
+ break;
+ case Keyboard.CODE_TAB:
+ handleTab();
+ break;
+ default:
+ if (primaryCode != Keyboard.CODE_ENTER) {
+ mJustAddedAutoSpace = false;
+ }
+ RingCharBuffer.getInstance().push((char)primaryCode, x, y);
+ LatinImeLogger.logOnInputChar();
+ if (isWordSeparator(primaryCode)) {
+ handleSeparator(primaryCode);
+ } else {
+ handleCharacter(primaryCode, keyCodes);
+ }
+ // Cancel the just reverted state
+ mJustReverted = false;
}
+ switcher.onKey(primaryCode);
// Reset after any single keystroke
mEnteredText = null;
}
- public void onText(CharSequence text) {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
- commitVoiceInput();
- }
+ @Override
+ public void onTextInput(CharSequence text) {
+ mVoiceConnector.commitVoiceInput();
InputConnection ic = getCurrentInputConnection();
if (ic == null) return;
abortCorrection(false);
ic.beginBatchEdit();
- if (mPredicting) {
- commitTyped(ic);
- }
+ commitTyped(ic);
maybeRemovePreviousPeriod(text);
ic.commitText(text, 1);
ic.endBatchEdit();
- updateShiftKeyState(getCurrentInputEditorInfo());
- mJustRevertedSeparator = null;
+ mKeyboardSwitcher.updateShiftState();
+ mKeyboardSwitcher.onKey(0); // dummy key code.
+ mJustReverted = false;
mJustAddedAutoSpace = false;
mEnteredText = text;
}
- public void onCancel() {
+ @Override
+ public void onCancelInput() {
// User released a finger outside any key
}
private void handleBackspace() {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
- mVoiceInput.incrementTextModificationDeleteCount(
- mVoiceResults.candidates.get(0).toString().length());
- revertVoiceInput();
- return;
- }
+ if (mVoiceConnector.logAndRevertVoiceInput()) return;
boolean deleteChar = false;
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) {
final int length = mComposing.length();
@@ -1312,14 +1158,14 @@ public class LatinIME extends InputMethodService
if (mComposing.length() == 0) {
mPredicting = false;
}
- postUpdateSuggestions();
+ mHandler.postUpdateSuggestions();
} else {
ic.deleteSurroundingText(1, 0);
}
} else {
deleteChar = true;
}
- postUpdateShiftKeyState();
+ mHandler.postUpdateShiftKeyState();
TextEntryState.backspace();
if (TextEntryState.getState() == TextEntryState.State.UNDO_COMMIT) {
revertLastWord(deleteChar);
@@ -1344,60 +1190,52 @@ public class LatinIME extends InputMethodService
}
}
}
- mJustRevertedSeparator = null;
+ mJustReverted = false;
ic.endBatchEdit();
}
- private void resetShift() {
- handleShiftInternal(true);
- }
+ private void handleTab() {
+ final int imeOptions = getCurrentInputEditorInfo().imeOptions;
+ final int navigationFlags =
+ EditorInfo.IME_FLAG_NAVIGATE_NEXT | EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS;
+ if ((imeOptions & navigationFlags) == 0) {
+ sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB);
+ return;
+ }
- private void handleShift() {
- handleShiftInternal(false);
- }
+ final InputConnection ic = getCurrentInputConnection();
+ if (ic == null)
+ return;
- private void handleShiftInternal(boolean forceNormal) {
- mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE);
- KeyboardSwitcher switcher = mKeyboardSwitcher;
- LatinKeyboardView inputView = switcher.getInputView();
- if (switcher.isAlphabetMode()) {
- if (mCapsLock || forceNormal) {
- mCapsLock = false;
- switcher.setShifted(false);
- } else if (inputView != null) {
- if (inputView.isShifted()) {
- mCapsLock = true;
- switcher.setShiftLocked(true);
- } else {
- switcher.setShifted(true);
- }
- }
- } else {
- switcher.toggleShift();
+ // True if keyboard is in either chording shift or manual temporary upper case mode.
+ final boolean isManualTemporaryUpperCase = mKeyboardSwitcher.isManualTemporaryUpperCase();
+ if ((imeOptions & EditorInfo.IME_FLAG_NAVIGATE_NEXT) != 0
+ && !isManualTemporaryUpperCase) {
+ ic.performEditorAction(EditorInfo.IME_ACTION_NEXT);
+ } else if ((imeOptions & EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS) != 0
+ && isManualTemporaryUpperCase) {
+ ic.performEditorAction(EditorInfo.IME_ACTION_PREVIOUS);
}
}
private void abortCorrection(boolean force) {
if (force || TextEntryState.isCorrecting()) {
+ TextEntryState.onAbortCorrection();
+ setCandidatesViewShown(isCandidateStripVisible());
getCurrentInputConnection().finishComposingText();
clearSuggestions();
}
}
private void handleCharacter(int primaryCode, int[] keyCodes) {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
- commitVoiceInput();
- }
+ mVoiceConnector.handleCharacter();
- if (mAfterVoiceInput) {
- // Assume input length is 1. This assumption fails for smiley face insertions.
- mVoiceInput.incrementTextModificationInsertCount(1);
- }
if (mLastSelectionStart == mLastSelectionEnd && TextEntryState.isCorrecting()) {
abortCorrection(false);
}
- if (isAlphabet(primaryCode) && isPredictionOn() && !isCursorTouchingWord()) {
+ int code = primaryCode;
+ if (isAlphabet(code) && isPredictionOn() && !isCursorTouchingWord()) {
if (!mPredicting) {
mPredicting = true;
mComposing.setLength(0);
@@ -1405,68 +1243,60 @@ public class LatinIME extends InputMethodService
mWord.reset();
}
}
- if (mKeyboardSwitcher.getInputView().isShifted()) {
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ if (switcher.isShiftedOrShiftLocked()) {
if (keyCodes == null || keyCodes[0] < Character.MIN_CODE_POINT
|| keyCodes[0] > Character.MAX_CODE_POINT) {
return;
}
- primaryCode = keyCodes[0];
- if (mKeyboardSwitcher.isAlphabetMode() && Character.isLowerCase(primaryCode)) {
- int upperCaseCode = Character.toUpperCase(primaryCode);
- if (upperCaseCode != primaryCode) {
- primaryCode = upperCaseCode;
+ code = keyCodes[0];
+ if (switcher.isAlphabetMode() && Character.isLowerCase(code)) {
+ int upperCaseCode = Character.toUpperCase(code);
+ if (upperCaseCode != code) {
+ code = upperCaseCode;
} else {
// Some keys, such as [eszett], have upper case as multi-characters.
- String upperCase = new String(new int[] {primaryCode}, 0, 1).toUpperCase();
- onText(upperCase);
+ String upperCase = new String(new int[] {code}, 0, 1).toUpperCase();
+ onTextInput(upperCase);
return;
}
}
}
if (mPredicting) {
- if (mKeyboardSwitcher.getInputView().isShifted()
- && mKeyboardSwitcher.isAlphabetMode()
- && mComposing.length() == 0) {
+ if (mComposing.length() == 0 && switcher.isAlphabetMode()
+ && switcher.isShiftedOrShiftLocked()) {
mWord.setFirstCharCapitalized(true);
}
- mComposing.append((char) primaryCode);
- mWord.add(primaryCode, keyCodes);
+ mComposing.append((char) code);
+ mWord.add(code, keyCodes);
InputConnection ic = getCurrentInputConnection();
if (ic != null) {
// If it's the first letter, make note of auto-caps state
if (mWord.size() == 1) {
- mWord.setAutoCapitalized(
- getCursorCapsMode(ic, getCurrentInputEditorInfo()) != 0);
+ mWord.setAutoCapitalized(getCurrentAutoCapsState());
}
ic.setComposingText(mComposing, 1);
}
- postUpdateSuggestions();
+ mHandler.postUpdateSuggestions();
} else {
- sendKeyChar((char)primaryCode);
+ sendKeyChar((char)code);
}
- updateShiftKeyState(getCurrentInputEditorInfo());
+ switcher.updateShiftState();
if (LatinIME.PERF_DEBUG) measureCps();
- TextEntryState.typedCharacter((char) primaryCode, isWordSeparator(primaryCode));
+ TextEntryState.typedCharacter((char) code, isWordSeparator(code));
}
private void handleSeparator(int primaryCode) {
- if (VOICE_INSTALLED && mVoiceInputHighlighted) {
- commitVoiceInput();
- }
-
- if (mAfterVoiceInput){
- // Assume input length is 1. This assumption fails for smiley face insertions.
- mVoiceInput.incrementTextModificationInsertPunctuationCount(1);
- }
+ mVoiceConnector.handleSeparator();
// Should dismiss the "Touch again to save" message when handling separator
if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) {
- postUpdateSuggestions();
+ mHandler.postUpdateSuggestions();
}
boolean pickedDefault = false;
// Handle separator
- InputConnection ic = getCurrentInputConnection();
+ final InputConnection ic = getCurrentInputConnection();
if (ic != null) {
ic.beginBatchEdit();
abortCorrection(false);
@@ -1476,21 +1306,18 @@ public class LatinIME extends InputMethodService
// not to auto correct, but accept the typed word. For instance,
// in Italian dov' should not be expanded to dove' because the elision
// requires the last vowel to be removed.
- if (mAutoCorrectOn && primaryCode != '\'' &&
- (mJustRevertedSeparator == null
- || mJustRevertedSeparator.length() == 0
- || mJustRevertedSeparator.charAt(0) != primaryCode)) {
+ if (mAutoCorrectOn && primaryCode != '\'' && !mJustReverted) {
pickedDefault = pickDefaultSuggestion();
// Picked the suggestion by the space key. We consider this
// as "added an auto space".
- if (primaryCode == KEYCODE_SPACE) {
+ if (primaryCode == Keyboard.CODE_SPACE) {
mJustAddedAutoSpace = true;
}
} else {
commitTyped(ic);
}
}
- if (mJustAddedAutoSpace && primaryCode == KEYCODE_ENTER) {
+ if (mJustAddedAutoSpace && primaryCode == Keyboard.CODE_ENTER) {
removeTrailingSpace();
mJustAddedAutoSpace = false;
}
@@ -1499,21 +1326,32 @@ public class LatinIME extends InputMethodService
// Handle the case of ". ." -> " .." with auto-space if necessary
// before changing the TextEntryState.
if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED
- && primaryCode == KEYCODE_PERIOD) {
+ && primaryCode == Keyboard.CODE_PERIOD) {
reswapPeriodAndSpace();
}
TextEntryState.typedCharacter((char) primaryCode, true);
if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED
- && primaryCode != KEYCODE_ENTER) {
+ && primaryCode != Keyboard.CODE_ENTER) {
swapPunctuationAndSpace();
- } else if (isPredictionOn() && primaryCode == KEYCODE_SPACE) {
+ } else if (isPredictionOn() && 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();
}
@@ -1521,16 +1359,11 @@ public class LatinIME extends InputMethodService
private void handleClose() {
commitTyped(getCurrentInputConnection());
- if (VOICE_INSTALLED & mRecognizing) {
- mVoiceInput.cancel();
- }
+ mVoiceConnector.handleClose();
requestHideSelf(0);
- if (mKeyboardSwitcher != null) {
- LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
- if (inputView != null) {
- inputView.closing();
- }
- }
+ LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+ if (inputView != null)
+ inputView.closing();
TextEntryState.endSession();
}
@@ -1551,269 +1384,109 @@ 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 void postUpdateOldSuggestions() {
- mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS);
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), 300);
- }
-
private boolean isPredictionOn() {
return mPredictionOn;
}
- private boolean isCandidateStripVisible() {
- return isPredictionOn() && mShowSuggestions;
+ private boolean isShowingPunctuationList() {
+ return mSuggestPuncList == mCandidateView.getSuggestions();
}
- public void onCancelVoice() {
- if (mRecognizing) {
- switchToKeyboardView();
- }
+ private boolean isSuggestionShown() {
+ return (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_VALUE)
+ || (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE
+ && mOrientation == Configuration.ORIENTATION_PORTRAIT);
}
- private void switchToKeyboardView() {
- mHandler.post(new Runnable() {
- public void run() {
- mRecognizing = false;
- if (mKeyboardSwitcher.getInputView() != null) {
- setInputView(mKeyboardSwitcher.getInputView());
- }
- setCandidatesViewShown(true);
- updateInputViewShown();
- postUpdateSuggestions();
- }});
+ private boolean isCandidateStripVisible() {
+ boolean forceVisible = mCandidateView.isShowingAddToDictionaryHint()
+ || TextEntryState.isCorrecting();
+ return forceVisible || (
+ isSuggestionShown() && (isPredictionOn() || mApplicationSpecifiedCompletionOn
+ || isShowingPunctuationList()));
}
- private void switchToRecognitionStatusView() {
- final boolean configChanged = mConfigurationChanging;
+ public void switchToKeyboardView() {
mHandler.post(new Runnable() {
+ @Override
public void run() {
- setCandidatesViewShown(false);
- mRecognizing = true;
- View v = mVoiceInput.getView();
- ViewParent p = v.getParent();
- if (p != null && p instanceof ViewGroup) {
- ((ViewGroup)v.getParent()).removeView(v);
+ if (DEBUG) {
+ Log.d(TAG, "Switch to keyboard view.");
}
- setInputView(v);
- updateInputViewShown();
- if (configChanged) {
- mVoiceInput.onConfigurationChanged();
+ View v = mKeyboardSwitcher.getInputView();
+ if (v != null) {
+ // Confirms that the keyboard view doesn't have parent view.
+ ViewParent p = v.getParent();
+ if (p != null && p instanceof ViewGroup) {
+ ((ViewGroup) p).removeView(v);
+ }
+ setInputView(v);
}
- }});
- }
-
- private void startListening(boolean swipe) {
- if (!mHasUsedVoiceInput ||
- (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale)) {
- // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel.
- showVoiceWarningDialog(swipe);
- } else {
- reallyStartListening(swipe);
- }
- }
-
- private void reallyStartListening(boolean swipe) {
- if (!mHasUsedVoiceInput) {
- // The user has started a voice input, so remember that in the
- // future (so we don't show the warning dialog after the first run).
- SharedPreferences.Editor editor =
- PreferenceManager.getDefaultSharedPreferences(this).edit();
- editor.putBoolean(PREF_HAS_USED_VOICE_INPUT, true);
- SharedPreferencesCompat.apply(editor);
- mHasUsedVoiceInput = true;
- }
-
- if (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale) {
- // The user has started a voice input from an unsupported locale, so remember that
- // in the future (so we don't show the warning dialog the next time they do this).
- SharedPreferences.Editor editor =
- PreferenceManager.getDefaultSharedPreferences(this).edit();
- editor.putBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, true);
- SharedPreferencesCompat.apply(editor);
- mHasUsedVoiceInputUnsupportedLocale = true;
- }
-
- // Clear N-best suggestions
- clearSuggestions();
-
- FieldContext context = new FieldContext(
- getCurrentInputConnection(),
- getCurrentInputEditorInfo(),
- mLanguageSwitcher.getInputLanguage(),
- mLanguageSwitcher.getEnabledLanguages());
- mVoiceInput.startListening(context, swipe);
- switchToRecognitionStatusView();
- }
-
- private void showVoiceWarningDialog(final boolean swipe) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setCancelable(true);
- builder.setIcon(R.drawable.ic_mic_dialog);
- builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- mVoiceInput.logKeyboardWarningDialogOk();
- reallyStartListening(swipe);
- }
- });
- builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- mVoiceInput.logKeyboardWarningDialogCancel();
+ setCandidatesViewShown(isCandidateStripVisible());
+ updateInputViewShown();
+ mHandler.postUpdateSuggestions();
}
});
-
- if (mLocaleSupportedForVoiceInput) {
- String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" +
- getString(R.string.voice_warning_how_to_turn_off);
- builder.setMessage(message);
- } else {
- String message = getString(R.string.voice_warning_locale_not_supported) + "\n\n" +
- getString(R.string.voice_warning_may_not_understand) + "\n\n" +
- getString(R.string.voice_warning_how_to_turn_off);
- builder.setMessage(message);
- }
-
- builder.setTitle(R.string.voice_warning_title);
- mVoiceWarningDialog = builder.create();
-
- Window window = mVoiceWarningDialog.getWindow();
- WindowManager.LayoutParams lp = window.getAttributes();
- lp.token = mKeyboardSwitcher.getInputView().getWindowToken();
- lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
- window.setAttributes(lp);
- window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
- mVoiceInput.logKeyboardWarningDialogShown();
- mVoiceWarningDialog.show();
}
- public void onVoiceResults(List<String> candidates,
- Map<String, List<CharSequence>> alternatives) {
- if (!mRecognizing) {
- return;
- }
- mVoiceResults.candidates = candidates;
- mVoiceResults.alternatives = alternatives;
- mHandler.sendMessage(mHandler.obtainMessage(MSG_VOICE_RESULTS));
+ public void clearSuggestions() {
+ setSuggestions(SuggestedWords.EMPTY);
}
- private void handleVoiceResults() {
- mAfterVoiceInput = true;
- mImmediatelyAfterVoiceInput = true;
-
- InputConnection ic = getCurrentInputConnection();
- if (!isFullscreenMode()) {
- // Start listening for updates to the text from typing, etc.
- if (ic != null) {
- ExtractedTextRequest req = new ExtractedTextRequest();
- ic.getExtractedText(req, InputConnection.GET_EXTRACTED_TEXT_MONITOR);
- }
- }
-
- vibrate();
- switchToKeyboardView();
-
- final List<CharSequence> nBest = new ArrayList<CharSequence>();
- boolean capitalizeFirstWord = preferCapitalization()
- || (mKeyboardSwitcher.isAlphabetMode()
- && mKeyboardSwitcher.getInputView().isShifted());
- for (String c : mVoiceResults.candidates) {
- if (capitalizeFirstWord) {
- c = Character.toUpperCase(c.charAt(0)) + c.substring(1, c.length());
- }
- nBest.add(c);
- }
-
- if (nBest.size() == 0) {
- return;
- }
-
- String bestResult = nBest.get(0).toString();
-
- mVoiceInput.logVoiceInputDelivered(bestResult.length());
-
- mHints.registerVoiceResult(bestResult);
-
- if (ic != null) ic.beginBatchEdit(); // To avoid extra updates on committing older text
-
- commitTyped(ic);
- EditingUtil.appendText(ic, bestResult);
-
- if (ic != null) ic.endBatchEdit();
-
- mVoiceInputHighlighted = true;
- mWordToSuggestions.putAll(mVoiceResults.alternatives);
- }
-
- private void clearSuggestions() {
- setSuggestions(null, false, false, false);
- }
-
- private void setSuggestions(
- List<CharSequence> suggestions,
- boolean completions,
- boolean typedWordValid,
- boolean haveMinimalSuggestion) {
-
- if (mIsShowingHint) {
+ public void setSuggestions(SuggestedWords words) {
+ if (mVoiceConnector.getAndResetIsShowingHint()) {
setCandidatesView(mCandidateViewContainer);
- mIsShowingHint = false;
}
if (mCandidateView != null) {
- mCandidateView.setSuggestions(
- suggestions, completions, typedWordValid, haveMinimalSuggestion);
+ mCandidateView.setSuggestions(words);
+ if (mCandidateView.isConfigCandidateHighlightFontColorEnabled()) {
+ mKeyboardSwitcher.onAutoCorrectionStateChanged(
+ words.hasWordAboveAutoCorrectionScoreThreshold());
+ }
}
}
- private void updateSuggestions() {
- LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
- ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null);
+ public void updateSuggestions() {
+ mKeyboardSwitcher.setPreferredLetters(null);
// Check if we have a suggestion engine attached.
- if ((mSuggest == null || !isPredictionOn()) && !mVoiceInputHighlighted) {
+ if ((mSuggest == null || !isPredictionOn())
+ && !mVoiceConnector.isVoiceInputHighlighted()) {
return;
}
if (!mPredicting) {
- setNextSuggestions();
+ setPunctuationSuggestions();
return;
}
showSuggestions(mWord);
}
- private List<CharSequence> getTypedSuggestions(WordComposer word) {
- List<CharSequence> stringList = mSuggest.getSuggestions(
- mKeyboardSwitcher.getInputView(), word, false, null);
- return stringList;
+ private SuggestedWords.Builder getTypedSuggestions(WordComposer word) {
+ return mSuggest.getSuggestedWordBuilder(mKeyboardSwitcher.getInputView(), word, null);
}
private void showCorrections(WordAlternatives alternatives) {
- List<CharSequence> stringList = alternatives.getAlternatives();
- ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters(null);
- showSuggestions(stringList, alternatives.getOriginalWord(), false, false);
+ mKeyboardSwitcher.setPreferredLetters(null);
+ SuggestedWords.Builder builder = alternatives.getAlternatives();
+ builder.setTypedWordValid(false).setHasMinimalSuggestion(false);
+ showSuggestions(builder.build(), alternatives.getOriginalWord());
}
private void showSuggestions(WordComposer word) {
// long startTime = System.currentTimeMillis(); // TIME MEASUREMENT!
// TODO Maybe need better way of retrieving previous word
- CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(),
+ CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
mWordSeparators);
- List<CharSequence> stringList = mSuggest.getSuggestions(
- mKeyboardSwitcher.getInputView(), word, false, prevWord);
- // long stopTime = System.currentTimeMillis(); // TIME MEASUREMENT!
- // Log.d("LatinIME","Suggest Total Time - " + (stopTime - startTime));
+ SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
+ mKeyboardSwitcher.getInputView(), word, prevWord);
int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies();
+ mKeyboardSwitcher.setPreferredLetters(nextLettersFrequencies);
- ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters(
- nextLettersFrequencies);
-
- boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection();
- //|| mCorrectionMode == mSuggest.CORRECTION_FULL;
+ boolean correctionAvailable = !mInputTypeNoAutoCorrect && !mJustReverted
+ && mSuggest.hasMinimalCorrection();
CharSequence typedWord = word.getTypedWord();
// If we're in basic correct
boolean typedWordValid = mSuggest.isValidWord(typedWord) ||
@@ -1827,34 +1500,34 @@ public class LatinIME extends InputMethodService
correctionAvailable &= !word.isMostlyCaps();
correctionAvailable &= !TextEntryState.isCorrecting();
- showSuggestions(stringList, typedWord, typedWordValid, correctionAvailable);
+ builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion(correctionAvailable);
+ 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 (suggestedWords.hasAutoCorrectionWord()) {
+ mBestWord = suggestedWords.getWord(1);
} else {
mBestWord = typedWord;
}
} else {
mBestWord = null;
}
- setCandidatesViewShown(isCandidateStripVisible() || mCompletionOn);
+ setCandidatesViewShown(isCandidateStripVisible());
}
private boolean pickDefaultSuggestion() {
// Complete any pending candidate query first
- if (mHandler.hasMessages(MSG_UPDATE_SUGGESTIONS)) {
- mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS);
+ if (mHandler.hasPendingUpdateSuggestions()) {
+ mHandler.cancelUpdateSuggestions();
updateSuggestions();
}
if (mBestWord != null && mBestWord.length() > 0) {
TextEntryState.acceptedDefault(mWord.getTypedWord(), mBestWord);
mJustAccepted = true;
- pickSuggestion(mBestWord, false);
+ pickSuggestion(mBestWord);
// Add the word to the auto dictionary if it's not a known word
addToDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED);
return true;
@@ -1864,24 +1537,17 @@ public class LatinIME extends InputMethodService
}
public void pickSuggestionManually(int index, CharSequence suggestion) {
- List<CharSequence> suggestions = mCandidateView.getSuggestions();
-
- if (mAfterVoiceInput && mShowingVoiceSuggestions) {
- mVoiceInput.flushAllTextModificationCounters();
- // send this intent AFTER logging any prior aggregated edits.
- mVoiceInput.logTextModifiedByChooseSuggestion(suggestion.toString(), index,
- mWordSeparators,
- getCurrentInputConnection());
- }
+ SuggestedWords suggestions = mCandidateView.getSuggestions();
+ mVoiceConnector.flushAndLogAllTextModificationCounters(index, suggestion, mWordSeparators);
final boolean correcting = TextEntryState.isCorrecting();
InputConnection ic = getCurrentInputConnection();
if (ic != null) {
ic.beginBatchEdit();
}
- if (mCompletionOn && mCompletions != null && index >= 0
- && index < mCompletions.length) {
- CompletionInfo ci = mCompletions[index];
+ if (mApplicationSpecifiedCompletionOn && mApplicationSpecifiedCompletions != null
+ && index >= 0 && index < mApplicationSpecifiedCompletions.length) {
+ CompletionInfo ci = mApplicationSpecifiedCompletions[index];
if (ic != null) {
ic.commitCompletion(ci);
}
@@ -1889,7 +1555,7 @@ public class LatinIME extends InputMethodService
if (mCandidateView != null) {
mCandidateView.clear();
}
- updateShiftKeyState(getCurrentInputEditorInfo());
+ mKeyboardSwitcher.updateShiftState();
if (ic != null) {
ic.endBatchEdit();
}
@@ -1902,17 +1568,17 @@ 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}, KeyboardView.NOT_A_TOUCH_COORDINATE,
+ KeyboardView.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);
@@ -1920,7 +1586,7 @@ public class LatinIME extends InputMethodService
addToBigramDictionary(suggestion, 1);
}
LatinImeLogger.logOnManualSuggestion(mComposing.toString(), suggestion.toString(),
- index, suggestions);
+ index, suggestions.mWords);
TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion);
// Follow it with a space
if (mAutoSpace && !correcting) {
@@ -1936,13 +1602,13 @@ public class LatinIME extends InputMethodService
// Fool the state watcher so that a subsequent backspace will not do a revert, unless
// we just did a correction, in which case we need to stay in
// TextEntryState.State.PICKED_SUGGESTION state.
- TextEntryState.typedCharacter((char) KEYCODE_SPACE, true);
- setNextSuggestions();
+ TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true);
+ setPunctuationSuggestions();
} else if (!showingAddToDictionaryHint) {
// If we're not showing the "Touch again to save", then show corrections again.
// In case the cursor position doesn't change, make sure we show the suggestions again.
clearSuggestions();
- postUpdateOldSuggestions();
+ mHandler.postUpdateOldSuggestions();
}
if (showingAddToDictionaryHint) {
mCandidateView.showAddToDictionaryHint(suggestion);
@@ -1952,91 +1618,25 @@ public class LatinIME extends InputMethodService
}
}
- private void rememberReplacedWord(CharSequence suggestion) {
- if (mShowingVoiceSuggestions) {
- // Retain the replaced word in the alternatives array.
- EditingUtil.Range range = new EditingUtil.Range();
- String wordToBeReplaced = EditingUtil.getWordAtCursor(getCurrentInputConnection(),
- mWordSeparators, range);
- if (!mWordToSuggestions.containsKey(wordToBeReplaced)) {
- wordToBeReplaced = wordToBeReplaced.toLowerCase();
- }
- if (mWordToSuggestions.containsKey(wordToBeReplaced)) {
- List<CharSequence> suggestions = mWordToSuggestions.get(wordToBeReplaced);
- if (suggestions.contains(suggestion)) {
- suggestions.remove(suggestion);
- }
- suggestions.add(wordToBeReplaced);
- mWordToSuggestions.remove(wordToBeReplaced);
- mWordToSuggestions.put(suggestion.toString(), suggestions);
- }
- }
- }
-
/**
* Commits the chosen word to the text field and saves it for later
* retrieval.
* @param suggestion the suggestion picked by the user to be committed to
* the text field
- * @param correcting whether this is due to a correction of an existing
- * word.
*/
- private void pickSuggestion(CharSequence suggestion, boolean correcting) {
- LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
- if (mCapsLock) {
- suggestion = suggestion.toString().toUpperCase();
- } else if (preferCapitalization()
- || (mKeyboardSwitcher.isAlphabetMode()
- && inputView.isShifted())) {
- suggestion = suggestion.toString().toUpperCase().charAt(0)
- + suggestion.subSequence(1, suggestion.length()).toString();
- }
+ private void pickSuggestion(CharSequence suggestion) {
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ if (!switcher.isKeyboardAvailable())
+ return;
InputConnection ic = getCurrentInputConnection();
if (ic != null) {
- rememberReplacedWord(suggestion);
+ mVoiceConnector.rememberReplacedWord(suggestion, mWordSeparators);
ic.commitText(suggestion, 1);
}
saveWordInHistory(suggestion);
mPredicting = false;
mCommittedLength = suggestion.length();
- ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null);
- // If we just corrected a word, then don't show punctuations
- if (!correcting) {
- setNextSuggestions();
- }
- updateShiftKeyState(getCurrentInputEditorInfo());
- }
-
- /**
- * Tries to apply any voice alternatives for the word if this was a spoken word and
- * there are voice alternatives.
- * @param touching The word that the cursor is touching, with position information
- * @return true if an alternative was found, false otherwise.
- */
- private boolean applyVoiceAlternatives(EditingUtil.SelectedWord touching) {
- // Search for result in spoken word alternatives
- String selectedWord = touching.word.toString().trim();
- if (!mWordToSuggestions.containsKey(selectedWord)) {
- selectedWord = selectedWord.toLowerCase();
- }
- if (mWordToSuggestions.containsKey(selectedWord)) {
- mShowingVoiceSuggestions = true;
- List<CharSequence> suggestions = mWordToSuggestions.get(selectedWord);
- // If the first letter of touching is capitalized, make all the suggestions
- // start with a capital letter.
- if (Character.isUpperCase(touching.word.charAt(0))) {
- for (int i = 0; i < suggestions.size(); i++) {
- String origSugg = (String) suggestions.get(i);
- String capsSugg = origSugg.toUpperCase().charAt(0)
- + origSugg.subSequence(1, origSugg.length()).toString();
- suggestions.set(i, capsSugg);
- }
- }
- setSuggestions(suggestions, false, true, true);
- setCandidatesViewShown(true);
- return true;
- }
- return false;
+ switcher.setPreferredLetters(null);
}
/**
@@ -2045,12 +1645,12 @@ public class LatinIME extends InputMethodService
* @param touching The word that the cursor is touching, with position information
* @return true if an alternative was found, false otherwise.
*/
- private boolean applyTypedAlternatives(EditingUtil.SelectedWord touching) {
+ private boolean applyTypedAlternatives(EditingUtils.SelectedWord touching) {
// If we didn't find a match, search for result in typed word history
WordComposer foundWord = null;
WordAlternatives alternatives = null;
for (WordAlternatives entry : mWordHistory) {
- if (TextUtils.equals(entry.getChosenWord(), touching.word)) {
+ if (TextUtils.equals(entry.getChosenWord(), touching.mWord)) {
if (entry instanceof TypedWordAlternatives) {
foundWord = ((TypedWordAlternatives) entry).word;
}
@@ -2058,22 +1658,22 @@ public class LatinIME extends InputMethodService
break;
}
}
- // If we didn't find a match, at least suggest completions
+ // If we didn't find a match, at least suggest corrections.
if (foundWord == null
- && (mSuggest.isValidWord(touching.word)
- || mSuggest.isValidWord(touching.word.toString().toLowerCase()))) {
+ && (mSuggest.isValidWord(touching.mWord)
+ || mSuggest.isValidWord(touching.mWord.toString().toLowerCase()))) {
foundWord = new WordComposer();
- for (int i = 0; i < touching.word.length(); i++) {
- foundWord.add(touching.word.charAt(i), new int[] {
- touching.word.charAt(i)
+ for (int i = 0; i < touching.mWord.length(); i++) {
+ foundWord.add(touching.mWord.charAt(i), new int[] {
+ touching.mWord.charAt(i)
});
}
- foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.word.charAt(0)));
+ foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.mWord.charAt(0)));
}
// Found a match, show suggestions
if (foundWord != null || alternatives != null) {
if (alternatives == null) {
- alternatives = new TypedWordAlternatives(touching.word, foundWord);
+ alternatives = new TypedWordAlternatives(touching.mWord, foundWord);
}
showCorrections(alternatives);
if (foundWord != null) {
@@ -2087,7 +1687,7 @@ public class LatinIME extends InputMethodService
}
private void setOldSuggestions() {
- mShowingVoiceSuggestions = false;
+ mVoiceConnector.setShowingVoiceSuggestions(false);
if (mCandidateView != null && mCandidateView.isShowingAddToDictionaryHint()) {
return;
}
@@ -2095,31 +1695,33 @@ public class LatinIME extends InputMethodService
if (ic == null) return;
if (!mPredicting) {
// Extract the selected or touching text
- EditingUtil.SelectedWord touching = EditingUtil.getWordAtCursorOrSelection(ic,
+ EditingUtils.SelectedWord touching = EditingUtils.getWordAtCursorOrSelection(ic,
mLastSelectionStart, mLastSelectionEnd, mWordSeparators);
- if (touching != null && touching.word.length() > 1) {
+ if (touching != null && touching.mWord.length() > 1) {
ic.beginBatchEdit();
- if (!applyVoiceAlternatives(touching) && !applyTypedAlternatives(touching)) {
+ if (!mVoiceConnector.applyVoiceAlternatives(touching)
+ && !applyTypedAlternatives(touching)) {
abortCorrection(true);
} else {
TextEntryState.selectedForCorrection();
- EditingUtil.underlineWord(ic, touching);
+ EditingUtils.underlineWord(ic, touching);
}
ic.endBatchEdit();
} else {
abortCorrection(true);
- setNextSuggestions(); // Show the punctuation suggestions list
+ setPunctuationSuggestions(); // Show the punctuation suggestions list
}
} else {
abortCorrection(true);
}
}
- private void setNextSuggestions() {
- setSuggestions(mSuggestPuncList, false, false, false);
+ private void setPunctuationSuggestions() {
+ setCandidatesViewShown(isCandidateStripVisible());
+ setSuggestions(mSuggestPuncList);
}
private void addToDictionaries(CharSequence suggestion, int frequencyDelta) {
@@ -2144,19 +1746,17 @@ public class LatinIME extends InputMethodService
|| mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM)) {
return;
}
- if (suggestion != null) {
- if (!addToBigramDictionary && mAutoDictionary.isValidWord(suggestion)
- || (!mSuggest.isValidWord(suggestion.toString())
- && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) {
- mAutoDictionary.addWord(suggestion.toString(), frequencyDelta);
- }
+ if (!addToBigramDictionary && mAutoDictionary.isValidWord(suggestion)
+ || (!mSuggest.isValidWord(suggestion.toString())
+ && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) {
+ mAutoDictionary.addWord(suggestion.toString(), frequencyDelta);
+ }
- if (mUserBigramDictionary != null) {
- CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(),
- mSentenceSeparators);
- if (!TextUtils.isEmpty(prevWord)) {
- mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString());
- }
+ if (mUserBigramDictionary != null) {
+ CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
+ mSentenceSeparators);
+ if (!TextUtils.isEmpty(prevWord)) {
+ mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString());
}
}
}
@@ -2189,7 +1789,7 @@ public class LatinIME extends InputMethodService
if (!mPredicting && length > 0) {
final InputConnection ic = getCurrentInputConnection();
mPredicting = true;
- mJustRevertedSeparator = ic.getTextBeforeCursor(1, 0);
+ mJustReverted = true;
if (deleteChar) ic.deleteSurroundingText(1, 0);
int toDelete = mCommittedLength;
CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0);
@@ -2200,10 +1800,10 @@ public class LatinIME extends InputMethodService
ic.deleteSurroundingText(toDelete, 0);
ic.setComposingText(mComposing, 1);
TextEntryState.backspace();
- postUpdateSuggestions();
+ mHandler.postUpdateSuggestions();
} else {
sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL);
- mJustRevertedSeparator = null;
+ mJustReverted = false;
}
}
@@ -2221,8 +1821,8 @@ public class LatinIME extends InputMethodService
}
private void sendSpace() {
- sendKeyChar((char)KEYCODE_SPACE);
- updateShiftKeyState(getCurrentInputEditorInfo());
+ sendKeyChar((char)Keyboard.CODE_SPACE);
+ mKeyboardSwitcher.updateShiftState();
//onKey(KEY_SPACE[0], KEY_SPACE);
}
@@ -2230,110 +1830,76 @@ public class LatinIME extends InputMethodService
return mWord.isFirstCharCapitalized();
}
+ // Notify that Language has been changed and toggleLanguage will update KeyboaredID according
+ // to new Language.
+ public void onKeyboardLanguageChanged() {
+ toggleLanguage(true, true);
+ }
+
+ // "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER.
private void toggleLanguage(boolean reset, boolean next) {
- if (reset) {
- mLanguageSwitcher.reset();
- } else {
- if (next) {
- mLanguageSwitcher.next();
- } else {
- mLanguageSwitcher.prev();
- }
+ if (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ mSubtypeSwitcher.toggleLanguage(reset, next);
}
- int currentKeyboardMode = mKeyboardSwitcher.getKeyboardMode();
- reloadKeyboards();
- mKeyboardSwitcher.makeKeyboards(true);
- mKeyboardSwitcher.setKeyboardMode(currentKeyboardMode, 0,
- mEnableVoiceButton && mEnableVoice);
- initSuggest(mLanguageSwitcher.getInputLanguage());
- mLanguageSwitcher.persist();
- updateShiftKeyState(getCurrentInputEditorInfo());
+ // Reload keyboard because the current language has been changed.
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ final int mode = switcher.getKeyboardMode();
+ final EditorInfo attribute = getCurrentInputEditorInfo();
+ final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
+ switcher.loadKeyboard(mode, imeOptions, mVoiceConnector.isVoiceButtonEnabled(),
+ mVoiceConnector.isVoiceButtonOnPrimary());
+ initSuggest();
+ switcher.updateShiftState();
}
+ @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
- if (PREF_SELECTED_LANGUAGES.equals(key)) {
- mLanguageSwitcher.loadLocales(sharedPreferences);
+ mSubtypeSwitcher.onSharedPreferenceChanged(sharedPreferences, key);
+ if (Settings.PREF_SELECTED_LANGUAGES.equals(key)) {
mRefreshKeyboardRequired = true;
- } else if (PREF_RECORRECTION_ENABLED.equals(key)) {
- mReCorrectionEnabled = sharedPreferences.getBoolean(PREF_RECORRECTION_ENABLED,
+ } else if (Settings.PREF_RECORRECTION_ENABLED.equals(key)) {
+ mReCorrectionEnabled = sharedPreferences.getBoolean(
+ Settings.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());
- }
- }
- }
-
- public void swipeLeft() {
- }
-
- public void swipeDown() {
+ @Override
+ public void onSwipeDown() {
handleClose();
}
- public void swipeUp() {
- //launchSettings();
- }
-
+ @Override
public void onPress(int primaryCode) {
- 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) {
- mSymbolKeyState.onPress();
- changeKeyboardMode();
+ if (mKeyboardSwitcher.isVibrateAndSoundFeedbackRequired()) {
+ vibrate();
+ playKeyClick(primaryCode);
+ }
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
+ final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
+ if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) {
+ switcher.onPressShift();
+ } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
+ switcher.onPressSymbol();
} else {
- mShiftKeyState.onOtherKeyPressed();
- mSymbolKeyState.onOtherKeyPressed();
+ switcher.onOtherKeyPressed();
}
}
+ @Override
public void onRelease(int primaryCode) {
+ KeyboardSwitcher switcher = mKeyboardSwitcher;
// Reset any drag flags in the keyboard
- ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).keyReleased();
- //vibrate();
- final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch();
- if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_SHIFT) {
- if (mShiftKeyState.isMomentary())
- resetShift();
- mShiftKeyState.onRelease();
- } else if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_MODE_CHANGE) {
- if (mSymbolKeyState.isMomentary())
- changeKeyboardMode();
- mSymbolKeyState.onRelease();
+ switcher.keyReleased();
+ final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
+ if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) {
+ switcher.onReleaseShift();
+ } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
+ switcher.onReleaseSymbol();
}
}
- private FieldContext makeFieldContext() {
- return new FieldContext(
- getCurrentInputConnection(),
- getCurrentInputEditorInfo(),
- mLanguageSwitcher.getInputLanguage(),
- mLanguageSwitcher.getEnabledLanguages());
- }
-
- private boolean fieldCanDoVoice(FieldContext fieldContext) {
- return !mPasswordText
- && mVoiceInput != null
- && !mVoiceInput.isBlacklistedField(fieldContext);
- }
-
- private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) {
- return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext)
- && !(attribute != null
- && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions))
- && SpeechRecognizer.isRecognitionAvailable(this);
- }
// receive ringer mode changes to detect silent mode
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -2366,13 +1932,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;
}
@@ -2380,48 +1946,28 @@ public class LatinIME extends InputMethodService
}
}
- private void vibrate() {
+ public void vibrate() {
if (!mVibrateOn) {
return;
}
- if (mKeyboardSwitcher.getInputView() != null) {
- mKeyboardSwitcher.getInputView().performHapticFeedback(
+ LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+ if (inputView != null) {
+ inputView.performHapticFeedback(
HapticFeedbackConstants.KEYBOARD_TAP,
HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
}
}
- private void checkTutorial(String privateImeOptions) {
- if (privateImeOptions == null) return;
- if (privateImeOptions.equals("com.android.setupwizard:ShowTutorial")) {
- if (mTutorial == null) startTutorial();
- } else if (privateImeOptions.equals("com.android.setupwizard:HideTutorial")) {
- if (mTutorial != null) {
- if (mTutorial.close()) {
- mTutorial = null;
- }
- }
- }
- }
-
- private void startTutorial() {
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_TUTORIAL), 500);
- }
-
- /* package */ void tutorialDone() {
- mTutorial = null;
- }
-
- /* package */ void promoteToUserDictionary(String word, int frequency) {
+ public void promoteToUserDictionary(String word, int frequency) {
if (mUserDictionary.isValidWord(word)) return;
mUserDictionary.addWord(word, frequency);
}
- /* package */ WordComposer getCurrentWord() {
+ public WordComposer getCurrentWord() {
return mWord;
}
- /* package */ boolean getPopupOn() {
+ public boolean getPopupOn() {
return mPopupOn;
}
@@ -2439,22 +1985,33 @@ public class LatinIME extends InputMethodService
}
}
- private void updateAutoTextEnabled(Locale systemLocale) {
+ private void updateAutoTextEnabled() {
if (mSuggest == null) return;
- boolean different =
- !systemLocale.getLanguage().equalsIgnoreCase(mInputLocale.substring(0, 2));
- mSuggest.setAutoTextEnabled(!different && mQuickFixes);
+ mSuggest.setAutoTextEnabled(mQuickFixes
+ && SubtypeSwitcher.getInstance().isSystemLanguageSameAsInputLanguage());
+ }
+
+ private void updateSuggestionVisibility(SharedPreferences prefs) {
+ final String suggestionVisiblityStr = prefs.getString(
+ Settings.PREF_SHOW_SUGGESTIONS_SETTING,
+ mResources.getString(R.string.prefs_suggestion_visibility_default_value));
+ for (int visibility : SUGGESTION_VISIBILITY_VALUE_ARRAY) {
+ if (suggestionVisiblityStr.equals(mResources.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);
@@ -2462,65 +2019,91 @@ public class LatinIME extends InputMethodService
startActivity(intent);
}
- private void loadSettings() {
+ private void loadSettings(EditorInfo attribute) {
// Get the settings preferences
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
- mVibrateOn = sp.getBoolean(PREF_VIBRATE_ON, false);
- mSoundOn = sp.getBoolean(PREF_SOUND_ON, false);
- mPopupOn = sp.getBoolean(PREF_POPUP_ON,
- mResources.getBoolean(R.bool.default_popup_preview));
- mAutoCap = sp.getBoolean(PREF_AUTO_CAP, true);
- mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true);
- mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false);
- mHasUsedVoiceInputUnsupportedLocale =
- sp.getBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, false);
-
- // Get the current list of supported locales and check the current locale against that
- // list. We cache this value so as not to check it every time the user starts a voice
- // input. Because this method is called by onStartInputView, this should mean that as
- // long as the locale doesn't change while the user is keeping the IME open, the
- // value should never be stale.
- String supportedLocalesString = SettingsUtil.getSettingsString(
- getContentResolver(),
- SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES,
- DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES);
- ArrayList<String> voiceInputSupportedLocales =
- newArrayList(supportedLocalesString.split("\\s+"));
-
- mLocaleSupportedForVoiceInput = voiceInputSupportedLocales.contains(mInputLocale);
-
- mShowSuggestions = sp.getBoolean(PREF_SHOW_SUGGESTIONS, true);
-
- if (VOICE_INSTALLED) {
- final String voiceMode = sp.getString(PREF_VOICE_MODE,
- getString(R.string.voice_mode_main));
- boolean enableVoice = !voiceMode.equals(getString(R.string.voice_mode_off))
- && mEnableVoiceButton;
- boolean voiceOnPrimary = voiceMode.equals(getString(R.string.voice_mode_main));
- if (mKeyboardSwitcher != null &&
- (enableVoice != mEnableVoice || voiceOnPrimary != mVoiceOnPrimary)) {
- mKeyboardSwitcher.setVoiceMode(enableVoice, voiceOnPrimary);
+ final SharedPreferences prefs = mPrefs;
+ Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+ mVibrateOn = vibrator != null && vibrator.hasVibrator()
+ && prefs.getBoolean(Settings.PREF_VIBRATE_ON, false);
+ mSoundOn = prefs.getBoolean(Settings.PREF_SOUND_ON, false);
+ mPopupOn = prefs.getBoolean(Settings.PREF_POPUP_ON,
+ mResources.getBoolean(R.bool.config_default_popup_preview));
+ mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true);
+ mQuickFixes = prefs.getBoolean(Settings.PREF_QUICK_FIXES, true);
+
+ 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 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) {
+ // TODO: Define default value instead of 'true'.
+ return sp.getBoolean(Settings.PREF_BIGRAM_SUGGESTIONS, true);
}
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) {
@@ -2538,6 +2121,7 @@ public class LatinIME extends InputMethodService
itemInputMethod, itemSettings},
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface di, int position) {
di.dismiss();
switch (position) {
@@ -2545,8 +2129,7 @@ public class LatinIME extends InputMethodService
launchSettings();
break;
case POS_METHOD:
- ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE))
- .showInputMethodPicker();
+ mImm.showInputMethodPicker();
break;
}
}
@@ -2562,22 +2145,6 @@ public class LatinIME extends InputMethodService
mOptionsDialog.show();
}
- private 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);
@@ -2585,14 +2152,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(" mCorrectionMode=" + mCorrectionMode);
p.println(" mPredicting=" + mPredicting);
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);
@@ -2617,7 +2183,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/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..de194d21b 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 onPrintAllUsabilityStudtyLogs() {
+ }
}
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 45a4a9508..000000000
--- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ /dev/null
@@ -1,1022 +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 int mSpaceKeyIndex = -1;
- 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;
- mSpaceKeyIndex = indexOf(LatinIME.KEYCODE_SPACE);
- initializeNumberHintResources(context);
- // TODO remove this initialization after cleanup
- mVerticalGap = super.getVerticalGap();
- }
-
- private void initializeNumberHintResources(Context context) {
- final Resources res = context.getResources();
- mNumberHintIcons[0] = res.getDrawable(R.drawable.keyboard_hint_0);
- mNumberHintIcons[1] = res.getDrawable(R.drawable.keyboard_hint_1);
- mNumberHintIcons[2] = res.getDrawable(R.drawable.keyboard_hint_2);
- mNumberHintIcons[3] = res.getDrawable(R.drawable.keyboard_hint_3);
- mNumberHintIcons[4] = res.getDrawable(R.drawable.keyboard_hint_4);
- mNumberHintIcons[5] = res.getDrawable(R.drawable.keyboard_hint_5);
- mNumberHintIcons[6] = res.getDrawable(R.drawable.keyboard_hint_6);
- mNumberHintIcons[7] = res.getDrawable(R.drawable.keyboard_hint_7);
- mNumberHintIcons[8] = res.getDrawable(R.drawable.keyboard_hint_8);
- mNumberHintIcons[9] = res.getDrawable(R.drawable.keyboard_hint_9);
- }
-
- @Override
- protected Key createKeyFromXml(Resources res, Row parent, int x, int y,
- XmlResourceParser parser) {
- Key key = new LatinKey(res, parent, x, y, parser);
- switch (key.codes[0]) {
- case LatinIME.KEYCODE_ENTER:
- mEnterKey = key;
- break;
- case LatinKeyboardView.KEYCODE_F1:
- mF1Key = key;
- break;
- case LatinIME.KEYCODE_SPACE:
- mSpaceKey = key;
- break;
- case KEYCODE_MODE_CHANGE:
- m123Key = key;
- m123Label = key.label;
- break;
- }
-
- // For number hints on the upper-right corner of key
- if (mNumberHintKeys == null) {
- // NOTE: This protected method is being called from the base class constructor before
- // mNumberHintKeys gets initialized.
- mNumberHintKeys = new Key[NUMBER_HINT_COUNT];
- }
- int hintNumber = -1;
- if (LatinKeyboardBaseView.isNumberAtLeftmostPopupChar(key)) {
- hintNumber = key.popupCharacters.charAt(0) - '0';
- } else if (LatinKeyboardBaseView.isNumberAtRightmostPopupChar(key)) {
- hintNumber = key.popupCharacters.charAt(key.popupCharacters.length() - 1) - '0';
- }
- if (hintNumber >= 0 && hintNumber <= 9) {
- mNumberHintKeys[hintNumber] = key;
- }
-
- return key;
- }
-
- void setImeOptions(Resources res, int mode, int options) {
- mMode = mode;
- // TODO should clean up this method
- if (mEnterKey != null) {
- // Reset some of the rarely used attributes.
- mEnterKey.popupCharacters = null;
- mEnterKey.popupResId = 0;
- mEnterKey.text = null;
- switch (options&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) {
- case EditorInfo.IME_ACTION_GO:
- mEnterKey.iconPreview = null;
- mEnterKey.icon = null;
- mEnterKey.label = res.getText(R.string.label_go_key);
- break;
- case EditorInfo.IME_ACTION_NEXT:
- mEnterKey.iconPreview = null;
- mEnterKey.icon = null;
- mEnterKey.label = res.getText(R.string.label_next_key);
- break;
- case EditorInfo.IME_ACTION_DONE:
- mEnterKey.iconPreview = null;
- mEnterKey.icon = null;
- mEnterKey.label = res.getText(R.string.label_done_key);
- break;
- case EditorInfo.IME_ACTION_SEARCH:
- mEnterKey.iconPreview = res.getDrawable(
- R.drawable.sym_keyboard_feedback_search);
- mEnterKey.icon = res.getDrawable(mIsBlackSym ?
- R.drawable.sym_bkeyboard_search : R.drawable.sym_keyboard_search);
- mEnterKey.label = null;
- break;
- case EditorInfo.IME_ACTION_SEND:
- mEnterKey.iconPreview = null;
- mEnterKey.icon = null;
- mEnterKey.label = res.getText(R.string.label_send_key);
- break;
- default:
- if (mode == KeyboardSwitcher.MODE_IM) {
- mEnterKey.icon = mHintIcon;
- mEnterKey.iconPreview = null;
- mEnterKey.label = ":-)";
- mEnterKey.text = ":-) ";
- mEnterKey.popupResId = R.xml.popup_smileys;
- } else {
- mEnterKey.iconPreview = res.getDrawable(
- R.drawable.sym_keyboard_feedback_return);
- mEnterKey.icon = res.getDrawable(mIsBlackSym ?
- R.drawable.sym_bkeyboard_return : R.drawable.sym_keyboard_return);
- mEnterKey.label = null;
- }
- break;
- }
- // Set the initial size of the preview icon
- if (mEnterKey.iconPreview != null) {
- setDefaultBounds(mEnterKey.iconPreview);
- }
- }
- }
-
- void enableShiftLock() {
- int index = getShiftKeyIndex();
- if (index >= 0) {
- mShiftKey = getKeys().get(index);
- if (mShiftKey instanceof LatinKey) {
- ((LatinKey)mShiftKey).enableShiftLock();
- }
- mOldShiftIcon = mShiftKey.icon;
- }
- }
-
- void setShiftLocked(boolean shiftLocked) {
- if (mShiftKey != null) {
- if (shiftLocked) {
- mShiftKey.on = true;
- mShiftKey.icon = mShiftLockIcon;
- mShiftState = SHIFT_LOCKED;
- } else {
- mShiftKey.on = false;
- mShiftKey.icon = mShiftLockIcon;
- mShiftState = SHIFT_ON;
- }
- }
- }
-
- boolean isShiftLocked() {
- return mShiftState == SHIFT_LOCKED;
- }
-
- @Override
- public boolean setShifted(boolean shiftState) {
- boolean shiftChanged = false;
- if (mShiftKey != null) {
- if (shiftState == false) {
- shiftChanged = mShiftState != SHIFT_OFF;
- mShiftState = SHIFT_OFF;
- mShiftKey.on = false;
- mShiftKey.icon = mOldShiftIcon;
- } else {
- if (mShiftState == SHIFT_OFF) {
- shiftChanged = mShiftState == SHIFT_OFF;
- mShiftState = SHIFT_ON;
- mShiftKey.icon = mShiftLockIcon;
- }
- }
- } else {
- return super.setShifted(shiftState);
- }
- return shiftChanged;
- }
-
- @Override
- public boolean isShifted() {
- if (mShiftKey != null) {
- return mShiftState != SHIFT_OFF;
- } else {
- return super.isShifted();
- }
- }
-
- /* package */ boolean isAlphaKeyboard() {
- return mIsAlphaKeyboard;
- }
-
- public void setColorOfSymbolIcons(boolean isAutoCompletion, boolean isBlack) {
- mIsBlackSym = isBlack;
- if (isBlack) {
- mShiftLockIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_shift_locked);
- mSpaceIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_space);
- mMicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic);
- m123MicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_123_mic);
- } else {
- mShiftLockIcon = mRes.getDrawable(R.drawable.sym_keyboard_shift_locked);
- mSpaceIcon = mRes.getDrawable(R.drawable.sym_keyboard_space);
- mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic);
- m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic);
- }
- updateDynamicKeys();
- if (mSpaceKey != null) {
- updateSpaceBarForLocale(isAutoCompletion, isBlack);
- }
- updateNumberHintKeys();
- }
-
- private void setDefaultBounds(Drawable drawable) {
- drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
- }
-
- public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) {
- mHasVoiceButton = hasVoiceButton;
- mVoiceEnabled = hasVoice;
- updateDynamicKeys();
- }
-
- private void updateDynamicKeys() {
- update123Key();
- updateF1Key();
- }
-
- private void update123Key() {
- // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode.
- if (m123Key != null && mIsAlphaKeyboard) {
- if (mVoiceEnabled && !mHasVoiceButton) {
- m123Key.icon = m123MicIcon;
- m123Key.iconPreview = m123MicPreviewIcon;
- m123Key.label = null;
- } else {
- m123Key.icon = null;
- m123Key.iconPreview = null;
- m123Key.label = m123Label;
- }
- }
- }
-
- private void updateF1Key() {
- // Update KEYCODE_F1 key. Please note that some keyboard layouts have no F1 key.
- if (mF1Key == null)
- return;
-
- if (mIsAlphaKeyboard) {
- if (mMode == KeyboardSwitcher.MODE_URL) {
- setNonMicF1Key(mF1Key, "/", R.xml.popup_slash);
- } else if (mMode == KeyboardSwitcher.MODE_EMAIL) {
- setNonMicF1Key(mF1Key, "@", R.xml.popup_at);
- } else {
- if (mVoiceEnabled && mHasVoiceButton) {
- setMicF1Key(mF1Key);
- } else {
- setNonMicF1Key(mF1Key, ",", R.xml.popup_comma);
- }
- }
- } else { // Symbols keyboard
- if (mVoiceEnabled && mHasVoiceButton) {
- setMicF1Key(mF1Key);
- } else {
- setNonMicF1Key(mF1Key, ",", R.xml.popup_comma);
- }
- }
- }
-
- private void setMicF1Key(Key key) {
- // HACK: draw mMicIcon and mHintIcon at the same time
- final Drawable micWithSettingsHintDrawable = new BitmapDrawable(mRes,
- drawSynthesizedSettingsHintImage(key.width, key.height, mMicIcon, mHintIcon));
-
- key.label = null;
- key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE };
- key.popupResId = R.xml.popup_mic;
- key.icon = micWithSettingsHintDrawable;
- key.iconPreview = mMicPreviewIcon;
- }
-
- private void setNonMicF1Key(Key key, String label, int popupResId) {
- key.label = label;
- key.codes = new int[] { label.charAt(0) };
- key.popupResId = popupResId;
- key.icon = mHintIcon;
- key.iconPreview = null;
- }
-
- public boolean isF1Key(Key key) {
- return key == mF1Key;
- }
-
- public static boolean hasPuncOrSmileysPopup(Key key) {
- return key.popupResId == R.xml.popup_punctuation || key.popupResId == R.xml.popup_smileys;
- }
-
- /**
- * @return a key which should be invalidated.
- */
- public Key onAutoCompletionStateChanged(boolean isAutoCompletion) {
- updateSpaceBarForLocale(isAutoCompletion, mIsBlackSym);
- return mSpaceKey;
- }
-
- private void updateNumberHintKeys() {
- for (int i = 0; i < mNumberHintKeys.length; ++i) {
- if (mNumberHintKeys[i] != null) {
- mNumberHintKeys[i].icon = mNumberHintIcons[i];
- }
- }
- }
-
- public boolean isLanguageSwitchEnabled() {
- return mLocale != null;
- }
-
- private void updateSpaceBarForLocale(boolean isAutoCompletion, boolean isBlack) {
- // If application locales are explicitly selected.
- if (mLocale != null) {
- mSpaceKey.icon = new BitmapDrawable(mRes,
- drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack));
- } else {
- // sym_keyboard_space_led can be shared with Black and White symbol themes.
- if (isAutoCompletion) {
- mSpaceKey.icon = new BitmapDrawable(mRes,
- drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack));
- } else {
- mSpaceKey.icon = isBlack ? mRes.getDrawable(R.drawable.sym_bkeyboard_space)
- : mRes.getDrawable(R.drawable.sym_keyboard_space);
- }
- }
- }
-
- // Compute width of text with specified text size using paint.
- private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) {
- paint.setTextSize(textSize);
- paint.getTextBounds(text, 0, text.length(), bounds);
- return bounds.width();
- }
-
- // Overlay two images: mainIcon and hintIcon.
- private Bitmap drawSynthesizedSettingsHintImage(
- int width, int height, Drawable mainIcon, Drawable hintIcon) {
- if (mainIcon == null || hintIcon == null)
- return null;
- Rect hintIconPadding = new Rect(0, 0, 0, 0);
- hintIcon.getPadding(hintIconPadding);
- final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(buffer);
- canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR);
-
- // Draw main icon at the center of the key visual
- // Assuming the hintIcon shares the same padding with the key's background drawable
- final int drawableX = (width + hintIconPadding.left - hintIconPadding.right
- - mainIcon.getIntrinsicWidth()) / 2;
- final int drawableY = (height + hintIconPadding.top - hintIconPadding.bottom
- - mainIcon.getIntrinsicHeight()) / 2;
- setDefaultBounds(mainIcon);
- canvas.translate(drawableX, drawableY);
- mainIcon.draw(canvas);
- canvas.translate(-drawableX, -drawableY);
-
- // Draw hint icon fully in the key
- hintIcon.setBounds(0, 0, width, height);
- hintIcon.draw(canvas);
- return buffer;
- }
-
- // Layout local language name and left and right arrow on space bar.
- private static String layoutSpaceBar(Paint paint, Locale locale, Drawable lArrow,
- Drawable rArrow, int width, int height, float origTextSize,
- boolean allowVariableTextSize) {
- final float arrowWidth = lArrow.getIntrinsicWidth();
- final float arrowHeight = lArrow.getIntrinsicHeight();
- final float maxTextWidth = width - (arrowWidth + arrowWidth);
- final Rect bounds = new Rect();
-
- // Estimate appropriate language name text size to fit in maxTextWidth.
- String language = LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale));
- int textWidth = getTextWidth(paint, language, origTextSize, bounds);
- // Assuming text width and text size are proportional to each other.
- float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f);
-
- final boolean useShortName;
- if (allowVariableTextSize) {
- textWidth = getTextWidth(paint, language, textSize, bounds);
- // If text size goes too small or text does not fit, use short name
- useShortName = textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME
- || textWidth > maxTextWidth;
- } else {
- useShortName = textWidth > maxTextWidth;
- textSize = origTextSize;
- }
- if (useShortName) {
- language = LanguageSwitcher.toTitleCase(locale.getLanguage());
- textWidth = getTextWidth(paint, language, origTextSize, bounds);
- textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f);
- }
- paint.setTextSize(textSize);
-
- // Place left and right arrow just before and after language text.
- final float baseline = height * SPACEBAR_LANGUAGE_BASELINE;
- final int top = (int)(baseline - arrowHeight);
- final float remains = (width - textWidth) / 2;
- lArrow.setBounds((int)(remains - arrowWidth), top, (int)remains, (int)baseline);
- rArrow.setBounds((int)(remains + textWidth), top, (int)(remains + textWidth + arrowWidth),
- (int)baseline);
-
- return language;
- }
-
- private Bitmap drawSpaceBar(int opacity, boolean isAutoCompletion, boolean isBlack) {
- final int width = mSpaceKey.width;
- final int height = mSpaceIcon.getIntrinsicHeight();
- final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(buffer);
- canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR);
-
- // If application locales are explicitly selected.
- if (mLocale != null) {
- final Paint paint = new Paint();
- paint.setAlpha(opacity);
- paint.setAntiAlias(true);
- paint.setTextAlign(Align.CENTER);
-
- final boolean allowVariableTextSize = true;
- final String language = layoutSpaceBar(paint, mLanguageSwitcher.getInputLocale(),
- mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height,
- getTextSizeFromTheme(android.R.style.TextAppearance_Small, 14),
- allowVariableTextSize);
-
- // Draw language text with shadow
- final int shadowColor = mRes.getColor(isBlack
- ? R.color.latinkeyboard_bar_language_shadow_black
- : R.color.latinkeyboard_bar_language_shadow_white);
- final float baseline = height * SPACEBAR_LANGUAGE_BASELINE;
- final float descent = paint.descent();
- paint.setColor(shadowColor);
- canvas.drawText(language, width / 2, baseline - descent - 1, paint);
- paint.setColor(mRes.getColor(R.color.latinkeyboard_bar_language_text));
- canvas.drawText(language, width / 2, baseline - descent, paint);
-
- // Put arrows that are already layed out on either side of the text
- if (mLanguageSwitcher.getLocaleCount() > 1) {
- mButtonArrowLeftIcon.draw(canvas);
- mButtonArrowRightIcon.draw(canvas);
- }
- }
-
- // Draw the spacebar icon at the bottom
- if (isAutoCompletion) {
- final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100;
- final int iconHeight = mSpaceAutoCompletionIndicator.getIntrinsicHeight();
- int x = (width - iconWidth) / 2;
- int y = height - iconHeight;
- mSpaceAutoCompletionIndicator.setBounds(x, y, x + iconWidth, y + iconHeight);
- mSpaceAutoCompletionIndicator.draw(canvas);
- } else {
- final int iconWidth = mSpaceIcon.getIntrinsicWidth();
- final int iconHeight = mSpaceIcon.getIntrinsicHeight();
- int x = (width - iconWidth) / 2;
- int y = height - iconHeight;
- mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight);
- mSpaceIcon.draw(canvas);
- }
- return buffer;
- }
-
- private void updateLocaleDrag(int diff) {
- if (mSlidingLocaleIcon == null) {
- final int width = Math.max(mSpaceKey.width,
- (int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO));
- final int height = mSpacePreviewIcon.getIntrinsicHeight();
- mSlidingLocaleIcon = new SlidingLocaleDrawable(mSpacePreviewIcon, width, height);
- mSlidingLocaleIcon.setBounds(0, 0, width, height);
- mSpaceKey.iconPreview = mSlidingLocaleIcon;
- }
- mSlidingLocaleIcon.setDiff(diff);
- if (Math.abs(diff) == Integer.MAX_VALUE) {
- mSpaceKey.iconPreview = mSpacePreviewIcon;
- } else {
- mSpaceKey.iconPreview = mSlidingLocaleIcon;
- }
- mSpaceKey.iconPreview.invalidateSelf();
- }
-
- public int getLanguageChangeDirection() {
- if (mSpaceKey == null || mLanguageSwitcher.getLocaleCount() < 2
- || Math.abs(mSpaceDragLastDiff) < mSpaceKey.width * SPACEBAR_DRAG_THRESHOLD ) {
- return 0; // No change
- }
- return mSpaceDragLastDiff > 0 ? 1 : -1;
- }
-
- public void setLanguageSwitcher(LanguageSwitcher switcher, boolean isAutoCompletion,
- boolean isBlackSym) {
- mLanguageSwitcher = switcher;
- Locale locale = mLanguageSwitcher.getLocaleCount() > 0
- ? mLanguageSwitcher.getInputLocale()
- : null;
- // If the language count is 1 and is the same as the system language, don't show it.
- if (locale != null
- && mLanguageSwitcher.getLocaleCount() == 1
- && mLanguageSwitcher.getSystemLocale().getLanguage()
- .equalsIgnoreCase(locale.getLanguage())) {
- locale = null;
- }
- mLocale = locale;
- setColorOfSymbolIcons(isAutoCompletion, isBlackSym);
- }
-
- boolean isCurrentlyInSpace() {
- return mCurrentlyInSpace;
- }
-
- void setPreferredLetters(int[] frequencies) {
- mPrefLetterFrequencies = frequencies;
- mPrefLetter = 0;
- }
-
- void keyReleased() {
- mCurrentlyInSpace = false;
- mSpaceDragLastDiff = 0;
- mPrefLetter = 0;
- mPrefLetterX = 0;
- mPrefLetterY = 0;
- mPrefDistance = Integer.MAX_VALUE;
- if (mSpaceKey != null) {
- updateLocaleDrag(Integer.MAX_VALUE);
- }
- }
-
- /**
- * Does the magic of locking the touch gesture into the spacebar when
- * switching input languages.
- */
- boolean isInside(LatinKey key, int x, int y) {
- final int code = key.codes[0];
- if (code == KEYCODE_SHIFT ||
- code == KEYCODE_DELETE) {
- y -= key.height / 10;
- if (code == KEYCODE_SHIFT) x += key.width / 6;
- if (code == KEYCODE_DELETE) x -= key.width / 6;
- } else if (code == LatinIME.KEYCODE_SPACE) {
- y += LatinKeyboard.sSpacebarVerticalCorrection;
- if (mLanguageSwitcher.getLocaleCount() > 1) {
- if (mCurrentlyInSpace) {
- int diff = x - mSpaceDragStartX;
- if (Math.abs(diff - mSpaceDragLastDiff) > 0) {
- updateLocaleDrag(diff);
- }
- mSpaceDragLastDiff = diff;
- return true;
- } else {
- boolean insideSpace = key.isInsideSuper(x, y);
- if (insideSpace) {
- mCurrentlyInSpace = true;
- mSpaceDragStartX = x;
- updateLocaleDrag(0);
- }
- return insideSpace;
- }
- }
- } else if (mPrefLetterFrequencies != null) {
- // New coordinate? Reset
- if (mPrefLetterX != x || mPrefLetterY != y) {
- mPrefLetter = 0;
- mPrefDistance = Integer.MAX_VALUE;
- }
- // Handle preferred next letter
- final int[] pref = mPrefLetterFrequencies;
- if (mPrefLetter > 0) {
- if (DEBUG_PREFERRED_LETTER) {
- if (mPrefLetter == code && !key.isInsideSuper(x, y)) {
- Log.d(TAG, "CORRECTED !!!!!!");
- }
- }
- return mPrefLetter == code;
- } else {
- final boolean inside = key.isInsideSuper(x, y);
- int[] nearby = getNearestKeys(x, y);
- List<Key> nearbyKeys = getKeys();
- if (inside) {
- // If it's a preferred letter
- if (inPrefList(code, pref)) {
- // Check if its frequency is much lower than a nearby key
- mPrefLetter = code;
- mPrefLetterX = x;
- mPrefLetterY = y;
- for (int i = 0; i < nearby.length; i++) {
- Key k = nearbyKeys.get(nearby[i]);
- if (k != key && inPrefList(k.codes[0], pref)) {
- final int dist = distanceFrom(k, x, y);
- if (dist < (int) (k.width * OVERLAP_PERCENTAGE_LOW_PROB) &&
- (pref[k.codes[0]] > pref[mPrefLetter] * 3)) {
- mPrefLetter = k.codes[0];
- mPrefDistance = dist;
- if (DEBUG_PREFERRED_LETTER) {
- Log.d(TAG, "CORRECTED ALTHOUGH PREFERRED !!!!!!");
- }
- break;
- }
- }
- }
-
- return mPrefLetter == code;
- }
- }
-
- // Get the surrounding keys and intersect with the preferred list
- // For all in the intersection
- // if distance from touch point is within a reasonable distance
- // make this the pref letter
- // If no pref letter
- // return inside;
- // else return thiskey == prefletter;
-
- for (int i = 0; i < nearby.length; i++) {
- Key k = nearbyKeys.get(nearby[i]);
- if (inPrefList(k.codes[0], pref)) {
- final int dist = distanceFrom(k, x, y);
- if (dist < (int) (k.width * OVERLAP_PERCENTAGE_HIGH_PROB)
- && dist < mPrefDistance) {
- mPrefLetter = k.codes[0];
- mPrefLetterX = x;
- mPrefLetterY = y;
- mPrefDistance = dist;
- }
- }
- }
- // Didn't find any
- if (mPrefLetter == 0) {
- return inside;
- } else {
- return mPrefLetter == code;
- }
- }
- }
-
- // Lock into the spacebar
- if (mCurrentlyInSpace) return false;
-
- return key.isInsideSuper(x, y);
- }
-
- private boolean inPrefList(int code, int[] pref) {
- if (code < pref.length && code >= 0) return pref[code] > 0;
- return false;
- }
-
- private int distanceFrom(Key k, int x, int y) {
- if (y > k.y && y < k.y + k.height) {
- return Math.abs(k.x + k.width / 2 - x);
- } else {
- return Integer.MAX_VALUE;
- }
- }
-
- @Override
- public int[] getNearestKeys(int x, int y) {
- if (mCurrentlyInSpace) {
- return new int[] { mSpaceKeyIndex };
- } else {
- // Avoid dead pixels at edges of the keyboard
- return super.getNearestKeys(Math.max(0, Math.min(x, getMinWidth() - 1)),
- Math.max(0, Math.min(y, getHeight() - 1)));
- }
- }
-
- private int indexOf(int code) {
- List<Key> keys = getKeys();
- int count = keys.size();
- for (int i = 0; i < count; i++) {
- if (keys.get(i).codes[0] == code) return i;
- }
- return -1;
- }
-
- private int getTextSizeFromTheme(int style, int defValue) {
- TypedArray array = mContext.getTheme().obtainStyledAttributes(
- style, new int[] { android.R.attr.textSize });
- int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue);
- return textSize;
- }
-
- // TODO LatinKey could be static class
- class LatinKey extends Keyboard.Key {
-
- // functional normal state (with properties)
- private final int[] KEY_STATE_FUNCTIONAL_NORMAL = {
- android.R.attr.state_single
- };
-
- // functional pressed state (with properties)
- private final int[] KEY_STATE_FUNCTIONAL_PRESSED = {
- android.R.attr.state_single,
- android.R.attr.state_pressed
- };
-
- private boolean mShiftLockEnabled;
-
- public LatinKey(Resources res, Keyboard.Row parent, int x, int y,
- XmlResourceParser parser) {
- super(res, parent, x, y, parser);
- if (popupCharacters != null && popupCharacters.length() == 0) {
- // If there is a keyboard with no keys specified in popupCharacters
- popupResId = 0;
- }
- }
-
- private void enableShiftLock() {
- mShiftLockEnabled = true;
- }
-
- // sticky is used for shift key. If a key is not sticky and is modifier,
- // the key will be treated as functional.
- private boolean isFunctionalKey() {
- return !sticky && modifier;
- }
-
- @Override
- public void onReleased(boolean inside) {
- if (!mShiftLockEnabled) {
- super.onReleased(inside);
- } else {
- pressed = !pressed;
- }
- }
-
- /**
- * Overriding this method so that we can reduce the target area for certain keys.
- */
- @Override
- public boolean isInside(int x, int y) {
- // TODO This should be done by parent.isInside(this, x, y)
- // if Key.parent were protected.
- boolean result = LatinKeyboard.this.isInside(this, x, y);
- return result;
- }
-
- boolean isInsideSuper(int x, int y) {
- return super.isInside(x, y);
- }
-
- @Override
- public int[] getCurrentDrawableState() {
- if (isFunctionalKey()) {
- if (pressed) {
- return KEY_STATE_FUNCTIONAL_PRESSED;
- } else {
- return KEY_STATE_FUNCTIONAL_NORMAL;
- }
- }
- return super.getCurrentDrawableState();
- }
-
- @Override
- public int squaredDistanceFrom(int x, int y) {
- // We should count vertical gap between rows to calculate the center of this Key.
- final int verticalGap = LatinKeyboard.this.mVerticalGap;
- final int xDist = this.x + width / 2 - x;
- final int yDist = this.y + (height + verticalGap) / 2 - y;
- return xDist * xDist + yDist * yDist;
- }
- }
-
- /**
- * Animation to be displayed on the spacebar preview popup when switching
- * languages by swiping the spacebar. It draws the current, previous and
- * next languages and moves them by the delta of touch movement on the spacebar.
- */
- class SlidingLocaleDrawable extends Drawable {
-
- private final int mWidth;
- private final int mHeight;
- private final Drawable mBackground;
- private final TextPaint mTextPaint;
- private final int mMiddleX;
- private final Drawable mLeftDrawable;
- private final Drawable mRightDrawable;
- private final int mThreshold;
- private int mDiff;
- private boolean mHitThreshold;
- private String mCurrentLanguage;
- private String mNextLanguage;
- private String mPrevLanguage;
-
- public SlidingLocaleDrawable(Drawable background, int width, int height) {
- mBackground = background;
- setDefaultBounds(mBackground);
- mWidth = width;
- mHeight = height;
- mTextPaint = new TextPaint();
- mTextPaint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18));
- mTextPaint.setColor(R.color.latinkeyboard_transparent);
- mTextPaint.setTextAlign(Align.CENTER);
- mTextPaint.setAlpha(OPACITY_FULLY_OPAQUE);
- mTextPaint.setAntiAlias(true);
- mMiddleX = (mWidth - mBackground.getIntrinsicWidth()) / 2;
- mLeftDrawable =
- mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_left);
- mRightDrawable =
- mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_right);
- mThreshold = ViewConfiguration.get(mContext).getScaledTouchSlop();
- }
-
- private void setDiff(int diff) {
- if (diff == Integer.MAX_VALUE) {
- mHitThreshold = false;
- mCurrentLanguage = null;
- return;
- }
- mDiff = diff;
- if (mDiff > mWidth) mDiff = mWidth;
- if (mDiff < -mWidth) mDiff = -mWidth;
- if (Math.abs(mDiff) > mThreshold) mHitThreshold = true;
- invalidateSelf();
- }
-
- private String getLanguageName(Locale locale) {
- return LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale));
- }
-
- @Override
- public void draw(Canvas canvas) {
- canvas.save();
- if (mHitThreshold) {
- Paint paint = mTextPaint;
- final int width = mWidth;
- final int height = mHeight;
- final int diff = mDiff;
- final Drawable lArrow = mLeftDrawable;
- final Drawable rArrow = mRightDrawable;
- canvas.clipRect(0, 0, width, height);
- if (mCurrentLanguage == null) {
- final LanguageSwitcher languageSwitcher = mLanguageSwitcher;
- mCurrentLanguage = getLanguageName(languageSwitcher.getInputLocale());
- mNextLanguage = getLanguageName(languageSwitcher.getNextInputLocale());
- mPrevLanguage = getLanguageName(languageSwitcher.getPrevInputLocale());
- }
- // Draw language text with shadow
- final float baseline = mHeight * SPACEBAR_LANGUAGE_BASELINE - paint.descent();
- paint.setColor(mRes.getColor(R.color.latinkeyboard_feedback_language_text));
- canvas.drawText(mCurrentLanguage, width / 2 + diff, baseline, paint);
- canvas.drawText(mNextLanguage, diff - width / 2, baseline, paint);
- canvas.drawText(mPrevLanguage, diff + width + width / 2, baseline, paint);
-
- setDefaultBounds(lArrow);
- rArrow.setBounds(width - rArrow.getIntrinsicWidth(), 0, width,
- rArrow.getIntrinsicHeight());
- lArrow.draw(canvas);
- rArrow.draw(canvas);
- }
- if (mBackground != null) {
- canvas.translate(mMiddleX, 0);
- mBackground.draw(canvas);
- }
- canvas.restore();
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
-
- @Override
- public void setAlpha(int alpha) {
- // Ignore
- }
-
- @Override
- public void setColorFilter(ColorFilter cf) {
- // Ignore
- }
-
- @Override
- public int getIntrinsicWidth() {
- return mWidth;
- }
-
- @Override
- public int getIntrinsicHeight() {
- return mHeight;
- }
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
deleted file mode 100644
index 22d39f7aa..000000000
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
+++ /dev/null
@@ -1,375 +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 k) {
- super.setKeyboard(k);
- // One-seventh of the keyboard width seems like a reasonable threshold
- mJumpThresholdSquare = k.getMinWidth() / 7;
- mJumpThresholdSquare *= mJumpThresholdSquare;
- // Assuming there are 4 rows, this is the coordinate of the last row
- mLastRowY = (k.getHeight() * 3) / 4;
- setKeyboardLocal(k);
- }
-
- @Override
- protected boolean onLongPress(Key key) {
- int primaryCode = key.codes[0];
- if (primaryCode == KEYCODE_OPTIONS) {
- return invokeOnKey(KEYCODE_OPTIONS_LONGPRESS);
- } else if (primaryCode == '0' && getKeyboard() == mPhoneKeyboard) {
- // Long pressing on 0 in phone number keypad gives you a '+'.
- return invokeOnKey('+');
- } else {
- return super.onLongPress(key);
- }
- }
-
- private boolean invokeOnKey(int primaryCode) {
- getOnKeyboardActionListener().onKey(primaryCode, null,
- LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE,
- LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE);
- return true;
- }
-
- @Override
- protected CharSequence adjustCase(CharSequence label) {
- Keyboard keyboard = getKeyboard();
- if (keyboard.isShifted()
- && keyboard instanceof LatinKeyboard
- && ((LatinKeyboard) keyboard).isAlphaKeyboard()
- && !TextUtils.isEmpty(label) && label.length() < 3
- && Character.isLowerCase(label.charAt(0))) {
- label = label.toString().toUpperCase();
- }
- return label;
- }
-
- public boolean setShiftLocked(boolean shiftLocked) {
- Keyboard keyboard = getKeyboard();
- if (keyboard instanceof LatinKeyboard) {
- ((LatinKeyboard)keyboard).setShiftLocked(shiftLocked);
- invalidateAllKeys();
- return true;
- }
- return false;
- }
-
- /**
- * This function checks to see if we need to handle any sudden jumps in the pointer location
- * that could be due to a multi-touch being treated as a move by the firmware or hardware.
- * Once a sudden jump is detected, all subsequent move events are discarded
- * until an UP is received.<P>
- * When a sudden jump is detected, an UP event is simulated at the last position and when
- * the sudden moves subside, a DOWN event is simulated for the second key.
- * @param me the motion event
- * @return true if the event was consumed, so that it doesn't continue to be handled by
- * KeyboardView.
- */
- private boolean handleSuddenJump(MotionEvent me) {
- final int action = me.getAction();
- final int x = (int) me.getX();
- final int y = (int) me.getY();
- boolean result = false;
-
- // Real multi-touch event? Stop looking for sudden jumps
- if (me.getPointerCount() > 1) {
- mDisableDisambiguation = true;
- }
- if (mDisableDisambiguation) {
- // If UP, reset the multi-touch flag
- if (action == MotionEvent.ACTION_UP) mDisableDisambiguation = false;
- return false;
- }
-
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- // Reset the "session"
- mDroppingEvents = false;
- mDisableDisambiguation = false;
- break;
- case MotionEvent.ACTION_MOVE:
- // Is this a big jump?
- final int distanceSquare = (mLastX - x) * (mLastX - x) + (mLastY - y) * (mLastY - y);
- // Check the distance and also if the move is not entirely within the bottom row
- // If it's only in the bottom row, it might be an intentional slide gesture
- // for language switching
- if (distanceSquare > mJumpThresholdSquare
- && (mLastY < mLastRowY || y < mLastRowY)) {
- // If we're not yet dropping events, start dropping and send an UP event
- if (!mDroppingEvents) {
- mDroppingEvents = true;
- // Send an up event
- MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
- MotionEvent.ACTION_UP,
- mLastX, mLastY, me.getMetaState());
- super.onTouchEvent(translated);
- translated.recycle();
- }
- result = true;
- } else if (mDroppingEvents) {
- // If moves are small and we're already dropping events, continue dropping
- result = true;
- }
- break;
- case MotionEvent.ACTION_UP:
- if (mDroppingEvents) {
- // Send a down event first, as we dropped a bunch of sudden jumps and assume that
- // the user is releasing the touch on the second key.
- MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
- MotionEvent.ACTION_DOWN,
- x, y, me.getMetaState());
- super.onTouchEvent(translated);
- translated.recycle();
- mDroppingEvents = false;
- // Let the up event get processed as well, result = false
- }
- break;
- }
- // Track the previous coordinate
- mLastX = x;
- mLastY = y;
- return result;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent me) {
- LatinKeyboard keyboard = (LatinKeyboard) getKeyboard();
- if (DEBUG_LINE) {
- mLastX = (int) me.getX();
- mLastY = (int) me.getY();
- invalidate();
- }
-
- // If there was a sudden jump, return without processing the actual motion event.
- if (handleSuddenJump(me))
- return true;
-
- // Reset any bounding box controls in the keyboard
- if (me.getAction() == MotionEvent.ACTION_DOWN) {
- keyboard.keyReleased();
- }
-
- if (me.getAction() == MotionEvent.ACTION_UP) {
- int languageDirection = keyboard.getLanguageChangeDirection();
- if (languageDirection != 0) {
- getOnKeyboardActionListener().onKey(
- languageDirection == 1 ? KEYCODE_NEXT_LANGUAGE : KEYCODE_PREV_LANGUAGE,
- null, mLastX, mLastY);
- me.setAction(MotionEvent.ACTION_CANCEL);
- keyboard.keyReleased();
- return super.onTouchEvent(me);
- }
- }
-
- return super.onTouchEvent(me);
- }
-
- /**************************** INSTRUMENTATION *******************************/
-
- static final boolean DEBUG_AUTO_PLAY = false;
- static final boolean DEBUG_LINE = false;
- private static final int MSG_TOUCH_DOWN = 1;
- private static final int MSG_TOUCH_UP = 2;
-
- Handler mHandler2;
-
- private String mStringToPlay;
- private int mStringIndex;
- private boolean mDownDelivered;
- private Key[] mAsciiKeys = new Key[256];
- private boolean mPlaying;
- private int mLastX;
- private int mLastY;
- private Paint mPaint;
-
- private void setKeyboardLocal(Keyboard k) {
- if (DEBUG_AUTO_PLAY) {
- findKeys();
- if (mHandler2 == null) {
- mHandler2 = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- removeMessages(MSG_TOUCH_DOWN);
- removeMessages(MSG_TOUCH_UP);
- if (mPlaying == false) return;
-
- switch (msg.what) {
- case MSG_TOUCH_DOWN:
- if (mStringIndex >= mStringToPlay.length()) {
- mPlaying = false;
- return;
- }
- char c = mStringToPlay.charAt(mStringIndex);
- while (c > 255 || mAsciiKeys[c] == null) {
- mStringIndex++;
- if (mStringIndex >= mStringToPlay.length()) {
- mPlaying = false;
- return;
- }
- c = mStringToPlay.charAt(mStringIndex);
- }
- int x = mAsciiKeys[c].x + 10;
- int y = mAsciiKeys[c].y + 26;
- MotionEvent me = MotionEvent.obtain(SystemClock.uptimeMillis(),
- SystemClock.uptimeMillis(),
- MotionEvent.ACTION_DOWN, x, y, 0);
- LatinKeyboardView.this.dispatchTouchEvent(me);
- me.recycle();
- sendEmptyMessageDelayed(MSG_TOUCH_UP, 500); // Deliver up in 500ms if nothing else
- // happens
- mDownDelivered = true;
- break;
- case MSG_TOUCH_UP:
- char cUp = mStringToPlay.charAt(mStringIndex);
- int x2 = mAsciiKeys[cUp].x + 10;
- int y2 = mAsciiKeys[cUp].y + 26;
- mStringIndex++;
-
- MotionEvent me2 = MotionEvent.obtain(SystemClock.uptimeMillis(),
- SystemClock.uptimeMillis(),
- MotionEvent.ACTION_UP, x2, y2, 0);
- LatinKeyboardView.this.dispatchTouchEvent(me2);
- me2.recycle();
- sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 500); // Deliver up in 500ms if nothing else
- // happens
- mDownDelivered = false;
- break;
- }
- }
- };
-
- }
- }
- }
-
- private void findKeys() {
- List<Key> keys = getKeyboard().getKeys();
- // Get the keys on this keyboard
- for (int i = 0; i < keys.size(); i++) {
- int code = keys.get(i).codes[0];
- if (code >= 0 && code <= 255) {
- mAsciiKeys[code] = keys.get(i);
- }
- }
- }
-
- public void startPlaying(String s) {
- if (DEBUG_AUTO_PLAY) {
- if (s == null) return;
- mStringToPlay = s.toLowerCase();
- mPlaying = true;
- mDownDelivered = false;
- mStringIndex = 0;
- mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 10);
- }
- }
-
- @Override
- public void draw(Canvas c) {
- LatinIMEUtil.GCUtils.getInstance().reset();
- boolean tryGC = true;
- for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
- try {
- super.draw(c);
- tryGC = false;
- } catch (OutOfMemoryError e) {
- tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait("LatinKeyboardView", e);
- }
- }
- if (DEBUG_AUTO_PLAY) {
- if (mPlaying) {
- mHandler2.removeMessages(MSG_TOUCH_DOWN);
- mHandler2.removeMessages(MSG_TOUCH_UP);
- if (mDownDelivered) {
- mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_UP, 20);
- } else {
- mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 20);
- }
- }
- }
- if (DEBUG_LINE) {
- if (mPaint == null) {
- mPaint = new Paint();
- mPaint.setColor(0x80FFFFFF);
- mPaint.setAntiAlias(false);
- }
- c.drawLine(mLastX, 0, mLastX, getHeight(), mPaint);
- c.drawLine(0, mLastY, getWidth(), mLastY, mPaint);
- }
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/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 90218e4ab..000000000
--- a/java/src/com/android/inputmethod/latin/PointerTracker.java
+++ /dev/null
@@ -1,531 +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 boolean mHasDistinctMultitouch;
-
- private Key[] mKeys;
- private int mKeyHysteresisDistanceSquared = -1;
-
- private final KeyState mKeyState;
-
- // 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;
-
- // 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 void onSetKeyboard() {
- mKeyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(mKeyX, mKeyY, null);
- }
- }
-
- 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;
- 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);
- // Update current key index because keyboard layout has been changed.
- mKeyState.onSetKeyboard();
- }
-
- 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);
- mKeyAlreadyProcessed = false;
- mIsRepeatableKey = false;
- checkMultiTap(eventTime, keyIndex);
- if (mListener != null) {
- if (isValidKeyIndex(keyIndex)) {
- mListener.onPress(mKeys[keyIndex].codes[0]);
- // This onPress call may have changed keyboard layout and have updated mKeyIndex.
- // If that's the case, mKeyIndex has been updated in setKeyboard().
- keyIndex = mKeyState.getKeyIndex();
- }
- }
- if (isValidKeyIndex(keyIndex)) {
- if (mKeys[keyIndex].repeatable) {
- repeatKey(keyIndex);
- mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this);
- mIsRepeatableKey = true;
- }
- mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this);
- }
- showKeyPreviewAndUpdateKey(keyIndex);
- }
-
- public void onMoveEvent(int x, int y, long eventTime) {
- if (DEBUG_MOVE)
- debugLog("onMoveEvent:", x, y);
- if (mKeyAlreadyProcessed)
- return;
- KeyState keyState = mKeyState;
- final int keyIndex = keyState.onMoveKey(x, y);
- final Key oldKey = getKey(keyState.getKeyIndex());
- if (isValidKeyIndex(keyIndex)) {
- if (oldKey == null) {
- keyState.onMoveToNewKey(keyIndex, x, y);
- mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this);
- } else if (!isMinorMoveBounce(x, y, keyIndex)) {
- if (mListener != null)
- mListener.onRelease(oldKey.codes[0]);
- resetMultiTap();
- keyState.onMoveToNewKey(keyIndex, x, y);
- mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this);
- }
- } else {
- if (oldKey != null) {
- if (mListener != null)
- mListener.onRelease(oldKey.codes[0]);
- keyState.onMoveToNewKey(keyIndex, x ,y);
- mHandler.cancelLongPressTimer();
- } else if (!isMinorMoveBounce(x, y, keyIndex)) {
- resetMultiTap();
- keyState.onMoveToNewKey(keyIndex, x ,y);
- mHandler.cancelLongPressTimer();
- }
- }
- showKeyPreviewAndUpdateKey(mKeyState.getKeyIndex());
- }
-
- public void onUpEvent(int x, int y, long eventTime) {
- if (DEBUG)
- debugLog("onUpEvent :", x, y);
- if (mKeyAlreadyProcessed)
- return;
- mHandler.cancelKeyTimers();
- mHandler.cancelPopupPreview();
- 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();
- }
- showKeyPreviewAndUpdateKey(NOT_A_KEY);
- 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);
- 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 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(NOT_A_KEY);
- }
- } else {
- int code = key.codes[0];
- //TextEntryState.keyPressedAt(key, x, y);
- 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/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/Settings.java
index ffff33da2..3f604a381 100644
--- a/java/src/com/android/inputmethod/latin/LatinIMESettings.java
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -16,8 +16,8 @@
package com.android.inputmethod.latin;
-import java.util.ArrayList;
-import java.util.Locale;
+import com.android.inputmethod.voice.VoiceIMEConnector;
+import com.android.inputmethod.voice.VoiceInputLogger;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -25,27 +25,41 @@ import android.app.backup.BackupManager;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
+import android.os.Vibrator;
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.text.TextUtils;
+import android.text.method.LinkMovementMethod;
import android.util.Log;
+import android.widget.TextView;
-import com.android.inputmethod.voice.SettingsUtil;
-import com.android.inputmethod.voice.VoiceInputLogger;
+import java.util.Locale;
-public class LatinIMESettings extends PreferenceActivity
+public class Settings extends PreferenceActivity
implements SharedPreferences.OnSharedPreferenceChangeListener,
DialogInterface.OnDismissListener {
+ private static final String TAG = "Settings";
- 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";
+ 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";
- private static final String TAG = "LatinIMESettings";
+ 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";
// Dialog ids
private static final int VOICE_INPUT_CONFIRM_DIALOG = 0;
@@ -53,26 +67,65 @@ public class LatinIMESettings extends PreferenceActivity
private CheckBoxPreference mQuickFixes;
private ListPreference mVoicePreference;
private ListPreference mSettingsKeyPreference;
+ 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);
- mQuickFixes = (CheckBoxPreference) findPreference(QUICK_FIXES_KEY);
- mVoicePreference = (ListPreference) findPreference(VOICE_SETTINGS_KEY);
+ mQuickFixes = (CheckBoxPreference) findPreference(PREF_QUICK_FIXES);
+ mVoicePreference = (ListPreference) findPreference(PREF_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));
+ 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 boolean showSettingsKeyOption = getResources().getBoolean(
+ R.bool.config_enable_show_settings_key_option);
+ if (!showSettingsKeyOption) {
+ getPreferenceScreen().removePreference(mSettingsKeyPreference);
+ }
+
+ final boolean showVoiceKeyOption = getResources().getBoolean(
+ R.bool.config_enable_show_voice_key_option);
+ if (!showVoiceKeyOption) {
+ getPreferenceScreen().removePreference(mVoicePreference);
+ }
+
+ Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
+ if (vibrator == null || !vibrator.hasVibrator()) {
+ getPreferenceScreen().removePreference(
+ getPreferenceScreen().findPreference(PREF_VIBRATE_ON));
+ }
+
+ final boolean showSubtypeSettings = getResources().getBoolean(
+ R.bool.config_enable_show_subtype_settings);
+ if (!showSubtypeSettings) {
+ getPreferenceScreen().removePreference(findPreference(PREF_SUBTYPES));
+ }
}
@Override
@@ -80,10 +133,10 @@ public class LatinIMESettings extends PreferenceActivity
super.onResume();
int autoTextSize = AutoText.getSize(getListView());
if (autoTextSize < 1) {
- ((PreferenceGroup) findPreference(PREDICTION_SETTINGS_KEY))
+ ((PreferenceGroup) findPreference(PREF_PREDICTION_SETTINGS_KEY))
.removePreference(mQuickFixes);
}
- if (!LatinIME.VOICE_INSTALLED
+ if (!VoiceIMEConnector.VOICE_INSTALLED
|| !SpeechRecognizer.isRecognitionAvailable(this)) {
getPreferenceScreen().removePreference(mVoicePreference);
} else {
@@ -99,16 +152,19 @@ public class LatinIMESettings extends PreferenceActivity
super.onDestroy();
}
+ @Override
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)
+ if (key.equals(PREF_VOICE_SETTINGS_KEY) && !mVoiceOn) {
+ if (!prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
.equals(mVoiceModeOff)) {
showVoiceConfirmation();
}
}
- mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff));
+ ensureConsistencyOfAutoCorrectionSettings();
+ mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
+ .equals(mVoiceModeOff));
updateVoiceModeSummary();
updateSettingsKeySummary();
}
@@ -122,6 +178,13 @@ public class LatinIMESettings extends PreferenceActivity
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() {
@@ -135,6 +198,7 @@ public class LatinIMESettings extends PreferenceActivity
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);
@@ -154,27 +218,23 @@ public class LatinIMESettings extends PreferenceActivity
// 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(
+ boolean localeSupported = SubtypeSwitcher.getInstance().isVoiceSupported(
Locale.getDefault().toString());
+ final CharSequence message;
if (localeSupported) {
- String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" +
- getString(R.string.voice_hint_dialog_message);
- builder.setMessage(message);
+ message = TextUtils.concat(
+ getText(R.string.voice_warning_may_not_understand), "\n\n",
+ getText(R.string.voice_hint_dialog_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);
+ 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;
@@ -184,6 +244,7 @@ public class LatinIMESettings extends PreferenceActivity
}
}
+ @Override
public void onDismiss(DialogInterface dialog) {
mLogger.settingsWarningDialogDismissed();
if (!mOkClicked) {
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..152605052
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -0,0 +1,550 @@
+/*
+ * 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.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+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.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+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 {
+ // This flag indicates if we support language switching by swipe on space bar.
+ // We may or may not draw the current language on space bar regardless of this flag.
+ public static final boolean USE_SPACEBAR_LANGUAGE_SWITCHER = false;
+ private static final boolean DBG = false;
+ private static final String TAG = "SubtypeSwitcher";
+
+ private static final char LOCALE_SEPARATER = '_';
+ private static final String KEYBOARD_MODE = "keyboard";
+ private static final String VOICE_MODE = "voice";
+ private 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 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 mShortcutInfo;
+ private InputMethodSubtype mShortcutSubtype;
+ private List<InputMethodSubtype> mAllEnabledSubtypesOfCurrentInputMethod;
+ private Locale mSystemLocale;
+ private Locale mInputLocale;
+ private String mInputLocaleStr;
+ private String mMode;
+ private VoiceInput mVoiceInput;
+ /*-----------------------------------------------------------*/
+
+ public static SubtypeSwitcher getInstance() {
+ return sInstance;
+ }
+
+ public static void init(LatinIME service, SharedPreferences prefs) {
+ sInstance.mPrefs = prefs;
+ sInstance.resetParams(service);
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ sInstance.initLanguageSwitcher(service);
+ }
+
+ sInstance.updateAllParameters();
+ }
+
+ private SubtypeSwitcher() {
+ // Intentional empty constructor for singleton.
+ }
+
+ private void resetParams(LatinIME service) {
+ mService = service;
+ mResources = service.getResources();
+ mImm = (InputMethodManager) service.getSystemService(Context.INPUT_METHOD_SERVICE);
+ mEnabledKeyboardSubtypesOfCurrentInputMethod.clear();
+ mEnabledLanguagesOfCurrentInputMethod.clear();
+ mSystemLocale = null;
+ mInputLocale = null;
+ mInputLocaleStr = null;
+ mMode = null;
+ mAllEnabledSubtypesOfCurrentInputMethod = null;
+ // TODO: Voice input should be created here
+ mVoiceInput = null;
+ }
+
+ // 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 (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ updateForSpaceBarLanguageSwitch();
+ } else {
+ updateEnabledSubtypes();
+ }
+ updateShortcutIME();
+ }
+
+ // Reload enabledSubtypes from the framework.
+ private void updateEnabledSubtypes() {
+ boolean foundCurrentSubtypeBecameDisabled = true;
+ mAllEnabledSubtypesOfCurrentInputMethod = mImm.getEnabledInputMethodSubtypeList(null);
+ mEnabledLanguagesOfCurrentInputMethod.clear();
+ mEnabledKeyboardSubtypesOfCurrentInputMethod.clear();
+ for (InputMethodSubtype ims: mAllEnabledSubtypesOfCurrentInputMethod) {
+ final String locale = ims.getLocale();
+ final String mode = ims.getMode();
+ mLocaleSplitter.setString(locale);
+ if (mLocaleSplitter.hasNext()) {
+ mEnabledLanguagesOfCurrentInputMethod.add(mLocaleSplitter.next());
+ }
+ if (locale.equals(mInputLocaleStr) && mode.equals(mMode)) {
+ foundCurrentSubtypeBecameDisabled = false;
+ }
+ if (KEYBOARD_MODE.equals(ims.getMode())) {
+ mEnabledKeyboardSubtypesOfCurrentInputMethod.add(ims);
+ }
+ }
+ mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1
+ && mIsSystemLanguageSameAsInputLanguage);
+ if (foundCurrentSubtypeBecameDisabled) {
+ if (DBG) {
+ Log.w(TAG, "Last subtype was disabled. Update to the current one.");
+ }
+ updateSubtype(mImm.getCurrentInputMethodSubtype());
+ }
+ }
+
+ private void updateShortcutIME() {
+ // 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.
+ mShortcutInfo = 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;
+ }
+ }
+
+ // Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function.
+ public void updateSubtype(InputMethodSubtype newSubtype) {
+ final String newLocale;
+ final String newMode;
+ if (newSubtype == null) {
+ // Normally, newSubtype shouldn't be null. But just in case newSubtype was null,
+ // fallback to the default locale and mode.
+ Log.w(TAG, "Couldn't get the current subtype.");
+ newLocale = "en_US";
+ newMode =KEYBOARD_MODE;
+ } else {
+ newLocale = newSubtype.getLocale();
+ newMode = newSubtype.getMode();
+ }
+ if (DBG) {
+ Log.w(TAG, "Update subtype to:" + newLocale + "," + newMode
+ + ", from: " + mInputLocaleStr + ", " + mMode);
+ }
+ boolean languageChanged = false;
+ if (!newLocale.equals(mInputLocaleStr)) {
+ if (mInputLocaleStr != null) {
+ languageChanged = true;
+ }
+ updateInputLocale(newLocale);
+ }
+ boolean modeChanged = false;
+ String oldMode = mMode;
+ if (!newMode.equals(mMode)) {
+ if (mMode != null) {
+ modeChanged = true;
+ }
+ mMode = newMode;
+ }
+ if (isKeyboardMode()) {
+ if (modeChanged) {
+ if (VOICE_MODE.equals(oldMode) && mVoiceInput != null) {
+ mVoiceInput.cancel();
+ }
+ }
+ if (languageChanged) {
+ mService.onKeyboardLanguageChanged();
+ }
+ } else if (isVoiceMode()) {
+ // If needsToShowWarningDialog is true, voice input need to show warning before
+ // show recognition view.
+ if (languageChanged || modeChanged
+ || VoiceIMEConnector.getInstance().needsToShowWarningDialog()) {
+ if (mVoiceInput != null) {
+ triggerVoiceIME();
+ }
+ }
+ } else {
+ Log.w(TAG, "Unknown subtype mode: " + mMode);
+ }
+ }
+
+ // 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() {
+ IBinder token = mService.getWindow().getWindow().getAttributes().token;
+ if (token == null || mShortcutInfo == null) {
+ return;
+ }
+ mImm.setInputMethodAndSubtype(token, mShortcutInfo.getId(), mShortcutSubtype);
+ }
+
+ public Drawable getShortcutIcon() {
+ return getSubtypeIcon(mShortcutInfo, 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.getSubtypes().size() > 0 && imi.getSubtypes().get(0) != null) {
+ return pm.getDrawable(imiPackageName,
+ imi.getSubtypes().get(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;
+ }
+
+ //////////////////////////////////
+ // Language Switching functions //
+ //////////////////////////////////
+
+ public int getEnabledKeyboardLocaleCount() {
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ return mLanguageSwitcher.getLocaleCount();
+ } else {
+ return mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
+ }
+ }
+
+ public boolean needsToDisplayLanguage() {
+ return mNeedsToDisplayLanguage;
+ }
+
+ public Locale getInputLocale() {
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ return mLanguageSwitcher.getInputLocale();
+ } else {
+ return mInputLocale;
+ }
+ }
+
+ public String getInputLocaleStr() {
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ 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 (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ return mLanguageSwitcher.getEnabledLanguages();
+ } else {
+ return mEnabledLanguagesOfCurrentInputMethod.toArray(
+ new String[mEnabledLanguagesOfCurrentInputMethod.size()]);
+ }
+ }
+
+ public Locale getSystemLocale() {
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ return mLanguageSwitcher.getSystemLocale();
+ } else {
+ return mSystemLocale;
+ }
+ }
+
+ public boolean isSystemLanguageSameAsInputLanguage() {
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ 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 (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ // If the system locale changes and is different from the saved
+ // locale (mSystemLocale), then reload the input locale list from the
+ // latin ime settings (shared prefs) and reset the input locale
+ // to the first one.
+ mLanguageSwitcher.loadLocales(mPrefs);
+ mLanguageSwitcher.setSystemLocale(systemLocale);
+ } else {
+ updateAllParameters();
+ }
+ }
+ }
+
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ if (Settings.PREF_SELECTED_LANGUAGES.equals(key)) {
+ mLanguageSwitcher.loadLocales(sharedPreferences);
+ }
+ }
+ }
+
+ /**
+ * Change system locale for this application
+ * @param newLocale
+ * @return oldLocale
+ */
+ public Locale changeSystemLocale(Locale newLocale) {
+ Configuration conf = mResources.getConfiguration();
+ Locale oldLocale = conf.locale;
+ conf.locale = newLocale;
+ mResources.updateConfiguration(conf, mResources.getDisplayMetrics());
+ return oldLocale;
+ }
+
+ public boolean isKeyboardMode() {
+ return KEYBOARD_MODE.equals(mMode);
+ }
+
+
+ ///////////////////////////
+ // Voice Input functions //
+ ///////////////////////////
+
+ public boolean setVoiceInput(VoiceInput vi) {
+ if (mVoiceInput == null && vi != null) {
+ mVoiceInput = vi;
+ if (isVoiceMode()) {
+ if (DBG) {
+ Log.d(TAG, "Set and call voice input.");
+ }
+ triggerVoiceIME();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isVoiceMode() {
+ return VOICE_MODE.equals(mMode);
+ }
+
+ private void triggerVoiceIME() {
+ VoiceIMEConnector.getInstance().startListening(false,
+ KeyboardSwitcher.getInstance().getInputView().getWindowToken(), false);
+ }
+
+ //////////////////////////////////////
+ // SpaceBar Language Switch support //
+ //////////////////////////////////////
+
+ private LanguageSwitcher mLanguageSwitcher;
+
+ public static String getFullDisplayName(Locale locale, boolean returnsNameInThisLocale) {
+ if (returnsNameInThisLocale) {
+ return toTitleCase(locale.getDisplayName(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 (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ return getDisplayLanguage(mLanguageSwitcher.getNextInputLocale());
+ } else {
+ return "";
+ }
+ }
+
+ public String getPreviousInputLanguageName() {
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ return getDisplayLanguage(mLanguageSwitcher.getPrevInputLocale());
+ } else {
+ return "";
+ }
+ }
+
+ // A list of locales which are supported by default for voice input, unless we get a
+ // different list from Gservices.
+ private static final String DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES =
+ "en " +
+ "en_US " +
+ "en_GB " +
+ "en_AU " +
+ "en_CA " +
+ "en_IE " +
+ "en_IN " +
+ "en_NZ " +
+ "en_SG " +
+ "en_ZA ";
+
+ public boolean isVoiceSupported(String locale) {
+ // Get the current list of supported locales and check the current locale against that
+ // list. We cache this value so as not to check it every time the user starts a voice
+ // input. Because this method is called by onStartInputView, this should mean that as
+ // long as the locale doesn't change while the user is keeping the IME open, the
+ // value should never be stale.
+ String supportedLocalesString = SettingsUtil.getSettingsString(
+ mService.getContentResolver(),
+ SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES,
+ DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES);
+ List<String> voiceInputSupportedLocales = Arrays.asList(
+ supportedLocalesString.split("\\s+"));
+ return voiceInputSupportedLocales.contains(locale);
+ }
+
+ public void loadSettings() {
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ mLanguageSwitcher.loadLocales(mPrefs);
+ }
+ }
+
+ public void toggleLanguage(boolean reset, boolean next) {
+ if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
+ if (reset) {
+ mLanguageSwitcher.reset();
+ } else {
+ if (next) {
+ mLanguageSwitcher.next();
+ } else {
+ mLanguageSwitcher.prev();
+ }
+ }
+ mLanguageSwitcher.persist(mPrefs);
+ }
+ }
+
+ private void initLanguageSwitcher(LatinIME service) {
+ final Configuration conf = service.getResources().getConfiguration();
+ mLanguageSwitcher = new LanguageSwitcher(service);
+ mLanguageSwitcher.loadLocales(mPrefs);
+ mLanguageSwitcher.setSystemLocale(conf.locale);
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 3b898941f..a30ec1587 100755..100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -16,24 +16,24 @@
package com.android.inputmethod.latin;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
import android.content.Context;
import android.text.AutoText;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+
/**
* 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";
+
public static final int APPROX_MAX_WORD_LENGTH = 32;
public static final int CORRECTION_NONE = 0;
@@ -81,6 +81,7 @@ public class Suggest implements Dictionary.WordCallback {
private boolean mAutoTextEnabled;
+ private double mAutoCorrectionThreshold;
private int[] mPriorities = new int[mPrefMaxSuggestions];
private int[] mBigramPriorities = new int[PREF_MAX_BIGRAMS];
@@ -94,7 +95,6 @@ public class Suggest implements Dictionary.WordCallback {
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
@@ -163,6 +163,10 @@ public class Suggest implements Dictionary.WordCallback {
mUserBigramDictionary = userBigramDictionary;
}
+ public void setAutoCorrectionThreshold(double threshold) {
+ mAutoCorrectionThreshold = threshold;
+ }
+
/**
* Number of suggestions to generate from the input key sequence. This has
* to be a number between 1 and 100 (inclusive).
@@ -183,43 +187,22 @@ public class Suggest implements Dictionary.WordCallback {
}
}
- private boolean haveSufficientCommonality(String original, CharSequence suggestion) {
- final int originalLength = original.length();
- final int suggestionLength = suggestion.length();
- final int minLength = Math.min(originalLength, suggestionLength);
- if (minLength <= 2) return true;
- int matching = 0;
- int lessMatching = 0; // Count matches if we skip one character
- int i;
- for (i = 0; i < minLength; i++) {
- final char origChar = ExpandableDictionary.toLowerCase(original.charAt(i));
- if (origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i))) {
- matching++;
- lessMatching++;
- } else if (i + 1 < suggestionLength
- && origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i + 1))) {
- lessMatching++;
- }
- }
- matching = Math.max(matching, lessMatching);
-
- if (minLength <= 4) {
- return matching >= 2;
- } else {
- return matching > minLength / 2;
- }
- }
-
/**
- * Returns a list of words that match the list of character codes passed in.
- * This list will be overwritten the next time this function is called.
+ * Returns a object which represents suggested words that match the list of character codes
+ * passed in. This object contents will be overwritten the next time this function is called.
* @param view a view for retrieving the context for AutoText
* @param wordComposer contains what is currently being typed
* @param prevWordForBigram previous word (used only for bigram)
- * @return list of suggestions.
+ * @return suggested words object.
*/
- public List<CharSequence> getSuggestions(View view, WordComposer wordComposer,
- boolean includeTypedWordIfValid, CharSequence prevWordForBigram) {
+ public SuggestedWords getSuggestions(View view, WordComposer wordComposer,
+ CharSequence prevWordForBigram) {
+ return getSuggestedWordBuilder(view, wordComposer, prevWordForBigram).build();
+ }
+
+ // TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder
+ public SuggestedWords.Builder getSuggestedWordBuilder(View view, WordComposer wordComposer,
+ CharSequence prevWordForBigram) {
LatinImeLogger.onStartSuggestion(prevWordForBigram);
mHaveCorrection = false;
mIsFirstCharCapitalized = wordComposer.isFirstCharCapitalized();
@@ -229,13 +212,13 @@ public class Suggest implements Dictionary.WordCallback {
Arrays.fill(mNextLettersFrequencies, 0);
// Save a lowercase version of the original word
- mOriginalWord = wordComposer.getTypedWord();
- if (mOriginalWord != null) {
- final String mOriginalWordString = mOriginalWord.toString();
- mOriginalWord = mOriginalWordString;
- mLowerOriginalWord = mOriginalWordString.toLowerCase();
+ CharSequence typedWord = wordComposer.getTypedWord();
+ if (typedWord != null) {
+ final String typedWordString = typedWord.toString();
+ typedWord = typedWordString;
+ mLowerOriginalWord = typedWordString.toLowerCase();
// Treating USER_TYPED as UNIGRAM suggestion for logging now.
- LatinImeLogger.onAddSuggestedWord(mOriginalWordString, Suggest.DIC_USER_TYPED,
+ LatinImeLogger.onAddSuggestedWord(typedWordString, Suggest.DIC_USER_TYPED,
Dictionary.DataType.UNIGRAM);
} else {
mLowerOriginalWord = "";
@@ -293,7 +276,7 @@ public class Suggest implements Dictionary.WordCallback {
mContactsDictionary.getWords(wordComposer, this, mNextLettersFrequencies);
}
- if (mSuggestions.size() > 0 && isValidWord(mOriginalWord)
+ if (mSuggestions.size() > 0 && isValidWord(typedWord)
&& (mCorrectionMode == CORRECTION_FULL
|| mCorrectionMode == CORRECTION_FULL_BIGRAM)) {
mHaveCorrection = true;
@@ -301,21 +284,23 @@ public class Suggest implements Dictionary.WordCallback {
}
mMainDict.getWords(wordComposer, this, mNextLettersFrequencies);
if ((mCorrectionMode == CORRECTION_FULL || mCorrectionMode == CORRECTION_FULL_BIGRAM)
- && mSuggestions.size() > 0) {
- mHaveCorrection = true;
+ && mSuggestions.size() > 0 && mPriorities.length > 0) {
+ // TODO: when the normalized score of the first suggestion is nearly equals to
+ // the normalized score of the second suggestion, behave less aggressive.
+ final double normalizedScore = Utils.calcNormalizedScore(
+ typedWord, mSuggestions.get(0), mPriorities[0]);
+ if (LatinImeLogger.sDBG) {
+ Log.d(TAG, "Normalized " + typedWord + "," + mSuggestions.get(0) + ","
+ + mPriorities[0] + normalizedScore
+ + "(" + mAutoCorrectionThreshold + ")");
+ }
+ if (normalizedScore >= mAutoCorrectionThreshold) {
+ 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;
- }
+ if (typedWord != null) {
+ mSuggestions.add(0, typedWord.toString());
}
if (mAutoTextEnabled) {
int i = 0;
@@ -326,8 +311,25 @@ public class Suggest implements Dictionary.WordCallback {
String suggestedWord = mSuggestions.get(i).toString().toLowerCase();
CharSequence autoText =
AutoText.get(suggestedWord, 0, suggestedWord.length(), view);
- // Is there an AutoText correction?
+ // Is there an AutoText (also known as Quick Fixes) correction?
boolean canAdd = autoText != null;
+ // Capitalize as needed
+ final int autoTextLength = autoText != null ? autoText.length() : 0;
+ if (autoTextLength > 0 && (mIsAllUpperCase || mIsFirstCharCapitalized)) {
+ int poolSize = mStringPool.size();
+ StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(
+ poolSize - 1) : new StringBuilder(getApproxMaxWordLength());
+ sb.setLength(0);
+ if (mIsAllUpperCase) {
+ sb.append(autoText.toString().toUpperCase());
+ } else if (mIsFirstCharCapitalized) {
+ sb.append(Character.toUpperCase(autoText.charAt(0)));
+ if (autoTextLength > 1) {
+ sb.append(autoText.subSequence(1, autoTextLength));
+ }
+ }
+ autoText = sb.toString();
+ }
// Is that correction already the current prediction (or original word)?
canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i));
// Is that correction already the next predicted word?
@@ -343,7 +345,7 @@ public class Suggest implements Dictionary.WordCallback {
}
}
removeDupes();
- return mSuggestions;
+ return new SuggestedWords.Builder().setWords(mSuggestions);
}
public int[] getNextLettersFrequencies() {
@@ -395,6 +397,7 @@ public class Suggest implements Dictionary.WordCallback {
return false;
}
+ @Override
public boolean addWord(final char[] word, final int offset, final int length, int freq,
final int dicTypeId, final Dictionary.DataType dataType) {
Dictionary.DataType dataTypeForLog = dataType;
@@ -450,8 +453,7 @@ 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)
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..0bb7c66d1
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -0,0 +1,124 @@
+/*
+ * 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.List;
+
+public class SuggestedWords {
+ public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, null);
+
+ public final List<CharSequence> mWords;
+ public final boolean mIsApplicationSpecifiedCompletions;
+ public final boolean mTypedWordValid;
+ public final boolean mHasMinimalSuggestion;
+ public final Object[] mDebugInfo;
+
+ private SuggestedWords(List<CharSequence> words, boolean isApplicationSpecifiedCompletions,
+ boolean typedWordValid, boolean hasMinamlSuggestion, Object[] debugInfo) {
+ if (words != null) {
+ mWords = words;
+ } else {
+ mWords = Collections.emptyList();
+ }
+ mIsApplicationSpecifiedCompletions = isApplicationSpecifiedCompletions;
+ mTypedWordValid = typedWordValid;
+ mHasMinimalSuggestion = hasMinamlSuggestion;
+ mDebugInfo = debugInfo;
+ }
+
+ 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;
+ private boolean mIsCompletions;
+ private boolean mTypedWordVallid;
+ private boolean mHasMinimalSuggestion;
+ private Object[] mDebugInfo;
+
+ public Builder() {
+ // Nothing to do here.
+ }
+
+ public Builder setWords(List<CharSequence> words) {
+ mWords = words;
+ return this;
+ }
+
+ public Builder setDebugInfo(Object[] debuginfo) {
+ mDebugInfo = debuginfo;
+ return this;
+ }
+
+ public Builder addWord(int pos, CharSequence word) {
+ if (mWords == null)
+ mWords = new ArrayList<CharSequence>();
+ mWords.add(pos, word);
+ return this;
+ }
+
+ public Builder addWord(CharSequence word) {
+ if (mWords == null)
+ mWords = new ArrayList<CharSequence>();
+ mWords.add(word);
+ return this;
+ }
+
+ public Builder setApplicationSpecifiedCompletions(CompletionInfo[] infos) {
+ for (CompletionInfo info : infos)
+ addWord(info.getText());
+ mIsCompletions = true;
+ return this;
+ }
+
+ public Builder setTypedWordValid(boolean typedWordValid) {
+ mTypedWordVallid = typedWordValid;
+ return this;
+ }
+
+ public Builder setHasMinimalSuggestion(boolean hasMinamlSuggestion) {
+ mHasMinimalSuggestion = hasMinamlSuggestion;
+ return this;
+ }
+
+ public CharSequence getWord(int pos) {
+ return mWords.get(pos);
+ }
+
+ public SuggestedWords build() {
+ return new SuggestedWords(mWords, mIsCompletions, mTypedWordVallid,
+ mHasMinimalSuggestion, mDebugInfo);
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java
index 9011191f1..f571f26d5 100644
--- a/java/src/com/android/inputmethod/latin/TextEntryState.java
+++ b/java/src/com/android/inputmethod/latin/TextEntryState.java
@@ -16,8 +16,9 @@
package com.android.inputmethod.latin;
+import com.android.inputmethod.keyboard.Key;
+
import android.content.Context;
-import android.inputmethodservice.Keyboard.Key;
import android.text.format.DateFormat;
import android.util.Log;
@@ -61,7 +62,7 @@ public class TextEntryState {
SPACE_AFTER_PICKED,
UNDO_COMMIT,
CORRECTING,
- PICKED_CORRECTION;
+ PICKED_CORRECTION,
}
private static State sState = State.UNKNOWN;
@@ -96,7 +97,7 @@ public class TextEntryState {
}
try {
sKeyLocationFile.close();
- // Write to log file
+ // Write to log file
// Write timestamp, settings,
String out = DateFormat.format("MM:dd hh:mm:ss", Calendar.getInstance().getTime())
.toString()
@@ -112,7 +113,7 @@ public class TextEntryState {
sKeyLocationFile = null;
sUserActionFile = null;
} catch (IOException ioe) {
-
+ // ignore
}
}
@@ -134,16 +135,18 @@ public class TextEntryState {
public static void backToAcceptedDefault(CharSequence typedWord) {
if (typedWord == null) return;
switch (sState) {
- case SPACE_AFTER_ACCEPTED:
- case PUNCTUATION_AFTER_ACCEPTED:
- case IN_WORD:
- sState = State.ACCEPTED_DEFAULT;
- break;
+ case SPACE_AFTER_ACCEPTED:
+ case PUNCTUATION_AFTER_ACCEPTED:
+ case IN_WORD:
+ sState = State.ACCEPTED_DEFAULT;
+ break;
+ default:
+ break;
}
displayState();
}
- public static void acceptedTyped(CharSequence typedWord) {
+ public static void acceptedTyped(@SuppressWarnings("unused") CharSequence typedWord) {
sWordNotInDictionaryCount++;
sState = State.PICKED_SUGGESTION;
displayState();
@@ -168,6 +171,13 @@ public class TextEntryState {
displayState();
}
+ public static void onAbortCorrection() {
+ if (isCorrecting()) {
+ sState = State.START;
+ }
+ displayState();
+ }
+
public static void typedCharacter(char c, boolean isSeparator) {
boolean isSpace = c == ' ';
switch (sState) {
@@ -253,13 +263,13 @@ public class TextEntryState {
}
public static void keyPressedAt(Key key, int x, int y) {
- if (LOGGING && sKeyLocationFile != null && key.codes[0] >= 32) {
- String out =
- "KEY: " + (char) key.codes[0]
- + " X: " + x
+ if (LOGGING && sKeyLocationFile != null && key.mCode >= 32) {
+ String out =
+ "KEY: " + (char) key.mCode
+ + " X: " + x
+ " Y: " + y
- + " MX: " + (key.x + key.width / 2)
- + " MY: " + (key.y + key.height / 2)
+ + " MX: " + (key.mX + key.mWidth / 2)
+ + " MY: " + (key.mY + key.mHeight / 2)
+ "\n";
try {
sKeyLocationFile.write(out.getBytes());
diff --git a/java/src/com/android/inputmethod/latin/Tutorial.java b/java/src/com/android/inputmethod/latin/Tutorial.java
deleted file mode 100644
index d3eaf30c6..000000000
--- a/java/src/com/android/inputmethod/latin/Tutorial.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.Message;
-import android.text.Layout;
-import android.text.SpannableStringBuilder;
-import android.text.StaticLayout;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.widget.PopupWindow;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Tutorial implements OnTouchListener {
-
- private List<Bubble> mBubbles = new ArrayList<Bubble>();
- private View mInputView;
- private LatinIME mIme;
- private int[] mLocation = new int[2];
-
- private static final int MSG_SHOW_BUBBLE = 0;
-
- private int mBubbleIndex;
-
- Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_SHOW_BUBBLE:
- Bubble bubba = (Bubble) msg.obj;
- bubba.show(mLocation[0], mLocation[1]);
- break;
- }
- }
- };
-
- class Bubble {
- Drawable bubbleBackground;
- int x;
- int y;
- int width;
- int gravity;
- CharSequence text;
- boolean dismissOnTouch;
- boolean dismissOnClose;
- PopupWindow window;
- TextView textView;
- View inputView;
-
- Bubble(Context context, View inputView,
- int backgroundResource, int bx, int by, int textResource1, int textResource2) {
- bubbleBackground = context.getResources().getDrawable(backgroundResource);
- x = bx;
- y = by;
- width = (int) (inputView.getWidth() * 0.9);
- this.gravity = Gravity.TOP | Gravity.LEFT;
- text = new SpannableStringBuilder()
- .append(context.getResources().getText(textResource1))
- .append("\n")
- .append(context.getResources().getText(textResource2));
- this.dismissOnTouch = true;
- this.dismissOnClose = false;
- this.inputView = inputView;
- window = new PopupWindow(context);
- window.setBackgroundDrawable(null);
- LayoutInflater inflate =
- (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- textView = (TextView) inflate.inflate(R.layout.bubble_text, null);
- textView.setBackgroundDrawable(bubbleBackground);
- textView.setText(text);
- //textView.setText(textResource1);
- window.setContentView(textView);
- window.setFocusable(false);
- window.setTouchable(true);
- window.setOutsideTouchable(false);
- }
-
- private int chooseSize(PopupWindow pop, View parentView, CharSequence text, TextView tv) {
- int wid = tv.getPaddingLeft() + tv.getPaddingRight();
- int ht = tv.getPaddingTop() + tv.getPaddingBottom();
-
- /*
- * Figure out how big the text would be if we laid it out to the
- * full width of this view minus the border.
- */
- int cap = width - wid;
-
- Layout l = new StaticLayout(text, tv.getPaint(), cap,
- Layout.Alignment.ALIGN_NORMAL, 1, 0, true);
- float max = 0;
- for (int i = 0; i < l.getLineCount(); i++) {
- max = Math.max(max, l.getLineWidth(i));
- }
-
- /*
- * Now set the popup size to be big enough for the text plus the border.
- */
- pop.setWidth(width);
- pop.setHeight(ht + l.getHeight());
- return l.getHeight();
- }
-
- void show(int offx, int offy) {
- int textHeight = chooseSize(window, inputView, text, textView);
- offy -= textView.getPaddingTop() + textHeight;
- if (inputView.getVisibility() == View.VISIBLE
- && inputView.getWindowVisibility() == View.VISIBLE) {
- try {
- if ((gravity & Gravity.BOTTOM) == Gravity.BOTTOM) offy -= window.getHeight();
- if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) offx -= window.getWidth();
- textView.setOnTouchListener(new View.OnTouchListener() {
- public boolean onTouch(View view, MotionEvent me) {
- Tutorial.this.next();
- return true;
- }
- });
- window.showAtLocation(inputView, Gravity.NO_GRAVITY, x + offx, y + offy);
- } catch (Exception e) {
- // Input view is not valid
- }
- }
- }
-
- void hide() {
- if (window.isShowing()) {
- textView.setOnTouchListener(null);
- window.dismiss();
- }
- }
-
- boolean isShowing() {
- return window.isShowing();
- }
- }
-
- public Tutorial(LatinIME ime, LatinKeyboardView inputView) {
- Context context = inputView.getContext();
- mIme = ime;
- int inputWidth = inputView.getWidth();
- final int x = inputWidth / 20; // Half of 1/10th
- Bubble bWelcome = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step02, x, 0,
- R.string.tip_to_open_keyboard, R.string.touch_to_continue);
- mBubbles.add(bWelcome);
- Bubble bAccents = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step02, x, 0,
- R.string.tip_to_view_accents, R.string.touch_to_continue);
- mBubbles.add(bAccents);
- Bubble b123 = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step07, x, 0,
- R.string.tip_to_open_symbols, R.string.touch_to_continue);
- mBubbles.add(b123);
- Bubble bABC = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step07, x, 0,
- R.string.tip_to_close_symbols, R.string.touch_to_continue);
- mBubbles.add(bABC);
- Bubble bSettings = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step07, x, 0,
- R.string.tip_to_launch_settings, R.string.touch_to_continue);
- mBubbles.add(bSettings);
- Bubble bDone = new Bubble(context, inputView,
- R.drawable.dialog_bubble_step02, x, 0,
- R.string.tip_to_start_typing, R.string.touch_to_finish);
- mBubbles.add(bDone);
- mInputView = inputView;
- }
-
- void start() {
- mInputView.getLocationInWindow(mLocation);
- mBubbleIndex = -1;
- mInputView.setOnTouchListener(this);
- next();
- }
-
- boolean next() {
- if (mBubbleIndex >= 0) {
- // If the bubble is not yet showing, don't move to the next.
- if (!mBubbles.get(mBubbleIndex).isShowing()) {
- return true;
- }
- // Hide all previous bubbles as well, as they may have had a delayed show
- for (int i = 0; i <= mBubbleIndex; i++) {
- mBubbles.get(i).hide();
- }
- }
- mBubbleIndex++;
- if (mBubbleIndex >= mBubbles.size()) {
- mInputView.setOnTouchListener(null);
- mIme.sendDownUpKeyEvents(-1); // Inform the setupwizard that tutorial is in last bubble
- mIme.tutorialDone();
- return false;
- }
- if (mBubbleIndex == 3 || mBubbleIndex == 4) {
- mIme.mKeyboardSwitcher.toggleSymbols();
- }
- mHandler.sendMessageDelayed(
- mHandler.obtainMessage(MSG_SHOW_BUBBLE, mBubbles.get(mBubbleIndex)), 500);
- return true;
- }
-
- void hide() {
- for (int i = 0; i < mBubbles.size(); i++) {
- mBubbles.get(i).hide();
- }
- mInputView.setOnTouchListener(null);
- }
-
- boolean close() {
- mHandler.removeMessages(MSG_SHOW_BUBBLE);
- hide();
- return true;
- }
-
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- next();
- }
- return true;
- }
-}
diff --git a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
index 67d9c0bcf..4750fb991 100644
--- a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
@@ -16,10 +16,6 @@
package com.android.inputmethod.latin;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
@@ -30,6 +26,10 @@ import android.os.AsyncTask;
import android.provider.BaseColumns;
import android.util.Log;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+
/**
* Stores all the pairs user types in databases. Prune the database if the size
* gets too big. Unlike AutoDictionary, it even stores the pairs that are already
@@ -108,25 +108,25 @@ public class UserBigramDictionary extends ExpandableDictionary {
private static DatabaseHelper sOpenHelper = null;
private static class Bigram {
- String word1;
- String word2;
- int frequency;
+ public final String mWord1;
+ public final String mWord2;
+ public final int frequency;
Bigram(String word1, String word2, int frequency) {
- this.word1 = word1;
- this.word2 = word2;
+ this.mWord1 = word1;
+ this.mWord2 = word2;
this.frequency = frequency;
}
@Override
public boolean equals(Object bigram) {
Bigram bigram2 = (Bigram) bigram;
- return (word1.equals(bigram2.word1) && word2.equals(bigram2.word2));
+ return (mWord1.equals(bigram2.mWord1) && mWord2.equals(bigram2.mWord2));
}
@Override
public int hashCode() {
- return (word1 + " " + word2).hashCode();
+ return (mWord1 + " " + mWord2).hashCode();
}
}
@@ -357,7 +357,7 @@ public class UserBigramDictionary extends ExpandableDictionary {
Cursor c = db.query(MAIN_TABLE_NAME, new String[] { MAIN_COLUMN_ID },
MAIN_COLUMN_WORD1 + "=? AND " + MAIN_COLUMN_WORD2 + "=? AND "
+ MAIN_COLUMN_LOCALE + "=?",
- new String[] { bi.word1, bi.word2, mLocale }, null, null, null);
+ new String[] { bi.mWord1, bi.mWord2, mLocale }, null, null, null);
int pairId;
if (c.moveToFirst()) {
@@ -368,7 +368,7 @@ public class UserBigramDictionary extends ExpandableDictionary {
} else {
// new pair
Long pairIdLong = db.insert(MAIN_TABLE_NAME, null,
- getContentValues(bi.word1, bi.word2, mLocale));
+ getContentValues(bi.mWord1, bi.mWord2, mLocale));
pairId = pairIdLong.intValue();
}
c.close();
diff --git a/java/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java
index 49b95e9aa..56ee5b9e7 100644
--- a/java/src/com/android/inputmethod/latin/UserDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserDictionary.java
@@ -21,18 +21,21 @@ import android.content.ContentValues;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
+import android.net.Uri;
import android.provider.UserDictionary.Words;
public class UserDictionary extends ExpandableDictionary {
- private static final String[] PROJECTION = {
- Words._ID,
+ private static final String[] PROJECTION_QUERY = {
Words.WORD,
- Words.FREQUENCY
+ Words.FREQUENCY,
};
- private static final int INDEX_WORD = 1;
- private static final int INDEX_FREQUENCY = 2;
+ private static final String[] PROJECTION_ADD = {
+ Words._ID,
+ Words.FREQUENCY,
+ Words.LOCALE,
+ };
private ContentObserver mObserver;
private String mLocale;
@@ -66,7 +69,7 @@ public class UserDictionary extends ExpandableDictionary {
@Override
public void loadDictionaryAsync() {
Cursor cursor = getContext().getContentResolver()
- .query(Words.CONTENT_URI, PROJECTION, "(locale IS NULL) or (locale=?)",
+ .query(Words.CONTENT_URI, PROJECTION_QUERY, "(locale IS NULL) or (locale=?)",
new String[] { mLocale }, null);
addWords(cursor);
}
@@ -80,7 +83,7 @@ public class UserDictionary extends ExpandableDictionary {
* @TODO use a higher or float range for frequency
*/
@Override
- public synchronized void addWord(String word, int frequency) {
+ public synchronized void addWord(final String word, final int frequency) {
// Force load the dictionary here synchronously
if (getRequiresReload()) loadDictionaryAsync();
// Safeguard against adding long words. Can cause stack overflow.
@@ -97,8 +100,24 @@ public class UserDictionary extends ExpandableDictionary {
final ContentResolver contentResolver = getContext().getContentResolver();
new Thread("addWord") {
+ @Override
public void run() {
- contentResolver.insert(Words.CONTENT_URI, values);
+ Cursor cursor = contentResolver.query(Words.CONTENT_URI, PROJECTION_ADD,
+ "word=? and ((locale IS NULL) or (locale=?))",
+ new String[] { word, mLocale }, null);
+ if (cursor != null && cursor.moveToFirst()) {
+ String locale = cursor.getString(cursor.getColumnIndex(Words.LOCALE));
+ // If locale is null, we will not override the entry.
+ if (locale != null && locale.equals(mLocale.toString())) {
+ long id = cursor.getLong(cursor.getColumnIndex(Words._ID));
+ Uri uri = Uri.withAppendedPath(Words.CONTENT_URI, Long.toString(id));
+ // Update the entry with new frequency value.
+ contentResolver.update(uri, values, null, null);
+ }
+ } else {
+ // Insert new entry.
+ contentResolver.insert(Words.CONTENT_URI, values);
+ }
}
}.start();
@@ -122,9 +141,11 @@ public class UserDictionary extends ExpandableDictionary {
final int maxWordLength = getMaxWordLength();
if (cursor.moveToFirst()) {
+ final int indexWord = cursor.getColumnIndex(Words.WORD);
+ final int indexFrequency = cursor.getColumnIndex(Words.FREQUENCY);
while (!cursor.isAfterLast()) {
- String word = cursor.getString(INDEX_WORD);
- int frequency = cursor.getInt(INDEX_FREQUENCY);
+ String word = cursor.getString(indexWord);
+ int frequency = cursor.getInt(indexFrequency);
// Safeguard against adding really long words. Stack may overflow due
// to recursion
if (word.length() < maxWordLength) {
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
new file mode 100644
index 000000000..5c6980926
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -0,0 +1,395 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.latin;
+
+import android.inputmethodservice.InputMethodService;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.text.format.DateUtils;
+import android.util.Log;
+import android.view.inputmethod.InputMethodManager;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class Utils {
+
+ /**
+ * Cancel an {@link AsyncTask}.
+ *
+ * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this
+ * task should be interrupted; otherwise, in-progress tasks are allowed
+ * to complete.
+ */
+ public static void cancelTask(AsyncTask<?, ?, ?> task, boolean mayInterruptIfRunning) {
+ if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) {
+ task.cancel(mayInterruptIfRunning);
+ }
+ }
+
+ public static class GCUtils {
+ private static final String TAG = "GCUtils";
+ public static final int GC_TRY_COUNT = 2;
+ // GC_TRY_LOOP_MAX is used for the hard limit of GC wait,
+ // GC_TRY_LOOP_MAX should be greater than GC_TRY_COUNT.
+ public static final int GC_TRY_LOOP_MAX = 5;
+ private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS;
+ private static GCUtils sInstance = new GCUtils();
+ private int mGCTryCount = 0;
+
+ public static GCUtils getInstance() {
+ return sInstance;
+ }
+
+ public void reset() {
+ mGCTryCount = 0;
+ }
+
+ public boolean tryGCOrWait(String metaData, Throwable t) {
+ if (mGCTryCount == 0) {
+ System.gc();
+ }
+ if (++mGCTryCount > GC_TRY_COUNT) {
+ LatinImeLogger.logOnException(metaData, t);
+ return false;
+ } else {
+ try {
+ Thread.sleep(GC_INTERVAL);
+ return true;
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Sleep was interrupted.");
+ LatinImeLogger.logOnException(metaData, t);
+ return false;
+ }
+ }
+ }
+ }
+
+ public static boolean hasMultipleEnabledIMEsOrSubtypes(InputMethodManager imm) {
+ return imm.getEnabledInputMethodList().size() > 1
+ // imm.getEnabledInputMethodSubtypeList(null) will return the current IME's enabled input
+ // method subtype (The current IME should be LatinIME.)
+ || imm.getEnabledInputMethodSubtypeList(null).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 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 (s.charAt(i) == t.charAt(j)) {
+ dp[i + 1][j + 1] = dp[i][j];
+ } else {
+ dp[i + 1][j + 1] = 1 + Math.min(dp[i][j],
+ Math.min(dp[i + 1][j], dp[i][j + 1]));
+ }
+ }
+ }
+ return dp[sl][tl];
+ }
+
+ // In dictionary.cpp, getSuggestion() method,
+ // suggestion scores are computed using the below formula.
+ // original score (called 'frequency')
+ // := pow(mTypedLetterMultiplier (this is defined 2),
+ // (the number of matched characters between typed word and suggested word))
+ // * (individual word's score which defined in the unigram dictionary,
+ // and this score is defined in range [0, 255].)
+ // * (when before.length() == after.length(),
+ // mFullWordMultiplier (this is defined 2))
+ // So, maximum original score is pow(2, before.length()) * 255 * 2
+ // So, we can normalize original score by dividing this value.
+ private static final int MAX_INITIAL_SCORE = 255;
+ private static final int TYPED_LETTER_MULTIPLIER = 2;
+ private static final int FULL_WORD_MULTIPLYER = 2;
+ public static double calcNormalizedScore(CharSequence before, CharSequence after, int score) {
+ final int beforeLength = before.length();
+ final int afterLength = after.length();
+ final int distance = editDistance(before, after);
+ final double maximumScore = MAX_INITIAL_SCORE
+ * Math.pow(TYPED_LETTER_MULTIPLIER, beforeLength)
+ * FULL_WORD_MULTIPLYER;
+ // add a weight based on edit distance.
+ // distance <= max(afterLength, beforeLength) == afterLength,
+ // so, 0 <= distance / afterLength <= 1
+ final double weight = 1.0 - (double) distance / afterLength;
+ return (score / maximumScore) * weight;
+ }
+
+ public static class UsabilityStudyLogUtils {
+ private static final String TAG = "UsabilityStudyLogUtils";
+ private static final String FILENAME = "log.txt";
+ private static final UsabilityStudyLogUtils sInstance =
+ new UsabilityStudyLogUtils();
+ private final Handler mLoggingHandler;
+ private File mFile;
+ private File mDirectory;
+ private InputMethodService mIms;
+ private PrintWriter mWriter;
+ private final Date mDate;
+ private final SimpleDateFormat mDateFormat;
+
+ private UsabilityStudyLogUtils() {
+ mDate = new Date();
+ mDateFormat = new SimpleDateFormat("dd MMM HH:mm:ss.SSS");
+
+ HandlerThread handlerThread = new HandlerThread("UsabilityStudyLogUtils logging task",
+ Process.THREAD_PRIORITY_BACKGROUND);
+ handlerThread.start();
+ mLoggingHandler = new Handler(handlerThread.getLooper());
+ }
+
+ public static UsabilityStudyLogUtils getInstance() {
+ return sInstance;
+ }
+
+ public void init(InputMethodService ims) {
+ mIms = ims;
+ mDirectory = ims.getFilesDir();
+ }
+
+ private void createLogFileIfNotExist() {
+ if ((mFile == null || !mFile.exists())
+ && (mDirectory != null && mDirectory.exists())) {
+ try {
+ mWriter = getPrintWriter(mDirectory, FILENAME, false);
+ } catch (IOException e) {
+ Log.e(TAG, "Can't create log file.");
+ }
+ }
+ }
+
+ public void writeBackSpace() {
+ UsabilityStudyLogUtils.getInstance().write("<backspace>\t0\t0");
+ }
+
+ public void writeChar(char c, int x, int y) {
+ String inputChar = String.valueOf(c);
+ switch (c) {
+ case '\n':
+ inputChar = "<enter>";
+ break;
+ case '\t':
+ inputChar = "<tab>";
+ break;
+ case ' ':
+ inputChar = "<space>";
+ break;
+ }
+ UsabilityStudyLogUtils.getInstance().write(inputChar + "\t" + x + "\t" + y);
+ LatinImeLogger.onPrintAllUsabilityStudtyLogs();
+ }
+
+ public void write(final String log) {
+ mLoggingHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ createLogFileIfNotExist();
+ final long currentTime = System.currentTimeMillis();
+ mDate.setTime(currentTime);
+
+ final String printString = String.format("%s\t%d\t%s\n",
+ mDateFormat.format(mDate), currentTime, log);
+ if (LatinImeLogger.sDBG) {
+ Log.d(TAG, "Write: " + log);
+ }
+ mWriter.print(printString);
+ }
+ });
+ }
+
+ public void printAll() {
+ mLoggingHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mWriter.flush();
+ StringBuilder sb = new StringBuilder();
+ BufferedReader br = getBufferedReader();
+ String line;
+ try {
+ while ((line = br.readLine()) != null) {
+ sb.append('\n');
+ sb.append(line);
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Can't read log file.");
+ } finally {
+ if (LatinImeLogger.sDBG) {
+ Log.d(TAG, "output all logs\n" + sb.toString());
+ }
+ mIms.getCurrentInputConnection().commitText(sb.toString(), 0);
+ try {
+ br.close();
+ } catch (IOException e) {
+ // ignore.
+ }
+ }
+ }
+ });
+ }
+
+ public void clearAll() {
+ mLoggingHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mFile != null && mFile.exists()) {
+ if (LatinImeLogger.sDBG) {
+ Log.d(TAG, "Delete log file.");
+ }
+ mFile.delete();
+ mWriter.close();
+ }
+ }
+ });
+ }
+
+ private BufferedReader getBufferedReader() {
+ createLogFileIfNotExist();
+ try {
+ return new BufferedReader(new FileReader(mFile));
+ } catch (FileNotFoundException e) {
+ return null;
+ }
+ }
+
+ private PrintWriter getPrintWriter(
+ File dir, String filename, boolean renew) throws IOException {
+ mFile = new File(dir, filename);
+ if (mFile.exists()) {
+ if (renew) {
+ mFile.delete();
+ }
+ }
+ return new PrintWriter(new FileOutputStream(mFile), true /* autoFlush */);
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/voice/FieldContext.java b/java/src/com/android/inputmethod/voice/FieldContext.java
index 5fbacfb6c..dfdfbaa9f 100644
--- a/java/src/com/android/inputmethod/voice/FieldContext.java
+++ b/java/src/com/android/inputmethod/voice/FieldContext.java
@@ -73,6 +73,7 @@ public class FieldContext {
bundle.putInt(IME_OPTIONS, info.imeOptions);
}
+ @SuppressWarnings("static-access")
private static void addInputConnectionToBundle(
InputConnection conn, Bundle bundle) {
if (conn == null) {
@@ -96,6 +97,7 @@ public class FieldContext {
return mFieldInfo;
}
+ @Override
public String toString() {
return mFieldInfo.toString();
}
diff --git a/java/src/com/android/inputmethod/latin/Hints.java b/java/src/com/android/inputmethod/voice/Hints.java
index c467365e7..d11d3b042 100644
--- a/java/src/com/android/inputmethod/latin/Hints.java
+++ b/java/src/com/android/inputmethod/voice/Hints.java
@@ -14,14 +14,14 @@
* the License.
*/
-package com.android.inputmethod.latin;
+package com.android.inputmethod.voice;
-import com.android.inputmethod.voice.SettingsUtil;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SharedPreferencesCompat;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
import android.view.inputmethod.InputConnection;
import java.util.Calendar;
@@ -47,8 +47,9 @@ public class Hints {
private static final int DEFAULT_SWIPE_HINT_MAX_DAYS_TO_SHOW = 7;
private static final int DEFAULT_PUNCTUATION_HINT_MAX_DISPLAYS = 7;
- private Context mContext;
- private Display mDisplay;
+ private final Context mContext;
+ private final SharedPreferences mPrefs;
+ private final Display mDisplay;
private boolean mVoiceResultContainedPunctuation;
private int mSwipeHintMaxDaysToShow;
private int mPunctuationHintMaxDisplays;
@@ -62,8 +63,9 @@ public class Hints {
SPEAKABLE_PUNCTUATION.put("?", "question mark");
}
- public Hints(Context context, Display display) {
+ public Hints(Context context, SharedPreferences prefs, Display display) {
mContext = context;
+ mPrefs = prefs;
mDisplay = display;
ContentResolver cr = mContext.getContentResolver();
@@ -103,8 +105,7 @@ public class Hints {
public void registerVoiceResult(String text) {
// Update the current time as the last time voice input was used.
- SharedPreferences.Editor editor =
- PreferenceManager.getDefaultSharedPreferences(mContext).edit();
+ SharedPreferences.Editor editor = mPrefs.edit();
editor.putLong(PREF_VOICE_INPUT_LAST_TIME_USED, System.currentTimeMillis());
SharedPreferencesCompat.apply(editor);
@@ -118,14 +119,14 @@ public class Hints {
}
private boolean shouldShowSwipeHint() {
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+ final SharedPreferences prefs = mPrefs;
- int numUniqueDaysShown = sp.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
+ int numUniqueDaysShown = prefs.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
// If we've already shown the hint for enough days, we'll return false.
if (numUniqueDaysShown < mSwipeHintMaxDaysToShow) {
- long lastTimeVoiceWasUsed = sp.getLong(PREF_VOICE_INPUT_LAST_TIME_USED, 0);
+ long lastTimeVoiceWasUsed = prefs.getLong(PREF_VOICE_INPUT_LAST_TIME_USED, 0);
// If the user has used voice today, we'll return false. (We don't show the hint on
// any day that the user has already used voice.)
@@ -156,16 +157,16 @@ public class Hints {
}
private void showHint(int hintViewResource) {
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+ final SharedPreferences prefs = mPrefs;
- int numUniqueDaysShown = sp.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
- long lastTimeHintWasShown = sp.getLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, 0);
+ int numUniqueDaysShown = prefs.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
+ long lastTimeHintWasShown = prefs.getLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, 0);
// If this is the first time the hint is being shown today, increase the saved values
// to represent that. We don't need to increase the last time the hint was shown unless
// it is a different day from the current value.
if (!isFromToday(lastTimeHintWasShown)) {
- SharedPreferences.Editor editor = sp.edit();
+ SharedPreferences.Editor editor = prefs.edit();
editor.putInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, numUniqueDaysShown + 1);
editor.putLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, System.currentTimeMillis());
SharedPreferencesCompat.apply(editor);
@@ -177,9 +178,9 @@ public class Hints {
}
private int getAndIncrementPref(String pref) {
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
- int value = sp.getInt(pref, 0);
- SharedPreferences.Editor editor = sp.edit();
+ final SharedPreferences prefs = mPrefs;
+ int value = prefs.getInt(pref, 0);
+ SharedPreferences.Editor editor = prefs.edit();
editor.putInt(pref, value + 1);
SharedPreferencesCompat.apply(editor);
return value;
diff --git a/java/src/com/android/inputmethod/voice/RecognitionView.java b/java/src/com/android/inputmethod/voice/RecognitionView.java
index 7cec0b04a..12d0de852 100644
--- a/java/src/com/android/inputmethod/voice/RecognitionView.java
+++ b/java/src/com/android/inputmethod/voice/RecognitionView.java
@@ -16,12 +16,7 @@
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 android.content.ContentResolver;
import android.content.Context;
@@ -43,7 +38,12 @@ 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.ArrayList;
+import java.util.List;
/**
* The user interface for the "Speak now" and "working" states.
@@ -51,6 +51,7 @@ 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
@@ -78,6 +79,7 @@ public class RecognitionView {
/** Updates the microphone icon to show user their volume.*/
private Runnable mUpdateVolumeRunnable = new Runnable() {
+ @Override
public void run() {
if (mState != State.LISTENING) {
return;
@@ -141,6 +143,7 @@ public class RecognitionView {
public void restoreState() {
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
// Restart the spinner
if (mState == State.WORKING) {
@@ -153,6 +156,7 @@ 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));
@@ -162,6 +166,7 @@ public class RecognitionView {
public void showListening() {
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
mState = State.LISTENING;
prepareDialog(false, mContext.getText(R.string.voice_listening), mSpeakNow.get(0),
@@ -177,6 +182,7 @@ public class RecognitionView {
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));
@@ -190,6 +196,7 @@ public class RecognitionView {
final int speechEndPosition) {
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
mState = State.WORKING;
prepareDialog(true, mContext.getText(R.string.voice_working), null, mContext
@@ -309,6 +316,7 @@ public class RecognitionView {
public void finish() {
mUiHandler.post(new Runnable() {
+ @Override
public void run() {
mState = State.READY;
exitWorking();
diff --git a/java/src/com/android/inputmethod/voice/SettingsUtil.java b/java/src/com/android/inputmethod/voice/SettingsUtil.java
index abf52047f..4d746e120 100644
--- a/java/src/com/android/inputmethod/voice/SettingsUtil.java
+++ b/java/src/com/android/inputmethod/voice/SettingsUtil.java
@@ -17,10 +17,7 @@
package com.android.inputmethod.voice;
import android.content.ContentResolver;
-import android.database.Cursor;
-import android.net.Uri;
import android.provider.Settings;
-import android.util.Log;
/**
* Utility for retrieving settings from Settings.Secure.
diff --git a/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java b/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java
new file mode 100644
index 000000000..c532a0baf
--- /dev/null
+++ b/java/src/com/android/inputmethod/voice/VoiceIMEConnector.java
@@ -0,0 +1,692 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.voice;
+
+import com.android.inputmethod.latin.EditingUtils;
+import com.android.inputmethod.latin.LatinIME;
+import com.android.inputmethod.latin.LatinIME.UIHandler;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SharedPreferencesCompat;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+import com.android.inputmethod.latin.SuggestedWords;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.IBinder;
+import android.preference.PreferenceManager;
+import android.provider.Browser;
+import android.speech.SpeechRecognizer;
+import android.text.Layout;
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.TextUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.text.style.URLSpan;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.ExtractedTextRequest;
+import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class VoiceIMEConnector implements VoiceInput.UiListener {
+ private static final VoiceIMEConnector sInstance = new VoiceIMEConnector();
+
+ public static final boolean VOICE_INSTALLED = true;
+ private static final boolean ENABLE_VOICE_BUTTON = true;
+ private static final String PREF_VOICE_MODE = "voice_mode";
+ // Whether or not the user has used voice input before (and thus, whether to show the
+ // first-run warning dialog or not).
+ private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input";
+ // Whether or not the user has used voice input from an unsupported locale UI before.
+ // For example, the user has a Chinese UI but activates voice input.
+ private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE =
+ "has_used_voice_input_unsupported_locale";
+ // The private IME option used to indicate that no microphone should be shown for a
+ // given text field. For instance this is specified by the search dialog when the
+ // dialog is already showing a voice search button.
+ private static final String IME_OPTION_NO_MICROPHONE = "nm";
+
+ private 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 mContext;
+ 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 context, SharedPreferences prefs, UIHandler h) {
+ mContext = context;
+ mHandler = h;
+ mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ mSubtypeSwitcher = SubtypeSwitcher.getInstance();
+ if (VOICE_INSTALLED) {
+ mVoiceInput = new VoiceInput(context, this);
+ mHints = new Hints(context, prefs, new Hints.Display() {
+ @Override
+ public void showHint(int viewResource) {
+ LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(viewResource, null);
+ mContext.setCandidatesView(view);
+ mContext.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, mContext.getCurrentInputConnection());
+ }
+ }
+
+ private void showVoiceWarningDialog(final boolean swipe, IBinder token,
+ final boolean configurationChanging) {
+ if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) {
+ return;
+ }
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ 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, configurationChanging);
+ }
+ });
+ 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(
+ mContext.getText(R.string.voice_warning_may_not_understand), "\n\n",
+ mContext.getText(R.string.voice_warning_how_to_turn_off));
+ } else {
+ message = TextUtils.concat(
+ mContext.getText(R.string.voice_warning_locale_not_supported), "\n\n",
+ mContext.getText(R.string.voice_warning_may_not_understand), "\n\n",
+ mContext.getText(R.string.voice_warning_how_to_turn_off));
+ }
+ builder.setMessage(message);
+
+ builder.setTitle(R.string.voice_warning_title);
+ mVoiceWarningDialog = builder.create();
+ Window window = mVoiceWarningDialog.getWindow();
+ WindowManager.LayoutParams lp = window.getAttributes();
+ lp.token = token;
+ lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+ window.setAttributes(lp);
+ window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ mVoiceInput.logKeyboardWarningDialogShown();
+ mVoiceWarningDialog.show();
+ // Make URL in the dialog message clickable
+ TextView textView = (TextView) mVoiceWarningDialog.findViewById(android.R.id.message);
+ if (textView != null) {
+ final CustomLinkMovementMethod method = CustomLinkMovementMethod.getInstance();
+ method.setVoiceWarningDialog(mVoiceWarningDialog);
+ textView.setMovementMethod(method);
+ }
+ }
+
+ private static class CustomLinkMovementMethod extends LinkMovementMethod {
+ private static CustomLinkMovementMethod sLinkMovementMethodInstance =
+ new CustomLinkMovementMethod();
+ private AlertDialog mAlertDialog;
+
+ public void setVoiceWarningDialog(AlertDialog alertDialog) {
+ mAlertDialog = alertDialog;
+ }
+
+ public static CustomLinkMovementMethod getInstance() {
+ return sLinkMovementMethodInstance;
+ }
+
+ // Almost the same as LinkMovementMethod.onTouchEvent(), but overrides it for
+ // FLAG_ACTIVITY_NEW_TASK and mAlertDialog.cancel().
+ @Override
+ public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
+ int action = event.getAction();
+
+ if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
+ int x = (int) event.getX();
+ int y = (int) event.getY();
+
+ x -= widget.getTotalPaddingLeft();
+ y -= widget.getTotalPaddingTop();
+
+ x += widget.getScrollX();
+ y += widget.getScrollY();
+
+ Layout layout = widget.getLayout();
+ int line = layout.getLineForVertical(y);
+ int off = layout.getOffsetForHorizontal(line, x);
+
+ ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
+
+ if (link.length != 0) {
+ if (action == MotionEvent.ACTION_UP) {
+ if (link[0] instanceof URLSpan) {
+ URLSpan urlSpan = (URLSpan) link[0];
+ Uri uri = Uri.parse(urlSpan.getURL());
+ Context context = widget.getContext();
+ Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
+ if (mAlertDialog != null) {
+ // Go back to the previous IME for now.
+ // TODO: If we can find a way to bring the new activity to front
+ // while keeping the warning dialog, we don't need to cancel here.
+ mAlertDialog.cancel();
+ }
+ context.startActivity(intent);
+ } else {
+ link[0].onClick(widget);
+ }
+ } else if (action == MotionEvent.ACTION_DOWN) {
+ Selection.setSelection(buffer, buffer.getSpanStart(link[0]),
+ buffer.getSpanEnd(link[0]));
+ }
+ return true;
+ } else {
+ Selection.removeSelection(buffer);
+ }
+ }
+ return super.onTouchEvent(widget, buffer, event);
+ }
+ }
+
+ public void showPunctuationHintIfNecessary() {
+ InputConnection ic = mContext.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 = mContext.getCurrentInputConnection();
+ if (ic != null) ic.commitText("", 1);
+ mContext.updateSuggestions();
+ mVoiceInputHighlighted = false;
+ }
+
+ public void commitVoiceInput() {
+ if (VOICE_INSTALLED && mVoiceInputHighlighted) {
+ InputConnection ic = mContext.getCurrentInputConnection();
+ if (ic != null) ic.finishComposingText();
+ mContext.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(
+ mContext.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.setWords(suggestions);
+ }
+ builder.setTypedWordValid(true).setHasMinimalSuggestion(true);
+ mContext.setSuggestions(builder.build());
+ mContext.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 = mContext.getCurrentInputConnection();
+ if (!mContext.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);
+ }
+ }
+ mContext.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
+ mContext.commitTyped(ic);
+ EditingUtils.appendText(ic, bestResult);
+ if (ic != null) ic.endBatchEdit();
+
+ mVoiceInputHighlighted = true;
+ mWordToSuggestions.putAll(mVoiceResults.alternatives);
+ onCancelVoice();
+ }
+
+ public void switchToRecognitionStatusView(final boolean configurationChanging) {
+ final boolean configChanged = configurationChanging;
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mContext.setCandidatesViewShown(false);
+ mRecognizing = true;
+ View v = mVoiceInput.getView();
+ ViewParent p = v.getParent();
+ if (p != null && p instanceof ViewGroup) {
+ ((ViewGroup)p).removeView(v);
+ }
+ mContext.setInputView(v);
+ mContext.updateInputViewShown();
+ if (configChanged) {
+ mVoiceInput.onConfigurationChanged();
+ }
+ }});
+ }
+
+ private void switchToLastInputMethod() {
+ IBinder token = mContext.getWindow().getWindow().getAttributes().token;
+ mImm.switchToLastInputMethod(token);
+ }
+
+ private void reallyStartListening(boolean swipe, final boolean configurationChanging) {
+ 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(mContext).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(mContext).edit();
+ editor.putBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, true);
+ SharedPreferencesCompat.apply(editor);
+ mHasUsedVoiceInputUnsupportedLocale = true;
+ }
+
+ // Clear N-best suggestions
+ mContext.clearSuggestions();
+
+ FieldContext context = makeFieldContext();
+ mVoiceInput.startListening(context, swipe);
+ switchToRecognitionStatusView(configurationChanging);
+ }
+
+ public void startListening(final boolean swipe, IBinder token,
+ final boolean configurationChanging) {
+ // 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, configurationChanging);
+ } else {
+ reallyStartListening(swipe, configurationChanging);
+ }
+ }
+ }
+
+
+ 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(mContext);
+ }
+
+ 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,
+ mContext.getString(R.string.voice_mode_main));
+ mVoiceButtonEnabled = !voiceMode.equals(mContext.getString(R.string.voice_mode_off))
+ && shouldShowVoiceButton(makeFieldContext(), attribute);
+ mVoiceButtonOnPrimary = voiceMode.equals(mContext.getString(R.string.voice_mode_main));
+ }
+ }
+
+ public void destroy() {
+ if (VOICE_INSTALLED && mVoiceInput != null) {
+ mVoiceInput.destroy();
+ }
+ }
+
+ public void onStartInputView(IBinder token) {
+ // If IME is in voice mode, but still needs to show the voice warning dialog,
+ // keep showing the warning.
+ if (mSubtypeSwitcher.isVoiceMode() && needsToShowWarningDialog() && token != null) {
+ showVoiceWarningDialog(false, token, false);
+ }
+ }
+
+ public void onAttachedToWindow() {
+ // After onAttachedToWindow, we can show the voice warning dialog. See startListening()
+ // above.
+ mSubtypeSwitcher.setVoiceInput(mVoiceInput);
+ }
+
+ public void onConfigurationChanged(boolean configurationChanging) {
+ if (mRecognizing) {
+ switchToRecognitionStatusView(configurationChanging);
+ }
+ }
+
+ @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;
+ mContext.switchToKeyboardView();
+ }
+ }
+ }
+
+ @Override
+ public void onVoiceResults(List<String> candidates,
+ Map<String, List<CharSequence>> alternatives) {
+ if (!mRecognizing) {
+ return;
+ }
+ mVoiceResults.candidates = candidates;
+ mVoiceResults.alternatives = alternatives;
+ mHandler.updateVoiceResults();
+ }
+
+ public FieldContext makeFieldContext() {
+ SubtypeSwitcher switcher = SubtypeSwitcher.getInstance();
+ return new FieldContext(mContext.getCurrentInputConnection(),
+ mContext.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..f77b4dd0d 100644
--- a/java/src/com/android/inputmethod/voice/VoiceInput.java
+++ b/java/src/com/android/inputmethod/voice/VoiceInput.java
@@ -16,7 +16,7 @@
package com.android.inputmethod.voice;
-import com.android.inputmethod.latin.EditingUtil;
+import com.android.inputmethod.latin.EditingUtils;
import com.android.inputmethod.latin.R;
import android.content.ContentResolver;
@@ -28,12 +28,12 @@ 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;
@@ -86,6 +86,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";
@@ -240,7 +241,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.
@@ -405,6 +406,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 +429,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(),
@@ -556,36 +557,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 +648,12 @@ public class VoiceInput implements OnClickListener {
mRecognitionView.finish();
}
+ @Override
public void onPartialResults(final Bundle partialResults) {
// currently - do nothing
}
+ @Override
public void onEvent(int eventType, Bundle params) {
// do nothing - reserved for events that might be added in the future
}
diff --git a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
index 0d21133e0..3e65434a2 100644
--- a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
+++ b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
@@ -31,6 +31,7 @@ import android.content.Intent;
* on on the VoiceSearch side.
*/
public class VoiceInputLogger {
+ @SuppressWarnings("unused")
private static final String TAG = VoiceInputLogger.class.getSimpleName();
private static VoiceInputLogger sVoiceInputLogger;
@@ -205,14 +206,16 @@ public class VoiceInputLogger {
mContext.sendBroadcast(i);
}
+
public void textModifiedByChooseSuggestion(int suggestionLength, int replacedPhraseLength,
int index, String before, String after) {
setHasLoggingInfo(true);
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
- i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
- LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_CHOOSE_SUGGESTION);
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, suggestionLength);
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_REPLACED_LENGTH, replacedPhraseLength);
+ i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
+ LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_CHOOSE_SUGGESTION);
+
i.putExtra(LoggingEvents.VoiceIme.EXTRA_N_BEST_CHOOSE_INDEX, index);
i.putExtra(LoggingEvents.VoiceIme.EXTRA_BEFORE_N_BEST_CHOOSE, before);
i.putExtra(LoggingEvents.VoiceIme.EXTRA_AFTER_N_BEST_CHOOSE, after);
diff --git a/java/src/com/android/inputmethod/voice/WaveformImage.java b/java/src/com/android/inputmethod/voice/WaveformImage.java
index 08d87c8f3..8bac669fc 100644
--- a/java/src/com/android/inputmethod/voice/WaveformImage.java
+++ b/java/src/com/android/inputmethod/voice/WaveformImage.java
@@ -33,7 +33,9 @@ import java.nio.ShortBuffer;
public class WaveformImage {
private static final int SAMPLING_RATE = 8000;
- private WaveformImage() {}
+ private WaveformImage() {
+ // Intentional empty constructor.
+ }
public static Bitmap drawWaveform(
ByteArrayOutputStream waveBuffer, int w, int h, int start, int end) {
diff --git a/java/src/com/android/inputmethod/voice/Whitelist.java b/java/src/com/android/inputmethod/voice/Whitelist.java
index 167b688ca..f4c24de0c 100644
--- a/java/src/com/android/inputmethod/voice/Whitelist.java
+++ b/java/src/com/android/inputmethod/voice/Whitelist.java
@@ -17,6 +17,7 @@
package com.android.inputmethod.voice;
import android.os.Bundle;
+
import java.util.ArrayList;
import java.util.List;