diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png index 50cc49fdb..01fc8ca78 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png index dabf77ec6..af4017e2c 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png index 6e7d74c88..4c35aca95 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png index ddb77c224..174f3452c 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png index 1e9227e1c..1fcbd9a88 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png index 7207b2ece..072753f37 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png index a524168c9..b6c234c04 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png index 4395e978a..73a8cd1c3 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png index 9d85c7b74..1ad746053 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png index 2ed1b3447..e3a77d61b 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png index 77e17dbae..431c44967 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png index a409639e7..ccd59d5fa 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png index 6ec7e6592..42c7c146d 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png index 995780cbf..01e2506b0 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png index 1388b6694..fad0ec458 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png index 7215782eb..83c6eb3fc 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png index 5a94cb6ac..215f8157c 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png index c6373a8af..88acdd748 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png index 0bd49a0e7..e047eaff1 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png index 634419f1b..218a2d29e 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png differ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png index 8474f9f42..afe49512e 100644 Binary files a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png and b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png differ diff --git a/java/res/drawable-hdpi/cancel.png b/java/res/drawable-hdpi/cancel.png index fdf01dba6..506cf99d0 100644 Binary files a/java/res/drawable-hdpi/cancel.png and b/java/res/drawable-hdpi/cancel.png differ diff --git a/java/res/drawable-hdpi/candidate_feedback_background.9.png b/java/res/drawable-hdpi/candidate_feedback_background.9.png index 16499002e..203c4e640 100644 Binary files a/java/res/drawable-hdpi/candidate_feedback_background.9.png and b/java/res/drawable-hdpi/candidate_feedback_background.9.png differ diff --git a/java/res/drawable-hdpi/caution.png b/java/res/drawable-hdpi/caution.png index caed9419d..5cb6c54b9 100644 Binary files a/java/res/drawable-hdpi/caution.png and b/java/res/drawable-hdpi/caution.png differ diff --git a/java/res/drawable-hdpi/dialog_bubble_step02.9.png b/java/res/drawable-hdpi/dialog_bubble_step02.9.png index 2a3ac18c0..b338364c5 100644 Binary files a/java/res/drawable-hdpi/dialog_bubble_step02.9.png and b/java/res/drawable-hdpi/dialog_bubble_step02.9.png differ diff --git a/java/res/drawable-hdpi/dialog_bubble_step07.9.png b/java/res/drawable-hdpi/dialog_bubble_step07.9.png index 0a5046b07..94b915432 100644 Binary files a/java/res/drawable-hdpi/dialog_bubble_step07.9.png and b/java/res/drawable-hdpi/dialog_bubble_step07.9.png differ diff --git a/java/res/drawable-hdpi/highlight_pressed.png b/java/res/drawable-hdpi/highlight_pressed.png index 638df19bc..ae04901a0 100644 Binary files a/java/res/drawable-hdpi/highlight_pressed.png and b/java/res/drawable-hdpi/highlight_pressed.png differ diff --git a/java/res/drawable-hdpi/hint_popup.9.png b/java/res/drawable-hdpi/hint_popup.9.png index 5b2ad5388..b5ec003e6 100644 Binary files a/java/res/drawable-hdpi/hint_popup.9.png and b/java/res/drawable-hdpi/hint_popup.9.png differ diff --git a/java/res/drawable-hdpi/ic_dialog_keyboard.png b/java/res/drawable-hdpi/ic_dialog_keyboard.png index fb6d89879..c7729566c 100644 Binary files a/java/res/drawable-hdpi/ic_dialog_keyboard.png and b/java/res/drawable-hdpi/ic_dialog_keyboard.png differ diff --git a/java/res/drawable-hdpi/ic_mic_dialog.png b/java/res/drawable-hdpi/ic_mic_dialog.png index 6498cd589..349dc4b37 100644 Binary files a/java/res/drawable-hdpi/ic_mic_dialog.png and b/java/res/drawable-hdpi/ic_mic_dialog.png differ diff --git a/java/res/drawable-hdpi/ic_subtype_keyboard.png b/java/res/drawable-hdpi/ic_subtype_keyboard.png index b5a9fa866..7015e266a 100644 Binary files a/java/res/drawable-hdpi/ic_subtype_keyboard.png and b/java/res/drawable-hdpi/ic_subtype_keyboard.png differ diff --git a/java/res/drawable-hdpi/ic_subtype_mic.png b/java/res/drawable-hdpi/ic_subtype_mic.png index 5d68e85a6..cb86a5598 100644 Binary files a/java/res/drawable-hdpi/ic_subtype_mic.png and b/java/res/drawable-hdpi/ic_subtype_mic.png differ diff --git a/java/res/drawable-hdpi/ic_suggest_strip_microphone.png b/java/res/drawable-hdpi/ic_suggest_strip_microphone.png index 0462bdd16..c00b4aaa6 100644 Binary files a/java/res/drawable-hdpi/ic_suggest_strip_microphone.png and b/java/res/drawable-hdpi/ic_suggest_strip_microphone.png differ diff --git a/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png b/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png index 80c20f691..256dc3d61 100644 Binary files a/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png and b/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png differ diff --git a/java/res/drawable-hdpi/keyboard_background.9.png b/java/res/drawable-hdpi/keyboard_background.9.png index d57463fb6..edffac5b8 100644 Binary files a/java/res/drawable-hdpi/keyboard_background.9.png and b/java/res/drawable-hdpi/keyboard_background.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_dark_background.9.png b/java/res/drawable-hdpi/keyboard_dark_background.9.png index fa3d449f7..f315cbdd4 100644 Binary files a/java/res/drawable-hdpi/keyboard_dark_background.9.png and b/java/res/drawable-hdpi/keyboard_dark_background.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_0.9.png b/java/res/drawable-hdpi/keyboard_hint_0.9.png index da52e0f5b..271264e92 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_0.9.png and b/java/res/drawable-hdpi/keyboard_hint_0.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_1.9.png b/java/res/drawable-hdpi/keyboard_hint_1.9.png index 7325c4cbb..eaf374262 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_1.9.png and b/java/res/drawable-hdpi/keyboard_hint_1.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_2.9.png b/java/res/drawable-hdpi/keyboard_hint_2.9.png index 35b7f2527..8a1657117 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_2.9.png and b/java/res/drawable-hdpi/keyboard_hint_2.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_3.9.png b/java/res/drawable-hdpi/keyboard_hint_3.9.png index 1ae284838..34b501109 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_3.9.png and b/java/res/drawable-hdpi/keyboard_hint_3.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_4.9.png b/java/res/drawable-hdpi/keyboard_hint_4.9.png index b67d6dd51..d4cc250dd 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_4.9.png and b/java/res/drawable-hdpi/keyboard_hint_4.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_5.9.png b/java/res/drawable-hdpi/keyboard_hint_5.9.png index ec52198d8..6a054b42f 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_5.9.png and b/java/res/drawable-hdpi/keyboard_hint_5.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_6.9.png b/java/res/drawable-hdpi/keyboard_hint_6.9.png index 66dcf67e5..66e91400a 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_6.9.png and b/java/res/drawable-hdpi/keyboard_hint_6.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_7.9.png b/java/res/drawable-hdpi/keyboard_hint_7.9.png index 9d5499272..5eae24f4f 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_7.9.png and b/java/res/drawable-hdpi/keyboard_hint_7.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_8.9.png b/java/res/drawable-hdpi/keyboard_hint_8.9.png index beba1624c..ea7f512fd 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_8.9.png and b/java/res/drawable-hdpi/keyboard_hint_8.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_hint_9.9.png b/java/res/drawable-hdpi/keyboard_hint_9.9.png index 31ea54f32..0bf85de93 100644 Binary files a/java/res/drawable-hdpi/keyboard_hint_9.9.png and b/java/res/drawable-hdpi/keyboard_hint_9.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png index 27d992375..762a25704 100644 Binary files a/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png and b/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png index 33263b9d7..141d2d6be 100644 Binary files a/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png and b/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png index baff80950..d6b2c7936 100644 Binary files a/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png and b/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip.9.png b/java/res/drawable-hdpi/keyboard_suggest_strip.9.png index 7cab5a899..0ccdb6ab2 100644 Binary files a/java/res/drawable-hdpi/keyboard_suggest_strip.9.png and b/java/res/drawable-hdpi/keyboard_suggest_strip.9.png differ diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png index 7fca8c608..7ca3e6131 100644 Binary files a/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png and b/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png differ diff --git a/java/res/drawable-hdpi/mic_slash.png b/java/res/drawable-hdpi/mic_slash.png index 71f4dc506..dc8da6252 100644 Binary files a/java/res/drawable-hdpi/mic_slash.png and b/java/res/drawable-hdpi/mic_slash.png differ diff --git a/java/res/drawable-hdpi/ok_cancel.png b/java/res/drawable-hdpi/ok_cancel.png index 48c00f094..f11e57a38 100644 Binary files a/java/res/drawable-hdpi/ok_cancel.png and b/java/res/drawable-hdpi/ok_cancel.png differ diff --git a/java/res/drawable-hdpi/speak_now_level0.png b/java/res/drawable-hdpi/speak_now_level0.png index 31571f75b..342849cfe 100644 Binary files a/java/res/drawable-hdpi/speak_now_level0.png and b/java/res/drawable-hdpi/speak_now_level0.png differ diff --git a/java/res/drawable-hdpi/speak_now_level1.png b/java/res/drawable-hdpi/speak_now_level1.png index c8d0aae5d..8947a4306 100644 Binary files a/java/res/drawable-hdpi/speak_now_level1.png and b/java/res/drawable-hdpi/speak_now_level1.png differ diff --git a/java/res/drawable-hdpi/speak_now_level2.png b/java/res/drawable-hdpi/speak_now_level2.png index 123eea66e..44fc58c4e 100644 Binary files a/java/res/drawable-hdpi/speak_now_level2.png and b/java/res/drawable-hdpi/speak_now_level2.png differ diff --git a/java/res/drawable-hdpi/speak_now_level3.png b/java/res/drawable-hdpi/speak_now_level3.png index a8a2c5cff..cfa5c1b87 100644 Binary files a/java/res/drawable-hdpi/speak_now_level3.png and b/java/res/drawable-hdpi/speak_now_level3.png differ diff --git a/java/res/drawable-hdpi/speak_now_level4.png b/java/res/drawable-hdpi/speak_now_level4.png index b84d7b0e9..a050d8836 100644 Binary files a/java/res/drawable-hdpi/speak_now_level4.png and b/java/res/drawable-hdpi/speak_now_level4.png differ diff --git a/java/res/drawable-hdpi/speak_now_level5.png b/java/res/drawable-hdpi/speak_now_level5.png index 8dd2b607f..8cd5ae7ad 100644 Binary files a/java/res/drawable-hdpi/speak_now_level5.png and b/java/res/drawable-hdpi/speak_now_level5.png differ diff --git a/java/res/drawable-hdpi/speak_now_level6.png b/java/res/drawable-hdpi/speak_now_level6.png index 888d0e5c7..9f4481eb4 100644 Binary files a/java/res/drawable-hdpi/speak_now_level6.png and b/java/res/drawable-hdpi/speak_now_level6.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png index 24edfaa1c..3e4eff698 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png and b/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_delete.png b/java/res/drawable-hdpi/sym_bkeyboard_delete.png index 4ccd218ac..1d24cc85c 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_delete.png and b/java/res/drawable-hdpi/sym_bkeyboard_delete.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_done.png b/java/res/drawable-hdpi/sym_bkeyboard_done.png index 6959aeeef..b77803d21 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_done.png and b/java/res/drawable-hdpi/sym_bkeyboard_done.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_mic.png index 6876fb64a..512f46080 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_mic.png and b/java/res/drawable-hdpi/sym_bkeyboard_mic.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num0.png b/java/res/drawable-hdpi/sym_bkeyboard_num0.png index 08df3f3dd..678a790de 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num0.png and b/java/res/drawable-hdpi/sym_bkeyboard_num0.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num1.png b/java/res/drawable-hdpi/sym_bkeyboard_num1.png index 36d8e5696..4e68e35b3 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num1.png and b/java/res/drawable-hdpi/sym_bkeyboard_num1.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num2.png b/java/res/drawable-hdpi/sym_bkeyboard_num2.png index c67fe2ea4..546663fda 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num2.png and b/java/res/drawable-hdpi/sym_bkeyboard_num2.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num3.png b/java/res/drawable-hdpi/sym_bkeyboard_num3.png index cf80b2745..57f9a8d8e 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num3.png and b/java/res/drawable-hdpi/sym_bkeyboard_num3.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num4.png b/java/res/drawable-hdpi/sym_bkeyboard_num4.png index bfbb55a8f..de504388f 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num4.png and b/java/res/drawable-hdpi/sym_bkeyboard_num4.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num5.png b/java/res/drawable-hdpi/sym_bkeyboard_num5.png index 9f121ec12..1d2e1ef89 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num5.png and b/java/res/drawable-hdpi/sym_bkeyboard_num5.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num6.png b/java/res/drawable-hdpi/sym_bkeyboard_num6.png index 256186f3a..39788b727 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num6.png and b/java/res/drawable-hdpi/sym_bkeyboard_num6.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num7.png b/java/res/drawable-hdpi/sym_bkeyboard_num7.png index 7c8ce205e..fff6f27bf 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num7.png and b/java/res/drawable-hdpi/sym_bkeyboard_num7.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num8.png b/java/res/drawable-hdpi/sym_bkeyboard_num8.png index 4cfe7b11c..8cc1a955e 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num8.png and b/java/res/drawable-hdpi/sym_bkeyboard_num8.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num9.png b/java/res/drawable-hdpi/sym_bkeyboard_num9.png index d19c15cc8..021742509 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_num9.png and b/java/res/drawable-hdpi/sym_bkeyboard_num9.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numalt.png b/java/res/drawable-hdpi/sym_bkeyboard_numalt.png index 762fd8cd7..200714f66 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_numalt.png and b/java/res/drawable-hdpi/sym_bkeyboard_numalt.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numpound.png b/java/res/drawable-hdpi/sym_bkeyboard_numpound.png index 2bd800d68..0a46122b2 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_numpound.png and b/java/res/drawable-hdpi/sym_bkeyboard_numpound.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numstar.png b/java/res/drawable-hdpi/sym_bkeyboard_numstar.png index b574f83f3..ca22bd535 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_numstar.png and b/java/res/drawable-hdpi/sym_bkeyboard_numstar.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_return.png b/java/res/drawable-hdpi/sym_bkeyboard_return.png index 2f9631a20..426e1599e 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_return.png and b/java/res/drawable-hdpi/sym_bkeyboard_return.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_search.png b/java/res/drawable-hdpi/sym_bkeyboard_search.png index 7a5a0aab8..1b6f884fa 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_search.png and b/java/res/drawable-hdpi/sym_bkeyboard_search.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_settings.png b/java/res/drawable-hdpi/sym_bkeyboard_settings.png index 8a8caa895..08ba18f28 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_settings.png and b/java/res/drawable-hdpi/sym_bkeyboard_settings.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_shift.png b/java/res/drawable-hdpi/sym_bkeyboard_shift.png index 1e3d5ec14..5a22dd309 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_shift.png and b/java/res/drawable-hdpi/sym_bkeyboard_shift.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png b/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png index e8a4d6423..566449126 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png and b/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_space.png b/java/res/drawable-hdpi/sym_bkeyboard_space.png index 9937a6288..cd0ebe2f4 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_space.png and b/java/res/drawable-hdpi/sym_bkeyboard_space.png differ diff --git a/java/res/drawable-hdpi/sym_bkeyboard_tab.png b/java/res/drawable-hdpi/sym_bkeyboard_tab.png index 8dee747d2..3466e1271 100644 Binary files a/java/res/drawable-hdpi/sym_bkeyboard_tab.png and b/java/res/drawable-hdpi/sym_bkeyboard_tab.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_123_mic.png b/java/res/drawable-hdpi/sym_keyboard_123_mic.png index 6f8292912..62669803d 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_123_mic.png and b/java/res/drawable-hdpi/sym_keyboard_123_mic.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_delete.png b/java/res/drawable-hdpi/sym_keyboard_delete.png index 8db099a7a..459ebcff8 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_delete.png and b/java/res/drawable-hdpi/sym_keyboard_delete.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_done.png b/java/res/drawable-hdpi/sym_keyboard_done.png index 6ba51d58c..471c5021b 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_done.png and b/java/res/drawable-hdpi/sym_keyboard_done.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png b/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png index 4867298fa..eef789680 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png b/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png index 7c12f79a1..8322e8e1d 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_done.png b/java/res/drawable-hdpi/sym_keyboard_feedback_done.png index e79bbb382..7015e266a 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_done.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_done.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png index 4f4923b85..889477cfb 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png index ed2ebe66c..b0f6d7feb 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png b/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png index f228910c3..f82c33ae3 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png b/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png index bb69300d1..819236c8e 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_return.png b/java/res/drawable-hdpi/sym_keyboard_feedback_return.png index 99fa13cae..f038d3abe 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_return.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_return.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_search.png b/java/res/drawable-hdpi/sym_keyboard_feedback_search.png index c006866d2..337f9e4fe 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_search.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_search.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png b/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png index 5c685f9c3..8a02be07e 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png b/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png index 5b91afb82..abf15f8f9 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png b/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png index 77e6a5fe9..1fd822ea6 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_space.png b/java/res/drawable-hdpi/sym_keyboard_feedback_space.png index 2d1b4a4b4..70debca9b 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_space.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_space.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png b/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png index 82280c608..d2efb1619 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png and b/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png b/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png index 34b8e931a..dcc4bd59b 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png and b/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png b/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png index b6ea3362b..ecf61a98e 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png and b/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_mic.png b/java/res/drawable-hdpi/sym_keyboard_mic.png index 7207f8a92..c8dca62a0 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_mic.png and b/java/res/drawable-hdpi/sym_keyboard_mic.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num0.png b/java/res/drawable-hdpi/sym_keyboard_num0.png index 169efe21e..10ac70b9d 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num0.png and b/java/res/drawable-hdpi/sym_keyboard_num0.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num1.png b/java/res/drawable-hdpi/sym_keyboard_num1.png index 5b868489f..0fc03efa5 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num1.png and b/java/res/drawable-hdpi/sym_keyboard_num1.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num2.png b/java/res/drawable-hdpi/sym_keyboard_num2.png index ddbe2199c..283560b35 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num2.png and b/java/res/drawable-hdpi/sym_keyboard_num2.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num3.png b/java/res/drawable-hdpi/sym_keyboard_num3.png index 1de90f3b1..9a3b3294b 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num3.png and b/java/res/drawable-hdpi/sym_keyboard_num3.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num4.png b/java/res/drawable-hdpi/sym_keyboard_num4.png index c67ba5206..f13ff1ae9 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num4.png and b/java/res/drawable-hdpi/sym_keyboard_num4.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num5.png b/java/res/drawable-hdpi/sym_keyboard_num5.png index 8410f2537..c251329fa 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num5.png and b/java/res/drawable-hdpi/sym_keyboard_num5.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num6.png b/java/res/drawable-hdpi/sym_keyboard_num6.png index 22fa29d3f..4acba4c91 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num6.png and b/java/res/drawable-hdpi/sym_keyboard_num6.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num7.png b/java/res/drawable-hdpi/sym_keyboard_num7.png index a3798ea34..14931c18c 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num7.png and b/java/res/drawable-hdpi/sym_keyboard_num7.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num8.png b/java/res/drawable-hdpi/sym_keyboard_num8.png index 7e963ad6b..d4973fdc9 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num8.png and b/java/res/drawable-hdpi/sym_keyboard_num8.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_num9.png b/java/res/drawable-hdpi/sym_keyboard_num9.png index 1160d8545..49cec66f4 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_num9.png and b/java/res/drawable-hdpi/sym_keyboard_num9.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_numalt.png b/java/res/drawable-hdpi/sym_keyboard_numalt.png index f3a73deb0..3cc5311cd 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_numalt.png and b/java/res/drawable-hdpi/sym_keyboard_numalt.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_numpound.png b/java/res/drawable-hdpi/sym_keyboard_numpound.png index 471f4fda3..d09133929 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_numpound.png and b/java/res/drawable-hdpi/sym_keyboard_numpound.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_numstar.png b/java/res/drawable-hdpi/sym_keyboard_numstar.png index 017c0f461..e838e169f 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_numstar.png and b/java/res/drawable-hdpi/sym_keyboard_numstar.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_return.png b/java/res/drawable-hdpi/sym_keyboard_return.png index 984db426e..9d97e1efd 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_return.png and b/java/res/drawable-hdpi/sym_keyboard_return.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_search.png b/java/res/drawable-hdpi/sym_keyboard_search.png index 179e725f6..1aa22d7e2 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_search.png and b/java/res/drawable-hdpi/sym_keyboard_search.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_settings.png b/java/res/drawable-hdpi/sym_keyboard_settings.png index 164117812..35d1ed6e6 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_settings.png and b/java/res/drawable-hdpi/sym_keyboard_settings.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_shift.png b/java/res/drawable-hdpi/sym_keyboard_shift.png index 2b3bd668d..bf217d147 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_shift.png and b/java/res/drawable-hdpi/sym_keyboard_shift.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_locked.png b/java/res/drawable-hdpi/sym_keyboard_shift_locked.png index 8a34a98a3..d11b39712 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_shift_locked.png and b/java/res/drawable-hdpi/sym_keyboard_shift_locked.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_space.png b/java/res/drawable-hdpi/sym_keyboard_space.png index dacc97d0a..fcd20de7d 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_space.png and b/java/res/drawable-hdpi/sym_keyboard_space.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_space_led.9.png b/java/res/drawable-hdpi/sym_keyboard_space_led.9.png index c76f64b94..2c6f4a925 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_space_led.9.png and b/java/res/drawable-hdpi/sym_keyboard_space_led.9.png differ diff --git a/java/res/drawable-hdpi/sym_keyboard_tab.png b/java/res/drawable-hdpi/sym_keyboard_tab.png index efd740b5b..51d17d989 100644 Binary files a/java/res/drawable-hdpi/sym_keyboard_tab.png and b/java/res/drawable-hdpi/sym_keyboard_tab.png differ diff --git a/java/res/drawable-hdpi/voice_ime_background.9.png b/java/res/drawable-hdpi/voice_ime_background.9.png index a604f497c..42868522f 100644 Binary files a/java/res/drawable-hdpi/voice_ime_background.9.png and b/java/res/drawable-hdpi/voice_ime_background.9.png differ diff --git a/java/res/drawable-hdpi/voice_swipe_hint.png b/java/res/drawable-hdpi/voice_swipe_hint.png index 976fd56d6..130f83a9c 100644 Binary files a/java/res/drawable-hdpi/voice_swipe_hint.png and b/java/res/drawable-hdpi/voice_swipe_hint.png differ diff --git a/java/res/drawable-hdpi/working.png b/java/res/drawable-hdpi/working.png old mode 100644 new mode 100755 index c43439e93..5ea702307 Binary files a/java/res/drawable-hdpi/working.png and b/java/res/drawable-hdpi/working.png differ diff --git a/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java b/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java index b4fe32765..c926be06f 100644 --- a/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java +++ b/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java @@ -16,6 +16,8 @@ package com.android.inputmethod.compat; +import com.android.inputmethod.latin.EditingUtils.SelectedWord; + import android.util.Log; import android.view.inputmethod.InputConnection; @@ -33,6 +35,16 @@ public class InputConnectionCompatUtils { .getConstructor(CLASS_CorrectionInfo, INPUT_TYPE_CorrectionInfo); private static final Method METHOD_InputConnection_commitCorrection = CompatUtils .getMethod(InputConnection.class, "commitCorrection", CLASS_CorrectionInfo); + private static final Method METHOD_getSelectedText = CompatUtils + .getMethod(InputConnection.class, "getSelectedText", int.class); + private static final Method METHOD_setComposingRegion = CompatUtils + .getMethod(InputConnection.class, "setComposingRegion", int.class, int.class); + public static final boolean RECORRECTION_SUPPORTED; + + static { + RECORRECTION_SUPPORTED = METHOD_getSelectedText != null + && METHOD_setComposingRegion != null; + } public static void commitCorrection(InputConnection ic, int offset, CharSequence oldText, CharSequence newText) { @@ -55,4 +67,25 @@ public class InputConnectionCompatUtils { Log.e(TAG, "Error in commitCorrection: InvocationTargetException"); } } + + + /** + * Returns the selected text between the selStart and selEnd positions. + */ + public static CharSequence getSelectedText(InputConnection ic, int selStart, int selEnd) { + // Use reflection, for backward compatibility + return (CharSequence) CompatUtils.invoke( + ic, null, METHOD_getSelectedText, 0); + } + + /** + * Tries to set the text into composition mode if there is support for it in the framework. + */ + public static void underlineWord(InputConnection ic, SelectedWord word) { + // Use reflection, for backward compatibility + // If method not found, there's nothing we can do. It still works but just wont underline + // the word. + CompatUtils.invoke( + ic, null, METHOD_setComposingRegion, word.mStart, word.mEnd); + } } diff --git a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java index 5e66bf4d9..80586b753 100644 --- a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java +++ b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java @@ -16,8 +16,13 @@ package com.android.inputmethod.compat; +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.SubtypeSwitcher; +import com.android.inputmethod.latin.Utils; + import android.content.Context; import android.os.IBinder; +import android.text.TextUtils; import android.util.Log; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; @@ -27,6 +32,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; // TODO: Override this class with the concrete implementation if we need to take care of the @@ -50,7 +56,15 @@ public class InputMethodManagerCompatWrapper { private static final InputMethodManagerCompatWrapper sInstance = new InputMethodManagerCompatWrapper(); + // For the compatibility, IMM will create dummy subtypes if subtypes are not found. + // This is required to be false if the current behavior is broken. For now, it's ok to be true. + private static final boolean ALLOW_DUMMY_SUBTYPE = true; + private static final boolean HAS_VOICE_FUNCTION = true; + private static final String VOICE_MODE = "voice"; + private static final String KEYBOARD_MODE = "keyboard"; + private InputMethodManager mImm; + private String mLatinImePackageName; private InputMethodManagerCompatWrapper() { } @@ -64,28 +78,82 @@ public class InputMethodManagerCompatWrapper { private synchronized void init(Context context) { mImm = (InputMethodManager) context.getSystemService( Context.INPUT_METHOD_SERVICE); + if (context instanceof LatinIME) { + mLatinImePackageName = context.getPackageName(); + } } public InputMethodSubtypeCompatWrapper getCurrentInputMethodSubtype() { - return new InputMethodSubtypeCompatWrapper( - CompatUtils.invoke(mImm, null, METHOD_getCurrentInputMethodSubtype)); + Object o = CompatUtils.invoke(mImm, null, METHOD_getCurrentInputMethodSubtype); + return new InputMethodSubtypeCompatWrapper(o); } public List getEnabledInputMethodSubtypeList( InputMethodInfoCompatWrapper imi, boolean allowsImplicitlySelectedSubtypes) { Object retval = CompatUtils.invoke(mImm, null, METHOD_getEnabledInputMethodSubtypeList, (imi != null ? imi.getInputMethodInfo() : null), allowsImplicitlySelectedSubtypes); - // Returns an empty list - if (retval == null) - return Collections.emptyList(); + if (retval == null || !(retval instanceof List) || ((List)retval).isEmpty()) { + if (!ALLOW_DUMMY_SUBTYPE) { + // Returns an empty list + return Collections.emptyList(); + } + // Creates dummy subtypes + List subtypeList = + new ArrayList(); + InputMethodSubtypeCompatWrapper keyboardSubtype = getLastResortSubtype(KEYBOARD_MODE); + InputMethodSubtypeCompatWrapper voiceSubtype = getLastResortSubtype(VOICE_MODE); + if (keyboardSubtype != null) { + subtypeList.add(keyboardSubtype); + } + if (voiceSubtype != null) { + subtypeList.add(voiceSubtype); + } + return subtypeList; + } return CompatUtils.copyInputMethodSubtypeListToWrapper((List)retval); } + private InputMethodInfoCompatWrapper getLatinImeInputMethodInfo() { + if (TextUtils.isEmpty(mLatinImePackageName)) + return null; + return Utils.getInputMethodInfo(this, mLatinImePackageName); + } + + @SuppressWarnings("unused") + private InputMethodSubtypeCompatWrapper getLastResortSubtype(String mode) { + if (VOICE_MODE.equals(mode) && !HAS_VOICE_FUNCTION) + return null; + Locale inputLocale = SubtypeSwitcher.getInstance().getInputLocale(); + if (inputLocale == null) + return null; + return new InputMethodSubtypeCompatWrapper(0, 0, inputLocale.toString(), mode, ""); + } + public Map> getShortcutInputMethodsAndSubtypes() { Object retval = CompatUtils.invoke(mImm, null, METHOD_getShortcutInputMethodsAndSubtypes); - // Returns an empty map - if (!(retval instanceof Map)) return Collections.emptyMap(); + if (retval == null || !(retval instanceof Map) || ((Map)retval).isEmpty()) { + if (!ALLOW_DUMMY_SUBTYPE) { + // Returns an empty map + return Collections.emptyMap(); + } + // Creates dummy subtypes + InputMethodInfoCompatWrapper imi = getLatinImeInputMethodInfo(); + InputMethodSubtypeCompatWrapper voiceSubtype = getLastResortSubtype(VOICE_MODE); + if (imi != null && voiceSubtype != null) { + Map> + shortcutMap = + new HashMap>(); + List subtypeList = + new ArrayList(); + subtypeList.add(voiceSubtype); + shortcutMap.put(imi, subtypeList); + return shortcutMap; + } else { + return Collections.emptyMap(); + } + } Map> shortcutMap = new HashMap>(); final Map retvalMap = (Map)retval; @@ -107,6 +175,9 @@ public class InputMethodManagerCompatWrapper { } public boolean switchToLastInputMethod(IBinder token) { + if (SubtypeSwitcher.getInstance().isDummyVoiceMode()) { + return true; + } return (Boolean)CompatUtils.invoke(mImm, false, METHOD_switchToLastInputMethod, token); } diff --git a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java index 3ffa81932..317b02216 100644 --- a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java +++ b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java @@ -22,6 +22,7 @@ import android.text.TextUtils; import android.util.Log; import java.lang.reflect.Method; +import java.util.Arrays; // TODO: Override this class with the concrete implementation if we need to take care of the // performance. @@ -48,35 +49,65 @@ public final class InputMethodSubtypeCompatWrapper extends AbstractCompatWrapper private static final Method METHOD_getExtraValueOf = CompatUtils.getMethod(CLASS_InputMethodSubtype, "getExtraValueOf", String.class); + private final int mDummyNameResId; + private final int mDummyIconResId; + private final String mDummyLocale; + private final String mDummyMode; + private final String mDummyExtraValues; + public InputMethodSubtypeCompatWrapper(Object subtype) { super((CLASS_InputMethodSubtype != null && CLASS_InputMethodSubtype.isInstance(subtype)) ? subtype : null); if (DBG) { Log.d(TAG, "CreateInputMethodSubtypeCompatWrapper"); } + mDummyNameResId = 0; + mDummyIconResId = 0; + mDummyLocale = DEFAULT_LOCALE; + mDummyMode = DEFAULT_MODE; + mDummyExtraValues = ""; + } + + // Constructor for creating a dummy subtype. + public InputMethodSubtypeCompatWrapper(int nameResId, int iconResId, String locale, + String mode, String extraValues) { + super(null); + if (DBG) { + Log.d(TAG, "CreateInputMethodSubtypeCompatWrapper"); + } + mDummyNameResId = nameResId; + mDummyIconResId = iconResId; + mDummyLocale = locale != null ? locale : ""; + mDummyMode = mode != null ? mode : ""; + mDummyExtraValues = extraValues != null ? extraValues : ""; } public int getNameResId() { + if (mObj == null) return mDummyNameResId; return (Integer)CompatUtils.invoke(mObj, 0, METHOD_getNameResId); } public int getIconResId() { + if (mObj == null) return mDummyIconResId; return (Integer)CompatUtils.invoke(mObj, 0, METHOD_getIconResId); } public String getLocale() { + if (mObj == null) return mDummyLocale; final String s = (String)CompatUtils.invoke(mObj, null, METHOD_getLocale); if (TextUtils.isEmpty(s)) return DEFAULT_LOCALE; return s; } public String getMode() { + if (mObj == null) return mDummyMode; String s = (String)CompatUtils.invoke(mObj, null, METHOD_getMode); if (TextUtils.isEmpty(s)) return DEFAULT_MODE; return s; } public String getExtraValue() { + if (mObj == null) return mDummyExtraValues; return (String)CompatUtils.invoke(mObj, null, METHOD_getExtraValue); } @@ -92,10 +123,32 @@ public final class InputMethodSubtypeCompatWrapper extends AbstractCompatWrapper public boolean equals(Object o) { if (o instanceof InputMethodSubtypeCompatWrapper) { InputMethodSubtypeCompatWrapper subtype = (InputMethodSubtypeCompatWrapper)o; + if (mObj == null) { + // easy check of dummy subtypes + return (mDummyNameResId == subtype.mDummyNameResId + && mDummyIconResId == subtype.mDummyIconResId + && mDummyLocale.equals(subtype.mDummyLocale) + && mDummyMode.equals(subtype.mDummyMode) + && mDummyExtraValues.equals(subtype.mDummyExtraValues)); + } return mObj.equals(subtype.getOriginalObject()); } else { return mObj.equals(o); } } + @Override + public int hashCode() { + if (mObj == null) { + return hashCodeInternal(mDummyNameResId, mDummyIconResId, mDummyLocale, + mDummyMode, mDummyExtraValues); + } + return mObj.hashCode(); + } + + private static int hashCodeInternal(int nameResId, int iconResId, String locale, + String mode, String extraValue) { + return Arrays + .hashCode(new Object[] { nameResId, iconResId, locale, mode, extraValue }); + } } diff --git a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java index 5fba29d90..0d0591bd0 100644 --- a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java +++ b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java @@ -82,6 +82,8 @@ public class VoiceProxy implements VoiceInput.UiListener { private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE = "has_used_voice_input_unsupported_locale"; private static final int RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO = 6; + // TODO: Adjusted on phones for now + private static final int RECOGNITIONVIEW_MINIMUM_HEIGHT_DIP = 244; private static final String TAG = VoiceProxy.class.getSimpleName(); private static final boolean DEBUG = LatinImeLogger.sDBG; @@ -99,6 +101,7 @@ public class VoiceProxy implements VoiceInput.UiListener { private boolean mVoiceButtonOnPrimary; private boolean mVoiceInputHighlighted; + private int mMinimumVoiceRecognitionViewHeightPixel; private InputMethodManagerCompatWrapper mImm; private LatinIME mService; private AlertDialog mVoiceWarningDialog; @@ -107,6 +110,7 @@ public class VoiceProxy implements VoiceInput.UiListener { private Hints mHints; private UIHandler mHandler; private SubtypeSwitcher mSubtypeSwitcher; + // For each word, a list of potential replacements, usually from voice. private final Map> mWordToSuggestions = new HashMap>(); @@ -123,6 +127,8 @@ public class VoiceProxy implements VoiceInput.UiListener { private void initInternal(LatinIME service, SharedPreferences prefs, UIHandler h) { mService = service; mHandler = h; + mMinimumVoiceRecognitionViewHeightPixel = Utils.dipToPixel( + Utils.getDipScale(service), RECOGNITIONVIEW_MINIMUM_HEIGHT_DIP); mImm = InputMethodManagerCompatWrapper.getInstance(service); mSubtypeSwitcher = SubtypeSwitcher.getInstance(); if (VOICE_INSTALLED) { @@ -542,7 +548,11 @@ public class VoiceProxy implements VoiceInput.UiListener { mService.getResources().getDisplayMetrics().heightPixels; final int currentHeight = popupLayout.getLayoutParams().height; final int keyboardHeight = keyboardView.getHeight(); - if (keyboardHeight > currentHeight || keyboardHeight + if (mMinimumVoiceRecognitionViewHeightPixel > keyboardHeight + || mMinimumVoiceRecognitionViewHeightPixel > currentHeight) { + popupLayout.getLayoutParams().height = + mMinimumVoiceRecognitionViewHeightPixel; + } else if (keyboardHeight > currentHeight || keyboardHeight > (displayHeight / RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO)) { popupLayout.getLayoutParams().height = keyboardHeight; } diff --git a/java/src/com/android/inputmethod/deprecated/voice/RecognitionView.java b/java/src/com/android/inputmethod/deprecated/voice/RecognitionView.java index 52c73ce90..b57c16f40 100644 --- a/java/src/com/android/inputmethod/deprecated/voice/RecognitionView.java +++ b/java/src/com/android/inputmethod/deprecated/voice/RecognitionView.java @@ -50,7 +50,6 @@ import java.util.Locale; * plays beeps, shows errors, etc. */ public class RecognitionView { - @SuppressWarnings("unused") private static final String TAG = "RecognitionView"; private Handler mUiHandler; // Reference to UI thread diff --git a/java/src/com/android/inputmethod/latin/EditingUtils.java b/java/src/com/android/inputmethod/latin/EditingUtils.java index 0ca06ddfc..80830c000 100644 --- a/java/src/com/android/inputmethod/latin/EditingUtils.java +++ b/java/src/com/android/inputmethod/latin/EditingUtils.java @@ -16,13 +16,13 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.compat.InputConnectionCompatUtils; + import android.text.TextUtils; import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.regex.Pattern; /** @@ -34,11 +34,6 @@ public class EditingUtils { */ private static final int LOOKBACK_CHARACTER_NUM = 15; - // Cache Method pointers - private static boolean sMethodsInitialized; - private static Method sMethodGetSelectedText; - private static Method sMethodSetComposingRegion; - private EditingUtils() { // Unintentional empty constructor for singleton. } @@ -241,7 +236,8 @@ public class EditingUtils { } // Extract the selection alone - CharSequence touching = getSelectedText(ic, selStart, selEnd); + CharSequence touching = InputConnectionCompatUtils.getSelectedText( + ic, selStart, selEnd); if (TextUtils.isEmpty(touching)) return null; // Is any part of the selection a separator? If so, return null. final int length = touching.length(); @@ -255,74 +251,4 @@ public class EditingUtils { } return null; } - - /** - * Cache method pointers for performance - */ - private static void initializeMethodsForReflection() { - try { - // These will either both exist or not, so no need for separate try/catch blocks. - // If other methods are added later, use separate try/catch blocks. - sMethodGetSelectedText = InputConnection.class.getMethod("getSelectedText", int.class); - sMethodSetComposingRegion = InputConnection.class.getMethod("setComposingRegion", - int.class, int.class); - } catch (NoSuchMethodException exc) { - // Ignore - } - sMethodsInitialized = true; - } - - /** - * Returns the selected text between the selStart and selEnd positions. - */ - private static CharSequence getSelectedText(InputConnection ic, int selStart, int selEnd) { - // Use reflection, for backward compatibility - CharSequence result = null; - if (!sMethodsInitialized) { - initializeMethodsForReflection(); - } - if (sMethodGetSelectedText != null) { - try { - result = (CharSequence) sMethodGetSelectedText.invoke(ic, 0); - return result; - } catch (InvocationTargetException exc) { - // Ignore - } catch (IllegalArgumentException e) { - // Ignore - } catch (IllegalAccessException e) { - // Ignore - } - } - // Reflection didn't work, try it the poor way, by moving the cursor to the start, - // getting the text after the cursor and moving the text back to selected mode. - // TODO: Verify that this works properly in conjunction with - // LatinIME#onUpdateSelection - ic.setSelection(selStart, selEnd); - result = ic.getTextAfterCursor(selEnd - selStart, 0); - ic.setSelection(selStart, selEnd); - return result; - } - - /** - * Tries to set the text into composition mode if there is support for it in the framework. - */ - public static void underlineWord(InputConnection ic, SelectedWord word) { - // Use reflection, for backward compatibility - // If method not found, there's nothing we can do. It still works but just wont underline - // the word. - if (!sMethodsInitialized) { - initializeMethodsForReflection(); - } - if (sMethodSetComposingRegion != null) { - try { - sMethodSetComposingRegion.invoke(ic, word.mStart, word.mEnd); - } catch (InvocationTargetException exc) { - // Ignore - } catch (IllegalArgumentException e) { - // Ignore - } catch (IllegalAccessException e) { - // Ignore - } - } - } } diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index ae2315437..35f43124d 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1771,6 +1771,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar } private void setOldSuggestions() { + if (!InputConnectionCompatUtils.RECORRECTION_SUPPORTED) return; mVoiceProxy.setShowingVoiceSuggestions(false); if (mCandidateView != null && mCandidateView.isShowingAddToDictionaryHint()) { return; @@ -1790,7 +1791,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar abortRecorrection(true); } else { TextEntryState.selectedForRecorrection(); - EditingUtils.underlineWord(ic, touching); + InputConnectionCompatUtils.underlineWord(ic, touching); } ic.endBatchEdit(); diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java index 10a3369ac..053e2abe4 100644 --- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java +++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java @@ -210,7 +210,7 @@ public class SubtypeSwitcher { final String newLocale; final String newMode; final String oldMode = getCurrentSubtypeMode(); - if (newSubtype == null || !newSubtype.hasOriginalObject()) { + if (newSubtype == null) { // Normally, newSubtype shouldn't be null. But just in case newSubtype was null, // fallback to the default locale. Log.w(TAG, "Couldn't get the current subtype."); @@ -539,6 +539,11 @@ public class SubtypeSwitcher { return null == mCurrentSubtype ? false : VOICE_MODE.equals(getCurrentSubtypeMode()); } + public boolean isDummyVoiceMode() { + return mCurrentSubtype != null && mCurrentSubtype.getOriginalObject() == null + && VOICE_MODE.equals(getCurrentSubtypeMode()); + } + private void triggerVoiceIME() { if (!mService.isInputViewShown()) return; VoiceProxy.getInstance().startListening(false, diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java index f9080f41e..e679209e7 100644 --- a/java/src/com/android/inputmethod/latin/Utils.java +++ b/java/src/com/android/inputmethod/latin/Utils.java @@ -21,6 +21,7 @@ import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; import com.android.inputmethod.compat.InputTypeCompatUtils; import com.android.inputmethod.keyboard.KeyboardId; +import android.content.Context; import android.content.res.Resources; import android.inputmethodservice.InputMethodService; import android.os.AsyncTask; @@ -110,9 +111,14 @@ public class Utils { } public static String getInputMethodId(InputMethodManagerCompatWrapper imm, String packageName) { + return getInputMethodInfo(imm, packageName).getId(); + } + + public static InputMethodInfoCompatWrapper getInputMethodInfo( + InputMethodManagerCompatWrapper imm, String packageName) { for (final InputMethodInfoCompatWrapper imi : imm.getEnabledInputMethodList()) { if (imi.getPackageName().equals(packageName)) - return imi.getId(); + return imi; } throw new RuntimeException("Can not find input method id for " + packageName); } @@ -601,4 +607,14 @@ public class Utils { } return true; } + + public static float getDipScale(Context context) { + final float scale = context.getResources().getDisplayMetrics().density; + return scale; + } + + /** Convert pixel to DIP */ + public static int dipToPixel(float scale, int dip) { + return (int) ((float) dip * scale + 0.5); + } }